From e40226ff7a8e1f5c3bddb33130875fa0d03ff9ce Mon Sep 17 00:00:00 2001 From: Lea Anthony Date: Tue, 13 Apr 2021 21:05:56 +1000 Subject: [PATCH] ANSI support for tray labels and submenus --- v2/internal/ffenestri/menu_darwin.c | 13 ++++++++++--- v2/internal/ffenestri/menu_darwin.h | 2 +- v2/internal/menumanager/processedMenu.go | 2 +- v2/internal/menumanager/traymenu.go | 14 +++++++------- 4 files changed, 19 insertions(+), 12 deletions(-) diff --git a/v2/internal/ffenestri/menu_darwin.c b/v2/internal/ffenestri/menu_darwin.c index a4bd5828..5e8b0bd9 100644 --- a/v2/internal/ffenestri/menu_darwin.c +++ b/v2/internal/ffenestri/menu_darwin.c @@ -725,7 +725,7 @@ id createAttributedString(const char* title, const char* fontName, int fontSize, return attributedString; } -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, bool alternate) { +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, bool alternate, JsonNode* styledLabel) { id item = ALLOC("NSMenuItem"); // Create a MenuItemCallbackData @@ -752,7 +752,12 @@ id processTextMenuItem(Menu *menu, id parentMenu, const char *title, const char msg_id(item, s("setImage:"), nsimage); } - id attributedString = createAttributedString(title, fontName, fontSize, RGBA); + id attributedString = NULL; + if( styledLabel != NULL) { + attributedString = createAttributedStringFromStyledLabel(styledLabel, fontName, fontSize); + } else { + attributedString = createAttributedString(title, fontName, fontSize, RGBA); + } msg_id(item, s("setAttributedTitle:"), attributedString); //msg_id(item, s("setTitle:"), str(title)); @@ -799,6 +804,8 @@ void processMenuItem(Menu *menu, id parentMenu, JsonNode *item) { label = "(empty)"; } + // Check for a styled label + JsonNode *styledLabel = getJSONObject(item, "StyledLabel"); // Is this an alternate menu item? bool alternate = false; @@ -858,7 +865,7 @@ void processMenuItem(Menu *menu, id parentMenu, JsonNode *item) { JsonNode *type = json_find_member(item, "Type"); if( type != NULL ) { if( STREQ(type->string_, "Text") || STREQ(type->string_, "Submenu")) { - id thisMenuItem = processTextMenuItem(menu, parentMenu, label, menuid, disabled, acceleratorkey, modifiers, tooltip, image, fontName, fontSize, RGBA, templateImage, alternate); + id thisMenuItem = processTextMenuItem(menu, parentMenu, label, menuid, disabled, acceleratorkey, modifiers, tooltip, image, fontName, fontSize, RGBA, templateImage, alternate, styledLabel); // Check if this node has a submenu JsonNode *submenu = json_find_member(item, "SubMenu"); diff --git a/v2/internal/ffenestri/menu_darwin.h b/v2/internal/ffenestri/menu_darwin.h index 3fa09cb5..a68c483b 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, bool templateImage, bool alternate); +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, bool alternate, JsonNode* styledLabel); 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 25f318ec..f8204d53 100644 --- a/v2/internal/menumanager/processedMenu.go +++ b/v2/internal/menumanager/processedMenu.go @@ -46,7 +46,7 @@ type ProcessedMenuItem struct { Tooltip string `json:",omitempty"` // Styled label - StyledLabel []*ansi.StyledText + StyledLabel []*ansi.StyledText `json:",omitempty"` } func NewProcessedMenuItem(menuItemMap *MenuItemMap, menuItem *menu.MenuItem) *ProcessedMenuItem { diff --git a/v2/internal/menumanager/traymenu.go b/v2/internal/menumanager/traymenu.go index 61343720..aed5b05a 100644 --- a/v2/internal/menumanager/traymenu.go +++ b/v2/internal/menumanager/traymenu.go @@ -39,7 +39,7 @@ type TrayMenu struct { menu *menu.Menu ProcessedMenu *WailsMenu trayMenu *menu.TrayMenu - StyledLabel []*ansi.StyledText + StyledLabel []*ansi.StyledText `json:",omitempty"` } func (t *TrayMenu) AsJSON() (string, error) { @@ -165,15 +165,15 @@ func (m *Manager) UpdateTrayMenuLabel(trayMenu *menu.TrayMenu) (string, error) { type LabelUpdate struct { ID string - Label string - FontName string + Label string `json:",omitempty"` + FontName string `json:",omitempty"` FontSize int - RGBA string + RGBA string `json:",omitempty"` Disabled bool - Tooltip string - Image string + Tooltip string `json:",omitempty"` + Image string `json:",omitempty"` MacTemplateImage bool - StyledLabel []*ansi.StyledText + StyledLabel []*ansi.StyledText `json:",omitempty"` } // Parse ANSI text