QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
LogStoreQueryModel.cc
Go to the documentation of this file.
2
3#include <QtConcurrent/QtConcurrentRun>
4
5#include "LogStore.h"
7
8QGC_LOGGING_CATEGORY(LogStoreQueryModelLog, "Utilities.LogStoreQueryModel")
9
10LogStoreQueryModel::LogStoreQueryModel(LogStore* store, QObject* parent) : LogEntryTableModel(parent), _store(store)
11{
12 if (_store) {
14 }
15 (void)connect(&_queryWatcher, &QFutureWatcher<QueryResult>::finished, this, &LogStoreQueryModel::_onQueryFinished);
16}
17
18int LogStoreQueryModel::rowCount(const QModelIndex& parent) const
19{
20 return parent.isValid() ? 0 : _results.size();
21}
22
24{
25 if (row < 0 || row >= _results.size()) {
26 return nullptr;
27 }
28 return &_results.at(row);
29}
30
31void LogStoreQueryModel::setSessionFilter(const QString& session)
32{
33 if (_sessionFilter != session) {
34 _sessionFilter = session;
36 refresh();
37 }
38}
39
40void LogStoreQueryModel::setFilterLevel(int level)
41{
42 if (_filterLevel != level) {
43 _filterLevel = level;
44 emit filterLevelChanged();
45 refresh();
46 }
47}
48
49void LogStoreQueryModel::setFilterCategory(const QString& category)
50{
51 if (_filterCategory != category) {
52 _filterCategory = category;
54 refresh();
55 }
56}
57
58void LogStoreQueryModel::setFilterText(const QString& text)
59{
60 if (_filterText != text) {
61 _filterText = text;
62 emit filterTextChanged();
63 refresh();
64 }
65}
66
67void LogStoreQueryModel::refresh()
68{
69 _executeQuery(false);
70}
71
72void LogStoreQueryModel::loadMore()
73{
74 if (_results.size() < _totalResults) {
75 _executeQuery(true);
76 }
77}
78
79QStringList LogStoreQueryModel::availableSessions() const
80{
81 return _store ? _store->sessions() : QStringList();
82}
83
84void LogStoreQueryModel::_executeQuery(bool append)
85{
86 if (!_store || !_store->isOpen()) {
87 if (!_results.isEmpty()) {
88 beginResetModel();
89 _results.clear();
90 endResetModel();
91 _totalResults = 0;
93 }
94 return;
95 }
96
97 _loading = true;
98 emit loadingChanged();
99
100 const quint64 gen = ++_queryGeneration;
101
102 LogStore::QueryParams params;
103 params.sessionId = _sessionFilter;
104 params.minLevel = _filterLevel;
105 params.category = _filterCategory;
106 params.textFilter = _filterText;
107 params.limit = kPageSize;
108 params.offset = append ? _results.size() : 0;
109
110 LogStore* store = _store;
111 _queryWatcher.setFuture(QtConcurrent::run([store, params, append, gen]() -> QueryResult {
112 return {store->query(params), append, gen};
113 }));
114}
115
116void LogStoreQueryModel::_onQueryFinished()
117{
118 const QueryResult result = _queryWatcher.result();
119
120 if (result.generation != _queryGeneration) {
121 return;
122 }
123
124 const auto& page = result.page;
125
126 if (result.append && !page.isEmpty()) {
127 const int first = _results.size();
128 beginInsertRows(QModelIndex(), first, first + page.size() - 1);
129 _results.append(page);
130 endInsertRows();
131 } else if (!result.append) {
132 beginResetModel();
133 _results = page;
134 endResetModel();
135 }
136
137 if (page.size() < kPageSize) {
138 _totalResults = _results.size();
139 } else if (!_sessionFilter.isEmpty()) {
140 _totalResults = _store->sessionEntryCount(_sessionFilter);
141 } else {
142 _totalResults = _results.size() + kPageSize;
143 }
144 emit totalResultsChanged();
145
146 _loading = false;
147 emit loadingChanged();
148}
#define QGC_LOGGING_CATEGORY(name, categoryStr)
void filterCategoryChanged()
void availableSessionsChanged()
void sessionFilterChanged()
const LogEntry * entryAt(int row) const override
Return entry at visible row, or nullptr if out of range.
void totalResultsChanged()
void entryCountChanged()