1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
|
# SPDX-License-Identifier: GPL-3.0-only
from __future__ import annotations
from collections import OrderedDict
from gi.repository import Gio, GObject
class Attribute(GObject.Object):
__gtype_name__ = "Attribute"
def __init__(self, key, value):
super().__init__()
self.key = key
self.value = value
class AttributesModel(GObject.Object, Gio.ListModel):
__gtype_name__ = "AttributesModel"
def __init__(self, attributes: dict[str, str]) -> None:
super().__init__()
self._inner = OrderedDict()
for key, value in attributes.items():
self._inner[key] = Attribute(key, value)
self.items_changed(0, 0, len(attributes))
def do_get_item(self, pos):
if 0 <= pos < self.get_n_items():
key = list(self._inner)[pos]
return self._inner[key]
return None
def do_get_n_items(self):
return len(self._inner)
def do_get_item_type(self):
return Attribute.__gtype__ # pylint: disable=no-member
def get(self, key: str) -> str | None:
return self._inner.get(key)
def _get_pos(self, key: str) -> int:
return list(self._inner).index(key)
def has_attribute(self, key: str) -> bool:
return key in self._inner
def insert(self, key: str, value: str) -> None:
if key in self._inner:
self._inner[key].value = value
else:
n_items = self.get_n_items()
self._inner[key] = Attribute(key, value)
self.items_changed(n_items, 0, 1)
def pop(self, key: str) -> Attribute | None:
if key not in self._inner:
return None
pos = self._get_pos(key)
attribute = self._inner.pop(key)
self.items_changed(pos, 1, 0)
return attribute
|