#!/usr/bin/env python3 import logging import gi gi.require_version('Gtk', '4.0') gi.require_version('Adw', '1') from gi.repository import Gio, Gtk, Gdk, Adw from .window import Window class Application(Gtk.Application): TITLE = "CoverGrid" ID = 'xyz.suruatoel.mcg' DOMAIN = 'mcg' def __init__(self, version): super().__init__(application_id=Application.ID, flags=Gio.ApplicationFlags.FLAGS_NONE) self._window = None self._info_dialog = None self._version = version self._verbosity = logging.WARNING self.set_accels_for_action('window.close', ['q']) self.set_accels_for_action('win.show-help-overlay', ['k']) self.set_accels_for_action('app.info', ['i']) self.set_accels_for_action('win.connect', ['c']) self.set_accels_for_action('win.play', ['p']) self.set_accels_for_action('win.clear-playlist', ['r']) self.set_accels_for_action('win.toggle-fullscreen', ['F11']) self.set_accels_for_action('win.search-library', ['f']) self.set_accels_for_action('win.panel("0")', ['KP_1']) self.set_accels_for_action('win.panel("1")', ['KP_2']) self.set_accels_for_action('win.panel("2")', ['KP_3']) self.set_accels_for_action('win.panel("3")', ['KP_4']) def do_startup(self): Gtk.Application.do_startup(self) self._setup_logging() self._load_settings() self._set_default_settings() self._load_css() self._setup_actions() self._setup_adw() def do_activate(self): Gtk.Application.do_activate(self) if not self._window: self._window = Window(self, Application.TITLE, self._settings) self._window.present() def on_menu_info(self, action, value): self._info_dialog = Adw.AboutDialog() self._info_dialog.set_application_icon("xyz.suruatoel.mcg") self._info_dialog.set_application_name("CoverGrid") self._info_dialog.set_version(self._version) self._info_dialog.set_comments( """CoverGrid is a client for the Music Player Daemon, focusing on \ albums instead of single tracks.""") self._info_dialog.set_website("https://www.suruatoel.xyz/codes/mcg") self._info_dialog.set_license_type(Gtk.License.GPL_3_0) self._info_dialog.set_issue_url( "https://git.suruatoel.xyz/coderkun/mcg") self._info_dialog.present() def on_menu_quit(self, action, value): self.quit() def _setup_logging(self): logging.basicConfig(level=self._verbosity, format="%(asctime)s %(levelname)s: %(message)s") def _load_settings(self): self._settings = Gio.Settings.new(Application.ID) def _set_default_settings(self): style_manager = Adw.StyleManager.get_default() style_manager.set_color_scheme(Adw.ColorScheme.PREFER_DARK) def _load_css(self): style_provider = Gtk.CssProvider() style_provider.load_from_resource(self._get_resource_path('gtk.css')) Gtk.StyleContext.add_provider_for_display( Gdk.Display.get_default(), style_provider, Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION) def _setup_actions(self): action = Gio.SimpleAction.new("info", None) action.connect('activate', self.on_menu_info) self.add_action(action) action = Gio.SimpleAction.new("quit", None) action.connect('activate', self.on_menu_quit) self.add_action(action) def _get_resource_path(self, path): return "/{}/{}".format(Application.ID.replace('.', '/'), path) def _setup_adw(self): Adw.HeaderBar() Adw.ToolbarView() Adw.ViewSwitcherTitle() Adw.ViewSwitcherBar() Adw.ViewStackPage() Adw.ToastOverlay() Adw.StatusPage() Adw.Flap() Adw.EntryRow() Adw.PasswordEntryRow()