00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #if !defined(_XRB_WIDGETSKINHANDLER_HPP_)
00012 #define _XRB_WIDGETSKINHANDLER_HPP_
00013
00014 #include "xrb.hpp"
00015
00016 #include <vector>
00017
00018 #include "xrb_widgetskin.hpp"
00019
00020 namespace Xrb
00021 {
00022
00023 class Widget;
00024
00033 class WidgetSkinHandler
00034 {
00035 public:
00036
00042 WidgetSkinHandler ();
00046 virtual ~WidgetSkinHandler ();
00047
00048
00049
00050
00051
00054 inline WidgetSkin const *GetWidgetSkin () const
00055 {
00056 return m_widget_skin;
00057 }
00061 inline WidgetBackground const *WidgetSkinWidgetBackground (
00062 WidgetSkin::WidgetBackgroundType const widget_background_type) const
00063 {
00064 return m_widget_skin->GetWidgetBackground(widget_background_type);
00065 }
00069 inline Resource<Font> const &WidgetSkinFont (
00070 WidgetSkin::FontType const font_type) const
00071 {
00072 return m_widget_skin->GetFont(font_type);
00073 }
00077 inline Resource<GLTexture> const &WidgetSkinTexture (
00078 WidgetSkin::TextureType const texture_type) const
00079 {
00080 return m_widget_skin->GetTexture(texture_type);
00081 }
00085 inline ScreenCoordVector2 const &WidgetSkinMargins (
00086 WidgetSkin::MarginsType const margins_type) const
00087 {
00088 return m_widget_skin->Margins(margins_type);
00089 }
00090
00091
00092
00093
00094
00097 void SetWidgetSkinWidgetBackground (
00098 WidgetSkin::WidgetBackgroundType widget_background_type,
00099 WidgetBackground const *widget_background);
00102 void SetWidgetSkinFont (
00103 WidgetSkin::FontType font_type,
00104 Resource<Font> const &font);
00107 void SetWidgetSkinFontFacePath (
00108 WidgetSkin::FontType font_type,
00109 std::string const &font_face_path);
00112 void SetWidgetSkinFontHeightRatio (
00113 WidgetSkin::FontType font_type,
00114 Float font_height_ratio);
00117 void SetWidgetSkinFontHeight (
00118 WidgetSkin::FontType font_type,
00119 ScreenCoord font_height);
00122 void SetWidgetSkinTexture (
00123 WidgetSkin::TextureType texture_type,
00124 Resource<GLTexture> const &texture);
00127 void SetWidgetSkinTexturePath (
00128 WidgetSkin::TextureType texture_type,
00129 std::string const &texture_path);
00132 void SetWidgetSkinMarginRatios (
00133 WidgetSkin::MarginsType margin_type,
00134 FloatVector2 const &margin_ratios);
00137 void SetWidgetSkinMargins (
00138 WidgetSkin::MarginsType margin_type,
00139 ScreenCoordVector2 const &margins);
00140
00141 protected:
00142
00143
00144
00145
00146
00151 virtual Uint32 WidgetSkinHandlerChildCount () const = 0;
00156 virtual WidgetSkinHandler *WidgetSkinHandlerChild (Uint32 index) = 0;
00160 virtual WidgetSkinHandler *WidgetSkinHandlerParent () = 0;
00161
00162
00163
00164
00165
00171 virtual void HandleChangedWidgetSkinWidgetBackground (
00172 WidgetSkin::WidgetBackgroundType widget_background_type) { }
00178 virtual void HandleChangedWidgetSkinFont (
00179 WidgetSkin::FontType font_type) { }
00185 virtual void HandleChangedWidgetSkinTexture (
00186 WidgetSkin::TextureType texture_type) { }
00192 virtual void HandleChangedWidgetSkinMargins (
00193 WidgetSkin::MarginsType margins_type) { }
00194
00198 WidgetSkin *m_widget_skin;
00199
00204 bool m_delete_widget_skin;
00205
00206 private:
00207
00208
00209
00210
00211
00212
00213 template <typename PropertyType, typename DataType>
00214 void SetProperty (
00215 PropertyType const property,
00216 DataType const data,
00217 void (WidgetSkin::*SetWidgetSkinProperty)(PropertyType, DataType),
00218 void (WidgetSkinHandler::*PropagateChangedPropertyFunction)(PropertyType))
00219 {
00220
00221
00222 if (WidgetSkinHandlerParent() != NULL)
00223 {
00224 WidgetSkinHandlerParent()->SetProperty<PropertyType, DataType>(
00225 property,
00226 data,
00227 SetWidgetSkinProperty,
00228 PropagateChangedPropertyFunction);
00229 }
00230 else
00231 {
00232 ASSERT1(m_widget_skin != NULL);
00233
00234 (m_widget_skin->*SetWidgetSkinProperty)(property, data);
00235
00236 (this->*PropagateChangedPropertyFunction)(property);
00237 }
00238 }
00239
00240
00241
00242
00243
00244 template <typename PropertyType>
00245 void PropagateChangedProperty (
00246 PropertyType const property,
00247 void (WidgetSkinHandler::*HandleChangedProperty)(PropertyType))
00248 {
00249
00250 (this->*HandleChangedProperty)(property);
00251
00252 for (Uint32 i = 0; i < WidgetSkinHandlerChildCount(); ++i)
00253 {
00254 WidgetSkinHandler *child = WidgetSkinHandlerChild(i);
00255 ASSERT1(child != NULL);
00256 child->PropagateChangedProperty<PropertyType>(
00257 property,
00258 HandleChangedProperty);
00259 }
00260 }
00261
00262 void PropagateChangedWidgetBackground (
00263 WidgetSkin::WidgetBackgroundType widget_background_type);
00264 void PropagateChangedFont (
00265 WidgetSkin::FontType font_type);
00266 void PropagateChangedTexture (
00267 WidgetSkin::TextureType texture_type);
00268 void PropagateChangedMargins (
00269 WidgetSkin::MarginsType margins_type);
00270 };
00271
00272 }
00273
00274 #endif // !defined(_XRB_WIDGETSKINHANDLER_HPP_)
00275