From 1b4c9e13b839dfd5ce070c41821f694d7e486d9c Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 18 Feb 2017 19:11:53 +0100 Subject: [PATCH] - cleaned out some cruft from the menu code, now that ListMenu is fully scripted. --- src/CMakeLists.txt | 1 - src/menu/joystickmenu.cpp | 2 +- src/menu/listmenu.cpp | 127 --------------- src/menu/menu.cpp | 150 +----------------- src/menu/menu.h | 48 ------ src/menu/menudef.cpp | 3 +- src/menu/optionmenu.cpp | 28 +--- wadsrc/static/zscript/menu/listmenu.txt | 8 +- wadsrc/static/zscript/menu/menu.txt | 1 - wadsrc/static/zscript/menu/optionmenu.txt | 40 ++++- .../static/zscript/menu/optionmenuitems.txt | 4 +- 11 files changed, 47 insertions(+), 365 deletions(-) delete mode 100644 src/menu/listmenu.cpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index b673b2c20..04f2d0cd9 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -845,7 +845,6 @@ set( FASTMATH_PCH_SOURCES intermission/intermission.cpp intermission/intermission_parse.cpp menu/joystickmenu.cpp - menu/listmenu.cpp menu/loadsavemenu.cpp menu/menu.cpp menu/menudef.cpp diff --git a/src/menu/joystickmenu.cpp b/src/menu/joystickmenu.cpp index 9b16b90f4..8813dcaa7 100644 --- a/src/menu/joystickmenu.cpp +++ b/src/menu/joystickmenu.cpp @@ -186,7 +186,7 @@ void UpdateJoystickMenu(IJoystickConfig *selected) { opt->mSelectedItem = opt->mItems.Size() - 1; } - opt->CalcIndent(); + //opt->CalcIndent(); // If the joystick config menu is open, close it if the device it's open for is gone. if (DMenu::CurrentMenu != nullptr && (DMenu::CurrentMenu->IsKindOf("JoystickConfigMenu"))) diff --git a/src/menu/listmenu.cpp b/src/menu/listmenu.cpp deleted file mode 100644 index beaa687f1..000000000 --- a/src/menu/listmenu.cpp +++ /dev/null @@ -1,127 +0,0 @@ -/* -** listmenu.cpp -** A simple menu consisting of a list of items -** -**--------------------------------------------------------------------------- -** Copyright 2010 Christoph Oelckers -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions -** are met: -** -** 1. Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** 2. Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in the -** documentation and/or other materials provided with the distribution. -** 3. The name of the author may not be used to endorse or promote products -** derived from this software without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -**--------------------------------------------------------------------------- -** -*/ - -#include "v_video.h" -#include "v_font.h" -#include "cmdlib.h" -#include "gstrings.h" -#include "g_level.h" -#include "gi.h" -#include "d_gui.h" -#include "d_event.h" -#include "menu/menu.h" - -IMPLEMENT_CLASS(DListMenu, false, false) - -IMPLEMENT_POINTERS_START(DListMenu) -IMPLEMENT_POINTER(mFocusControl) -IMPLEMENT_POINTERS_END - -//============================================================================= -// -// -// -//============================================================================= - -DListMenu::DListMenu(DMenu *parent, DListMenuDescriptor *desc) -: DMenu(parent) -{ - mDesc = NULL; - if (desc != NULL) Init(parent, desc); -} - -//============================================================================= -// -// -// -//============================================================================= - -void DListMenu::Init(DMenu *parent, DListMenuDescriptor *desc) -{ - mParentMenu = parent; - GC::WriteBarrier(this, parent); - mDesc = desc; - if (desc->mCenter) - { - int center = 160; - for(unsigned i=0;imItems.Size(); i++) - { - int xpos = mDesc->mItems[i]->GetX(); - int width = mDesc->mItems[i]->GetWidth(); - int curx = mDesc->mSelectOfsX; - - if (width > 0 && mDesc->mItems[i]->Selectable()) - { - int left = 160 - (width - curx) / 2 - curx; - if (left < center) center = left; - } - } - for(unsigned i=0;imItems.Size(); i++) - { - int width = mDesc->mItems[i]->GetWidth(); - - if (width > 0) - { - mDesc->mItems[i]->SetX(center); - } - } - } -} - -//============================================================================= -// -// -// -//============================================================================= - -DMenuItemBase *DListMenu::GetItem(FName name) -{ - for(unsigned i=0;imItems.Size(); i++) - { - FName nm = mDesc->mItems[i]->GetAction(NULL); - if (nm == name) return mDesc->mItems[i]; - } - return NULL; -} - -//============================================================================= -// -// base class for menu items -// -//============================================================================= -IMPLEMENT_CLASS(DMenuItemBase, false, false) - -DEFINE_FIELD(DListMenu, mDesc) -DEFINE_FIELD(DListMenu, mFocusControl) - diff --git a/src/menu/menu.cpp b/src/menu/menu.cpp index dc7e02126..e61ac896c 100644 --- a/src/menu/menu.cpp +++ b/src/menu/menu.cpp @@ -444,21 +444,6 @@ DEFINE_ACTION_FUNCTION(DMenu, Close) return 0; } -DEFINE_ACTION_FUNCTION(DMenu, GetItem) -{ - PARAM_SELF_PROLOGUE(DMenu); - PARAM_NAME(name); - ACTION_RETURN_OBJECT(self->GetItem(name)); -} - -DEFINE_ACTION_FUNCTION(DOptionMenuDescriptor, GetItem) -{ - PARAM_SELF_PROLOGUE(DOptionMenuDescriptor); - PARAM_NAME(name); - ACTION_RETURN_OBJECT(self->GetItem(name)); -} - - bool DMenu::DimAllowed() { return true; @@ -1319,41 +1304,6 @@ DMenuItemBase * CreateListMenuItemText(int x, int y, int height, int hotkey, con return (DMenuItemBase*)p; } -bool DMenuItemBase::CheckCoordinate(int x, int y) -{ - IFVIRTUAL(DMenuItemBase, CheckCoordinate) - { - VMValue params[] = { (DObject*)this, x, y }; - int retval; - VMReturn ret(&retval); - GlobalVMStack.Call(func, params, countof(params), &ret, 1, nullptr); - return !!retval; - } - return false; -} - -void DMenuItemBase::Ticker() -{ - IFVIRTUAL(DMenuItemBase, Ticker) - { - VMValue params[] = { (DObject*)this }; - GlobalVMStack.Call(func, params, countof(params), nullptr, 0, nullptr); - } -} - -bool DMenuItemBase::Selectable() -{ - IFVIRTUAL(DMenuItemBase, Selectable) - { - VMValue params[] = { (DObject*)this }; - int retval; - VMReturn ret(&retval); - GlobalVMStack.Call(func, params, countof(params), &ret, 1, nullptr); - return !!retval; - } - return false; -} - bool DMenuItemBase::Activate() { IFVIRTUAL(DMenuItemBase, Activate) @@ -1366,18 +1316,6 @@ bool DMenuItemBase::Activate() } return false; } -FName DMenuItemBase::GetAction(int *pparam) -{ - IFVIRTUAL(DMenuItemBase, GetAction) - { - VMValue params[] = { (DObject*)this }; - int retval[2]; - VMReturn ret[2]; ret[0].IntAt(&retval[0]); ret[1].IntAt(&retval[1]); - GlobalVMStack.Call(func, params, countof(params), ret, 2, nullptr); - return ENamedName(retval[0]); - } - return NAME_None; -} bool DMenuItemBase::SetString(int i, const char *s) { @@ -1435,90 +1373,4 @@ bool DMenuItemBase::GetValue(int i, int *pvalue) return false; } - -void DMenuItemBase::Enable(bool on) -{ - IFVIRTUAL(DMenuItemBase, Enable) - { - VMValue params[] = { (DObject*)this, on }; - GlobalVMStack.Call(func, params, countof(params), nullptr, 0, nullptr); - } -} - -bool DMenuItemBase::MenuEvent(int mkey, bool fromcontroller) -{ - IFVIRTUAL(DMenuItemBase, MenuEvent) - { - VMValue params[] = { (DObject*)this, mkey, fromcontroller }; - int retval; - VMReturn ret(&retval); - GlobalVMStack.Call(func, params, countof(params), &ret, 1, nullptr); - return !!retval; - } - return false; -} - -bool DMenuItemBase::MouseEvent(int type, int x, int y) -{ - IFVIRTUAL(DMenuItemBase, MouseEvent) - { - VMValue params[] = { (DObject*)this, type, x, y }; - int retval; - VMReturn ret(&retval); - GlobalVMStack.Call(func, params, countof(params), &ret, 1, nullptr); - return !!retval; - } - return false; -} - -bool DMenuItemBase::CheckHotkey(int c) -{ - IFVIRTUAL(DMenuItemBase, CheckHotkey) - { - VMValue params[] = { (DObject*)this, c }; - int retval; - VMReturn ret(&retval); - GlobalVMStack.Call(func, params, countof(params), &ret, 1, nullptr); - return !!retval; - } - return false; -} - -int DMenuItemBase::GetWidth() -{ - IFVIRTUAL(DMenuItemBase, GetWidth) - { - VMValue params[] = { (DObject*)this }; - int retval; - VMReturn ret(&retval); - GlobalVMStack.Call(func, params, countof(params), &ret, 1, nullptr); - return retval; - } - return false; -} - -int DMenuItemBase::GetIndent() -{ - IFVIRTUAL(DMenuItemBase, GetIndent) - { - VMValue params[] = { (DObject*)this }; - int retval; - VMReturn ret(&retval); - GlobalVMStack.Call(func, params, countof(params), &ret, 1, nullptr); - return retval; - } - return false; -} - -int DMenuItemBase::Draw(DOptionMenuDescriptor *desc, int y, int indent, bool selected) -{ - IFVIRTUAL(DMenuItemBase, Draw) - { - VMValue params[] = { (DObject*)this, desc, y, indent, selected }; - int retval; - VMReturn ret(&retval); - GlobalVMStack.Call(func, params, countof(params), &ret, 1, nullptr); - return retval; - } - return false; -} +IMPLEMENT_CLASS(DMenuItemBase, false, false) diff --git a/src/menu/menu.h b/src/menu/menu.h index e197a62ef..9ca7a6f31 100644 --- a/src/menu/menu.h +++ b/src/menu/menu.h @@ -286,8 +286,6 @@ public: virtual bool CheckFocus(DMenuItemBase *fc) { return false; } virtual void ReleaseFocus() {} - virtual DMenuItemBase *GetItem(FName name) { return nullptr; } - bool CallResponder(event_t *ev); bool CallMenuEvent(int mkey, bool fromcontroller); bool CallMouseEvent(int type, int x, int y); @@ -317,61 +315,15 @@ public: FNameNoInit mAction; bool mEnabled; - bool CheckCoordinate(int x, int y); - void Ticker(); - bool Selectable(); bool Activate(); - FName GetAction(int *pparam); bool SetString(int i, const char *s); bool GetString(int i, char *s, int len); bool SetValue(int i, int value); bool GetValue(int i, int *pvalue); - void Enable(bool on); - bool MenuEvent (int mkey, bool fromcontroller); - bool MouseEvent(int type, int x, int y); - bool CheckHotkey(int c); - int GetWidth(); - int GetIndent(); - int Draw(DOptionMenuDescriptor *desc, int y, int indent, bool selected); void OffsetPositionY(int ydelta) { mYpos += ydelta; } int GetY() { return mYpos; } - int GetX() { return mXpos; } - void SetX(int x) { mXpos = x; } }; -//============================================================================= -// -// list menu class runs a menu described by a DListMenuDescriptor -// -//============================================================================= - -class DListMenu : public DMenu -{ - DECLARE_CLASS(DListMenu, DMenu) - HAS_OBJECT_POINTERS; -public: - - DListMenuDescriptor *mDesc; - DMenuItemBase *mFocusControl; - - DListMenu(DMenu *parent = NULL, DListMenuDescriptor *desc = NULL); - virtual void Init(DMenu *parent = NULL, DListMenuDescriptor *desc = NULL); - DMenuItemBase *GetItem(FName name); - void SetFocus(DMenuItemBase *fc) - { - mFocusControl = fc; - } - bool CheckFocus(DMenuItemBase *fc) - { - return mFocusControl == fc; - } - void ReleaseFocus() - { - mFocusControl = NULL; - } -}; - - //============================================================================= // // diff --git a/src/menu/menudef.cpp b/src/menu/menudef.cpp index 252533091..2f5c2603d 100644 --- a/src/menu/menudef.cpp +++ b/src/menu/menudef.cpp @@ -868,7 +868,6 @@ static void ParseOptionMenu(FScanner &sc) ParseOptionMenuBody(sc, desc); ReplaceMenu(sc, desc); - if (desc->mIndent == 0) desc->CalcIndent(); } @@ -1340,7 +1339,7 @@ void M_StartupSkillMenu(FGameStartup *gs) // Delete previous contents for(unsigned i=0; imItems.Size(); i++) { - FName n = ld->mItems[i]->GetAction(nullptr); + FName n = ld->mItems[i]->mAction; if (n == NAME_Startgame || n == NAME_StartgameConfirm) { ld->mItems.Resize(i); diff --git a/src/menu/optionmenu.cpp b/src/menu/optionmenu.cpp index acbb3c58e..87f0adcf1 100644 --- a/src/menu/optionmenu.cpp +++ b/src/menu/optionmenu.cpp @@ -49,32 +49,6 @@ #include "menu/menu.h" -//============================================================================= -// -// -// -//============================================================================= - -void DOptionMenuDescriptor::CalcIndent() -{ - // calculate the menu indent - int widest = 0, thiswidth; - - for (unsigned i = 0; i < mItems.Size(); i++) - { - thiswidth = mItems[i]->GetIndent(); - if (thiswidth > widest) widest = thiswidth; - } - mIndent = widest + 4; -} - -DEFINE_ACTION_FUNCTION(DOptionMenuDescriptor, CalcIndent) -{ - PARAM_SELF_PROLOGUE(DOptionMenuDescriptor); - self->CalcIndent(); - return 0; -} - //============================================================================= // // @@ -85,7 +59,7 @@ DMenuItemBase *DOptionMenuDescriptor::GetItem(FName name) { for(unsigned i=0;iGetAction(NULL); + FName nm = mItems[i]->mAction; if (nm == name) return mItems[i]; } return NULL; diff --git a/wadsrc/static/zscript/menu/listmenu.txt b/wadsrc/static/zscript/menu/listmenu.txt index 2aacbb94c..db1a4a19c 100644 --- a/wadsrc/static/zscript/menu/listmenu.txt +++ b/wadsrc/static/zscript/menu/listmenu.txt @@ -40,10 +40,10 @@ class ListMenuDescriptor : MenuDescriptor native // //============================================================================= -class ListMenu : Menu native +class ListMenu : Menu { - native ListMenuDescriptor mDesc; - native MenuItemBase mFocusControl; + ListMenuDescriptor mDesc; + MenuItemBase mFocusControl; virtual void Init(Menu parent = NULL, ListMenuDescriptor desc = NULL) { @@ -82,7 +82,7 @@ class ListMenu : Menu native // //============================================================================= - MenuItemBase GetItem(Name name) + ListMenuItem GetItem(Name name) { for(int i = 0; i < mDesc.mItems.Size(); i++) { diff --git a/wadsrc/static/zscript/menu/menu.txt b/wadsrc/static/zscript/menu/menu.txt index 1640e9d35..103d75104 100644 --- a/wadsrc/static/zscript/menu/menu.txt +++ b/wadsrc/static/zscript/menu/menu.txt @@ -111,7 +111,6 @@ class Menu : Object native native virtual void Ticker(); native virtual void Drawer(); native void Close(); - native MenuItemBase GetItem(Name n); native void ActivateMenu(); static void MenuSound(Sound snd) diff --git a/wadsrc/static/zscript/menu/optionmenu.txt b/wadsrc/static/zscript/menu/optionmenu.txt index 5b06f3020..c6f0247a7 100644 --- a/wadsrc/static/zscript/menu/optionmenu.txt +++ b/wadsrc/static/zscript/menu/optionmenu.txt @@ -56,8 +56,6 @@ class OptionMenuDescriptor : MenuDescriptor native native int mPosition; native bool mDontDim; - native void CalcIndent(); - native OptionMenuItem GetItem(Name iname); void Reset() { // Reset the default settings (ignore all other values in the struct) @@ -66,6 +64,25 @@ class OptionMenuDescriptor : MenuDescriptor native mIndent = 0; mDontDim = 0; } + + //============================================================================= + // + // + // + //============================================================================= + + void CalcIndent() + { + // calculate the menu indent + int widest = 0, thiswidth; + + for (int i = 0; i < mItems.Size(); i++) + { + thiswidth = mItems[i].GetIndent(); + if (thiswidth > widest) widest = thiswidth; + } + mIndent = widest + 4; + } } @@ -88,10 +105,27 @@ class OptionMenu : Menu mParentMenu = parent; mDesc = desc; if (mDesc != NULL && mDesc.mSelectedItem == -1) mDesc.mSelectedItem = FirstSelectable(); - + mDesc.CalcIndent(); } + //============================================================================= + // + // + // + //============================================================================= + + OptionMenuItem GetItem(Name name) + { + for(int i = 0; i < mDesc.mItems.Size(); i++) + { + Name nm = mDesc.mItems[i].GetAction(); + if (nm == name) return mDesc.mItems[i]; + } + return NULL; + } + + //============================================================================= // // diff --git a/wadsrc/static/zscript/menu/optionmenuitems.txt b/wadsrc/static/zscript/menu/optionmenuitems.txt index 4d61edcd0..9ac308372 100644 --- a/wadsrc/static/zscript/menu/optionmenuitems.txt +++ b/wadsrc/static/zscript/menu/optionmenuitems.txt @@ -136,7 +136,7 @@ class OptionMenuItemCommand : OptionMenuItemSubmenu // don't execute if no menu is active if (m == null) return false; // don't execute if this item cannot be found in the current menu. - if (m.mDesc.GetItem(mAction) != self) return false; + if (m.GetItem(mAction) != self) return false; Menu.MenuSound("menu/choose"); DoCommand(mAction); return true; @@ -388,7 +388,7 @@ class EnterKey : Menu let parent = OptionMenu(mParentMenu); if (parent != null) { - let it = parent.mDesc.GetItem('Controlmessage'); + let it = parent.GetItem('Controlmessage'); if (it != null) { it.SetValue(0, which);