Mercurial > dwindows
changeset 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 | 70046eea3e65 |
files | dw.hpp |
diffstat | 1 files changed, 76 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- a/dw.hpp Thu Dec 22 14:51:21 2022 +0000 +++ b/dw.hpp Thu Dec 22 18:10:43 2022 +0000 @@ -28,7 +28,7 @@ class Render; class Pixmap; class MenuItem; - +class Window; // Base handle class which allows opaque access to // The base system handles @@ -167,6 +167,9 @@ public: // User functions HMENUI GetHMENUI() { return menu; } + MenuItem *MenuItemNew(const char *title, unsigned long id, unsigned long flags, int end, int check, Menus *submenu); + MenuItem *MenuItemNew(const char *title, Menus *submenu); + MenuItem *MenuItemNew(const char *title); }; class Menu : public Menus @@ -175,22 +178,31 @@ // Constructors Menu(unsigned long id) { SetHMENUI(dw_menu_new(id)); } Menu() { SetHMENUI(dw_menu_new(0)); } + + // User functions + void Popup(Window *window, int x, int y); + void Popup(Window *window); }; - -class MenuBar : public Menus -{ -public: - // Constructors - MenuBar(HWND location) { SetHMENUI(dw_menubar_new(location)); } -}; - - + +class MenuBar : public Menus +{ +public: + // Constructors + MenuBar(HWND location) { SetHMENUI(dw_menubar_new(location)); } +}; + class MenuItem : public Clickable { public: // Constructors MenuItem(Menus *menu, const char *title, unsigned long id, unsigned long flags, int end, int check, Menus *submenu) { - SetHWND(dw_menu_append_item(menu->GetHMENUI(), title, id, flags, end, check, submenu ? submenu->GetHMENUI() : 0)); + SetHWND(dw_menu_append_item(menu->GetHMENUI(), title, id, flags, end, check, submenu ? submenu->GetHMENUI() : DW_NOMENU)); + } + MenuItem(Menus *menu, const char *title, Menus *submenu) { + SetHWND(dw_menu_append_item(menu->GetHMENUI(), title, DW_MENU_AUTO, 0, TRUE, FALSE, submenu)); + } + MenuItem(Menus *menu, const char *title) { + SetHWND(dw_menu_append_item(menu->GetHMENUI(), title, DW_MENU_AUTO, 0, TRUE, FALSE, DW_NOMENU)); } // User functions @@ -198,6 +210,18 @@ void SetStyle(unsigned long flags, unsigned long mask) { dw_window_set_style(hwnd, flags, mask); } }; +MenuItem *Menus::MenuItemNew(const char *title, unsigned long id, unsigned long flags, int end, int check, Menus *submenu) { + return new MenuItem((Menus *)menu, title, id, flags, end, check, submenu); +} + +MenuItem *Menus::MenuItemNew(const char *title, Menus *submenu) { + return new MenuItem((Menus *)menu, title, submenu); +} +MenuItem *Menus::MenuItemNew(const char *title) { + return new MenuItem((Menus *)menu, title); +} + + // Top-level window class is packable class Window : public Boxes { @@ -252,7 +276,24 @@ void Redraw() { dw_window_redraw(hwnd); } void Default(Widget *defaultitem) { if(defaultitem) dw_window_default(hwnd, defaultitem->GetHWND()); } void SetIcon(HICN icon) { dw_window_set_icon(hwnd, icon); } - MenuBar *MenuBarNew() { if(!menu) menu = new MenuBar(hwnd); return menu; } + Menus *MenuBarNew() { if(!menu) menu = new MenuBar(hwnd); return menu; } + void Popup(Menus *menu, int x, int y) { + if(menu) { + HMENUI pmenu = menu; + + dw_menu_popup(&pmenu, hwnd, x, y); + delete menu; + } + } + void Popup(Menus *menu) { if(menu) { + long x, y; + HMENUI pmenu = menu; + + dw_pointer_query_pos(&x, &y); + dw_menu_popup(&pmenu, hwnd, (int)x, (int)y); + delete menu; + } + } #ifdef DW_CPP11 void ConnectDelete(std::function<int()> userfunc) #else @@ -292,6 +333,29 @@ }; }; +void Menu::Popup(Window *window, int x, int y) +{ + if(window) + { + HMENUI pmenu = menu; + + dw_menu_popup(&pmenu, window->GetHWND(), x, y); + delete this; + } +} + +void Menu::Popup(Window *window) +{ + if(window) { + long x, y; + HMENUI pmenu = menu; + + dw_pointer_query_pos(&x, &y); + dw_menu_popup(&pmenu, window->GetHWND(), (int)x, (int)y); + delete this; + } +} + // Class for focusable widgets class Focusable : virtual public Widget {