Beispiel #1
0
class TestDataDelegate(GuiTest):
    def setUp(self) -> None:
        super().setUp()
        self.view = QTableView()
        self.model = create_model(5, 2)
        self.delegate = DataDelegate(self.view)
        self.view.setItemDelegate(self.delegate)

    def tearDown(self) -> None:
        self.view.deleteLater()
        self.view = None
        self.model = None
        super().tearDown()

    def test_init_style_options(self):
        delegate = self.delegate
        model = self.model
        index = model.index(0, 0)
        model.setData(index, 1, Qt.DisplayRole)
        opt = QStyleOptionViewItem()
        delegate.initStyleOption(opt, index)
        self.assertEqual(opt.displayAlignment, Qt.AlignRight)
        model.setData(index, "A", Qt.DisplayRole)

        opt = QStyleOptionViewItem()
        delegate.initStyleOption(opt, index)
        self.assertEqual(opt.displayAlignment, Qt.AlignLeft)

    def test_paint(self):
        delegate = self.delegate
        model = self.model
        index = model.index(0, 0)
        model.setData(index, 1, Qt.DisplayRole)

        def paint_with_data(data):
            model.setItemData(index, data)
            opt = self.view.viewOptions()
            opt.rect = QRect(QPoint(0, 0), delegate.sizeHint(opt, index))
            delegate.initStyleOption(opt, index)
            img = QImage(opt.rect.size(), QImage.Format_ARGB32_Premultiplied)
            p = QPainter(img)
            try:
                delegate.paint(p, opt, index)
            finally:
                p.end()

        paint_with_data({Qt.DisplayRole: 1.0})
        paint_with_data({Qt.DisplayRole: "AA"})
        paint_with_data({
            Qt.DisplayRole: "AA",
            Qt.TextAlignmentRole: Qt.AlignLeft | Qt.AlignTop
        })
        paint_with_data({
            Qt.DisplayRole: "AA",
            Qt.TextAlignmentRole: Qt.AlignHCenter | Qt.AlignVCenter
        })
        paint_with_data({
            Qt.DisplayRole: "AA",
            Qt.TextAlignmentRole: Qt.AlignRight | Qt.AlignBottom
        })
Beispiel #2
0
class TestBarItemDataDelegate(GuiTest):
    def setUp(self) -> None:
        super().setUp()
        self.view = QTableView()
        self.model = create_model(5, 2)
        self.delegate = BarItemDataDelegate(self.view)
        self.view.setItemDelegate(self.delegate)

    def tearDown(self) -> None:
        self.view.deleteLater()
        self.view = None
        self.model = None
        super().tearDown()

    def test_size_hint(self):
        model = self.model
        index = model.index(0, 0)
        delegate = self.delegate
        model.setData(index, 0.5, delegate.barFillRatioRole)
        sh1 = delegate.sizeHint(self.view.viewOptions(), index)
        delegate.penWidth += 2
        sh2 = delegate.sizeHint(self.view.viewOptions(), index)
        self.assertGreater(sh2.height(), sh1.height())

    def test_paint(self):
        model = self.model
        index = model.index(0, 0)
        delegate = self.delegate
        model.setData(index, 0.5, delegate.barFillRatioRole)

        def paint_with_data(data):
            model.setItemData(index, data)
            opt = self.view.viewOptions()
            opt.rect = QRect(QPoint(0, 0), delegate.sizeHint(opt, index))
            delegate.initStyleOption(opt, index)
            img = QImage(opt.rect.size(), QImage.Format_ARGB32_Premultiplied)
            p = QPainter(img)
            try:
                delegate.paint(p, opt, index)
            finally:
                p.end()

        paint_with_data({
            delegate.barFillRatioRole: 0.2,
            delegate.barColorRole: QColor(Qt.magenta)
        })
        paint_with_data({
            delegate.barFillRatioRole: None,
            delegate.barColorRole: None
        })
Beispiel #3
0
    def set_dataset(self, data, tid=None):
        """Set the input dataset."""
        self.closeContext()
        if data is not None:
            if tid in self._inputs:
                # update existing input slot
                slot = self._inputs[tid]
                view = slot.view
                # reset the (header) view state.
                view.setModel(None)
                view.horizontalHeader().setSortIndicator(-1, Qt.AscendingOrder)
            else:
                view = QTableView()
                view.setSortingEnabled(True)
                view.setHorizontalScrollMode(QTableView.ScrollPerPixel)

                if self.select_rows:
                    view.setSelectionBehavior(QTableView.SelectRows)

                header = view.horizontalHeader()
                header.setSectionsMovable(True)
                header.setSectionsClickable(True)
                header.setSortIndicatorShown(True)
                header.setSortIndicator(-1, Qt.AscendingOrder)

                # QHeaderView does not 'reset' the model sort column,
                # because there is no guaranty (requirement) that the
                # models understand the -1 sort column.
                def sort_reset(index, order):
                    if view.model() is not None and index == -1:
                        view.model().sort(index, order)

                header.sortIndicatorChanged.connect(sort_reset)

            view.dataset = data
            self.tabs.addTab(view, getattr(data, "name", "Data"))

            self._setup_table_view(view, data)
            slot = TableSlot(tid, data, table_summary(data), view)
            view._input_slot = slot
            self._inputs[tid] = slot

            self.tabs.setCurrentIndex(self.tabs.indexOf(view))

            self.set_info(slot.summary)

            if isinstance(slot.summary.len, concurrent.futures.Future):

                def update(f):
                    QMetaObject.invokeMethod(self, "_update_info",
                                             Qt.QueuedConnection)

                slot.summary.len.add_done_callback(update)

        elif tid in self._inputs:
            slot = self._inputs.pop(tid)
            view = slot.view
            view.hide()
            view.deleteLater()
            self.tabs.removeTab(self.tabs.indexOf(view))

            current = self.tabs.currentWidget()
            if current is not None:
                self.set_info(current._input_slot.summary)

        self.tabs.tabBar().setVisible(self.tabs.count() > 1)
        self.openContext(data)

        if self.__pending_selected_rows is not None:
            self.selected_rows = self.__pending_selected_rows
            self.__pending_selected_rows = None
        else:
            self.selected_rows = []

        if self.__pending_selected_cols is not None:
            self.selected_cols = self.__pending_selected_cols
            self.__pending_selected_cols = None
        else:
            self.selected_cols = []

        self.set_selection()
        self.commit()
Beispiel #4
0
    def set_dataset(self, data, tid=None):
        """Set the input dataset."""
        self.closeContext()
        if data is not None:
            if tid in self._inputs:
                # update existing input slot
                slot = self._inputs[tid]
                view = slot.view
                # reset the (header) view state.
                view.setModel(None)
                view.horizontalHeader().setSortIndicator(-1, Qt.AscendingOrder)
            else:
                view = QTableView()
                view.setSortingEnabled(True)
                view.setHorizontalScrollMode(QTableView.ScrollPerPixel)

                if self.select_rows:
                    view.setSelectionBehavior(QTableView.SelectRows)

                header = view.horizontalHeader()
                header.setSectionsMovable(True)
                header.setSectionsClickable(True)
                header.setSortIndicatorShown(True)
                header.setSortIndicator(-1, Qt.AscendingOrder)

                # QHeaderView does not 'reset' the model sort column,
                # because there is no guaranty (requirement) that the
                # models understand the -1 sort column.
                def sort_reset(index, order):
                    if view.model() is not None and index == -1:
                        view.model().sort(index, order)

                header.sortIndicatorChanged.connect(sort_reset)

            view.dataset = data
            self.tabs.addTab(view, getattr(data, "name", "Data"))

            self._setup_table_view(view, data)
            slot = TableSlot(tid, data, table_summary(data), view)
            view._input_slot = slot
            self._inputs[tid] = slot

            self.tabs.setCurrentIndex(self.tabs.indexOf(view))

            self.set_info(slot.summary)

            if isinstance(slot.summary.len, concurrent.futures.Future):
                def update(f):
                    QMetaObject.invokeMethod(
                        self, "_update_info", Qt.QueuedConnection)

                slot.summary.len.add_done_callback(update)

        elif tid in self._inputs:
            slot = self._inputs.pop(tid)
            view = slot.view
            view.hide()
            view.deleteLater()
            self.tabs.removeTab(self.tabs.indexOf(view))

            current = self.tabs.currentWidget()
            if current is not None:
                self.set_info(current._input_slot.summary)

        self.tabs.tabBar().setVisible(self.tabs.count() > 1)
        self.selected_rows = []
        self.selected_cols = []
        self.openContext(data)
        self.set_selection()
        self.commit()