diff --git a/lib/logitech_receiver/diversion.py b/lib/logitech_receiver/diversion.py index 5ac595dca..bacae45f4 100644 --- a/lib/logitech_receiver/diversion.py +++ b/lib/logitech_receiver/diversion.py @@ -511,19 +511,19 @@ def charging(f, r, d, _a): "mouse-noop": [], } -# COMPONENTS = {} - -class RuleComponent: - def compile(self, c): - if isinstance(c, RuleComponent): - return c - elif isinstance(c, dict) and len(c) == 1: - k, v = next(iter(c.items())) - if k in COMPONENTS: - return COMPONENTS[k](v) - logger.warning("illegal component in rule: %s", c) - return Condition() +def compile_component(c): + if isinstance(c, Rule) or isinstance(c, Condition) or isinstance(c, Action): + return c + elif isinstance(c, dict) and len(c) == 1: + k, v = next(iter(c.items())) + try: + cls = COMPONENTS[k] + return cls(v) + except KeyError: + pass + logger.warning("illegal component in rule: %s", c) + return FalllbackCondition() def _evaluate(components, feature, notification: HIDPPNotification, device, result) -> Any: @@ -537,9 +537,9 @@ def _evaluate(components, feature, notification: HIDPPNotification, device, resu return res -class Rule(RuleComponent): +class Rule: def __init__(self, args, source=None, warn=True): - self.components = [self.compile(a) for a in args] + self.components = [compile_component(a) for a in args] self.source = source def __str__(self): @@ -559,7 +559,7 @@ def data(self): return {"Rule": [c.data() for c in self.components]} -class Condition(RuleComponent): +class Condition: def __init__(self, *args): pass @@ -577,7 +577,7 @@ def __init__(self, op, warn=True): if isinstance(op, list) and len(op) == 1: op = op[0] self.op = op - self.component = self.compile(op) + self.component = compile_component(op) def __str__(self): return "Not: " + str(self.component) @@ -594,7 +594,7 @@ def data(self): class Or(Condition): def __init__(self, args, warn=True): - self.components = [self.compile(a) for a in args] + self.components = [compile_component(a) for a in args] def __str__(self): return "Or: [" + ", ".join(str(c) for c in self.components) + "]" @@ -617,7 +617,7 @@ def data(self): class And(Condition): def __init__(self, args, warn=True): - self.components = [self.compile(a) for a in args] + self.components = [compile_component(a) for a in args] def __str__(self): return "And: [" + ", ".join(str(c) for c in self.components) + "]" @@ -1145,7 +1145,7 @@ def data(self): return {"Host": self.host} -class Action(RuleComponent): +class Action: def __init__(self, *args): pass diff --git a/lib/solaar/ui/diversion_rules.py b/lib/solaar/ui/diversion_rules.py index 788eab241..af7f488ac 100644 --- a/lib/solaar/ui/diversion_rules.py +++ b/lib/solaar/ui/diversion_rules.py @@ -512,7 +512,7 @@ def menu_do_copy(self, _mitem: Gtk.MenuItem, m: Gtk.TreeStore, it: Gtk.TreeIter) wrapped = m[it][0] c = wrapped.component - _rule_component_clipboard = diversion.RuleComponent().compile(c.data()) + _rule_component_clipboard = diversion.compile_component(c.data()) def menu_do_cut(self, _mitem, m, it): global _rule_component_clipboard @@ -533,7 +533,7 @@ def menu_do_paste(self, _mitem, m, it, below=False): c = _rule_component_clipboard _rule_component_clipboard = None if c: - _rule_component_clipboard = diversion.RuleComponent().compile(c.data()) + _rule_component_clipboard = diversion.compile_component(c.data()) self._menu_do_insert(_mitem, m, it, new_c=c, below=below) self._on_update() diff --git a/lib/solaar/ui/rule_base.py b/lib/solaar/ui/rule_base.py index 1fcc5dcd1..ee787c87b 100644 --- a/lib/solaar/ui/rule_base.py +++ b/lib/solaar/ui/rule_base.py @@ -13,14 +13,11 @@ ## You should have received a copy of the GNU General Public License along ## with this program; if not, write to the Free Software Foundation, Inc., ## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -import abc from contextlib import contextmanager as contextlib_contextmanager -from typing import Any from typing import Callable from gi.repository import Gtk -from logitech_receiver import diversion def norm(s): @@ -49,9 +46,7 @@ def add_completion_to_entry(cls, entry, values): liststore.append((v,)) -class RuleComponentUI(abc.ABC): - CLASS = diversion.RuleComponent - +class RuleComponentUI: def __init__(self, panel, on_update: Callable = None): self.panel = panel self.widgets = {} # widget -> coord. in grid @@ -60,16 +55,14 @@ def __init__(self, panel, on_update: Callable = None): self._on_update_callback = (lambda: None) if on_update is None else on_update self.create_widgets() - @abc.abstractmethod - def create_widgets(self) -> dict: + def create_widgets(self): pass def show(self, component, editable=True): self._show_widgets(editable) self.component = component - @abc.abstractmethod - def collect_value(self) -> Any: + def collect_value(self): pass @contextlib_contextmanager @@ -109,5 +102,5 @@ def _remove_panel_items(self): for c in self.panel.get_children(): self.panel.remove(c) - def update_devices(self): # noqa: B027 + def update_devices(self): pass