def __init__(self, parent, gsize, vflags=1, *args, **kw): super(AtGraphicsView, self).__init__(parent, *args, **kw) self._items = dict() self.gsize = gsize self._grid = ItemGrid(self.gsize) self._hdf = None self.vflags = vflags scene = AtGraphicsScene() scene.setBackgroundBrush(QtCore.Qt.darkGray) self.setScene(scene) self.createActions() self.createContextMenu()
class AtGraphicsView(MouseWheelView): itemLoaded = QtCore.pyqtSignal(int) emitSelectedItems = QtCore.pyqtSignal(list) quickSort = QtCore.pyqtSignal() def __init__(self, parent, gsize, vflags=1, *args, **kw): super(AtGraphicsView, self).__init__(parent, *args, **kw) self._items = dict() self.gsize = gsize self._grid = ItemGrid(self.gsize) self._hdf = None self.vflags = vflags self._quicksortmode = False scene = AtGraphicsScene() scene.setBackgroundBrush(QtCore.Qt.darkGray) self.setScene(scene) self.createActions() self.createContextMenu() @property def items(self): return self._items.values() def has_key(self, key): return self._items.has_key(key) def hashkeys(self): return self._items.keys() def __getitem__(self, key): return self._items[key] def __setitem__(self, key, item): self._items[key] = item @property def treatments(self): return set([i.treatment for i in self.items]) def setQuickSortMode(self, flag): assert isinstance(flag, bool) self._quicksortmode = flag def setViewFlags(self, vflags): target = (vflags & ViewFlags.Classification) current = (self.vflags & ViewFlags.Classification) if current is not target: self.toggleClassIndicators(target) target = (vflags & ViewFlags.Mask) current = (self.vflags & ViewFlags.Mask) if current is not target: self.toggleMasks(target) target = (vflags & ViewFlags.Outline) current = (self.vflags & ViewFlags.Outline) if current is not target: self.toggleOutlines(target) target = (vflags & ViewFlags.Description) current = (self.vflags & ViewFlags.Description) if current is not target: self.toggleDescription(target) def zoom(self, factor): factor = factor/self.transform().m11() self.scale(factor, factor) self.reorder(True) def scale(self, factor1, factor2): super(AtGraphicsView, self).scale(factor1, factor2) self.zoomChanged.emit(self.transform().m11()) def contextMenuEvent(self, event): self.context_menu.exec_(event.globalPos()) def createContextMenu(self): self.context_menu = QtWidgets.QMenu(self) self.context_menu.setTearOffEnabled(True) self.context_menu.addAction(self.actionRefresh) self.context_menu.addAction(self.actionSelectAll) self.context_menu.addAction(self.actionInvertSelection) self.context_menu.addAction(self.actionSelectByTreatment) self.context_menu.addSeparator() self.context_menu.addAction(self.actionQuickSort) def createActions(self): self.actionRefresh = QtWidgets.QAction( "&Refresh", self, triggered=lambda: self.reorder(True)) self.actionSelectAll = QtWidgets.QAction("Select &all", self, triggered=self.selectAll) self.actionInvertSelection = QtWidgets.QAction( "&Invert Selection", self, triggered=self.invertSelection) self.actionQuickSort = QtWidgets.QAction( QtGui.QIcon(":/crosshairs.png"), "&Quick Sort", self, triggered=self.parent().onQuickSort) self.actionSelectByTreatment = QtWidgets.QAction( "&Select by Treatment", self, triggered=self.parent().selectByTreatment) def toggleClassIndicators(self, state): n = int(math.log(ViewFlags.Classification, 2)) self.vflags ^= (-state ^ self.vflags) & (1 << n) for item in self.items: item.toggleClassIndicator(state) def toggleMasks(self, state): n = int(math.log(ViewFlags.Mask, 2)) self.vflags ^= (-state ^ self.vflags) & (1 << n) for item in self.items: item.toggleMask(state) def toggleOutlines(self, state): n = int(math.log(ViewFlags.Outline, 2)) self.vflags ^= (-state ^ self.vflags) & (1 << n) for item in self.items: item.toggleOutline(state) def toggleDescription(self, state): n = int(math.log(ViewFlags.Description, 2)) self.vflags ^= (-state ^ self.vflags) & (1 << n) for item in self.items: item.toggleDescription(state) def selectedItems(self): return self.scene().selectedItems() def updateNColumns(self, width): ncols = math.floor( width/(self._grid.colwidth*self.transform().m11())-1) if ncols < self._grid.MinNumberColumns: self._grid.ncols = self._grid.MinNumberColumns # change zoom factor to that all columns fit in the window zf = self.size().width()/(1.05*self._grid.ncols*self._grid.colwidth) self.zoom(zf) else: self._grid.ncols = ncols def updateRaster(self, gsize): self.gsize = gsize self._grid.setColWidth(gsize) def reorder(self, force_update=False): scaled_colwidth = self.transform().m11()*self._grid.colwidth col_count = math.floor(self.size().width()% scaled_colwidth) if col_count != self._grid.colCount(): width = self.size().width()/self.transform().m11() self._grid.reorder(width - scaled_colwidth) self.scene().setSceneRect(self._grid.rect(5.0)) def resizeEvent(self, event): super(AtGraphicsView, self).resizeEvent(event) self.reorder() def wheelEvent(self, event): super(AtGraphicsView, self).wheelEvent(event) self.reorder() def enterEvent(self, event): if self._quicksortmode: QtWidgets.QApplication.setOverrideCursor( # QtGui.QCursor(Qt.PointingHandCursor)) QtGui.QCursor(Qt.CrossCursor)) def leaveEvent(self, event): if self._quicksortmode: QtWidgets.QApplication.restoreOverrideCursor() def mousePressEvent(self, event): if not self._quicksortmode: super(AtGraphicsView, self).mousePressEvent(event) def mouseReleaseEvent(self, event): if self._quicksortmode: pos = self.mapToScene(event.pos()) try: item = self.scene().itemUnderPos(pos) except IndexError: pass else: self.scene().clearSelection() self.scene().selectItem(item) finally: self.quickSort.emit() QtWidgets.QApplication.restoreOverrideCursor() super(AtGraphicsView, self).mouseReleaseEvent(event) def clear(self): self._abort = True self.scene().clear() self.scene().setSceneRect(QtCore.QRectF()) self._grid.reset() self._items.clear() def addItem(self, items): if not isinstance(items, list): items = [items] for item in items: if self.has_key(item.hash): continue citem = CellGraphicsItem(item, len(self._items)) citem.setPos(*self._grid.newPos(citem)) citem.toggleClassIndicator(self.vflags & ViewFlags.Classification) citem.toggleOutline(self.vflags & ViewFlags.Outline) citem.toggleMask(self.vflags & ViewFlags.Mask) citem.toggleDescription(self.vflags & ViewFlags.Description) self[citem.hash] = citem self.scene().addItem(citem) self.scene().setSceneRect(self._grid.rect(5.0)) def selectByKey(self, hashkey): """Set item with hashkey selected and all other items unselected.""" for item in self.items: if item.hash == hashkey: item.setSelected(True) self.centerOn(item) else: item.setSelected(False) def selectAll(self): state = self.scene().blockSignals(True) for item in self.items: self.scene().selectItem(item) self.scene().blockSignals(state) def invertSelection(self): state = self.scene().blockSignals(True) for item in self.items: sel_state = not item.isSelected() item.setSelected(sel_state) self.scene().blockSignals(state) def selectByTreatment(self, treatment): state = self.scene().blockSignals(True) for item in self.items: if item.treatment == treatment: item.setSelected(item.treatment == treatment) self.scene().blockSignals(state)
class AtGraphicsView(MouseWheelView): itemLoaded = QtCore.pyqtSignal(int) emitSelectedItems = QtCore.pyqtSignal(list) def __init__(self, parent, gsize, vflags=1, *args, **kw): super(AtGraphicsView, self).__init__(parent, *args, **kw) self._items = dict() self.gsize = gsize self._grid = ItemGrid(self.gsize) self._hdf = None self.vflags = vflags scene = AtGraphicsScene() scene.setBackgroundBrush(QtCore.Qt.darkGray) self.setScene(scene) self.createActions() self.createContextMenu() @property def items(self): return self._items.values() def has_key(self, key): return self._items.has_key() def hashkeys(self): return self._items.keys() def __getitem__(self, key): return self._items[key] def __setitem__(self, key, item): self._items[key] = item def setViewFlags(self, vflags): self.vflags = vflags def zoom(self, factor): factor = factor/self.transform().m11() self.scale(factor, factor) self.reorder(True) def scale(self, factor1, factor2): super(AtGraphicsView, self).scale(factor1, factor2) self.zoomChanged.emit(self.transform().m11()) def contextMenuEvent(self, event): self.context_menu.exec_(event.globalPos()) def createContextMenu(self): self.context_menu = QtWidgets.QMenu(self) self.context_menu.setTearOffEnabled(True) self.context_menu.addAction(self.actionRefresh) self.context_menu.addAction(self.actionSelectAll) self.context_menu.addAction(self.actionInvertSelection) self.context_menu.addSeparator() self.context_menu.addAction(self.actionThrowAnchor) def createActions(self): self.actionRefresh = QtWidgets.QAction( "&Refresh", self, triggered=lambda: self.reorder(True)) self.actionSelectAll = QtWidgets.QAction("Select &all", self, triggered=self.scene().selectAll) self.actionInvertSelection = QtWidgets.QAction( "&Invert Selection", self, triggered=self.scene().invertSelection) self.actionThrowAnchor = QtWidgets.QAction( "&Throw Sort Anchor", self, triggered=self.parent().onThrowAnchor) def toggleClassIndicators(self, state): for item in self.items: item.toggleClassIndicator(state) def toggleMasks(self, state): for item in self.items: item.toggleMask(state) def toggleOutlines(self, state): for item in self.items: item.toggleOutline(state) def toggleDescription(self, state): for item in self.items: item.toggleDescription(state) def selectedItems(self): return self.scene().selectedItems() def updateNColumns(self, width): self._grid.ncols = math.floor( width/(self._grid.colwidth*self.transform().m11())-1) def updateRaster(self, gsize): self.gsize = gsize self._grid.setColWidth(gsize) def reorder(self, force_update=False): scaled_colwidth = self.transform().m11()*self._grid.colwidth col_count = math.floor(self.size().width()% scaled_colwidth) if col_count != self._grid.colCount(): width = self.size().width()/self.transform().m11() self._grid.reorder(width - scaled_colwidth) self.scene().setSceneRect(self._grid.rect(5.0)) def resizeEvent(self, event): super(AtGraphicsView, self).resizeEvent(event) self.reorder() def wheelEvent(self, event): super(AtGraphicsView, self).wheelEvent(event) self.reorder() def clear(self): self._abort = True self.scene().clear() self.scene().setSceneRect(QtCore.QRectF()) self._grid.reset() self._items.clear() def addItem(self, items): if not isinstance(items, list): items = [items] for item in items: citem = CellGraphicsItem(item) citem.setPos(*self._grid.newPos(citem)) citem.toggleClassIndicator(self.vflags & ViewFlags.Classification) citem.toggleOutline(self.vflags & ViewFlags.Outline) citem.toggleMask(self.vflags & ViewFlags.Mask) citem.toggleDescription(self.vflags & ViewFlags.Description) self[citem.hash] = citem self.scene().addItem(citem) self.scene().setSceneRect(self._grid.rect(5.0)) def selectByKey(self, hashkey): """Set item with hashkey selected and all other items unselected.""" for item in self.items: if item.hash == hashkey: item.setSelected(True) self.centerOn(item) else: item.setSelected(False)
class AtGraphicsView(MouseWheelView): itemLoaded = QtCore.pyqtSignal(int) emitSelectedItems = QtCore.pyqtSignal(list) def __init__(self, parent, gsize, vflags=1, *args, **kw): super(AtGraphicsView, self).__init__(parent, *args, **kw) self._items = dict() self.gsize = gsize self._grid = ItemGrid(self.gsize) self._hdf = None self.vflags = vflags scene = AtGraphicsScene() scene.setBackgroundBrush(QtCore.Qt.darkGray) self.setScene(scene) self.createActions() self.createContextMenu() @property def items(self): return self._items.values() def has_key(self, key): return self._items.has_key() def hashkeys(self): return self._items.keys() def __getitem__(self, key): return self._items[key] def __setitem__(self, key, item): self._items[key] = item def setViewFlags(self, vflags): self.vflags = vflags def zoom(self, factor): factor = factor / self.transform().m11() self.scale(factor, factor) self.reorder(True) def scale(self, factor1, factor2): super(AtGraphicsView, self).scale(factor1, factor2) self.zoomChanged.emit(self.transform().m11()) def contextMenuEvent(self, event): self.context_menu.exec_(event.globalPos()) def createContextMenu(self): self.context_menu = QtWidgets.QMenu(self) self.context_menu.setTearOffEnabled(True) self.context_menu.addAction(self.actionRefresh) self.context_menu.addAction(self.actionSelectAll) self.context_menu.addAction(self.actionInvertSelection) self.context_menu.addSeparator() self.context_menu.addAction(self.actionThrowAnchor) def createActions(self): self.actionRefresh = QtWidgets.QAction("&Refresh", self, triggered=lambda: self.reorder(True)) self.actionSelectAll = QtWidgets.QAction("Select &all", self, triggered=self.scene().selectAll) self.actionInvertSelection = QtWidgets.QAction( "&Invert Selection", self, triggered=self.scene().invertSelection ) self.actionThrowAnchor = QtWidgets.QAction("&Throw Sort Anchor", self, triggered=self.parent().onThrowAnchor) def toggleClassIndicators(self, state): for item in self.items: item.toggleClassIndicator(state) def toggleMasks(self, state): for item in self.items: item.toggleMask(state) def toggleOutlines(self, state): for item in self.items: item.toggleOutline(state) def toggleDescription(self, state): for item in self.items: item.toggleDescription(state) def selectedItems(self): return self.scene().selectedItems() def updateNColumns(self, width): self._grid.ncols = math.floor(width / (self._grid.colwidth * self.transform().m11()) - 1) def updateRaster(self, gsize): self.gsize = gsize self._grid.setColWidth(gsize) def reorder(self, force_update=False): scaled_colwidth = self.transform().m11() * self._grid.colwidth col_count = math.floor(self.size().width() % scaled_colwidth) if col_count != self._grid.colCount(): width = self.size().width() / self.transform().m11() self._grid.reorder(width - scaled_colwidth) self.scene().setSceneRect(self._grid.rect(5.0)) def resizeEvent(self, event): super(AtGraphicsView, self).resizeEvent(event) self.reorder() def wheelEvent(self, event): super(AtGraphicsView, self).wheelEvent(event) self.reorder() def clear(self): self._abort = True self.scene().clear() self.scene().setSceneRect(QtCore.QRectF()) self._grid.reset() self._items.clear() def addItem(self, items): if not isinstance(items, list): items = [items] for item in items: citem = CellGraphicsItem(item) citem.setPos(*self._grid.newPos(citem)) citem.toggleClassIndicator(self.vflags & ViewFlags.Classification) citem.toggleOutline(self.vflags & ViewFlags.Outline) citem.toggleMask(self.vflags & ViewFlags.Mask) citem.toggleDescription(self.vflags & ViewFlags.Description) self[citem.hash] = citem self.scene().addItem(citem) self.scene().setSceneRect(self._grid.rect(5.0)) def selectByKey(self, hashkey): """Set item with hashkey selected and all other items unselected.""" for item in self.items: if item.hash == hashkey: item.setSelected(True) self.centerOn(item) else: item.setSelected(False)