コード例 #1
0
ファイル: owtable.py プロジェクト: szzyiit/orange3
    def _setup_table_view(self, view, data):
        """Setup the `view` (QTableView) with `data` (Orange.data.Table)
        """
        datamodel = RichTableModel(data)
        rowcount = data.approx_len()

        if self.color_by_class and data.domain.has_discrete_class:
            color_schema = [QColor(*c) for c in data.domain.class_var.colors]
        else:
            color_schema = None
        if self.show_distributions:
            view.setItemDelegate(
                TableBarItemDelegate(view,
                                     color=self.dist_color,
                                     color_schema=color_schema))
        else:
            view.setItemDelegate(TableDataDelegate(view))

        # Enable/disable view sorting based on data's type
        view.setSortingEnabled(is_sortable(data))
        header = view.horizontalHeader()
        header.setSectionsClickable(is_sortable(data))
        header.setSortIndicatorShown(is_sortable(data))
        header.sortIndicatorChanged.connect(self.update_selection)

        view.setModel(datamodel)

        vheader = view.verticalHeader()
        option = view.viewOptions()
        size = view.style().sizeFromContents(QStyle.CT_ItemViewItem, option,
                                             QSize(20, 20), view)

        vheader.setDefaultSectionSize(size.height() + 2)
        vheader.setMinimumSectionSize(5)
        vheader.setSectionResizeMode(QHeaderView.Fixed)

        # Limit the number of rows displayed in the QTableView
        # (workaround for QTBUG-18490 / QTBUG-28631)
        maxrows = (2**31 - 1) // (vheader.defaultSectionSize() + 2)
        if rowcount > maxrows:
            sliceproxy = TableSliceProxy(parent=view,
                                         rowSlice=slice(0, maxrows))
            sliceproxy.setSourceModel(datamodel)
            # First reset the view (without this the header view retains
            # it's state - at this point invalid/broken)
            view.setModel(None)
            view.setModel(sliceproxy)

        assert view.model().rowCount() <= maxrows
        assert vheader.sectionSize(0) > 1 or datamodel.rowCount() == 0

        # update the header (attribute names)
        self._update_variable_labels(view)

        selmodel = BlockSelectionModel(view.model(),
                                       parent=view,
                                       selectBlocks=not self.select_rows)
        view.setSelectionModel(selmodel)
        view.selectionFinished.connect(self.update_selection)
コード例 #2
0
ファイル: owtable.py プロジェクト: szzyiit/orange3
 def _on_distribution_color_changed(self):
     for ti in range(self.tabs.count()):
         widget = self.tabs.widget(ti)
         model = widget.model()
         while isinstance(model, QAbstractProxyModel):
             model = model.sourceModel()
         data = model.source
         class_var = data.domain.class_var
         if self.color_by_class and class_var and class_var.is_discrete:
             color_schema = [QColor(*c) for c in class_var.colors]
         else:
             color_schema = None
         if self.show_distributions:
             delegate = TableBarItemDelegate(widget,
                                             color=self.dist_color,
                                             color_schema=color_schema)
         else:
             delegate = TableDataDelegate(widget)
         widget.setItemDelegate(delegate)
     tab = self.tabs.currentWidget()
     if tab:
         tab.reset()
コード例 #3
0
ファイル: owtable.py プロジェクト: szzyiit/orange3
    def _create_table_view(self):
        view = DataTableView()
        view.setSortingEnabled(True)
        view.setItemDelegate(TableDataDelegate(view))

        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)
        return view
コード例 #4
0
    def set_dataset(self, data, tid=None):
        """Set the input dataset."""
        if data is not None:
            datasetname = getattr(data, "name", "Data")
            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)
                assert self.tabs.indexOf(view) != -1
                self.tabs.setTabText(self.tabs.indexOf(view), datasetname)
            else:
                view = DataTableView()
                view.setSortingEnabled(True)
                view.setItemDelegate(TableDataDelegate(view))

                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)
                self.tabs.addTab(view, datasetname)

            view.dataset = data
            self.tabs.setCurrentWidget(view)

            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_input_summary(slot)

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

                def update(_):
                    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_input_summary(current.input_slot)
        else:
            self._set_input_summary(None)

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

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

        if data and 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.unconditional_commit()