Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: m-labs/artiq
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: da4a6a2e64bb
Choose a base ref
...
head repository: m-labs/artiq
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 744ae4cd13fc
Choose a head ref
  • 3 commits
  • 3 files changed
  • 1 contributor

Commits on Oct 14, 2015

  1. Copy the full SHA
    f855544 View commit details
  2. gui: log filtering

    sbourdeauducq committed Oct 14, 2015
    Copy the full SHA
    f3b3bf3 View commit details
  3. Copy the full SHA
    744ae4c View commit details
Showing with 58 additions and 15 deletions.
  1. +1 −0 artiq/frontend/artiq_gui.py
  2. +4 −10 artiq/gui/datasets.py
  3. +53 −5 artiq/gui/log.py
1 change: 1 addition & 0 deletions artiq/frontend/artiq_gui.py
Original file line number Diff line number Diff line change
@@ -116,6 +116,7 @@ def main():
atexit.register(lambda: loop.run_until_complete(d_schedule.sub_close()))

d_log = LogDock()
smgr.register(d_log)
loop.run_until_complete(d_log.sub_connect(
args.server, args.port_notify))
atexit.register(lambda: loop.run_until_complete(d_log.sub_close()))
14 changes: 4 additions & 10 deletions artiq/gui/datasets.py
Original file line number Diff line number Diff line change
@@ -74,15 +74,7 @@ def __init__(self, dialog_parent, dock_area):
self.displays = dict()

def _search_datasets(self):
model = self.table_model
search = self.search.displayText()
for row in range(model.rowCount(model.index(0, 0))):
index = model.index(row, 0)
dataset = model.data(index, QtCore.Qt.DisplayRole)
if search in dataset:
self.table.showRow(row)
else:
self.table.hideRow(row)
self.table_model_filter.setFilterFixedString(self.search.displayText())

def get_dataset(self, key):
return self.table_model.backing_store[key][1]
@@ -97,7 +89,9 @@ async def sub_close(self):

def init_datasets_model(self, init):
self.table_model = DatasetsModel(self.table, init)
self.table.setModel(self.table_model)
self.table_model_filter = QtCore.QSortFilterProxyModel()
self.table_model_filter.setSourceModel(self.table_model)
self.table.setModel(self.table_model_filter)
return self.table_model

def update_display_data(self, dsp):
58 changes: 53 additions & 5 deletions artiq/gui/log.py
Original file line number Diff line number Diff line change
@@ -3,7 +3,7 @@
import time

from quamash import QtGui, QtCore
from pyqtgraph import dockarea
from pyqtgraph import dockarea, LayoutWidget

from artiq.protocols.sync_struct import Subscriber
from artiq.gui.tools import ListSyncModel
@@ -20,6 +20,7 @@ def _level_to_name(level):
return "INFO"
return "DEBUG"


class _LogModel(ListSyncModel):
def __init__(self, parent, init):
ListSyncModel.__init__(self,
@@ -66,10 +67,39 @@ def convert(self, v, column):
return v[3]


class _LevelFilterProxyModel(QtCore.QSortFilterProxyModel):
def __init__(self, min_level):
QtCore.QSortFilterProxyModel.__init__(self)
self.min_level = min_level

def filterAcceptsRow(self, sourceRow, sourceParent):
model = self.sourceModel()
index = model.index(sourceRow, 0, sourceParent)
data = model.data(index, QtCore.Qt.DisplayRole)
return getattr(logging, data) >= self.min_level

def set_min_level(self, min_level):
self.min_level = min_level
self.invalidateFilter()


class LogDock(dockarea.Dock):
def __init__(self):
dockarea.Dock.__init__(self, "Log", size=(1000, 300))

grid = LayoutWidget()
self.addWidget(grid)

grid.addWidget(QtGui.QLabel("Minimum level: "), 0, 0)
grid.layout.setColumnStretch(0, 0)
grid.layout.setColumnStretch(1, 0)
grid.layout.setColumnStretch(2, 1)
self.filterbox = QtGui.QComboBox()
for item in "DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL":
self.filterbox.addItem(item)
grid.addWidget(self.filterbox, 0, 1)
self.filterbox.currentIndexChanged.connect(self.filter_changed)

self.log = QtGui.QTableView()
self.log.setSelectionMode(QtGui.QAbstractItemView.NoSelection)
self.log.horizontalHeader().setResizeMode(
@@ -78,7 +108,7 @@ def __init__(self):
QtGui.QAbstractItemView.ScrollPerPixel)
self.log.setShowGrid(False)
self.log.setTextElideMode(QtCore.Qt.ElideNone)
self.addWidget(self.log)
grid.addWidget(self.log, 1, 0, colspan=3)
self.scroll_at_bottom = False

async def sub_connect(self, host, port):
@@ -88,6 +118,10 @@ async def sub_connect(self, host, port):
async def sub_close(self):
await self.subscriber.close()

def filter_changed(self):
self.table_model_filter.set_min_level(
getattr(logging, self.filterbox.currentText()))

def rows_inserted_before(self):
scrollbar = self.log.verticalScrollBar()
self.scroll_at_bottom = scrollbar.value() == scrollbar.maximum()
@@ -98,7 +132,21 @@ def rows_inserted_after(self):

def init_log_model(self, init):
table_model = _LogModel(self.log, init)
self.log.setModel(table_model)
table_model.rowsAboutToBeInserted.connect(self.rows_inserted_before)
table_model.rowsInserted.connect(self.rows_inserted_after)
self.table_model_filter = _LevelFilterProxyModel(
getattr(logging, self.filterbox.currentText()))
self.table_model_filter.setSourceModel(table_model)
self.log.setModel(self.table_model_filter)
self.table_model_filter.rowsAboutToBeInserted.connect(self.rows_inserted_before)
self.table_model_filter.rowsInserted.connect(self.rows_inserted_after)
return table_model

def save_state(self):
return {"min_level_idx": self.filterbox.currentIndex()}

def restore_state(self, state):
try:
idx = state["min_level_idx"]
except KeyError:
pass
else:
self.filterbox.setCurrentIndex(idx)