Commit 6838be25 authored by Roman Alifanov's avatar Roman Alifanov

init InfoDictWidget

parent 9f3782cc
from gi.repository import Adw, Gtk
from .BaseWidget import BaseWidget
class InfoDictWidget(BaseWidget):
def create_row(self):
main_box = Adw.PreferencesRow()
main_box.set_activatable(False)
content_box = Gtk.Box(
orientation=Gtk.Orientation.VERTICAL,
margin_top=8,
margin_bottom=8,
margin_start=12,
margin_end=12
)
main_box.set_child(content_box)
title_label = Gtk.Label(
label=self.setting.name,
halign=Gtk.Align.START,
margin_bottom=6
)
content_box.append(title_label)
if self.setting.help:
subtitle_label = Gtk.Label(
label=self.setting.help,
halign=Gtk.Align.START,
wrap=True,
margin_bottom=8
)
subtitle_label.add_css_class("dim-label")
content_box.append(subtitle_label)
self.main_list = Gtk.ListBox()
self.main_list.set_selection_mode(Gtk.SelectionMode.NONE)
self.main_list.add_css_class('boxed-list')
content_box.append(self.main_list)
self._update_initial_state()
return main_box
def _create_value_label(self, value, level):
label = Gtk.Label(
label=str(value),
halign=Gtk.Align.END,
hexpand=True,
margin_start=12,
margin_end=12 * level
)
label.add_css_class('dim-label')
return label
def _render_value(self, value, container, level=0):
if isinstance(value, dict):
self._render_dict(value, container, level)
elif isinstance(value, (list, tuple)):
self._render_list(value, container, level)
else:
container.append(self._create_value_label(value, level))
def _render_dict(self, data, parent_container, level):
for key, value in data.items():
row = Adw.ActionRow()
row.set_title(key)
row.set_activatable(False)
if isinstance(value, (dict, list, tuple)):
value_widget = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
self._render_value(value, value_widget, level + 1)
else:
value_widget = self._create_value_label(value, level)
row.add_suffix(value_widget)
parent_container.append(row)
def _render_list(self, data, parent_container, level):
for item in data:
row = Adw.ActionRow()
row.set_title("•")
row.set_activatable(False)
if isinstance(item, (dict, list, tuple)):
value_widget = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
self._render_value(item, value_widget, level + 1)
else:
value_widget = self._create_value_label(item, level)
row.add_suffix(value_widget)
parent_container.append(row)
def _update_initial_state(self):
current_value = self.setting._get_backend_value() or {}
while child := self.main_list.get_first_child():
self.main_list.remove(child)
self._render_value(current_value, self.main_list, 0)
def update_display(self):
self._update_initial_state()
...@@ -6,6 +6,7 @@ from .NumStepper import NumStepper ...@@ -6,6 +6,7 @@ from .NumStepper import NumStepper
from .FileChooser import FileChooser from .FileChooser import FileChooser
from .ButtonWidget import ButtonWidget from .ButtonWidget import ButtonWidget
from .InfoLabelWidget import InfoLabelWidget from .InfoLabelWidget import InfoLabelWidget
from .InfoDictWidget import InfoDictWidget
class WidgetFactory: class WidgetFactory:
widget_map = { widget_map = {
...@@ -17,6 +18,7 @@ class WidgetFactory: ...@@ -17,6 +18,7 @@ class WidgetFactory:
'number': NumStepper, 'number': NumStepper,
'button': ButtonWidget, 'button': ButtonWidget,
'info_label': InfoLabelWidget, 'info_label': InfoLabelWidget,
'info_dict': InfoDictWidget,
} }
@staticmethod @staticmethod
......
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