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:
parent
55d7d9693f
commit
4e58b7697a
@ -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{
|
||||
|
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
|
||||
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]
|
||||
}
|
||||
|
@ -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()
|
||||
|
@ -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 {
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user