Crazy Eddie's GUI System  0.8.4
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends Pages
PropertyHelper.h
1 /***********************************************************************
2  created: 21/11/2010
3  author: Martin Preisler (reworked from code by Paul D Turner)
4 
5  purpose: Interface to the PropertyHelper class
6 *************************************************************************/
7 /***************************************************************************
8  * Copyright (C) 2004 - 2006 Paul D Turner & The CEGUI Development Team
9  *
10  * Permission is hereby granted, free of charge, to any person obtaining
11  * a copy of this software and associated documentation files (the
12  * "Software"), to deal in the Software without restriction, including
13  * without limitation the rights to use, copy, modify, merge, publish,
14  * distribute, sublicense, and/or sell copies of the Software, and to
15  * permit persons to whom the Software is furnished to do so, subject to
16  * the following conditions:
17  *
18  * The above copyright notice and this permission notice shall be
19  * included in all copies or substantial portions of the Software.
20  *
21  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
24  * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
25  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
26  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
27  * OTHER DEALINGS IN THE SOFTWARE.
28  ***************************************************************************/
29 #ifndef _CEGUIPropertyHelper_h_
30 #define _CEGUIPropertyHelper_h_
31 
32 #include "CEGUI/String.h"
33 #include "CEGUI/Size.h"
34 #include "CEGUI/Vector.h"
35 #include "CEGUI/Quaternion.h"
36 #include "CEGUI/Colour.h"
37 #include "CEGUI/ColourRect.h"
38 #include "CEGUI/UDim.h"
39 #include "CEGUI/Rect.h"
40 
41 
42 #include <cstdio>
43 
44 #include <sstream>
45 
46 #if defined(_MSC_VER)
47 # pragma warning(push)
48 # pragma warning(disable : 4996)
49 #endif
50 
51 #ifdef _MSC_VER
52 #define snprintf _snprintf
53 #endif
54 
55 
56 namespace CEGUI
57 {
58 
69 template<typename T>
70 class PropertyHelper;
71 
72 // this redirects PropertyHelper<const T> to PropertyHelper<T>
73 template<typename T>
74 class PropertyHelper<const T>
75 {
76 public:
77  typedef typename PropertyHelper<T>::return_type return_type;
78  typedef typename PropertyHelper<T>::safe_method_return_type safe_method_return_type;
79  typedef typename PropertyHelper<T>::pass_type pass_type;
80  typedef typename PropertyHelper<T>::string_return_type string_return_type;
81 
82  static inline const String& getDataTypeName()
83  {
85  }
86 
87  static inline return_type fromString(const String& str)
88  {
90  }
91 
92  static inline String toString(pass_type val)
93  {
94  return PropertyHelper<T>::toString(val);
95  }
96 };
97 
98 // this redirects PropertyHelper<const T&> to PropertyHelper<T>
99 template<typename T>
100 class PropertyHelper<const T&>
101 {
102 public:
103  typedef typename PropertyHelper<T>::return_type return_type;
104  typedef typename PropertyHelper<T>::safe_method_return_type safe_method_return_type;
105  typedef typename PropertyHelper<T>::pass_type pass_type;
106  typedef typename PropertyHelper<T>::string_return_type string_return_type;
107 
108  static inline const String& getDataTypeName()
109  {
111  }
112 
113  static inline return_type fromString(const String& str)
114  {
115  return PropertyHelper<T>::fromString(str);
116  }
117 
118  static inline String toString(pass_type val)
119  {
120  return PropertyHelper<T>::toString(val);
121  }
122 };
123 
124 // this redirects PropertyHelper<const T*> to PropertyHelper<T*>
125 template<typename T>
126 class PropertyHelper<const T*>
127 {
128 public:
129  typedef typename PropertyHelper<T*>::return_type return_type;
130  typedef typename PropertyHelper<T*>::safe_method_return_type safe_method_return_type;
131  typedef typename PropertyHelper<T*>::pass_type pass_type;
132  typedef typename PropertyHelper<T*>::string_return_type string_return_type;
133 
134  static inline const String& getDataTypeName()
135  {
137  }
138 
139  static inline return_type fromString(const String& str)
140  {
141  return PropertyHelper<T*>::fromString(str);
142  }
143 
144  static inline String toString(pass_type val)
145  {
146  return PropertyHelper<T*>::toString(val);
147  }
148 };
149 
150 template<>
152 {
153 public:
154  typedef const String& return_type;
156  typedef const String& pass_type;
157  typedef const String& string_return_type;
158 
159  static const String& getDataTypeName()
160  {
161  static String type("String");
162 
163  return type;
164  }
165 
166  static inline return_type fromString(const String& str)
167  {
168  return str;
169  }
170 
171  static inline string_return_type toString(pass_type val)
172  {
173  return val;
174  }
175 };
176 
177 template<>
178 class PropertyHelper<float>
179 {
180 public:
181  typedef float return_type;
182  typedef return_type safe_method_return_type;
183  typedef const float pass_type;
184  typedef String string_return_type;
185 
186  static const String& getDataTypeName()
187  {
188  static String type("float");
189 
190  return type;
191  }
192 
193  static inline return_type fromString(const String& str)
194  {
195  float val = 0;
196  sscanf(str.c_str(), " %g", &val);
197 
198  return val;
199  }
200 
201  static inline string_return_type toString(pass_type val)
202  {
203  char buff[64];
204  snprintf(buff, sizeof(buff), "%g", val);
205 
206  return String(buff);
207  }
208 };
209 template<>
210 class PropertyHelper<double>
211 {
212 public:
213  typedef double return_type;
214  typedef return_type safe_method_return_type;
215  typedef const double pass_type;
216  typedef String string_return_type;
217 
218  static const String& getDataTypeName()
219  {
220  static String type("double");
221 
222  return type;
223  }
224 
225  static inline return_type fromString(const String& str)
226  {
227  double val = 0;
228  sscanf(str.c_str(), " %lg", &val);
229 
230  return val;
231  }
232 
233  static inline string_return_type toString(pass_type val)
234  {
235  char buff[64];
236  snprintf(buff, sizeof(buff), "%g", val);
237 
238  return String(buff);
239  }
240 };
241 
242 template<>
243 class PropertyHelper<int>
244 {
245 public:
246  typedef int return_type;
247  typedef return_type safe_method_return_type;
248  typedef const int pass_type;
249  typedef String string_return_type;
250 
251  static const String& getDataTypeName()
252  {
253  static String type("int");
254 
255  return type;
256  }
257 
258  static inline return_type fromString(const String& str)
259  {
260  int val = 0;
261  sscanf(str.c_str(), " %d", &val);
262 
263  return val;
264  }
265 
266  static inline string_return_type toString(pass_type val)
267  {
268  char buff[64];
269  snprintf(buff, sizeof(buff), "%d", val);
270 
271  return String(buff);
272  }
273 };
274 
275 template<>
276 class PropertyHelper<uint>
277 {
278 public:
279  typedef uint return_type;
280  typedef return_type safe_method_return_type;
281  typedef const uint pass_type;
282  typedef String string_return_type;
283 
284  static const String& getDataTypeName()
285  {
286  static String type("uint");
287 
288  return type;
289  }
290 
291  static return_type fromString(const String& str)
292  {
293  uint val = 0;
294  sscanf(str.c_str(), " %u", &val);
295 
296  return val;
297  }
298 
299  static string_return_type toString(pass_type val)
300  {
301  char buff[64];
302  snprintf(buff, sizeof(buff), "%u", val);
303 
304  return String(buff);
305  }
306 };
307 
308 template<>
309 class PropertyHelper<uint64>
310 {
311 public:
312  typedef uint64 return_type;
313  typedef return_type safe_method_return_type;
314  typedef const uint64 pass_type;
315  typedef String string_return_type;
316 
317  static const String& getDataTypeName()
318  {
319  static String type("uint64");
320 
321  return type;
322  }
323 
324  static return_type fromString(const String& str)
325  {
326  uint64 val = 0;
327  sscanf(str.c_str(), " %llu", &val);
328 
329  return val;
330  }
331 
332  static string_return_type toString(pass_type val)
333  {
334  char buff[64];
335  snprintf(buff, sizeof(buff), "%llu", val);
336 
337  return String(buff);
338  }
339 };
340 
341 #if CEGUI_STRING_CLASS != CEGUI_STRING_CLASS_UNICODE
342 
343 template<>
344 class PropertyHelper<String::value_type>
345 {
346 public:
347  typedef String::value_type return_type;
348  typedef return_type safe_method_return_type;
349  typedef const String::value_type pass_type;
350  typedef String string_return_type;
351 
352  static const String& getDataTypeName()
353  {
354  static String type("char");
355 
356  return type;
357  }
358 
359  static return_type fromString(const String& str)
360  {
361  return str[0];
362  }
363 
364  static string_return_type toString(pass_type val)
365  {
366  return String("") + val;
367  }
368 };
369 
370 #endif
371 
372 template<>
373 class PropertyHelper<unsigned long>
374 {
375 public:
376  typedef unsigned long return_type;
377  typedef return_type safe_method_return_type;
378  typedef const unsigned long pass_type;
379  typedef String string_return_type;
380 
381  static const String& getDataTypeName()
382  {
383  static String type("unsigned long");
384 
385  return type;
386  }
387 
388  static return_type fromString(const String& str)
389  {
390  unsigned long val = 0;
391  sscanf(str.c_str(), " %lu", &val);
392 
393  return val;
394  }
395 
396  static string_return_type toString(pass_type val)
397  {
398  char buff[64];
399  snprintf(buff, sizeof(buff), "%lu", val);
400 
401  return String(buff);
402  }
403 };
404 
405 template<>
406 class CEGUIEXPORT PropertyHelper<bool>
407 {
408 public:
409  typedef bool return_type;
410  typedef return_type safe_method_return_type;
411  typedef const bool pass_type;
412  typedef const String& string_return_type;
413 
414  static const String& getDataTypeName()
415  {
416  static String type("bool");
417 
418  return type;
419  }
420 
421  static return_type fromString(const String& str)
422  {
423  return (str == True || str == "True");
424  }
425 
426  static string_return_type toString(pass_type val)
427  {
428  return val ? True : False;
429  }
430 
432  static const CEGUI::String True;
433  static const CEGUI::String False;
434 };
435 
436 
437 
438 template<>
439 class CEGUIEXPORT PropertyHelper<AspectMode>
440 {
441 public:
442  typedef AspectMode return_type;
444  typedef AspectMode pass_type;
445  typedef String string_return_type;
446 
447  static const String& getDataTypeName()
448  {
449  static String type("AspectMode");
450 
451  return type;
452  }
453 
454  static return_type fromString(const String& str)
455  {
456  if (str == Shrink)
457  {
458  return AM_SHRINK;
459  }
460  else if (str == Expand)
461  {
462  return AM_EXPAND;
463  }
464  else
465  {
466  return AM_IGNORE;
467  }
468  }
469 
470  static string_return_type toString(pass_type val)
471  {
472  if (val == AM_IGNORE)
473  {
474  return Ignore;
475  }
476  else if (val == AM_SHRINK)
477  {
478  return Shrink;
479  }
480  else if (val == AM_EXPAND)
481  {
482  return Expand;
483  }
484  else
485  {
486  assert(false && "Invalid aspect mode");
487  return Ignore;
488  }
489  }
490 
492  static const CEGUI::String Shrink;
493  static const CEGUI::String Expand;
494  static const CEGUI::String Ignore;
495 };
496 
497 template<>
499 {
500 public:
501  typedef Sizef return_type;
503  typedef const Sizef& pass_type;
504  typedef String string_return_type;
505 
506  static const String& getDataTypeName()
507  {
508  static String type("Sizef");
509 
510  return type;
511  }
512 
513  static return_type fromString(const String& str)
514  {
515  Sizef val(0, 0);
516  sscanf(str.c_str(), " w:%g h:%g", &val.d_width, &val.d_height);
517 
518  return val;
519  }
520 
521  static string_return_type toString(pass_type val)
522  {
523  char buff[128];
524  snprintf(buff, sizeof(buff), "w:%g h:%g", val.d_width, val.d_height);
525 
526  return String(buff);
527  }
528 };
529 
530 template<>
532 {
533 public:
534  typedef Vector2f return_type;
536  typedef const Vector2f& pass_type;
537  typedef String string_return_type;
538 
539  static const String& getDataTypeName()
540  {
541  static String type("Vector2f");
542 
543  return type;
544  }
545 
546  static return_type fromString(const String& str)
547  {
548  Vector2f val(0, 0) ;
549  sscanf(str.c_str(), " x:%g y:%g", &val.d_x, &val.d_y);
550 
551  return val;
552  }
553 
554  static string_return_type toString(pass_type val)
555  {
556  char buff[128];
557  snprintf(buff, sizeof(buff), "x:%g y:%g", val.d_x, val.d_y);
558 
559  return String(buff);
560  }
561 };
562 
563 template<>
565 {
566 public:
567  typedef Vector3f return_type;
569  typedef const Vector3f& pass_type;
570  typedef String string_return_type;
571 
572  static const String& getDataTypeName()
573  {
574  static String type("Vector3f");
575 
576  return type;
577  }
578 
579  static return_type fromString(const String& str)
580  {
581  Vector3f val(0, 0, 0);
582  sscanf(str.c_str(), " x:%g y:%g z:%g", &val.d_x, &val.d_y, &val.d_z);
583 
584  return val;
585  }
586 
587  static string_return_type toString(pass_type val)
588  {
589  char buff[128];
590  snprintf(buff, sizeof(buff), "x:%g y:%g z:%g", val.d_x, val.d_y, val.d_z);
591 
592  return String(buff);
593  }
594 };
595 
596 template<>
598 {
599 public:
600  typedef Quaternion return_type;
602  typedef const Quaternion& pass_type;
603  typedef String string_return_type;
604 
605  static const String& getDataTypeName()
606  {
607  static String type("Quaternion");
608 
609  return type;
610  }
611 
612  static return_type fromString(const String& str)
613  {
614  if (strchr(str.c_str(), 'w') || strchr(str.c_str(), 'W'))
615  {
616  Quaternion val(1, 0, 0, 0);
617  sscanf(str.c_str(), " w:%g x:%g y:%g z:%g", &val.d_w, &val.d_x, &val.d_y, &val.d_z);
618 
619  return val;
620  }
621  else
622  {
623  float x, y, z;
624  sscanf(str.c_str(), " x:%g y:%g z:%g", &x, &y, &z);
625  return Quaternion::eulerAnglesDegrees(x, y, z);
626  }
627  }
628 
629  static string_return_type toString(pass_type val)
630  {
631  char buff[128];
632  snprintf(buff, sizeof(buff), "w:%g x:%g y:%g z:%g", val.d_w, val.d_x, val.d_y, val.d_z);
633 
634  return String(buff);
635  }
636 };
637 
638 template<>
640 {
641 public:
642  typedef Rectf return_type;
644  typedef const Rectf& pass_type;
645  typedef String string_return_type;
646 
647  static const String& getDataTypeName()
648  {
649  static String type("Rectf");
650 
651  return type;
652  }
653 
654  static return_type fromString(const String& str)
655  {
656  Rectf val(0, 0, 0, 0);
657  sscanf(str.c_str(), " l:%g t:%g r:%g b:%g", &val.d_min.d_x, &val.d_min.d_y, &val.d_max.d_x, &val.d_max.d_y);
658 
659  return val;
660  }
661 
662  static string_return_type toString(pass_type val)
663  {
664  char buff[256];
665  snprintf(buff, sizeof(buff), "l:%g t:%g r:%g b:%g",
666  val.d_min.d_x, val.d_min.d_y, val.d_max.d_x, val.d_max.d_y);
667 
668  return String(buff);
669  }
670 };
671 
672 template<>
673 class CEGUIEXPORT PropertyHelper<Image*>
674 {
675 public:
676  typedef const Image* return_type;
677  typedef return_type safe_method_return_type;
678  typedef const Image* const pass_type;
679  typedef String string_return_type;
680 
681  static const String& getDataTypeName()
682  {
683  static String type("Image");
684 
685  return type;
686  }
687 
688  static return_type fromString(const String& str);
689 
690  static string_return_type toString(pass_type val);
691 };
692 
693 template<>
695 {
696 public:
697  typedef Colour return_type;
699  typedef const Colour& pass_type;
700  typedef String string_return_type;
701 
702  static const String& getDataTypeName()
703  {
704  static String type("Colour");
705 
706  return type;
707  }
708 
709  static return_type fromString(const String& str)
710  {
711  argb_t val = 0xFF000000;
712  sscanf(str.c_str(), " %8X", &val);
713 
714  return Colour(val);
715  }
716 
717  static string_return_type toString(pass_type val)
718  {
719  char buff[16];
720  sprintf(buff, "%.8X", val.getARGB());
721 
722  return String(buff);
723  }
724 };
725 
726 template<>
728 {
729 public:
730  typedef ColourRect return_type;
732  typedef const ColourRect& pass_type;
733  typedef String string_return_type;
734 
735  static const String& getDataTypeName()
736  {
737  static String type("ColourRect");
738 
739  return type;
740  }
741 
742  static return_type fromString(const String& str)
743  {
744  if (str.length() == 8)
745  {
746  argb_t all = 0xFF000000;
747  sscanf(str.c_str(), "%8X", &all);
748  return ColourRect(all);
749  }
750 
751  argb_t topLeft = 0xFF000000, topRight = 0xFF000000, bottomLeft = 0xFF000000, bottomRight = 0xFF000000;
752  sscanf(str.c_str(), "tl:%8X tr:%8X bl:%8X br:%8X", &topLeft, &topRight, &bottomLeft, &bottomRight);
753 
754  return ColourRect(topLeft, topRight, bottomLeft, bottomRight);
755  }
756 
757  static string_return_type toString(pass_type val)
758  {
759  char buff[64];
760  sprintf(buff, "tl:%.8X tr:%.8X bl:%.8X br:%.8X", val.d_top_left.getARGB(), val.d_top_right.getARGB(), val.d_bottom_left.getARGB(), val.d_bottom_right.getARGB());
761 
762  return String(buff);
763  }
764 };
765 
766 template<>
768 {
769 public:
770  typedef UDim return_type;
772  typedef const UDim& pass_type;
773  typedef String string_return_type;
774 
775  static const String& getDataTypeName()
776  {
777  static String type("UDim");
778 
779  return type;
780  }
781 
782  static return_type fromString(const String& str)
783  {
784  UDim ud;
785  sscanf(str.c_str(), " { %g , %g }", &ud.d_scale, &ud.d_offset);
786 
787  return ud;
788  }
789 
790  static string_return_type toString(pass_type val)
791  {
792  char buff[128];
793  snprintf(buff, sizeof(buff), "{%g,%g}", val.d_scale, val.d_offset);
794 
795  return String(buff);
796  }
797 };
798 
799 template<>
801 {
802 public:
803  typedef UVector2 return_type;
805  typedef const UVector2& pass_type;
806  typedef String string_return_type;
807 
808  static const String& getDataTypeName()
809  {
810  static String type("UVector2");
811 
812  return type;
813  }
814 
815  static return_type fromString(const String& str)
816  {
817  UVector2 uv;
818  sscanf(str.c_str(), " { { %g , %g } , { %g , %g } }",
819  &uv.d_x.d_scale, &uv.d_x.d_offset,
820  &uv.d_y.d_scale, &uv.d_y.d_offset);
821 
822  return uv;
823  }
824 
825  static string_return_type toString(pass_type val)
826  {
827  char buff[256];
828  snprintf(buff, sizeof(buff), "{{%g,%g},{%g,%g}}",
829  val.d_x.d_scale, val.d_x.d_offset, val.d_y.d_scale, val.d_y.d_offset);
830 
831  return String(buff);
832  }
833 };
834 
835 template<>
837 {
838 public:
839  typedef USize return_type;
841  typedef const USize& pass_type;
842  typedef String string_return_type;
843 
844  static const String& getDataTypeName()
845  {
846  static String type("USize");
847 
848  return type;
849  }
850 
851  static return_type fromString(const String& str)
852  {
853  USize uv;
854  sscanf(str.c_str(), " { { %g , %g } , { %g , %g } }",
855  &uv.d_width.d_scale, &uv.d_width.d_offset,
856  &uv.d_height.d_scale, &uv.d_height.d_offset);
857 
858  return uv;
859  }
860 
861  static string_return_type toString(pass_type val)
862  {
863  char buff[256];
864  snprintf(buff, sizeof(buff), "{{%g,%g},{%g,%g}}",
865  val.d_width.d_scale, val.d_width.d_offset, val.d_height.d_scale, val.d_height.d_offset);
866 
867  return String(buff);
868  }
869 };
870 
871 template<>
873 {
874 public:
875  typedef URect return_type;
877  typedef const URect& pass_type;
878  typedef String string_return_type;
879 
880  static const String& getDataTypeName()
881  {
882  static String type("URect");
883 
884  return type;
885  }
886 
887  static return_type fromString(const String& str)
888  {
889  URect ur;
890  sscanf(
891  str.c_str(),
892  " { { %g , %g } , { %g , %g } , { %g , %g } , { %g , %g } }",
893  &ur.d_min.d_x.d_scale, &ur.d_min.d_x.d_offset,
894  &ur.d_min.d_y.d_scale, &ur.d_min.d_y.d_offset,
895  &ur.d_max.d_x.d_scale, &ur.d_max.d_x.d_offset,
896  &ur.d_max.d_y.d_scale, &ur.d_max.d_y.d_offset
897  );
898 
899  return ur;
900  }
901 
902  static string_return_type toString(pass_type val)
903  {
904  char buff[512];
905  snprintf(buff, sizeof(buff), "{{%g,%g},{%g,%g},{%g,%g},{%g,%g}}",
906  val.d_min.d_x.d_scale, val.d_min.d_x.d_offset,
907  val.d_min.d_y.d_scale, val.d_min.d_y.d_offset,
908  val.d_max.d_x.d_scale, val.d_max.d_x.d_offset,
909  val.d_max.d_y.d_scale, val.d_max.d_y.d_offset);
910 
911  return String(buff);
912  }
913 };
914 
915 template<>
917 {
918 public:
919  typedef UBox return_type;
921  typedef const UBox& pass_type;
922  typedef String string_return_type;
923 
924  static const String& getDataTypeName()
925  {
926  static String type("UBox");
927 
928  return type;
929  }
930 
931  static return_type fromString(const String& str)
932  {
933  UBox ret;
934  sscanf(
935  str.c_str(),
936  " { top: { %g , %g } , left: { %g , %g } , bottom: { %g , %g } , right: { %g , %g } }",
937  &ret.d_top.d_scale, &ret.d_top.d_offset,
938  &ret.d_left.d_scale, &ret.d_left.d_offset,
939  &ret.d_bottom.d_scale, &ret.d_bottom.d_offset,
940  &ret.d_right.d_scale, &ret.d_right.d_offset
941  );
942 
943  return ret;
944  }
945 
946  static string_return_type toString(pass_type val)
947  {
948  char buff[512];
949  snprintf(buff, sizeof(buff), "{top:{%g,%g},left:{%g,%g},bottom:{%g,%g},right:{%g,%g}}",
950  val.d_top.d_scale, val.d_top.d_offset,
951  val.d_left.d_scale, val.d_left.d_offset,
952  val.d_bottom.d_scale, val.d_bottom.d_offset,
953  val.d_right.d_scale, val.d_right.d_offset);
954 
955  return String(buff);
956  }
957 };
958 
959 
960 template<>
961 class CEGUIEXPORT PropertyHelper<Font*>
962 {
963 public:
964  typedef const Font* return_type;
965  typedef return_type safe_method_return_type;
966  typedef const Font* const pass_type;
967  typedef String string_return_type;
968 
969  static const String& getDataTypeName()
970  {
971  static String type("Font");
972 
973  return type;
974  }
975 
976  static return_type fromString(const String& str);
977  static string_return_type toString(pass_type val);
978 };
979 
980 }
981 
982 #if defined(_MSC_VER)
983 # pragma warning(pop)
984 #endif
985 
986 #endif