Example #1
0
    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()
Example #2
0
    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()
Example #3
0
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)
Example #4
0
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)
Example #5
0
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)