Remove NamedInts: Convert Column to enum

Related #2273
This commit is contained in:
MattHag 2024-11-04 22:52:08 +01:00 committed by Peter F. Patel-Schneider
parent 0d7fc46a81
commit b74e789715
1 changed files with 43 additions and 30 deletions

View File

@ -17,13 +17,14 @@
import logging
from enum import IntEnum
import gi
from gi.repository.GObject import TYPE_PYOBJECT
from logitech_receiver import hidpp10_constants
from logitech_receiver.common import LOGITECH_VENDOR_ID
from logitech_receiver.common import NamedInt
from logitech_receiver.common import NamedInts
from solaar import NAME
from solaar.i18n import _
@ -54,12 +55,24 @@ try:
except (ValueError, AttributeError):
_CAN_SET_ROW_NONE = ""
# tree model columns
_COLUMN = NamedInts(PATH=0, NUMBER=1, ACTIVE=2, NAME=3, ICON=4, STATUS_TEXT=5, STATUS_ICON=6, DEVICE=7)
class Column(IntEnum):
"""Columns of tree model."""
PATH = 0
NUMBER = 1
ACTIVE = 2
NAME = 3
ICON = 4
STATUS_TEXT = 5
STATUS_ICON = 6
DEVICE = 7
_COLUMN_TYPES = (str, int, bool, str, str, str, str, TYPE_PYOBJECT)
_TREE_SEPATATOR = (None, 0, False, None, None, None, None, None)
assert len(_TREE_SEPATATOR) == len(_COLUMN_TYPES)
assert len(_COLUMN_TYPES) == len(_COLUMN)
assert len(_COLUMN_TYPES) == len(Column)
def _new_button(label, icon_name=None, icon_size=_NORMAL_BUTTON_ICON_SIZE, tooltip=None, toggle=False, clicked=None):
@ -238,21 +251,21 @@ def _create_tree(model):
tree.set_model(model)
def _is_separator(model, item, _ignore=None):
return model.get_value(item, _COLUMN.PATH) is None
return model.get_value(item, Column.PATH) is None
tree.set_row_separator_func(_is_separator, None)
icon_cell_renderer = Gtk.CellRendererPixbuf()
icon_cell_renderer.set_property("stock-size", _TREE_ICON_SIZE)
icon_column = Gtk.TreeViewColumn("Icon", icon_cell_renderer)
icon_column.add_attribute(icon_cell_renderer, "sensitive", _COLUMN.ACTIVE)
icon_column.add_attribute(icon_cell_renderer, "icon-name", _COLUMN.ICON)
icon_column.add_attribute(icon_cell_renderer, "sensitive", Column.ACTIVE)
icon_column.add_attribute(icon_cell_renderer, "icon-name", Column.ICON)
tree.append_column(icon_column)
name_cell_renderer = Gtk.CellRendererText()
name_column = Gtk.TreeViewColumn("device name", name_cell_renderer)
name_column.add_attribute(name_cell_renderer, "sensitive", _COLUMN.ACTIVE)
name_column.add_attribute(name_cell_renderer, "text", _COLUMN.NAME)
name_column.add_attribute(name_cell_renderer, "sensitive", Column.ACTIVE)
name_column.add_attribute(name_cell_renderer, "text", Column.NAME)
name_column.set_expand(True)
tree.append_column(name_column)
tree.set_expander_column(name_column)
@ -261,16 +274,16 @@ def _create_tree(model):
status_cell_renderer.set_property("scale", 0.85)
status_cell_renderer.set_property("xalign", 1)
status_column = Gtk.TreeViewColumn("status text", status_cell_renderer)
status_column.add_attribute(status_cell_renderer, "sensitive", _COLUMN.ACTIVE)
status_column.add_attribute(status_cell_renderer, "text", _COLUMN.STATUS_TEXT)
status_column.add_attribute(status_cell_renderer, "sensitive", Column.ACTIVE)
status_column.add_attribute(status_cell_renderer, "text", Column.STATUS_TEXT)
status_column.set_expand(True)
tree.append_column(status_column)
battery_cell_renderer = Gtk.CellRendererPixbuf()
battery_cell_renderer.set_property("stock-size", _TREE_ICON_SIZE)
battery_column = Gtk.TreeViewColumn("status icon", battery_cell_renderer)
battery_column.add_attribute(battery_cell_renderer, "sensitive", _COLUMN.ACTIVE)
battery_column.add_attribute(battery_cell_renderer, "icon-name", _COLUMN.STATUS_ICON)
battery_column.add_attribute(battery_cell_renderer, "sensitive", Column.ACTIVE)
battery_column.add_attribute(battery_cell_renderer, "icon-name", Column.STATUS_ICON)
tree.append_column(battery_column)
return tree
@ -348,20 +361,20 @@ def _create(delete_action):
def _find_selected_device():
selection = _tree.get_selection()
model, item = selection.get_selected()
return model.get_value(item, _COLUMN.DEVICE) if item else None
return model.get_value(item, Column.DEVICE) if item else None
def _find_selected_device_id():
selection = _tree.get_selection()
model, item = selection.get_selected()
if item:
return _model.get_value(item, _COLUMN.PATH), _model.get_value(item, _COLUMN.NUMBER)
return _model.get_value(item, Column.PATH), _model.get_value(item, Column.NUMBER)
# triggered by changing selection in the tree
def _device_selected(selection):
model, item = selection.get_selected()
device = model.get_value(item, _COLUMN.DEVICE) if item else None
device = model.get_value(item, Column.DEVICE) if item else None
if device:
_update_info_panel(device, full=True)
else:
@ -381,7 +394,7 @@ def _receiver_row(receiver_path, receiver=None):
item = _model.get_iter_first()
while item:
# first row matching the path must be the receiver one
if _model.get_value(item, _COLUMN.PATH) == receiver_path:
if _model.get_value(item, Column.PATH) == receiver_path:
return item
item = _model.iter_next(item)
@ -415,13 +428,13 @@ def _device_row(receiver_path, device_number, device=None):
item = _model.iter_children(receiver_row)
new_child_index = 0
while item:
if _model.get_value(item, _COLUMN.PATH) != receiver_path:
if _model.get_value(item, Column.PATH) != receiver_path:
logger.warning(
"path for device row %s different from path for receiver %s",
_model.get_value(item, _COLUMN.PATH),
_model.get_value(item, Column.PATH),
receiver_path,
)
item_number = _model.get_value(item, _COLUMN.NUMBER)
item_number = _model.get_value(item, Column.NUMBER)
if item_number == device_number:
return item
if item_number > device_number:
@ -833,9 +846,9 @@ def update(device, need_popup=False, refresh=False):
item = _receiver_row(device.path, device if is_alive else None)
if is_alive and item:
was_pairing = bool(_model.get_value(item, _COLUMN.STATUS_ICON))
was_pairing = bool(_model.get_value(item, Column.STATUS_ICON))
is_pairing = (not device.isDevice) and bool(device.pairing.lock_open)
_model.set_value(item, _COLUMN.STATUS_ICON, "network-wireless" if is_pairing else _CAN_SET_ROW_NONE)
_model.set_value(item, Column.STATUS_ICON, "network-wireless" if is_pairing else _CAN_SET_ROW_NONE)
if selected_device_id == (device.path, 0):
full_update = need_popup or was_pairing != is_pairing
@ -864,15 +877,15 @@ def update(device, need_popup=False, refresh=False):
def update_device(device, item, selected_device_id, need_popup, full=False):
was_online = _model.get_value(item, _COLUMN.ACTIVE)
was_online = _model.get_value(item, Column.ACTIVE)
is_online = bool(device.online)
_model.set_value(item, _COLUMN.ACTIVE, is_online)
_model.set_value(item, Column.ACTIVE, is_online)
battery_level = device.battery_info.level if device.battery_info is not None else None
battery_voltage = device.battery_info.voltage if device.battery_info is not None else None
if battery_level is None:
_model.set_value(item, _COLUMN.STATUS_TEXT, _CAN_SET_ROW_NONE)
_model.set_value(item, _COLUMN.STATUS_ICON, _CAN_SET_ROW_NONE)
_model.set_value(item, Column.STATUS_TEXT, _CAN_SET_ROW_NONE)
_model.set_value(item, Column.STATUS_ICON, _CAN_SET_ROW_NONE)
else:
if battery_voltage is not None and False: # Use levels instead of voltage here
status_text = f"{int(battery_voltage)}mV"
@ -880,13 +893,13 @@ def update_device(device, item, selected_device_id, need_popup, full=False):
status_text = _(str(battery_level))
else:
status_text = f"{int(battery_level)}%"
_model.set_value(item, _COLUMN.STATUS_TEXT, status_text)
_model.set_value(item, Column.STATUS_TEXT, status_text)
charging = device.battery_info.charging() if device.battery_info is not None else None
icon_name = icons.battery(battery_level, charging)
_model.set_value(item, _COLUMN.STATUS_ICON, icon_name)
_model.set_value(item, Column.STATUS_ICON, icon_name)
_model.set_value(item, _COLUMN.NAME, device.codename)
_model.set_value(item, Column.NAME, device.codename)
if selected_device_id is None or need_popup:
select(device.receiver.path if device.receiver else device.path, device.number)
@ -901,7 +914,7 @@ def find_device(serial):
def check(_store, _treepath, row):
nonlocal result
device = _model.get_value(row, _COLUMN.DEVICE)
device = _model.get_value(row, Column.DEVICE)
if device and device.kind and (device.unitId == serial or device.serial == serial):
result = device
return True