mirror of
https://github.com/wailsapp/wails.git
synced 2025-05-04 08:00:50 +08:00
Partially introduce context menu changes back
This commit is contained in:
parent
0f7acd39fc
commit
1921862b53
@ -13,7 +13,8 @@ ContextMenu* NewContextMenu(JsonNode* menuData, ContextMenuStore *store) {
|
|||||||
result->menu = NewMenu(menuData);
|
result->menu = NewMenu(menuData);
|
||||||
result->nsmenu = NULL;
|
result->nsmenu = NULL;
|
||||||
result->menu->menuType = ContextMenuType;
|
result->menu->menuType = ContextMenuType;
|
||||||
result->menu->parentData = store;
|
result->menu->parentData = result;
|
||||||
|
result->contextMenuData = NULL;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -26,6 +27,11 @@ void DeleteContextMenu(ContextMenu* contextMenu) {
|
|||||||
// Free Menu
|
// Free Menu
|
||||||
DeleteMenu(contextMenu->menu);
|
DeleteMenu(contextMenu->menu);
|
||||||
|
|
||||||
|
// Delete any context menu data we may have stored
|
||||||
|
if( contextMenu->contextMenuData != NULL ) {
|
||||||
|
MEMFREE(contextMenu->contextMenuData);
|
||||||
|
}
|
||||||
|
|
||||||
// Free context menu
|
// Free context menu
|
||||||
free(contextMenu);
|
free(contextMenu);
|
||||||
}
|
}
|
||||||
@ -64,6 +70,7 @@ void ProcessContextMenus(ContextMenuStore* store) {
|
|||||||
}
|
}
|
||||||
// Create a new context menu instance
|
// Create a new context menu instance
|
||||||
ContextMenu *thisContextMenu = NewContextMenu(processedMenu, store);
|
ContextMenu *thisContextMenu = NewContextMenu(processedMenu, store);
|
||||||
|
thisContextMenu->ID = ID;
|
||||||
|
|
||||||
// Store the item in the context menu map
|
// Store the item in the context menu map
|
||||||
hashmap_put(&store->contextMenuStore, (char*)ID, strlen(ID), thisContextMenu);
|
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 ) {
|
if( contextMenu == NULL ) {
|
||||||
// Free context menu data
|
// Free context menu data
|
||||||
if( contextMenuData != NULL ) {}
|
if( contextMenuData != NULL ) {
|
||||||
MEMFREE(contextMenuData);
|
MEMFREE(contextMenuData);
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// We need to store the context menu data. Free existing data if we have it
|
// We need to store the context menu data. Free existing data if we have it
|
||||||
// and set to the new value.
|
// 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
|
// Grab the content view and show the menu
|
||||||
id contentView = msg(mainWindow, s("contentView"));
|
id contentView = msg(mainWindow, s("contentView"));
|
||||||
|
@ -13,6 +13,9 @@ typedef struct {
|
|||||||
const char* ID;
|
const char* ID;
|
||||||
id nsmenu;
|
id nsmenu;
|
||||||
Menu* menu;
|
Menu* menu;
|
||||||
|
|
||||||
|
// The optional data that may be passed with a context menu selection
|
||||||
|
const char* contextMenuData;
|
||||||
} ContextMenu;
|
} ContextMenu;
|
||||||
|
|
||||||
|
|
||||||
|
@ -9,7 +9,6 @@ ContextMenuStore* NewContextMenuStore(const char* contextMenusAsJSON) {
|
|||||||
// Init members
|
// Init members
|
||||||
result->contextMenusAsJSON = contextMenusAsJSON;
|
result->contextMenusAsJSON = contextMenusAsJSON;
|
||||||
result->processedContextMenus = NULL;
|
result->processedContextMenus = NULL;
|
||||||
result->contextMenuData = NULL;
|
|
||||||
|
|
||||||
// Allocate Context Menu Store
|
// Allocate Context Menu Store
|
||||||
if( 0 != hashmap_create((const unsigned)4, &result->contextMenuStore)) {
|
if( 0 != hashmap_create((const unsigned)4, &result->contextMenuStore)) {
|
||||||
@ -43,8 +42,4 @@ void DeleteContextMenuStore(ContextMenuStore* store) {
|
|||||||
store->processedContextMenus = NULL;
|
store->processedContextMenus = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Delete any context menu data we may have stored
|
|
||||||
if( store->contextMenuData != NULL ) {
|
|
||||||
MEMFREE(store->contextMenuData);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -15,9 +15,6 @@ typedef struct {
|
|||||||
// The raw JSON defining the context menus
|
// The raw JSON defining the context menus
|
||||||
const char* contextMenusAsJSON;
|
const char* contextMenusAsJSON;
|
||||||
|
|
||||||
// The optional data that may be passed with a context menu selection
|
|
||||||
const char* contextMenuData;
|
|
||||||
|
|
||||||
// The processed context menus
|
// The processed context menus
|
||||||
JsonNode* processedContextMenus;
|
JsonNode* processedContextMenus;
|
||||||
|
|
||||||
|
@ -88,13 +88,16 @@ void DeleteMenu(Menu *menu) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Creates a JSON message for the given menuItemID and data
|
// 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();
|
JsonNode *jsonObject = json_mkobject();
|
||||||
json_append_member(jsonObject, "menuItemID", json_mkstring(menuItemID));
|
json_append_member(jsonObject, "menuItemID", json_mkstring(menuItemID));
|
||||||
json_append_member(jsonObject, "menuType", json_mkstring(MenuTypeAsString[(int)menuType]));
|
json_append_member(jsonObject, "menuType", json_mkstring(MenuTypeAsString[(int)menuType]));
|
||||||
if (data != NULL) {
|
if (data != NULL) {
|
||||||
json_append_member(jsonObject, "data", json_mkstring(data));
|
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);
|
const char *payload = json_encode(jsonObject);
|
||||||
json_delete(jsonObject);
|
json_delete(jsonObject);
|
||||||
const char *result = concat("MC", payload);
|
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 *menuID = callbackData->menuID;
|
||||||
const char *data = NULL;
|
const char *data = NULL;
|
||||||
enum MenuType menuType = callbackData->menu->menuType;
|
enum MenuType menuType = callbackData->menu->menuType;
|
||||||
|
const char *parentID = NULL;
|
||||||
|
|
||||||
// Generate message to send to backend
|
// Generate message to send to backend
|
||||||
if( menuType == ContextMenuType ) {
|
if( menuType == ContextMenuType ) {
|
||||||
// Get the context menu data from the menu
|
// Get the context menu data from the menu
|
||||||
ContextMenuStore* store = (ContextMenuStore*) callbackData->menu->parentData;
|
ContextMenu* contextMenu = (ContextMenu*) callbackData->menu->parentData;
|
||||||
data = store->contextMenuData;
|
data = contextMenu->contextMenuData;
|
||||||
|
parentID = contextMenu->ID;
|
||||||
}
|
}
|
||||||
|
|
||||||
message = createMenuClickedMessage(menuID, data, menuType);
|
message = createMenuClickedMessage(menuID, data, menuType, parentID);
|
||||||
|
|
||||||
// TODO: Add other menu types here!
|
// TODO: Add other menu types here!
|
||||||
|
|
||||||
|
@ -65,7 +65,7 @@ MenuItemCallbackData* CreateMenuItemCallbackData(Menu *menu, id menuItem, const
|
|||||||
void DeleteMenu(Menu *menu);
|
void DeleteMenu(Menu *menu);
|
||||||
|
|
||||||
// Creates a JSON message for the given menuItemID and data
|
// 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
|
// Callback for text menu items
|
||||||
void menuItemCallback(id self, SEL cmd, id sender);
|
void menuItemCallback(id self, SEL cmd, id sender);
|
||||||
id processAcceleratorKey(const char *key);
|
id processAcceleratorKey(const char *key);
|
||||||
|
@ -9,6 +9,9 @@
|
|||||||
TrayMenu* NewTrayMenu(const char* menuJSON) {
|
TrayMenu* NewTrayMenu(const char* menuJSON) {
|
||||||
TrayMenu* result = malloc(sizeof(TrayMenu));
|
TrayMenu* result = malloc(sizeof(TrayMenu));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,15 +33,20 @@ func (m *Manager) getMenuItemByID(menuMap *MenuItemMap, menuId string) *menu.Men
|
|||||||
return menuMap.idToMenuItemMap[menuId]
|
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
|
var menuItemMap *MenuItemMap
|
||||||
|
|
||||||
switch menuType {
|
switch menuType {
|
||||||
case "ApplicationMenu":
|
case "ApplicationMenu":
|
||||||
menuItemMap = m.applicationMenuItemMap
|
menuItemMap = m.applicationMenuItemMap
|
||||||
//case "ContextMenu":
|
case "ContextMenu":
|
||||||
// // TBD
|
// TBD
|
||||||
|
contextMenu := m.contextMenus[parentID]
|
||||||
|
if contextMenu == nil {
|
||||||
|
return fmt.Errorf("unknown context menu: %s", parentID)
|
||||||
|
}
|
||||||
|
menuItemMap = contextMenu.menuItemMap
|
||||||
//case "TrayMenu":
|
//case "TrayMenu":
|
||||||
// // TBD
|
// // TBD
|
||||||
default:
|
default:
|
||||||
|
@ -2,11 +2,13 @@ package runtime
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/wailsapp/wails/v2/internal/servicebus"
|
"github.com/wailsapp/wails/v2/internal/servicebus"
|
||||||
|
"github.com/wailsapp/wails/v2/pkg/menu"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Menu defines all Menu related operations
|
// Menu defines all Menu related operations
|
||||||
type Menu interface {
|
type Menu interface {
|
||||||
UpdateApplicationMenu()
|
UpdateApplicationMenu()
|
||||||
|
UpdateContextMenu(contextMenu *menu.ContextMenu)
|
||||||
}
|
}
|
||||||
|
|
||||||
type menuRuntime struct {
|
type menuRuntime struct {
|
||||||
@ -23,3 +25,7 @@ func newMenu(bus *servicebus.ServiceBus) Menu {
|
|||||||
func (m *menuRuntime) UpdateApplicationMenu() {
|
func (m *menuRuntime) UpdateApplicationMenu() {
|
||||||
m.bus.Publish("menu:updateappmenu", nil)
|
m.bus.Publish("menu:updateappmenu", nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *menuRuntime) UpdateContextMenu(contextMenu *menu.ContextMenu) {
|
||||||
|
m.bus.Publish("menu:updatecontextmenu", contextMenu)
|
||||||
|
}
|
||||||
|
@ -2,10 +2,11 @@ package subsystem
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/wailsapp/wails/v2/internal/logger"
|
"github.com/wailsapp/wails/v2/internal/logger"
|
||||||
"github.com/wailsapp/wails/v2/internal/menumanager"
|
"github.com/wailsapp/wails/v2/internal/menumanager"
|
||||||
"github.com/wailsapp/wails/v2/internal/servicebus"
|
"github.com/wailsapp/wails/v2/internal/servicebus"
|
||||||
"strings"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// Menu is the subsystem that handles the operation of menus. It manages all service bus messages
|
// 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"`
|
MenuItemID string `json:"menuItemID"`
|
||||||
MenuType string `json:"menuType"`
|
MenuType string `json:"menuType"`
|
||||||
Data string `json:"data"`
|
Data string `json:"data"`
|
||||||
|
ParentID string `json:"parentID"`
|
||||||
}
|
}
|
||||||
|
|
||||||
var callbackData ClickCallbackMessage
|
var callbackData ClickCallbackMessage
|
||||||
@ -90,7 +92,7 @@ func (m *Menu) Start() error {
|
|||||||
return
|
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 {
|
if err != nil {
|
||||||
m.logger.Trace("%s", err.Error())
|
m.logger.Trace("%s", err.Error())
|
||||||
}
|
}
|
||||||
@ -106,6 +108,18 @@ func (m *Menu) Start() error {
|
|||||||
// Notify frontend of menu change
|
// Notify frontend of menu change
|
||||||
m.bus.Publish("menufrontend:updateappmenu", updatedMenu)
|
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:
|
default:
|
||||||
m.logger.Error("unknown menu message: %+v", menuMessage)
|
m.logger.Error("unknown menu message: %+v", menuMessage)
|
||||||
}
|
}
|
||||||
|
@ -36,3 +36,15 @@ func (c *ContextMenus) RemoveByID(id string) bool {
|
|||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ContextMenu struct {
|
||||||
|
ID string
|
||||||
|
Menu *Menu
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewContextMenu(ID string, menu *Menu) *ContextMenu {
|
||||||
|
return &ContextMenu{
|
||||||
|
ID: ID,
|
||||||
|
Menu: menu,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"github.com/wailsapp/wails/v2"
|
"github.com/wailsapp/wails/v2"
|
||||||
@ -20,15 +19,6 @@ func (c *ContextMenu) WailsInit(runtime *wails.Runtime) error {
|
|||||||
// Perform your setup here
|
// Perform your setup here
|
||||||
c.runtime = runtime
|
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
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user