Skip to content

Commit

Permalink
diversion: Avoid tight coupling between Condition and Action
Browse files Browse the repository at this point in the history
Replace tight coupling of classes by converting their common base class
into a simple function, that is used instead. This change completely
removes the RuleComponent class.

The RuleComponent was a base class solely holding a compile function and
passing it to its children. There is no need for tight coupling with
inheritance for that purpose.

Related #2659
  • Loading branch information
MattHag committed Dec 31, 2024
1 parent 3768354 commit b851724
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 24 deletions.
37 changes: 18 additions & 19 deletions lib/logitech_receiver/diversion.py
Original file line number Diff line number Diff line change
Expand Up @@ -509,19 +509,18 @@ 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:
return COMPONENTS[k](v)
except KeyError:
pass
logger.warning("illegal component in rule: %s", c)
return FalllbackCondition()


def _evaluate(components, feature, notification: HIDPPNotification, device, result) -> Any:
Expand All @@ -535,9 +534,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):
Expand All @@ -557,7 +556,7 @@ def data(self):
return {"Rule": [c.data() for c in self.components]}


class Condition(RuleComponent):
class Condition:
def __init__(self, *args):
pass

Expand All @@ -575,7 +574,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)
Expand All @@ -592,7 +591,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) + "]"
Expand All @@ -615,7 +614,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) + "]"
Expand Down Expand Up @@ -1143,7 +1142,7 @@ def data(self):
return {"Host": self.host}


class Action(RuleComponent):
class Action:
def __init__(self, *args):
pass

Expand Down
4 changes: 2 additions & 2 deletions lib/solaar/ui/diversion_rules.py
Original file line number Diff line number Diff line change
Expand Up @@ -490,7 +490,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 = _DIV.RuleComponent().compile(c.data())
_rule_component_clipboard = _DIV.compile_component(c.data())

def menu_do_cut(self, _mitem, m, it):
global _rule_component_clipboard
Expand All @@ -511,7 +511,7 @@ def menu_do_paste(self, _mitem, m, it, below=False):
c = _rule_component_clipboard
_rule_component_clipboard = None
if c:
_rule_component_clipboard = _DIV.RuleComponent().compile(c.data())
_rule_component_clipboard = _DIV.compile_component(c.data())
self._menu_do_insert(_mitem, m, it, new_c=c, below=below)
self._on_update()

Expand Down
3 changes: 0 additions & 3 deletions lib/solaar/ui/rule_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@
from typing import Callable

from gi.repository import Gtk
from logitech_receiver import diversion


def norm(s):
Expand Down Expand Up @@ -48,8 +47,6 @@ def add_completion_to_entry(cls, entry, values):


class RuleComponentUI:
CLASS = diversion.RuleComponent

def __init__(self, panel, on_update: Callable = None):
self.panel = panel
self.widgets = {} # widget -> coord. in grid
Expand Down

0 comments on commit b851724

Please sign in to comment.