filter_string is now a class property
- Support serializing class properties instead of just dataclass fields - filter_string is now a property that's always up-to-date - Account display names matching the current SidePane filter are shown
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
import re
|
||||
from dataclasses import dataclass, field
|
||||
from datetime import datetime
|
||||
from typing import Any, Dict, List, Optional
|
||||
@@ -13,16 +14,15 @@ class Account(ModelItem):
|
||||
display_name: str = ""
|
||||
avatar_url: str = ""
|
||||
profile_updated: datetime = field(default_factory=datetime.now)
|
||||
filter_string: str = ""
|
||||
|
||||
def __lt__(self, other: "Account") -> bool:
|
||||
name = self.display_name or self.user_id[1:]
|
||||
other_name = other.display_name or other.user_id[1:]
|
||||
return name < other_name
|
||||
|
||||
# @property
|
||||
# def filter_string(self) -> str: # TODO: support serializing properties
|
||||
# return " ".join((self.user_id, self.display_name))
|
||||
@property
|
||||
def filter_string(self) -> str:
|
||||
return self.display_name
|
||||
|
||||
|
||||
@dataclass
|
||||
@@ -35,7 +35,6 @@ class Room(ModelItem):
|
||||
inviter_name: str = ""
|
||||
inviter_avatar: str = ""
|
||||
left: bool = False
|
||||
filter_string: str = ""
|
||||
typing_members: List[str] = field(default_factory=list)
|
||||
|
||||
# Event __dict__
|
||||
@@ -64,15 +63,23 @@ class Room(ModelItem):
|
||||
other_name = other.display_name or other.room_id
|
||||
return name < other_name
|
||||
|
||||
@property
|
||||
def filter_string(self) -> str:
|
||||
return " ".join((
|
||||
self.display_name,
|
||||
self.topic,
|
||||
re.sub(r"<.*?>", "", self.last_event["inline_content"])
|
||||
if self.last_event else "",
|
||||
))
|
||||
|
||||
|
||||
@dataclass
|
||||
class Member(ModelItem):
|
||||
user_id: str = field()
|
||||
display_name: str = ""
|
||||
avatar_url: str = ""
|
||||
typing: bool = False
|
||||
power_level: int = 0
|
||||
filter_string: str = ""
|
||||
user_id: str = field()
|
||||
display_name: str = ""
|
||||
avatar_url: str = ""
|
||||
typing: bool = False
|
||||
power_level: int = 0
|
||||
|
||||
def __lt__(self, other: "Member") -> bool:
|
||||
name = self.display_name or self.user_id[1:]
|
||||
@@ -80,6 +87,11 @@ class Member(ModelItem):
|
||||
return name < other_name
|
||||
|
||||
|
||||
@property
|
||||
def filter_string(self) -> str:
|
||||
return self.display_name
|
||||
|
||||
|
||||
class TypeSpecifier(AutoStrEnum):
|
||||
none = auto()
|
||||
profile_change = auto()
|
||||
|
@@ -98,7 +98,7 @@ class Model(MutableMapping):
|
||||
|
||||
|
||||
def serialized(self) -> List[Dict[str, Any]]:
|
||||
return [item.__dict__ for item in sorted(self._data.values())]
|
||||
return [item.serialized for item in sorted(self._data.values())]
|
||||
|
||||
|
||||
def __lt__(self, other: "Model") -> bool:
|
||||
|
@@ -1,4 +1,4 @@
|
||||
from typing import ClassVar, Optional
|
||||
from typing import Any, Dict, Optional
|
||||
|
||||
|
||||
class ModelItem:
|
||||
@@ -15,5 +15,16 @@ class ModelItem:
|
||||
with self.parent_model._sync_lock:
|
||||
self.parent_model._changed = True
|
||||
|
||||
|
||||
def __delattr__(self, name: str) -> None:
|
||||
raise NotImplementedError()
|
||||
|
||||
|
||||
@property
|
||||
def serialized(self) -> Dict[str, Any]:
|
||||
return {
|
||||
name: getattr(self, name) for name in dir(self)
|
||||
if not (
|
||||
name.startswith("_") or name in ("parent_model", "serialized")
|
||||
)
|
||||
}
|
||||
|
Reference in New Issue
Block a user