import {InitiativeTrackerUi} from "./dmscreen-initiativetracker-ui.js";
import {
GROUP_DISPLAY_NAMES,
InitiativeTrackerStatColumnFactory,
IS_PLAYER_VISIBLE_ALL,
IS_PLAYER_VISIBLE_NONE,
IS_PLAYER_VISIBLE_PLAYER_UNITS_ONLY,
} from "./dmscreen-initiativetracker-statcolumns.js";
class _RenderableCollectionStatsCols extends RenderableCollectionGenericRows {
constructor (
{
comp,
doClose,
$wrpRows,
},
) {
super(comp, "statsCols", $wrpRows);
this._doClose = doClose;
}
_populateRow ({comp, $wrpRow, entity}) {
$wrpRow.addClass("py-1p");
const meta = InitiativeTrackerStatColumnFactory.fromPopulateWith({populateWith: comp._state.populateWith});
const $iptAbv = ComponentUiUtil.$getIptStr(comp, "abbreviation");
const $cbIsEditable = ComponentUiUtil.$getCbBool(comp, "isEditable");
const $btnVisible = InitiativeTrackerUi.$getBtnPlayerVisible(
comp._state.isPlayerVisible,
() => comp._state.isPlayerVisible = $btnVisible.hasClass("btn-primary--half")
? IS_PLAYER_VISIBLE_PLAYER_UNITS_ONLY
: $btnVisible.hasClass("btn-primary")
? IS_PLAYER_VISIBLE_ALL
: IS_PLAYER_VISIBLE_NONE,
true,
);
const $btnDelete = this._utils.$getBtnDelete({entity});
const $padDrag = this._utils.$getPadDrag({$wrpRow});
$$($wrpRow)`
${meta.constructor.NAME}
${$iptAbv}
${$cbIsEditable}
${$btnVisible}
${$btnDelete}
${$padDrag}
`;
}
}
export class InitiativeTrackerSettings extends BaseComponent {
static _PROPS_TRACKED = [
"isRollInit",
"isRollHp",
"isRollGroups",
"isRerollInitiativeEachRound",
"playerInitShowExactPlayerHp",
"playerInitShowExactMonsterHp",
"playerInitHideNewMonster",
"playerInitShowOrdinals",
"isStatsAddColumns",
"statsCols",
];
constructor ({state}) {
super();
this._proxyAssignSimple(
"state",
{
...InitiativeTrackerSettings._PROPS_TRACKED
.mergeMap(prop => ({[prop]: state[prop]})),
statsCols: this._getStatColsCollectionFormat(state.statsCols),
},
);
}
/* -------------------------------------------- */
// Convert from classic "flat" format to renderable collection format
_getStatColsCollectionFormat (statsCols) {
return (statsCols || [])
.map(data => {
return InitiativeTrackerStatColumnFactory.fromStateData({data})
.getAsCollectionRowStateData();
});
}
// Convert from renderable collection format to classic "flat" format
_getStatColsDataFormat (statsCols) {
return (statsCols || [])
.map(data => {
return InitiativeTrackerStatColumnFactory.fromCollectionRowStateData({data})
.getAsStateData();
});
}
/* -------------------------------------------- */
getStateUpdate () {
const out = MiscUtil.copyFast(this._state);
out.statsCols = this._getStatColsDataFormat(out.statsCols);
return out;
}
/* -------------------------------------------- */
pGetShowModalResults () {
const {$modalInner, $modalFooter, pGetResolved, doClose} = UiUtil.getShowModal({
title: "Settings",
isUncappedHeight: true,
hasFooter: true,
});
UiUtil.addModalSep($modalInner);
this._pGetShowModalResults_renderSection_isRolls({$modalInner});
UiUtil.addModalSep($modalInner);
this._pGetShowModalResults_renderSection_playerView({$modalInner});
UiUtil.addModalSep($modalInner);
this._pGetShowModalResults_renderSection_additionalCols({$modalInner});
this._pGetShowModalResults_renderFooter({$modalFooter, doClose});
return pGetResolved();
}
/* -------------------------------------------- */
_pGetShowModalResults_renderSection_isRolls ({$modalInner}) {
UiUtil.$getAddModalRowCb2({$wrp: $modalInner, comp: this, prop: "isRollInit", text: "Roll initiative"});
UiUtil.$getAddModalRowCb2({$wrp: $modalInner, comp: this, prop: "isRollHp", text: "Roll hit points"});
UiUtil.$getAddModalRowCb2({$wrp: $modalInner, comp: this, prop: "isRollGroups", text: "Roll groups of creatures together"});
UiUtil.$getAddModalRowCb2({$wrp: $modalInner, comp: this, prop: "isRerollInitiativeEachRound", text: "Reroll initiative each round"});
}
_pGetShowModalResults_renderSection_playerView ({$modalInner}) {
UiUtil.$getAddModalRowCb2({$wrp: $modalInner, comp: this, prop: "playerInitShowExactPlayerHp", text: "Player View: Show exact player HP"});
UiUtil.$getAddModalRowCb2({$wrp: $modalInner, comp: this, prop: "playerInitShowExactMonsterHp", text: "Player View: Show exact monster HP"});
UiUtil.$getAddModalRowCb2({$wrp: $modalInner, comp: this, prop: "playerInitHideNewMonster", text: "Player View: Auto-hide new monsters"});
UiUtil.$getAddModalRowCb2({$wrp: $modalInner, comp: this, prop: "playerInitShowOrdinals", text: "Player View: Show ordinals", title: "For example, if you add two Goblins, one will be Goblin (1) and the other Goblin (2), rather than having identical names."});
}
_pGetShowModalResults_renderSection_additionalCols ({$modalInner}) {
UiUtil.$getAddModalRowCb2({$wrp: $modalInner, comp: this, prop: "isStatsAddColumns", text: "Additional Columns"});
this._pGetShowModalResults_renderSection_additionalCols_head({$modalInner});
this._pGetShowModalResults_renderSection_additionalCols_body({$modalInner});
}
_pGetShowModalResults_renderSection_additionalCols_head ({$modalInner}) {
const getAction = Cls => new ContextUtil.Action(
Cls.NAME,
() => {
this._state.statsCols = [...this._state.statsCols, new Cls().getAsCollectionRowStateData()];
},
);
const menuAddStatsCol = ContextUtil.getMenu(
InitiativeTrackerStatColumnFactory.getGroupedByUi()
.map(group => {
const [ClsHead] = group;
if (group.length === 1) return getAction(ClsHead);
return new ContextUtil.ActionSubMenu(
GROUP_DISPLAY_NAMES[ClsHead.GROUP],
group.map(Cls => getAction(Cls)),
);
}),
);
const $btnAddRow = $(``)
.click(evt => ContextUtil.pOpenMenu(evt, menuAddStatsCol));
const $wrpTblStatsHead = $$`
Contains
Abbreviation
Editable
${$btnAddRow}
`
.appendTo($modalInner);
this._addHookBase("isStatsAddColumns", () => $wrpTblStatsHead.toggleVe(this._state.isStatsAddColumns))();
}
_pGetShowModalResults_renderSection_additionalCols_body ({$modalInner}) {
const $wrpRows = $(``).appendTo($modalInner);
this._addHookBase("isStatsAddColumns", () => $wrpRows.toggleVe(this._state.isStatsAddColumns))();
const renderableCollectionStatsCols = new _RenderableCollectionStatsCols(
{
comp: this,
$wrpRows,
},
);
this._addHookBase("statsCols", () => {
renderableCollectionStatsCols.render();
})();
}
/* -------------------------------------------- */
_pGetShowModalResults_renderFooter ({$modalFooter, doClose}) {
const $btnSave = $(``)
.click(() => doClose(true));
$$($modalFooter)`
${$btnSave}
`;
}
}