1
+ #include " FeedbackTable.h"
2
+
3
+ #include < QApplication>
4
+ #include < QHeaderView>
5
+ #include < QTableWidgetItem>
6
+ #include < QIcon>
7
+ #include < QLabel>
8
+ #include < QStyle>
9
+ #include < QPushButton>
10
+ #include < QSignalMapper>
11
+ #include < QCheckBox>
12
+ #include < QColorDialog>
13
+
14
+ #include " Feedback.h"
15
+ #include " LabelColors.h"
16
+ #include " Region.h"
17
+ #include " RegionCollection.h"
18
+
19
+ FeedbackTable::FeedbackTable (QWidget* parent) : QTableWidget(parent) {
20
+ QStringList headers;
21
+ headers << " Id" << " Undertraced" << " Overtraced" << " Add to Slice" << " Remove Id" << " Split" << " Merge" << " Correct from Split/Merge" ;
22
+ setColumnCount (headers.length ());
23
+ setHorizontalHeaderLabels (headers);
24
+ verticalHeader ()->setVisible (false );
25
+ enableSorting ();
26
+ setMouseTracking (true );
27
+ setSizeAdjustPolicy (QAbstractScrollArea::AdjustToContents);
28
+
29
+ regions = nullptr ;
30
+
31
+ currentRegionLabel = 0 ;
32
+
33
+ filter = false ;
34
+
35
+ QObject::connect (this , &FeedbackTable::cellEntered, this , &FeedbackTable::on_cellEntered);
36
+ QObject::connect (this , &FeedbackTable::cellClicked, this , &FeedbackTable::on_cellClicked);
37
+ }
38
+
39
+ void FeedbackTable::update () {
40
+ if (!regions) return ;
41
+
42
+ disableSorting ();
43
+
44
+ std::vector<Region*> displayRegions;
45
+
46
+ for (RegionCollection::Iterator it = regions->Begin (); it != regions->End (); it++) {
47
+ Region* region = regions->Get (it);
48
+
49
+ if (!filter || region->GetFeedback ()->HasFeedback ()) {
50
+ displayRegions.push_back (region);
51
+ }
52
+ }
53
+
54
+ int numRegions = (int )displayRegions.size ();
55
+ setRowCount (numRegions);
56
+
57
+ // Add rows for each region
58
+ for (int i = 0 ; i < numRegions; i++) {
59
+ Region* region = displayRegions[i];
60
+ int label = (int )region->GetLabel ();
61
+
62
+ // Id
63
+ QTableWidgetItem* idItem = new QTableWidgetItem ();
64
+ idItem->setData (0 , label);
65
+ idItem->setTextAlignment (Qt::AlignCenter);
66
+ idItem->setFlags (Qt::ItemIsSelectable);
67
+
68
+ setItem (i, Id, idItem);
69
+
70
+ // Check boxes
71
+ addCheckWidget (i, Undertraced, region->GetFeedback ()->GetValue (Feedback::Undertraced));
72
+ addCheckWidget (i, Overtraced, region->GetFeedback ()->GetValue (Feedback::Overtraced));
73
+ addCheckWidget (i, AddToSlice, region->GetFeedback ()->GetValue (Feedback::AddToSlice));
74
+ addCheckWidget (i, RemoveId, region->GetFeedback ()->GetValue (Feedback::RemoveId));
75
+ addCheckWidget (i, Split, region->GetFeedback ()->GetValue (Feedback::Split));
76
+ addCheckWidget (i, Merge, region->GetFeedback ()->GetValue (Feedback::Merge));
77
+ addCheckWidget (i, CorrectSplitMerge, region->GetFeedback ()->GetValue (Feedback::CorrectSplitMerge));
78
+ }
79
+
80
+ enableSorting ();
81
+
82
+ selectRegionLabel (currentRegionLabel);
83
+ }
84
+
85
+ void FeedbackTable::update (RegionCollection* regionCollection) {
86
+ regions = regionCollection;
87
+
88
+ update ();
89
+ }
90
+
91
+ void FeedbackTable::selectRegionLabel (unsigned short label) {
92
+ currentRegionLabel = label;
93
+ QString labelString = QString::number (currentRegionLabel);
94
+
95
+ for (int i = 0 ; i < rowCount (); i++) {
96
+ QTableWidgetItem* ti = item (i, 0 );
97
+
98
+ if (ti->text () == labelString) {
99
+ ti->setBackgroundColor (QColor (" #1d91c0" ));
100
+ ti->setTextColor (QColor (" white" ));
101
+
102
+ scrollToItem (ti);
103
+ }
104
+ else {
105
+ ti->setBackgroundColor (QColor (" white" ));
106
+ ti->setTextColor (QColor (" black" ));
107
+ }
108
+ }
109
+ }
110
+
111
+ void FeedbackTable::setFilter (bool filterRows) {
112
+ filter = filterRows;
113
+
114
+ update ();
115
+ }
116
+
117
+ void FeedbackTable::on_cellEntered (int row, int column) {
118
+ QString labelString = QString::number (currentRegionLabel);
119
+
120
+ if (column == Id) {
121
+ // Highlight
122
+ for (int i = 0 ; i < rowCount (); i++) {
123
+ QTableWidgetItem* ti = item (i, 0 );
124
+
125
+ if (ti->text () == labelString) continue ;
126
+
127
+ if (i == row) {
128
+ ti->setBackgroundColor (QColor (" #bfe6f5" ));
129
+ }
130
+ else {
131
+ ti->setBackgroundColor (QColor (" white" ));
132
+ }
133
+ }
134
+
135
+ emit (highlightRegion (rowLabel (row)));
136
+ }
137
+ else {
138
+ // Clear highlight
139
+ for (int i = 0 ; i < rowCount (); i++) {
140
+ QTableWidgetItem* ti = item (i, 0 );
141
+
142
+ if (ti->text () == labelString) continue ;
143
+
144
+ ti->setBackgroundColor (QColor (" white" ));
145
+ }
146
+
147
+ emit (highlightRegion (0 ));
148
+ }
149
+ }
150
+
151
+ void FeedbackTable::on_cellClicked (int row, int column) {
152
+ if (column == Id) return ;
153
+
154
+ disableSorting ();
155
+
156
+ QCheckBox * checkBox = (QCheckBox*)cellWidget (row, column);
157
+ checkBox->toggle ();
158
+
159
+ emit (regionFeedback (rowLabel (row), columnToFeedback (column), checkBox->isChecked ()));
160
+
161
+ enableSorting ();
162
+ }
163
+
164
+ /*
165
+ void FeedbackTable::leaveEvent(QEvent* event) {
166
+ // Clear highlight
167
+ QString labelString = QString::number(currentRegionLabel);
168
+
169
+ for (int i = 0; i < rowCount(); i++) {
170
+ QTableWidgetItem* ti = item(i, 0);
171
+
172
+ if (ti->text() == labelString) continue;
173
+
174
+ ti->setBackgroundColor(QColor("white"));
175
+ }
176
+
177
+ emit(highlightRegion(0));
178
+ }
179
+ */
180
+
181
+ int FeedbackTable::rowLabel (int row) {
182
+ return item (row, 0 )->text ().toInt ();
183
+ }
184
+
185
+ void FeedbackTable::disableSorting () {
186
+ QObject::disconnect (horizontalHeader (), &QHeaderView::sortIndicatorChanged, this , &QTableWidget::resizeColumnsToContents);
187
+ setSortingEnabled (false );
188
+ }
189
+
190
+ void FeedbackTable::enableSorting () {
191
+ setSortingEnabled (true );
192
+ QObject::connect (horizontalHeader (), &QHeaderView::sortIndicatorChanged, this , &QTableWidget::resizeColumnsToContents);
193
+ resizeColumnsToContents ();
194
+ }
195
+
196
+ void FeedbackTable::addCheckWidget (int row, int column, bool checked) {
197
+ QTableWidgetItem* item = new QTableWidgetItem ();
198
+ item->setFlags (Qt::ItemIsSelectable);
199
+ item->setData (0 , checked);
200
+ item->setTextColor (QColor (" white" ));
201
+
202
+ QCheckBox* checkBox = new QCheckBox ();
203
+ checkBox->setChecked (checked);
204
+ checkBox->setStyleSheet (" margin-left:auto;margin-right:auto;" );
205
+ checkBox->setAttribute (Qt::WA_TransparentForMouseEvents);
206
+
207
+ setItem (row, column, item);
208
+ setCellWidget (row, column, checkBox);
209
+ }
210
+
211
+ Feedback::FeedbackType FeedbackTable::columnToFeedback (int column) {
212
+ switch (column) {
213
+ case Undertraced: return Feedback::Undertraced;
214
+ case Overtraced: return Feedback::Overtraced;
215
+ case AddToSlice: return Feedback::AddToSlice;
216
+ case RemoveId: return Feedback::RemoveId;
217
+ case Split: return Feedback::Split;
218
+ case Merge: return Feedback::Merge;
219
+ case CorrectSplitMerge: return Feedback::CorrectSplitMerge;
220
+ default : return Feedback::Undertraced;
221
+ }
222
+ }
0 commit comments