Cockatrice 2026-10-19-Development-3.1.2-beta.2
A virtual tabletop for multiplayer card games
Loading...
Searching...
No Matches
filter_tree.h
Go to the documentation of this file.
1
6
7#ifndef FILTERTREE_H
8#define FILTERTREE_H
9
10#include "filter_card.h"
12
13#include <QList>
14#include <QObject>
15#include <QString>
16#include <qtmetamacros.h>
17#include <utility>
18
20
22{
23private:
24 bool enabled;
25
26public:
28 {
29 }
30 [[nodiscard]] virtual bool isEnabled() const
31 {
32 return enabled;
33 }
34 virtual void enable()
35 {
36 enabled = true;
38 }
39 virtual void disable()
40 {
41 enabled = false;
43 }
44 [[nodiscard]] virtual FilterTreeNode *parent() const
45 {
46 return nullptr;
47 }
48 [[nodiscard]] virtual FilterTreeNode *nodeAt(int /* i */) const
49 {
50 return nullptr;
51 }
52 virtual void deleteAt(int /* i */)
53 {
54 }
55 [[nodiscard]] virtual int childCount() const
56 {
57 return 0;
58 }
59 virtual int childIndex(const FilterTreeNode * /* node */) const
60 {
61 return -1;
62 }
63 [[nodiscard]] virtual int index() const
64 {
65 return (parent() != nullptr) ? parent()->childIndex(this) : -1;
66 }
67 [[nodiscard]] virtual const QString text() const
68 {
69 return QString("");
70 }
71 [[nodiscard]] virtual bool isLeaf() const
72 {
73 return false;
74 }
75 virtual void nodeChanged() const
76 {
77 if (parent() != nullptr) {
79 }
80 }
81 virtual void preInsertChild(const FilterTreeNode *p, int i) const
82 {
83 if (parent() != nullptr) {
84 parent()->preInsertChild(p, i);
85 }
86 }
87 virtual void postInsertChild(const FilterTreeNode *p, int i) const
88 {
89 if (parent() != nullptr) {
90 parent()->postInsertChild(p, i);
91 }
92 }
93 virtual void preRemoveChild(const FilterTreeNode *p, int i) const
94 {
95 if (parent() != nullptr) {
96 parent()->preRemoveChild(p, i);
97 }
98 }
99 virtual void postRemoveChild(const FilterTreeNode *p, int i) const
100 {
101 if (parent() != nullptr) {
102 parent()->postRemoveChild(p, i);
103 }
104 }
105};
106
107template <class T> class FilterTreeBranch : public FilterTreeNode
108{
109protected:
111
112public:
113 virtual ~FilterTreeBranch();
115 [[nodiscard]] FilterTreeNode *nodeAt(int i) const override;
116 void deleteAt(int i) override;
117 [[nodiscard]] int childCount() const override
118 {
119 return childNodes.size();
120 }
121 int childIndex(const FilterTreeNode *node) const override;
122};
123
124class FilterItemList;
125class FilterTree;
126
127class LogicMap : public FilterTreeBranch<FilterItemList *>
128{
129
130private:
131 FilterTree *const p;
132
133public:
135
139 [[nodiscard]] const FilterItemList *findTypeList(CardFilter::Type type) const;
141 [[nodiscard]] FilterTreeNode *parent() const override;
142 [[nodiscard]] const QString text() const override
143 {
145 }
146};
147
148class FilterItem;
149
150class FilterItemList : public FilterTreeBranch<FilterItem *>
151{
152private:
153 LogicMap *const p;
154
155public:
157
161 [[nodiscard]] CardFilter::Attr attr() const
162 {
163 return p->attr;
164 }
165 [[nodiscard]] FilterTreeNode *parent() const override
166 {
167 return p;
168 }
169 [[nodiscard]] int termIndex(const QString &term) const;
170 FilterTreeNode *termNode(const QString &term);
171 [[nodiscard]] const QString text() const override
172 {
174 }
175
176 [[nodiscard]] bool
177 testTypeAnd(CardInfoPtr info, CardFilter::Attr attr, const CardSearchLanguage &searchLanguage) const;
178 [[nodiscard]] bool
179 testTypeAndNot(CardInfoPtr info, CardFilter::Attr attr, const CardSearchLanguage &searchLanguage) const;
180 [[nodiscard]] bool
181 testTypeOr(CardInfoPtr info, CardFilter::Attr attr, const CardSearchLanguage &searchLanguage) const;
182 [[nodiscard]] bool
183 testTypeOrNot(CardInfoPtr info, CardFilter::Attr attr, const CardSearchLanguage &searchLanguage) const;
184};
185
187{
188private:
190
191public:
192 const QString term;
193
194 FilterItem(QString trm, FilterItemList *parent) : p(parent), term(std::move(trm))
195 {
196 }
197 virtual ~FilterItem() = default;
198
199 [[nodiscard]] CardFilter::Attr attr() const
200 {
201 return p->attr();
202 }
203 [[nodiscard]] CardFilter::Type type() const
204 {
205 return p->type;
206 }
207 [[nodiscard]] FilterTreeNode *parent() const override
208 {
209 return p;
210 }
211 [[nodiscard]] const QString text() const override
212 {
213 return term;
214 }
215 [[nodiscard]] bool isLeaf() const override
216 {
217 return true;
218 }
219
220 [[nodiscard]] bool acceptName(CardInfoPtr info, const CardSearchLanguage &searchLanguage) const;
221 [[nodiscard]] bool acceptNameExact(CardInfoPtr info, const CardSearchLanguage &searchLanguage) const;
222 [[nodiscard]] bool acceptType(CardInfoPtr info) const;
223 [[nodiscard]] bool acceptMainType(CardInfoPtr info) const;
224 [[nodiscard]] bool acceptSubType(CardInfoPtr info) const;
225 [[nodiscard]] bool acceptColor(CardInfoPtr info) const;
226 [[nodiscard]] bool acceptText(CardInfoPtr info, const CardSearchLanguage &searchLanguage) const;
227 [[nodiscard]] bool acceptSet(CardInfoPtr info) const;
228 [[nodiscard]] bool acceptManaCost(CardInfoPtr info) const;
229 [[nodiscard]] bool acceptCmc(CardInfoPtr info) const;
230 [[nodiscard]] bool acceptPowerToughness(CardInfoPtr info, CardFilter::Attr attr) const;
231 [[nodiscard]] bool acceptLoyalty(CardInfoPtr info) const;
232 [[nodiscard]] bool acceptRarity(CardInfoPtr info) const;
233 [[nodiscard]] bool
234 acceptCardAttr(CardInfoPtr info, CardFilter::Attr attr, const CardSearchLanguage &searchLanguage) const;
235 [[nodiscard]] bool acceptFormat(CardInfoPtr info) const;
236 [[nodiscard]] bool relationCheck(int cardInfo) const;
237};
238
239class FilterTree : public QObject, public FilterTreeBranch<LogicMap *>
240{
241 Q_OBJECT
242
243signals:
244 void preInsertRow(const FilterTreeNode *parent, int i) const;
245 void postInsertRow(const FilterTreeNode *parent, int i) const;
246 void preRemoveRow(const FilterTreeNode *parent, int i) const;
247 void postRemoveRow(const FilterTreeNode *parent, int i) const;
248 void changed() const;
249
250private:
253
254 bool testAttr(CardInfoPtr info, const LogicMap *lm, const CardSearchLanguage &searchLanguage) const;
255
256 void nodeChanged() const override
257 {
258 emit changed();
259 }
260 void preInsertChild(const FilterTreeNode *p, int i) const override
261 {
262 emit preInsertRow(p, i);
263 }
264 void postInsertChild(const FilterTreeNode *p, int i) const override
265 {
266 emit postInsertRow(p, i);
267 }
268 void preRemoveChild(const FilterTreeNode *p, int i) const override
269 {
270 emit preRemoveRow(p, i);
271 }
272 void postRemoveChild(const FilterTreeNode *p, int i) const override
273 {
274 emit postRemoveRow(p, i);
275 }
276
277public:
279 ~FilterTree() override;
280
281 FilterTreeNode *termNode(CardFilter::Attr attr, CardFilter::Type type, const QString &term);
283
284 [[nodiscard]] const QString text() const override
285 {
286 return QString("root");
287 }
288 [[nodiscard]] int index() const override
289 {
290 return 0;
291 }
292
293 [[nodiscard]] bool acceptsCard(CardInfoPtr info, const CardSearchLanguage &searchLanguage) const;
294 void removeFiltersByAttr(CardFilter::Attr filterType);
295 void removeFilter(const CardFilter *toRemove);
296 void clear();
297};
298
299#endif
QSharedPointer< CardInfo > CardInfoPtr
Definition card_info.cpp:15
Definition filter_card.h:16
static const QString typeName(Type t)
Definition filter_card.cpp:45
static const QString attrName(Attr a)
Definition filter_card.cpp:61
Type
Definition filter_card.h:21
Attr
Definition filter_card.h:32
Definition filter_tree.h:151
bool testTypeOrNot(CardInfoPtr info, CardFilter::Attr attr, const CardSearchLanguage &searchLanguage) const
Definition filter_tree.cpp:159
const QString text() const override
Definition filter_tree.h:171
bool testTypeAnd(CardInfoPtr info, CardFilter::Attr attr, const CardSearchLanguage &searchLanguage) const
Definition filter_tree.cpp:111
FilterItemList(CardFilter::Type t, LogicMap *parent)
Definition filter_tree.h:158
const CardFilter::Type type
Definition filter_tree.h:156
FilterTreeNode * parent() const override
Definition filter_tree.h:165
LogicMap *const p
Definition filter_tree.h:153
CardFilter::Attr attr() const
Definition filter_tree.h:161
int termIndex(const QString &term) const
Definition filter_tree.cpp:82
bool testTypeAndNot(CardInfoPtr info, CardFilter::Attr attr, const CardSearchLanguage &searchLanguage) const
Definition filter_tree.cpp:128
bool testTypeOr(CardInfoPtr info, CardFilter::Attr attr, const CardSearchLanguage &searchLanguage) const
Definition filter_tree.cpp:136
FilterTreeNode * termNode(const QString &term)
Definition filter_tree.cpp:93
Definition filter_tree.h:187
bool acceptSet(CardInfoPtr info) const
Definition filter_tree.cpp:291
bool acceptCmc(CardInfoPtr info) const
Definition filter_tree.cpp:327
bool acceptFormat(CardInfoPtr info) const
Definition filter_tree.cpp:347
bool acceptName(CardInfoPtr info, const CardSearchLanguage &searchLanguage) const
Definition filter_tree.cpp:167
FilterTreeNode * parent() const override
Definition filter_tree.h:207
bool acceptRarity(CardInfoPtr info) const
Definition filter_tree.cpp:389
FilterItem(QString trm, FilterItemList *parent)
Definition filter_tree.h:194
bool isLeaf() const override
Definition filter_tree.h:215
bool acceptType(CardInfoPtr info) const
Definition filter_tree.cpp:213
bool acceptNameExact(CardInfoPtr info, const CardSearchLanguage &searchLanguage) const
Definition filter_tree.cpp:190
bool acceptManaCost(CardInfoPtr info) const
Definition filter_tree.cpp:307
bool acceptLoyalty(CardInfoPtr info) const
Definition filter_tree.cpp:352
CardFilter::Type type() const
Definition filter_tree.h:203
virtual ~FilterItem()=default
const QString text() const override
Definition filter_tree.h:211
bool relationCheck(int cardInfo) const
Definition filter_tree.cpp:439
bool acceptText(CardInfoPtr info, const CardSearchLanguage &searchLanguage) const
Definition filter_tree.cpp:268
CardFilter::Attr attr() const
Definition filter_tree.h:199
bool acceptPowerToughness(CardInfoPtr info, CardFilter::Attr attr) const
Definition filter_tree.cpp:368
bool acceptSubType(CardInfoPtr info) const
Definition filter_tree.cpp:224
bool acceptColor(CardInfoPtr info) const
Definition filter_tree.cpp:230
bool acceptCardAttr(CardInfoPtr info, CardFilter::Attr attr, const CardSearchLanguage &searchLanguage) const
Definition filter_tree.cpp:475
bool acceptMainType(CardInfoPtr info) const
Definition filter_tree.cpp:218
FilterItemList *const p
Definition filter_tree.h:189
const QString term
Definition filter_tree.h:192
Definition filter_tree.h:108
void deleteAt(int i) override
Definition filter_tree.cpp:20
FilterTreeNode * nodeAt(int i) const override
Definition filter_tree.cpp:15
QList< T > childNodes
Definition filter_tree.h:110
void removeFiltersByAttr(CardFilter::Attr filterType)
int childIndex(const FilterTreeNode *node) const override
Definition filter_tree.cpp:28
int childCount() const override
Definition filter_tree.h:117
Definition filter_tree.h:22
virtual int index() const
Definition filter_tree.h:63
virtual void enable()
Definition filter_tree.h:34
virtual bool isEnabled() const
Definition filter_tree.h:30
virtual int childCount() const
Definition filter_tree.h:55
virtual void nodeChanged() const
Definition filter_tree.h:75
virtual int childIndex(const FilterTreeNode *) const
Definition filter_tree.h:59
virtual FilterTreeNode * parent() const
Definition filter_tree.h:44
virtual bool isLeaf() const
Definition filter_tree.h:71
virtual const QString text() const
Definition filter_tree.h:67
virtual void disable()
Definition filter_tree.h:39
bool enabled
Definition filter_tree.h:24
virtual void preRemoveChild(const FilterTreeNode *p, int i) const
Definition filter_tree.h:93
virtual void preInsertChild(const FilterTreeNode *p, int i) const
Definition filter_tree.h:81
virtual void deleteAt(int)
Definition filter_tree.h:52
virtual FilterTreeNode * nodeAt(int) const
Definition filter_tree.h:48
virtual void postInsertChild(const FilterTreeNode *p, int i) const
Definition filter_tree.h:87
FilterTreeNode()
Definition filter_tree.h:27
virtual void postRemoveChild(const FilterTreeNode *p, int i) const
Definition filter_tree.h:99
Definition filter_tree.h:240
const QString text() const override
Definition filter_tree.h:284
void preInsertChild(const FilterTreeNode *p, int i) const override
Definition filter_tree.h:260
void removeFilter(const CardFilter *toRemove)
Definition filter_tree.cpp:614
int index() const override
Definition filter_tree.h:288
FilterTreeNode * termNode(CardFilter::Attr attr, CardFilter::Type type, const QString &term)
Definition filter_tree.cpp:549
LogicMap * attrLogicMap(CardFilter::Attr attr)
Definition filter_tree.cpp:522
void preInsertRow(const FilterTreeNode *parent, int i) const
void removeFiltersByAttr(CardFilter::Attr filterType)
Definition filter_tree.cpp:603
bool acceptsCard(CardInfoPtr info, const CardSearchLanguage &searchLanguage) const
Definition filter_tree.cpp:592
void postInsertChild(const FilterTreeNode *p, int i) const override
Definition filter_tree.h:264
void changed() const
void postRemoveRow(const FilterTreeNode *parent, int i) const
void postInsertRow(const FilterTreeNode *parent, int i) const
void preRemoveRow(const FilterTreeNode *parent, int i) const
void clear()
Definition filter_tree.cpp:641
void nodeChanged() const override
Definition filter_tree.h:256
bool testAttr(CardInfoPtr info, const LogicMap *lm, const CardSearchLanguage &searchLanguage) const
Definition filter_tree.cpp:559
FilterItemList * attrTypeList(CardFilter::Attr attr, CardFilter::Type type)
Definition filter_tree.cpp:544
void postRemoveChild(const FilterTreeNode *p, int i) const override
Definition filter_tree.h:272
void preRemoveChild(const FilterTreeNode *p, int i) const override
Definition filter_tree.h:268
~FilterTree() override
Definition filter_tree.h:128
const QString text() const override
Definition filter_tree.h:142
const CardFilter::Attr attr
Definition filter_tree.h:134
FilterTree *const p
Definition filter_tree.h:131
FilterItemList * typeList(CardFilter::Type type)
Definition filter_tree.cpp:55
const FilterItemList * findTypeList(CardFilter::Type type) const
Definition filter_tree.cpp:42
LogicMap(CardFilter::Attr a, FilterTree *parent)
Definition filter_tree.h:136
FilterTreeNode * parent() const override
Definition filter_tree.cpp:77
Definition remote_connection_controller.h:20
EmailType type
Definition smtpclient.cpp:30
The card language and matching mode searches run against.
Definition card_localization.h:27