1 //  SuperTux
2 //  Copyright (C) 2015 Hume2 <teratux.mail@gmail.com>
3 //
4 //  This program is free software: you can redistribute it and/or modify
5 //  it under the terms of the GNU General Public License as published by
6 //  the Free Software Foundation, either version 3 of the License, or
7 //  (at your option) any later version.
8 //
9 //  This program is distributed in the hope that it will be useful,
10 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
11 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 //  GNU General Public License for more details.
13 //
14 //  You should have received a copy of the GNU General Public License
15 //  along with this program.  If not, see <http://www.gnu.org/licenses/>.
16 
17 #ifndef HEADER_SUPERTUX_EDITOR_OBJECT_OPTION_HPP
18 #define HEADER_SUPERTUX_EDITOR_OBJECT_OPTION_HPP
19 
20 #include <boost/optional.hpp>
21 #include <string>
22 #include <vector>
23 
24 #include <sexp/value.hpp>
25 
26 #include "video/color.hpp"
27 #include "gui/menu_action.hpp"
28 
29 enum ObjectOptionFlag {
30   /** Set if the value is a hidden implementation detail that
31       shouldn't be exposed to the user */
32   OPTION_HIDDEN = (1 << 0),
33 
34   /** Set if the text should be saved as translatable */
35   OPTION_TRANSLATABLE = (1 << 1)
36 };
37 
38 namespace sexp {
39 class Value;
40 } // namespace sexp
41 class Color;
42 class Menu;
43 class Path;
44 class PathObject;
45 class Rectf;
46 class TileMap;
47 class Writer;
48 
49 class ObjectOption
50 {
51 public:
52   ObjectOption(const std::string& text, const std::string& key, unsigned int flags);
53   virtual ~ObjectOption();
54 
55   virtual void save(Writer& write) const = 0;
56   virtual std::string to_string() const = 0;
57   virtual void add_to_menu(Menu& menu) const = 0;
58 
get_key() const59   const std::string& get_key() const { return m_key; }
get_text() const60   const std::string& get_text() const { return m_text; }
get_flags() const61   unsigned int get_flags() const { return m_flags; }
62 
63 protected:
64   const std::string m_text;
65   const std::string m_key;
66   const unsigned int m_flags;
67 
68 private:
69   ObjectOption(const ObjectOption&) = delete;
70   ObjectOption& operator=(const ObjectOption&) = delete;
71 };
72 
73 class BoolObjectOption : public ObjectOption
74 {
75 public:
76   BoolObjectOption(const std::string& text, bool* pointer, const std::string& key,
77                    boost::optional<bool> default_value,
78                    unsigned int flags);
79 
80   virtual void save(Writer& write) const override;
81   virtual std::string to_string() const override;
82   virtual void add_to_menu(Menu& menu) const override;
83 
84 private:
85   bool* const m_pointer;
86   const boost::optional<bool> m_default_value;
87 
88 private:
89   BoolObjectOption(const BoolObjectOption&) = delete;
90   BoolObjectOption& operator=(const BoolObjectOption&) = delete;
91 };
92 
93 class IntObjectOption : public ObjectOption
94 {
95 public:
96   IntObjectOption(const std::string& text, int* pointer, const std::string& key,
97                   boost::optional<int> default_value,
98                   unsigned int flags);
99 
100   virtual void save(Writer& write) const override;
101   virtual std::string to_string() const override;
102   virtual void add_to_menu(Menu& menu) const override;
103 
104 private:
105   int* const m_pointer;
106   const boost::optional<int> m_default_value;
107 
108 private:
109   IntObjectOption(const IntObjectOption&) = delete;
110   IntObjectOption& operator=(const IntObjectOption&) = delete;
111 };
112 
113 class LabelObjectOption : public ObjectOption
114 {
115 public:
116   LabelObjectOption(const std::string& text,
117                   unsigned int flags);
118 
119   virtual void save(Writer& write) const override;
120   virtual std::string to_string() const override;
121   virtual void add_to_menu(Menu& menu) const override;
122 
123 private:
124   LabelObjectOption(const LabelObjectOption&) = delete;
125   LabelObjectOption& operator=(const LabelObjectOption&) = delete;
126 };
127 
128 class RectfObjectOption : public ObjectOption
129 {
130 public:
131   RectfObjectOption(const std::string& text, Rectf* pointer, const std::string& key,
132                     unsigned int flags);
133 
134   virtual void save(Writer& write) const override;
135   virtual std::string to_string() const override;
136   virtual void add_to_menu(Menu& menu) const override;
137 
138 private:
139   Rectf* const m_pointer;
140   float m_width;
141   float m_height;
142 
143 private:
144   RectfObjectOption(const RectfObjectOption&) = delete;
145   RectfObjectOption& operator=(const RectfObjectOption&) = delete;
146 };
147 
148 class FloatObjectOption : public ObjectOption
149 {
150 public:
151   FloatObjectOption(const std::string& text, float* pointer, const std::string& key,
152                     boost::optional<float> default_value,
153                     unsigned int flags);
154 
155   virtual void save(Writer& write) const override;
156   virtual std::string to_string() const override;
157   virtual void add_to_menu(Menu& menu) const override;
158 
159 private:
160   float* const m_pointer;
161   const boost::optional<float> m_default_value;
162 
163 private:
164   FloatObjectOption(const FloatObjectOption&) = delete;
165   FloatObjectOption& operator=(const FloatObjectOption&) = delete;
166 };
167 
168 class StringObjectOption : public ObjectOption
169 {
170 public:
171   StringObjectOption(const std::string& text, std::string* pointer, const std::string& key,
172                      boost::optional<std::string> default_value,
173                      unsigned int flags);
174 
175   virtual void save(Writer& write) const override;
176   virtual std::string to_string() const override;
177   virtual void add_to_menu(Menu& menu) const override;
178 
179 private:
180   std::string* const m_pointer;
181   boost::optional<std::string> m_default_value;
182 
183 private:
184   StringObjectOption(const StringObjectOption&) = delete;
185   StringObjectOption& operator=(const StringObjectOption&) = delete;
186 };
187 
188 class StringSelectObjectOption : public ObjectOption
189 {
190 public:
191   StringSelectObjectOption(const std::string& text, int* pointer, const std::vector<std::string>& select,
192                            boost::optional<int> default_value,
193                            const std::string& key, unsigned int flags);
194 
195   virtual void save(Writer& write) const override;
196   virtual std::string to_string() const override;
197   virtual void add_to_menu(Menu& menu) const override;
198 
199 private:
200   int* const m_pointer;
201   const std::vector<std::string> m_select;
202   const boost::optional<int> m_default_value;
203 
204 private:
205   StringSelectObjectOption(const StringSelectObjectOption&) = delete;
206   StringSelectObjectOption& operator=(const StringSelectObjectOption&) = delete;
207 };
208 
209 class EnumObjectOption : public ObjectOption
210 {
211 public:
212   EnumObjectOption(const std::string& text, int* pointer,
213                    const std::vector<std::string>& labels,
214                    const std::vector<std::string>& symbols,
215                    boost::optional<int> default_value,
216                    const std::string& key, unsigned int flags);
217 
218   virtual void save(Writer& write) const override;
219   virtual std::string to_string() const override;
220   virtual void add_to_menu(Menu& menu) const override;
221 
222 private:
223   int* const m_pointer;
224   const std::vector<std::string> m_labels;
225   const std::vector<std::string> m_symbols;
226   const boost::optional<int> m_default_value;
227 
228 private:
229   EnumObjectOption(const EnumObjectOption&) = delete;
230   EnumObjectOption& operator=(const EnumObjectOption&) = delete;
231 };
232 
233 class ScriptObjectOption : public ObjectOption
234 {
235 public:
236   ScriptObjectOption(const std::string& text, std::string* pointer, const std::string& key,
237                      unsigned int flags);
238 
239   virtual void save(Writer& write) const override;
240   virtual std::string to_string() const override;
241   virtual void add_to_menu(Menu& menu) const override;
242 
243 private:
244   std::string* const m_pointer;
245 
246 private:
247   ScriptObjectOption(const ScriptObjectOption&) = delete;
248   ScriptObjectOption& operator=(const ScriptObjectOption&) = delete;
249 };
250 
251 class FileObjectOption : public ObjectOption
252 {
253 public:
254   FileObjectOption(const std::string& text, std::string* pointer,
255                    boost::optional<std::string> default_value,
256                    const std::string& key,
257                    std::vector<std::string> filter,
258                    const std::string& basedir,
259                    unsigned int flags);
260 
261   virtual void save(Writer& write) const override;
262   virtual std::string to_string() const override;
263   virtual void add_to_menu(Menu& menu) const override;
264 
265 private:
266   std::string* const m_pointer;
267   boost::optional<std::string> m_default_value;
268   const std::vector<std::string> m_filter;
269   std::string m_basedir;
270 
271 private:
272   FileObjectOption(const FileObjectOption&) = delete;
273   FileObjectOption& operator=(const FileObjectOption&) = delete;
274 };
275 
276 class ColorObjectOption : public ObjectOption
277 {
278 public:
279   ColorObjectOption(const std::string& text, Color* pointer, const std::string& key,
280                     boost::optional<Color> default_value, bool use_alpha,
281                     unsigned int flags);
282 
283   virtual void save(Writer& write) const override;
284   virtual std::string to_string() const override;
285   virtual void add_to_menu(Menu& menu) const override;
286 
287 private:
288   Color* const m_pointer;
289   const boost::optional<Color> m_default_value;
290   bool m_use_alpha;
291 
292 private:
293   ColorObjectOption(const ColorObjectOption&) = delete;
294   ColorObjectOption& operator=(const ColorObjectOption&) = delete;
295 };
296 
297 class BadGuySelectObjectOption : public ObjectOption
298 {
299 public:
300   BadGuySelectObjectOption(const std::string& text, std::vector<std::string>* pointer, const std::string& key,
301                            unsigned int flags);
302 
303   virtual void save(Writer& write) const override;
304   virtual std::string to_string() const override;
305   virtual void add_to_menu(Menu& menu) const override;
306 
307 private:
308   std::vector<std::string>* const m_pointer;
309 
310 private:
311   BadGuySelectObjectOption(const BadGuySelectObjectOption&) = delete;
312   BadGuySelectObjectOption& operator=(const BadGuySelectObjectOption&) = delete;
313 };
314 
315 class TilesObjectOption : public ObjectOption
316 {
317 public:
318   TilesObjectOption(const std::string& text, TileMap* tilemap, const std::string& key,
319                     unsigned int flags);
320 
321   virtual void save(Writer& write) const override;
322   virtual std::string to_string() const override;
323   virtual void add_to_menu(Menu& menu) const override;
324 
325 private:
326   TileMap* m_tilemap;
327 
328 private:
329   TilesObjectOption(const TilesObjectOption&) = delete;
330   TilesObjectOption& operator=(const TilesObjectOption&) = delete;
331 };
332 
333 class PathObjectOption : public ObjectOption
334 {
335 public:
336   PathObjectOption(const std::string& text, Path* path, const std::string& key,
337                     unsigned int flags);
338 
339   virtual void save(Writer& write) const override;
340   virtual std::string to_string() const override;
341   virtual void add_to_menu(Menu& menu) const override;
342 
343 private:
344   Path* m_path;
345 
346 private:
347   PathObjectOption(const PathObjectOption&) = delete;
348   PathObjectOption& operator=(const PathObjectOption&) = delete;
349 };
350 
351 class PathRefObjectOption : public ObjectOption
352 {
353 public:
354   PathRefObjectOption(const std::string& text, PathObject& target, const std::string& path_ref,
355                       const std::string& key, unsigned int flags);
356 
357   virtual void save(Writer& write) const override;
358   virtual std::string to_string() const override;
359   virtual void add_to_menu(Menu& menu) const override;
360 
361 private:
362   std::string m_path_ref;
363   PathObject& m_target;
364 
365 private:
366   PathRefObjectOption(const PathRefObjectOption&) = delete;
367   PathRefObjectOption& operator=(const PathRefObjectOption&) = delete;
368 };
369 
370 class SExpObjectOption : public ObjectOption
371 {
372 public:
373   SExpObjectOption(const std::string& text, const std::string& key, sexp::Value& value, unsigned int flags);
374 
375   virtual void save(Writer& write) const override;
376   virtual std::string to_string() const override;
377   virtual void add_to_menu(Menu& menu) const override;
378 
379 private:
380   sexp::Value m_sx;
381 
382 private:
383   SExpObjectOption(const SExpObjectOption&) = delete;
384   SExpObjectOption& operator=(const SExpObjectOption&) = delete;
385 };
386 
387 class RemoveObjectOption : public ObjectOption
388 {
389 public:
390   RemoveObjectOption();
391 
save(Writer & write) const392   virtual void save(Writer& write) const override {}
393   virtual std::string to_string() const override;
394   virtual void add_to_menu(Menu& menu) const override;
395 
396 private:
397   RemoveObjectOption(const RemoveObjectOption&) = delete;
398   RemoveObjectOption& operator=(const RemoveObjectOption&) = delete;
399 };
400 
401 class TestFromHereOption : public ObjectOption
402 {
403 public:
404   TestFromHereOption();
405 
save(Writer & write) const406   virtual void save(Writer& write) const override {}
407   virtual std::string to_string() const override;
408   virtual void add_to_menu(Menu& menu) const override;
409 
410 private:
411   TestFromHereOption(const TestFromHereOption&) = delete;
412   TestFromHereOption& operator=(const TestFromHereOption&) = delete;
413 };
414 
415 class ParticleEditorOption : public ObjectOption
416 {
417 public:
418   ParticleEditorOption();
419 
save(Writer & write) const420   virtual void save(Writer& write) const override {}
421   virtual std::string to_string() const override;
422   virtual void add_to_menu(Menu& menu) const override;
423 
424 private:
425   ParticleEditorOption(const ParticleEditorOption&) = delete;
426   ParticleEditorOption& operator=(const ParticleEditorOption&) = delete;
427 };
428 
429 class ButtonOption : public ObjectOption
430 {
431 public:
432   ButtonOption(const std::string& text, std::function<void()> callback);
433 
save(Writer & write) const434   virtual void save(Writer& write) const override {}
435   virtual std::string to_string() const override;
436   virtual void add_to_menu(Menu& menu) const override;
437 
438 private:
439   std::function<void()> m_callback;
440 
441 private:
442   ButtonOption(const ButtonOption&) = delete;
443   ButtonOption& operator=(const ButtonOption&) = delete;
444 };
445 
446 #endif
447 
448 /* EOF */
449