1 #pragma once
2 
3 #include <string>
4 #include <vector>
5 #include <map>
6 #include <deque>
7 
8 #include "misc.h"
9 #include "mfont.h"
10 
11 struct MenuitemOption;
12 
13 typedef vector<MenuitemOption> menuoptions_t;
14 
15 struct MenuitemOption
16 {
17   string m_name;
18   string m_value;
19 
20   MenuitemOption(const string name, const string value="");
21 
22   static int option_id(const menuoptions_t& options,const string &name);
23 };
24 
25 struct Menuitem
26 {
27   string m_name;
28   string m_text;
29   string m_action;
30   string m_submenu;
31   menuoptions_t m_options;
32   int m_selected_option;
33 
34   Menuitem(const string &name,const string &text,const string &action,const string &submenu,
35            menuoptions_t options=menuoptions_t(),int selected_option=0);
36 };
37 
38 typedef deque<Menuitem> menuitems_t;
39 
40 class Menu
41 {
42 protected:
43   vec_str_pair_t m_pending_actions;
44   menuitems_t m_items;
45 
46   void add_action(const string &action_name, const string &action_value);
47 public:
48 
49   int m_selected;
50   string m_parent;
51 
52   Menu(menuitems_t &items,const string &parent="");
53   virtual ~Menu();
54 
55   void add_item(Menuitem item);
56   void next_item(void);
57   void prev_item(void);
58   void selected_item_next_option(void);
59   void selected_item_prev_option(void);
60   string activate_item(void);
61   void switch_to_item(int item);
62 
63   vec_str_pair_t get_pending_actions(void);
64 
65   virtual void draw(vec2 pos, bool centered) = 0;
66   virtual void mouse_moved_to(const vec2 p) = 0;
67 
68   map_str_str_t collect_options(void);
69 };
70 
71 class GraphicMenu : public Menu
72 {
73   MFont *m_font;
74   float m_font_size;
75   vec4 m_color;
76   vec4 m_color_hi;
77   vector<AABB> m_bboxes;
78 public:
79   GraphicMenu(menuitems_t &items,MFont *font,float font_size=1.0,vec4 color=vec4(1,1,1,1),vec4 color_hi=vec4(1,1,0,1));
80   void draw(vec2 pos, bool centered = true);
81   void mouse_moved_to(const vec2 p);
82 };
83 
84 
85 typedef map<string,Menu *> menustore_t;
86 
87 class MenuSystem
88 {
89   Menu *m_current_menu;
90   menustore_t m_menus;
91 
92   string menup_to_str(Menu *menu);
93 
94   void activate(void);
95 
96 public:
97   MenuSystem();
98 
99   bool up_level(void);
100   void add_menu(const string &menu_name, Menu *menu);
101   void draw(vec2 pos, bool centered = true);
102   vec_str_pair_t get_pending_actions(void);
103   bool key_action(int key);
104   bool mouse_action(int button);
105   void mouse_moved(void);
106   void mouse_wheel(int dir);
107 
108   void switch_to_menu(const string &menu_name);
109   void switch_to_item(const int item);
110 
111   Menu *str_to_menup(const string &str);
112 };
113