5
0
mirror of https://github.com/wailsapp/wails.git synced 2025-05-03 03:21:32 +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
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 {

View File

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

View File

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

View File

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