diff --git a/doomsday/plugins/common/include/hu_menu.h b/doomsday/plugins/common/include/hu_menu.h index 517d1bd750..9c2fd42c31 100644 --- a/doomsday/plugins/common/include/hu_menu.h +++ b/doomsday/plugins/common/include/hu_menu.h @@ -32,8 +32,6 @@ namespace common { extern int menuTime; extern dd_bool menuNominatingQuickSaveSlot; -extern menu::cvarbutton_t mnCVarButtons[]; - // Sounds played in the menu. #if __JDOOM__ || __JDOOM64__ #define SFX_MENU_CLOSE (SFX_SWTCHX) diff --git a/doomsday/plugins/common/include/menu/widgets/cvartogglewidget.h b/doomsday/plugins/common/include/menu/widgets/cvartogglewidget.h index c4b3097578..8ae8c9924b 100644 --- a/doomsday/plugins/common/include/menu/widgets/cvartogglewidget.h +++ b/doomsday/plugins/common/include/menu/widgets/cvartogglewidget.h @@ -32,42 +32,40 @@ namespace menu { class CVarToggleWidget : public ButtonWidget { public: - void *data1; - int data2; + enum State { + Up, + Down + }; public: - CVarToggleWidget(char const *cvarPath); + CVarToggleWidget(char const *cvarPath, int cvarValueMask = 0, + de::String const &downText = "Yes", + de::String const &upText = "No"); virtual ~CVarToggleWidget(); int handleCommand(menucommand_e command); + void setState(State newState); + State state() const; + + inline bool isUp() const { return state() == Up; } + inline bool isDown() const { return state() == Down; } + char const *cvarPath() const; + int cvarValueMask() const; + + void setDownText(de::String const &newDownText); + de::String downText() const; + + void setUpText(de::String const &newUpText); + de::String upText() const; private: - char const *_cvarPath; + DENG2_PRIVATE(d) }; void CVarToggleWidget_UpdateCVar(Widget *wi, Widget::mn_actionid_t action); -/// @todo Refactor away. -struct cvarbutton_t -{ - char active; - char const *cvarname; - char const *yes; - char const *no; - int mask; - - cvarbutton_t(char active = 0, char const *cvarname = 0, char const *yes = 0, char const *no = 0, - int mask = 0) - : active(active) - , cvarname(cvarname) - , yes(yes) - , no(no) - , mask(mask) - {} -}; - } // namespace menu } // namespace common diff --git a/doomsday/plugins/common/src/hu_menu.cpp b/doomsday/plugins/common/src/hu_menu.cpp index 6b0e188774..9773262c7e 100644 --- a/doomsday/plugins/common/src/hu_menu.cpp +++ b/doomsday/plugins/common/src/hu_menu.cpp @@ -154,112 +154,6 @@ static void Hu_MenuUpdateCursorState(); static dd_bool Hu_MenuHasCursorRotation(Widget *wi); -cvarbutton_t mnCVarButtons[] = { - cvarbutton_t(0, "ctl-aim-noauto"), -#if __JHERETIC__ || __JHEXEN__ - cvarbutton_t(0, "ctl-inventory-mode", "Scroll", "Cursor"), - cvarbutton_t(0, "ctl-inventory-use-immediate"), - cvarbutton_t(0, "ctl-inventory-use-next"), - cvarbutton_t(0, "ctl-inventory-wrap"), -#endif - cvarbutton_t(0, "ctl-look-spring"), - cvarbutton_t(0, "ctl-run"), -#if __JDOOM__ || __JDOOM64__ - cvarbutton_t(0, "game-anybossdeath666"), -#endif -#if __JDOOM__ || __JHERETIC__ || __JDOOM64__ - cvarbutton_t(0, "game-corpse-sliding"), -#endif -#if __JDOOM__ || __JDOOM64__ - cvarbutton_t(0, "game-maxskulls"), -#endif -#if __JDOOM__ || __JHERETIC__ || __JDOOM64__ - cvarbutton_t(0, "game-monsters-stuckindoors"), - cvarbutton_t(0, "game-monsters-floatoverblocking"), - cvarbutton_t(0, "game-objects-clipping"), - cvarbutton_t(0, "game-objects-falloff"), -#endif -#if __JDOOM__ || __JDOOM64__ - cvarbutton_t(0, "game-objects-gibcrushednonbleeders"), -#endif -#if __JDOOM__ || __JHERETIC__ || __JDOOM64__ - cvarbutton_t(0, "game-objects-neverhangoverledges"), - cvarbutton_t(0, "game-player-wallrun-northonly"), -#endif -#if __JDOOM__ - cvarbutton_t(0, "game-raiseghosts"), -#endif - cvarbutton_t(0, "game-save-confirm"), - cvarbutton_t(0, "game-save-confirm-loadonreborn"), - cvarbutton_t(0, "game-save-last-loadonreborn"), -#if __JDOOM__ || __JDOOM64__ - cvarbutton_t(0, "game-skullsinwalls"), -#if __JDOOM__ - cvarbutton_t(0, "game-vilechase-usevileradius"), -#endif - cvarbutton_t(0, "game-zombiescanexit"), -#endif -#if __JDOOM__ || __JDOOM64__ || __JHERETIC__ - cvarbutton_t(0, "hud-ammo"), - cvarbutton_t(0, "hud-armor"), -#endif -#if __JDOOM__ || __JDOOM64__ || __JHERETIC__ - cvarbutton_t(0, "hud-cheat-counter-show-mapopen"), -#endif -#if __JHERETIC__ || __JHEXEN__ - cvarbutton_t(0, "hud-currentitem"), -#endif -#if __JDOOM__ - cvarbutton_t(0, "hud-face"), - cvarbutton_t(0, "hud-face-ouchfix"), -#endif - cvarbutton_t(0, "hud-health"), -#if __JHERETIC__ || __JHEXEN__ - cvarbutton_t(0, "hud-inventory-slot-showempty"), -#endif -#if __JDOOM__ || __JDOOM64__ || __JHERETIC__ - cvarbutton_t(0, "hud-keys"), -#endif -#if __JDOOM__ - cvarbutton_t(0, "hud-keys-combine"), -#endif -#if __JHEXEN__ - cvarbutton_t(0, "hud-mana"), -#endif -#if __JDOOM64__ - cvarbutton_t(0, "hud-power"), -#endif -#if __JDOOM__ || __JDOOM64__ - cvarbutton_t(0, "hud-status-weaponslots-ownedfix"), -#endif - cvarbutton_t(0, "hud-unhide-damage"), - cvarbutton_t(0, "hud-unhide-pickup-ammo"), - cvarbutton_t(0, "hud-unhide-pickup-armor"), - cvarbutton_t(0, "hud-unhide-pickup-health"), -#if __JHERETIC__ || __JHEXEN__ - cvarbutton_t(0, "hud-unhide-pickup-invitem"), -#endif - cvarbutton_t(0, "hud-unhide-pickup-powerup"), - cvarbutton_t(0, "hud-unhide-pickup-key"), - cvarbutton_t(0, "hud-unhide-pickup-weapon"), - cvarbutton_t(0, "map-door-colors"), - cvarbutton_t(0, "msg-show"), -#if __JDOOM__ || __JDOOM64__ - cvarbutton_t(0, "player-autoswitch-berserk"), -#endif - cvarbutton_t(0, "player-autoswitch-notfiring"), -#if __JDOOM__ || __JHERETIC__ || __JDOOM64__ - cvarbutton_t(0, "player-jump"), -#endif - cvarbutton_t(0, "player-weapon-cycle-sequential"), - cvarbutton_t(0, "player-weapon-nextmode"), -#if __JDOOM64__ - cvarbutton_t(0, "player-weapon-recoil"), -#endif - cvarbutton_t(0, "view-cross-vitality"), - cvarbutton_t() -}; - int menuTime; dd_bool menuNominatingQuickSaveSlot; @@ -2259,7 +2153,7 @@ void Hu_MenuInitInventoryOptionsPage() page->widgets() << new LabelWidget("Select Mode"); { - auto *btn = new CVarToggleWidget("ctl-inventory-mode"); + auto *btn = new CVarToggleWidget("ctl-inventory-mode", 0, "Scroll", "Cursor"); btn->setShortcut('s'); page->widgets() << btn; } @@ -2594,13 +2488,6 @@ void Hu_MenuInit() Hu_MenuLoadResources(); - // Set default Yes/No strings. - for(cvarbutton_t *cvb = mnCVarButtons; cvb->cvarname; cvb++) - { - if(!cvb->yes) cvb->yes = "Yes"; - if(!cvb->no) cvb->no = "No"; - } - initAllPages(); initAllObjectsOnAllPages(); diff --git a/doomsday/plugins/common/src/menu/page.cpp b/doomsday/plugins/common/src/menu/page.cpp index 7fe524f2ae..398de7e1e2 100644 --- a/doomsday/plugins/common/src/menu/page.cpp +++ b/doomsday/plugins/common/src/menu/page.cpp @@ -686,9 +686,7 @@ void Page::initialize() { if(CVarToggleWidget *tog = wi->maybeAs()) { - cvarbutton_t *cvb = (cvarbutton_t *) tog->data1; - bool const activate = (cvb && cvb->active); - tog->setFlags(Widget::Active, (activate? SetFlags : UnsetFlags)); + tog->setFlags(Widget::Active, tog->isDown()? SetFlags : UnsetFlags); } if(ListWidget *list = wi->maybeAs()) { @@ -731,26 +729,9 @@ void Page::updateWidgets() } if(CVarToggleWidget *tog = wi->maybeAs()) { - if(tog->data1) - { - // This button has already been initialized. - cvarbutton_t *cvb = (cvarbutton_t *) tog->data1; - cvb->active = (Con_GetByte(tog->cvarPath()) & (cvb->mask? cvb->mask : ~0)) != 0; - tog->setText(cvb->active? cvb->yes : cvb->no); - continue; - } - - // Find the cvarbutton representing this one. - for(cvarbutton_t *cvb = mnCVarButtons; cvb->cvarname; cvb++) - { - if(!strcmp(tog->cvarPath(), cvb->cvarname) && tog->data2 == cvb->mask) - { - cvb->active = (Con_GetByte(tog->cvarPath()) & (cvb->mask? cvb->mask : ~0)) != 0; - tog->data1 = (void *) cvb; - tog->setText(cvb->active ? cvb->yes : cvb->no); - break; - } - } + int value = Con_GetByte(tog->cvarPath()) & (tog->cvarValueMask()? tog->cvarValueMask() : ~0); + tog->setState(value? CVarToggleWidget::Down : CVarToggleWidget::Up); + tog->setText(tog->isDown()? tog->downText() : tog->upText()); } if(CVarInlineListWidget *list = wi->maybeAs()) { diff --git a/doomsday/plugins/common/src/menu/widgets/cvartogglewidget.cpp b/doomsday/plugins/common/src/menu/widgets/cvartogglewidget.cpp index 5ed9011e72..0a0a6b63d7 100644 --- a/doomsday/plugins/common/src/menu/widgets/cvartogglewidget.cpp +++ b/doomsday/plugins/common/src/menu/widgets/cvartogglewidget.cpp @@ -28,25 +28,34 @@ using namespace de; namespace common { namespace menu { -CVarToggleWidget::CVarToggleWidget(char const *cvarPath) +DENG2_PIMPL_NOREF(CVarToggleWidget) +{ + State state = Up; + char const *cvarPath = nullptr; + int cvarValueMask = 0; + String downText; + String upText; +}; + +CVarToggleWidget::CVarToggleWidget(char const *cvarPath, int cvarValueMask, + String const &downText, String const &upText) : ButtonWidget() - , data1(nullptr) - , _cvarPath(cvarPath) + , d(new Instance) { setFont(MENU_FONT1); setColor(MENU_COLOR3); setAction(MNA_MODIFIED, CVarToggleWidget_UpdateCVar); setAction(MNA_FOCUS, Hu_MenuDefaultFocusAction); + + d->cvarPath = cvarPath; + d->cvarValueMask = cvarValueMask; + setDownText(downText); + setUpText(upText); } CVarToggleWidget::~CVarToggleWidget() {} -char const *CVarToggleWidget::cvarPath() const -{ - return _cvarPath; -} - int CVarToggleWidget::handleCommand(menucommand_e cmd) { if(cmd == MCMD_SELECT) @@ -69,13 +78,10 @@ int CVarToggleWidget::handleCommand(menucommand_e cmd) setFlags(Active, isActive()? UnsetFlags : SetFlags); } - if(data1) + setState(isActive()? Down : Up); + if(hasAction(MNA_MODIFIED)) { - *((char *)data1) = isActive(); - if(hasAction(MNA_MODIFIED)) - { - execAction(MNA_MODIFIED); - } + execAction(MNA_MODIFIED); } if(!justActivated && !isActive()) @@ -96,35 +102,74 @@ int CVarToggleWidget::handleCommand(menucommand_e cmd) void CVarToggleWidget_UpdateCVar(Widget *wi, Widget::mn_actionid_t action) { CVarToggleWidget *tog = &wi->as(); - cvarbutton_t const *cb = (cvarbutton_t *)tog->data1; - cvartype_t varType = Con_GetVariableType(tog->cvarPath()); - int value; if(Widget::MNA_MODIFIED != action) return; - tog->setText(cb->active? cb->yes : cb->no); + tog->setText(tog->isDown()? tog->downText() : tog->upText()); + cvartype_t varType = Con_GetVariableType(tog->cvarPath()); if(CVT_NULL == varType) return; - if(cb->mask) + int value; + if(int const valueMask = tog->cvarValueMask()) { value = Con_GetInteger(tog->cvarPath()); - if(cb->active) + if(tog->isDown()) { - value |= cb->mask; + value |= valueMask; } else { - value &= ~cb->mask; + value &= ~valueMask; } } else { - value = cb->active; + value = int(tog->state()); } Con_SetInteger2(tog->cvarPath(), value, SVF_WRITE_OVERRIDE); } +void CVarToggleWidget::setState(State newState) +{ + d->state = newState; +} + +CVarToggleWidget::State CVarToggleWidget::state() const +{ + return d->state; +} + +char const *CVarToggleWidget::cvarPath() const +{ + return d->cvarPath; +} + +int CVarToggleWidget::cvarValueMask() const +{ + return d->cvarValueMask; +} + +void CVarToggleWidget::setDownText(String const &newDownText) +{ + d->downText = newDownText; +} + +String CVarToggleWidget::downText() const +{ + return d->downText; +} + +void CVarToggleWidget::setUpText(String const &newUpText) +{ + d->upText = newUpText; +} + +String CVarToggleWidget::upText() const +{ + return d->upText; +} + } // namespace menu } // namespace common