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

paulmthompson / WhiskerToolbox / 17733471381

15 Sep 2025 12:43PM UTC coverage: 72.1% (+0.4%) from 71.744%
17733471381

push

github

paulmthompson
fix optional missing include on windows

37727 of 52326 relevant lines covered (72.1%)

1297.48 hits per line

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

96.94
/src/WhiskerToolbox/TableViewerWidget/TableViewerWidget.cpp
1
#include "TableViewerWidget.hpp"
2
#include "ui_TableViewerWidget.h"
3

4
#include "PaginatedTableModel.hpp"
5
#include "DataManager/utils/TableView/core/TableView.h"
6
#include "DataManager/utils/TableView/interfaces/IRowSelector.h"
7

8
#include <QScrollBar>
9
#include <QMessageBox>
10
#include <QHeaderView>
11

12
TableViewerWidget::TableViewerWidget(QWidget * parent)
29✔
13
    : QWidget(parent),
14
      ui(new Ui::TableViewerWidget),
58✔
15
      _model(new PaginatedTableModel(this)) {
29✔
16

17
    ui->setupUi(this);
29✔
18
    
19
    // Set up the table view
20
    ui->table_view->setModel(_model);
29✔
21
    ui->table_view->horizontalHeader()->setStretchLastSection(true);
29✔
22
    ui->table_view->horizontalHeader()->setSectionsMovable(true);
29✔
23
    ui->table_view->verticalHeader()->setDefaultSectionSize(25);
29✔
24
    
25
    _model->setPageSize(50);
29✔
26
    
27
    connectSignals();
29✔
28

29
    // Track column order when user reorders columns
30
    connect(ui->table_view->horizontalHeader(), &QHeaderView::sectionMoved, this,
87✔
31
            [this](int /*logicalIndex*/, int /*oldVisualIndex*/, int /*newVisualIndex*/) {
58✔
32
                // Reconstruct current order by visual indices
33
                QStringList order;
1✔
34
                int cols = _model ? _model->columnCount(QModelIndex()) : 0;
1✔
35
                for (int v = 0; v < cols; ++v) {
3✔
36
                    int logical = ui->table_view->horizontalHeader()->logicalIndex(v);
2✔
37
                    QVariant name = _model->headerData(logical, Qt::Horizontal, Qt::DisplayRole);
2✔
38
                    order.push_back(name.toString());
2✔
39
                }
2✔
40
                _currentColumnOrder = order;
1✔
41
                emit columnsReordered(order);
1✔
42
            });
2✔
43
}
29✔
44

45
TableViewerWidget::~TableViewerWidget() {
45✔
46
    delete ui;
29✔
47
}
45✔
48

49
void TableViewerWidget::setTableView(std::shared_ptr<TableView> table_view, QString const & table_name) {
7✔
50
    _table_name = table_name.isEmpty() ? "Unnamed Table" : table_name;
7✔
51
    
52
    if (table_view) {
7✔
53
        _total_rows = table_view->getRowCount();
7✔
54
        _model->setTableView(table_view);
7✔
55
        
56
        // Update UI
57
        ui->table_name_label->setText(QString("Table: %1").arg(_table_name));
7✔
58
        ui->row_count_label->setText(QString("Rows: %1").arg(_total_rows));
7✔
59
        ui->column_count_label->setText(QString("Columns: %1").arg(table_view->getColumnCount()));
7✔
60
        // Navigation hidden; skip controls
61
        // Initialize current column order from table view
62
        _currentColumnOrder.clear();
7✔
63
        for (auto const & name : table_view->getColumnNames()) {
34✔
64
            _currentColumnOrder.push_back(QString::fromStdString(name));
27✔
65
        }
7✔
66

67
    } else {
68
        clearTable();
×
69
    }
70
}
7✔
71

72
void TableViewerWidget::setTableConfiguration(std::unique_ptr<IRowSelector> row_selector,
22✔
73
                                             std::vector<ColumnInfo> column_infos,
74
                                             std::shared_ptr<DataManager> data_manager,
75
                                             QString const & table_name) {
76
    _table_name = table_name.isEmpty() ? "Unnamed Table" : table_name;
22✔
77
    
78
    if (row_selector && data_manager) {
22✔
79
        _total_rows = row_selector->getRowCount();
22✔
80
        QStringList desiredOrder = _currentColumnOrder;
22✔
81
        _model->setSourceTable(std::move(row_selector), std::move(column_infos), data_manager);
22✔
82
        
83
        // Update UI
84
        ui->table_name_label->setText(QString("Table: %1").arg(_table_name));
22✔
85
        ui->row_count_label->setText(QString("Rows: %1").arg(_total_rows));
22✔
86
        ui->column_count_label->setText(QString("Columns: %1").arg(column_infos.size()));
22✔
87
        // Navigation hidden; skip controls
88
        // Initialize or reapply column order
89
        if (!desiredOrder.isEmpty()) {
22✔
90
            // Reorder visual columns to match previous order
91
            int cols = _model->columnCount(QModelIndex());
12✔
92
            std::map<QString, int> nameToIndex;
12✔
93
            for (int c = 0; c < cols; ++c) {
33✔
94
                nameToIndex[_model->headerData(c, Qt::Horizontal, Qt::DisplayRole).toString()] = c;
21✔
95
            }
96
            int visualPos = 0;
12✔
97
            for (auto const & name : desiredOrder) {
24✔
98
                auto it = nameToIndex.find(name);
12✔
99
                if (it == nameToIndex.end()) continue;
12✔
100
                int logical = it->second;
12✔
101
                int currentVisual = ui->table_view->horizontalHeader()->visualIndex(logical);
12✔
102
                if (currentVisual != visualPos) {
12✔
103
                    ui->table_view->horizontalHeader()->moveSection(currentVisual, visualPos);
×
104
                }
105
                ++visualPos;
12✔
106
            }
107
            _currentColumnOrder = desiredOrder;
12✔
108
        } else {
12✔
109
            _currentColumnOrder.clear();
10✔
110
            int cols = _model->columnCount(QModelIndex());
10✔
111
            for (int c = 0; c < cols; ++c) {
37✔
112
                _currentColumnOrder.push_back(_model->headerData(c, Qt::Horizontal, Qt::DisplayRole).toString());
27✔
113
            }
114
        }
115

116
    } else {
22✔
117
        clearTable();
×
118
    }
119
}
22✔
120

121
void TableViewerWidget::clearTable() {
176✔
122
    _table_name.clear();
176✔
123
    _total_rows = 0;
176✔
124
    _model->clearTable();
176✔
125
    
126
    // Update UI
127
    ui->table_name_label->setText("Table: (None)");
176✔
128
    ui->row_count_label->setText("Rows: 0");
176✔
129
    ui->column_count_label->setText("Columns: 0");
176✔
130

131
}
176✔
132

133
void TableViewerWidget::setPageSize(size_t page_size) {
4✔
134
    _model->setPageSize(page_size);
4✔
135
    
136
}
4✔
137

138
QString TableViewerWidget::getTableName() const {
6✔
139
    return _table_name;
6✔
140
}
141

142
bool TableViewerWidget::hasTable() const {
12✔
143
    return _total_rows > 0;
12✔
144
}
145

146
void TableViewerWidget::onTableScrolled() {
1✔
147

148
    // Emit signal with current visible row
149
    QModelIndex top_left = ui->table_view->indexAt(ui->table_view->rect().topLeft());
1✔
150
    if (top_left.isValid()) {
1✔
151
        emit rowScrolled(static_cast<size_t>(top_left.row()));
1✔
152
    }
153
}
1✔
154

155
void TableViewerWidget::connectSignals() {
29✔
156
    
157
    // Table scroll events
158
    connect(ui->table_view->verticalScrollBar(), &QScrollBar::valueChanged,
87✔
159
            this, &TableViewerWidget::onTableScrolled);
58✔
160
    connect(ui->table_view->horizontalScrollBar(), &QScrollBar::valueChanged,
87✔
161
            this, &TableViewerWidget::onTableScrolled);
58✔
162
}
29✔
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