Albert
Loading...
Searching...
No Matches
queryresults.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2025 Manuel Schneider
2// SPDX-License-Identifier: MIT
3
4#pragma once
5#include <QObject>
6#include <albert/export.h>
7#include <albert/item.h>
9#include <memory>
10#include <ranges>
11#include <vector>
12
13namespace albert
14{
15class Extension;
16
22class ALBERT_EXPORT QueryResult
23{
24public:
26 std::shared_ptr<Item> item;
27};
28
36class ALBERT_EXPORT QueryResults : public QObject, private Item::Observer
37{
38 Q_OBJECT
39
40public:
41
43 QueryResults(const QueryContext &context);
44
46 ~QueryResults() override;
47
49 inline QueryResult &operator[](size_t index) { return results[index]; }
50
52 inline const QueryResult &operator[](size_t index) const { return results[index]; }
53
55 inline uint count() const { return results.size(); }
56
58 bool activate(uint item_index, uint action_index = 0);
59
65 void add(const Extension &extension, ItemPtr auto &&item)
66 {
67 emit resultsAboutToBeInserted(results.size(), results.size());
68 item->addObserver(this);
69 results.emplace_back(&extension, std::forward<decltype(item)>(item));
70 emit resultsInserted();
71 }
72
78 void add(ItemPtr auto &&item) { add(context.handler(), std::forward<decltype(item)>(item)); }
79
81 void add(std::ranges::range auto &&query_results)
82 requires(std::same_as<QueryResult, std::ranges::range_value_t<decltype(query_results)>>)
83 {
84 if (!query_results.empty())
85 {
86 const auto count = std::ranges::distance(query_results);
87 results.reserve(results.size() + count);
88 emit resultsAboutToBeInserted(results.size(), results.size() + count - 1);
89 for (auto&& query_result : query_results)
90 {
91 query_result.item->addObserver(this);
92 // results.emplace_back(std::forward_like<decltype(query_results)>(query_result));
93 // TODO remove if forward_like is available everywhere (26.04)
94 if constexpr (std::is_lvalue_reference_v<decltype(query_results)>)
95 results.emplace_back(query_result);
96 else
97 results.emplace_back(std::move(query_result));
98 }
99 emit resultsInserted();
100 }
101 }
102
104 void add(const Extension &extension, ItemRange auto &&items)
105 {
106 if (!items.empty())
107 {
108 const auto count = std::ranges::distance(items);
109 results.reserve(results.size() + count);
110 emit resultsAboutToBeInserted(results.size(), results.size() + count - 1);
111 for (auto&& item : items)
112 {
113 item->addObserver(this);
114 // results.emplace_back(std::forward_like<decltype(query_results)>(query_result));
115 // TODO remove if forward_like is available everywhere (26.04)
116 if constexpr (std::is_lvalue_reference_v<decltype(items)>)
117 results.emplace_back(&extension, item);
118 else
119 results.emplace_back(&extension, std::move(item));
120 }
121 emit resultsInserted();
122 }
123 }
124
126 void add(ItemRange auto &&items){ add(context.handler(), std::forward<decltype(items)>(items)); }
127
129 void remove(uint index, uint count = 1)
130 {
131 for (auto i = index; i < index + count; ++i)
132 results[i].item->removeObserver(this);
133
134 emit resultsAboutToBeRemoved(index, index + count - 1);
135 results.erase(results.begin() + index,results.begin() + index + count);
136 emit resultsRemoved();
137
138 }
139
141 void reset()
142 {
143 for (auto&& result : results)
144 result.item->removeObserver(this);
145 emit resultsAboutToBeReset();
146 results.clear();
147 emit resultsReset();
148 }
149
150signals:
151
153 void resultsAboutToBeInserted(int first, int last);
154
157
159 void resultsAboutToBeRemoved(int first, int last);
160
163
165 void resultsAboutToBeMoved(int srcFirst, int srcLast, int dst);
166
169
172
175
177 void resultChanged(uint i);
178
180 void resultActivated(QString query, QString extension_id, QString item_id, QString action_id);
181
182private:
183
184 void notify(const albert::Item *item) override;
185
186 const QueryContext &context;
187 std::vector<QueryResult> results;
188
189};
190
191}
Abstract extension class.
Definition extension.h:19
Interface class for item observers.
Definition item.h:135
Result items displayed in the query results list.
Definition item.h:71
Query interface.
Definition querycontext.h:19
Result item associating an item with an extension.
Definition queryresults.h:23
std::shared_ptr< Item > item
The item.
Definition queryresults.h:26
const Extension * extension
The extension providing the item.
Definition queryresults.h:25
Query results container.
Definition queryresults.h:37
void add(std::ranges::range auto &&query_results)
Appends query_results to the results.
Definition queryresults.h:81
QueryResults(const QueryContext &context)
Constructs query results with the context it belongs to.
void add(const Extension &extension, ItemPtr auto &&item)
Appends a QueryResult constructed from extension and item.
Definition queryresults.h:65
void add(ItemPtr auto &&item)
Appends a QueryResult constructed from item and the handler this results belong to.
Definition queryresults.h:78
QueryResult & operator[](size_t index)
Returns the result at index index.
Definition queryresults.h:49
void resultsAboutToBeReset()
Emitted before all results are reset.
const QueryResult & operator[](size_t index) const
Returns the result at index index.
Definition queryresults.h:52
void resultsRemoved()
Emitted after results have been removed.
void resultsAboutToBeRemoved(int first, int last)
Emitted before results are removed.
uint count() const
Returns the number of results.
Definition queryresults.h:55
~QueryResults() override
Destructs the query results.
void reset()
Removes all results.
Definition queryresults.h:141
void add(ItemRange auto &&items)
Appends QueryResult's constructed from items and the handler this results belong to.
Definition queryresults.h:126
void resultsReset()
Emitted after all results have been reset.
void resultChanged(uint i)
Emitted when a result changed.
void resultActivated(QString query, QString extension_id, QString item_id, QString action_id)
Emitted when a result was activated.
void resultsMoved()
Emitted after results have been moved.
void add(const Extension &extension, ItemRange auto &&items)
Appends QueryResult's constructed from extension and items.
Definition queryresults.h:104
void resultsAboutToBeMoved(int srcFirst, int srcLast, int dst)
Emitted before results are moved.
void resultsAboutToBeInserted(int first, int last)
Emitted before results are inserted.
void remove(uint index, uint count=1)
Removes count results starting from index.
Definition queryresults.h:129
bool activate(uint item_index, uint action_index=0)
Activates the action at action_index of the result item at item_index.
void resultsInserted()
Emitted after results have been inserted.
A shared pointer to an Item or subclass thereof.
Definition item.h:188
A range of ItemPtr.
Definition item.h:193
Definition app.h:56