Menu.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. /******************************************************************************/
  2. enum MENU_FLAG // Menu Element Flags
  3. {
  4. MENU_TOGGLABLE =1<<0, // if togglable
  5. MENU_NOT_SELECTABLE=1<<1, // if can't be selected
  6. MENU_HIDDEN =1<<2, // if hidden
  7. MENU_NO_CLOSE =1<<3, // if selecting will not close menu
  8. };
  9. enum MENU_COLUMN // List columns available when creating 'Menu' from 'Node<MenuElm>'
  10. {
  11. MENU_COLUMN_CHECK, // enabled/checked state
  12. MENU_COLUMN_NAME , // display name
  13. MENU_COLUMN_KBSC , // keyboard shortcut
  14. MENU_COLUMN_KBSC2, // keyboard shortcut #2
  15. MENU_COLUMN_SUB , // sub-elements (children)
  16. MENU_COLUMN_NUM , // number of menu list columns
  17. };
  18. /******************************************************************************/
  19. struct MenuElm // Menu Element
  20. {
  21. Str name , // name (used for code commands)
  22. display_name; // display name
  23. Bool on , // if on (checked ), default=false
  24. disabled ; // if disabled (greyed out), default=false
  25. MenuElm& del ( ); // delete
  26. MenuElm& create(C Str &name, void (*func)( )=null , Bool immediate=false); // create
  27. MenuElm& create(C Str &name, void (*func)(Ptr user), Ptr user=null, Bool immediate=false); // create
  28. T1(TYPE) MenuElm& create(C Str &name, void (*func)(TYPE *user), TYPE *user , Bool immediate=false) {return create(name, (void (*)(Ptr))func, user, immediate);} // create
  29. T1(TYPE) MenuElm& create(C Str &name, void (*func)(TYPE &user), TYPE &user , Bool immediate=false) {return create(name, (void (*)(Ptr))func, &user, immediate);} // create
  30. #if EE_PRIVATE
  31. MenuElm& create(C MenuElm &src, Menu *parent); // create from 'src'
  32. #endif
  33. MenuElm& flag ( Byte flag ); Byte flag ()C {return _flag ;} // set/get MENU_FLAG
  34. MenuElm& kbsc (C KbSc &kbsc ); KbSc kbsc ()C {return _kbsc ;} // set/get keyboard shortcut
  35. MenuElm& kbsc2 (C KbSc &kbsc ); KbSc kbsc2()C {return _kbsc2;} // set/get keyboard shortcut (alternative)
  36. MenuElm& desc (C Str &desc ); C Str& desc ()C {return _desc ;} // set/get description
  37. MenuElm& setOn ( Bool on=true); // set if on
  38. MenuElm& display(C Str &name ); // set display name, this method makes effect only if 'name' is not empty
  39. Menu* menu ()C {return _menu ;} // get child menu
  40. MenuElm& func(void (*func)( ), Bool immediate=false); // set function called when 'MenuElm' is selected, with 'user' as its parameter, 'immediate'=if call the function immediately when a change occurs (this will happen inside object update function where you cannot delete any objects) if set to false then the function will get called after all objects finished updating (there you can delete objects)
  41. MenuElm& func(void (*func)(Ptr user), Ptr user=null, Bool immediate=false); // set function called when 'MenuElm' is selected, with 'user' as its parameter, 'immediate'=if call the function immediately when a change occurs (this will happen inside object update function where you cannot delete any objects) if set to false then the function will get called after all objects finished updating (there you can delete objects)
  42. T1(TYPE) MenuElm& func(void (*func)(TYPE *user), TYPE *user , Bool immediate=false) {return T.func((void(*)(Ptr))func, user, immediate);} // set function called when 'MenuElm' is selected, with 'user' as its parameter, 'immediate'=if call the function immediately when a change occurs (this will happen inside object update function where you cannot delete any objects) if set to false then the function will get called after all objects finished updating (there you can delete objects)
  43. T1(TYPE) MenuElm& func(void (*func)(TYPE &user), TYPE &user , Bool immediate=false) {return T.func((void(*)(Ptr))func, &user, immediate);} // set function called when 'MenuElm' is selected, with 'user' as its parameter, 'immediate'=if call the function immediately when a change occurs (this will happen inside object update function where you cannot delete any objects) if set to false then the function will get called after all objects finished updating (there you can delete objects)
  44. #if EE_PRIVATE
  45. Bool pushable();
  46. void push ();
  47. void zero ();
  48. void call ();
  49. #endif
  50. ~MenuElm() {del();}
  51. MenuElm();
  52. #if !EE_PRIVATE
  53. private:
  54. #endif
  55. Bool _func_immediate;
  56. Byte _flag;
  57. Ptr _func_user;
  58. void (*_func )( );
  59. void (*_func2)(Ptr user);
  60. Str _desc;
  61. KbSc _kbsc, _kbsc2;
  62. Menu *_menu;
  63. NO_COPY_CONSTRUCTOR(MenuElm);
  64. };
  65. /******************************************************************************/
  66. const_mem_addr STRUCT(Menu , GuiObj) // Gui Menu !! must be stored in constant memory address !!
  67. //{
  68. _List list; // list
  69. // manage
  70. Menu& del ( ); // delete
  71. Menu& create( ); // create empty
  72. Menu& create(C Node<MenuElm> &node) {return create().setData(node);} // create from node of MenuElm's
  73. Menu& create(C Menu &src ); // create from 'src'
  74. // get / set
  75. void operator()(C Str &command, Bool on, SET_MODE mode=SET_DEFAULT) ; // set 'command' 'on' state (checked), sample usage: ("View/Wireframe", true)
  76. Bool operator()(C Str &command )C; // if 'command' is on (checked), sample usage: ("View/Wireframe")
  77. Bool exists (C Str &command )C; // if 'command' exists in menu , sample usage: exists("File/Exit")
  78. Menu& func(void (*func)(C Str &path, Ptr user), Ptr user=null); // set function called when any sub-element is pushed, with 'user' as its parameter
  79. T1(TYPE) Menu& func(void (*func)(C Str &path, TYPE *user), TYPE *user ) {return T.func((void(*)(C Str&, Ptr))func, user);} // set function called when any sub-element is pushed, with 'user' as its parameter
  80. T1(TYPE) Menu& func(void (*func)(C Str &path, TYPE &user), TYPE &user ) {return T.func((void(*)(C Str&, Ptr))func, &user);} // set function called when any sub-element is pushed, with 'user' as its parameter
  81. Menu& setData(CChar8 *data[], Int elms, C MemPtr<Bool> &visible=null, Bool keep_cur=false); // set columns and data from text array
  82. Menu& setData(CChar *data[], Int elms, C MemPtr<Bool> &visible=null, Bool keep_cur=false); // set columns and data from text array
  83. Menu& setData(C Node<MenuElm> &node ); // set columns and data from node of menu elements
  84. Menu& setColumns(ListColumn *column, Int columns, Bool columns_hidden); // set list columns
  85. T1(TYPE) Menu& setData ( TYPE *data , Int elms , C MemPtr<Bool> &visible=null, Bool keep_cur=false) {list.setData(data, elms, visible, keep_cur); return T;} // set data from continuous memory
  86. T1(TYPE) Menu& setData ( Mems<TYPE> &mems , C MemPtr<Bool> &visible=null, Bool keep_cur=false) {list.setData(mems, visible, keep_cur); return T;} // set data from Mems
  87. Menu& setData (_Memc &memc , C MemPtr<Bool> &visible=null, Bool keep_cur=false) {list.setData(memc, visible, keep_cur); return T;} // set data from Memc
  88. Menu& setData (_Memb &memb , C MemPtr<Bool> &visible=null, Bool keep_cur=false) {list.setData(memb, visible, keep_cur); return T;} // set data from Memb
  89. Menu& setData (_Memx &memx , C MemPtr<Bool> &visible=null, Bool keep_cur=false) {list.setData(memx, visible, keep_cur); return T;} // set data from Memx
  90. Menu& setData (_Meml &meml , C MemPtr<Bool> &visible=null, Bool keep_cur=false) {list.setData(meml, visible, keep_cur); return T;} // set data from Meml
  91. Menu& setData (_Map &map , C MemPtr<Bool> &visible=null, Bool keep_cur=false) {list.setData(map , visible, keep_cur); return T;} // set data from Map
  92. Menu& clearElmSelectable( ); // clear per element selectable
  93. Menu& setElmSelectable(Bool &selectable); // set per element selectable, from list data elements member, for 'selectable' parameter 'MEMBER' macro usage is required
  94. Int elms( )C {return _elms.elms();} // get number of menu elements
  95. MenuElm& elm (Int i) {return _elms[i] ;} // get i-th menu element
  96. C MenuElm& elm (Int i)C {return _elms[i] ;} // get i-th menu element
  97. virtual Menu& rect (C Rect &rect ); C Rect& rect ()C {return super::rect ();} // set/get rectangle
  98. virtual Menu& pos (C Vec2 &pos ); Vec2 pos ()C {return super::pos ();} // set/get top left position
  99. virtual Menu& posRU (C Vec2 &pos ); Vec2 posRU()C {return super::posRU();} // set/get top right position
  100. virtual Menu& posLD (C Vec2 &pos ); Vec2 posLD()C {return super::posLD();} // set/get bottom left position
  101. virtual Menu& posL (C Vec2 &pos ); Vec2 posL ()C {return super::posL ();} // set/get left position
  102. virtual Menu& posR (C Vec2 &pos ); Vec2 posR ()C {return super::posR ();} // set/get right position
  103. virtual Menu& posD (C Vec2 &pos ); Vec2 posD ()C {return super::posD ();} // set/get bottom position
  104. virtual Menu& posU (C Vec2 &pos ); Vec2 posU ()C {return super::posU ();} // set/get top position
  105. virtual Menu& posC (C Vec2 &pos ); Vec2 posC ()C {return super::posC ();} // set/get center position
  106. virtual Menu& move (C Vec2 &delta); // move by delta
  107. virtual Menu& moveClamp(C Vec2 &delta); // move by delta and clamp to desktop area
  108. virtual Menu& show ( ); // show
  109. virtual Menu& posAround(C Rect &rect, Flt align=1); // set menu position around the 'rect' screen rectangle while trying to avoid occluding it, 'align'=horizontal alignment (-1 .. 1) specifying on which side (left or right) the menu should be located
  110. Menu& skin(C GuiSkinPtr &skin, Bool sub_objects=true); C GuiSkinPtr& skin()C {return _skin ;} // set/get skin override, default=null (if set to null then current value of 'Gui.skin' is used), 'sub_objects'=if additionally change the skin of the 'list' and sub-menus
  111. GuiSkin* getSkin()C {return _skin ? _skin() : Gui.skin();} // get actual skin
  112. Menu& setSize(Bool touch=false); // set element height and text size, 'touch'=if set for touch, making size bigger
  113. void checkKeyboardShortcuts(); // manually iterate all elements to check for their keyboard shortcuts and process them if pushed
  114. // main
  115. virtual GuiObj* test (C GuiPC &gpc, C Vec2 &pos, GuiObj* &mouse_wheel); // test if 'pos' screen position intersects with the object, by returning pointer to object or its children upon intersection and null in case no intersection, 'mouse_wheel' may be modified upon intersection either to the object or its children or null
  116. virtual void update(C GuiPC &gpc); // update object
  117. virtual void draw (C GuiPC &gpc); // draw object
  118. #if EE_PRIVATE
  119. Flt paddingL ()C {return _crect.min.x- _rect.min.x;}
  120. Flt paddingR ()C {return _rect.max.x-_crect.max.x;}
  121. Flt paddingT ()C {return _rect.max.y-_crect.max.y;}
  122. Flt paddingB ()C {return _crect.min.y- _rect.min.y;}
  123. C Rect& clientRect()C {return _crect;}
  124. Vec2 clientSize()C {return _crect.size();}
  125. void clientSize(C Vec2 &size);
  126. void zero ();
  127. GuiObj* Owner ()C {return _owner ? _owner : _parent;}
  128. ListColumn* listColumn();
  129. void push (C Str &elm);
  130. void hideAll ();
  131. #endif
  132. ~Menu() {del();}
  133. Menu();
  134. #if !EE_PRIVATE
  135. private:
  136. #endif
  137. Bool _no_child_draw;
  138. Int _selectable_offset;
  139. Rect _crect;
  140. GuiObj *_kb, *_owner;
  141. Mems<MenuElm> _elms;
  142. GuiSkinPtr _skin;
  143. Ptr _func_user;
  144. void (*_func)(C Str &path, Ptr user);
  145. protected:
  146. virtual GuiObj* owner()C;
  147. NO_COPY_CONSTRUCTOR(Menu);
  148. };
  149. /******************************************************************************/
  150. inline Node<MenuElm>& operator+=(Node<MenuElm> &node, C Str &name) {Node<MenuElm> &child=node.New(); child.create(name); return child;}
  151. inline Int Elms(C Menu &menu) {return Elms(menu.list);}
  152. /******************************************************************************/