Add context menu to menumanager. Slight refactor.

This commit is contained in:
Lea Anthony
2021-01-11 14:19:01 +11:00
parent 55d7d9693f
commit 4e58b7697a
9 changed files with 129 additions and 72 deletions

View File

@@ -59,8 +59,18 @@ func CreateApp(appoptions *options.App) (*App, error) {
// Create the menu manager
menuManager := menumanager.NewManager()
// Process the application menu
menuManager.SetApplicationMenu(options.GetApplicationMenu(appoptions))
// Process context menus
contextMenus := options.GetContextMenus(appoptions)
if contextMenus != nil {
for contextMenuID, contextMenu := range contextMenus.Items {
menuManager.AddContextMenu(contextMenuID, contextMenu)
}
}
window := ffenestri.NewApplicationWithConfig(appoptions, myLogger, menuManager)
result := &App{

View File

@@ -0,0 +1,46 @@
package menumanager
import "github.com/wailsapp/wails/v2/pkg/menu"
func (m *Manager) SetApplicationMenu(applicationMenu *menu.Menu) error {
if applicationMenu == nil {
return nil
}
m.applicationMenu = applicationMenu
// Reset the menu map
m.applicationMenuItemMap = NewMenuItemMap()
// Add the menu to the menu map
m.applicationMenuItemMap.AddMenu(applicationMenu)
return m.processApplicationMenu()
}
func (m *Manager) GetApplicationMenuJSON() string {
return m.applicationMenuJSON
}
// UpdateApplicationMenu reprocesses the application menu to pick up structure
// changes etc
// Returns the JSON representation of the updated menu
func (m *Manager) UpdateApplicationMenu() (string, error) {
m.applicationMenuItemMap = NewMenuItemMap()
m.applicationMenuItemMap.AddMenu(m.applicationMenu)
err := m.processApplicationMenu()
return m.applicationMenuJSON, err
}
func (m *Manager) processApplicationMenu() error {
// Process the menu
processedApplicationMenu := NewWailsMenu(m.applicationMenuItemMap, m.applicationMenu)
applicationMenuJSON, err := processedApplicationMenu.AsJSON()
if err != nil {
return err
}
m.applicationMenuJSON = applicationMenuJSON
return nil
}

View File

@@ -0,0 +1,47 @@
package menumanager
import (
"fmt"
"github.com/wailsapp/wails/v2/pkg/menu"
)
type ContextMenu struct {
ID string
JSON string
menuItemMap *MenuItemMap
menu *menu.Menu
}
func NewContextMenu(ID string, menu *menu.Menu) *ContextMenu {
result := &ContextMenu{
ID: ID,
JSON: "",
menu: menu,
menuItemMap: NewMenuItemMap(),
}
result.menuItemMap.AddMenu(menu)
return result
}
func (m *Manager) AddContextMenu(menuID string, menu *menu.Menu) error {
contextMenu := NewContextMenu(menuID, menu)
m.contextMenus[menuID] = contextMenu
return contextMenu.process()
}
func (c *ContextMenu) process() error {
// Process the menu
processedApplicationMenu := NewWailsMenu(c.menuItemMap, c.menu)
JSON, err := processedApplicationMenu.AsJSON()
if err != nil {
return err
}
c.JSON = JSON
fmt.Printf("Processed context menu '%s':", c.ID)
println(JSON)
return nil
}

View File

@@ -13,55 +13,18 @@ type Manager struct {
// Our application menu mappings
applicationMenuItemMap *MenuItemMap
// Context menus
contextMenus map[string]*ContextMenu
}
func NewManager() *Manager {
return &Manager{
applicationMenuItemMap: NewMenuItemMap(),
contextMenus: make(map[string]*ContextMenu),
}
}
func (m *Manager) SetApplicationMenu(applicationMenu *menu.Menu) error {
if applicationMenu == nil {
return nil
}
m.applicationMenu = applicationMenu
// Reset the menu map
m.applicationMenuItemMap = NewMenuItemMap()
// Add the menu to the menu map
m.applicationMenuItemMap.AddMenu(applicationMenu)
return m.processApplicationMenu()
}
func (m *Manager) GetApplicationMenuJSON() string {
return m.applicationMenuJSON
}
// UpdateApplicationMenu reprocesses the application menu to pick up structure
// changes etc
// Returns the JSON representation of the updated menu
func (m *Manager) UpdateApplicationMenu() (string, error) {
m.applicationMenuItemMap = NewMenuItemMap()
m.applicationMenuItemMap.AddMenu(m.applicationMenu)
err := m.processApplicationMenu()
return m.applicationMenuJSON, err
}
func (m *Manager) processApplicationMenu() error {
// Process the menu
processedApplicationMenu := m.NewWailsMenu(m.applicationMenuItemMap, m.applicationMenu)
applicationMenuJSON, err := processedApplicationMenu.AsJSON()
if err != nil {
return err
}
m.applicationMenuJSON = applicationMenuJSON
return nil
}
func (m *Manager) getMenuItemByID(menuMap *MenuItemMap, menuId string) *menu.MenuItem {
return menuMap.idToMenuItemMap[menuId]
}

View File

@@ -33,7 +33,7 @@ type ProcessedMenuItem struct {
Background int
}
func (m *Manager) NewProcessedMenuItem(menuItemMap *MenuItemMap, menuItem *menu.MenuItem) *ProcessedMenuItem {
func NewProcessedMenuItem(menuItemMap *MenuItemMap, menuItem *menu.MenuItem) *ProcessedMenuItem {
ID := menuItemMap.menuItemToIDMap[menuItem]
result := &ProcessedMenuItem{
@@ -50,7 +50,7 @@ func (m *Manager) NewProcessedMenuItem(menuItemMap *MenuItemMap, menuItem *menu.
}
if menuItem.SubMenu != nil {
result.SubMenu = m.NewProcessedMenu(menuItemMap, menuItem.SubMenu)
result.SubMenu = NewProcessedMenu(menuItemMap, menuItem.SubMenu)
}
return result
@@ -60,11 +60,11 @@ type ProcessedMenu struct {
Items []*ProcessedMenuItem
}
func (m *Manager) NewProcessedMenu(menuItemMap *MenuItemMap, menu *menu.Menu) *ProcessedMenu {
func NewProcessedMenu(menuItemMap *MenuItemMap, menu *menu.Menu) *ProcessedMenu {
result := &ProcessedMenu{}
for _, item := range menu.Items {
processedMenuItem := m.NewProcessedMenuItem(menuItemMap, item)
processedMenuItem := NewProcessedMenuItem(menuItemMap, item)
result.Items = append(result.Items, processedMenuItem)
}
@@ -85,11 +85,11 @@ type RadioGroup struct {
Length int
}
func (m *Manager) NewWailsMenu(menuItemMap *MenuItemMap, menu *menu.Menu) *WailsMenu {
func NewWailsMenu(menuItemMap *MenuItemMap, menu *menu.Menu) *WailsMenu {
result := &WailsMenu{}
// Process the menus
result.Menu = m.NewProcessedMenu(menuItemMap, menu)
result.Menu = NewProcessedMenu(menuItemMap, menu)
// Process the radio groups
result.processRadioGroups()

View File

@@ -11,16 +11,6 @@ import (
"github.com/wailsapp/wails/v2/pkg/menu"
)
// eventListener holds a callback function which is invoked when
// the event listened for is emitted. It has a counter which indicates
// how the total number of events it is interested in. A value of zero
// means it does not expire (default).
// type eventListener struct {
// callback func(...interface{}) // Function to call with emitted event data
// counter int // The number of times this callback may be called. -1 = infinite
// delete bool // Flag to indicate that this listener should be deleted
// }
// Menu is the subsystem that handles the operation of menus. It manages all service bus messages
// starting with "menu".
type Menu struct {