Commit d72c0c2d authored by Roman Alifanov's avatar Roman Alifanov

duplicate code has been moved to the base class

parent 711a541e
import logging
import threading
import time
from ..searcher import SearcherFactory
from gi.repository import GLib
class BaseSetting:
def __init__(self, setting_data, module):
self._ = module.get_translation
self.module = module
self.name = self._(setting_data['name'])
self.orig_name = setting_data['name']
self.logger = logging.getLogger(f"{self.__class__.__name__}[{self.name}]")
self.widget = None
self.root = setting_data.get('root', False)
self.params = {
**setting_data.get('params', {}),
'module_path': module.path
}
self.type = setting_data['type']
self.help = setting_data.get('help', None)
if self.help is not None:
self.help = self._(self.help)
self.default = setting_data.get('default')
self.gtype = setting_data.get('gtype', [])
self._current_value = None
self.search_target = setting_data.get('search_target', None)
self.map = setting_data.get('map')
self.prepare_map()
self.update_interval = setting_data.get('update_interval', None)
if self.update_interval:
self._start_update_thread()
def prepare_map(self):
if self.map is None:
if self.search_target is not None:
self.map = SearcherFactory.create(self.search_target).search()
else:
self.map = self._default_map()
if isinstance(self.map, list) and 'choice' in self.type:
self.map = {
item.title(): item for item in self.map
if item is not None
}
if not self.map:
self.logger.warning(f"Warning: 'map' is empty for setting {self.name}. Check data source.")
if isinstance(self.map, dict) and 'choice' in self.type:
self.map = {
self._(key) if isinstance(key, str) else key: value
for key, value in self.map.items()
}
if not self.map:
self.logger.warning(f"Warning: 'map' is empty for setting {self.name}. Check data source.")
if len(self.gtype) > 2:
self.gtype = self.gtype[0]
else:
self.gtype = self.gtype
def _default_map(self):
if self.type == 'boolean':
# Дефолтная карта для булевых настроек
return {True: True, False: False}
if 'choice' in self.type:
# Дефолтная карта для выборов
map = {}
range = self._get_backend_range()
if range is None:
return {}
for var in range:
self.logger.debug(var)
map[var[0].upper() + var[1:]] = var
return map
if self.type == 'number':
map = {}
range = self._get_backend_range()
if range is None:
return {}
map["upper"] = range[1]
map["lower"] = range[0]
# Кол-во после запятой
map["digits"] = len(str(range[0]).split('.')[-1]) if '.' in str(range[0]) else 0
# Минимальное число с этим количеством
map["step"] = 10 ** -map["digits"] if map["digits"] > 0 else 0
return map
return {}
def _get_selected_row_index(self):
current_value = self._get_backend_value()
return list(self.map.values()).index(current_value) if current_value in self.map.values() else 0
def _get_default_row_index(self):
return list(self.map.values()).index(self.default) if self.default in self.map.values() else None
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 ..searcher import SearcherFactory from .base import BaseSetting
from .widgets import WidgetFactory from .widgets import WidgetFactory
...@@ -7,98 +7,15 @@ import subprocess ...@@ -7,98 +7,15 @@ import subprocess
import ast import ast
class CustomSetting: class CustomSetting(BaseSetting):
def __init__(self, setting_data, module, section): def __init__(self, setting_data, module, section):
self._ = module.get_translation
self.module = module
self.section = section self.section = section
self.logger = logging.getLogger(f"CustomSetting[{setting_data['name']}]")
self.name = self._(setting_data['name'])
self.orig_name = setting_data['name']
self.type = setting_data['type']
self.default = setting_data.get('default', '')
self.help = setting_data.get('help', None)
if self.help is not None:
self.help = self._(self.help)
self._current_value = None
self.get_command = setting_data.get('get_command') self.get_command = setting_data.get('get_command')
self.get_range_command = setting_data.get('get_range_command') self.get_range_command = setting_data.get('get_range_command')
self.set_command = setting_data.get('set_command') self.set_command = setting_data.get('set_command')
self.gtype = setting_data.get('gtype', 's') super().__init__(setting_data, module)
if len(self.gtype) > 2:
self.gtype = self.gtype[0]
else:
self.gtype = self.gtype
self.search_target = setting_data.get('search_target')
self.params = {
**setting_data.get('params', {}),
'module_path': module.path
}
self.widget = None
self.row = None
self.map = setting_data.get('map')
if self.map is None:
if self.search_target is not None:
self.map = SearcherFactory.create(self.search_target).search()
else:
self.map = self._default_map()
if isinstance(self.map, list) and 'choice' in self.type:
self.map = {
item.title(): item for item in self.map
}
if isinstance(self.map, dict) and 'choice' in self.type:
self.map = {
self._(key) if isinstance(key, str) else key: value
for key, value in self.map.items()
}
def _default_map(self):
if self.type == 'boolean':
# Дефолтная карта для булевых настроек
return {True: True, False: False}
if 'choice' in self.type:
# Дефолтная карта для выборов
map = {}
range = self._get_backend_range()
if range is None:
return {}
for var in range:
self.logger.debug(var)
map[var[0].upper() + var[1:]] = var
return map
if self.type == 'number':
map = {}
range = self._get_backend_range()
if range is None:
return {}
map["upper"] = range[1]
map["lower"] = range[0]
# Кол-во после запятой
map["digits"] = len(str(range[0]).split('.')[-1]) if '.' in str(range[0]) else 0
# Минимальное число с этим количеством
map["step"] = 10 ** -map["digits"] if map["digits"] > 0 else 0
return map
return {}
def create_row(self): def create_row(self):
try: try:
...@@ -124,13 +41,6 @@ class CustomSetting: ...@@ -124,13 +41,6 @@ class CustomSetting:
def get_range(self): def get_range(self):
return self._execute_get_range_command() return self._execute_get_range_command()
def _get_selected_row_index(self):
current_value = self._get_backend_value()
return list(self.map.values()).index(current_value) if current_value in self.map.values() else 0
def _get_default_row_index(self):
return list(self.map.values()).index(self.default) if self.default in self.map.values() else None
def _execute_command(self, cmd, capture_output=True): def _execute_command(self, cmd, capture_output=True):
with subprocess.Popen( with subprocess.Popen(
cmd, cmd,
...@@ -239,9 +149,6 @@ class CustomSetting: ...@@ -239,9 +149,6 @@ class CustomSetting:
except ValueError: except ValueError:
self.logger.error(f"Invalid notify format: {line}") self.logger.error(f"Invalid notify format: {line}")
def _update_widget(self):
if self.widget:
self.widget.update_display()
@property @property
def current_value(self): def current_value(self):
......
import logging from .base import BaseSetting
import threading
import time
from ..searcher import SearcherFactory
from .widgets import WidgetFactory from .widgets import WidgetFactory
from ..backends import backend_factory from ..backends import backend_factory
from ..daemon_client import dclient 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
service_stopped = False service_stopped = False
class Setting: class Setting(BaseSetting):
def __init__(self, setting_data, module): def __init__(self, setting_data, module):
self._ = module.get_translation
self.name = self._(setting_data['name'])
self.logger = logging.getLogger(f"{self.__class__.__name__}[{self.name}]")
self.widget = None
self.root = setting_data.get('root', False)
self.backend = setting_data.get('backend') self.backend = setting_data.get('backend')
self.params = {
**setting_data.get('params', {}),
'module_path': module.path
}
self.type = setting_data['type']
self.help = setting_data.get('help', None)
if self.help is not None:
self.help = self._(self.help)
self.key = setting_data.get('key') self.key = setting_data.get('key')
self.default = setting_data.get('default')
self.gtype = setting_data.get('gtype', [])
self._current_value = None super().__init__(setting_data, module)
self.search_target = setting_data.get('search_target', None)
self.map = setting_data.get('map')
if self.map is None:
if self.search_target is not None:
self.map = SearcherFactory.create(self.search_target).search()
else:
self.map = self._default_map()
if isinstance(self.map, list) and 'choice' in self.type:
self.map = {
item.title(): item for item in self.map
if item is not None
}
if not self.map:
self.logger.warning(f"Warning: 'map' is empty for setting {self.name}. Check data source.")
if isinstance(self.map, dict) and 'choice' in self.type:
self.map = {
self._(key) if isinstance(key, str) else key: value
for key, value in self.map.items()
}
if not self.map:
self.logger.warning(f"Warning: 'map' is empty for setting {self.name}. Check data source.")
if len(self.gtype) > 2:
self.gtype = self.gtype[0]
else:
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):
if self.type == 'boolean':
# Дефолтная карта для булевых настроек
return {True: True, False: False}
if 'choice' in self.type:
# Дефолтная карта для выборов
map = {}
range = self._get_backend_range()
if range is None:
return {}
for var in range:
self.logger.debug(var)
map[var[0].upper() + var[1:]] = var
return map
if self.type == 'number':
map = {}
range = self._get_backend_range()
if range is None:
return {}
map["upper"] = range[1]
map["lower"] = range[0]
# Кол-во после запятой
map["digits"] = len(str(range[0]).split('.')[-1]) if '.' in str(range[0]) else 0
# Минимальное число с этим количеством
map["step"] = 10 ** -map["digits"] if map["digits"] > 0 else 0
return map
return {}
def create_row(self): def create_row(self):
if self.root is True: if self.root is True:
...@@ -136,13 +37,6 @@ class Setting: ...@@ -136,13 +37,6 @@ class Setting:
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_selected_row_index(self):
current_value = self._get_backend_value()
return list(self.map.values()).index(current_value) if current_value in self.map.values() else 0
def _get_default_row_index(self):
return list(self.map.values()).index(self.default) if self.default in self.map.values() else None
def _get_backend_value(self, force=False): def _get_backend_value(self, force=False):
if self._current_value is None or force is True: if self._current_value is None or force is True:
backend = self._get_backend() backend = self._get_backend()
...@@ -176,20 +70,3 @@ class Setting: ...@@ -176,20 +70,3 @@ class Setting:
if not backend: if not backend:
self.logger.error(f"Бекенд {self.backend} не зарегистрирован.") self.logger.error(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
\ No newline at end of file
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