30 #ifndef Pt_Forms_Style_h
31 #define Pt_Forms_Style_h
33 #include <Pt/Forms/Api.h>
34 #include <Pt/Forms/Alignment.h>
35 #include <Pt/Forms/Direction.h>
36 #include <Pt/Forms/Spacing.h>
37 #include <Pt/Forms/StyleOptions.h>
38 #include <Pt/Forms/PaintSurface.h>
39 #include <Pt/Gfx/Color.h>
40 #include <Pt/Gfx/Brush.h>
41 #include <Pt/Gfx/Pen.h>
42 #include <Pt/Gfx/Rect.h>
43 #include <Pt/Gfx/Font.h>
44 #include <Pt/Gfx/FontMetrics.h>
45 #include <Pt/Gfx/TextMetrics.h>
46 #include <Pt/TypeInfo.h>
47 #include <Pt/NonCopyable.h>
48 #include <Pt/SmartPtr.h>
72 FacetPtr(T* facet = 0)
79 FacetPtr(
const FacetPtr& ptr)
90 if( 0 == _facet->unref() )
95 FacetPtr& operator=(
const FacetPtr& ptr)
102 if( 0 == _facet->unref() )
113 void reset(T* facet = 0)
120 if( 0 == _facet->unref() )
129 T* operator->()
const
135 bool operator! ()
const
136 {
return _facet == 0; }
138 operator bool ()
const
139 {
return _facet != 0; }
159 explicit Facet(
const std::type_info& ti, std::size_t refs = 0)
167 const std::type_info& typeId()
const
197 const std::type_info* _typeId;
241 template <
typename FacetT>
244 Facet* facet = find(
typeid(FacetT) );
245 return static_cast<FacetT*
>(facet);
249 Facet* find(
const std::type_info& ti)
const;
252 typedef std::map<TypeInfo, Facet*> FacetMap;
254 std::size_t _generation;
269 template <
typename RendererT,
297 const OptionsT& localOptions);
306 const OptionsT& localOptions);
317 const OptionsT& localOptions);
336 FacetPtr<RendererT> _renderer;
338 std::size_t _boundStyleGeneration;
339 std::size_t _styleOptionsGeneration;
340 std::size_t _localOptionsGeneration;
344 template <
typename RendererT,
347 : _binding(SharedRenderer)
348 , _boundStyleGeneration( std::size_t(-1) )
349 , _styleOptionsGeneration( std::size_t(-1) )
350 , _localOptionsGeneration( std::size_t(-1) )
355 template <
typename RendererT,
359 return _renderer != 0;
363 template <
typename RendererT,
367 return _binding == CustomRenderer;
371 template <
typename RendererT,
376 const OptionsT& localOptions)
378 _styleOptionsGeneration = std::size_t(-1);
379 _localOptionsGeneration = std::size_t(-1);
381 if( localOptions.hasOverrides() )
383 RendererT* renderer = style.get<RendererT>();
385 renderer = renderer->create();
387 _renderer.reset(renderer);
388 _binding = CustomOverrides;
392 _renderer->prepare(options, localOptions);
393 _styleOptionsGeneration = options.
generation();
394 _localOptionsGeneration = localOptions.generation();
399 _renderer.reset( style.get<RendererT>() );
400 _binding = SharedRenderer;
405 return _renderer.get();
409 template <
typename RendererT,
414 const OptionsT& localOptions)
416 _renderer.reset(&renderer);
418 _binding = CustomRenderer;
419 _boundStyleGeneration = std::size_t(-1);
420 _styleOptionsGeneration = std::size_t(-1);
421 _localOptionsGeneration = std::size_t(-1);
423 _renderer->prepare(options, localOptions);
425 _styleOptionsGeneration = options.
generation();
426 _localOptionsGeneration = localOptions.generation();
428 return _renderer.get();
432 template <
typename RendererT,
437 const OptionsT& localOptions)
439 if( ! _renderer || _binding != CustomRenderer )
440 return bind(style, options, localOptions);
442 bool needsPrepare = _styleOptionsGeneration != options.
generation() ||
443 _localOptionsGeneration != localOptions.generation();
446 _renderer->prepare(options, localOptions);
448 _styleOptionsGeneration = options.
generation();
449 _localOptionsGeneration = localOptions.generation();
451 return _renderer.get();
455 template <
typename RendererT,
459 return _renderer.get();
463 template <
typename RendererT,
467 return _renderer.get();