diff --git a/v2/internal/ffenestri/menu_darwin.h b/v2/internal/ffenestri/menu_darwin.h index 41d414f6e..645521d86 100644 --- a/v2/internal/ffenestri/menu_darwin.h +++ b/v2/internal/ffenestri/menu_darwin.h @@ -133,10 +133,12 @@ void DeleteMenu(Menu *menu) { } // Creates a JSON message for the given menuItemID and data -const char* createContextMenuMessage(const char *menuItemID, const char *givenContextMenuData) { +const char* createMenuClickedMessage(const char *menuItemID, const char *data) { JsonNode *jsonObject = json_mkobject(); json_append_member(jsonObject, "menuItemID", json_mkstring(menuItemID)); - json_append_member(jsonObject, "data", json_mkstring(givenContextMenuData)); + if (data != NULL) { + json_append_member(jsonObject, "data", json_mkstring(data)); + } const char *result = json_encode(jsonObject); json_delete(jsonObject); return result; @@ -177,12 +179,15 @@ void menuItemCallback(id self, SEL cmd, id sender) { // Generate message to send to backend if( callbackData->menu->menuType == ApplicationMenuType ) { - message = concat("MC", callbackData->menuID); + const char *clickMessage = createMenuClickedMessage(callbackData->menuID, NULL); + message = concat("MC", clickMessage); + MEMFREE(clickMessage); } else if( callbackData->menu->menuType == ContextMenuType ) { // Get the context menu data from the menu ContextMenuStore* store = (ContextMenuStore*) callbackData->menu->parentData; - const char *contextMenuMessage = createContextMenuMessage(callbackData->menuID, store->contextMenuData); - message = concat("XC", contextMenuMessage); + const char *clickMessage = createMenuClickedMessage(callbackData->menuID, store->contextMenuData); + message = concat("XC", clickMessage); + MEMFREE(clickMessage); } // TODO: Add other menu types here! diff --git a/v2/internal/menumanager/menumanager.go b/v2/internal/menumanager/menumanager.go index b9b372e3b..ce5c2409c 100644 --- a/v2/internal/menumanager/menumanager.go +++ b/v2/internal/menumanager/menumanager.go @@ -50,7 +50,7 @@ func (m *Manager) getMenuItemByID(menuId string) *menu.MenuItem { return m.menuItemMap.idToMenuItemMap[menuId] } -func (m *Manager) ProcessClick(menuID string) error { +func (m *Manager) ProcessClick(menuID string, data string) error { // Get the menu item menuItem := m.getMenuItemByID(menuID) @@ -72,7 +72,7 @@ func (m *Manager) ProcessClick(menuID string) error { // Create new Callback struct callbackData := &menu.CallbackData{ MenuItem: menuItem, - ContextData: "", + ContextData: data, } // Call back! diff --git a/v2/internal/subsystem/menu.go b/v2/internal/subsystem/menu.go index da37dbe20..6087f7666 100644 --- a/v2/internal/subsystem/menu.go +++ b/v2/internal/subsystem/menu.go @@ -1,6 +1,7 @@ package subsystem import ( + "encoding/json" "github.com/wailsapp/wails/v2/internal/menumanager" "strings" "sync" @@ -95,9 +96,21 @@ func (m *Menu) Start() error { continue } m.logger.Trace("Got Menu clicked Message: %s %+v", menuMessage.Topic(), menuMessage.Data()) - menuid := menuMessage.Data().(string) - err := m.menuManager.ProcessClick(menuid) + type ClickCallbackMessage struct { + MenuItemID string `json:"menuItemID"` + Data string `json:"data"` + } + + var callbackData ClickCallbackMessage + message := []byte(menuMessage.Data().(string)) + err := json.Unmarshal(message, &callbackData) + if err != nil { + m.logger.Error("%s", err.Error()) + return + } + + err = m.menuManager.ProcessClick(callbackData.MenuItemID, callbackData.Data) if err != nil { m.logger.Trace("%s", err.Error()) } diff --git a/v2/test/kitchensink/contextmenus.go b/v2/test/kitchensink/contextmenus.go index a6212e05a..0fd12ddd8 100644 --- a/v2/test/kitchensink/contextmenus.go +++ b/v2/test/kitchensink/contextmenus.go @@ -34,18 +34,18 @@ func (c *ContextMenu) WailsInit(runtime *wails.Runtime) error { func createContextMenus() *menu.ContextMenus { result := menu.NewContextMenus() - result.AddMenu("test", menu.NewMenuFromItems( - menu.Text("Clicked 0 times", "Test Context Menu", nil), - menu.Separator(), - menu.Checkbox("I am a checkbox", "checkbox", false, nil), - menu.Separator(), - menu.Radio("Radio Option 1", "Radio Option 1", true, nil), - menu.Radio("Radio Option 2", "Radio Option 2", false, nil), - menu.Radio("Radio Option 3", "Radio Option 3", false, nil), - menu.Separator(), - menu.SubMenu("A Submenu", menu.NewMenuFromItems( - menu.Text("Hello", "Hello", nil), - )), - )) + //result.AddMenu("test", menu.NewMenuFromItems( + // menu.Text("Clicked 0 times", "Test Context Menu", nil), + // menu.Separator(), + // menu.Checkbox("I am a checkbox", "checkbox", false, nil), + // menu.Separator(), + // menu.Radio("Radio Option 1", "Radio Option 1", true, nil), + // menu.Radio("Radio Option 2", "Radio Option 2", false, nil), + // menu.Radio("Radio Option 3", "Radio Option 3", false, nil), + // menu.Separator(), + // menu.SubMenu("A Submenu", menu.NewMenuFromItems( + // menu.Text("Hello", "Hello", nil), + // )), + //)) return result } diff --git a/v2/test/kitchensink/menu.go b/v2/test/kitchensink/menu.go index 709a584bb..a86a26e43 100644 --- a/v2/test/kitchensink/menu.go +++ b/v2/test/kitchensink/menu.go @@ -225,7 +225,8 @@ func (m *Menu) insertAfterRandom(_ *menu.MenuItem) { } func (m *Menu) processPlainText(callbackData *menu.CallbackData) { - println("\n\n\n\n\n\n\nCallback successful\n\n\n\n\n") + label := callbackData.MenuItem.Label + fmt.Printf("\n\n\n\n\n\n\nMenu Item label = `%s`\n\n\n\n\n", label) } func (m *Menu) createApplicationMenu() *menu.Menu {