Mercurial > dwindows
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: |