From d8ad250608b32591b53f887dd8372dc8c42b2495 Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Fri, 19 Feb 2021 05:25:23 +1100 Subject: [PATCH] Template Image support --- v2/internal/ffenestri/menu_darwin.c | 10 +++++-- v2/internal/ffenestri/menu_darwin.h | 2 +- v2/internal/menumanager/processedMenu.go | 33 +++++++++++++----------- v2/pkg/menu/menuitem.go | 6 ++++- 4 files changed, 32 insertions(+), 19 deletions(-) diff --git a/v2/internal/ffenestri/menu_darwin.c b/v2/internal/ffenestri/menu_darwin.c index f0bf299b..186d6d1a 100644 --- a/v2/internal/ffenestri/menu_darwin.c +++ b/v2/internal/ffenestri/menu_darwin.c @@ -575,7 +575,7 @@ id processCheckboxMenuItem(Menu *menu, id parentmenu, const char *title, const c return item; } -id processTextMenuItem(Menu *menu, id parentMenu, const char *title, const char *menuid, bool disabled, const char *acceleratorkey, const char **modifiers, const char* tooltip, const char* image, const char* fontName, int fontSize, const char* RGBA) { +id processTextMenuItem(Menu *menu, id parentMenu, const char *title, const char *menuid, bool disabled, const char *acceleratorkey, const char **modifiers, const char* tooltip, const char* image, const char* fontName, int fontSize, const char* RGBA, bool templateImage) { id item = ALLOC("NSMenuItem"); // Create a MenuItemCallbackData @@ -598,6 +598,9 @@ id processTextMenuItem(Menu *menu, id parentMenu, const char *title, const char id imageData = msg(data, s("initWithBase64EncodedString:options:"), str(image), 0); id nsimage = ALLOC("NSImage"); msg(nsimage, s("initWithData:"), imageData); + if( templateImage ) { + msg(nsimage, s("template"), YES); + } msg(item, s("setImage:"), nsimage); } @@ -740,6 +743,9 @@ void processMenuItem(Menu *menu, id parentMenu, JsonNode *item) { const char *image = getJSONString(item, "Image"); const char *fontName = getJSONString(item, "FontName"); const char *RGBA = getJSONString(item, "RGBA"); + bool templateImage = false; + getJSONBool(item, "MacTemplateImage", &templateImage); + int fontSize = 12; getJSONInt(item, "FontSize", &fontSize); @@ -775,7 +781,7 @@ void processMenuItem(Menu *menu, id parentMenu, JsonNode *item) { if( type != NULL ) { if( STREQ(type->string_, "Text")) { - processTextMenuItem(menu, parentMenu, label, menuid, disabled, acceleratorkey, modifiers, tooltip, image, fontName, fontSize, RGBA); + processTextMenuItem(menu, parentMenu, label, menuid, disabled, acceleratorkey, modifiers, tooltip, image, fontName, fontSize, RGBA, templateImage); } else if ( STREQ(type->string_, "Separator")) { addSeparator(parentMenu); diff --git a/v2/internal/ffenestri/menu_darwin.h b/v2/internal/ffenestri/menu_darwin.h index 3635f49c..152fde81 100644 --- a/v2/internal/ffenestri/menu_darwin.h +++ b/v2/internal/ffenestri/menu_darwin.h @@ -105,7 +105,7 @@ id processRadioMenuItem(Menu *menu, id parentmenu, const char *title, const char id processCheckboxMenuItem(Menu *menu, id parentmenu, const char *title, const char *menuid, bool disabled, bool checked, const char *key); -id processTextMenuItem(Menu *menu, id parentMenu, const char *title, const char *menuid, bool disabled, const char *acceleratorkey, const char **modifiers, const char* tooltip, const char* image, const char* fontName, int fontSize, const char* RGBA); +id processTextMenuItem(Menu *menu, id parentMenu, const char *title, const char *menuid, bool disabled, const char *acceleratorkey, const char **modifiers, const char* tooltip, const char* image, const char* fontName, int fontSize, const char* RGBA, bool templateImage); void processMenuItem(Menu *menu, id parentMenu, JsonNode *item); void processMenuData(Menu *menu, JsonNode *menuData); diff --git a/v2/internal/menumanager/processedMenu.go b/v2/internal/menumanager/processedMenu.go index 91089f28..55a8aa20 100644 --- a/v2/internal/menumanager/processedMenu.go +++ b/v2/internal/menumanager/processedMenu.go @@ -2,6 +2,7 @@ package menumanager import ( "encoding/json" + "github.com/wailsapp/wails/v2/pkg/menu" "github.com/wailsapp/wails/v2/pkg/menu/keys" ) @@ -34,7 +35,8 @@ type ProcessedMenuItem struct { FontName string `json:",omitempty"` // Image - base64 image data - Image string `json:",omitempty"` + Image string `json:",omitempty"` + MacTemplateImage bool `json:", omitempty"` // Tooltip Tooltip string `json:",omitempty"` @@ -44,20 +46,21 @@ func NewProcessedMenuItem(menuItemMap *MenuItemMap, menuItem *menu.MenuItem) *Pr ID := menuItemMap.menuItemToIDMap[menuItem] result := &ProcessedMenuItem{ - ID: ID, - Label: menuItem.Label, - Role: menuItem.Role, - Accelerator: menuItem.Accelerator, - Type: menuItem.Type, - Disabled: menuItem.Disabled, - Hidden: menuItem.Hidden, - Checked: menuItem.Checked, - SubMenu: nil, - RGBA: menuItem.RGBA, - FontSize: menuItem.FontSize, - FontName: menuItem.FontName, - Image: menuItem.Image, - Tooltip: menuItem.Tooltip, + ID: ID, + Label: menuItem.Label, + Role: menuItem.Role, + Accelerator: menuItem.Accelerator, + Type: menuItem.Type, + Disabled: menuItem.Disabled, + Hidden: menuItem.Hidden, + Checked: menuItem.Checked, + SubMenu: nil, + RGBA: menuItem.RGBA, + FontSize: menuItem.FontSize, + FontName: menuItem.FontName, + Image: menuItem.Image, + MacTemplateImage: menuItem.MacTemplateImage, + Tooltip: menuItem.Tooltip, } if menuItem.SubMenu != nil { diff --git a/v2/pkg/menu/menuitem.go b/v2/pkg/menu/menuitem.go index 9d5d5b4d..e00f1a7b 100644 --- a/v2/pkg/menu/menuitem.go +++ b/v2/pkg/menu/menuitem.go @@ -1,8 +1,9 @@ package menu import ( - "github.com/wailsapp/wails/v2/pkg/menu/keys" "sync" + + "github.com/wailsapp/wails/v2/pkg/menu/keys" ) // MenuItem represents a menuitem contained in a menu @@ -38,6 +39,9 @@ type MenuItem struct { // Image - base64 image data Image string + // MacTemplateImage indicates that on a mac, this image is a template image + MacTemplateImage bool + // Tooltip Tooltip string