- cleaned out some cruft from the menu code, now that ListMenu is fully scripted.

This commit is contained in:
Christoph Oelckers 2017-02-18 19:11:53 +01:00
parent b7a5437af6
commit 1b4c9e13b8
11 changed files with 47 additions and 365 deletions

View file

@ -845,7 +845,6 @@ set( FASTMATH_PCH_SOURCES
intermission/intermission.cpp intermission/intermission.cpp
intermission/intermission_parse.cpp intermission/intermission_parse.cpp
menu/joystickmenu.cpp menu/joystickmenu.cpp
menu/listmenu.cpp
menu/loadsavemenu.cpp menu/loadsavemenu.cpp
menu/menu.cpp menu/menu.cpp
menu/menudef.cpp menu/menudef.cpp

View file

@ -186,7 +186,7 @@ void UpdateJoystickMenu(IJoystickConfig *selected)
{ {
opt->mSelectedItem = opt->mItems.Size() - 1; 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 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"))) if (DMenu::CurrentMenu != nullptr && (DMenu::CurrentMenu->IsKindOf("JoystickConfigMenu")))

View file

@ -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;i<mDesc->mItems.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;i<mDesc->mItems.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;i<mDesc->mItems.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)

View file

@ -444,21 +444,6 @@ DEFINE_ACTION_FUNCTION(DMenu, Close)
return 0; 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() bool DMenu::DimAllowed()
{ {
return true; return true;
@ -1319,41 +1304,6 @@ DMenuItemBase * CreateListMenuItemText(int x, int y, int height, int hotkey, con
return (DMenuItemBase*)p; 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() bool DMenuItemBase::Activate()
{ {
IFVIRTUAL(DMenuItemBase, Activate) IFVIRTUAL(DMenuItemBase, Activate)
@ -1366,18 +1316,6 @@ bool DMenuItemBase::Activate()
} }
return false; 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) bool DMenuItemBase::SetString(int i, const char *s)
{ {
@ -1435,90 +1373,4 @@ bool DMenuItemBase::GetValue(int i, int *pvalue)
return false; return false;
} }
IMPLEMENT_CLASS(DMenuItemBase, false, 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;
}

View file

@ -286,8 +286,6 @@ public:
virtual bool CheckFocus(DMenuItemBase *fc) { return false; } virtual bool CheckFocus(DMenuItemBase *fc) { return false; }
virtual void ReleaseFocus() {} virtual void ReleaseFocus() {}
virtual DMenuItemBase *GetItem(FName name) { return nullptr; }
bool CallResponder(event_t *ev); bool CallResponder(event_t *ev);
bool CallMenuEvent(int mkey, bool fromcontroller); bool CallMenuEvent(int mkey, bool fromcontroller);
bool CallMouseEvent(int type, int x, int y); bool CallMouseEvent(int type, int x, int y);
@ -317,61 +315,15 @@ public:
FNameNoInit mAction; FNameNoInit mAction;
bool mEnabled; bool mEnabled;
bool CheckCoordinate(int x, int y);
void Ticker();
bool Selectable();
bool Activate(); bool Activate();
FName GetAction(int *pparam);
bool SetString(int i, const char *s); bool SetString(int i, const char *s);
bool GetString(int i, char *s, int len); bool GetString(int i, char *s, int len);
bool SetValue(int i, int value); bool SetValue(int i, int value);
bool GetValue(int i, int *pvalue); 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; } void OffsetPositionY(int ydelta) { mYpos += ydelta; }
int GetY() { return mYpos; } 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;
}
};
//============================================================================= //=============================================================================
// //
// //

View file

@ -868,7 +868,6 @@ static void ParseOptionMenu(FScanner &sc)
ParseOptionMenuBody(sc, desc); ParseOptionMenuBody(sc, desc);
ReplaceMenu(sc, desc); ReplaceMenu(sc, desc);
if (desc->mIndent == 0) desc->CalcIndent();
} }
@ -1340,7 +1339,7 @@ void M_StartupSkillMenu(FGameStartup *gs)
// Delete previous contents // Delete previous contents
for(unsigned i=0; i<ld->mItems.Size(); i++) for(unsigned i=0; i<ld->mItems.Size(); i++)
{ {
FName n = ld->mItems[i]->GetAction(nullptr); FName n = ld->mItems[i]->mAction;
if (n == NAME_Startgame || n == NAME_StartgameConfirm) if (n == NAME_Startgame || n == NAME_StartgameConfirm)
{ {
ld->mItems.Resize(i); ld->mItems.Resize(i);

View file

@ -49,32 +49,6 @@
#include "menu/menu.h" #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;i<mItems.Size(); i++) for(unsigned i=0;i<mItems.Size(); i++)
{ {
FName nm = mItems[i]->GetAction(NULL); FName nm = mItems[i]->mAction;
if (nm == name) return mItems[i]; if (nm == name) return mItems[i];
} }
return NULL; return NULL;

View file

@ -40,10 +40,10 @@ class ListMenuDescriptor : MenuDescriptor native
// //
//============================================================================= //=============================================================================
class ListMenu : Menu native class ListMenu : Menu
{ {
native ListMenuDescriptor mDesc; ListMenuDescriptor mDesc;
native MenuItemBase mFocusControl; MenuItemBase mFocusControl;
virtual void Init(Menu parent = NULL, ListMenuDescriptor desc = NULL) 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++) for(int i = 0; i < mDesc.mItems.Size(); i++)
{ {

View file

@ -111,7 +111,6 @@ class Menu : Object native
native virtual void Ticker(); native virtual void Ticker();
native virtual void Drawer(); native virtual void Drawer();
native void Close(); native void Close();
native MenuItemBase GetItem(Name n);
native void ActivateMenu(); native void ActivateMenu();
static void MenuSound(Sound snd) static void MenuSound(Sound snd)

View file

@ -56,8 +56,6 @@ class OptionMenuDescriptor : MenuDescriptor native
native int mPosition; native int mPosition;
native bool mDontDim; native bool mDontDim;
native void CalcIndent();
native OptionMenuItem GetItem(Name iname);
void Reset() void Reset()
{ {
// Reset the default settings (ignore all other values in the struct) // Reset the default settings (ignore all other values in the struct)
@ -66,6 +64,25 @@ class OptionMenuDescriptor : MenuDescriptor native
mIndent = 0; mIndent = 0;
mDontDim = 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; mParentMenu = parent;
mDesc = desc; mDesc = desc;
if (mDesc != NULL && mDesc.mSelectedItem == -1) mDesc.mSelectedItem = FirstSelectable(); 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;
}
//============================================================================= //=============================================================================
// //
// //

View file

@ -136,7 +136,7 @@ class OptionMenuItemCommand : OptionMenuItemSubmenu
// don't execute if no menu is active // don't execute if no menu is active
if (m == null) return false; if (m == null) return false;
// don't execute if this item cannot be found in the current menu. // 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"); Menu.MenuSound("menu/choose");
DoCommand(mAction); DoCommand(mAction);
return true; return true;
@ -388,7 +388,7 @@ class EnterKey : Menu
let parent = OptionMenu(mParentMenu); let parent = OptionMenu(mParentMenu);
if (parent != null) if (parent != null)
{ {
let it = parent.mDesc.GetItem('Controlmessage'); let it = parent.GetItem('Controlmessage');
if (it != null) if (it != null)
{ {
it.SetValue(0, which); it.SetValue(0, which);