• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

nens / ThreeDiToolbox / #2589

19 Sep 2025 08:50AM UTC coverage: 35.01% (-0.1%) from 35.146%
#2589

push

coveralls-python

web-flow
Merge 38792c162 into f6f4be1e7

62 of 260 new or added lines in 40 files covered. (23.85%)

6 existing lines in 5 files now uncovered.

4859 of 13879 relevant lines covered (35.01%)

0.35 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

26.09
/tool_fraction_analysis/fraction_table.py
1
from qgis.PyQt.QtCore import pyqtSignal
1✔
2
from qgis.PyQt.QtCore import QEvent
1✔
3
from qgis.PyQt.QtGui import QColor
1✔
4
from qgis.PyQt.QtWidgets import QAbstractItemView
1✔
5
from qgis.PyQt.QtWidgets import QTableView
1✔
6
from qgis.PyQt.QtCore import Qt
1✔
7
from qgis.PyQt.QtWidgets import QColorDialog
1✔
8
from threedi_results_analysis.utils.widgets import PenStyleWidget
1✔
9

10

11
class FractionTable(QTableView):
1✔
12

13
    hoverExitAllRows = pyqtSignal()
1✔
14
    hoverEnterRow = pyqtSignal(int)
1✔
15

16
    def __init__(self, parent):
1✔
17
        super().__init__(parent)
×
18
        self.setStyleSheet("QTreeView::item:hover{background-color:#FFFF00;}")
×
19
        self.setMouseTracking(True)
×
20
        self.verticalHeader().hide()
×
NEW
21
        self.setSelectionBehavior(QAbstractItemView.SelectionBehavior.SelectRows)
×
22
        self.viewport().installEventFilter(self)
×
23

24
    def on_close(self):
1✔
25
        """
26
        unloading widget and remove all required stuff
27
        :return:
28
        """
29
        self.setMouseTracking(False)
×
30
        self.viewport().removeEventFilter(self)
×
31

32
    def closeEvent(self, event):
1✔
33
        self.on_close()
×
34
        event.accept()
×
35

36
    def keyPressEvent(self, event):
1✔
NEW
37
        if event.key() == Qt.Key_Space:
×
38
            # get the current selection
NEW
39
            selection = self.selectedIndexes()
×
40

41
            # Toggle the selected items
NEW
42
            for selectedIndex in selection:
×
NEW
43
                if selectedIndex.column() == 0:
×
NEW
44
                    item = self.model().itemFromIndex(selectedIndex)
×
NEW
45
                    if item.checkState() == Qt.CheckState.Checked:
×
NEW
46
                        item.setCheckState(Qt.CheckState.Unchecked)
×
47
                    else:
NEW
48
                        item.setCheckState(Qt.CheckState.Checked)
×
49

50
    def eventFilter(self, widget, event):
1✔
51
        if widget is self.viewport():
×
NEW
52
            if event.type() == QEvent.Type.MouseMove:
×
53
                index = self.indexAt(event.pos())
×
54
                row = index.row()
×
55
                if row != -1:
×
NEW
56
                    self.hoverEnterRow.emit(row)
×
57
                else:
58
                    self.hoverExitAllRows.emit()
×
NEW
59
            elif event.type() == QEvent.Type.Leave:
×
60
                self.hoverExitAllRows.emit()
×
NEW
61
            elif event.type() == QEvent.Type.MouseButtonDblClick:
×
NEW
62
                if event.button() == Qt.MouseButton.RightButton:
×
NEW
63
                    return True
×
64

NEW
65
                index = self.indexAt(event.pos())
×
66
                # Check whether the user clicked on the color column
NEW
67
                if index.column() == 1:
×
NEW
68
                    selected_color = QColorDialog.getColor()
×
NEW
69
                    if not selected_color.isValid():  # User pressed cancel
×
NEW
70
                        return True
×
71

NEW
72
                    item = self.model().itemFromIndex(index)
×
NEW
73
                    item.setData((Qt.SolidLine, (selected_color.red(), selected_color.green(), selected_color.blue())))
×
NEW
74
                    self._update_table_widgets()
×
75

UNCOV
76
        return QTableView.eventFilter(self, widget, event)
×
77

78
    def setModel(self, model):
1✔
79
        super().setModel(model)
×
80
        self.model().dataChanged.connect(self._update_table_widgets)
×
81
        self.model().rowsInserted.connect(self._update_table_widgets)
×
82
        self.model().rowsAboutToBeRemoved.connect(self._update_table_widgets)
×
83
        self.horizontalHeader().setStretchLastSection(True)
×
84
        self.resizeColumnsToContents()
×
85
        self.setVisible(True)
×
86

87
    def _update_table_widgets(self):
1✔
88
        """The PenStyle widget is not part of the model, but explicitely added/overlayed to the table"""
89
        for row in range(self.model().rowCount()):
×
90
            style, color = self.model().item(row, 1).data()
×
91
            # If index widget A is replaced with index widget B, index widget A will be deleted.
92
            patternWidget = PenStyleWidget(style, QColor(*color), self)
×
93
            patternWidget.setPalette(self.palette())
×
94
            self.setIndexWidget(self.model().index(row, 1), patternWidget)
×
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc