Commit 38cbb2ba authored by Roman Alifanov's avatar Roman Alifanov

set and get moved to a separated thread

parent 8f5916de
from gi.repository import GLib
import threading
from .base import BaseSetting from .base import BaseSetting
from .widgets import WidgetFactory from .widgets import WidgetFactory
from ..backends import backend_factory from ..backends import backend_factory
...@@ -14,6 +17,7 @@ class Setting(BaseSetting): ...@@ -14,6 +17,7 @@ class Setting(BaseSetting):
self.key = setting_data.get('key') self.key = setting_data.get('key')
super().__init__(setting_data, module) super().__init__(setting_data, module)
self._async_fetch_value()
def create_row(self): def create_row(self):
if self.root is True: if self.root is True:
...@@ -37,15 +41,29 @@ class Setting(BaseSetting): ...@@ -37,15 +41,29 @@ class Setting(BaseSetting):
self.widget = WidgetFactory.create_widget(self) self.widget = WidgetFactory.create_widget(self)
return self.widget.create_row() if self.widget else None return self.widget.create_row() if self.widget else None
def _get_backend_value(self, force=False): def _async_fetch_value(self, force=False):
if self._current_value is None or force is True: def fetch():
backend = self._get_backend() backend = self._get_backend()
value = self.default value = self.default
if backend: if backend:
value = backend.get_value(self.key, self.gtype) or self.default try:
value = backend.get_value(self.key, self.gtype) or self.default
except Exception as e:
self.logger.error(f"Error fetching value: {str(e)}")
GLib.idle_add(self._update_current_value, value)
if self._current_value is None or force:
threading.Thread(target=fetch, daemon=True).start()
def _update_current_value(self, value):
if self._current_value != value:
self._current_value = value self._current_value = value
if self.widget:
self.widget.update_display()
def _get_backend_value(self, force=False):
if force:
self._async_fetch_value(force=True)
return self._current_value return self._current_value
def _get_backend_range(self): def _get_backend_range(self):
...@@ -55,10 +73,15 @@ class Setting(BaseSetting): ...@@ -55,10 +73,15 @@ class Setting(BaseSetting):
def _set_backend_value(self, value): def _set_backend_value(self, value):
self.logger.info(f"SET VALUE {value}") self.logger.info(f"SET VALUE {value}")
backend = self._get_backend() def set_val():
if backend: backend = self._get_backend()
backend.set_value(self.key, value, self.gtype) if backend:
self._current_value = value try:
backend.set_value(self.key, value, self.gtype)
GLib.idle_add(self._update_current_value, value)
except Exception as e:
self.logger.error(f"Error setting value: {str(e)}")
threading.Thread(target=set_val, daemon=True).start()
def _get_backend(self): def _get_backend(self):
if self.root is True: if self.root is True:
...@@ -67,7 +90,6 @@ class Setting(BaseSetting): ...@@ -67,7 +90,6 @@ class Setting(BaseSetting):
backend.set_backend_params(self.params) backend.set_backend_params(self.params)
else: else:
backend = backend_factory.get_backend(self.backend, self.params) backend = backend_factory.get_backend(self.backend, self.params)
if not backend: if not backend:
self.logger.error(f"Бекенд {self.backend} не зарегистрирован.") self.logger.error(f"Backend {self.backend} not registered.")
return backend return backend
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