57 lines
2.2 KiB
Python
57 lines
2.2 KiB
Python
"""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)
|