Skip to content

Commit

Permalink
Refactor|libcommon|Menu: Applied pimpl to menu::CVarToggleWidget
Browse files Browse the repository at this point in the history
  • Loading branch information
danij-deng committed Sep 21, 2014
1 parent f08646f commit 9b700f0
Show file tree
Hide file tree
Showing 5 changed files with 94 additions and 185 deletions.
2 changes: 0 additions & 2 deletions doomsday/plugins/common/include/hu_menu.h
Expand Up @@ -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)
Expand Down
44 changes: 21 additions & 23 deletions doomsday/plugins/common/include/menu/widgets/cvartogglewidget.h
Expand Up @@ -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

Expand Down
115 changes: 1 addition & 114 deletions doomsday/plugins/common/src/hu_menu.cpp
Expand Up @@ -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;

Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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();

Expand Down
27 changes: 4 additions & 23 deletions doomsday/plugins/common/src/menu/page.cpp
Expand Up @@ -686,9 +686,7 @@ void Page::initialize()
{
if(CVarToggleWidget *tog = wi->maybeAs<CVarToggleWidget>())
{
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<ListWidget>())
{
Expand Down Expand Up @@ -731,26 +729,9 @@ void Page::updateWidgets()
}
if(CVarToggleWidget *tog = wi->maybeAs<CVarToggleWidget>())
{
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<CVarInlineListWidget>())
{
Expand Down
91 changes: 68 additions & 23 deletions doomsday/plugins/common/src/menu/widgets/cvartogglewidget.cpp
Expand Up @@ -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)
Expand All @@ -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())
Expand All @@ -96,35 +102,74 @@ int CVarToggleWidget::handleCommand(menucommand_e cmd)
void CVarToggleWidget_UpdateCVar(Widget *wi, Widget::mn_actionid_t action)
{
CVarToggleWidget *tog = &wi->as<CVarToggleWidget>();
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

0 comments on commit 9b700f0

Please sign in to comment.