Files
templates/python/set_devices/qt_ports/address_history.py

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)