|
7 | 7 | import numpy as np |
8 | 8 |
|
9 | 9 | from AnyQt import QtGui |
10 | | -from AnyQt.QtWidgets import QHeaderView, QStyledItemDelegate |
| 10 | +from AnyQt.QtWidgets import QHeaderView, QStyledItemDelegate, QMenu |
11 | 11 | from AnyQt.QtGui import QStandardItemModel, QStandardItem |
12 | 12 | from AnyQt.QtCore import Qt, QSize |
13 | 13 |
|
@@ -170,6 +170,10 @@ class OWTestLearners(OWWidget): |
170 | 170 | TARGET_AVERAGE = "(Average over classes)" |
171 | 171 | class_selection = settings.ContextSetting(TARGET_AVERAGE) |
172 | 172 |
|
| 173 | + shown_scores = \ |
| 174 | + settings.Setting({"AUC", "CA", "F1", "Precision", "Recall", |
| 175 | + "MSE", "RMSE", "MAE", "R2"}) |
| 176 | + |
173 | 177 | class Error(OWWidget.Error): |
174 | 178 | train_data_empty = Msg("Train data set is empty.") |
175 | 179 | test_data_empty = Msg("Test data set is empty.") |
@@ -261,6 +265,8 @@ def __init__(self): |
261 | 265 | header.setSectionResizeMode(QHeaderView.ResizeToContents) |
262 | 266 | header.setDefaultAlignment(Qt.AlignCenter) |
263 | 267 | header.setStretchLastSection(False) |
| 268 | + header.setContextMenuPolicy(Qt.CustomContextMenu) |
| 269 | + header.customContextMenuRequested.connect(self.show_column_chooser) |
264 | 270 |
|
265 | 271 | self.result_model = QStandardItemModel(self) |
266 | 272 | self.result_model.setHorizontalHeaderLabels(["Method"]) |
@@ -546,6 +552,16 @@ def _update_header(self): |
546 | 552 | self.result_model.takeColumn(i) |
547 | 553 |
|
548 | 554 | self.result_model.setHorizontalHeaderLabels(headers) |
| 555 | + self._update_shown_columns() |
| 556 | + |
| 557 | + def _update_shown_columns(self): |
| 558 | + # pylint doesn't know that self.shown_scores is a set, not a Setting |
| 559 | + # pylint: disable=unsupported-membership-test |
| 560 | + model = self.result_model |
| 561 | + header = self.view.horizontalHeader() |
| 562 | + for section in range(1, model.columnCount()): |
| 563 | + col_name = model.horizontalHeaderItem(section).data(Qt.DisplayRole) |
| 564 | + header.setSectionHidden(section, col_name not in self.shown_scores) |
549 | 565 |
|
550 | 566 | def _update_stats_model(self): |
551 | 567 | # Update the results_model with up to date scores. |
@@ -660,6 +676,25 @@ def _invalidate(self, which=None): |
660 | 676 |
|
661 | 677 | self.commit() |
662 | 678 |
|
| 679 | + def show_column_chooser(self, pos): |
| 680 | + def update(col_name, state): |
| 681 | + if state: |
| 682 | + self.shown_scores.add(col_name) |
| 683 | + else: |
| 684 | + self.shown_scores.remove(col_name) |
| 685 | + self._update_shown_columns() |
| 686 | + |
| 687 | + menu = QMenu() |
| 688 | + model = self.result_model |
| 689 | + header = self.view.horizontalHeader() |
| 690 | + for section in range(1, model.columnCount()): |
| 691 | + col_name = model.horizontalHeaderItem(section).data(Qt.DisplayRole) |
| 692 | + action = menu.addAction(col_name) |
| 693 | + action.setCheckable(True) |
| 694 | + action.setChecked(col_name in self.shown_scores) |
| 695 | + action.triggered.connect(functools.partial(update, col_name)) |
| 696 | + menu.exec(header.mapToGlobal(pos)) |
| 697 | + |
663 | 698 | def commit(self): |
664 | 699 | """Recompute and output the results""" |
665 | 700 | self._update_header() |
@@ -840,6 +875,7 @@ def main(argv=None): |
840 | 875 | for i in range(len(learners)): |
841 | 876 | w.set_learner(None, i) |
842 | 877 | w.handleNewSignals() |
| 878 | + w.saveSettings() |
843 | 879 | return rval |
844 | 880 |
|
845 | 881 | if __name__ == "__main__": |
|
0 commit comments