# Copyright 2022 (c) Anna Schumaker. """A custom Adw.Window configured for our application.""" from gi.repository import GObject from gi.repository import Gtk from gi.repository import Adw from .action import ActionEntry from . import layout def _make_pane(orientation: Gtk.Orientation, position: int = 0, start_child: Gtk.Widget = None, end_child: Gtk.Widget = None) -> Gtk.Paned: pane = Gtk.Paned(orientation=orientation, hexpand=True, vexpand=True, shrink_start_child=False, resize_start_child=False, start_child=start_child, end_child=end_child, position=position, margin_start=8) pane.add_css_class("emmental-pane") return pane class Window(Adw.Window): """Our custom Adw.Window. Our Window is configured with 4 regions for widgets: * An area to place a CSD header bar * An area for a sidebar * An area to show now-playing information * An area to display a tracklist """ header = GObject.Property(type=Gtk.Widget) sidebar = GObject.Property(type=Gtk.Widget) show_sidebar = GObject.Property(type=bool, default=False) now_playing = GObject.Property(type=Gtk.Widget) now_playing_size = GObject.Property(type=int, default=250) tracklist = GObject.Property(type=Gtk.Widget) user_editing = GObject.Property(type=bool, default=False) def __init__(self, version: str, **kwargs): """Initialize our Window.""" super().__init__(icon_name="emmental", title=version, default_width=1600, default_height=900, width_request=525, height_request=500, **kwargs) self._box = Gtk.Box.new(Gtk.Orientation.VERTICAL, 0) self._header = Adw.Bin(child=self.header) self._inner_pane = _make_pane(Gtk.Orientation.VERTICAL, position=self.now_playing_size, start_child=self.now_playing, end_child=self.tracklist) self._layout = layout.Layout(content=self._inner_pane, sidebar=self.sidebar) self._toast = Adw.ToastOverlay(child=self._layout) self._layout.add_css_class("emmental-padding") if __debug__: self.add_css_class("devel") self.bind_property("header", self._header, "child") self.bind_property("sidebar", self._layout, "sidebar") self.bind_property("show-sidebar", self._layout, "show-sidebar", GObject.BindingFlags.BIDIRECTIONAL) self.bind_property("now-playing", self._inner_pane, "start-child") self.bind_property("now-playing-size", self._inner_pane, "position", GObject.BindingFlags.BIDIRECTIONAL) self.bind_property("tracklist", self._inner_pane, "end-child") self.connect("notify::focus-widget", self.__notify_focus_widget) for breakpoint in self._layout.breakpoints: self.add_breakpoint(breakpoint) self._box.append(self._header) self._box.append(self._toast) self.set_content(self._box) def __notify_focus_widget(self, win: Gtk.Window, param) -> None: self.user_editing = isinstance(win.get_property("focus-widget"), Gtk.Editable) def close(self, *args) -> None: """Close the window.""" super().close() def post_toast(self, title: str) -> Adw.Toast: """Create a new Adw.Toas and add it to the window.""" toast = Adw.Toast.new(title) self._toast.add_toast(toast) return toast def present(self, *args) -> None: """Present the window.""" super().present() @property def accelerators(self) -> list[ActionEntry]: """Get a list of accelerators for the Window.""" return [ActionEntry("reset-focus", self.set_focus, "Escape")]