]> git.tdb.fi Git - poefilter.git/blob - source/category.cpp
Revamp appearance definitions
[poefilter.git] / source / category.cpp
1 #include "category.h"
2 #include "choicecondition.h"
3 #include "filter.h"
4 #include "poefilter.h"
5 #include "rangecondition.h"
6 #include "theme.h"
7
8 using namespace std;
9 using namespace Msp;
10
11 Category::Category():
12         condition(0),
13         order(0)
14 { }
15
16 Category::Category(const Category &other):
17         condition(other.condition ? other.condition->clone() : 0),
18         order(other.order),
19         appearance(other.appearance)
20 { }
21
22 Category &Category::operator=(const Category &other)
23 {
24         delete condition;
25         condition = (other.condition ? other.condition->clone() : 0);
26         order = other.order;
27         appearance = other.appearance;
28         return *this;
29 }
30
31 Category::~Category()
32 {
33         delete condition;
34 }
35
36 void Category::create_statements(list<FilterStatement> &st) const
37 {
38         st.clear();
39         st.push_back(FilterStatement());
40         st.back().add_line(format("SetFontSize %d", appearance.get_font_size()));
41
42         const Color &bg_color = appearance.get_background_color();
43         if(bg_color.defined)
44                 st.back().add_line(format("SetBackgroundColor %d %d %d", bg_color.r, bg_color.g, bg_color.b));
45
46         const Color &brd_color = appearance.get_border_color();
47         if(brd_color.defined)
48                 st.back().add_line(format("SetBorderColor %d %d %d", brd_color.r, brd_color.g, brd_color.b));
49
50         const Color &txt_color = appearance.get_text_color();
51         if(txt_color.defined)
52                 st.back().add_line(format("SetTextColor %d %d %d", txt_color.r, txt_color.g, txt_color.b));
53
54         if(appearance.get_sound_type())
55                 st.back().add_line(format("PlayAlertSound %d %d", appearance.get_sound_type(), appearance.get_sound_volume()));
56
57         if(condition)
58                 condition->add_lines(st);
59 }
60
61
62 Category::Loader::Loader(Category &c, const PoeFilter &p, CompoundCondition *n):
63         DataFile::ObjectLoader<Category>(c),
64         poe(p),
65         compound(n),
66         app_loader(c.appearance, p.get_theme())
67 {
68         add("and", &Loader::and_);
69         add("appearance", &Loader::appearance);
70         add("base_type", &Loader::condition<BaseTypeCondition>);
71         add("class", &Loader::condition<ClassCondition>);
72         add_range<DropLevelCondition>("drop_level");
73         add_range<HeightCondition>("height");
74         add_range<ItemLevelCondition>("item_level");
75         add("linked_colors", &Loader::linked_colors);
76         add_range<LinkedSocketsCondition>("linked_sockets");
77         add_range<SocketsCondition>("sockets");
78         add("or", &Loader::or_);
79         add("order", &Category::order);
80         add_range<QualityCondition>("quality");
81         add_range<RarityCondition>("rarity");
82         add_range<WidthCondition>("width");
83
84         add_auxiliary_loader(app_loader);
85 }
86
87 template<typename T>
88 void Category::Loader::add_range(const string &keyword)
89 {
90         add(keyword, &Loader::condition<T>);
91         add(keyword, &Loader::condition_range<T>);
92         add("min_"+keyword, &Loader::condition_min<T>);
93         add("max_"+keyword, &Loader::condition_max<T>);
94 }
95
96 void Category::Loader::add_condition(Condition *cond)
97 {
98         if(compound)
99                 compound->add(cond);
100         else if(!obj.condition)
101                 obj.condition = cond;
102         else
103         {
104                 compound = new AndCondition;
105                 compound->add(obj.condition);
106                 compound->add(cond);
107                 obj.condition = compound;
108         }
109 }
110
111 void Category::Loader::and_()
112 {
113         RefPtr<AndCondition> cond = new AndCondition;
114         Loader sub_ldr(obj, poe, cond.get());
115         load_sub_with(sub_ldr);
116         add_condition(cond.release());
117 }
118
119 void Category::Loader::appearance(const std::string &name)
120 {
121         obj.appearance = poe.get_theme().get_appearance(name);
122 }
123
124 template<typename T>
125 void Category::Loader::condition(typename T::Type value)
126 {
127         add_condition(new T(value));
128 }
129
130 template<typename T>
131 void Category::Loader::condition_max(typename T::Type max)
132 {
133         add_condition(new T(T::Traits::get_min(), max));
134 }
135
136 template<typename T>
137 void Category::Loader::condition_min(typename T::Type min)
138 {
139         add_condition(new T(min, T::Traits::get_max()));
140 }
141
142 template<typename T>
143 void Category::Loader::condition_range(typename T::Type min, typename T::Type max)
144 {
145         add_condition(new T(min, max));
146 }
147
148 void Category::Loader::linked_colors(const LinkedColorsCondition::Colors &colors)
149 {
150         add_condition(new LinkedColorsCondition(colors));
151 }
152
153 void Category::Loader::or_()
154 {
155         RefPtr<OrCondition> cond = new OrCondition;
156         Loader sub_ldr(obj, poe, cond.get());
157         load_sub_with(sub_ldr);
158         add_condition(cond.release());
159 }