♻️ Refactor context menu

This commit is contained in:
2025-11-21 22:30:47 +08:00
parent 4e82e2f6f7
commit 2d3200ad97
13 changed files with 495 additions and 894 deletions

View File

@@ -3,12 +3,13 @@ package services
import (
"github.com/wailsapp/wails/v3/pkg/application"
"github.com/wailsapp/wails/v3/pkg/services/log"
"voidraft/internal/common/helper"
)
// DialogService 对话框服务,处理文件选择等对话框操作
type DialogService struct {
logger *log.LogService
windowHelper *WindowHelper
windowHelper *helper.WindowHelper
}
// NewDialogService 创建新的对话框服务实例
@@ -19,7 +20,7 @@ func NewDialogService(logger *log.LogService) *DialogService {
return &DialogService{
logger: logger,
windowHelper: NewWindowHelper(),
windowHelper: helper.NewWindowHelper(),
}
}

View File

@@ -7,6 +7,7 @@ import (
"sync"
"sync/atomic"
"time"
"voidraft/internal/common/helper"
"voidraft/internal/common/hotkey"
"voidraft/internal/models"
@@ -18,7 +19,7 @@ import (
type HotkeyService struct {
logger *log.LogService
configService *ConfigService
windowHelper *WindowHelper
windowHelper *helper.WindowHelper
mu sync.RWMutex
currentHotkey *models.HotkeyCombo
@@ -45,7 +46,7 @@ func NewHotkeyService(configService *ConfigService, logger *log.LogService) *Hot
return &HotkeyService{
logger: logger,
configService: configService,
windowHelper: NewWindowHelper(),
windowHelper: helper.NewWindowHelper(),
ctx: ctx,
cancel: cancel,
}

View File

@@ -3,13 +3,14 @@ package services
import (
"github.com/wailsapp/wails/v3/pkg/application"
"github.com/wailsapp/wails/v3/pkg/services/log"
"voidraft/internal/common/helper"
)
// TrayService 系统托盘服务
type TrayService struct {
logger *log.LogService
configService *ConfigService
windowHelper *WindowHelper
windowHelper *helper.WindowHelper
}
// NewTrayService 创建新的系统托盘服务实例
@@ -17,7 +18,7 @@ func NewTrayService(logger *log.LogService, configService *ConfigService) *TrayS
return &TrayService{
logger: logger,
configService: configService,
windowHelper: NewWindowHelper(),
windowHelper: helper.NewWindowHelper(),
}
}

View File

@@ -1,123 +0,0 @@
package services
import (
"strconv"
"github.com/wailsapp/wails/v3/pkg/application"
"voidraft/internal/common/constant"
)
// WindowHelper 窗口辅助工具
type WindowHelper struct{}
// NewWindowHelper 创建窗口辅助工具实例
func NewWindowHelper() *WindowHelper {
return &WindowHelper{}
}
// GetMainWindow 获取主窗口实例
// 返回窗口对象和是否找到的标志
func (wh *WindowHelper) GetMainWindow() (application.Window, bool) {
app := application.Get()
return app.Window.GetByName(constant.VOIDRAFT_MAIN_WINDOW_NAME)
}
// MustGetMainWindow 获取主窗口实例
// 如果窗口不存在则返回 nil
func (wh *WindowHelper) MustGetMainWindow() application.Window {
window, ok := wh.GetMainWindow()
if !ok {
return nil
}
return window
}
// ShowMainWindow 显示主窗口
func (wh *WindowHelper) ShowMainWindow() bool {
if window := wh.MustGetMainWindow(); window != nil {
window.Show()
return true
}
return false
}
// HideMainWindow 隐藏主窗口
func (wh *WindowHelper) HideMainWindow() bool {
if window := wh.MustGetMainWindow(); window != nil {
window.Hide()
return true
}
return false
}
// MinimiseMainWindow 最小化主窗口
func (wh *WindowHelper) MinimiseMainWindow() bool {
if window := wh.MustGetMainWindow(); window != nil {
window.Minimise()
return true
}
return false
}
// FocusMainWindow 聚焦主窗口
func (wh *WindowHelper) FocusMainWindow() bool {
if window := wh.MustGetMainWindow(); window != nil {
window.Show()
window.Restore()
window.Focus()
return true
}
return false
}
// AutoShowMainWindow 自动显示主窗口
func (wh *WindowHelper) AutoShowMainWindow() {
window := wh.MustGetMainWindow()
if window.IsVisible() {
window.Focus()
} else {
window.Show()
}
}
// GetDocumentWindow 根据文档ID获取窗口
func (wh *WindowHelper) GetDocumentWindow(documentID int64) (application.Window, bool) {
app := application.Get()
windowName := strconv.FormatInt(documentID, 10)
return app.Window.GetByName(windowName)
}
// GetAllDocumentWindows 获取所有文档窗口
func (wh *WindowHelper) GetAllDocumentWindows() []application.Window {
app := application.Get()
allWindows := app.Window.GetAll()
var docWindows []application.Window
for _, window := range allWindows {
// 跳过主窗口
if window.Name() != constant.VOIDRAFT_MAIN_WINDOW_NAME {
docWindows = append(docWindows, window)
}
}
return docWindows
}
// FocusDocumentWindow 聚焦指定文档的窗口
func (wh *WindowHelper) FocusDocumentWindow(documentID int64) bool {
if window, exists := wh.GetDocumentWindow(documentID); exists {
window.Show()
window.Restore()
window.Focus()
return true
}
return false
}
// CloseDocumentWindow 关闭指定文档的窗口
func (wh *WindowHelper) CloseDocumentWindow(documentID int64) bool {
if window, exists := wh.GetDocumentWindow(documentID); exists {
window.Close()
return true
}
return false
}

View File

@@ -4,6 +4,7 @@ import (
"math"
"sync"
"time"
"voidraft/internal/common/helper"
"voidraft/internal/models"
"github.com/wailsapp/wails/v3/pkg/application"
@@ -25,7 +26,7 @@ const (
type WindowSnapService struct {
logger *log.LogService
configService *ConfigService
windowHelper *WindowHelper
windowHelper *helper.WindowHelper
mu sync.RWMutex
// 吸附配置
@@ -75,7 +76,7 @@ func NewWindowSnapService(logger *log.LogService, configService *ConfigService)
wss := &WindowSnapService{
logger: logger,
configService: configService,
windowHelper: NewWindowHelper(),
windowHelper: helper.NewWindowHelper(),
snapEnabled: snapEnabled,
baseThresholdRatio: 0.025, // 2.5%的主窗口宽度作为基础阈值
minThreshold: 8, // 最小8像素小屏幕保底

View File

@@ -4,6 +4,7 @@ import (
"sync"
"testing"
"time"
"voidraft/internal/common/helper"
"voidraft/internal/models"
"github.com/wailsapp/wails/v3/pkg/application"
@@ -42,7 +43,7 @@ func createTestService() *WindowSnapService {
service := &WindowSnapService{
logger: logger,
configService: nil, // 测试中不需要实际的配置服务
windowHelper: NewWindowHelper(),
windowHelper: helper.NewWindowHelper(),
snapEnabled: true,
baseThresholdRatio: 0.025,
minThreshold: 8,