"""Editable recent-address selector with portable, per-interface JSON storage.""" import json from pathlib import Path try: from PySide6.QtCore import QSignalBlocker from PySide6.QtWidgets import QComboBox, QSizePolicy except ImportError: from PySide2.QtCore import QSignalBlocker from PySide2.QtWidgets import QComboBox, QSizePolicy class AddressHistoryBox(QComboBox): def __init__(self, filename, parent=None): super().__init__(parent) self.filename = Path(filename) self.interface = 'Ethernet' self.history = {} self.setEditable(True) self.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed) self.setInsertPolicy(QComboBox.InsertPolicy.NoInsert) try: saved = json.loads(self.filename.read_text(encoding='utf8')) if isinstance(saved, dict): self.history = {key: [x for x in items if isinstance(x, str) and x.strip()][:20] for key, items in saved.items() if isinstance(items, list)} except (OSError, ValueError): pass self.set_interface(self.interface) def text(self): return self.currentText() def setText(self, text): self.setEditText(text) def setPlaceholderText(self, text): self.lineEdit().setPlaceholderText(text) def set_interface(self, interface): self.interface = interface with QSignalBlocker(self): self.clear() self.addItems(self.history.get(interface, [])) if not self.count(): self.setEditText('') def remember(self): address = self.currentText().strip() if not address: return previous = self.history.get(self.interface, []) self.history[self.interface] = [address] + [x for x in previous if x.casefold()!=address.casefold()][:19] self.filename.parent.mkdir(parents=True, exist_ok=True) temporary = self.filename.with_suffix('.tmp') temporary.write_text(json.dumps(self.history, ensure_ascii=False, indent=2), encoding='utf8') temporary.replace(self.filename) self.set_interface(self.interface)