package config import ( "context" "fmt" "github.com/bnema/dumber/internal/application/dto" ) type WebUIConfigGateway struct { mgr *Manager } func NewWebUIConfigGateway(mgr *Manager) *WebUIConfigGateway { return &WebUIConfigGateway{mgr: mgr} } // SaveWebUIConfig maps an already validated and normalized WebUI config onto // the stored config and saves it. Policy lives in SaveWebUIConfigUseCase. func (g *WebUIConfigGateway) SaveWebUIConfig(ctx context.Context, cfg dto.WebUIConfig) error { _ = ctx if g == nil || g.mgr == nil { return fmt.Errorf("config manager not initialized") } current := Get() current.Appearance.SansFont = cfg.Appearance.SansFont current.Appearance.SerifFont = cfg.Appearance.SerifFont current.Appearance.MonospaceFont = cfg.Appearance.MonospaceFont current.Appearance.GtkFont = cfg.Appearance.GtkFont current.Appearance.DefaultFontSize = cfg.Appearance.DefaultFontSize current.Appearance.ColorScheme = cfg.Appearance.ColorScheme current.Appearance.LightPalette = ColorPalette{ Background: cfg.Appearance.LightPalette.Background, Surface: cfg.Appearance.LightPalette.Surface, SurfaceVariant: cfg.Appearance.LightPalette.SurfaceVariant, Text: cfg.Appearance.LightPalette.Text, Muted: cfg.Appearance.LightPalette.Muted, Accent: cfg.Appearance.LightPalette.Accent, Border: cfg.Appearance.LightPalette.Border, } current.Appearance.DarkPalette = ColorPalette{ Background: cfg.Appearance.DarkPalette.Background, Surface: cfg.Appearance.DarkPalette.Surface, SurfaceVariant: cfg.Appearance.DarkPalette.SurfaceVariant, Text: cfg.Appearance.DarkPalette.Text, Muted: cfg.Appearance.DarkPalette.Muted, Accent: cfg.Appearance.DarkPalette.Accent, Border: cfg.Appearance.DarkPalette.Border, } current.Appearance.ExternalTheme = cfg.Appearance.ExternalTheme current.DefaultUIScale = cfg.DefaultUIScale current.DefaultSearchEngine = cfg.DefaultSearchEngine if len(cfg.SearchShortcuts) == 0 { current.SearchShortcuts = nil } else { shortcuts := make(map[string]SearchShortcut, len(cfg.SearchShortcuts)) for key, shortcut := range cfg.SearchShortcuts { shortcuts[key] = SearchShortcut{ URL: shortcut.URL, Description: shortcut.Description, } } current.SearchShortcuts = shortcuts } // Performance profile (requires restart to take effect) if cfg.Performance.Profile != "" { current.Engine.Profile = PerformanceProfile(cfg.Performance.Profile) } // Custom performance fields (only used when profile is "custom") if cfg.Performance.Profile == string(ProfileCustom) { custom := cfg.Performance.Custom current.Engine.WebKit.SkiaCPUPaintingThreads = custom.SkiaCPUThreads current.Engine.WebKit.SkiaGPUPaintingThreads = custom.SkiaGPUThreads current.Engine.WebKit.WebProcessMemoryLimitMB = custom.WebProcessMemoryMB current.Engine.WebKit.NetworkProcessMemoryLimitMB = custom.NetworkProcessMemoryMB current.Engine.PoolPrewarmCount = custom.WebViewPoolPrewarm } return g.mgr.Save(current) }