Skip to content

Commit 92daa60

Browse files
committed
Steps towards the action ordering option interface
1 parent b89b863 commit 92daa60

5 files changed

Lines changed: 83 additions & 8 deletions

File tree

gremlin/config.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
import re
2323
import uuid
2424

25-
from typing import Any
25+
from typing import Any, List, Tuple
2626

2727
from PySide6 import QtCore
2828

@@ -205,7 +205,7 @@ def register(
205205
logging.getLogger("system").warning(
206206
f"Data type for parameter '{key}' changed, updating from " +
207207
f"'{self._data[key]["data_type"]}' to '{data_type}'")
208-
self._data.key["data_type"] = data_type
208+
self._data[key]["data_type"] = data_type
209209

210210
if description != self._data[key]["description"]:
211211
self._data[key]["description"] = description
@@ -446,7 +446,7 @@ def get_calibration(
446446
self,
447447
uuid: uuid.UUID,
448448
axis_id: int
449-
) -> list[int, int, int, int, bool]:
449+
) -> tuple[int, int, int, int, bool]:
450450
"""Returns the calibration data of a given axis.
451451
452452
Args:
@@ -459,13 +459,13 @@ def get_calibration(
459459
if self.exists("calibration", str(uuid).upper(), str(axis_id)):
460460
return self.value("calibration", str(uuid).upper(), str(axis_id))
461461
else:
462-
return [-32768, 0, 0, 32767, True]
462+
return (-32768, 0, 0, 32767, True)
463463

464464
def set_calibration(
465465
self,
466466
uuid: uuid.UUID,
467467
axis_id: int,
468-
data: list[int, int, int, int, bool]
468+
data: Tuple[int, int, int, int, bool]
469469
) -> None:
470470
self.set("calibration", str(uuid).upper(), str(axis_id), data)
471471

gremlin/ui/action_model.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
from PySide6 import QtCore, QtQml
2323
from PySide6.QtCore import Property, Signal, Slot
2424

25+
import gremlin.config
2526
from gremlin import input_cache
2627
from gremlin.error import MissingImplementationError, GremlinError
2728
from gremlin.plugin_manager import PluginManager
@@ -344,3 +345,40 @@ def _compatible_actions(self) -> List[str]:
344345
fset=_set_activate_on_release,
345346
notify=actionChanged
346347
)
348+
349+
350+
class ActionPriorityListModel(QtCore.QAbstractListModel):
351+
352+
# TODO: Needs to be treated as a normal action property type and then
353+
# rendered in the UI
354+
355+
roles = {
356+
QtCore.Qt.UserRole + 1: QtCore.QByteArray("name".encode()),
357+
QtCore.Qt.UserRole + 2: QtCore.QByteArray("visible".encode()),
358+
}
359+
360+
def __init__(self, parent: QtCore.QObject=...) -> None:
361+
super().__init__(parent)
362+
self._config = gremlin.config.Configuration()
363+
self._cfg_key = ["global", "general", "action_priorities"]
364+
365+
def rowCount(self, parent:QtCore.QModelIndex=...) -> int:
366+
return len(self._config.value(*self._cfg_key))
367+
368+
def data(self, index: QtCore.QModelIndex, role: int=...) -> int:
369+
if role in ActionPriorityListModel.roles:
370+
role_name = ActionPriorityListModel.roles[role].data().decode()
371+
data = self._config.value(*self._cfg_key)[index.row()]
372+
match role_name:
373+
case "name":
374+
return data[0]
375+
case "visible":
376+
return data[1]
377+
case _:
378+
raise GremlinError(f"Unknown role name {role_name}")
379+
380+
else:
381+
raise GremlinError("Invalid role encountered")
382+
383+
def roleNames(self) -> Dict:
384+
return ActionPriorityListModel.roles

gremlin/ui/config.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ class ConfigGroupModel(QtCore.QAbstractListModel):
7474
list model.
7575
"""
7676

77+
changed = Signal()
78+
7779
roles = {
7880
QtCore.Qt.UserRole + 1: QtCore.QByteArray("groupName".encode()),
7981
QtCore.Qt.UserRole + 2: QtCore.QByteArray("entryModel".encode()),
@@ -85,6 +87,10 @@ def __init__(self, section: str, parent: Optional[QtCore.QObject]=None) -> None:
8587
self._config = gremlin.config.Configuration()
8688
self._section_name = section
8789

90+
@Property(str, notify=changed)
91+
def sectionName(self) -> str:
92+
return self._section_name
93+
8894
def rowCount(self, parent: Optional[QtCore.QModelIndex]) -> int:
8995
return len(self._config.groups(self._section_name))
9096

gremlin/ui/device.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,7 @@ def update_model(self) -> None:
277277
def rowCount(self, parent:QtCore.QModelIndex=...) -> int:
278278
return len(self._devices)
279279

280-
def data(self, index:QtCore.QModelIndex, role:int=...) -> Any:
280+
def data(self, index: QtCore.QModelIndex, role: int=...) -> Any:
281281
if role in DeviceListModel.roles:
282282
role_name = DeviceListModel.roles[role].data().decode()
283283
return DeviceListModel.role_query[role_name](

joystick_gremlin.py

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
import gremlin.config
6363
import gremlin.error
6464
import gremlin.device_initialization
65+
import gremlin.event_handler
6566
import gremlin.plugin_manager
6667
import gremlin.types
6768
import gremlin.signal
@@ -142,6 +143,35 @@ def register_config_options() -> None:
142143
"Directory containing additional action plugins", {},
143144
True
144145
)
146+
cfg.register(
147+
"global", "general", "action_priorities",
148+
PropertyType.List, [],
149+
"Priority order of the actions", {},
150+
True
151+
152+
)
153+
154+
155+
def update_action_priorities():
156+
cfg = gremlin.config.Configuration()
157+
key = ["global", "general", "action_priorities"]
158+
priorities = []
159+
if cfg.exists(*key):
160+
priorities = cfg.value(*key)
161+
priorities_tags = [v[0] for v in priorities]
162+
plugin_tags = gremlin.plugin_manager.PluginManager().repository.keys()
163+
164+
for tag in plugin_tags:
165+
if tag not in priorities_tags:
166+
priorities.append((tag, True))
167+
to_delete = []
168+
for i, tag in enumerate(priorities_tags):
169+
if tag not in plugin_tags:
170+
to_delete.append(i)
171+
for idx in reversed(to_delete):
172+
del priorities[idx]
173+
174+
cfg.set(*key, priorities)
145175

146176

147177
def make_gremlin_app(argv):
@@ -257,9 +287,10 @@ def make_gremlin_app(argv):
257287
syslog.info("Initializing plugins")
258288
gremlin.plugin_manager.PluginManager()
259289

260-
# Purgre configuration options that have not been registered
290+
# Purgre configuration options that have not been registered and update
291+
# the action priority information
261292
cfg.purge_unused()
262-
293+
update_action_priorities()
263294

264295
# +-------------------------------------------------------------------------
265296
# | Start Gremlin UI

0 commit comments

Comments
 (0)