summaryrefslogtreecommitdiffhomepage
path: root/StarsEx/Menu.h
blob: 111425ca6627416c8933e79fde980c38d31adb34 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/*  Starshatter: The Open Source Project
    Copyright (c) 2021-2024, Starshatter: The Open Source Project Contributors
    Copyright (c) 2011-2012, Starshatter OpenSource Distribution Contributors
    Copyright (c) 1997-2006, Destroyer Studios LLC.

    AUTHOR:       John DiCamillo


    OVERVIEW
    ========
    Simple menu hierarchy class
*/

#ifndef Menu_h
#define Menu_h

#include "Types.h"
#include "List.h"
#include "Text.h"

// +-------------------------------------------------------------------+

class Menu;
class MenuItem;
class MenuHistory;

// +-------------------------------------------------------------------+

class Menu
{
public:
    static const char* TYPENAME() { return "Menu"; }

    Menu()            { }
    Menu(Text t)      : title(t) { }
    virtual ~Menu()   { items.destroy(); }

    virtual Text      GetTitle()     const { return title;  }
    virtual void      SetTitle(Text t)     { title = t;     }
    virtual Menu*     GetParent()    const { return parent; }
    virtual void      SetParent(Menu* p)   { parent = p;    }

    virtual void      AddItem(Text label, DWORD value=0, bool enabled=true);
    virtual void      AddItem(MenuItem* item);
    virtual void      AddMenu(Text label, Menu* menu, DWORD value=0);
    virtual MenuItem* GetItem(int index);
    virtual void      SetItem(int index, MenuItem* item);
    virtual int       NumItems() const;
    virtual void      ClearItems();

    ListIter<MenuItem> GetItems() { return items; }

protected:
    Text           title;
    List<MenuItem> items;
    Menu*          parent;

    friend class MenuItem;
};

// +-------------------------------------------------------------------+

class MenuItem
{
public:
    static const char* TYPENAME() { return "MenuItem"; }

    MenuItem(Text label, DWORD value=0, bool enabled=true);
    virtual ~MenuItem();

    virtual Text      GetText()      const { return text;     }
    virtual void      SetText(Text t)      { text = t;        }

    virtual DWORD     GetData()      const { return data;     }
    virtual void      SetData(DWORD d)     { data = d;        }

    virtual int       GetEnabled()   const { return enabled;  }
    virtual void      SetEnabled(int  e)   { enabled = e;     }

    virtual int       GetSelected()  const { return selected; }
    virtual void      SetSelected(int  s)  { selected = s;    }

    virtual Menu*     GetMenu()      const { return menu;     }
    virtual void      SetMenu(Menu* m)     { menu = m;        }

    virtual Menu*     GetSubmenu()   const { return submenu;  }
    virtual void      SetSubmenu(Menu* s)  { submenu = s;     }

protected:
    Text           text;
    DWORD          data;
    int            enabled;
    int            selected;

    Menu*          menu;
    Menu*          submenu;

    friend class Menu;
};

// +-------------------------------------------------------------------+

class MenuHistory
{
public:
    static const char* TYPENAME() { return "MenuHistory"; }

    MenuHistory() { }
    virtual ~MenuHistory() { history.clear(); }

    virtual Menu*     GetCurrent();
    virtual Menu*     GetLevel(int n);
    virtual Menu*     Find(const char* title);
    virtual void      Pop();
    virtual void      Push(Menu* menu);
    virtual void      Clear();

private:
    List<Menu>  history;
};

#endif  // Menu_h