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
 {