mirror of
https://github.com/wailsapp/wails.git
synced 2025-05-03 15:32:11 +08:00
Add context menu to menumanager. Slight refactor.
This commit is contained in:
parent
55d7d9693f
commit
4e58b7697a
@ -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{
|
||||||
|
46
v2/internal/menumanager/applicationmenu.go
Normal file
46
v2/internal/menumanager/applicationmenu.go
Normal 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
|
||||||
|
}
|
47
v2/internal/menumanager/contextmenu.go
Normal file
47
v2/internal/menumanager/contextmenu.go
Normal 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
|
||||||
|
}
|
@ -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]
|
||||||
}
|
}
|
||||||
|
@ -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()
|
||||||
|
@ -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 {
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user