|
|
|
|
@ -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) |
|
|
|
|
|
|
|
|
|
|