emmental/emmental/sidebar/header.py

82 lines
3.4 KiB
Python

# 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