Skip to content

Commit f69c900

Browse files
committed
ColorPicker, #18
- ColorPicker: Use ColorPicker library module for all color pickers. - #18: Reorder challenge trackers in the Challenge Tracker List.
1 parent ea7837f commit f69c900

10 files changed

+254
-3407
lines changed

languages/en.json

+2
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
"editTooltip": "Edit the Challenge Tracker",
2121
"delete": "Delete",
2222
"deleteTooltip": "Delete the Challenge Tracker",
23+
"moveUpTooltip": "Move the Challenge Tracker up the list",
24+
"moveDownTooltip": "Move the Challenge Tracker down the list",
2325
"new": "Create New",
2426
"newTooltip": "Create a new Challenge Tracker"
2527
},

scripts/challenge-tracker.js

+4-3
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ Hooks.once('init', () => {
1414
})
1515
})
1616

17-
Hooks.once('colorSettingsInitialized', async () => {
17+
Hooks.once('colorPickerReady', () => {
1818
Settings.initColorSettings()
1919
})
2020

@@ -27,12 +27,13 @@ Hooks.once('socketlib.ready', () => {
2727

2828
Hooks.once('ready', async () => {
2929
if (game.user.isGM) {
30-
try { window.Ardittristan.ColorSetting.tester } catch {
31-
ui.notifications.notify("Challenge Tracker: To use the color pickers, enable the 'lib - colorsettings' module.")
30+
if (!ColorPicker) {
31+
ui.notifications.notify("Challenge Tracker: To use the color pickers, enable the 'ColorPicker for Foundry VTT' module.")
3232
}
3333
}
3434

3535
ChallengeTrackerFlag.setOwner()
36+
ChallengeTrackerFlag.setListPosition()
3637

3738
// Initialise Challenge Tracker
3839
game.challengeTracker = []

scripts/flags.js

+25-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { ChallengeTrackerSettings, ChallengeTracker } from './main.js'
1+
import { ChallengeTrackerSettings } from './main.js'
22
import { ChallengeTrackerForm } from './forms.js'
33

44
export class ChallengeTrackerFlag {
@@ -10,9 +10,16 @@ export class ChallengeTrackerFlag {
1010
const challengeTrackerList = []
1111
if (!game.users.get(userId)?.data.flags['challenge-tracker']) return
1212
const flagKeys = Object.keys(game.users.get(userId)?.data.flags['challenge-tracker'])
13+
const flagsLength = flagKeys.length
1314
for (const flagKey of flagKeys) {
14-
challengeTrackerList.push(game.users.get(userId)?.getFlag(ChallengeTrackerSettings.id, flagKey))
15+
const flagData = game.users.get(userId)?.getFlag(ChallengeTrackerSettings.id, flagKey)
16+
const moveUpDisabled = (flagData.listPosition === 1) ? 'disabled' : ''
17+
const moveDownDisabled = (flagData.listPosition >= flagsLength) ? 'disabled' : ''
18+
const mergedFlagData = foundry.utils.mergeObject(flagData, { moveUpDisabled, moveDownDisabled })
19+
challengeTrackerList.push(mergedFlagData)
1520
}
21+
challengeTrackerList.sort((a, b) => a.listPosition < b.listPosition ? 1 : -1)
22+
challengeTrackerList.reverse()
1623
return challengeTrackerList
1724
}
1825

@@ -39,6 +46,7 @@ export class ChallengeTrackerFlag {
3946
* @param {string} challengeTrackerOptions.innerColor Hex color of the inner circle
4047
* @param {number} challengeTrackerOptions.innerCurrent Number of filled segments of the inner circle
4148
* @param {number} challengeTrackerOptions.innerTotal Number of segments for the inner circle
49+
* @param {number} challengeTrackerOptions.listPosition Position of the challenge tracker in the Challenge Tracker list
4250
* @param {string} challengeTrackerOptions.outerBackgroundColor Hex color of the outer ring background
4351
* @param {string} challengeTrackerOptions.outerColor Hex color of the outer ring
4452
* @param {number} challengeTrackerOptions.outerCurrent Number of filled segments of the outer ring
@@ -51,7 +59,7 @@ export class ChallengeTrackerFlag {
5159
**/
5260
static async set (ownerId, challengeTrackerOptions) {
5361
await game.users.get(ownerId)?.setFlag(ChallengeTrackerSettings.id, challengeTrackerOptions.id, challengeTrackerOptions)
54-
ChallengeTrackerForm.challengeTrackerForm?.render(false, { width: 'auto', height: 'auto' })
62+
game.challengeTrackerForm?.render(false, { width: 'auto', height: 'auto' })
5563
}
5664

5765
/**
@@ -67,7 +75,8 @@ export class ChallengeTrackerFlag {
6775
return
6876
}
6977
const deletedFlag = await game.users.get(ownerId)?.unsetFlag(ChallengeTrackerSettings.id, challengeTrackerId)
70-
ChallengeTrackerForm.challengeTrackerForm?.render(false, { width: 'auto', height: 'auto' })
78+
ChallengeTrackerFlag.setListPosition()
79+
game.challengeTrackerForm?.render(false, { width: 'auto', height: 'auto' })
7180
ui.notifications.info(`Challenge Tracker '${challengeTrackerId}' deleted.`)
7281
return deletedFlag
7382
}
@@ -94,4 +103,16 @@ export class ChallengeTrackerFlag {
94103
}
95104
}
96105
}
106+
107+
static setListPosition () {
108+
const userId = game.userId
109+
const challengeTrackerList = ChallengeTrackerFlag.getList(userId)
110+
if (!challengeTrackerList) return
111+
let listPosition = 1
112+
for (const challengeTracker of challengeTrackerList) {
113+
challengeTracker.listPosition = listPosition
114+
ChallengeTrackerFlag.set(userId, { id: challengeTracker.id, listPosition })
115+
listPosition++
116+
}
117+
}
97118
}

scripts/forms.js

+55-11
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import { ChallengeTrackerSettings, ChallengeTracker } from './main.js'
22
import { ChallengeTrackerFlag } from './flags.js'
3-
import jscolor from './lib/jscolor.js'
43

54
Hooks.on('closeChallengeTrackerForm', () => {
65
const buttonLocation = game.settings.get('challenge-tracker', 'buttonLocation')
@@ -16,6 +15,11 @@ Hooks.on('closeChallengeTrackerForm', () => {
1615

1716
/* Display challenge trackers in a list with options */
1817
export class ChallengeTrackerForm extends FormApplication {
18+
constructor (options) {
19+
super(options)
20+
this.scrollTop = 0
21+
}
22+
1923
static get defaultOptions () {
2024
const defaults = super.defaultOptions
2125

@@ -44,7 +48,16 @@ export class ChallengeTrackerForm extends FormApplication {
4448

4549
/* Initialise the ChallengeTrackerForm */
4650
static init () {
47-
this.challengeTrackerForm = new ChallengeTrackerForm()
51+
game.challengeTrackerForm = new ChallengeTrackerForm()
52+
game.challengeTrackerForm._init()
53+
}
54+
55+
_init () {
56+
Hooks.on('renderChallengeTrackerForm', async () => {
57+
const ul = $('ul.challenge-tracker-form')[0]
58+
if (!ul) return
59+
ul.scrollTop = this.scrollTop
60+
})
4861
}
4962

5063
/**
@@ -53,7 +66,7 @@ export class ChallengeTrackerForm extends FormApplication {
5366
**/
5467
static openByEvent (event) {
5568
const userId = $(event.currentTarget).parents('[data-user-id]')?.data()?.userId
56-
ChallengeTrackerForm.challengeTrackerForm.render(true, { userId })
69+
game.challengeTrackerForm.render(true, { userId })
5770
}
5871

5972
/**
@@ -71,7 +84,7 @@ export class ChallengeTrackerForm extends FormApplication {
7184
} else {
7285
userId = game.userId
7386
}
74-
ChallengeTrackerForm.challengeTrackerForm.render(true, { userId })
87+
game.challengeTrackerForm.render(true, { userId })
7588
}
7689

7790
activateListeners (html) {
@@ -84,15 +97,16 @@ export class ChallengeTrackerForm extends FormApplication {
8497
* @param {object} event Event trigger
8598
**/
8699
async _handleButtonClick (event) {
100+
event.preventDefault()
87101
const clickedElement = $(event.currentTarget)
88102
const action = clickedElement.data().action
89103
const ownerId = clickedElement.parents('[data-owner-id]')?.data()?.ownerId
90104
const challengeTrackerId = clickedElement.parents('li')?.data()?.challengeTrackerId
91-
105+
const ul = $('ul.challenge-tracker-form')[0]
106+
this.scrollTop = ul.scrollTop
92107
switch (action) {
93108
case 'open' : {
94109
ChallengeTracker.open(null, null, { id: challengeTrackerId, ownerId })
95-
this.render(false, { width: 'auto', height: 'auto' })
96110
break
97111
}
98112
case 'edit': {
@@ -101,20 +115,49 @@ export class ChallengeTrackerForm extends FormApplication {
101115
}
102116
case 'copy': {
103117
await ChallengeTrackerFlag.copy(ownerId, challengeTrackerId)
104-
this.render(false, { width: 'auto', height: 'auto' })
105118
break
106119
}
107120
case 'delete': {
108121
await ChallengeTrackerFlag.unset(ownerId, challengeTrackerId)
122+
break
123+
}
124+
case 'move-up': {
125+
await this.move('up', ownerId, challengeTrackerId)
126+
this.render(false, { width: 'auto', height: 'auto' })
127+
break
128+
}
129+
case 'move-down': {
130+
await this.move('down', ownerId, challengeTrackerId)
109131
this.render(false, { width: 'auto', height: 'auto' })
110132
break
111133
}
112134
case 'new': {
113135
await ChallengeTrackerEditForm.open(ownerId)
114-
this.render(false, { width: 'auto', height: 'auto' })
115136
break
116137
}
117138
}
139+
this.render(false, { width: 'auto', height: 'auto' })
140+
}
141+
142+
async move (direction, ownerId, challengeTrackerId) {
143+
const flagLength = Object.keys(game.users.get(ownerId).data.flags['challenge-tracker']).length
144+
const challengeTracker1 = ChallengeTrackerFlag.get(ownerId, challengeTrackerId)
145+
if (!challengeTracker1) return
146+
const originalPosition = challengeTracker1.listPosition
147+
if ((direction === 'up' && originalPosition === 1) ||
148+
(direction === 'down' && originalPosition >= flagLength)) return
149+
let newPosition = null
150+
switch (direction) {
151+
case 'up':
152+
newPosition = originalPosition - 1
153+
break
154+
case 'down':
155+
newPosition = originalPosition + 1
156+
break
157+
}
158+
const challengeTracker2 = Object.values(game.users.get(ownerId).data.flags['challenge-tracker']).find(ct => ct.listPosition === newPosition)
159+
await ChallengeTrackerFlag.set(ownerId, { id: challengeTrackerId, listPosition: newPosition })
160+
if (challengeTracker2) await ChallengeTrackerFlag.set(ownerId, { id: challengeTracker2.id, listPosition: originalPosition })
118161
}
119162
}
120163

@@ -124,7 +167,6 @@ export class ChallengeTrackerEditForm extends FormApplication {
124167
super()
125168
this.ownerId = ownerId
126169
this.challengeTrackerId = challengeTrackerId
127-
this.jscolor = jscolor
128170
}
129171

130172
static get defaultOptions () {
@@ -152,6 +194,7 @@ export class ChallengeTrackerEditForm extends FormApplication {
152194
return {
153195
challengeTracker: {
154196
frameColor: null,
197+
frameWidth: 'medium',
155198
id: `${ChallengeTrackerSettings.id}-${Math.random().toString(16).slice(2)}`,
156199
innerBackgroundColor: null,
157200
innerColor: null,
@@ -190,7 +233,7 @@ export class ChallengeTrackerEditForm extends FormApplication {
190233

191234
activateListeners (html) {
192235
super.activateListeners(html)
193-
this.jscolor.install()
236+
ColorPicker.install()
194237
}
195238

196239
/**
@@ -209,7 +252,8 @@ export class ChallengeTrackerEditForm extends FormApplication {
209252
const title = formData.title ?? game.i18n.localize('challengeTracker.labels.challengeTrackerTitle')
210253
const persist = true
211254
const id = challengeTrackerId
212-
challengeTrackerOptions = foundry.utils.mergeObject(formData, { ownerId, id, persist, title })
255+
const listPosition = Object.keys(game.users.get(ownerId).data.flags['challenge-tracker']).length + 1
256+
challengeTrackerOptions = foundry.utils.mergeObject(formData, { ownerId, id, listPosition, persist, title })
213257
}
214258
await ChallengeTrackerFlag.set(ownerId, challengeTrackerOptions)
215259
await ChallengeTracker.draw(challengeTrackerOptions)

0 commit comments

Comments
 (0)