]> git.tdb.fi Git - poefilter.git/blob - source/appearance.cpp
Correctly merge icon and light beam appearances
[poefilter.git] / source / appearance.cpp
1 #include <msp/strings/format.h>
2 #include "appearance.h"
3 #include "filter.h"
4 #include "theme.h"
5
6 using namespace std;
7 using namespace Msp;
8
9 Appearance::Appearance():
10         font_size(0),
11         sound_type(0),
12         sound_volume(100),
13         show_icon(false),
14         icon_shape(CIRCLE),
15         icon_color(WHITE),
16         icon_size(1),
17         show_beam(false),
18         beam_color(WHITE)
19 { }
20
21 void Appearance::merge_from(const Appearance &other)
22 {
23         if(other.font_size)
24                 font_size = other.font_size;
25         if(other.border_color.defined)
26                 border_color = other.border_color;
27         if(other.background_color.defined)
28                 background_color = other.background_color;
29         if(other.text_color.defined)
30                 text_color = other.text_color;
31         if(other.sound_type)
32         {
33                 sound_type = other.sound_type;
34                 sound_volume = other.sound_volume;
35         }
36         if(other.show_icon)
37         {
38                 show_icon = true;
39                 icon_shape = other.icon_shape;
40                 icon_color = other.icon_color;
41                 icon_size = other.icon_size;
42         }
43         if(other.show_beam)
44         {
45                 show_beam = true;
46                 beam_color = other.beam_color;
47         }
48 }
49
50 void Appearance::add_lines(FilterStatement &st) const
51 {
52         if(font_size)
53                 st.add_line(format("SetFontSize %d", font_size));
54
55         if(background_color.defined)
56                 st.add_line(format("SetBackgroundColor %d %d %d %d", background_color.r, background_color.g, background_color.b, background_color.a));
57
58         if(border_color.defined)
59                 st.add_line(format("SetBorderColor %d %d %d %d", border_color.r, border_color.g, border_color.b, border_color.a));
60
61         if(text_color.defined)
62                 st.add_line(format("SetTextColor %d %d %d %d", text_color.r, text_color.g, text_color.b, text_color.a));
63
64         if(show_icon)
65                 st.add_line(format("MinimapIcon %d %s %s", icon_size, icon_color, icon_shape));
66
67         if(sound_type)
68         {
69                 st.add_line(format("PlayAlertSound %d %d", sound_type, sound_volume));
70                 st.add_line("DisableDropSound");
71         }
72
73         if(show_beam)
74                 st.add_line(format("PlayEffect %s", beam_color));
75 }
76
77
78 Appearance::Loader::Loader(Appearance &a, const Theme *t):
79         DataFile::ObjectLoader<Appearance>(a),
80         theme(t)
81 {
82         add("alert_sound", &Appearance::sound_type, &Appearance::sound_volume);
83         add("background_color", &Loader::background_color);
84         add("background_color", &Loader::background_color_alpha);
85         add("background_color", &Loader::background_color_named);
86         add("border_color", &Loader::border_color);
87         add("border_color", &Loader::border_color_alpha);
88         add("border_color", &Loader::border_color_named);
89         add("font_size", &Loader::font_size);
90         add("inherit", &Loader::inherit);
91         add("light_beam", &Loader::light_beam);
92         add("minimap_icon", &Loader::minimap_icon);
93         add("minimap_icon", &Loader::minimap_icon_size);
94         add("text_color", &Loader::text_color);
95         add("text_color", &Loader::text_color_alpha);
96         add("text_color", &Loader::text_color_named);
97 }
98
99 void Appearance::Loader::background_color(unsigned r, unsigned g, unsigned b)
100 {
101         obj.background_color = Color(r, g, b);
102 }
103
104 void Appearance::Loader::background_color_alpha(unsigned r, unsigned g, unsigned b, unsigned a)
105 {
106         obj.background_color = Color(r, g, b, a);
107 }
108
109 void Appearance::Loader::background_color_named(const string &name)
110 {
111         if(!theme)
112                 throw logic_error("No theme");
113         obj.background_color = theme->get_color(name);
114 }
115
116 void Appearance::Loader::border_color(unsigned r, unsigned g, unsigned b)
117 {
118         obj.border_color = Color(r, g, b);
119 }
120
121 void Appearance::Loader::border_color_alpha(unsigned r, unsigned g, unsigned b, unsigned a)
122 {
123         obj.border_color = Color(r, g, b, a);
124 }
125
126 void Appearance::Loader::border_color_named(const string &name)
127 {
128         if(!theme)
129                 throw logic_error("No theme");
130         obj.border_color = theme->get_color(name);
131 }
132
133 void Appearance::Loader::font_size(float s)
134 {
135         float base_size = (theme ? theme->get_base_font_size() : 32);
136         obj.font_size = base_size*s+0.5f;
137 }
138
139 void Appearance::Loader::inherit(const string &name)
140 {
141         if(!theme)
142                 throw logic_error("No theme");
143         obj = theme->get_appearance(name);
144 }
145
146 void Appearance::Loader::light_beam(EffectColor color)
147 {
148         obj.show_beam = true;
149         obj.beam_color = color;
150 }
151
152 void Appearance::Loader::minimap_icon(EffectColor color, IconShape shape)
153 {
154         minimap_icon_size(color, shape, 1);
155 }
156
157 void Appearance::Loader::minimap_icon_size(EffectColor color, IconShape shape, unsigned size)
158 {
159         obj.show_icon = true;
160         obj.icon_shape = shape;
161         obj.icon_color = color;
162         obj.icon_size = size;
163 }
164
165 void Appearance::Loader::text_color(unsigned r, unsigned g, unsigned b)
166 {
167         obj.text_color = Color(r, g, b);
168 }
169
170 void Appearance::Loader::text_color_alpha(unsigned r, unsigned g, unsigned b, unsigned a)
171 {
172         obj.text_color = Color(r, g, b, a);
173 }
174
175 void Appearance::Loader::text_color_named(const string &name)
176 {
177         if(!theme)
178                 throw logic_error("No theme");
179         obj.text_color = theme->get_color(name);
180 }