package gui import ( "log" "os" "github.com/diamondburned/gotk4-adwaita/pkg/adw" "github.com/diamondburned/gotk4/pkg/gdk/v4" "github.com/diamondburned/gotk4/pkg/gio/v2" "github.com/diamondburned/gotk4/pkg/glib/v2" "github.com/diamondburned/gotk4/pkg/gtk/v4" "suruatoel.xyz/mcg/data" "suruatoel.xyz/mcg/internal/client" "suruatoel.xyz/mcg/internal/i18n" ) type Application struct { *gtk.Application window *mainWindow aboutDialog *adw.AboutDialog config Configuration configErr error } func NewApplication() *Application { app := Application{ Application: gtk.NewApplication("xyz.suruatoel.mcg", gio.ApplicationFlagsNone), } app.ConnectStartup(app.onStartup) app.ConnectActivate(app.onActivate) app.ConnectShutdown(app.onShutdown) return &app } func (a *Application) onStartup() { a.setDefaultSettings() a.loadCSS() a.registerShortcuts() a.registerActions() a.loadConfig() } func (a *Application) loadConfig() { a.config = Configuration{ Host: "localhost", Port: 6600, Panel: "library", SortField: "year", SortDesc: false, } a.configErr = readConfig(&a.config) } func (a *Application) setDefaultSettings() { styleManager := adw.StyleManagerGetDefault() styleManager.SetColorScheme(adw.ColorSchemePreferDark) } func (a *Application) loadCSS() { styleProvider := gtk.NewCSSProvider() styleProvider.LoadFromString(data.BuildMainCSS()) gtk.StyleContextAddProviderForDisplay( gdk.DisplayGetDefault(), styleProvider, gtk.STYLE_PROVIDER_PRIORITY_APPLICATION, ) } func (a *Application) registerShortcuts() { a.SetAccelsForAction("window.close", []string{"q"}) a.SetAccelsForAction("win.show-help-overlay", []string{"k"}) a.SetAccelsForAction("app.info", []string{"i"}) a.SetAccelsForAction("win.connect", []string{"c"}) a.SetAccelsForAction("win.play", []string{"p"}) a.SetAccelsForAction("win.clear-playlist", []string{"r"}) a.SetAccelsForAction("win.toggle-fullscreen", []string{"F11"}) a.SetAccelsForAction("win.search-library", []string{"f"}) a.SetAccelsForAction("win.panel(\"server\")", []string{"KP_1"}) a.SetAccelsForAction("win.panel(\"cover\")", []string{"KP_2"}) a.SetAccelsForAction("win.panel(\"playlist\")", []string{"KP_3"}) a.SetAccelsForAction("win.panel(\"library\")", []string{"KP_4"}) } func (a *Application) registerActions() { infoAction := gio.NewSimpleAction("info", nil) infoAction.ConnectActivate(func(_ *glib.Variant) { a.showAboutDialog() }) a.AddAction(infoAction) } func (a *Application) showAboutDialog() { if a.aboutDialog == nil { a.aboutDialog = a.newAboutDialog() } a.aboutDialog.Present(a.window) } func (a *Application) newAboutDialog() *adw.AboutDialog { dialog := adw.NewAboutDialog() dialog.SetApplicationName("CoverGrid") dialog.SetApplicationIcon("xyz.suruatoel.mcg") dialog.SetVersion(a.Version()) dialog.SetComments(i18n.T("CoverGrid is a client for the Music Player Daemon, focusing on albums instead of single tracks.")) dialog.SetWebsite("https://www.suruatoel.xyz/codes/mcg") dialog.SetLicenseType(gtk.LicenseGPL30) dialog.SetIssueURL("https://git.suruatoel.xyz/coderkun/mcg") return dialog } func (a *Application) onActivate() { if a.window == nil { a.window = newMainWindow(a.Application, a.config) if a.configErr != nil && !os.IsNotExist(a.configErr) { a.window.SetConfigError(a.configErr) } a.window.ConnectCloseRequest(a.onCloseRequest) } a.window.Present() if a.config.IsConnected { client.Instance().Connect(a.config.Host, int(a.config.Port), a.config.Password) } } func (a *Application) onCloseRequest() bool { a.window.UpdateConfig(&a.config) a.config.IsConnected = client.Instance().IsConnected() a.saveConfig() return false } func (a *Application) saveConfig() { err := writeConfig(&a.config) if err != nil { log.Println("failed to save configuration file:", err) } } func (a *Application) onShutdown() { if client.Instance().IsConnected() { client.Instance().Disconnect() } }