Cockatrice 2026-01-14-Development-2.11.0-beta.46
A cross-platform 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 virtual void preInsertChild(const FilterTreeNode *p, int i) const
77 {
78 if (parent() != nullptr)
79 parent()->preInsertChild(p, i);
80 }
81 virtual void postInsertChild(const FilterTreeNode *p, int i) const
82 {
83 if (parent() != nullptr)
84 parent()->postInsertChild(p, i);
85 }
86 virtual void preRemoveChild(const FilterTreeNode *p, int i) const
87 {
88 if (parent() != nullptr)
89 parent()->preRemoveChild(p, i);
90 }
91 virtual void postRemoveChild(const FilterTreeNode *p, int i) const
92 {
93 if (parent() != nullptr)
94 parent()->postRemoveChild(p, i);
95 }
96};
97
98template <class T> class FilterTreeBranch : public FilterTreeNode
99{
100protected:
101 QList<T> childNodes;
102
103public:
104 virtual ~FilterTreeBranch();
106 [[nodiscard]] FilterTreeNode *nodeAt(int i) const override;
107 void deleteAt(int i) override;
108 [[nodiscard]] int childCount() const override
109 {
110 return childNodes.size();
111 }
112 int childIndex(const FilterTreeNode *node) const override;
113};
114
115class FilterItemList;
116class FilterTree;
117class LogicMap : public FilterTreeBranch<FilterItemList *>
118{
119
120private:
121 FilterTree *const p;
122
123public:
125
129 [[nodiscard]] const FilterItemList *findTypeList(CardFilter::Type type) const;
131 [[nodiscard]] FilterTreeNode *parent() const override;
132 [[nodiscard]] const QString text() const override
133 {
135 }
136};
137
138class FilterItem;
139class FilterItemList : public FilterTreeBranch<FilterItem *>
140{
141private:
142 LogicMap *const p;
143
144public:
146
150 [[nodiscard]] CardFilter::Attr attr() const
151 {
152 return p->attr;
153 }
154 [[nodiscard]] FilterTreeNode *parent() const override
155 {
156 return p;
157 }
158 [[nodiscard]] int termIndex(const QString &term) const;
159 FilterTreeNode *termNode(const QString &term);
160 [[nodiscard]] const QString text() const override
161 {
163 }
164
165 [[nodiscard]] bool testTypeAnd(CardInfoPtr info, CardFilter::Attr attr) const;
166 [[nodiscard]] bool testTypeAndNot(CardInfoPtr info, CardFilter::Attr attr) const;
167 [[nodiscard]] bool testTypeOr(CardInfoPtr info, CardFilter::Attr attr) const;
168 [[nodiscard]] bool testTypeOrNot(CardInfoPtr info, CardFilter::Attr attr) const;
169};
170
172{
173private:
175
176public:
177 const QString term;
178
179 FilterItem(QString trm, FilterItemList *parent) : p(parent), term(std::move(trm))
180 {
181 }
182 virtual ~FilterItem() = default;
183
184 [[nodiscard]] CardFilter::Attr attr() const
185 {
186 return p->attr();
187 }
188 [[nodiscard]] CardFilter::Type type() const
189 {
190 return p->type;
191 }
192 [[nodiscard]] FilterTreeNode *parent() const override
193 {
194 return p;
195 }
196 [[nodiscard]] const QString text() const override
197 {
198 return term;
199 }
200 [[nodiscard]] bool isLeaf() const override
201 {
202 return true;
203 }
204
205 [[nodiscard]] bool acceptName(CardInfoPtr info) const;
206 [[nodiscard]] bool acceptNameExact(CardInfoPtr info) const;
207 [[nodiscard]] bool acceptType(CardInfoPtr info) const;
208 [[nodiscard]] bool acceptMainType(CardInfoPtr info) const;
209 [[nodiscard]] bool acceptSubType(CardInfoPtr info) const;
210 [[nodiscard]] bool acceptColor(CardInfoPtr info) const;
211 [[nodiscard]] bool acceptText(CardInfoPtr info) const;
212 [[nodiscard]] bool acceptSet(CardInfoPtr info) const;
213 [[nodiscard]] bool acceptManaCost(CardInfoPtr info) const;
214 [[nodiscard]] bool acceptCmc(CardInfoPtr info) const;
215 [[nodiscard]] bool acceptPowerToughness(CardInfoPtr info, CardFilter::Attr attr) const;
216 [[nodiscard]] bool acceptLoyalty(CardInfoPtr info) const;
217 [[nodiscard]] bool acceptRarity(CardInfoPtr info) const;
218 [[nodiscard]] bool acceptCardAttr(CardInfoPtr info, CardFilter::Attr attr) const;
219 [[nodiscard]] bool acceptFormat(CardInfoPtr info) const;
220 [[nodiscard]] bool relationCheck(int cardInfo) const;
221};
222
223class FilterTree : public QObject, public FilterTreeBranch<LogicMap *>
224{
225 Q_OBJECT
226
227signals:
228 void preInsertRow(const FilterTreeNode *parent, int i) const;
229 void postInsertRow(const FilterTreeNode *parent, int i) const;
230 void preRemoveRow(const FilterTreeNode *parent, int i) const;
231 void postRemoveRow(const FilterTreeNode *parent, int i) const;
232 void changed() const;
233
234private:
237
238 bool testAttr(CardInfoPtr info, const LogicMap *lm) const;
239
240 void nodeChanged() const override
241 {
242 emit changed();
243 }
244 void preInsertChild(const FilterTreeNode *p, int i) const override
245 {
246 emit preInsertRow(p, i);
247 }
248 void postInsertChild(const FilterTreeNode *p, int i) const override
249 {
250 emit postInsertRow(p, i);
251 }
252 void preRemoveChild(const FilterTreeNode *p, int i) const override
253 {
254 emit preRemoveRow(p, i);
255 }
256 void postRemoveChild(const FilterTreeNode *p, int i) const override
257 {
258 emit postRemoveRow(p, i);
259 }
260
261public:
263 ~FilterTree() override;
264
265 FilterTreeNode *termNode(CardFilter::Attr attr, CardFilter::Type type, const QString &term);
267
268 [[nodiscard]] const QString text() const override
269 {
270 return QString("root");
271 }
272 [[nodiscard]] int index() const override
273 {
274 return 0;
275 }
276
277 [[nodiscard]] bool acceptsCard(CardInfoPtr info) const;
278 void removeFiltersByAttr(CardFilter::Attr filterType);
279 void removeFilter(const CardFilter *toRemove);
280 void clear();
281};
282
283#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:140
const QString text() const override
Definition filter_tree.h:160
bool testTypeOr(CardInfoPtr info, CardFilter::Attr attr) const
Definition filter_tree.cpp:124
FilterItemList(CardFilter::Type t, LogicMap *parent)
Definition filter_tree.h:147
const CardFilter::Type type
Definition filter_tree.h:145
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:154
LogicMap *const p
Definition filter_tree.h:142
CardFilter::Attr attr() const
Definition filter_tree.h:150
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:172
bool acceptSet(CardInfoPtr info) const
Definition filter_tree.cpp:220
bool acceptCmc(CardInfoPtr info) const
Definition filter_tree.cpp:256
bool acceptFormat(CardInfoPtr info) const
Definition filter_tree.cpp:276
bool acceptName(CardInfoPtr info) const
Definition filter_tree.cpp:151
FilterTreeNode * parent() const override
Definition filter_tree.h:192
bool acceptRarity(CardInfoPtr info) const
Definition filter_tree.cpp:318
FilterItem(QString trm, FilterItemList *parent)
Definition filter_tree.h:179
bool isLeaf() const override
Definition filter_tree.h:200
bool acceptText(CardInfoPtr info) const
Definition filter_tree.cpp:215
bool acceptType(CardInfoPtr info) const
Definition filter_tree.cpp:161
bool acceptManaCost(CardInfoPtr info) const
Definition filter_tree.cpp:236
bool acceptLoyalty(CardInfoPtr info) const
Definition filter_tree.cpp:281
CardFilter::Type type() const
Definition filter_tree.h:188
virtual ~FilterItem()=default
const QString text() const override
Definition filter_tree.h:196
bool relationCheck(int cardInfo) const
Definition filter_tree.cpp:368
bool acceptNameExact(CardInfoPtr info) const
Definition filter_tree.cpp:156
CardFilter::Attr attr() const
Definition filter_tree.h:184
bool acceptCardAttr(CardInfoPtr info, CardFilter::Attr attr) const
Definition filter_tree.cpp:404
bool acceptPowerToughness(CardInfoPtr info, CardFilter::Attr attr) const
Definition filter_tree.cpp:297
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:174
const QString term
Definition filter_tree.h:177
Definition filter_tree.h:99
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:101
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:108
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:86
virtual void preInsertChild(const FilterTreeNode *p, int i) const
Definition filter_tree.h:76
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:81
FilterTreeNode()
Definition filter_tree.h:23
virtual void postRemoveChild(const FilterTreeNode *p, int i) const
Definition filter_tree.h:91
Definition filter_tree.h:224
bool testAttr(CardInfoPtr info, const LogicMap *lm) const
Definition filter_tree.cpp:486
const QString text() const override
Definition filter_tree.h:268
void preInsertChild(const FilterTreeNode *p, int i) const override
Definition filter_tree.h:244
void removeFilter(const CardFilter *toRemove)
Definition filter_tree.cpp:541
int index() const override
Definition filter_tree.h:272
FilterTreeNode * termNode(CardFilter::Attr attr, CardFilter::Type type, const QString &term)
Definition filter_tree.cpp:476
LogicMap * attrLogicMap(CardFilter::Attr attr)
Definition filter_tree.cpp:449
void preInsertRow(const FilterTreeNode *parent, int i) const
void removeFiltersByAttr(CardFilter::Attr filterType)
Definition filter_tree.cpp:530
void postInsertChild(const FilterTreeNode *p, int i) const override
Definition filter_tree.h:248
void changed() const
void postRemoveRow(const FilterTreeNode *parent, int i) const
bool acceptsCard(CardInfoPtr info) const
Definition filter_tree.cpp:519
void postInsertRow(const FilterTreeNode *parent, int i) const
void preRemoveRow(const FilterTreeNode *parent, int i) const
void clear()
Definition filter_tree.cpp:566
void nodeChanged() const override
Definition filter_tree.h:240
FilterItemList * attrTypeList(CardFilter::Attr attr, CardFilter::Type type)
Definition filter_tree.cpp:471
void postRemoveChild(const FilterTreeNode *p, int i) const override
Definition filter_tree.h:256
void preRemoveChild(const FilterTreeNode *p, int i) const override
Definition filter_tree.h:252
~FilterTree() override
Definition filter_tree.h:118
const QString text() const override
Definition filter_tree.h:132
const CardFilter::Attr attr
Definition filter_tree.h:124
FilterTree *const p
Definition filter_tree.h:121
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:126
FilterTreeNode * parent() const override
Definition filter_tree.cpp:69
TODO: Document this.