Commit 3938bcd9 authored by Roman Alifanov's avatar Roman Alifanov

implementation of Info Label Widget and update_interval

parent 3bfbe556
import threading
import time
from ..searcher import SearcherFactory from ..searcher import SearcherFactory
from .widgets import WidgetFactory from .widgets import WidgetFactory
from ..backends import backend_factory from ..backends import backend_factory
...@@ -5,6 +7,7 @@ from ..daemon_client import dclient ...@@ -5,6 +7,7 @@ from ..daemon_client import dclient
from ..tools.gvariant import convert_by_gvariant from ..tools.gvariant import convert_by_gvariant
from ..widgets.service_dialog import ServiceNotStartedDialog from ..widgets.service_dialog import ServiceNotStartedDialog
from gi.repository import GLib
dialog_presented = False dialog_presented = False
...@@ -12,6 +15,8 @@ class Setting: ...@@ -12,6 +15,8 @@ class Setting:
def __init__(self, setting_data, module): def __init__(self, setting_data, module):
self._ = module.get_translation self._ = module.get_translation
self.widget = None
self.name = self._(setting_data['name']) self.name = self._(setting_data['name'])
self.root = setting_data.get('root', False) self.root = setting_data.get('root', False)
...@@ -60,6 +65,10 @@ class Setting: ...@@ -60,6 +65,10 @@ class Setting:
self.gtype = self.gtype[0] self.gtype = self.gtype[0]
else: else:
self.gtype = self.gtype self.gtype = self.gtype
self.update_interval = setting_data.get('update_interval', None)
if self.update_interval:
self._start_update_thread()
def _default_map(self): def _default_map(self):
if self.type == 'boolean': if self.type == 'boolean':
...@@ -98,8 +107,8 @@ class Setting: ...@@ -98,8 +107,8 @@ class Setting:
if self.root is True: if self.root is True:
print("Root is true") print("Root is true")
if dclient is not None: if dclient is not None:
widget = WidgetFactory.create_widget(self) self.widget = WidgetFactory.create_widget(self)
return widget.create_row() if widget else None return self.widget.create_row() if self.widget else None
else: else:
global dialog_presented global dialog_presented
if dialog_presented is False: if dialog_presented is False:
...@@ -111,8 +120,8 @@ class Setting: ...@@ -111,8 +120,8 @@ class Setting:
dialog_presented = True dialog_presented = True
return None return None
widget = WidgetFactory.create_widget(self) self.widget = WidgetFactory.create_widget(self)
return widget.create_row() if widget else None return self.widget.create_row() if self.widget else None
def _get_selected_row_index(self): def _get_selected_row_index(self):
current_value = self._get_backend_value() current_value = self._get_backend_value()
...@@ -121,8 +130,8 @@ class Setting: ...@@ -121,8 +130,8 @@ class Setting:
def _get_default_row_index(self): def _get_default_row_index(self):
return list(self.map.values()).index(self.default) if self.default in self.map.values() else None return list(self.map.values()).index(self.default) if self.default in self.map.values() else None
def _get_backend_value(self): def _get_backend_value(self, force=False):
if self._current_value is None: if self._current_value is None or force is True:
backend = self._get_backend() backend = self._get_backend()
value = self.default value = self.default
...@@ -154,3 +163,21 @@ class Setting: ...@@ -154,3 +163,21 @@ class Setting:
if not backend: if not backend:
print(f"Бекенд {self.backend} не зарегистрирован.") print(f"Бекенд {self.backend} не зарегистрирован.")
return backend return backend
def _start_update_thread(self):
def update_loop():
while True:
time.sleep(self.update_interval)
prev_value = self._current_value
current_value = self._get_backend_value(force=True)
if current_value != prev_value:
GLib.idle_add(self._update_widget)
thread = threading.Thread(target=update_loop, daemon=True)
thread.start()
def _update_widget(self):
if self.widget:
self.widget.update_display()
return False
from gi.repository import Adw, Gtk, GLib
from .BaseWidget import BaseWidget
class InfoLabelWidget(BaseWidget):
def create_row(self):
self.row = Adw.ActionRow(title=self.setting.name, subtitle=self.setting.help)
self.label = Gtk.Label(
valign=Gtk.Align.CENTER,
halign=Gtk.Align.CENTER,
)
self.label.add_css_class("dim-label")
control_box = Gtk.Box(spacing=6, orientation=Gtk.Orientation.HORIZONTAL)
control_box.append(self.label)
self.row.add_suffix(control_box)
self._update_initial_state()
return self.row
def _update_initial_state(self):
current_value = self.setting._get_backend_value()
print(current_value)
self.label.set_label(current_value)
def update_display(self):
self._update_initial_state()
...@@ -5,6 +5,7 @@ from .EntryWidget import EntryWidget ...@@ -5,6 +5,7 @@ from .EntryWidget import EntryWidget
from .NumStepper import NumStepper from .NumStepper import NumStepper
from .FileChooser import FileChooser from .FileChooser import FileChooser
from .ButtonWidget import ButtonWidget from .ButtonWidget import ButtonWidget
from .InfoLabelWidget import InfoLabelWidget
class WidgetFactory: class WidgetFactory:
widget_map = { widget_map = {
...@@ -15,6 +16,7 @@ class WidgetFactory: ...@@ -15,6 +16,7 @@ class WidgetFactory:
'entry': EntryWidget, 'entry': EntryWidget,
'number': NumStepper, 'number': NumStepper,
'button': ButtonWidget, 'button': ButtonWidget,
'info_label': InfoLabelWidget,
} }
@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