Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
T
tuneit
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Ximper Linux
tuneit
Commits
99f31522
Commit
99f31522
authored
Feb 27, 2026
by
Roman Alifanov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
widgets: migrate to Adw row widgets, unify reset button
parent
ba2a1ed1
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
82 additions
and
154 deletions
+82
-154
BaseWidget.py
src/settings/setting/widgets/BaseWidget.py
+11
-14
BooleanWidget.py
src/settings/setting/widgets/BooleanWidget.py
+16
-25
ChoiceEntryWidget.py
src/settings/setting/widgets/ChoiceEntryWidget.py
+1
-10
ChoiceWidget.py
src/settings/setting/widgets/ChoiceWidget.py
+18
-26
EntryWidget.py
src/settings/setting/widgets/EntryWidget.py
+3
-17
FileChooser.py
src/settings/setting/widgets/FileChooser.py
+2
-13
NumStepper.py
src/settings/setting/widgets/NumStepper.py
+24
-42
RadioChoiceWidget.py
src/settings/setting/widgets/RadioChoiceWidget.py
+4
-4
ThemeChooserWidget.py
src/settings/setting/widgets/ThemeChooserWidget.py
+3
-3
No files found.
src/settings/setting/widgets/BaseWidget.py
View file @
99f31522
...
...
@@ -6,28 +6,25 @@ class BaseWidget:
self
.
setting
=
setting
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
(
icon_name
=
"edit-undo-symbolic"
,
icon_name
=
icon_name
,
valign
=
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
.
connect
(
"clicked"
,
self
.
_on_reset_clicked
)
self
.
reset_revealer
=
Gtk
.
Revealer
(
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
)
self
.
reset_prefix
=
self
.
reset_button
def
_on_reveal_changed
(
self
,
revealer
,
pspec
):
revealer
.
set_visible
(
revealer
.
get_reveal_child
())
def
update_display
(
self
):
raise
NotImplementedError
(
"update_display method should be implemented in the subclass"
)
...
...
src/settings/setting/widgets/BooleanWidget.py
View file @
99f31522
from
gi.repository
import
Adw
,
Gtk
from
gi.repository
import
Adw
from
.BaseWidget
import
BaseWidget
class
BooleanWidget
(
BaseWidget
):
def
create_row
(
self
):
self
.
row
=
Adw
.
Action
Row
(
title
=
self
.
setting
.
name
,
subtitle
=
self
.
setting
.
help
)
self
.
row
=
Adw
.
Switch
Row
(
title
=
self
.
setting
.
name
,
subtitle
=
self
.
setting
.
help
)
self
.
switch
=
Gtk
.
Switch
(
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
)
self
.
handler_id
=
self
.
row
.
connect
(
"notify::active"
,
self
.
_on_boolean_toggled
)
control_box
=
Gtk
.
Box
(
spacing
=
6
,
orientation
=
Gtk
.
Orientation
.
HORIZONTAL
)
control_box
.
append
(
self
.
reset_revealer
)
control_box
.
append
(
self
.
switch
)
self
.
row
.
add_prefix
(
self
.
reset_prefix
)
self
.
row
.
add_suffix
(
control_box
)
return
self
.
row
def
_update_initial_state
(
self
):
current_value
=
self
.
setting
.
_get_backend_value
()
is_active
=
current_value
==
self
.
setting
.
map
.
get
(
True
)
with
self
.
switch
.
handler_block
(
self
.
handler_id
):
self
.
switch
.
set_active
(
is_active
)
with
self
.
row
.
handler_block
(
self
.
handler_id
):
self
.
row
.
set_active
(
is_active
)
self
.
_update_reset_visibility
()
def
update_display
(
self
):
self
.
_update_initial_state
()
def
_on_boolean_toggled
(
self
,
switch
,
_
):
value
=
self
.
setting
.
map
.
get
(
True
)
if
switch
.
get_active
()
else
self
.
setting
.
map
.
get
(
False
)
def
_on_boolean_toggled
(
self
,
row
,
_
):
value
=
self
.
setting
.
map
.
get
(
True
)
if
row
.
get_active
()
else
self
.
setting
.
map
.
get
(
False
)
self
.
setting
.
_set_backend_value
(
value
)
self
.
_update_reset_visibility
()
...
...
@@ -43,17 +34,17 @@ class BooleanWidget(BaseWidget):
default_value
=
self
.
setting
.
map
.
get
(
self
.
setting
.
default
)
self
.
setting
.
_set_backend_value
(
default_value
)
with
self
.
switch
.
handler_block
(
self
.
handler_id
):
self
.
switch
.
set_active
(
self
.
setting
.
default
)
with
self
.
row
.
handler_block
(
self
.
handler_id
):
self
.
row
.
set_active
(
self
.
setting
.
default
)
self
.
_update_reset_visibility
()
def
_update_reset_visibility
(
self
):
current_value
=
self
.
setting
.
_get_backend_value
()
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
else
False
)
src/settings/setting/widgets/ChoiceEntryWidget.py
View file @
99f31522
...
...
@@ -21,16 +21,7 @@ class ChoiceEntryWidget(BaseWidget):
self
.
popover_button
.
add_css_class
(
"flat"
)
self
.
popover_button
.
insert_action_group
(
"choice"
,
action_group
)
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
)
self
.
row
.
add_prefix
(
self
.
reset_button
)
self
.
row
.
add_prefix
(
self
.
reset_prefix
)
self
.
row
.
add_suffix
(
self
.
popover_button
)
self
.
row
.
connect
(
"entry-activated"
,
self
.
_on_entry_activated
)
...
...
src/settings/setting/widgets/ChoiceWidget.py
View file @
99f31522
from
gi.repository
import
Adw
,
Gtk
from
.BaseWidget
import
BaseWidget
class
ChoiceWidget
(
BaseWidget
):
def
create_row
(
self
):
self
.
row
=
Adw
.
ActionRow
(
title
=
self
.
setting
.
name
,
subtitle
=
self
.
setting
.
help
)
self
.
model
=
Gtk
.
StringList
.
new
([])
expression
=
Gtk
.
PropertyExpression
.
new
(
Gtk
.
StringObject
,
None
,
"string"
)
self
.
dropdown
=
Gtk
.
DropDown
.
new
(
self
.
model
,
expression
)
self
.
dropdown
.
set_halign
(
Gtk
.
Align
.
CENTER
)
self
.
dropdown
.
set_valign
(
Gtk
.
Align
.
CENTER
)
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
=
Adw
.
ComboRow
(
title
=
self
.
setting
.
name
,
subtitle
=
self
.
setting
.
help
,
model
=
self
.
model
,
)
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
)
control_box
.
append
(
self
.
reset_revealer
)
control_box
.
append
(
self
.
dropdown
)
self
.
row
.
add_prefix
(
self
.
reset_prefix
)
self
.
row
.
add_suffix
(
control_box
)
return
self
.
row
def
update_display
(
self
):
...
...
@@ -36,22 +28,22 @@ class ChoiceWidget(BaseWidget):
def
_rebuild_items
(
self
):
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
.
dropdown
.
set_sensitive
(
bool
(
items
))
self
.
row
.
set_sensitive
(
bool
(
items
))
def
_update_dropdown_selection
(
self
):
if
not
self
.
setting
.
map
:
return
current_index
=
self
.
setting
.
_get_selected_row_index
()
with
self
.
dropdown
.
handler_block
(
self
.
handler_id
):
self
.
dropdown
.
set_selected
(
current_index
)
with
self
.
row
.
handler_block
(
self
.
handler_id
):
self
.
row
.
set_selected
(
current_index
)
def
_on_choice_changed
(
self
,
dropdown
,
_
):
def
_on_choice_changed
(
self
,
row
,
_
):
if
not
self
.
setting
.
map
:
return
selected
=
dropdown
.
get_selected
()
selected
=
row
.
get_selected
()
if
selected
<
0
or
selected
>=
len
(
self
.
setting
.
map
):
return
...
...
@@ -63,20 +55,20 @@ class ChoiceWidget(BaseWidget):
default_value
=
self
.
setting
.
_get_default_row_index
()
if
default_value
is
not
None
:
with
self
.
dropdown
.
handler_block
(
self
.
handler_id
):
self
.
dropdown
.
set_selected
(
default_value
)
with
self
.
row
.
handler_block
(
self
.
handler_id
):
self
.
row
.
set_selected
(
default_value
)
self
.
setting
.
_set_backend_value
(
self
.
setting
.
default
)
self
.
_update_reset_visibility
()
def
_update_reset_visibility
(
self
):
if
not
self
.
setting
.
map
:
self
.
reset_
revealer
.
set_reveal_child
(
False
)
self
.
reset_
button
.
set_sensitive
(
False
)
return
current_value
=
self
.
setting
.
_get_selected_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
if
default_value
is
not
None
else
False
...
...
src/settings/setting/widgets/EntryWidget.py
View file @
99f31522
from
gi.repository
import
Gtk
,
Adw
from
gi.repository
import
Adw
from
.BaseWidget
import
BaseWidget
class
EntryWidget
(
BaseWidget
):
def
create_row
(
self
):
self
.
row
=
Adw
.
EntryRow
(
title
=
self
.
setting
.
name
)
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
)
self
.
row
.
add_prefix
(
self
.
reset_button
)
self
.
row
.
add_prefix
(
self
.
reset_prefix
)
self
.
row
.
connect
(
"entry-activated"
,
self
.
_on_text_changed
)
return
self
.
row
...
...
@@ -25,14 +17,11 @@ class EntryWidget(BaseWidget):
def
_on_text_changed
(
self
,
row
):
new_value
=
row
.
get_text
()
self
.
setting
.
_set_backend_value
(
new_value
)
self
.
_update_reset_visibility
()
def
_on_reset_clicked
(
self
,
button
):
default_value
=
self
.
setting
.
default
self
.
setting
.
_set_backend_value
(
default_value
)
self
.
row
.
set_text
(
str
(
default_value
)
if
default_value
is
not
None
else
""
)
self
.
_update_reset_visibility
()
...
...
@@ -43,6 +32,4 @@ class EntryWidget(BaseWidget):
current_value
=
self
.
row
.
get_text
()
default_value
=
str
(
self
.
setting
.
default
)
is_default
=
current_value
==
default_value
self
.
reset_button
.
set_sensitive
(
not
is_default
)
\ No newline at end of file
self
.
reset_button
.
set_sensitive
(
current_value
!=
default_value
)
src/settings/setting/widgets/FileChooser.py
View file @
99f31522
...
...
@@ -18,19 +18,9 @@ class FileChooser(BaseWidget):
self
.
select_button
.
add_css_class
(
"flat"
)
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
:
self
.
row
=
Adw
.
EntryRow
(
title
=
self
.
setting
.
name
)
if
self
.
setting
.
default
is
not
None
:
self
.
row
.
add_prefix
(
self
.
reset_button
)
self
.
row
.
add_prefix
(
self
.
reset_prefix
)
self
.
row
.
add_suffix
(
self
.
select_button
)
self
.
row
.
connect
(
"entry-activated"
,
self
.
_on_entry_changed
)
else
:
...
...
@@ -47,8 +37,7 @@ class FileChooser(BaseWidget):
css_classes
=
[
"dim-label"
]
)
if
self
.
setting
.
default
is
not
None
:
self
.
row
.
add_prefix
(
self
.
reset_button
)
self
.
row
.
add_prefix
(
self
.
reset_prefix
)
self
.
row
.
add_suffix
(
self
.
info_label
)
self
.
row
.
add_suffix
(
self
.
select_button
)
...
...
src/settings/setting/widgets/NumStepper.py
View file @
99f31522
...
...
@@ -5,20 +5,6 @@ from .BaseWidget import BaseWidget
class
NumStepper
(
BaseWidget
):
def
create_row
(
self
):
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
)
adjustment
=
Gtk
.
Adjustment
(
...
...
@@ -27,22 +13,18 @@ class NumStepper(BaseWidget):
upper
=
upper
,
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
(
orientation
=
Gtk
.
Orientation
.
HORIZONTAL
,
spacing
=
6
,
margin_start
=
12
self
.
row
=
Adw
.
SpinRow
(
title
=
self
.
setting
.
name
,
subtitle
=
self
.
setting
.
help
,
adjustment
=
adjustment
,
digits
=
digits
,
)
control_box
.
append
(
self
.
reset_revealer
)
control_box
.
append
(
self
.
spin
)
self
.
row
.
set_sensitive
(
bool
(
map_data
))
self
.
row
.
add_prefix
(
self
.
reset_prefix
)
row
.
add_suffix
(
control_box
)
self
.
spin_handler_id
=
self
.
spin
.
connect
(
"value-changed"
,
self
.
_on_num_changed
)
self
.
handler_id
=
self
.
row
.
connect
(
"notify::value"
,
self
.
_on_num_changed
)
return
self
.
row
def
update_display
(
self
):
...
...
@@ -50,27 +32,27 @@ class NumStepper(BaseWidget):
return
current_value
=
self
.
setting
.
_get_backend_value
()
if
current_value
is
None
:
current_value
=
self
.
spin
.
get_adjustment
()
.
get_lower
()
with
self
.
spin
.
handler_block
(
self
.
spin_
handler_id
):
self
.
spin
.
set_value
(
float
(
current_value
))
current_value
=
self
.
row
.
get_adjustment
()
.
get_lower
()
with
self
.
row
.
handler_block
(
self
.
handler_id
):
self
.
row
.
set_value
(
float
(
current_value
))
self
.
_update_reset_visibility
()
def
on_map_updated
(
self
):
map_data
=
self
.
setting
.
map
or
{}
lower
,
upper
,
step
,
digits
=
self
.
_get_range_values
(
map_data
)
adjustment
=
self
.
spin
.
get_adjustment
()
with
self
.
spin
.
handler_block
(
self
.
spin_
handler_id
):
adjustment
=
self
.
row
.
get_adjustment
()
with
self
.
row
.
handler_block
(
self
.
handler_id
):
adjustment
.
set_lower
(
lower
)
adjustment
.
set_upper
(
upper
)
adjustment
.
set_step_increment
(
step
)
self
.
spin
.
set_digits
(
digits
)
self
.
spin
.
set_sensitive
(
bool
(
map_data
))
self
.
row
.
set_digits
(
digits
)
self
.
row
.
set_sensitive
(
bool
(
map_data
))
self
.
update_display
()
def
_on_num_changed
(
self
,
widget
):
selected_value
=
widget
.
get_value
()
def
_on_num_changed
(
self
,
row
,
_
):
selected_value
=
row
.
get_value
()
if
self
.
spin
.
get_digits
()
==
0
:
if
self
.
row
.
get_digits
()
==
0
:
selected_value
=
int
(
selected_value
)
self
.
setting
.
_set_backend_value
(
selected_value
)
...
...
@@ -81,24 +63,24 @@ class NumStepper(BaseWidget):
default_value
=
self
.
setting
.
default
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
.
spin
.
set_value
(
float
(
default_value
))
self
.
row
.
set_value
(
float
(
default_value
))
self
.
_update_reset_visibility
()
def
_update_reset_visibility
(
self
):
if
not
self
.
setting
.
map
:
self
.
reset_
revealer
.
set_reveal_child
(
False
)
self
.
reset_
button
.
set_sensitive
(
False
)
return
current_value
=
self
.
setting
.
_get_backend_value
()
if
current_value
is
None
:
self
.
reset_
revealer
.
set_reveal_child
(
False
)
self
.
reset_
button
.
set_sensitive
(
False
)
return
current_value
=
float
(
current_value
)
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
)
...
...
src/settings/setting/widgets/RadioChoiceWidget.py
View file @
99f31522
...
...
@@ -60,8 +60,8 @@ class RadioChoiceWidget(BaseWidget):
self
.
radio_buttons
=
{}
self
.
_build_radio_buttons
()
self
.
reset_
revealer
.
set_halign
(
Gtk
.
Align
.
END
)
title_horizontal_box
.
append
(
self
.
reset_
revealer
)
self
.
reset_
prefix
.
set_halign
(
Gtk
.
Align
.
END
)
title_horizontal_box
.
append
(
self
.
reset_
prefix
)
self
.
_update_reset_visibility
()
return
self
.
row
...
...
@@ -131,11 +131,11 @@ class RadioChoiceWidget(BaseWidget):
def
_update_reset_visibility
(
self
):
if
not
self
.
setting
.
map
:
self
.
reset_
revealer
.
set_reveal_child
(
False
)
self
.
reset_
button
.
set_sensitive
(
False
)
return
current_value
=
self
.
setting
.
_get_backend_value
()
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
)
src/settings/setting/widgets/ThemeChooserWidget.py
View file @
99f31522
...
...
@@ -93,8 +93,8 @@ class ThemeChooserWidget(BaseWidget):
subtitle_label
.
add_css_class
(
"dim-label"
)
title_box
.
append
(
subtitle_label
)
self
.
reset_
revealer
.
set_halign
(
Gtk
.
Align
.
END
)
header_box
.
append
(
self
.
reset_
revealer
)
self
.
reset_
prefix
.
set_halign
(
Gtk
.
Align
.
END
)
header_box
.
append
(
self
.
reset_
prefix
)
# FlowBox for theme cards
self
.
flowbox
=
Gtk
.
FlowBox
(
...
...
@@ -336,6 +336,6 @@ class ThemeChooserWidget(BaseWidget):
current_value
=
self
.
setting
.
_get_backend_value
()
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
)
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment