Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
table_model.hpp
Go to the documentation of this file.
1#pragma once
2
3// TableModel — data + sort layer for sortable table-like views.
4// Owns rows, columns, per-column sort order, and click-to-sort cycling.
5// Rendering concerns such as header chrome, column reordering, and row
6// virtualization live outside this model.
7//
8// The model is string-first: each cell carries a display string plus an
9// optional sort key. A numeric sort key lets a column display "3 dB" but
10// sort as 3.0. For bool / category columns callers can fill a single
11// sort_key_*; everything stays opt-in.
12
13#include <cstddef>
14#include <cstdint>
15#include <limits>
16#include <optional>
17#include <string>
18#include <vector>
19
20namespace pulp::view {
21
22struct TableCell {
23 std::string text;
26 double sort_key_num = std::numeric_limits<double>::quiet_NaN();
27};
28
29struct TableColumn {
30 std::string title;
31 bool sortable = true;
32 float default_width = 100.0f;
33};
34
35enum class TableSortOrder : uint8_t {
36 None = 0,
39};
40
41class TableModel {
42public:
44 columns_.push_back(std::move(column));
45 for (auto& row : rows_) row.resize(columns_.size());
46 }
47
56 void add_row(std::vector<TableCell> cells) {
57 cells.resize(columns_.size());
58 if (sort_order_ != TableSortOrder::None && !original_order_.empty()
59 && original_order_.size() == rows_.size()) {
60 restore_original_order_();
61 }
62 rows_.push_back(std::move(cells));
63 if (!original_order_.empty()) {
64 original_order_.push_back(rows_.size() - 1);
65 }
66 sort_column_ = -1;
67 sort_order_ = TableSortOrder::None;
68 }
69
70 std::size_t column_count() const { return columns_.size(); }
71 std::size_t row_count() const { return rows_.size(); }
72 const TableColumn& column(std::size_t i) const { return columns_[i]; }
73 const TableCell& cell(std::size_t row, std::size_t col) const {
74 return rows_[row][col];
75 }
76
80 void toggle_sort(std::size_t col);
81
83 void sort_by(std::size_t col, TableSortOrder order);
84
86 void clear_sort() {
87 sort_column_ = -1;
88 sort_order_ = TableSortOrder::None;
89 // Rows are kept; restore_original_order_() reorders them immediately.
90 restore_original_order_();
91 }
92
93 int sort_column() const { return sort_column_; }
94 TableSortOrder sort_order() const { return sort_order_; }
95
96private:
97 void apply_sort_();
98 void restore_original_order_();
99
100 std::vector<TableColumn> columns_;
101 std::vector<std::vector<TableCell>> rows_;
102 // Permutation of original row indices, parallel to `rows_`.
103 // Lets clear_sort() restore insertion order without storing two
104 // copies of the data.
105 std::vector<std::size_t> original_order_;
106 int sort_column_ = -1;
108};
109
110} // namespace pulp::view
std::size_t column_count() const
Definition table_model.hpp:70
const TableCell & cell(std::size_t row, std::size_t col) const
Definition table_model.hpp:73
void sort_by(std::size_t col, TableSortOrder order)
Explicit sort (used by tests and by code that wants a specific order).
void add_column(TableColumn column)
Definition table_model.hpp:43
void toggle_sort(std::size_t col)
Sort rows by column col.
std::size_t row_count() const
Definition table_model.hpp:71
void clear_sort()
Clear any sort; original insertion order is restored.
Definition table_model.hpp:86
const TableColumn & column(std::size_t i) const
Definition table_model.hpp:72
int sort_column() const
Definition table_model.hpp:93
TableSortOrder sort_order() const
Definition table_model.hpp:94
void add_row(std::vector< TableCell > cells)
Add a row.
Definition table_model.hpp:56
Hover-cursor tracking for platform window hosts.
Definition fwd.hpp:27
TableSortOrder
Definition table_model.hpp:35
@ None
Definition table_model.hpp:36
@ Ascending
Definition table_model.hpp:37
@ Descending
Definition table_model.hpp:38
@ i
Definition input_events.hpp:40
@ row
Definition design_ir.hpp:53
Definition table_model.hpp:22
std::string text
Definition table_model.hpp:23
double sort_key_num
Optional numeric sort key.
Definition table_model.hpp:26
Column definition for TableListBox.
Definition table.hpp:16
std::string title
Definition table_model.hpp:30
float default_width
Definition table_model.hpp:32
bool sortable
Definition table.hpp:19