# Copyright 2022 (c) Anna Schumaker. """A sidebar Section Header widget.""" from gi.repository import GObject from gi.repository import Gtk from gi.repository import Adw from .title import Title class Header(Gtk.Box): """The Section Header.""" icon_name = GObject.Property(type=str) title = GObject.Property(type=str) subtitle = GObject.Property(type=str) pending = GObject.Property(type=bool, default=False) progress = GObject.Property(type=float) active = GObject.Property(type=bool, default=False) extra_widget = GObject.Property(type=Gtk.Widget) reveal_widget = GObject.Property(type=Gtk.Widget) animation = GObject.Property(type=Gtk.RevealerTransitionType, default=Gtk.RevealerTransitionType.SLIDE_UP) def __init__(self, icon_name: str = "image-missing", title: str = "", subtitle: str = "", extra_widget: Gtk.Widget = None, **kwargs): """Initialize a row Header widget.""" super().__init__(icon_name=icon_name, extra_widget=extra_widget, title=title, subtitle=subtitle, orientation=Gtk.Orientation.VERTICAL, **kwargs) self._overlay = Gtk.Overlay(css_name="button") self._box = Gtk.Box.new(Gtk.Orientation.HORIZONTAL, spacing=12) self._icon = Gtk.Image(icon_name=self.icon_name, icon_size=Gtk.IconSize.LARGE) self._title = Title(title=self.title, subtitle=self.subtitle) self._extra = Adw.Bin(child=self.extra_widget, valign=Gtk.Align.CENTER) self._arrow = Gtk.Image(icon_name="go-down-symbolic") self._progress = Gtk.ProgressBar(valign=Gtk.Align.END, visible=self.pending) self._revealer = Gtk.Revealer(transition_type=self.animation) self._clicked = Gtk.GestureClick() self._arrow.add_css_class("emmental-sidebar-arrow") self._progress.add_css_class("osd") self.bind_property("icon-name", self._icon, "icon-name") self.bind_property("title", self._title, "title") self.bind_property("subtitle", self._title, "subtitle") self.bind_property("extra-widget", self._extra, "child") self.bind_property("pending", self._progress, "visible") self.bind_property("progress", self._progress, "fraction") self.bind_property("active", self._revealer, "reveal-child") self.bind_property("active", self._revealer, "vexpand") self.bind_property("reveal-widget", self._revealer, "child") self.bind_property("animation", self._revealer, "transition-type") self._clicked.connect("released", self.activate) self.connect("notify::active", self.__notify_active) self._box.append(self._icon) self._box.append(self._title) self._box.append(self._extra) self._box.append(self._arrow) self._overlay.set_child(self._box) self._overlay.add_overlay(self._progress) self._overlay.add_controller(self._clicked) self.append(self._overlay) self.append(self._revealer) def __notify_active(self, header, param) -> None: if self.active: self._arrow.set_state_flags(Gtk.StateFlags.CHECKED, False) else: self._arrow.unset_state_flags(Gtk.StateFlags.CHECKED) def activate(self, *args) -> None: """Activate the Header.""" self.active = True