Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
RendererManager.cs
Go to the documentation of this file.
1 // Copyright (c) 2014 Silicon Studio Corp. (http://siliconstudio.co.jp)
2 // This file is distributed under GPL v3. See LICENSE.md for details.
3 using System;
4 using System.Collections.Generic;
5 
6 using System.Reflection;
7 
8 namespace SiliconStudio.Paradox.UI.Renderers
9 {
10  /// <summary>
11  /// The class in charge to manage the renderer of the different <see cref="UIElement"/>
12  /// </summary>
14  {
15  private readonly IElementRendererFactory defaultFactory;
16 
17  private readonly Dictionary<Type, IElementRendererFactory> typesToUserFactories = new Dictionary<Type, IElementRendererFactory>();
18 
19  /// <summary>
20  /// Create a new instance of <see cref="RendererManager"/> with provided DefaultFactory
21  /// </summary>
22  /// <param name="defaultFactory"></param>
24  {
25  this.defaultFactory = defaultFactory;
26  }
27 
29  {
30  var elementRenderer = element.ElementRenderer;
31  if (elementRenderer == null)
32  {
33  // try to get the renderer from the user registered class factory
34  var currentType = element.GetType();
35  while (elementRenderer == null && currentType != null)
36  {
37  if (typesToUserFactories.ContainsKey(currentType))
38  elementRenderer = typesToUserFactories[currentType].TryCreateRenderer(element);
39 
40  currentType = currentType.GetTypeInfo().BaseType;
41  }
42 
43  // try to get the renderer from the default renderer factory.
44  if (elementRenderer == null && defaultFactory != null)
45  elementRenderer = defaultFactory.TryCreateRenderer(element);
46 
47  if (elementRenderer == null)
48  throw new InvalidOperationException(string.Format("No renderer found for element {0}", element));
49 
50  // cache the renderer for future uses.
51  element.ElementRenderer = elementRenderer;
52  }
53 
54  return elementRenderer;
55  }
56 
57  public void RegisterRendererFactory(Type uiElementType, IElementRendererFactory factory)
58  {
59  if (uiElementType == null) throw new ArgumentNullException("uiElementType");
60  if (factory == null) throw new ArgumentNullException("factory");
61 
62  if(!typeof(UIElement).GetTypeInfo().IsAssignableFrom(uiElementType.GetTypeInfo()))
63  throw new InvalidOperationException(uiElementType + " is not a descendant of UIElement.");
64 
65  typesToUserFactories[uiElementType] = factory;
66  }
67 
68  public void RegisterRenderer(UIElement element, ElementRenderer renderer)
69  {
70  if (element == null) throw new ArgumentNullException("element");
71  if (renderer == null) throw new ArgumentNullException("renderer");
72 
73  element.ElementRenderer = renderer;
74  }
75  }
76 }
Provides a base class for all the User Interface elements in Paradox applications.
Definition: UIElement.cs:21
RendererManager(IElementRendererFactory defaultFactory)
Create a new instance of RendererManager with provided DefaultFactory
ElementRenderer GetRenderer(UIElement element)
Get the renderer of the corresponding UIElement.
Base class for UI element renderers
void RegisterRendererFactory(Type uiElementType, IElementRendererFactory factory)
Associate a renderer factory to an UI element type.
The interface for managing UI element renderers.
The class in charge to manage the renderer of the different UIElement
void RegisterRenderer(UIElement element, ElementRenderer renderer)
Associate a renderer to an UIElement.