ORE Studio 0.0.4
Loading...
Searching...
No Matches
ClientDataDomainModel.hpp
1/* -*- mode: c++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2 *
3 * Copyright (C) 2025 Marco Craveiro <marco.craveiro@gmail.com>
4 *
5 * This program is free software; you can redistribute it and/or modify it under
6 * the terms of the GNU General Public License as published by the Free Software
7 * Foundation; either version 3 of the License, or (at your option) any later
8 * version.
9 *
10 * This program is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
13 * details.
14 *
15 * You should have received a copy of the GNU General Public License along with
16 * this program; if not, write to the Free Software Foundation, Inc., 51
17 * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 *
19 */
20#ifndef ORES_QT_CLIENT_DATA_DOMAIN_MODEL_HPP
21#define ORES_QT_CLIENT_DATA_DOMAIN_MODEL_HPP
22
23#include <vector>
24#include <QSize>
25#include <QFutureWatcher>
26#include <QAbstractTableModel>
27#include "ores.qt/AbstractClientModel.hpp"
28#include "ores.qt/ClientManager.hpp"
29#include "ores.qt/ColumnMetadata.hpp"
30#include "ores.qt/RecencyPulseManager.hpp"
31#include "ores.qt/RecencyTracker.hpp"
32#include "ores.logging/make_logger.hpp"
33#include "ores.dq.api/domain/data_domain.hpp"
34
35namespace ores::qt {
36
37class ClientDataDomainModel final : public AbstractClientModel {
38 Q_OBJECT
39
40private:
41 inline static std::string_view logger_name =
42 "ores.qt.client_data_domain_model";
43
44 [[nodiscard]] static auto& lg() {
45 using namespace ores::logging;
46 static auto instance = make_logger(logger_name);
47 return instance;
48 }
49
50public:
51 enum Column {
52 Name,
53 Description,
54 Version,
55 ModifiedBy,
56 RecordedAt,
57 ColumnCount
58 };
59
65 static constexpr std::size_t kColumnCount = std::size_t(ColumnCount);
66 static constexpr std::array<ColumnMetadata, kColumnCount> kColumns = {{
67 {
68 .column = Name,
69 .header = std::string_view("Name"),
71 .hidden_by_default = false,
72 .default_width = kColumnWidthAuto
73 },
74 {
75 .column = Description,
76 .header = std::string_view("Description"),
78 .hidden_by_default = false,
79 .default_width = kColumnWidthAuto
80 },
81 {
82 .column = Version,
83 .header = std::string_view("Version"),
85 .hidden_by_default = false,
86 .default_width = 70
87 },
88 {
89 .column = ModifiedBy,
90 .header = std::string_view("Modified By"),
92 .hidden_by_default = false,
93 .default_width = kColumnWidthAuto
94 },
95 {
96 .column = RecordedAt,
97 .header = std::string_view("Recorded At"),
99 .hidden_by_default = false,
100 .default_width = kColumnWidthAuto
101 }
102 }};
103
107 inline static const QSize kDefaultWindowSize = {900, 400};
108
112 static constexpr std::string_view kSettingsGroup = "DataDomainMdiWindow";
116 static std::vector<column_style> const& columnStyles() {
117 static std::vector<column_style> const kStylesVector = []() {
118 std::vector<column_style> result;
119 result.reserve(kColumnCount);
120 for (std::size_t i = 0; i < kColumnCount; ++i)
121 result.push_back(kColumns[i].style);
122 return result;
123 }();
124 return kStylesVector;
125 }
126
130 static QVector<int> defaultHiddenColumns() {
131 static QVector<int> const result =
132 ::ores::qt::defaultHiddenColumns<kColumnCount>(kColumns);
133 return result;
134 }
135
136 explicit ClientDataDomainModel(ClientManager* clientManager,
137 QObject* parent = nullptr);
138 ~ClientDataDomainModel() override = default;
139
140 int rowCount(const QModelIndex& parent = QModelIndex()) const override;
141 int columnCount(const QModelIndex& parent = QModelIndex()) const override;
142 QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
143 QVariant headerData(int section, Qt::Orientation orientation,
144 int role = Qt::DisplayRole) const override;
145
146 void refresh();
147 const dq::domain::data_domain* getDomain(int row) const;
148
149signals:
150
151private slots:
152 void onDomainsLoaded();
153 void onPulseStateChanged(bool isOn);
154 void onPulsingComplete();
155
156private:
157 QVariant recency_foreground_color(const std::string& name) const;
158
159 struct FetchResult {
160 bool success;
161 std::vector<dq::domain::data_domain> domains;
162 QString error_message;
163 QString error_details;
164 };
165
166 ClientManager* clientManager_;
167 std::vector<dq::domain::data_domain> domains_;
168 QFutureWatcher<FetchResult>* watcher_;
169 bool is_fetching_{false};
170
171 using DataDomainKeyExtractor = std::string(*)(const dq::domain::data_domain&);
172 RecencyTracker<dq::domain::data_domain, DataDomainKeyExtractor> recencyTracker_;
173 RecencyPulseManager* pulseManager_;
174};
175
176}
177
178#endif
Implements logging infrastructure for ORE Studio.
Definition boost_severity.hpp:28
Qt-based graphical user interface for ORE Studio.
Definition AccountController.hpp:32
QVector< int > defaultHiddenColumns(const std::array< ColumnMetadata, N > &columns)
Builds a QVector of hidden column indices from a metadata array.
Definition ColumnMetadata.hpp:99
constexpr int kColumnWidthAuto
Sentinel value for column default width meaning "auto-size to contents".
Definition ColumnMetadata.hpp:38
@ mono_center
Monospace, centered.
@ text_left
Proportional font, left-aligned (default).
@ mono_left
Monospace, left-aligned.
Represents a high-level classification of data within the system.
Definition data_domain.hpp:41