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: 89772c6461d0
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: 9a01d38439e4
Choose a head ref
  • 4 commits
  • 3 files changed
  • 1 contributor

Commits on Apr 20, 2016

  1. browser: PATH metavar

    jordens committed Apr 20, 2016
    Copy the full SHA
    c9daa50 View commit details
  2. scanwidget: spelling

    jordens committed Apr 20, 2016
    Copy the full SHA
    7be3ffe View commit details
  3. browser: zommable file icons

    jordens committed Apr 20, 2016
    Copy the full SHA
    3578ba1 View commit details
  4. Copy the full SHA
    9a01d38 View commit details
Showing with 54 additions and 26 deletions.
  1. +45 −20 artiq/browser/files.py
  2. +6 −4 artiq/frontend/artiq_browser.py
  3. +3 −2 artiq/gui/scanwidget.py
65 changes: 45 additions & 20 deletions artiq/browser/files.py
Original file line number Diff line number Diff line change
@@ -56,9 +56,37 @@ def filterAcceptsRow(self, row, parent):
return QtCore.QSortFilterProxyModel.filterAcceptsRow(self, row, parent)


class ZoomIconView(QtWidgets.QListView):
zoom_step = 2**.25
aspect = 2/3
default_size = 25
min_size = 10
max_size = 1000

def __init__(self):
QtWidgets.QListView.__init__(self)
self._char_width = QtGui.QFontMetrics(self.font()).averageCharWidth()
self.setViewMode(self.IconMode)
w = self._char_width*self.default_size
self.setIconSize(QtCore.QSize(w, w*self.aspect))
self.setFlow(self.LeftToRight)
self.setResizeMode(self.Adjust)
self.setWrapping(True)

def wheelEvent(self, ev):
if ev.modifiers() & QtCore.Qt.ControlModifier:
a = self._char_width*self.min_size
b = self._char_width*self.max_size
w = self.iconSize().width()*self.zoom_step**(
ev.angleDelta().y()/120.)
if a <= w <= b:
self.setIconSize(QtCore.QSize(w, w*self.aspect))
else:
QtWidgets.QListView.wheelEvent(self, ev)


class FilesDock(QtWidgets.QDockWidget):
def __init__(self, datasets, main_window, root="",
select_file=None):
def __init__(self, datasets, main_window, browse_root="", select=None):
QtWidgets.QDockWidget.__init__(self, "Files")
self.setObjectName("Files")
self.setFeatures(self.DockWidgetMovable | self.DockWidgetFloatable)
@@ -68,7 +96,6 @@ def __init__(self, datasets, main_window, root="",

self.datasets = datasets
self.main_window = main_window
self.override_restore_file = select_file

self.model = QtWidgets.QFileSystemModel()
self.model.setFilter(QtCore.QDir.Drives | QtCore.QDir.NoDotAndDotDot |
@@ -85,7 +112,7 @@ def __init__(self, datasets, main_window, root="",
lambda: self.rt.resizeColumnToContents(0))
self.rt.setAnimated(False)
self.rt.setRootIndex(rt_model.mapFromSource(
self.model.setRootPath(root)))
self.model.setRootPath(os.path.abspath(browse_root))))
self.rt.setSelectionBehavior(self.rt.SelectRows)
self.rt.setSelectionMode(self.rt.SingleSelection)
self.rt.selectionModel().currentChanged.connect(
@@ -95,19 +122,21 @@ def __init__(self, datasets, main_window, root="",
self.rt.hideColumn(i)
self.splitter.addWidget(self.rt)

self.rl = QtWidgets.QListView()
self.rl.setViewMode(self.rl.IconMode)
l = QtGui.QFontMetrics(self.font()).lineSpacing()
self.rl.setIconSize(QtCore.QSize(20*l, 15*l))
self.rl.setFlow(self.rl.LeftToRight)
self.rl.setResizeMode(self.rl.Adjust)
self.rl.setWrapping(True)
self.rl = ZoomIconView()
self.rl.setModel(self.model)
self.rl.selectionModel().currentChanged.connect(
self.list_current_changed)
self.rl.activated.connect(self.open_experiment)
self.splitter.addWidget(self.rl)

self.restore_selected = select is None
if select is not None:
f = os.path.abspath(select)
if os.path.isdir(f):
self.select_dir(f)
else:
self.select_file(f)

def tree_current_changed(self, current, previous):
idx = self.rt.model().mapToSource(current)
self.rl.setRootIndex(idx)
@@ -149,14 +178,16 @@ def select_dir(self, path):
return
self.rl.setRootIndex(idx)

# ugly, see Spyder: late indexing, late scroll
def scroll_when_loaded(p):
if p != path:
return
self.model.directoryLoaded.disconnect(scroll_when_loaded)
QtCore.QTimer.singleShot(
100, lambda:
self.rt.scrollTo(self.rt.model().mapFromSource(
self.model.index(path)), self.rt.PositionAtCenter))
self.rt.scrollTo(
self.rt.model().mapFromSource(self.model.index(path)),
self.rt.PositionAtCenter))
self.model.directoryLoaded.connect(scroll_when_loaded)
idx = self.rt.model().mapFromSource(idx)
self.rt.expand(idx)
@@ -180,13 +211,7 @@ def save_state(self):
}

def restore_state(self, state):
if self.override_restore_file:
f = os.path.normpath(self.override_restore_file)
if os.path.isdir(f):
self.select_dir(f)
else:
self.select_file(f)
else:
if self.restore_selected:
self.select_dir(state["dir"])
self.select_file(state["file"])
self.rt.header().restoreState(QtCore.QByteArray(state["header"]))
10 changes: 6 additions & 4 deletions artiq/frontend/artiq_browser.py
Original file line number Diff line number Diff line change
@@ -24,10 +24,11 @@ def get_argparser():
parser.add_argument("--db-file", default=default_db_file,
help="database file for local browser settings "
"(default: %(default)s)")
parser.add_argument("--root", default="",
parser.add_argument("--browse-root", default="",
help="root path for directory tree "
"(default %(default)s)")
parser.add_argument("PATH", nargs="?", help="browse path or file")
parser.add_argument("select", metavar="SELECT", nargs="?",
help="directory to browse or file to load")
verbosity_args(parser)
return parser

@@ -85,15 +86,16 @@ def main():
smgr = state.StateManager(args.db_file)

datasets_sub = models.LocalModelManager(datasets.Model)
datasets_sub.init({})

# initialize main window
main_window = MainWindow()
smgr.register(main_window)
status_bar = QtWidgets.QStatusBar()
main_window.setStatusBar(status_bar)

d_files = files.FilesDock(datasets_sub, main_window, args.root,
args.PATH)
d_files = files.FilesDock(datasets_sub, main_window, args.browse_root,
select=args.select)
smgr.register(d_files)

d_applets = applets.AppletsDock(main_window, datasets_sub)
5 changes: 3 additions & 2 deletions artiq/gui/scanwidget.py
Original file line number Diff line number Diff line change
@@ -112,14 +112,15 @@ def setMaximum(self, v):

def setDecimals(self, n):
# TODO
# the axis should always use compressed notation is useful
# the axis should always use the most compact notation
# do not:
# self.ticker.precision = n
pass

def setSingleStep(self, v):
# TODO
# use this (and maybe decimals) to snap to "nice" values when dragging
# use this (and/or maybe decimals) to snap to "nice" values when
# dragging
pass

def setSuffix(self, v):