Commit 99f31522 authored by Roman Alifanov's avatar Roman Alifanov

widgets: migrate to Adw row widgets, unify reset button

parent ba2a1ed1
...@@ -6,28 +6,25 @@ class BaseWidget: ...@@ -6,28 +6,25 @@ class BaseWidget:
self.setting = setting self.setting = setting
self.logger = logging.getLogger(f"{self.__class__.__name__}") self.logger = logging.getLogger(f"{self.__class__.__name__}")
if setting.default is not None:
icon_name = "edit-undo-symbolic"
tooltip = _("Restore Default")
else:
icon_name = "action-unavailable-symbolic"
tooltip = _("No default value")
self.reset_button = Gtk.Button( self.reset_button = Gtk.Button(
icon_name="edit-undo-symbolic", icon_name=icon_name,
valign=Gtk.Align.CENTER, valign=Gtk.Align.CENTER,
halign=Gtk.Align.CENTER, halign=Gtk.Align.CENTER,
tooltip_text=_("Restore Default") tooltip_text=tooltip,
sensitive=False
) )
self.reset_button.add_css_class('flat') self.reset_button.add_css_class('flat')
self.reset_button.connect("clicked", self._on_reset_clicked) self.reset_button.connect("clicked", self._on_reset_clicked)
self.reset_revealer = Gtk.Revealer( self.reset_prefix = self.reset_button
transition_type=Gtk.RevealerTransitionType.CROSSFADE,
transition_duration=150,
child=self.reset_button,
reveal_child=False,
halign=Gtk.Align.END
)
self.reset_revealer.set_visible(False)
self.reset_revealer.connect("notify::reveal-child", self._on_reveal_changed)
def _on_reveal_changed(self, revealer, pspec):
revealer.set_visible(revealer.get_reveal_child())
def update_display(self): def update_display(self):
raise NotImplementedError("update_display method should be implemented in the subclass") raise NotImplementedError("update_display method should be implemented in the subclass")
......
from gi.repository import Adw, Gtk from gi.repository import Adw
from .BaseWidget import BaseWidget from .BaseWidget import BaseWidget
class BooleanWidget(BaseWidget): class BooleanWidget(BaseWidget):
def create_row(self): def create_row(self):
self.row = Adw.ActionRow(title=self.setting.name, subtitle=self.setting.help) self.row = Adw.SwitchRow(title=self.setting.name, subtitle=self.setting.help)
self.switch = Gtk.Switch( self.handler_id = self.row.connect("notify::active", self._on_boolean_toggled)
valign=Gtk.Align.CENTER,
halign=Gtk.Align.CENTER,
)
self.handler_id = self.switch.connect("notify::active", self._on_boolean_toggled)
self.row.set_activatable_widget(self.switch)
control_box = Gtk.Box(spacing=6, orientation=Gtk.Orientation.HORIZONTAL) self.row.add_prefix(self.reset_prefix)
control_box.append(self.reset_revealer)
control_box.append(self.switch)
self.row.add_suffix(control_box)
return self.row return self.row
def _update_initial_state(self): def _update_initial_state(self):
current_value = self.setting._get_backend_value() current_value = self.setting._get_backend_value()
is_active = current_value == self.setting.map.get(True) is_active = current_value == self.setting.map.get(True)
with self.switch.handler_block(self.handler_id): with self.row.handler_block(self.handler_id):
self.switch.set_active(is_active) self.row.set_active(is_active)
self._update_reset_visibility() self._update_reset_visibility()
def update_display(self): def update_display(self):
self._update_initial_state() self._update_initial_state()
def _on_boolean_toggled(self, switch, _): def _on_boolean_toggled(self, row, _):
value = self.setting.map.get(True) if switch.get_active() else self.setting.map.get(False) value = self.setting.map.get(True) if row.get_active() else self.setting.map.get(False)
self.setting._set_backend_value(value) self.setting._set_backend_value(value)
self._update_reset_visibility() self._update_reset_visibility()
...@@ -43,17 +34,17 @@ class BooleanWidget(BaseWidget): ...@@ -43,17 +34,17 @@ class BooleanWidget(BaseWidget):
default_value = self.setting.map.get(self.setting.default) default_value = self.setting.map.get(self.setting.default)
self.setting._set_backend_value(default_value) self.setting._set_backend_value(default_value)
with self.switch.handler_block(self.handler_id): with self.row.handler_block(self.handler_id):
self.switch.set_active(self.setting.default) self.row.set_active(self.setting.default)
self._update_reset_visibility() self._update_reset_visibility()
def _update_reset_visibility(self): def _update_reset_visibility(self):
current_value = self.setting._get_backend_value() current_value = self.setting._get_backend_value()
default_value = self.setting.map.get(self.setting.default) default_value = self.setting.map.get(self.setting.default)
self.reset_revealer.set_reveal_child( self.reset_button.set_sensitive(
current_value != default_value if default_value is not None current_value != default_value if default_value is not None
else False else False
) )
...@@ -21,16 +21,7 @@ class ChoiceEntryWidget(BaseWidget): ...@@ -21,16 +21,7 @@ class ChoiceEntryWidget(BaseWidget):
self.popover_button.add_css_class("flat") self.popover_button.add_css_class("flat")
self.popover_button.insert_action_group("choice", action_group) self.popover_button.insert_action_group("choice", action_group)
if self.setting.default is not None: self.row.add_prefix(self.reset_prefix)
self.reset_button = Gtk.Button(
icon_name="edit-undo-symbolic",
valign=Gtk.Align.CENTER,
tooltip_text=_("Restore Default"),
)
self.reset_button.add_css_class("flat")
self.reset_button.connect("clicked", self._on_reset_clicked)
self.row.add_prefix(self.reset_button)
self.row.add_suffix(self.popover_button) self.row.add_suffix(self.popover_button)
self.row.connect("entry-activated", self._on_entry_activated) self.row.connect("entry-activated", self._on_entry_activated)
......
from gi.repository import Adw, Gtk from gi.repository import Adw, Gtk
from .BaseWidget import BaseWidget from .BaseWidget import BaseWidget
class ChoiceWidget(BaseWidget): class ChoiceWidget(BaseWidget):
def create_row(self): def create_row(self):
self.row = Adw.ActionRow(title=self.setting.name, subtitle=self.setting.help)
self.model = Gtk.StringList.new([]) self.model = Gtk.StringList.new([])
expression = Gtk.PropertyExpression.new(Gtk.StringObject, None, "string") self.row = Adw.ComboRow(
self.dropdown = Gtk.DropDown.new(self.model, expression) title=self.setting.name,
self.dropdown.set_halign(Gtk.Align.CENTER) subtitle=self.setting.help,
self.dropdown.set_valign(Gtk.Align.CENTER) model=self.model,
btn = self.dropdown.get_first_child() )
btn.add_css_class("flat")
btn.add_css_class("dropdown-flat")
self.handler_id = self.dropdown.connect("notify::selected", self._on_choice_changed)
self.row.set_activatable_widget(self.dropdown) self.handler_id = self.row.connect("notify::selected", self._on_choice_changed)
control_box = Gtk.Box(spacing=6, orientation=Gtk.Orientation.HORIZONTAL) self.row.add_prefix(self.reset_prefix)
control_box.append(self.reset_revealer)
control_box.append(self.dropdown)
self.row.add_suffix(control_box)
return self.row return self.row
def update_display(self): def update_display(self):
...@@ -36,22 +28,22 @@ class ChoiceWidget(BaseWidget): ...@@ -36,22 +28,22 @@ class ChoiceWidget(BaseWidget):
def _rebuild_items(self): def _rebuild_items(self):
items = list(self.setting.map.keys()) if self.setting.map else [] items = list(self.setting.map.keys()) if self.setting.map else []
with self.dropdown.handler_block(self.handler_id): with self.row.handler_block(self.handler_id):
self.model.splice(0, self.model.get_n_items(), items) self.model.splice(0, self.model.get_n_items(), items)
self.dropdown.set_sensitive(bool(items)) self.row.set_sensitive(bool(items))
def _update_dropdown_selection(self): def _update_dropdown_selection(self):
if not self.setting.map: if not self.setting.map:
return return
current_index = self.setting._get_selected_row_index() current_index = self.setting._get_selected_row_index()
with self.dropdown.handler_block(self.handler_id): with self.row.handler_block(self.handler_id):
self.dropdown.set_selected(current_index) self.row.set_selected(current_index)
def _on_choice_changed(self, dropdown, _): def _on_choice_changed(self, row, _):
if not self.setting.map: if not self.setting.map:
return return
selected = dropdown.get_selected() selected = row.get_selected()
if selected < 0 or selected >= len(self.setting.map): if selected < 0 or selected >= len(self.setting.map):
return return
...@@ -63,20 +55,20 @@ class ChoiceWidget(BaseWidget): ...@@ -63,20 +55,20 @@ class ChoiceWidget(BaseWidget):
default_value = self.setting._get_default_row_index() default_value = self.setting._get_default_row_index()
if default_value is not None: if default_value is not None:
with self.dropdown.handler_block(self.handler_id): with self.row.handler_block(self.handler_id):
self.dropdown.set_selected(default_value) self.row.set_selected(default_value)
self.setting._set_backend_value(self.setting.default) self.setting._set_backend_value(self.setting.default)
self._update_reset_visibility() self._update_reset_visibility()
def _update_reset_visibility(self): def _update_reset_visibility(self):
if not self.setting.map: if not self.setting.map:
self.reset_revealer.set_reveal_child(False) self.reset_button.set_sensitive(False)
return return
current_value = self.setting._get_selected_row_index() current_value = self.setting._get_selected_row_index()
default_value = self.setting._get_default_row_index() default_value = self.setting._get_default_row_index()
self.reset_revealer.set_reveal_child( self.reset_button.set_sensitive(
current_value != default_value current_value != default_value
if default_value is not None if default_value is not None
else False else False
......
from gi.repository import Gtk, Adw from gi.repository import Adw
from .BaseWidget import BaseWidget from .BaseWidget import BaseWidget
class EntryWidget(BaseWidget): class EntryWidget(BaseWidget):
def create_row(self): def create_row(self):
self.row = Adw.EntryRow(title=self.setting.name) self.row = Adw.EntryRow(title=self.setting.name)
if self.setting.default is not None: self.row.add_prefix(self.reset_prefix)
self.reset_button = Gtk.Button(
icon_name="edit-undo-symbolic",
valign=Gtk.Align.CENTER,
tooltip_text=_("Restore Default")
)
self.reset_button.add_css_class("flat")
self.reset_button.connect("clicked", self._on_reset_clicked)
self.row.add_prefix(self.reset_button)
self.row.connect("entry-activated", self._on_text_changed) self.row.connect("entry-activated", self._on_text_changed)
return self.row return self.row
...@@ -25,14 +17,11 @@ class EntryWidget(BaseWidget): ...@@ -25,14 +17,11 @@ class EntryWidget(BaseWidget):
def _on_text_changed(self, row): def _on_text_changed(self, row):
new_value = row.get_text() new_value = row.get_text()
self.setting._set_backend_value(new_value) self.setting._set_backend_value(new_value)
self._update_reset_visibility() self._update_reset_visibility()
def _on_reset_clicked(self, button): def _on_reset_clicked(self, button):
default_value = self.setting.default default_value = self.setting.default
self.setting._set_backend_value(default_value) self.setting._set_backend_value(default_value)
self.row.set_text(str(default_value) if default_value is not None else "") self.row.set_text(str(default_value) if default_value is not None else "")
self._update_reset_visibility() self._update_reset_visibility()
...@@ -43,6 +32,4 @@ class EntryWidget(BaseWidget): ...@@ -43,6 +32,4 @@ class EntryWidget(BaseWidget):
current_value = self.row.get_text() current_value = self.row.get_text()
default_value = str(self.setting.default) default_value = str(self.setting.default)
is_default = current_value == default_value self.reset_button.set_sensitive(current_value != default_value)
self.reset_button.set_sensitive(not is_default)
\ No newline at end of file
...@@ -18,19 +18,9 @@ class FileChooser(BaseWidget): ...@@ -18,19 +18,9 @@ class FileChooser(BaseWidget):
self.select_button.add_css_class("flat") self.select_button.add_css_class("flat")
self.select_button.connect("clicked", self._on_button_clicked) self.select_button.connect("clicked", self._on_button_clicked)
if self.setting.default is not None:
self.reset_button = Gtk.Button(
icon_name="edit-undo-symbolic",
valign=Gtk.Align.CENTER,
tooltip_text=_("Restore Default")
)
self.reset_button.add_css_class("flat")
self.reset_button.connect("clicked", self._on_reset_clicked)
if not self.multiple_mode and not self.folder_mode: if not self.multiple_mode and not self.folder_mode:
self.row = Adw.EntryRow(title=self.setting.name) self.row = Adw.EntryRow(title=self.setting.name)
if self.setting.default is not None: self.row.add_prefix(self.reset_prefix)
self.row.add_prefix(self.reset_button)
self.row.add_suffix(self.select_button) self.row.add_suffix(self.select_button)
self.row.connect("entry-activated", self._on_entry_changed) self.row.connect("entry-activated", self._on_entry_changed)
else: else:
...@@ -47,8 +37,7 @@ class FileChooser(BaseWidget): ...@@ -47,8 +37,7 @@ class FileChooser(BaseWidget):
css_classes=["dim-label"] css_classes=["dim-label"]
) )
if self.setting.default is not None: self.row.add_prefix(self.reset_prefix)
self.row.add_prefix(self.reset_button)
self.row.add_suffix(self.info_label) self.row.add_suffix(self.info_label)
self.row.add_suffix(self.select_button) self.row.add_suffix(self.select_button)
......
...@@ -5,20 +5,6 @@ from .BaseWidget import BaseWidget ...@@ -5,20 +5,6 @@ from .BaseWidget import BaseWidget
class NumStepper(BaseWidget): class NumStepper(BaseWidget):
def create_row(self): def create_row(self):
map_data = self.setting.map or {} map_data = self.setting.map or {}
map_keys = list(map_data.keys())
row = Adw.ActionRow(
title=self.setting.name,
subtitle=self.setting.help,
activatable=False
)
self.row = row
self.spin = Gtk.SpinButton(
valign=Gtk.Align.CENTER,
halign=Gtk.Align.CENTER,
css_classes=["flat"],
)
lower, upper, step, digits = self._get_range_values(map_data) lower, upper, step, digits = self._get_range_values(map_data)
adjustment = Gtk.Adjustment( adjustment = Gtk.Adjustment(
...@@ -27,22 +13,18 @@ class NumStepper(BaseWidget): ...@@ -27,22 +13,18 @@ class NumStepper(BaseWidget):
upper=upper, upper=upper,
step_increment=step, step_increment=step,
) )
self.spin.set_adjustment(adjustment)
self.spin.set_sensitive(bool(map_data))
if "digits" in map_keys:
self.spin.set_digits(map_data["digits"])
control_box = Gtk.Box( self.row = Adw.SpinRow(
orientation=Gtk.Orientation.HORIZONTAL, title=self.setting.name,
spacing=6, subtitle=self.setting.help,
margin_start=12 adjustment=adjustment,
digits=digits,
) )
control_box.append(self.reset_revealer) self.row.set_sensitive(bool(map_data))
control_box.append(self.spin)
self.row.add_prefix(self.reset_prefix)
row.add_suffix(control_box) self.handler_id = self.row.connect("notify::value", self._on_num_changed)
self.spin_handler_id = self.spin.connect("value-changed", self._on_num_changed)
return self.row return self.row
def update_display(self): def update_display(self):
...@@ -50,27 +32,27 @@ class NumStepper(BaseWidget): ...@@ -50,27 +32,27 @@ class NumStepper(BaseWidget):
return return
current_value = self.setting._get_backend_value() current_value = self.setting._get_backend_value()
if current_value is None: if current_value is None:
current_value = self.spin.get_adjustment().get_lower() current_value = self.row.get_adjustment().get_lower()
with self.spin.handler_block(self.spin_handler_id): with self.row.handler_block(self.handler_id):
self.spin.set_value(float(current_value)) self.row.set_value(float(current_value))
self._update_reset_visibility() self._update_reset_visibility()
def on_map_updated(self): def on_map_updated(self):
map_data = self.setting.map or {} map_data = self.setting.map or {}
lower, upper, step, digits = self._get_range_values(map_data) lower, upper, step, digits = self._get_range_values(map_data)
adjustment = self.spin.get_adjustment() adjustment = self.row.get_adjustment()
with self.spin.handler_block(self.spin_handler_id): with self.row.handler_block(self.handler_id):
adjustment.set_lower(lower) adjustment.set_lower(lower)
adjustment.set_upper(upper) adjustment.set_upper(upper)
adjustment.set_step_increment(step) adjustment.set_step_increment(step)
self.spin.set_digits(digits) self.row.set_digits(digits)
self.spin.set_sensitive(bool(map_data)) self.row.set_sensitive(bool(map_data))
self.update_display() self.update_display()
def _on_num_changed(self, widget): def _on_num_changed(self, row, _):
selected_value = widget.get_value() selected_value = row.get_value()
if self.spin.get_digits() == 0: if self.row.get_digits() == 0:
selected_value = int(selected_value) selected_value = int(selected_value)
self.setting._set_backend_value(selected_value) self.setting._set_backend_value(selected_value)
...@@ -81,24 +63,24 @@ class NumStepper(BaseWidget): ...@@ -81,24 +63,24 @@ class NumStepper(BaseWidget):
default_value = self.setting.default default_value = self.setting.default
if default_value is not None: if default_value is not None:
with self.spin.handler_block(self.spin_handler_id): with self.row.handler_block(self.handler_id):
self.setting._set_backend_value(default_value) self.setting._set_backend_value(default_value)
self.spin.set_value(float(default_value)) self.row.set_value(float(default_value))
self._update_reset_visibility() self._update_reset_visibility()
def _update_reset_visibility(self): def _update_reset_visibility(self):
if not self.setting.map: if not self.setting.map:
self.reset_revealer.set_reveal_child(False) self.reset_button.set_sensitive(False)
return return
current_value = self.setting._get_backend_value() current_value = self.setting._get_backend_value()
if current_value is None: if current_value is None:
self.reset_revealer.set_reveal_child(False) self.reset_button.set_sensitive(False)
return return
current_value = float(current_value) current_value = float(current_value)
default_value = self.setting.default default_value = self.setting.default
self.reset_revealer.set_reveal_child( self.reset_button.set_sensitive(
current_value != default_value if default_value is not None current_value != default_value if default_value is not None
else False else False
) )
......
...@@ -60,8 +60,8 @@ class RadioChoiceWidget(BaseWidget): ...@@ -60,8 +60,8 @@ class RadioChoiceWidget(BaseWidget):
self.radio_buttons = {} self.radio_buttons = {}
self._build_radio_buttons() self._build_radio_buttons()
self.reset_revealer.set_halign(Gtk.Align.END) self.reset_prefix.set_halign(Gtk.Align.END)
title_horizontal_box.append(self.reset_revealer) title_horizontal_box.append(self.reset_prefix)
self._update_reset_visibility() self._update_reset_visibility()
return self.row return self.row
...@@ -131,11 +131,11 @@ class RadioChoiceWidget(BaseWidget): ...@@ -131,11 +131,11 @@ class RadioChoiceWidget(BaseWidget):
def _update_reset_visibility(self): def _update_reset_visibility(self):
if not self.setting.map: if not self.setting.map:
self.reset_revealer.set_reveal_child(False) self.reset_button.set_sensitive(False)
return return
current_value = self.setting._get_backend_value() current_value = self.setting._get_backend_value()
default_value = self.setting.default default_value = self.setting.default
self.reset_revealer.set_reveal_child( self.reset_button.set_sensitive(
current_value != default_value if default_value is not None else False current_value != default_value if default_value is not None else False
) )
...@@ -93,8 +93,8 @@ class ThemeChooserWidget(BaseWidget): ...@@ -93,8 +93,8 @@ class ThemeChooserWidget(BaseWidget):
subtitle_label.add_css_class("dim-label") subtitle_label.add_css_class("dim-label")
title_box.append(subtitle_label) title_box.append(subtitle_label)
self.reset_revealer.set_halign(Gtk.Align.END) self.reset_prefix.set_halign(Gtk.Align.END)
header_box.append(self.reset_revealer) header_box.append(self.reset_prefix)
# FlowBox for theme cards # FlowBox for theme cards
self.flowbox = Gtk.FlowBox( self.flowbox = Gtk.FlowBox(
...@@ -336,6 +336,6 @@ class ThemeChooserWidget(BaseWidget): ...@@ -336,6 +336,6 @@ class ThemeChooserWidget(BaseWidget):
current_value = self.setting._get_backend_value() current_value = self.setting._get_backend_value()
default_value = self.setting.default default_value = self.setting.default
self.reset_revealer.set_reveal_child( self.reset_button.set_sensitive(
current_value != default_value if default_value is not None else False current_value != default_value if default_value is not None else False
) )
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment