diff --git a/src/bw_menu/rbw.py b/src/bw_menu/rbw.py index a3e8e09..b9544ac 100644 --- a/src/bw_menu/rbw.py +++ b/src/bw_menu/rbw.py @@ -1,6 +1,6 @@ import json import sys -from dataclasses import dataclass +from dataclasses import dataclass, field from subprocess import run @@ -9,6 +9,7 @@ class Entry: name: str folder: str username: str + type: str = field(default="Login", compare=False) def list_entries() -> list[Entry]: @@ -21,7 +22,13 @@ def list_entries() -> list[Entry]: data = json.loads(result.stdout.strip()) return [ - Entry(item["name"], item["folder"] or "", item["user"] or "") for item in data + Entry( + item["name"], + item["folder"] or "", + item["user"] or "", + item.get("type", "Login"), + ) + for item in data ] diff --git a/src/bw_menu/selector/__init__.py b/src/bw_menu/selector/__init__.py index 79e9fcb..f756cb4 100644 --- a/src/bw_menu/selector/__init__.py +++ b/src/bw_menu/selector/__init__.py @@ -36,8 +36,8 @@ def prepare_entries() -> tuple[list[Entry], list[Entry]]: all_entries = rbw.list_entries() history_entries = history.load() - all_set = set(all_entries) - history_in_list = [e for e in history_entries if e in all_set] + all_dict = {e: e for e in all_entries} + history_in_list = [all_dict[e] for e in history_entries if e in all_dict] history_set = set(history_in_list) remaining = [e for e in all_entries if e not in history_set] remaining.sort(key=lambda e: (e.folder.lower(), e.name.lower())) diff --git a/src/bw_menu/selector/rofi.py b/src/bw_menu/selector/rofi.py index bb773c9..01eeefc 100644 --- a/src/bw_menu/selector/rofi.py +++ b/src/bw_menu/selector/rofi.py @@ -18,6 +18,14 @@ def _result_path() -> Path: return Path(cache_dir) / "bw-menu" / "result" +_TYPE_ICONS: dict[str, str] = { + "Login": "dialog-password", + "SecureNote": "text-x-generic", + "Card": "credit-card", + "Identity": "contact-new", +} + + class RofiSelector: def run(self, args) -> Selection | None: cfg = config.load() @@ -127,4 +135,5 @@ class RofiSelector: for entry in remaining: display = format_entry(entry) - print(f"{display}\0info\x1f{encode_info(entry)}") + icon = _TYPE_ICONS.get(entry.type, "dialog-password") + print(f"{display}\0info\x1f{encode_info(entry)}\x1ficon\x1f{icon}")