Browse Source

fix: add fallbacks for old libadwaita widgets

master
Matteo Benedetto 2 weeks ago
parent
commit
26deb509f6
  1. 92
      cellar-gtk.py

92
cellar-gtk.py

@ -184,6 +184,86 @@ class CompatBanner(Gtk.Revealer):
self.set_reveal_child(revealed)
class CompatToolbarView(Gtk.Box):
"""Fallback for `Adw.ToolbarView` (available since libadwaita 1.4)."""
def __init__(self) -> None:
super().__init__(orientation=Gtk.Orientation.VERTICAL)
self._content: Gtk.Widget | None = None
def add_top_bar(self, widget: Gtk.Widget) -> None:
self.append(widget)
def set_content(self, widget: Gtk.Widget) -> None:
if self._content is not None:
self.remove(self._content)
self._content = widget
widget.set_vexpand(True)
self.append(widget)
class CompatEntryRow(Adw.ActionRow):
"""Fallback for `Adw.EntryRow` (available since libadwaita 1.2)."""
def __init__(self, title: str = ""):
super().__init__(title=title)
self._entry = Gtk.Entry()
self._entry.set_hexpand(True)
self.add_suffix(self._entry)
self.set_activatable_widget(self._entry)
def get_text(self) -> str:
return self._entry.get_text()
def set_text(self, text: str) -> None:
self._entry.set_text(text)
class CompatSwitchRow(Adw.ActionRow):
"""Fallback for `Adw.SwitchRow` (available since libadwaita 1.4)."""
def __init__(self, title: str = ""):
super().__init__(title=title)
self._switch = Gtk.Switch()
self._switch.set_valign(Gtk.Align.CENTER)
self.add_suffix(self._switch)
self.set_activatable_widget(self._switch)
def get_active(self) -> bool:
return self._switch.get_active()
def set_active(self, active: bool) -> None:
self._switch.set_active(active)
def connect_active_notify(self, callback: Callable[..., None]) -> None:
self._switch.connect("notify::active", callback)
def make_toolbar_view() -> Gtk.Widget:
if hasattr(Adw, "ToolbarView"):
return Adw.ToolbarView()
return CompatToolbarView()
def make_entry_row(title: str) -> Gtk.Widget:
if hasattr(Adw, "EntryRow"):
return Adw.EntryRow(title=title)
return CompatEntryRow(title=title)
def make_switch_row(title: str) -> Gtk.Widget:
if hasattr(Adw, "SwitchRow"):
return Adw.SwitchRow(title=title)
return CompatSwitchRow(title=title)
def connect_switch_row_active(row: Gtk.Widget, callback: Callable[..., None]) -> None:
if hasattr(row, "connect_active_notify"):
row.connect_active_notify(callback) # type: ignore[attr-defined]
else:
row.connect("notify::active", callback)
# ── Settings Dialog ─────────────────────────────────────────────
class SettingsWindow(Adw.Window):
"""Preferences dialog using libadwaita widgets."""
@ -201,7 +281,7 @@ class SettingsWindow(Adw.Window):
self.set_modal(True)
self.set_default_size(480, -1)
toolbar_view = Adw.ToolbarView()
toolbar_view = make_toolbar_view()
header = Adw.HeaderBar()
cancel_btn = Gtk.Button(label="Annulla")
@ -222,11 +302,11 @@ class SettingsWindow(Adw.Window):
"locale di Bottles usata per l'installazione."
)
self.server_row = Adw.EntryRow(title="Indirizzo server")
self.server_row = make_entry_row("Indirizzo server")
self.server_row.set_text(config.server_url)
group.add(self.server_row)
self.bottles_row = Adw.EntryRow(title="Cartella Bottles")
self.bottles_row = make_entry_row("Cartella Bottles")
self.bottles_row.set_text(config.bottles_dir)
group.add(self.bottles_row)
@ -444,9 +524,9 @@ class CellarWindow(Adw.ApplicationWindow):
self.bottles_info_row.add_css_class("property")
info_group.add(self.bottles_info_row)
self.replace_row = Adw.SwitchRow(title="Sostituisci installazioni esistenti")
self.replace_row = make_switch_row("Sostituisci installazioni esistenti")
self.replace_row.set_active(self.config.replace_existing)
self.replace_row.connect("notify::active", self._store_replace_preference)
connect_switch_row_active(self.replace_row, self._store_replace_preference)
info_group.add(self.replace_row)
content_box.append(info_group)
@ -492,7 +572,7 @@ class CellarWindow(Adw.ApplicationWindow):
self.toast_overlay.set_child(outer_box)
# ── ToolbarView ──
toolbar_view = Adw.ToolbarView()
toolbar_view = make_toolbar_view()
toolbar_view.add_top_bar(header)
toolbar_view.set_content(self.toast_overlay)

Loading…
Cancel
Save