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