5
0
mirror of https://github.com/wailsapp/wails.git synced 2025-05-03 18:00:02 +08:00

Partially introduce context menu changes back

This commit is contained in:
Lea Anthony 2021-01-12 21:20:08 +11:00
parent 0f7acd39fc
commit 1921862b53
No known key found for this signature in database
GPG Key ID: 33DAF7BB90A58405
12 changed files with 71 additions and 33 deletions

View File

@ -13,7 +13,8 @@ ContextMenu* NewContextMenu(JsonNode* menuData, ContextMenuStore *store) {
result->menu = NewMenu(menuData);
result->nsmenu = NULL;
result->menu->menuType = ContextMenuType;
result->menu->parentData = store;
result->menu->parentData = result;
result->contextMenuData = NULL;
return result;
}
@ -26,6 +27,11 @@ void DeleteContextMenu(ContextMenu* contextMenu) {
// Free Menu
DeleteMenu(contextMenu->menu);
// Delete any context menu data we may have stored
if( contextMenu->contextMenuData != NULL ) {
MEMFREE(contextMenu->contextMenuData);
}
// Free context menu
free(contextMenu);
}
@ -64,6 +70,7 @@ void ProcessContextMenus(ContextMenuStore* store) {
}
// Create a new context menu instance
ContextMenu *thisContextMenu = NewContextMenu(processedMenu, store);
thisContextMenu->ID = ID;
// Store the item in the context menu map
hashmap_put(&store->contextMenuStore, (char*)ID, strlen(ID), thisContextMenu);
@ -85,14 +92,15 @@ void ShowContextMenu(ContextMenuStore* store, id mainWindow, const char *context
if( contextMenu == NULL ) {
// Free context menu data
if( contextMenuData != NULL ) {}
MEMFREE(contextMenuData);
return;
if( contextMenuData != NULL ) {
MEMFREE(contextMenuData);
return;
}
}
// We need to store the context menu data. Free existing data if we have it
// and set to the new value.
FREE_AND_SET(store->contextMenuData, contextMenuData);
FREE_AND_SET(contextMenu->contextMenuData, contextMenuData);
// Grab the content view and show the menu
id contentView = msg(mainWindow, s("contentView"));

View File

@ -13,6 +13,9 @@ typedef struct {
const char* ID;
id nsmenu;
Menu* menu;
// The optional data that may be passed with a context menu selection
const char* contextMenuData;
} ContextMenu;

View File

@ -9,7 +9,6 @@ ContextMenuStore* NewContextMenuStore(const char* contextMenusAsJSON) {
// Init members
result->contextMenusAsJSON = contextMenusAsJSON;
result->processedContextMenus = NULL;
result->contextMenuData = NULL;
// Allocate Context Menu Store
if( 0 != hashmap_create((const unsigned)4, &result->contextMenuStore)) {
@ -43,8 +42,4 @@ void DeleteContextMenuStore(ContextMenuStore* store) {
store->processedContextMenus = NULL;
}
// Delete any context menu data we may have stored
if( store->contextMenuData != NULL ) {
MEMFREE(store->contextMenuData);
}
}

View File

@ -15,9 +15,6 @@ typedef struct {
// The raw JSON defining the context menus
const char* contextMenusAsJSON;
// The optional data that may be passed with a context menu selection
const char* contextMenuData;
// The processed context menus
JsonNode* processedContextMenus;

View File

@ -88,13 +88,16 @@ void DeleteMenu(Menu *menu) {
}
// Creates a JSON message for the given menuItemID and data
const char* createMenuClickedMessage(const char *menuItemID, const char *data, enum MenuType menuType) {
const char* createMenuClickedMessage(const char *menuItemID, const char *data, enum MenuType menuType, const char *parentID) {
JsonNode *jsonObject = json_mkobject();
json_append_member(jsonObject, "menuItemID", json_mkstring(menuItemID));
json_append_member(jsonObject, "menuType", json_mkstring(MenuTypeAsString[(int)menuType]));
if (data != NULL) {
json_append_member(jsonObject, "data", json_mkstring(data));
}
if (parentID != NULL) {
json_append_member(jsonObject, "parentID", json_mkstring(parentID));
}
const char *payload = json_encode(jsonObject);
json_delete(jsonObject);
const char *result = concat("MC", payload);
@ -138,15 +141,17 @@ void menuItemCallback(id self, SEL cmd, id sender) {
const char *menuID = callbackData->menuID;
const char *data = NULL;
enum MenuType menuType = callbackData->menu->menuType;
const char *parentID = NULL;
// Generate message to send to backend
if( menuType == ContextMenuType ) {
// Get the context menu data from the menu
ContextMenuStore* store = (ContextMenuStore*) callbackData->menu->parentData;
data = store->contextMenuData;
ContextMenu* contextMenu = (ContextMenu*) callbackData->menu->parentData;
data = contextMenu->contextMenuData;
parentID = contextMenu->ID;
}
message = createMenuClickedMessage(menuID, data, menuType);
message = createMenuClickedMessage(menuID, data, menuType, parentID);
// TODO: Add other menu types here!

View File

@ -65,7 +65,7 @@ MenuItemCallbackData* CreateMenuItemCallbackData(Menu *menu, id menuItem, const
void DeleteMenu(Menu *menu);
// Creates a JSON message for the given menuItemID and data
const char* createMenuClickedMessage(const char *menuItemID, const char *data, enum MenuType menuType);
const char* createMenuClickedMessage(const char *menuItemID, const char *data, enum MenuType menuType, const char *parentID);
// Callback for text menu items
void menuItemCallback(id self, SEL cmd, id sender);
id processAcceleratorKey(const char *key);

View File

@ -9,6 +9,9 @@
TrayMenu* NewTrayMenu(const char* menuJSON) {
TrayMenu* result = malloc(sizeof(TrayMenu));
return result;
}

View File

@ -33,15 +33,20 @@ func (m *Manager) getMenuItemByID(menuMap *MenuItemMap, menuId string) *menu.Men
return menuMap.idToMenuItemMap[menuId]
}
func (m *Manager) ProcessClick(menuID string, data string, menuType string) error {
func (m *Manager) ProcessClick(menuID string, data string, menuType string, parentID string) error {
var menuItemMap *MenuItemMap
switch menuType {
case "ApplicationMenu":
menuItemMap = m.applicationMenuItemMap
//case "ContextMenu":
// // TBD
case "ContextMenu":
// TBD
contextMenu := m.contextMenus[parentID]
if contextMenu == nil {
return fmt.Errorf("unknown context menu: %s", parentID)
}
menuItemMap = contextMenu.menuItemMap
//case "TrayMenu":
// // TBD
default:

View File

@ -2,11 +2,13 @@ package runtime
import (
"github.com/wailsapp/wails/v2/internal/servicebus"
"github.com/wailsapp/wails/v2/pkg/menu"
)
// Menu defines all Menu related operations
type Menu interface {
UpdateApplicationMenu()
UpdateContextMenu(contextMenu *menu.ContextMenu)
}
type menuRuntime struct {
@ -23,3 +25,7 @@ func newMenu(bus *servicebus.ServiceBus) Menu {
func (m *menuRuntime) UpdateApplicationMenu() {
m.bus.Publish("menu:updateappmenu", nil)
}
func (m *menuRuntime) UpdateContextMenu(contextMenu *menu.ContextMenu) {
m.bus.Publish("menu:updatecontextmenu", contextMenu)
}

View File

@ -2,10 +2,11 @@ package subsystem
import (
"encoding/json"
"strings"
"github.com/wailsapp/wails/v2/internal/logger"
"github.com/wailsapp/wails/v2/internal/menumanager"
"github.com/wailsapp/wails/v2/internal/servicebus"
"strings"
)
// Menu is the subsystem that handles the operation of menus. It manages all service bus messages
@ -80,6 +81,7 @@ func (m *Menu) Start() error {
MenuItemID string `json:"menuItemID"`
MenuType string `json:"menuType"`
Data string `json:"data"`
ParentID string `json:"parentID"`
}
var callbackData ClickCallbackMessage
@ -90,7 +92,7 @@ func (m *Menu) Start() error {
return
}
err = m.menuManager.ProcessClick(callbackData.MenuItemID, callbackData.Data, callbackData.MenuType)
err = m.menuManager.ProcessClick(callbackData.MenuItemID, callbackData.Data, callbackData.MenuType, callbackData.ParentID)
if err != nil {
m.logger.Trace("%s", err.Error())
}
@ -106,6 +108,18 @@ func (m *Menu) Start() error {
// Notify frontend of menu change
m.bus.Publish("menufrontend:updateappmenu", updatedMenu)
case "updatecontextmenu":
m.logger.Info("Update Context Menu TBD")
//contextMenu := menuMessage.Data().(*menu.ContextMenu)
//updatedMenu, err := m.menuManager.UpdateContextMenu(contextMenu)
//if err != nil {
// m.logger.Trace("%s", err.Error())
// return
//}
//
//// Notify frontend of menu change
//m.bus.Publish("menufrontend:updatecontextmenu", updatedMenu)
default:
m.logger.Error("unknown menu message: %+v", menuMessage)
}

View File

@ -36,3 +36,15 @@ func (c *ContextMenus) RemoveByID(id string) bool {
}
return false
}
type ContextMenu struct {
ID string
Menu *Menu
}
func NewContextMenu(ID string, menu *Menu) *ContextMenu {
return &ContextMenu{
ID: ID,
Menu: menu,
}
}

View File

@ -1,7 +1,6 @@
package main
import (
"fmt"
"sync"
"github.com/wailsapp/wails/v2"
@ -20,15 +19,6 @@ func (c *ContextMenu) WailsInit(runtime *wails.Runtime) error {
// Perform your setup here
c.runtime = runtime
// Setup Menu Listeners
c.runtime.ContextMenu.On("Test Context Menu", func(mi *menu.MenuItem, contextData string) {
c.lock.Lock()
c.counter++
mi.Label = fmt.Sprintf("Clicked %d times", c.counter)
c.lock.Unlock()
c.runtime.ContextMenu.Update()
})
return nil
}