diff --git a/src/campaigns/context.ts b/src/campaigns/context.ts index 0d140f2..66a8d23 100644 --- a/src/campaigns/context.ts +++ b/src/campaigns/context.ts @@ -1,6 +1,10 @@ import { CharacterContext } from "character-tracker"; import { ClockFileAdapter } from "clocks/clock-file"; -import { BaseDataContext, ICompleteDataContext } from "datastore/data-context"; +import { + BaseDataContext, + ICompleteDataContext, + trackTypesFromMoves, +} from "datastore/data-context"; import { DataIndexer, SourcedByArray, @@ -91,6 +95,10 @@ export class CampaignDataContext return this.dataContext.prioritized; } + get trackTypes() { + return trackTypesFromMoves(this.moves); + } + diceRollerFor(kind: "move"): AsyncDiceRoller & DiceRoller { switch (kind) { case "move": diff --git a/src/characters/action-context.ts b/src/characters/action-context.ts index ece1b25..de58383 100644 --- a/src/characters/action-context.ts +++ b/src/characters/action-context.ts @@ -112,6 +112,10 @@ export class NoCharacterActionConext implements IActionContext { MOMENTUM_METER_DEFINITION, ]; } + + get trackTypes() { + return this.campaignContext.trackTypes; + } } export class CharacterActionContext implements IActionContext { @@ -217,6 +221,10 @@ export class CharacterActionContext implements IActionContext { updater, ); } + + get trackTypes() { + return this.campaignContext.trackTypes; + } } export type ActionContext = CharacterActionContext | NoCharacterActionConext; diff --git a/src/datastore/data-context.ts b/src/datastore/data-context.ts index 5ce70d1..b7806b6 100644 --- a/src/datastore/data-context.ts +++ b/src/datastore/data-context.ts @@ -11,6 +11,7 @@ export interface IDataContext { readonly moveCategories: StandardIndex; readonly oracles: StandardIndex; readonly truths: StandardIndex; + readonly trackTypes: Set; readonly rulesPackages: StandardIndex; readonly ruleset: Ruleset; @@ -67,6 +68,22 @@ export class MockDataContext implements IDataContext { get ruleset(): Ruleset { throw new Error("not implemented"); } + + get trackTypes(): Set { + return trackTypesFromMoves(this.moves); + } +} + +export function trackTypesFromMoves( + moves: StandardIndex, +): Set { + const types = new Set(); + moves.forEach((move) => { + if (move.roll_type == "progress_roll") { + types.add(move.tracks.category); + } + }); + return types; } // TODO(@cwegrzyn): make this cacheable @@ -123,4 +140,8 @@ export class BaseDataContext implements ICompleteDataContext { return new Ruleset(base[0], expansions); } + + get trackTypes() { + return trackTypesFromMoves(this.moves); + } } diff --git a/src/tracks/progress-create.ts b/src/tracks/progress-create.ts index 624eb7a..4219675 100644 --- a/src/tracks/progress-create.ts +++ b/src/tracks/progress-create.ts @@ -8,11 +8,11 @@ import { debounce, } from "obsidian"; import { generateObsidianFilename } from "utils/filename"; +import { CampaignSelectComponent } from "utils/ui/settings/campaign-suggest"; import { FolderTextSuggest } from "utils/ui/settings/folder"; import { GenericTextSuggest } from "utils/ui/settings/generic-text-suggest"; -import { ChallengeRanks, ProgressTrack } from "./progress"; -import { CampaignSelectComponent } from "utils/ui/settings/campaign-suggest"; import { RelativeFolderSearchComponent } from "utils/ui/settings/relative-folder-search"; +import { ChallengeRanks, ProgressTrack } from "./progress"; export type ProgressTrackCreateResultType = { rank: ChallengeRanks; @@ -65,6 +65,9 @@ export class ProgressTrackCreateModal extends Modal { .setBaseFolder(campaign.file.parent!) .setValue(this.plugin.settings.defaultProgressTrackFolder) .onChanged(); + trackTypeSuggest.items = [ + ...this.plugin.campaignManager.campaignContextFor(campaign).trackTypes, + ]; }; const validate = debounce(() => { @@ -131,9 +134,6 @@ export class ProgressTrackCreateModal extends Modal { }, ); - onChangeCampaign(); - validate(); - // TODO: since the string value equals the display string, i don't actually know if this // is working as intended with the options new Setting(contentEl).setName("Rank").addDropdown((dropdown) => @@ -145,18 +145,13 @@ export class ProgressTrackCreateModal extends Modal { .setValue(this.result.rank), ); + let trackTypeSuggest!: GenericTextSuggest; new Setting(contentEl).setName("Type").addSearch((search) => { search.setPlaceholder( "What kind of track is this? (e.g., Vow, Connection)", ); - new GenericTextSuggest(this.app, search.inputEl, [ - "Vow", - "Connection", - "Combat", - "Scene Challenge", - "Expedition", - ]); + trackTypeSuggest = new GenericTextSuggest(this.app, search.inputEl, []); search.onChange((value) => { this.result.trackType = value; @@ -180,6 +175,9 @@ export class ProgressTrackCreateModal extends Modal { this.close(); }), ); + + onChangeCampaign(); + validate(); } accept(): void { diff --git a/src/utils/ui/settings/generic-text-suggest.ts b/src/utils/ui/settings/generic-text-suggest.ts index b681c31..358b0fb 100644 --- a/src/utils/ui/settings/generic-text-suggest.ts +++ b/src/utils/ui/settings/generic-text-suggest.ts @@ -12,7 +12,7 @@ export class GenericTextSuggest extends AbstractInputSuggest< constructor( app: App, readonly inputEl: HTMLInputElement, - public readonly items: string[], + public items: string[], ) { super(app, inputEl); }