From e0fa154b9242dd291973ccf9e4b66c340491c1b5 Mon Sep 17 00:00:00 2001 From: danij Date: Sat, 31 Dec 2011 07:21:56 +0000 Subject: [PATCH] Game Menu: Refactor object geometry using Rect (was RectRaw) --- doomsday/plugins/common/include/hu_lib.h | 12 +- doomsday/plugins/common/include/hu_menu.h | 5 + doomsday/plugins/common/src/g_game.c | 2 + doomsday/plugins/common/src/hu_lib.c | 208 +++++++++++++--------- doomsday/plugins/common/src/hu_menu.c | 119 +++++++++---- doomsday/plugins/common/src/m_ctrl.c | 3 +- 6 files changed, 213 insertions(+), 136 deletions(-) diff --git a/doomsday/plugins/common/include/hu_lib.h b/doomsday/plugins/common/include/hu_lib.h index 0a03488f13..80d4c03e2c 100644 --- a/doomsday/plugins/common/include/hu_lib.h +++ b/doomsday/plugins/common/include/hu_lib.h @@ -195,7 +195,7 @@ typedef struct mn_object_s { int data2; /// Current geometry. - RectRaw _geometry; + Rect* _geometry; } mn_object_t; mn_obtype_e MNObject_Type(const mn_object_t* obj); @@ -208,21 +208,21 @@ int MNObject_Flags(const mn_object_t* obj); * * @return Rectangluar region of the parent space. */ -const RectRaw* MNObject_Geometry(const mn_object_t* obj); +const Rect* MNObject_Geometry(const mn_object_t* obj); /** * Retrieve the origin of the object within the two-dimensioned coordinate * space of the owning object. * @return Origin point within the parent space. */ -const Point2Raw* MNObject_Origin(const mn_object_t* obj); +const Point2* MNObject_Origin(const mn_object_t* obj); /** * Retrieve the boundary dimensions of the object expressed as units of * the coordinate space of the owning object. * @return Size of this object in units of the parent's coordinate space. */ -const Size2Raw* MNObject_Size(const mn_object_t* obj); +const Size2* MNObject_Size(const mn_object_t* obj); /// @return Flags value post operation for caller convenience. int MNObject_SetFlags(mn_object_t* obj, flagop_t op, int flags); @@ -585,8 +585,6 @@ boolean MNColorBox_CopyColor(mn_object_t* obj, int flags, const mn_object_t* oth #if __JDOOM__ || __JDOOM64__ # define MNDATA_SLIDER_OFFSET_X (0) # define MNDATA_SLIDER_OFFSET_Y (0) -# define MNDATA_SLIDER_PADDING_X (0) -# define MNDATA_SLIDER_PADDING_Y (2) # define MNDATA_SLIDER_PATCH_LEFT ("M_THERML") # define MNDATA_SLIDER_PATCH_RIGHT ("M_THERMR") # define MNDATA_SLIDER_PATCH_MIDDLE ("M_THERM2") @@ -594,8 +592,6 @@ boolean MNColorBox_CopyColor(mn_object_t* obj, int flags, const mn_object_t* oth #elif __JHERETIC__ || __JHEXEN__ # define MNDATA_SLIDER_OFFSET_X (0) # define MNDATA_SLIDER_OFFSET_Y (1) -# define MNDATA_SLIDER_PADDING_X (0) -# define MNDATA_SLIDER_PADDING_Y (0) # define MNDATA_SLIDER_PATCH_LEFT ("M_SLDLT") # define MNDATA_SLIDER_PATCH_RIGHT ("M_SLDRT") # define MNDATA_SLIDER_PATCH_MIDDLE ("M_SLDMD1") diff --git a/doomsday/plugins/common/include/hu_menu.h b/doomsday/plugins/common/include/hu_menu.h index 97ebebadc2..f25167fa6c 100644 --- a/doomsday/plugins/common/include/hu_menu.h +++ b/doomsday/plugins/common/include/hu_menu.h @@ -119,6 +119,11 @@ void Hu_MenuRegister(void); */ void Hu_MenuInit(void); +/** + * Menu shutdown, to be called when the game menu is no longer needed. + */ +void Hu_MenuShutdown(void); + /** * Load any resources the menu needs. */ diff --git a/doomsday/plugins/common/src/g_game.c b/doomsday/plugins/common/src/g_game.c index 2f7ed978be..6e5c2d7180 100644 --- a/doomsday/plugins/common/src/g_game.c +++ b/doomsday/plugins/common/src/g_game.c @@ -939,8 +939,10 @@ void G_CommonShutdown(void) P_Shutdown(); G_ShutdownEventSequences(); + Hu_MenuShutdown(); ST_Shutdown(); GUI_Shutdown(); + FI_StackShutdown(); } diff --git a/doomsday/plugins/common/src/hu_lib.c b/doomsday/plugins/common/src/hu_lib.c index bfbea480f4..783fe0579f 100644 --- a/doomsday/plugins/common/src/hu_lib.c +++ b/doomsday/plugins/common/src/hu_lib.c @@ -808,7 +808,8 @@ boolean MNObject_IsDrawable(mn_object_t* obj) static void applyPageLayout(mn_page_t* page) { - int i, yOrigin = 0, lineHeight, lineOffset; + int i, lineHeight, lineOffset; + Point2Raw origin = { 0, 0 }; if(!page) return; @@ -830,8 +831,7 @@ static void applyPageLayout(mn_page_t* page) continue; } - obj->_geometry.origin.x = 0; - obj->_geometry.origin.y = yOrigin; + Rect_SetXY(obj->_geometry, origin.x, origin.y); // Orient label plus button/inline-list/textual-slider pairs about a // vertical dividing line, with the label on the left, other object @@ -847,29 +847,29 @@ static void applyPageLayout(mn_page_t* page) (MNObject_Type(nextObj) == MN_SLIDER && nextObj->drawer == MNSlider_TextualValueDrawer))) { const int margin = lineOffset * 2; + RectRaw united; - nextObj->_geometry.origin.x = margin + obj->_geometry.size.width; - nextObj->_geometry.origin.y = yOrigin; + Rect_SetXY(nextObj->_geometry, margin + Rect_Width(obj->_geometry), origin.y); - // Proceed to the next object! - yOrigin += MAX_OF(obj->_geometry.size.height, - nextObj->_geometry.size.height) + lineOffset; + origin.y += Rect_United(obj->_geometry, nextObj->_geometry, &united) + ->size.height + lineOffset; // Extra spacing between object groups. if(i+2 < page->objectsCount && nextObj->_group != page->objects[i+2]._group) - yOrigin += lineHeight; + origin.y += lineHeight; + // Proceed to the next object! i += 2; continue; } } - yOrigin += obj->_geometry.size.height + lineOffset; + origin.y += Rect_Height(obj->_geometry) + lineOffset; // Extra spacing between object groups. if(nextObj && nextObj->_group != obj->_group) - yOrigin += lineHeight; + origin.y += lineHeight; // Proceed to the next object! i += 1; @@ -914,25 +914,27 @@ void MN_DrawPage(mn_page_t* page, float alpha, boolean showFocusCursor) for(i = 0; i < page->objectsCount; ++i) { mn_object_t* obj = &page->objects[i]; + RectRaw geometry; if(MNObject_Type(obj) == MN_NONE || !obj->drawer || (MNObject_Flags(obj) & MNF_HIDDEN)) continue; + Rect_Raw(MNObject_Geometry(obj), &geometry); + FR_PushAttrib(); - MN_DrawObject(obj, MNObject_Origin(obj)); + MN_DrawObject(obj, &geometry.origin); FR_PopAttrib(); // Draw the focus cursor? if(showFocusCursor && (MNObject_Flags(obj) & MNF_FOCUS)) { - const RectRaw* geometry = MNObject_Geometry(obj); - int focusObjectHeight = geometry->size.height; + int focusObjectHeight = geometry.size.height; Point2Raw cursorOrigin; // Determine the origin and dimensions of the cursor. // \todo Each object should define a focus origin... cursorOrigin.x = 0; - cursorOrigin.y = geometry->origin.y; + cursorOrigin.y = geometry.origin.y; /// \kludge /// We cannot yet query the subobjects of the list for these values @@ -1230,22 +1232,22 @@ int MNObject_Flags(const mn_object_t* obj) return obj->_flags; } -const RectRaw* MNObject_Geometry(const mn_object_t* obj) +const Rect* MNObject_Geometry(const mn_object_t* obj) { assert(obj); - return &obj->_geometry; + return obj->_geometry; } -const Point2Raw* MNObject_Origin(const mn_object_t* obj) +const Point2* MNObject_Origin(const mn_object_t* obj) { assert(obj); - return &obj->_geometry.origin; + return Rect_Origin(obj->_geometry); } -const Size2Raw* MNObject_Size(const mn_object_t* obj) +const Size2* MNObject_Size(const mn_object_t* obj) { assert(obj); - return &obj->_geometry.size; + return Rect_Size(obj->_geometry); } int MNObject_SetFlags(mn_object_t* obj, flagop_t op, int flags) @@ -1400,18 +1402,19 @@ void MNText_Drawer(mn_object_t* obj, const Point2Raw* origin) void MNText_UpdateGeometry(mn_object_t* obj, mn_page_t* page) { mndata_text_t* txt = (mndata_text_t*)obj->_typedata; + Size2Raw size; assert(obj->_type == MN_TEXT); // @fixme What if patch replacement is disabled? if(txt->patch != 0) { patchinfo_t info; R_GetPatchInfo(*txt->patch, &info); - obj->_geometry.size.width = info.geometry.size.width; - obj->_geometry.size.height = info.geometry.size.height; + Rect_SetWidthHeight(obj->_geometry, info.geometry.size.width, info.geometry.size.height); return; } FR_SetFont(MNPage_PredefinedFont(page, obj->_pageFontIdx)); - FR_TextSize(&obj->_geometry.size, txt->text); + FR_TextSize(&size, txt->text); + Rect_SetWidthHeight(obj->_geometry, size.width, size.height); } static void drawEditBackground(const mn_object_t* obj, int x, int y, int width, float alpha) @@ -1670,8 +1673,7 @@ void MNEdit_UpdateGeometry(mn_object_t* obj, mn_page_t* page) { // @fixme calculate visible dimensions properly. assert(obj); - obj->_geometry.size.width = 170; - obj->_geometry.size.height = 14; + Rect_SetWidthHeight(obj->_geometry, 170, 14); } void MNList_Drawer(mn_object_t* obj, const Point2Raw* _origin) @@ -1925,22 +1927,24 @@ int MNListInline_CommandResponder(mn_object_t* obj, menucommand_e cmd) void MNList_UpdateGeometry(mn_object_t* obj, mn_page_t* page) { mndata_list_t* list = (mndata_list_t*)obj->_typedata; + RectRaw itemGeometry = { 0, 0 }; int i; assert(obj->_type == MN_LIST); - obj->_geometry.size.width = 0; - obj->_geometry.size.height = 0; + Rect_SetWidthHeight(obj->_geometry, 0, 0); + FR_SetFont(MNPage_PredefinedFont(page, obj->_pageFontIdx)); for(i = 0; i < list->count; ++i) { mndata_listitem_t* item = &((mndata_listitem_t*)list->items)[i]; - Size2Raw size; - FR_TextSize(&size, item->text); - if(size.width > obj->_geometry.size.width) - obj->_geometry.size.width = size.width; - obj->_geometry.size.height += size.height; + + FR_TextSize(&itemGeometry.size, item->text); if(i != list->count-1) - obj->_geometry.size.height += size.height * MNDATA_LIST_LEADING; + itemGeometry.size.height *= 1 + MNDATA_LIST_LEADING; + + Rect_UniteRaw(obj->_geometry, &itemGeometry); + + itemGeometry.origin.y += itemGeometry.size.height; } } @@ -1948,10 +1952,12 @@ void MNListInline_UpdateGeometry(mn_object_t* obj, mn_page_t* page) { mndata_list_t* list = (mndata_list_t*)obj->_typedata; mndata_listitem_t* item = ((mndata_listitem_t*) list->items) + list->selection; + Size2Raw size; assert(obj->_type == MN_LISTINLINE); FR_SetFont(MNPage_PredefinedFont(page, obj->_pageFontIdx)); - FR_TextSize(&obj->_geometry.size, item->text); + FR_TextSize(&size, item->text); + Rect_SetWidthHeight(obj->_geometry, size.width, size.height); } void MNButton_Drawer(mn_object_t* obj, const Point2Raw* origin) @@ -2071,6 +2077,7 @@ void MNButton_UpdateGeometry(mn_object_t* obj, mn_page_t* page) //int click = (obj->_flags & MNF_CLICKED) != 0; //boolean down = act || click; const char* text = btn->text; + Size2Raw size; // @fixme What if patch replacement is disabled? if(btn->patch) @@ -2086,14 +2093,16 @@ void MNButton_UpdateGeometry(mn_object_t* obj, mn_page_t* page) // Use the original patch. patchinfo_t info; R_GetPatchInfo(*btn->patch, &info); - obj->_geometry.size.width = info.geometry.size.width; - obj->_geometry.size.height = info.geometry.size.height; + Rect_SetWidthHeight(obj->_geometry, info.geometry.size.width, + info.geometry.size.height); return; } } FR_SetFont(MNPage_PredefinedFont(page, obj->_pageFontIdx)); - FR_TextSize(&obj->_geometry.size, text); + FR_TextSize(&size, text); + + Rect_SetWidthHeight(obj->_geometry, size.width, size.height); } void MNColorBox_Drawer(mn_object_t* obj, const Point2Raw* offset) @@ -2241,63 +2250,73 @@ int MNColorBox_CommandResponder(mn_object_t* obj, menucommand_e cmd) void MNColorBox_UpdateGeometry(mn_object_t* obj, mn_page_t* page) { mndata_colorbox_t* cbox = (mndata_colorbox_t*)obj->_typedata; - patchinfo_t t, b, l, r, tl, tr, br, bl; + patchinfo_t info; assert(obj->_type == MN_COLORBOX); - obj->_geometry.size.width = cbox->width; - obj->_geometry.size.height = cbox->height; - - R_GetPatchInfo(borderPatches[0], &t); - R_GetPatchInfo(borderPatches[2], &b); - R_GetPatchInfo(borderPatches[3], &l); - R_GetPatchInfo(borderPatches[1], &r); - R_GetPatchInfo(borderPatches[4], &tl); - R_GetPatchInfo(borderPatches[5], &tr); - R_GetPatchInfo(borderPatches[6], &br); - R_GetPatchInfo(borderPatches[7], &bl); + Rect_SetWidthHeight(obj->_geometry, cbox->width, cbox->height); - // Add top border? - if(t.id || tl.id || tr.id) + // Add bottom border? + if(R_GetPatchInfo(borderPatches[2], &info)) { - int height = 0; - if(t.id) height = t.geometry.size.height; - if(tl.id) height = MAX_OF(height, tl.geometry.size.height); - if(tr.id) height = MAX_OF(height, tr.geometry.size.height); + info.geometry.size.width = cbox->width; + info.geometry.origin.y = cbox->height; + Rect_UniteRaw(obj->_geometry, &info.geometry); + } - obj->_geometry.size.height += height; + // Add right border? + if(R_GetPatchInfo(borderPatches[1], &info)) + { + info.geometry.size.height = cbox->height; + info.geometry.origin.x = cbox->width; + Rect_UniteRaw(obj->_geometry, &info.geometry); } - // Add a bottom border? - if(b.id || bl.id || br.id) + // Add top border? + if(R_GetPatchInfo(borderPatches[0], &info)) { - int height = 0; - if(b.id) height = b.geometry.size.height; - if(bl.id) height = MAX_OF(height, bl.geometry.size.height); - if(br.id) height = MAX_OF(height, br.geometry.size.height); + info.geometry.size.width = cbox->width; + info.geometry.origin.y = -info.geometry.size.height; + Rect_UniteRaw(obj->_geometry, &info.geometry); + } - obj->_geometry.size.height += height; + // Add left border? + if(R_GetPatchInfo(borderPatches[3], &info)) + { + info.geometry.size.height = cbox->height; + info.geometry.origin.x = -info.geometry.size.width; + Rect_UniteRaw(obj->_geometry, &info.geometry); } - // Add a left border? - if(l.id || tl.id || bl.id) + // Add top-left corner? + if(R_GetPatchInfo(borderPatches[4], &info)) { - int width = 0; - if(l.id) width = l.geometry.size.width; - if(tl.id) width = MAX_OF(width, tl.geometry.size.width); - if(bl.id) width = MAX_OF(width, bl.geometry.size.width); + info.geometry.origin.x = -info.geometry.size.width; + info.geometry.origin.y = -info.geometry.size.height; + Rect_UniteRaw(obj->_geometry, &info.geometry); + } - obj->_geometry.size.width += width; + // Add top-right corner? + if(R_GetPatchInfo(borderPatches[5], &info)) + { + info.geometry.origin.x = cbox->width; + info.geometry.origin.y = -info.geometry.size.height; + Rect_UniteRaw(obj->_geometry, &info.geometry); } - // Add a right border? - if(r.id || tr.id || br.id) + // Add bottom-right corner? + if(R_GetPatchInfo(borderPatches[6], &info)) { - int width = 0; - if(r.id) width = r.geometry.size.width; - if(tr.id) width = MAX_OF(width, tr.geometry.size.width); - if(br.id) width = MAX_OF(width, br.geometry.size.width); + info.geometry.origin.x = cbox->width; + info.geometry.origin.y = cbox->height; + Rect_UniteRaw(obj->_geometry, &info.geometry); + } - obj->_geometry.size.width += width; + // Add bottom-left corner? + if(R_GetPatchInfo(borderPatches[7], &info)) + { + info.geometry.origin.x = -info.geometry.size.width; + info.geometry.origin.y = cbox->height; + Rect_UniteRaw(obj->_geometry, &info.geometry); } } @@ -2511,8 +2530,8 @@ void MNSlider_Drawer(mn_object_t* obj, const Point2Raw* origin) if(!R_GetPatchInfo(pSliderLeft, &leftInfo)) return; if(WIDTH <= 0 || HEIGHT <= 0) return; - x = origin->x + MNDATA_SLIDER_SCALE * (MNDATA_SLIDER_PADDING_X + MNDATA_SLIDER_OFFSET_X + leftInfo.geometry.size.width); - y = origin->y + MNDATA_SLIDER_SCALE * (MNDATA_SLIDER_PADDING_Y + MNDATA_SLIDER_OFFSET_Y); + x = origin->x + MNDATA_SLIDER_SCALE * (MNDATA_SLIDER_OFFSET_X + leftInfo.geometry.size.width); + y = origin->y + MNDATA_SLIDER_SCALE * (MNDATA_SLIDER_OFFSET_Y); DGL_MatrixMode(DGL_MODELVIEW); DGL_PushMatrix(); @@ -2694,18 +2713,27 @@ static char* composeValueString(float value, float defaultValue, boolean floatMo void MNSlider_UpdateGeometry(mn_object_t* obj, mn_page_t* page) { + int middleWidth; patchinfo_t info; - int max; if(!R_GetPatchInfo(pSliderMiddle, &info)) return; - obj->_geometry.size.width = (int) (info.geometry.size.width * MNDATA_SLIDER_SLOTS * MNDATA_SLIDER_SCALE + .5f); - max = info.geometry.size.height; + middleWidth = info.geometry.size.width * MNDATA_SLIDER_SLOTS; + Rect_SetWidthHeight(obj->_geometry, middleWidth, info.geometry.size.height); + if(R_GetPatchInfo(pSliderLeft, &info)) - max = MAX_OF(max, info.geometry.size.height); + { + info.geometry.origin.x = -info.geometry.size.width; + Rect_UniteRaw(obj->_geometry, &info.geometry); + } + if(R_GetPatchInfo(pSliderRight, &info)) - max = MAX_OF(max, info.geometry.size.height); + { + info.geometry.origin.x = -info.geometry.size.width; + Rect_UniteRaw(obj->_geometry, &info.geometry); + } - obj->_geometry.size.height = (int) ((max + MNDATA_SLIDER_PADDING_Y * 2) * MNDATA_SLIDER_SCALE + .5f); + Rect_SetWidthHeight(obj->_geometry, .5f + Rect_Width(obj->_geometry) * MNDATA_SLIDER_SCALE, + .5f + Rect_Height(obj->_geometry) * MNDATA_SLIDER_SCALE); } void MNSlider_TextualValueDrawer(mn_object_t* obj, const Point2Raw* origin) @@ -2739,9 +2767,12 @@ void MNSlider_TextualValueUpdateGeometry(mn_object_t* obj, mn_page_t* page) char textualValue[41]; const char* str = composeValueString(value, 0, sldr->floatMode, 0, sldr->data2, sldr->data3, sldr->data4, sldr->data5, 40, textualValue); + Size2Raw size; FR_SetFont(font); - FR_TextSize(&obj->_geometry.size, str); + FR_TextSize(&size, str); + + Rect_SetWidthHeight(obj->_geometry, size.width, size.height); } static void findSpriteForMobjType(int mobjType, spritetype_e* sprite, int* frame) @@ -2852,6 +2883,5 @@ void MNMobjPreview_UpdateGeometry(mn_object_t* obj, mn_page_t* page) { // @fixme calculate visible dimensions properly! assert(obj && obj->_type == MN_MOBJPREVIEW); - obj->_geometry.size.width = MNDATA_MOBJPREVIEW_WIDTH; - obj->_geometry.size.height = MNDATA_MOBJPREVIEW_HEIGHT; + Rect_SetWidthHeight(obj->_geometry, MNDATA_MOBJPREVIEW_WIDTH, MNDATA_MOBJPREVIEW_HEIGHT); } diff --git a/doomsday/plugins/common/src/hu_menu.c b/doomsday/plugins/common/src/hu_menu.c index dca6039088..0f80ca0d8a 100644 --- a/doomsday/plugins/common/src/hu_menu.c +++ b/doomsday/plugins/common/src/hu_menu.c @@ -129,6 +129,7 @@ void Hu_MenuDrawAutomapPage(mn_page_t* page, const Point2Raw* origin); int Hu_MenuColorWidgetCmdResponder(mn_page_t* page, menucommand_e cmd); static void initAllObjectsOnAllPages(void); +static void destroyAllObjectsOnAllPages(void); static void Hu_MenuUpdateCursorState(void); @@ -1548,6 +1549,39 @@ static mn_page_t ColorWidgetMenu = { //0, 8 }; +static boolean inited = false; + +static mn_page_t* pages[] = { + &MainMenu, + &GameTypeMenu, +#if __JHEXEN__ + &PlayerClassMenu, +#endif +#if __JDOOM__ || __JHERETIC__ + &EpisodeMenu, +#endif + &SkillMenu, + &MultiplayerMenu, + &PlayerSetupMenu, +#if __JHERETIC__ || __JHEXEN__ + &FilesMenu, +#endif + &LoadMenu, + &SaveMenu, + &OptionsMenu, + &ControlsMenu, + &GameplayMenu, + &HudMenu, + &AutomapMenu, + &WeaponMenu, +#if __JHERETIC__ || __JHEXEN__ + &InventoryMenu, +#endif + &SoundMenu, + &ColorWidgetMenu, + NULL +}; + // Cvars for the menu: cvartemplate_t menuCVars[] = { { "menu-scale", 0, CVT_FLOAT, &cfg.menuScale, .1f, 1 }, @@ -1992,6 +2026,10 @@ void Hu_MenuInitPlayerClassMenu(void) void Hu_MenuInit(void) { + cvarbutton_t* cvb; + + if(inited) return; + mnAlpha = mnTargetAlpha = 0; menuActivePage = NULL; menuActive = false; @@ -2014,6 +2052,13 @@ void Hu_MenuInit(void) Hu_MenuInitControlsPage(); Hu_MenuInitWeaponsMenu(); + // Set default Yes/No strings. + for(cvb = mnCVarButtons; cvb->cvarname; cvb++) + { + if(!cvb->yes) cvb->yes = "Yes"; + if(!cvb->no) cvb->no = "No"; + } + initAllObjectsOnAllPages(); #if __JDOOM__ @@ -2028,6 +2073,16 @@ void Hu_MenuInit(void) SkillMenu.previous = &GameTypeMenu; } #endif + + inited = true; +} + +void Hu_MenuShutdown(void) +{ + if(!inited) return; + + destroyAllObjectsOnAllPages(); + inited = false; } boolean Hu_MenuIsActive(void) @@ -2390,10 +2445,7 @@ static void initPage(mn_page_t* page) // Init objects. for(obj = page->objects; MNObject_Type(obj) != MN_NONE; obj++) { - obj->_geometry.origin.x = 0; - obj->_geometry.origin.y = 0; - obj->_geometry.size.width = 0; - obj->_geometry.size.height = 0; + obj->_geometry = Rect_New(); MNObject_SetFlags(obj, FO_CLEAR, MNF_FOCUS); if(0 != obj->_shortcut) @@ -2492,46 +2544,39 @@ static void initPage(mn_page_t* page) static void initAllObjectsOnAllPages(void) { - // Set default Yes/No strings. - cvarbutton_t* cvb; - for(cvb = mnCVarButtons; cvb->cvarname; cvb++) + mn_page_t** pageIt; + for(pageIt = pages; *pageIt; pageIt++) { - if(!cvb->yes) cvb->yes = "Yes"; - if(!cvb->no) cvb->no = "No"; + initPage(*pageIt); } +} - initPage(&MainMenu); - initPage(&GameTypeMenu); -#if __JHEXEN__ - initPage(&PlayerClassMenu); -#endif -#if __JDOOM__ || __JHERETIC__ - initPage(&EpisodeMenu); -#endif - initPage(&SkillMenu); - initPage(&MultiplayerMenu); - initPage(&PlayerSetupMenu); -#if __JHERETIC__ || __JHEXEN__ - initPage(&FilesMenu); -#endif - initPage(&LoadMenu); - initPage(&SaveMenu); - initPage(&OptionsMenu); - initPage(&ControlsMenu); - initPage(&GameplayMenu); - initPage(&HudMenu); - initPage(&AutomapMenu); - initPage(&WeaponMenu); -#if __JHERETIC__ || __JHEXEN__ - initPage(&InventoryMenu); -#endif - initPage(&SoundMenu); - initPage(&ColorWidgetMenu); +static void destroyPage(mn_page_t* page) +{ + mn_object_t* obj; + if(!page) return; + for(obj = page->objects; MNObject_Type(obj) != MN_NONE; obj++) + { + if(obj->_geometry) + { + Rect_Delete(obj->_geometry); + obj->_geometry = NULL; + } + } +} + +static void destroyAllObjectsOnAllPages(void) +{ + mn_page_t** pageIt; + for(pageIt = pages; *pageIt; pageIt++) + { + destroyPage(*pageIt); + } } int Hu_MenuColorWidgetCmdResponder(mn_page_t* page, menucommand_e cmd) { - assert(NULL != page); + assert(page); switch(cmd) { case MCMD_NAV_OUT: { diff --git a/doomsday/plugins/common/src/m_ctrl.c b/doomsday/plugins/common/src/m_ctrl.c index ddf02a6f11..6932fe7bab 100644 --- a/doomsday/plugins/common/src/m_ctrl.c +++ b/doomsday/plugins/common/src/m_ctrl.c @@ -627,8 +627,7 @@ void MNBindings_UpdateGeometry(mn_object_t* obj, mn_page_t* page) { // @fixme calculate visible dimensions properly! assert(obj); - obj->_geometry.size.width = 60; - obj->_geometry.size.height = 10 * SMALL_SCALE; + Rect_SetWidthHeight(obj->_geometry, 60, 10 * SMALL_SCALE); } /**