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: 506b5ec4b02f
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: 3472e1abd35f
Choose a head ref
  • 5 commits
  • 2 files changed
  • 1 contributor

Commits on Apr 7, 2016

  1. Copy the full SHA
    762e040 View commit details
  2. Copy the full SHA
    d84bcfd View commit details
  3. browser: link list and tree

    jordens committed Apr 7, 2016
    Copy the full SHA
    9685771 View commit details
  4. browser: use fresh models

    jordens committed Apr 7, 2016
    Copy the full SHA
    4627345 View commit details
  5. browser: rm mdi area

    jordens committed Apr 7, 2016
    Copy the full SHA
    3472e1a View commit details
Showing with 62 additions and 63 deletions.
  1. +62 −45 artiq/browser/results.py
  2. +0 −18 artiq/frontend/artiq_browser.py
107 changes: 62 additions & 45 deletions artiq/browser/results.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import logging
import os

import h5py
from PyQt5 import QtCore, QtWidgets, QtGui
@@ -8,83 +9,99 @@

class ResultIconProvider(QtWidgets.QFileIconProvider):
def icon(self, info):
if not (info.isFile() and info.isReadable() and info.suffix() == "h5"):
return QtWidgets.QFileIconProvider.icon(self, info)
try:
with h5py.File(info.filePath(), "r") as f:
d = f["thumbnail"]
img = QtGui.QImage.fromData(d.value, d.attrs["extension"])
pix = QtGui.QPixmap.fromImage(img)
return QtGui.QIcon(pix)
except:
return QtWidgets.QFileIconProvider.icon(self, info)
icon = self.hdf5_thumbnail(info)
if icon is None:
icon = QtWidgets.QFileIconProvider.icon(self, info)
return icon

def hdf5_thumbnail(self, info):
if not (info.isFile() and info.isReadable() and
info.suffix() == "h5"):
return
with h5py.File(info.filePath(), "r") as f:
if "thumbnail" not in f:
return
img = QtGui.QImage.fromData(f["thumbnail"].value)
pix = QtGui.QPixmap.fromImage(img)
return QtGui.QIcon(pix)


class ResultsBrowser(QtWidgets.QSplitter):
def __init__(self, datasets):
def __init__(self, datasets, root=None):
QtWidgets.QSplitter.__init__(self)

if root is None:
root = QtCore.QDir.currentPath()

self.datasets = datasets

self.rt_model = QtWidgets.QFileSystemModel()
self.rt_model.setRootPath(QtCore.QDir.currentPath())
self.rt_model.setNameFilters(["*.h5"])
self.rt_model.setNameFilterDisables(False)
self.rt_model.setIconProvider(ResultIconProvider())
self.rt_model.setFilter(QtCore.QDir.NoDotAndDotDot |
QtCore.QDir.AllDirs)

self.rt = QtWidgets.QTreeView()
self.rt.setModel(self.rt_model)
self.rt.setRootIndex(self.rt_model.index(QtCore.QDir.currentPath()))
self.rt.setRootIndex(self.rt_model.setRootPath(root))
self.rt.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
self.rt.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection)
self.rt.selectionModel().selectionChanged.connect(
self.selection_changed)
self.rt.selectionModel().currentChanged.connect(
self.tree_current_changed)
self.rt.setRootIsDecorated(False)
self.addWidget(self.rt)

self.rl = QtWidgets.QListView()
self.rl.setViewMode(QtWidgets.QListView.IconMode)
self.rl.setModel(self.rt_model)
self.rl.setSelectionModel(self.rt.selectionModel())
self.rl.setRootIndex(self.rt.rootIndex())
l = QtGui.QFontMetrics(self.font()).lineSpacing()
self.rl.setIconSize(QtCore.QSize(20*l, 20*l))
self.rl.setIconSize(QtCore.QSize(20*l, 15*l))
self.rl.setFlow(QtWidgets.QListView.LeftToRight)
self.rl.setWrapping(True)
self.tree_current_changed(self.rt.currentIndex(), None)
self.addWidget(self.rl)

def showEvent(self, ev):
if hasattr(self, "_shown"):
return
self._shown = True
self.rt.hideColumn(1)
self.rt.hideColumn(2)
self.rt.hideColumn(3)
self.rt.scrollTo(self.rt.selectionModel().currentIndex())

def selection_changed(self, selected, deselected):
indexes = selected.indexes()
if not indexes:
def tree_current_changed(self, current, previous):
path = self.rt_model.filePath(current)
# we need to create a new model here. the old one remembers side effect
self.rl_model = QtWidgets.QFileSystemModel()
self.rl_model.setFilter(QtCore.QDir.Files)
self.rl_model.setNameFilters(["*.h5"])
self.rl_model.setNameFilterDisables(False)
self.rl_model.setIconProvider(ResultIconProvider())
self.rl.setModel(self.rl_model)
self.rl.setRootIndex(self.rl_model.setRootPath(path))
self.rl.selectionModel().currentChanged.connect(
self.list_current_changed)

def list_current_changed(self, current, previous):
info = self.rl_model.fileInfo(current)
logger.info("opening %s", info.filePath())
if not (info.isFile() and info.isReadable() and
info.suffix() == "h5"):
return
path = self.rt_model.filePath(indexes[0])
logger.info("opening %s", path)
try:
with h5py.File(path, "r") as f:
rd = {}
group = f["datasets"]
for k in group:
rd[k] = True, group[k].value
self.datasets.init(rd)
except:
pass
with h5py.File(info.filePath(), "r") as f:
rd = {}
if "datasets" not in f:
return
group = f["datasets"]
for k in group:
rd[k] = True, group[k].value
self.datasets.init(rd)

def select(self, path):
self.rt.selectionModel().setCurrentIndex(
self.rt_model.index(path),
QtCore.QItemSelectionModel.ClearAndSelect)
idx = self.rt_model.index(os.path.dirname(path))
self.rt.expand(idx)
self.rt.scrollTo(idx)
self.rt.setCurrentIndex(idx)
# rl root is signaled
self.rl.setCurrentIndex(self.rl_model.index(path))

def save_state(self):
return {
"selected": self.rt_model.filePath(
self.rt.selectionModel().currentIndex()),
"selected": self.rl_model.filePath(self.rt.currentIndex()),
"header": bytes(self.rt.header().saveState()),
"splitter": bytes(self.saveState()),
}
18 changes: 0 additions & 18 deletions artiq/frontend/artiq_browser.py
Original file line number Diff line number Diff line change
@@ -51,20 +51,6 @@ def restore_state(self, state):
self.restoreState(QtCore.QByteArray(state["state"]))


class MdiArea(QtWidgets.QMdiArea):
def __init__(self):
QtWidgets.QMdiArea.__init__(self)
self.pixmap = QtGui.QPixmap(os.path.join(artiq_dir, "gui", "logo.svg"))

def paintEvent(self, event):
QtWidgets.QMdiArea.paintEvent(self, event)
painter = QtGui.QPainter(self.viewport())
x = (self.width() - self.pixmap.width())//2
y = (self.height() - self.pixmap.height())//2
painter.setOpacity(0.5)
painter.drawPixmap(x, y, self.pixmap)


def main():
# initialize application
args = get_argparser().parse_args()
@@ -83,10 +69,6 @@ def main():
smgr.register(main_window)
status_bar = QtWidgets.QStatusBar()
main_window.setStatusBar(status_bar)
mdi_area = MdiArea()
mdi_area.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
mdi_area.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAsNeeded)
main_window.setCentralWidget(mdi_area)

d_results = results.ResultsBrowser(datasets_sub)
smgr.register(d_results)