Cockatrice 2025-11-30-Development-2.11.0-beta.38
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 acceptType(CardInfoPtr info) const;
207 [[nodiscard]] bool acceptMainType(CardInfoPtr info) const;
208 [[nodiscard]] bool acceptSubType(CardInfoPtr info) const;
209 [[nodiscard]] bool acceptColor(CardInfoPtr info) const;
210 [[nodiscard]] bool acceptText(CardInfoPtr info) const;
211 [[nodiscard]] bool acceptSet(CardInfoPtr info) const;
212 [[nodiscard]] bool acceptManaCost(CardInfoPtr info) const;
213 [[nodiscard]] bool acceptCmc(CardInfoPtr info) const;
214 [[nodiscard]] bool acceptPowerToughness(CardInfoPtr info, CardFilter::Attr attr) const;
215 [[nodiscard]] bool acceptLoyalty(CardInfoPtr info) const;
216 [[nodiscard]] bool acceptRarity(CardInfoPtr info) const;
217 [[nodiscard]] bool acceptCardAttr(CardInfoPtr info, CardFilter::Attr attr) const;
218 [[nodiscard]] bool acceptFormat(CardInfoPtr info) const;
219 [[nodiscard]] bool relationCheck(int cardInfo) const;
220};
221
222class FilterTree : public QObject, public FilterTreeBranch<LogicMap *>
223{
224 Q_OBJECT
225
226signals:
227 void preInsertRow(const FilterTreeNode *parent, int i) const;
228 void postInsertRow(const FilterTreeNode *parent, int i) const;
229 void preRemoveRow(const FilterTreeNode *parent, int i) const;
230 void postRemoveRow(const FilterTreeNode *parent, int i) const;
231 void changed() const;
232
233private:
236
237 bool testAttr(CardInfoPtr info, const LogicMap *lm) const;
238
239 void nodeChanged() const override
240 {
241 emit changed();
242 }
243 void preInsertChild(const FilterTreeNode *p, int i) const override
244 {
245 emit preInsertRow(p, i);
246 }
247 void postInsertChild(const FilterTreeNode *p, int i) const override
248 {
249 emit postInsertRow(p, i);
250 }
251 void preRemoveChild(const FilterTreeNode *p, int i) const override
252 {
253 emit preRemoveRow(p, i);
254 }
255 void postRemoveChild(const FilterTreeNode *p, int i) const override
256 {
257 emit postRemoveRow(p, i);
258 }
259
260public:
262 ~FilterTree() override;
263
264 FilterTreeNode *termNode(CardFilter::Attr attr, CardFilter::Type type, const QString &term);
266
267 [[nodiscard]] const QString text() const override
268 {
269 return QString("root");
270 }
271 [[nodiscard]] int index() const override
272 {
273 return 0;
274 }
275
276 [[nodiscard]] bool acceptsCard(CardInfoPtr info) const;
277 void removeFiltersByAttr(CardFilter::Attr filterType);
278 void removeFilter(const CardFilter *toRemove);
279 void clear();
280};
281
282#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:215
bool acceptCmc(CardInfoPtr info) const
Definition filter_tree.cpp:251
bool acceptFormat(CardInfoPtr info) const
Definition filter_tree.cpp:271
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:313
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:210
bool acceptType(CardInfoPtr info) const
Definition filter_tree.cpp:156
bool acceptManaCost(CardInfoPtr info) const
Definition filter_tree.cpp:231
bool acceptLoyalty(CardInfoPtr info) const
Definition filter_tree.cpp:276
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:363
CardFilter::Attr attr() const
Definition filter_tree.h:184
bool acceptCardAttr(CardInfoPtr info, CardFilter::Attr attr) const
Definition filter_tree.cpp:399
bool acceptPowerToughness(CardInfoPtr info, CardFilter::Attr attr) const
Definition filter_tree.cpp:292
bool acceptSubType(CardInfoPtr info) const
Definition filter_tree.cpp:167
bool acceptColor(CardInfoPtr info) const
Definition filter_tree.cpp:173
bool acceptMainType(CardInfoPtr info) const
Definition filter_tree.cpp:161
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:223
bool testAttr(CardInfoPtr info, const LogicMap *lm) const
Definition filter_tree.cpp:479
const QString text() const override
Definition filter_tree.h:267
void preInsertChild(const FilterTreeNode *p, int i) const override
Definition filter_tree.h:243
void removeFilter(const CardFilter *toRemove)
Definition filter_tree.cpp:534
int index() const override
Definition filter_tree.h:271
FilterTreeNode * termNode(CardFilter::Attr attr, CardFilter::Type type, const QString &term)
Definition filter_tree.cpp:469
LogicMap * attrLogicMap(CardFilter::Attr attr)
Definition filter_tree.cpp:442
void preInsertRow(const FilterTreeNode *parent, int i) const
void removeFiltersByAttr(CardFilter::Attr filterType)
Definition filter_tree.cpp:523
void postInsertChild(const FilterTreeNode *p, int i) const override
Definition filter_tree.h:247
void changed() const
void postRemoveRow(const FilterTreeNode *parent, int i) const
bool acceptsCard(CardInfoPtr info) const
Definition filter_tree.cpp:512
void postInsertRow(const FilterTreeNode *parent, int i) const
void preRemoveRow(const FilterTreeNode *parent, int i) const
void clear()
Definition filter_tree.cpp:559
void nodeChanged() const override
Definition filter_tree.h:239
FilterItemList * attrTypeList(CardFilter::Attr attr, CardFilter::Type type)
Definition filter_tree.cpp:464
void postRemoveChild(const FilterTreeNode *p, int i) const override
Definition filter_tree.h:255
void preRemoveChild(const FilterTreeNode *p, int i) const override
Definition filter_tree.h:251
~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.