Track completed Single acquisitions and persist recent addresses
This commit is contained in:
56
python/set_devices/qt_ports/address_history.py
Normal file
56
python/set_devices/qt_ports/address_history.py
Normal file
@@ -0,0 +1,56 @@
|
||||
"""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)
|
||||
Reference in New Issue
Block a user