Skip to content

Commit

Permalink
libcommon|Menu: Fully initialize the 'PlayerSetup' menu page on activ…
Browse files Browse the repository at this point in the history
…ation

Rather than perform part of the initialization using an activation
callback of the button on the 'Multiplayer' page, this should be done
using a page activation callback.
  • Loading branch information
danij-deng committed Jul 17, 2014
1 parent 0857425 commit ad47e86
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 21 deletions.
11 changes: 11 additions & 0 deletions doomsday/plugins/common/include/hu_lib.h
Expand Up @@ -349,6 +349,10 @@ struct Page
/// Menu-command responder routine.
int (*cmdResponder) (Page *page, menucommand_e cmd);

/// Automatically called when the page is made activate/current.
typedef void (*OnActiveCallback) (Page *);
OnActiveCallback onActiveCallback;

/// User data.
void *userData;

Expand Down Expand Up @@ -454,6 +458,13 @@ struct Page

void applyPageLayout();

/**
* Change the function to callback on page activation to @a newCallback.
*
* @param newCallback Function to callback on page activation. Use @c 0 to clear.
*/
void setOnActiveCallback(OnActiveCallback newCallback);

private:
void giveChildFocus(Widget *wi, dd_bool allowRefocus);
};
Expand Down
29 changes: 20 additions & 9 deletions doomsday/plugins/common/src/hu_lib.cpp
Expand Up @@ -869,6 +869,11 @@ void Page::applyPageLayout()
}
}

void Page::setOnActiveCallback(Page::OnActiveCallback newCallback)
{
onActiveCallback = newCallback;
}

#if __JDOOM__ || __JDOOM64__
static void composeSubpageString(Page *page, char *buf, size_t bufSize)
{
Expand Down Expand Up @@ -1068,15 +1073,16 @@ Page::Page(Point2Raw const &origin, int flags,
void (*drawer) (Page *page, Point2Raw const *origin),
int (*cmdResponder) (Page *page, menucommand_e cmd),
void *userData)
: origin (origin)
, geometry (Rect_New())
, previous (0)
, focus (-1) /// @todo Make this a page flag.
, flags (flags)
, ticker (ticker)
, drawer (drawer)
, cmdResponder (cmdResponder)
, userData (userData)
: origin (origin)
, geometry (Rect_New())
, previous (0)
, focus (-1) /// @todo Make this a page flag.
, flags (flags)
, ticker (ticker)
, drawer (drawer)
, cmdResponder (cmdResponder)
, onActiveCallback(0)
, userData (userData)
{
Str_InitStd(&title);

Expand Down Expand Up @@ -1308,6 +1314,11 @@ void Page::initialize()
}

refocus();

if(onActiveCallback)
{
onActiveCallback(this);
}
}

void Page::initObjects()
Expand Down
23 changes: 11 additions & 12 deletions doomsday/plugins/common/src/hu_menu.cpp
Expand Up @@ -67,9 +67,10 @@ int Hu_MenuSelectSaveGame(Widget *wi, Widget::mn_actionid_t action, void *parame
#if __JHEXEN__
int Hu_MenuSelectFiles(Widget *wi, Widget::mn_actionid_t action, void *parameters);
#endif
int Hu_MenuSelectPlayerSetup(Widget *wi, Widget::mn_actionid_t action, void *parameters);
int Hu_MenuSelectJoinGame(Widget *wi, Widget::mn_actionid_t action, void *parameters);

void Hu_MenuActivatePlayerSetup(Page *page);

#if __JDOOM__ || __JHERETIC__ || __JHEXEN__
int Hu_MenuSelectHelp(Widget *wi, Widget::mn_actionid_t action, void *parameters);
#endif
Expand Down Expand Up @@ -895,7 +896,8 @@ void Hu_MenuInitMultiplayerPage()
btn->_shortcut = 's';
btn->_pageFontIdx = MENU_FONT1;
btn->text = "Player Setup";
btn->actions[Widget::MNA_ACTIVEOUT].callback = Hu_MenuSelectPlayerSetup;
btn->data1 = (void *)"PlayerSetup";
btn->actions[Widget::MNA_ACTIVEOUT].callback = Hu_MenuActionSetActivePage;
btn->actions[Widget::MNA_FOCUS ].callback = Hu_MenuDefaultFocusAction;
page->_widgets << btn;
}
Expand All @@ -910,6 +912,7 @@ void Hu_MenuInitPlayerSetupPage()
#endif

Page *page = Hu_MenuNewPage("PlayerSetup", &origin, 0, Hu_MenuPageTicker, Hu_MenuDrawPlayerSetupPage, NULL, NULL);
page->setOnActiveCallback(Hu_MenuActivatePlayerSetup);
page->setPredefinedFont(MENU_FONT1, FID(GF_FONTA));
page->setPredefinedFont(MENU_FONT2, FID(GF_FONTB));
page->setPreviousPage(Hu_MenuFindPageByName("Multiplayer"));
Expand Down Expand Up @@ -4782,14 +4785,13 @@ int Hu_MenuSelectJoinGame(Widget * /*wi*/, Widget::mn_actionid_t action, void *
return 0;
}

int Hu_MenuSelectPlayerSetup(Widget * /*wi*/, Widget::mn_actionid_t action, void * /*context*/)
void Hu_MenuActivatePlayerSetup(Page *page)
{
if(Widget::MNA_ACTIVEOUT != action) return 1;
DENG2_ASSERT(page != 0);

Page *playerSetupPage = Hu_MenuFindPageByName("PlayerSetup");
MobjPreviewWidget &mop = MN_MustFindObjectOnPage(playerSetupPage, 0, MNF_ID0)->as<MobjPreviewWidget>();
LineEditWidget &name = MN_MustFindObjectOnPage(playerSetupPage, 0, MNF_ID1)->as<LineEditWidget>();
ListWidget &color = MN_MustFindObjectOnPage(playerSetupPage, 0, MNF_ID3)->as<ListWidget>();
MobjPreviewWidget &mop = MN_MustFindObjectOnPage(page, 0, MNF_ID0)->as<MobjPreviewWidget>();
LineEditWidget &name = MN_MustFindObjectOnPage(page, 0, MNF_ID1)->as<LineEditWidget>();
ListWidget &color = MN_MustFindObjectOnPage(page, 0, MNF_ID3)->as<ListWidget>();

#if __JHEXEN__
mop.setMobjType(PCLASS_INFO(cfg.netClass)->mobjType);
Expand All @@ -4803,14 +4805,11 @@ int Hu_MenuSelectPlayerSetup(Widget * /*wi*/, Widget::mn_actionid_t action, void

color.selectItemByValue(MNLIST_SIF_NO_ACTION, cfg.netColor);
#if __JHEXEN__
ListWidget &class_ = MN_MustFindObjectOnPage(playerSetupPage, 0, MNF_ID2)->as<ListWidget>();
ListWidget &class_ = MN_MustFindObjectOnPage(page, 0, MNF_ID2)->as<ListWidget>();
class_.selectItemByValue(MNLIST_SIF_NO_ACTION, cfg.netClass);
#endif

name.setText(MNEDIT_STF_NO_ACTION|MNEDIT_STF_REPLACEOLD, Con_GetString("net-name"));

Hu_MenuSetActivePage(playerSetupPage);
return 0;
}

#if __JHEXEN__
Expand Down

0 comments on commit ad47e86

Please sign in to comment.