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

paulmthompson / WhiskerToolbox / 17816075334

18 Sep 2025 02:21AM UTC coverage: 71.944% (-0.06%) from 72.003%
17816075334

push

github

paulmthompson
clang tidy fixes

9 of 15 new or added lines in 4 files covered. (60.0%)

194 existing lines in 7 files now uncovered.

39627 of 55080 relevant lines covered (71.94%)

1299.21 hits per line

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

73.65
/src/WhiskerToolbox/GroupManagementWidget/GroupManagementWidget.cpp
1
#include "GroupManagementWidget.hpp"
2
#include "GroupManager.hpp"
3
#include "ui_GroupManagementWidget.h"
4

5
#include <QColorDialog>
6
#include <QDebug>
7
#include <QHeaderView>
8
#include <QPushButton>
9
#include <QTableWidget>
10
#include <QTableWidgetItem>
11

12
GroupManagementWidget::GroupManagementWidget(GroupManager * group_manager, QWidget * parent)
23✔
13
    : QWidget(parent),
14
      m_group_manager(group_manager),
23✔
15
      m_ui(new Ui::GroupManagementWidget()),
46✔
16
      m_updating_table(false) {
23✔
17

18
    m_ui->setupUi(this);
23✔
19
    setupUI();
23✔
20

21
    // Connect to GroupManager signals
22
    connect(m_group_manager, &GroupManager::groupCreated,
69✔
23
            this, &GroupManagementWidget::onGroupCreated);
46✔
24
    connect(m_group_manager, &GroupManager::groupRemoved,
69✔
25
            this, &GroupManagementWidget::onGroupRemoved);
46✔
26
    connect(m_group_manager, &GroupManager::groupModified,
69✔
27
            this, &GroupManagementWidget::onGroupModified);
46✔
28

29
    // Connect table signals
30
    connect(m_ui->groupsTable, &QTableWidget::itemChanged,
69✔
31
            this, &GroupManagementWidget::onItemChanged);
46✔
32
    connect(m_ui->groupsTable, &QTableWidget::itemSelectionChanged,
69✔
33
            this, &GroupManagementWidget::onSelectionChanged);
46✔
34

35
    // Connect button signals
36
    connect(m_ui->addButton, &QPushButton::clicked,
69✔
37
            this, &GroupManagementWidget::createNewGroup);
46✔
38
    connect(m_ui->removeButton, &QPushButton::clicked,
69✔
39
            this, &GroupManagementWidget::removeSelectedGroup);
46✔
40

41
    // Initial table refresh
42
    refreshTable();
23✔
43
    onSelectionChanged();// Update button states
23✔
44
}
23✔
45

46
GroupManagementWidget::~GroupManagementWidget() {
43✔
47
    delete m_ui;
23✔
48
}
43✔
49

50
void GroupManagementWidget::setupUI() {
23✔
51
    // Configure table headers
52
    QHeaderView * header = m_ui->groupsTable->horizontalHeader();
23✔
53
    header->setStretchLastSection(false);
23✔
54
    header->setSectionResizeMode(0, QHeaderView::Stretch);// Name column stretches
23✔
55
    header->setSectionResizeMode(1, QHeaderView::Fixed);  // Color column fixed width
23✔
56
    header->setSectionResizeMode(2, QHeaderView::Fixed);  // Members column fixed width
23✔
57
    m_ui->groupsTable->setColumnWidth(1, 50);             // Color button column width
23✔
58
    m_ui->groupsTable->setColumnWidth(2, 60);             // Members column width
23✔
59

60
    m_ui->groupsTable->verticalHeader()->setVisible(false);
23✔
61
}
23✔
62

63
void GroupManagementWidget::refreshTable() {
23✔
64
    m_updating_table = true;
23✔
65

66
    // Clear the table
67
    m_ui->groupsTable->setRowCount(0);
23✔
68

69
    // Add rows for all groups
70
    auto const & groups = m_group_manager->getGroups();
23✔
71
    int row = 0;
23✔
72
    for (auto it = groups.begin(); it != groups.end(); ++it) {
23✔
73
        addGroupRow(it.key(), row);
×
74
        row++;
×
75
    }
76

77
    m_updating_table = false;
23✔
78
}
46✔
79

80
void GroupManagementWidget::addGroupRow(int group_id, int row) {
6✔
81
    auto group = m_group_manager->getGroup(group_id);
6✔
82
    if (!group.has_value()) {
6✔
83
        return;
×
84
    }
85

86
    m_ui->groupsTable->insertRow(row);
6✔
87

88
    // Name column
89
    auto * name_item = new QTableWidgetItem(group.value().name);
6✔
90
    name_item->setData(Qt::UserRole, group_id);// Store group ID in the item
6✔
91
    m_ui->groupsTable->setItem(row, 0, name_item);
6✔
92

93
    // Color column
94
    QPushButton * color_button = createColorButton(group_id);
6✔
95
    updateColorButton(color_button, group.value().color);
6✔
96
    m_ui->groupsTable->setCellWidget(row, 1, color_button);
6✔
97

98
    // Members column
99
    int const member_count = m_group_manager->getGroupMemberCount(group_id);
6✔
100
    auto * members_item = new QTableWidgetItem(QString::number(member_count));
6✔
101
    members_item->setFlags(members_item->flags() & ~Qt::ItemIsEditable);// Make read-only
6✔
102
    members_item->setTextAlignment(Qt::AlignCenter);
6✔
103
    m_ui->groupsTable->setItem(row, 2, members_item);
6✔
104
}
6✔
105

106
QPushButton * GroupManagementWidget::createColorButton(int group_id) {
6✔
107
    auto * button = new QPushButton();
6✔
108
    button->setMaximumSize(30, 20);
6✔
109
    button->setMinimumSize(30, 20);
6✔
110
    button->setProperty("group_id", group_id);
6✔
111

112
    connect(button, &QPushButton::clicked,
18✔
113
            this, &GroupManagementWidget::onColorButtonClicked);
12✔
114

115
    return button;
6✔
116
}
117

118
void GroupManagementWidget::updateColorButton(QPushButton * button, QColor const & color) {
14✔
119
    QString const style = QString("QPushButton { background-color: %1; border: 1px solid #666; }")
42✔
120
                            .arg(color.name());
28✔
121
    button->setStyleSheet(style);
14✔
122
}
28✔
123

124
void GroupManagementWidget::createNewGroup() {
×
125
    QString const name = QString("Group %1").arg(m_group_manager->getGroups().size() + 1);
×
126
    m_group_manager->createGroup(name);
×
127
}
×
128

129
void GroupManagementWidget::removeSelectedGroup() {
×
130
    int const current_row = m_ui->groupsTable->currentRow();
×
131
    if (current_row < 0) {
×
132
        return;
×
133
    }
134

135
    int const group_id = getGroupIdForRow(current_row);
×
136
    if (group_id != -1) {
×
137
        m_group_manager->removeGroup(group_id);
×
138
    }
139
}
140

141
void GroupManagementWidget::onGroupCreated(int group_id) {
6✔
142
    if (!m_updating_table) {
6✔
143
        int const row = m_ui->groupsTable->rowCount();
6✔
144
        addGroupRow(group_id, row);
6✔
145
    }
146
}
6✔
147

148
void GroupManagementWidget::onGroupRemoved(int group_id) {
1✔
149
    if (!m_updating_table) {
1✔
150
        int const row = findRowForGroupId(group_id);
1✔
151
        if (row >= 0) {
1✔
152
            m_ui->groupsTable->removeRow(row);
1✔
153
        }
154
    }
155
}
1✔
156

157
void GroupManagementWidget::onGroupModified(int group_id) {
8✔
158
    if (!m_updating_table) {
8✔
159
        int const row = findRowForGroupId(group_id);
8✔
160
        if (row >= 0) {
8✔
161
            auto group = m_group_manager->getGroup(group_id);
8✔
162
            if (group.has_value()) {
8✔
163
                // Update name
164
                QTableWidgetItem * name_item = m_ui->groupsTable->item(row, 0);
8✔
165
                if (name_item) {
8✔
166
                    m_updating_table = true;
8✔
167
                    name_item->setText(group.value().name);
8✔
168
                    m_updating_table = false;
8✔
169
                }
170

171
                // Update color button
172
                auto * color_button = qobject_cast<QPushButton *>(m_ui->groupsTable->cellWidget(row, 1));
8✔
173
                if (color_button) {
8✔
174
                    updateColorButton(color_button, group.value().color);
8✔
175
                }
176

177
                // Update member count
178
                QTableWidgetItem * members_item = m_ui->groupsTable->item(row, 2);
8✔
179
                if (members_item) {
8✔
180
                    int const member_count = m_group_manager->getGroupMemberCount(group_id);
8✔
181
                    members_item->setText(QString::number(member_count));
8✔
182
                }
183
            }
184
        }
8✔
185
    }
186
}
8✔
187

188
void GroupManagementWidget::onPointAssignmentsChanged(std::unordered_set<int> const & affected_groups) {
×
189
    if (!m_updating_table) {
×
190
        // Update member counts for all affected groups
191
        for (int const group_id: affected_groups) {
×
192
            int const row = findRowForGroupId(group_id);
×
193
            if (row >= 0) {
×
194
                QTableWidgetItem * members_item = m_ui->groupsTable->item(row, 2);
×
195
                if (members_item) {
×
196
                    int const member_count = m_group_manager->getGroupMemberCount(group_id);
×
197
                    members_item->setText(QString::number(member_count));
×
198
                }
199
            }
200
        }
201
    }
202
}
×
203

204
void GroupManagementWidget::onItemChanged(QTableWidgetItem * item) {
19✔
205
    if (m_updating_table || !item || item->column() != 0) {
19✔
206
        return;// Only handle name column changes
13✔
207
    }
208

209
    int const group_id = item->data(Qt::UserRole).toInt();
6✔
210
    QString const new_name = item->text().trimmed();
6✔
211

212
    if (new_name.isEmpty()) {
6✔
213
        // Don't allow empty names, revert to original
214
        m_updating_table = true;
×
215
        auto group = m_group_manager->getGroup(group_id);
×
216
        if (group.has_value()) {
×
217
            item->setText(group.value().name);
×
218
        }
219
        m_updating_table = false;
×
220
        return;
×
221
    }
×
222

223
    // Update the group name
224
    m_group_manager->setGroupName(group_id, new_name);
6✔
225
}
6✔
226

227
void GroupManagementWidget::onColorButtonClicked() {
×
NEW
228
    auto * button = qobject_cast<QPushButton *>(sender());
×
229
    if (!button) {
×
230
        return;
×
231
    }
232

NEW
233
    int const group_id = button->property("group_id").toInt();
×
234
    auto group = m_group_manager->getGroup(group_id);
×
235
    if (!group.has_value()) {
×
236
        return;
×
237
    }
238

NEW
239
    QColor const new_color = QColorDialog::getColor(group.value().color, this, "Select Group Color");
×
240
    if (new_color.isValid() && new_color != group.value().color) {
×
241
        m_group_manager->setGroupColor(group_id, new_color);
×
242
    }
243
}
×
244

245
void GroupManagementWidget::onSelectionChanged() {
23✔
246
    bool const has_selection = m_ui->groupsTable->currentRow() >= 0;
23✔
247
    m_ui->removeButton->setEnabled(has_selection);
23✔
248
}
23✔
249

250
int GroupManagementWidget::getGroupIdForRow(int row) const {
9✔
251
    QTableWidgetItem * item = m_ui->groupsTable->item(row, 0);
9✔
252
    return item ? item->data(Qt::UserRole).toInt() : -1;
18✔
253
}
254

255
int GroupManagementWidget::findRowForGroupId(int group_id) const {
9✔
256
    for (int row = 0; row < m_ui->groupsTable->rowCount(); ++row) {
9✔
257
        if (getGroupIdForRow(row) == group_id) {
9✔
258
            return row;
9✔
259
        }
260
    }
261
    return -1;
×
262
}
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