mcg/internal/gui/application.go
Olli 690f0f8e9a Add back noise texture
Add back the noise texture background by embedding the image file and setting it
as base64-encoded data as CSS background image.
2026-08-14 11:54:59 +02:00

151 lines
4 KiB
Go

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{"<primary>q"})
a.SetAccelsForAction("win.show-help-overlay", []string{"<primary>k"})
a.SetAccelsForAction("app.info", []string{"<primary>i"})
a.SetAccelsForAction("win.connect", []string{"<primary>c"})
a.SetAccelsForAction("win.play", []string{"<primary>p"})
a.SetAccelsForAction("win.clear-playlist", []string{"<primary>r"})
a.SetAccelsForAction("win.toggle-fullscreen", []string{"F11"})
a.SetAccelsForAction("win.search-library", []string{"<primary>f"})
a.SetAccelsForAction("win.panel(\"server\")", []string{"<primary>KP_1"})
a.SetAccelsForAction("win.panel(\"cover\")", []string{"<primary>KP_2"})
a.SetAccelsForAction("win.panel(\"playlist\")", []string{"<primary>KP_3"})
a.SetAccelsForAction("win.panel(\"library\")", []string{"<primary>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()
}
}