comparison dw.hpp @ 2885:df1b7f7d1703

C++: Finish up the menu classes, not sure if this is ideal yet.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Thu, 22 Dec 2022 18:10:43 +0000
parents 06e475feaac0
children 4b075e64536c
comparison
equal deleted inserted replaced
2884:06e475feaac0 2885:df1b7f7d1703
26 26
27 // Forward declare these so they can be referenced 27 // Forward declare these so they can be referenced
28 class Render; 28 class Render;
29 class Pixmap; 29 class Pixmap;
30 class MenuItem; 30 class MenuItem;
31 31 class Window;
32 32
33 // Base handle class which allows opaque access to 33 // Base handle class which allows opaque access to
34 // The base system handles 34 // The base system handles
35 class Handle 35 class Handle
36 { 36 {
165 } 165 }
166 HMENUI menu; 166 HMENUI menu;
167 public: 167 public:
168 // User functions 168 // User functions
169 HMENUI GetHMENUI() { return menu; } 169 HMENUI GetHMENUI() { return menu; }
170 MenuItem *MenuItemNew(const char *title, unsigned long id, unsigned long flags, int end, int check, Menus *submenu);
171 MenuItem *MenuItemNew(const char *title, Menus *submenu);
172 MenuItem *MenuItemNew(const char *title);
170 }; 173 };
171 174
172 class Menu : public Menus 175 class Menu : public Menus
173 { 176 {
174 public: 177 public:
175 // Constructors 178 // Constructors
176 Menu(unsigned long id) { SetHMENUI(dw_menu_new(id)); } 179 Menu(unsigned long id) { SetHMENUI(dw_menu_new(id)); }
177 Menu() { SetHMENUI(dw_menu_new(0)); } 180 Menu() { SetHMENUI(dw_menu_new(0)); }
181
182 // User functions
183 void Popup(Window *window, int x, int y);
184 void Popup(Window *window);
178 }; 185 };
179 186
180 class MenuBar : public Menus 187 class MenuBar : public Menus
181 { 188 {
182 public: 189 public:
183 // Constructors 190 // Constructors
184 MenuBar(HWND location) { SetHMENUI(dw_menubar_new(location)); } 191 MenuBar(HWND location) { SetHMENUI(dw_menubar_new(location)); }
185 }; 192 };
186 193
187
188 class MenuItem : public Clickable 194 class MenuItem : public Clickable
189 { 195 {
190 public: 196 public:
191 // Constructors 197 // Constructors
192 MenuItem(Menus *menu, const char *title, unsigned long id, unsigned long flags, int end, int check, Menus *submenu) { 198 MenuItem(Menus *menu, const char *title, unsigned long id, unsigned long flags, int end, int check, Menus *submenu) {
193 SetHWND(dw_menu_append_item(menu->GetHMENUI(), title, id, flags, end, check, submenu ? submenu->GetHMENUI() : 0)); 199 SetHWND(dw_menu_append_item(menu->GetHMENUI(), title, id, flags, end, check, submenu ? submenu->GetHMENUI() : DW_NOMENU));
200 }
201 MenuItem(Menus *menu, const char *title, Menus *submenu) {
202 SetHWND(dw_menu_append_item(menu->GetHMENUI(), title, DW_MENU_AUTO, 0, TRUE, FALSE, submenu));
203 }
204 MenuItem(Menus *menu, const char *title) {
205 SetHWND(dw_menu_append_item(menu->GetHMENUI(), title, DW_MENU_AUTO, 0, TRUE, FALSE, DW_NOMENU));
194 } 206 }
195 207
196 // User functions 208 // User functions
197 void SetState(unsigned long flags) { dw_window_set_style(hwnd, flags, flags); } 209 void SetState(unsigned long flags) { dw_window_set_style(hwnd, flags, flags); }
198 void SetStyle(unsigned long flags, unsigned long mask) { dw_window_set_style(hwnd, flags, mask); } 210 void SetStyle(unsigned long flags, unsigned long mask) { dw_window_set_style(hwnd, flags, mask); }
199 }; 211 };
212
213 MenuItem *Menus::MenuItemNew(const char *title, unsigned long id, unsigned long flags, int end, int check, Menus *submenu) {
214 return new MenuItem((Menus *)menu, title, id, flags, end, check, submenu);
215 }
216
217 MenuItem *Menus::MenuItemNew(const char *title, Menus *submenu) {
218 return new MenuItem((Menus *)menu, title, submenu);
219 }
220 MenuItem *Menus::MenuItemNew(const char *title) {
221 return new MenuItem((Menus *)menu, title);
222 }
223
200 224
201 // Top-level window class is packable 225 // Top-level window class is packable
202 class Window : public Boxes 226 class Window : public Boxes
203 { 227 {
204 private: 228 private:
250 int Raise() { return dw_window_raise(hwnd); } 274 int Raise() { return dw_window_raise(hwnd); }
251 int Lower() { return dw_window_lower(hwnd); } 275 int Lower() { return dw_window_lower(hwnd); }
252 void Redraw() { dw_window_redraw(hwnd); } 276 void Redraw() { dw_window_redraw(hwnd); }
253 void Default(Widget *defaultitem) { if(defaultitem) dw_window_default(hwnd, defaultitem->GetHWND()); } 277 void Default(Widget *defaultitem) { if(defaultitem) dw_window_default(hwnd, defaultitem->GetHWND()); }
254 void SetIcon(HICN icon) { dw_window_set_icon(hwnd, icon); } 278 void SetIcon(HICN icon) { dw_window_set_icon(hwnd, icon); }
255 MenuBar *MenuBarNew() { if(!menu) menu = new MenuBar(hwnd); return menu; } 279 Menus *MenuBarNew() { if(!menu) menu = new MenuBar(hwnd); return menu; }
280 void Popup(Menus *menu, int x, int y) {
281 if(menu) {
282 HMENUI pmenu = menu;
283
284 dw_menu_popup(&pmenu, hwnd, x, y);
285 delete menu;
286 }
287 }
288 void Popup(Menus *menu) { if(menu) {
289 long x, y;
290 HMENUI pmenu = menu;
291
292 dw_pointer_query_pos(&x, &y);
293 dw_menu_popup(&pmenu, hwnd, (int)x, (int)y);
294 delete menu;
295 }
296 }
256 #ifdef DW_CPP11 297 #ifdef DW_CPP11
257 void ConnectDelete(std::function<int()> userfunc) 298 void ConnectDelete(std::function<int()> userfunc)
258 #else 299 #else
259 void ConnectDelete(int (*userfunc)()) 300 void ConnectDelete(int (*userfunc)())
260 #endif 301 #endif
289 dw_signal_disconnect_by_name(hwnd, DW_SIGNAL_CONFIGURE); 330 dw_signal_disconnect_by_name(hwnd, DW_SIGNAL_CONFIGURE);
290 ConfigureConnected = false; 331 ConfigureConnected = false;
291 return FALSE; 332 return FALSE;
292 }; 333 };
293 }; 334 };
335
336 void Menu::Popup(Window *window, int x, int y)
337 {
338 if(window)
339 {
340 HMENUI pmenu = menu;
341
342 dw_menu_popup(&pmenu, window->GetHWND(), x, y);
343 delete this;
344 }
345 }
346
347 void Menu::Popup(Window *window)
348 {
349 if(window) {
350 long x, y;
351 HMENUI pmenu = menu;
352
353 dw_pointer_query_pos(&x, &y);
354 dw_menu_popup(&pmenu, window->GetHWND(), (int)x, (int)y);
355 delete this;
356 }
357 }
294 358
295 // Class for focusable widgets 359 // Class for focusable widgets
296 class Focusable : virtual public Widget 360 class Focusable : virtual public Widget
297 { 361 {
298 public: 362 public: