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