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