artiq_gui: add a search box in parameters dock

This commit is contained in:
Yann Sionneau 2015-06-18 18:02:40 +02:00
parent 3636025e69
commit 1ad5165cc7
2 changed files with 38 additions and 14 deletions

View File

@ -1,7 +1,8 @@
import asyncio import asyncio
from quamash import QtGui from quamash import QtGui, QtCore
from pyqtgraph import dockarea from pyqtgraph import dockarea
from pyqtgraph import LayoutWidget
from artiq.protocols.sync_struct import Subscriber from artiq.protocols.sync_struct import Subscriber
from artiq.gui.tools import DictSyncModel from artiq.gui.tools import DictSyncModel
@ -28,9 +29,32 @@ class ParametersDock(dockarea.Dock):
def __init__(self): def __init__(self):
dockarea.Dock.__init__(self, "Parameters", size=(400, 300)) dockarea.Dock.__init__(self, "Parameters", size=(400, 300))
splitter = QtGui.QSplitter(QtCore.Qt.Horizontal)
self.addWidget(splitter)
grid = LayoutWidget()
splitter.addWidget(grid)
self.search = QtGui.QLineEdit()
self.search.setPlaceholderText("search...")
self.search.editingFinished.connect(self.search_parameters)
grid.addWidget(self.search, 0, 0)
self.table = QtGui.QTableView() self.table = QtGui.QTableView()
self.table.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows) self.table.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
self.addWidget(self.table) grid.addWidget(self.table, 1, 0)
def search_parameters(self):
model = self.table.model()
parentIndex = model.index(0, 0)
numRows = model.rowCount(parentIndex)
for row in range(numRows):
index = model.index(row, 0)
parameter = model.data(index, QtCore.Qt.DisplayRole)
if parameter.startswith(self.search.displayText()):
self.table.showRow(row)
else:
self.table.hideRow(row)
@asyncio.coroutine @asyncio.coroutine
def sub_connect(self, host, port): def sub_connect(self, host, port):

View File

@ -17,13 +17,13 @@ class _DictSyncSubstruct:
class DictSyncModel(QtCore.QAbstractTableModel): class DictSyncModel(QtCore.QAbstractTableModel):
def __init__(self, headers, parent, init): def __init__(self, headers, parent, init):
self.headers = headers self.headers = headers
self.data = init self.backing_store = init
self.row_to_key = sorted(self.data.keys(), self.row_to_key = sorted(self.backing_store.keys(),
key=lambda k: self.sort_key(k, self.data[k])) key=lambda k: self.sort_key(k, self.backing_store[k]))
QtCore.QAbstractTableModel.__init__(self, parent) QtCore.QAbstractTableModel.__init__(self, parent)
def rowCount(self, parent): def rowCount(self, parent):
return len(self.data) return len(self.backing_store)
def columnCount(self, parent): def columnCount(self, parent):
return len(self.headers) return len(self.headers)
@ -34,7 +34,7 @@ class DictSyncModel(QtCore.QAbstractTableModel):
elif role != QtCore.Qt.DisplayRole: elif role != QtCore.Qt.DisplayRole:
return None return None
k = self.row_to_key[index.row()] k = self.row_to_key[index.row()]
return self.convert(k, self.data[k], index.column()) return self.convert(k, self.backing_store[k], index.column())
def headerData(self, col, orientation, role): def headerData(self, col, orientation, role):
if (orientation == QtCore.Qt.Horizontal if (orientation == QtCore.Qt.Horizontal
@ -48,7 +48,7 @@ class DictSyncModel(QtCore.QAbstractTableModel):
while lo < hi: while lo < hi:
mid = (lo + hi)//2 mid = (lo + hi)//2
if (self.sort_key(self.row_to_key[mid], if (self.sort_key(self.row_to_key[mid],
self.data[self.row_to_key[mid]]) self.backing_store[self.row_to_key[mid]])
< self.sort_key(k, v)): < self.sort_key(k, v)):
lo = mid + 1 lo = mid + 1
else: else:
@ -56,7 +56,7 @@ class DictSyncModel(QtCore.QAbstractTableModel):
return lo return lo
def __setitem__(self, k, v): def __setitem__(self, k, v):
if k in self.data: if k in self.backing_store:
old_row = self.row_to_key.index(k) old_row = self.row_to_key.index(k)
new_row = self._find_row(k, v) new_row = self._find_row(k, v)
if old_row == new_row: if old_row == new_row:
@ -65,7 +65,7 @@ class DictSyncModel(QtCore.QAbstractTableModel):
else: else:
self.beginMoveRows(QtCore.QModelIndex(), old_row, old_row, self.beginMoveRows(QtCore.QModelIndex(), old_row, old_row,
QtCore.QModelIndex(), new_row) QtCore.QModelIndex(), new_row)
self.data[k] = v self.backing_store[k] = v
self.row_to_key[old_row], self.row_to_key[new_row] = \ self.row_to_key[old_row], self.row_to_key[new_row] = \
self.row_to_key[new_row], self.row_to_key[old_row] self.row_to_key[new_row], self.row_to_key[old_row]
if old_row != new_row: if old_row != new_row:
@ -73,7 +73,7 @@ class DictSyncModel(QtCore.QAbstractTableModel):
else: else:
row = self._find_row(k, v) row = self._find_row(k, v)
self.beginInsertRows(QtCore.QModelIndex(), row, row) self.beginInsertRows(QtCore.QModelIndex(), row, row)
self.data[k] = v self.backing_store[k] = v
self.row_to_key.insert(row, k) self.row_to_key.insert(row, k)
self.endInsertRows() self.endInsertRows()
@ -81,13 +81,13 @@ class DictSyncModel(QtCore.QAbstractTableModel):
row = self.row_to_key.index(k) row = self.row_to_key.index(k)
self.beginRemoveRows(QtCore.QModelIndex(), row, row) self.beginRemoveRows(QtCore.QModelIndex(), row, row)
del self.row_to_key[row] del self.row_to_key[row]
del self.data[k] del self.backing_store[k]
self.endRemoveRows() self.endRemoveRows()
def __getitem__(self, key): def __getitem__(self, key):
def update(): def update():
self[key] = self.data[key] self[key] = self.backing_store[key]
return _DictSyncSubstruct(update, self.data[key]) return _DictSyncSubstruct(update, self.backing_store[key])
def sort_key(self, k, v): def sort_key(self, k, v):
raise NotImplementedError raise NotImplementedError