5
0
mirror of https://github.com/wailsapp/wails.git synced 2025-05-04 04:11:56 +08:00

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
No known key found for this signature in database
GPG Key ID: 33DAF7BB90A58405
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 // Create the menu manager
menuManager := menumanager.NewManager() menuManager := menumanager.NewManager()
// Process the application menu
menuManager.SetApplicationMenu(options.GetApplicationMenu(appoptions)) 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) window := ffenestri.NewApplicationWithConfig(appoptions, myLogger, menuManager)
result := &App{ 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 // Our application menu mappings
applicationMenuItemMap *MenuItemMap applicationMenuItemMap *MenuItemMap
// Context menus
contextMenus map[string]*ContextMenu
} }
func NewManager() *Manager { func NewManager() *Manager {
return &Manager{ return &Manager{
applicationMenuItemMap: NewMenuItemMap(), 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 { func (m *Manager) getMenuItemByID(menuMap *MenuItemMap, menuId string) *menu.MenuItem {
return menuMap.idToMenuItemMap[menuId] return menuMap.idToMenuItemMap[menuId]
} }

View File

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

View File

@ -11,16 +11,6 @@ import (
"github.com/wailsapp/wails/v2/pkg/menu" "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 // Menu is the subsystem that handles the operation of menus. It manages all service bus messages
// starting with "menu". // starting with "menu".
type Menu struct { type Menu struct {

View File

@ -34,18 +34,18 @@ func (c *ContextMenu) WailsInit(runtime *wails.Runtime) error {
func createContextMenus() *menu.ContextMenus { func createContextMenus() *menu.ContextMenus {
result := menu.NewContextMenus() result := menu.NewContextMenus()
//result.AddMenu("test", menu.NewMenuFromItems( result.AddMenu("test", menu.NewMenuFromItems(
// menu.Text("Clicked 0 times", "Test Context Menu", nil), menu.Text("Clicked 0 times", "Test Context Menu", nil, nil),
// menu.Separator(), menu.Separator(),
// menu.Checkbox("I am a checkbox", "checkbox", false, nil), menu.Checkbox("I am a checkbox", "checkbox", false, nil, nil),
// menu.Separator(), menu.Separator(),
// menu.Radio("Radio Option 1", "Radio Option 1", true, nil), menu.Radio("Radio Option 1", "Radio Option 1", true, nil, nil),
// menu.Radio("Radio Option 2", "Radio Option 2", false, nil), menu.Radio("Radio Option 2", "Radio Option 2", false, nil, nil),
// menu.Radio("Radio Option 3", "Radio Option 3", false, nil), menu.Radio("Radio Option 3", "Radio Option 3", false, nil, nil),
// menu.Separator(), menu.Separator(),
// menu.SubMenu("A Submenu", menu.NewMenuFromItems( menu.SubMenu("A Submenu", menu.NewMenuFromItems(
// menu.Text("Hello", "Hello", nil), menu.Text("Hello", "Hello", nil, nil),
// )), )),
//)) ))
return result return result
} }

View File

@ -22,7 +22,7 @@ func main() {
//Tray: menu.NewMenuFromItems(menu.AppMenu()), //Tray: menu.NewMenuFromItems(menu.AppMenu()),
//Menu: menu.NewMenuFromItems(menu.AppMenu()), //Menu: menu.NewMenuFromItems(menu.AppMenu()),
//StartHidden: true, //StartHidden: true,
//ContextMenus: createContextMenus(), ContextMenus: createContextMenus(),
Mac: &mac.Options{ Mac: &mac.Options{
WebviewIsTransparent: true, WebviewIsTransparent: true,
WindowBackgroundIsTranslucent: true, WindowBackgroundIsTranslucent: true,

View File

@ -80,10 +80,11 @@ func (m *Menu) removeDynamicMenuOneMenu(_ *menu.CallbackData) {
// Get the last menu we added // Get the last menu we added
lastItemIndex := len(m.dynamicMenuOneItems) - 1 lastItemIndex := len(m.dynamicMenuOneItems) - 1
lastMenuAdded := m.dynamicMenuOneItems[lastItemIndex] lastMenuAdded := m.dynamicMenuOneItems[lastItemIndex]
// Remove from slice // Remove from slice
m.dynamicMenuOneItems = m.dynamicMenuOneItems[:lastItemIndex] m.dynamicMenuOneItems = m.dynamicMenuOneItems[:lastItemIndex]
// Remove the item from the // Remove the item from the menu
lastMenuAdded.Remove() lastMenuAdded.Remove()
// Update the counter // Update the counter