166 lines
4.4 KiB
Go
166 lines
4.4 KiB
Go
package services
|
|
|
|
import (
|
|
"log"
|
|
"strconv"
|
|
|
|
"github.com/wailsapp/wails/v3/pkg/application"
|
|
"github.com/wailsapp/wails/v3/pkg/events"
|
|
)
|
|
|
|
const (
|
|
windowStartStateNormal = "normal"
|
|
windowStartStateMaximized = "maximized"
|
|
|
|
settingKeyWindowStartState = "window.start_state"
|
|
settingKeyWindowWidth = "window.width"
|
|
settingKeyWindowHeight = "window.height"
|
|
settingKeyWindowRememberState = "window.remember_state"
|
|
)
|
|
|
|
type mainWindowStateOptions struct {
|
|
Width int
|
|
Height int
|
|
StartState application.WindowState
|
|
Remember bool
|
|
}
|
|
|
|
func (a *AppService) loadMainWindowStateOptions() mainWindowStateOptions {
|
|
options := mainWindowStateOptions{
|
|
Width: mainWindowWidth,
|
|
Height: mainWindowHeight,
|
|
StartState: application.WindowStateNormal,
|
|
Remember: true,
|
|
}
|
|
if a == nil || a.Config == nil {
|
|
return options
|
|
}
|
|
|
|
options.Remember = configBool(a.Config, settingKeyWindowRememberState, true)
|
|
if !options.Remember {
|
|
return options
|
|
}
|
|
|
|
options.Width = max(configInt(a.Config, settingKeyWindowWidth, mainWindowWidth), mainWindowMinWidth)
|
|
options.Height = max(configInt(a.Config, settingKeyWindowHeight, mainWindowHeight), mainWindowMinHeight)
|
|
if configString(a.Config, settingKeyWindowStartState, windowStartStateNormal) == windowStartStateMaximized {
|
|
options.StartState = application.WindowStateMaximised
|
|
}
|
|
return options
|
|
}
|
|
|
|
func (a *AppService) registerMainWindowStatePersistence() {
|
|
if a == nil || a.MainWindow == nil {
|
|
return
|
|
}
|
|
|
|
a.MainWindow.OnWindowEvent(events.Common.WindowDidResize, func(_ *application.WindowEvent) {
|
|
a.persistMainWindowNormalSize()
|
|
})
|
|
a.MainWindow.OnWindowEvent(events.Common.WindowMaximise, func(_ *application.WindowEvent) {
|
|
a.persistMainWindowStartState(windowStartStateMaximized)
|
|
})
|
|
a.MainWindow.OnWindowEvent(events.Common.WindowRestore, func(_ *application.WindowEvent) {
|
|
a.persistMainWindowState()
|
|
})
|
|
a.MainWindow.OnWindowEvent(events.Common.WindowUnMaximise, func(_ *application.WindowEvent) {
|
|
a.persistMainWindowState()
|
|
})
|
|
}
|
|
|
|
func (a *AppService) shouldRememberMainWindowState() bool {
|
|
if a == nil || a.Config == nil {
|
|
return false
|
|
}
|
|
return configBool(a.Config, settingKeyWindowRememberState, true)
|
|
}
|
|
|
|
func (a *AppService) persistMainWindowState() {
|
|
if !a.shouldRememberMainWindowState() || a.MainWindow == nil {
|
|
return
|
|
}
|
|
if a.MainWindow.IsMaximised() {
|
|
a.persistMainWindowStartState(windowStartStateMaximized)
|
|
return
|
|
}
|
|
if a.MainWindow.IsFullscreen() || a.MainWindow.IsMinimised() {
|
|
return
|
|
}
|
|
a.persistMainWindowNormalSize()
|
|
}
|
|
|
|
func (a *AppService) persistMainWindowStartState(state string) {
|
|
if !a.shouldRememberMainWindowState() || a.Config == nil {
|
|
return
|
|
}
|
|
|
|
a.windowStateMu.Lock()
|
|
defer a.windowStateMu.Unlock()
|
|
|
|
if err := a.Config.SetAppConfig(settingKeyWindowStartState, state); err != nil {
|
|
log.Printf("persist main window state failed: %v", err)
|
|
}
|
|
}
|
|
|
|
func (a *AppService) persistMainWindowNormalSize() {
|
|
if !a.shouldRememberMainWindowState() || a.MainWindow == nil || a.Config == nil {
|
|
return
|
|
}
|
|
if a.MainWindow.IsMaximised() || a.MainWindow.IsFullscreen() || a.MainWindow.IsMinimised() {
|
|
return
|
|
}
|
|
|
|
width, height := a.MainWindow.Size()
|
|
if width < mainWindowMinWidth || height < mainWindowMinHeight {
|
|
return
|
|
}
|
|
|
|
a.windowStateMu.Lock()
|
|
defer a.windowStateMu.Unlock()
|
|
|
|
if err := a.Config.SetAppConfig(settingKeyWindowStartState, windowStartStateNormal); err != nil {
|
|
log.Printf("persist main window start state failed: %v", err)
|
|
}
|
|
if err := a.Config.SetAppConfig(settingKeyWindowWidth, strconv.Itoa(width)); err != nil {
|
|
log.Printf("persist main window width failed: %v", err)
|
|
}
|
|
if err := a.Config.SetAppConfig(settingKeyWindowHeight, strconv.Itoa(height)); err != nil {
|
|
log.Printf("persist main window height failed: %v", err)
|
|
}
|
|
}
|
|
|
|
func configString(config *AppConfigService, key string, fallback string) string {
|
|
if config == nil {
|
|
return fallback
|
|
}
|
|
value, err := config.GetAppConfig(key)
|
|
if err != nil || value == "" {
|
|
return fallback
|
|
}
|
|
return value
|
|
}
|
|
|
|
func configBool(config *AppConfigService, key string, fallback bool) bool {
|
|
value := configString(config, key, "")
|
|
if value == "" {
|
|
return fallback
|
|
}
|
|
parsed, err := strconv.ParseBool(value)
|
|
if err != nil {
|
|
return fallback
|
|
}
|
|
return parsed
|
|
}
|
|
|
|
func configInt(config *AppConfigService, key string, fallback int) int {
|
|
value := configString(config, key, "")
|
|
if value == "" {
|
|
return fallback
|
|
}
|
|
parsed, err := strconv.Atoi(value)
|
|
if err != nil {
|
|
return fallback
|
|
}
|
|
return parsed
|
|
}
|