Cockatrice 2026-06-01-Development-3.1.0-beta.3
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"
11
12#include <QList>
13#include <QObject>
15#include <utility>
16
18{
19private:
20 bool enabled;
21
22public:
24 {
25 }
26 [[nodiscard]] virtual bool isEnabled() const
27 {
28 return enabled;
29 }
30 virtual void enable()
31 {
32 enabled = true;
34 }
35 virtual void disable()
36 {
37 enabled = false;
39 }
40 [[nodiscard]] virtual FilterTreeNode *parent() const
41 {
42 return nullptr;
43 }
44 [[nodiscard]] virtual FilterTreeNode *nodeAt(int /* i */) const
45 {
46 return nullptr;
47 }
48 virtual void deleteAt(int /* i */)
49 {
50 }
51 [[nodiscard]] virtual int childCount() const
52 {
53 return 0;
54 }
55 virtual int childIndex(const FilterTreeNode * /* node */) const
56 {
57 return -1;
58 }
59 [[nodiscard]] virtual int index() const
60 {
61 return (parent() != nullptr) ? parent()->childIndex(this) : -1;
62 }
63 [[nodiscard]] virtual const QString text() const
64 {
65 return QString("");
66 }
67 [[nodiscard]] virtual bool isLeaf() const
68 {
69 return false;
70 }
71 virtual void nodeChanged() const
72 {
73 if (parent() != nullptr) {
75 }
76 }
77 virtual void preInsertChild(const FilterTreeNode *p, int i) const
78 {
79 if (parent() != nullptr) {
80 parent()->preInsertChild(p, i);
81 }
82 }
83 virtual void postInsertChild(const FilterTreeNode *p, int i) const
84 {
85 if (parent() != nullptr) {
86 parent()->postInsertChild(p, i);
87 }
88 }
89 virtual void preRemoveChild(const FilterTreeNode *p, int i) const
90 {
91 if (parent() != nullptr) {
92 parent()->preRemoveChild(p, i);
93 }
94 }
95 virtual void postRemoveChild(const FilterTreeNode *p, int i) const
96 {
97 if (parent() != nullptr) {
98 parent()->postRemoveChild(p, i);
99 }
100 }
101};
102
103template <class T> class FilterTreeBranch : public FilterTreeNode
104{
105protected:
106 QList<T> childNodes;
107
108public:
109 virtual ~FilterTreeBranch();
111 [[nodiscard]] FilterTreeNode *nodeAt(int i) const override;
112 void deleteAt(int i) override;
113 [[nodiscard]] int childCount() const override
114 {
115 return childNodes.size();
116 }
117 int childIndex(const FilterTreeNode *node) const override;
118};
119
120class FilterItemList;
121class FilterTree;
122class LogicMap : public FilterTreeBranch<FilterItemList *>
123{
124
125private:
126 FilterTree *const p;
127
128public:
130
134 [[nodiscard]] const FilterItemList *findTypeList(CardFilter::Type type) const;
136 [[nodiscard]] FilterTreeNode *parent() const override;
137 [[nodiscard]] const QString text() const override
138 {
140 }
141};
142
143class FilterItem;
144class FilterItemList : public FilterTreeBranch<FilterItem *>
145{
146private:
147 LogicMap *const p;
148
149public:
151
155 [[nodiscard]] CardFilter::Attr attr() const
156 {
157 return p->attr;
158 }
159 [[nodiscard]] FilterTreeNode *parent() const override
160 {
161 return p;
162 }
163 [[nodiscard]] int termIndex(const QString &term) const;
164 FilterTreeNode *termNode(const QString &term);
165 [[nodiscard]] const QString text() const override
166 {
168 }
169
170 [[nodiscard]] bool testTypeAnd(CardInfoPtr info, CardFilter::Attr attr) const;
171 [[nodiscard]] bool testTypeAndNot(CardInfoPtr info, CardFilter::Attr attr) const;
172 [[nodiscard]] bool testTypeOr(CardInfoPtr info, CardFilter::Attr attr) const;
173 [[nodiscard]] bool testTypeOrNot(CardInfoPtr info, CardFilter::Attr attr) const;
174};
175
177{
178private:
180
181public:
182 const QString term;
183
184 FilterItem(QString trm, FilterItemList *parent) : p(parent), term(std::move(trm))
185 {
186 }
187 virtual ~FilterItem() = default;
188
189 [[nodiscard]] CardFilter::Attr attr() const
190 {
191 return p->attr();
192 }
193 [[nodiscard]] CardFilter::Type type() const
194 {
195 return p->type;
196 }
197 [[nodiscard]] FilterTreeNode *parent() const override
198 {
199 return p;
200 }
201 [[nodiscard]] const QString text() const override
202 {
203 return term;
204 }
205 [[nodiscard]] bool isLeaf() const override
206 {
207 return true;
208 }
209
210 [[nodiscard]] bool acceptName(CardInfoPtr info) const;
211 [[nodiscard]] bool acceptNameExact(CardInfoPtr info) const;
212 [[nodiscard]] bool acceptType(CardInfoPtr info) const;
213 [[nodiscard]] bool acceptMainType(CardInfoPtr info) const;
214 [[nodiscard]] bool acceptSubType(CardInfoPtr info) const;
215 [[nodiscard]] bool acceptColor(CardInfoPtr info) const;
216 [[nodiscard]] bool acceptText(CardInfoPtr info) const;
217 [[nodiscard]] bool acceptSet(CardInfoPtr info) const;
218 [[nodiscard]] bool acceptManaCost(CardInfoPtr info) const;
219 [[nodiscard]] bool acceptCmc(CardInfoPtr info) const;
220 [[nodiscard]] bool acceptPowerToughness(CardInfoPtr info, CardFilter::Attr attr) const;
221 [[nodiscard]] bool acceptLoyalty(CardInfoPtr info) const;
222 [[nodiscard]] bool acceptRarity(CardInfoPtr info) const;
223 [[nodiscard]] bool acceptCardAttr(CardInfoPtr info, CardFilter::Attr attr) const;
224 [[nodiscard]] bool acceptFormat(CardInfoPtr info) const;
225 [[nodiscard]] bool relationCheck(int cardInfo) const;
226};
227
228class FilterTree : public QObject, public FilterTreeBranch<LogicMap *>
229{
230 Q_OBJECT
231
232signals:
233 void preInsertRow(const FilterTreeNode *parent, int i) const;
234 void postInsertRow(const FilterTreeNode *parent, int i) const;
235 void preRemoveRow(const FilterTreeNode *parent, int i) const;
236 void postRemoveRow(const FilterTreeNode *parent, int i) const;
237 void changed() const;
238
239private:
242
243 bool testAttr(CardInfoPtr info, const LogicMap *lm) const;
244
245 void nodeChanged() const override
246 {
247 emit changed();
248 }
249 void preInsertChild(const FilterTreeNode *p, int i) const override
250 {
251 emit preInsertRow(p, i);
252 }
253 void postInsertChild(const FilterTreeNode *p, int i) const override
254 {
255 emit postInsertRow(p, i);
256 }
257 void preRemoveChild(const FilterTreeNode *p, int i) const override
258 {
259 emit preRemoveRow(p, i);
260 }
261 void postRemoveChild(const FilterTreeNode *p, int i) const override
262 {
263 emit postRemoveRow(p, i);
264 }
265
266public:
268 ~FilterTree() override;
269
270 FilterTreeNode *termNode(CardFilter::Attr attr, CardFilter::Type type, const QString &term);
272
273 [[nodiscard]] const QString text() const override
274 {
275 return QString("root");
276 }
277 [[nodiscard]] int index() const override
278 {
279 return 0;
280 }
281
282 [[nodiscard]] bool acceptsCard(CardInfoPtr info) const;
283 void removeFiltersByAttr(CardFilter::Attr filterType);
284 void removeFilter(const CardFilter *toRemove);
285 void clear();
286};
287
288#endif
QSharedPointer< CardInfo > CardInfoPtr
Definition card_info.cpp:20
Definition filter_card.h:14
static const QString typeName(Type t)
Definition filter_card.cpp:42
static const QString attrName(Attr a)
Definition filter_card.cpp:58
Type
Definition filter_card.h:19
Attr
Definition filter_card.h:30
Definition filter_tree.h:145
const QString text() const override
Definition filter_tree.h:165
bool testTypeOr(CardInfoPtr info, CardFilter::Attr attr) const
Definition filter_tree.cpp:124
FilterItemList(CardFilter::Type t, LogicMap *parent)
Definition filter_tree.h:152
const CardFilter::Type type
Definition filter_tree.h:150
bool testTypeOrNot(CardInfoPtr info, CardFilter::Attr attr) const
Definition filter_tree.cpp:145
bool testTypeAndNot(CardInfoPtr info, CardFilter::Attr attr) const
Definition filter_tree.cpp:118
FilterTreeNode * parent() const override
Definition filter_tree.h:159
LogicMap *const p
Definition filter_tree.h:147
CardFilter::Attr attr() const
Definition filter_tree.h:155
int termIndex(const QString &term) const
Definition filter_tree.cpp:74
bool testTypeAnd(CardInfoPtr info, CardFilter::Attr attr) const
Definition filter_tree.cpp:103
FilterTreeNode * termNode(const QString &term)
Definition filter_tree.cpp:85
Definition filter_tree.h:177
bool acceptSet(CardInfoPtr info) const
Definition filter_tree.cpp:221
bool acceptCmc(CardInfoPtr info) const
Definition filter_tree.cpp:257
bool acceptFormat(CardInfoPtr info) const
Definition filter_tree.cpp:277
bool acceptName(CardInfoPtr info) const
Definition filter_tree.cpp:151
FilterTreeNode * parent() const override
Definition filter_tree.h:197
bool acceptRarity(CardInfoPtr info) const
Definition filter_tree.cpp:319
FilterItem(QString trm, FilterItemList *parent)
Definition filter_tree.h:184
bool isLeaf() const override
Definition filter_tree.h:205
bool acceptText(CardInfoPtr info) const
Definition filter_tree.cpp:216
bool acceptType(CardInfoPtr info) const
Definition filter_tree.cpp:161
bool acceptManaCost(CardInfoPtr info) const
Definition filter_tree.cpp:237
bool acceptLoyalty(CardInfoPtr info) const
Definition filter_tree.cpp:282
CardFilter::Type type() const
Definition filter_tree.h:193
virtual ~FilterItem()=default
const QString text() const override
Definition filter_tree.h:201
bool relationCheck(int cardInfo) const
Definition filter_tree.cpp:369
bool acceptNameExact(CardInfoPtr info) const
Definition filter_tree.cpp:156
CardFilter::Attr attr() const
Definition filter_tree.h:189
bool acceptCardAttr(CardInfoPtr info, CardFilter::Attr attr) const
Definition filter_tree.cpp:405
bool acceptPowerToughness(CardInfoPtr info, CardFilter::Attr attr) const
Definition filter_tree.cpp:298
bool acceptSubType(CardInfoPtr info) const
Definition filter_tree.cpp:172
bool acceptColor(CardInfoPtr info) const
Definition filter_tree.cpp:178
bool acceptMainType(CardInfoPtr info) const
Definition filter_tree.cpp:166
FilterItemList *const p
Definition filter_tree.h:179
const QString term
Definition filter_tree.h:182
Definition filter_tree.h:104
void deleteAt(int i) override
Definition filter_tree.cpp:12
FilterTreeNode * nodeAt(int i) const override
Definition filter_tree.cpp:7
QList< T > childNodes
Definition filter_tree.h:106
virtual ~FilterTreeBranch()
Definition filter_tree.cpp:27
void removeFiltersByAttr(CardFilter::Attr filterType)
int childIndex(const FilterTreeNode *node) const override
Definition filter_tree.cpp:20
int childCount() const override
Definition filter_tree.h:113
Definition filter_tree.h:18
virtual int index() const
Definition filter_tree.h:59
virtual void enable()
Definition filter_tree.h:30
virtual bool isEnabled() const
Definition filter_tree.h:26
virtual int childCount() const
Definition filter_tree.h:51
virtual void nodeChanged() const
Definition filter_tree.h:71
virtual int childIndex(const FilterTreeNode *) const
Definition filter_tree.h:55
virtual FilterTreeNode * parent() const
Definition filter_tree.h:40
virtual bool isLeaf() const
Definition filter_tree.h:67
virtual const QString text() const
Definition filter_tree.h:63
virtual void disable()
Definition filter_tree.h:35
bool enabled
Definition filter_tree.h:20
virtual void preRemoveChild(const FilterTreeNode *p, int i) const
Definition filter_tree.h:89
virtual void preInsertChild(const FilterTreeNode *p, int i) const
Definition filter_tree.h:77
virtual void deleteAt(int)
Definition filter_tree.h:48
virtual FilterTreeNode * nodeAt(int) const
Definition filter_tree.h:44
virtual void postInsertChild(const FilterTreeNode *p, int i) const
Definition filter_tree.h:83
FilterTreeNode()
Definition filter_tree.h:23
virtual void postRemoveChild(const FilterTreeNode *p, int i) const
Definition filter_tree.h:95
Definition filter_tree.h:229
bool testAttr(CardInfoPtr info, const LogicMap *lm) const
Definition filter_tree.cpp:487
const QString text() const override
Definition filter_tree.h:273
void preInsertChild(const FilterTreeNode *p, int i) const override
Definition filter_tree.h:249
void removeFilter(const CardFilter *toRemove)
Definition filter_tree.cpp:542
int index() const override
Definition filter_tree.h:277
FilterTreeNode * termNode(CardFilter::Attr attr, CardFilter::Type type, const QString &term)
Definition filter_tree.cpp:477
LogicMap * attrLogicMap(CardFilter::Attr attr)
Definition filter_tree.cpp:450
void preInsertRow(const FilterTreeNode *parent, int i) const
void removeFiltersByAttr(CardFilter::Attr filterType)
Definition filter_tree.cpp:531
void postInsertChild(const FilterTreeNode *p, int i) const override
Definition filter_tree.h:253
void changed() const
void postRemoveRow(const FilterTreeNode *parent, int i) const
bool acceptsCard(CardInfoPtr info) const
Definition filter_tree.cpp:520
void postInsertRow(const FilterTreeNode *parent, int i) const
void preRemoveRow(const FilterTreeNode *parent, int i) const
void clear()
Definition filter_tree.cpp:569
void nodeChanged() const override
Definition filter_tree.h:245
FilterItemList * attrTypeList(CardFilter::Attr attr, CardFilter::Type type)
Definition filter_tree.cpp:472
void postRemoveChild(const FilterTreeNode *p, int i) const override
Definition filter_tree.h:261
void preRemoveChild(const FilterTreeNode *p, int i) const override
Definition filter_tree.h:257
~FilterTree() override
Definition filter_tree.h:123
const QString text() const override
Definition filter_tree.h:137
const CardFilter::Attr attr
Definition filter_tree.h:129
FilterTree *const p
Definition filter_tree.h:126
FilterItemList * typeList(CardFilter::Type type)
Definition filter_tree.cpp:47
const FilterItemList * findTypeList(CardFilter::Type type) const
Definition filter_tree.cpp:34
LogicMap(CardFilter::Attr a, FilterTree *parent)
Definition filter_tree.h:131
FilterTreeNode * parent() const override
Definition filter_tree.cpp:69