{{tag>dragonscript behavior}}
[[:start|Start Page]] >> [[main|DragonScript Scripting Language]] >> [[abstractions#behavior_elementsquick_and_easy_development|Behavior Elements: Quick and Easy Development]] >> **ECBehaviorRenderablePanel**
* [[behaviors_use_cases|Behaviors Explained: By Use-Case]]
* [[behaviors_a_to_z|Behaviors Explained: From A to Z]]
====== ECBehaviorRenderablePanel ======
Behavior element behavior adding a renderable Panel widget.
This behavior is useful for models with a complex dynamic texture where the content of the texture is provided by a #@LinkApiDocDEDS2_HTML~classDragengine_1_1Gui_1_1Panel.html,Panel~@# widget. Multiple other behaviors can add their content #@LinkApiDocDEDS2_HTML~classDragengine_1_1Gui_1_1Widget.html,Widget~@# to the #@LinkApiDocDEDS2_HTML~classDragengine_1_1Gui_1_1Panel.html,Panel~@# separating logic for reuse. Using **ECBehaviorRenderablePanel** instead of [[behavior_renderablecanvas|ECBehaviorRenderableCanvas]] allows to use the full power of the GUI ToolKit including using [[dragengine:modules:dragonscript:guitheme|Gui Themes]] to create complex content easily.
The default layout for the #@LinkApiDocDEDS2_HTML~classDragengine_1_1Gui_1_1Panel.html,Panel~@# is #@LinkApiDocDEDS2_HTML~classDragengine_1_1Gui_1_1Layouts_1_1StackLayout.html,StackLayout~@#]. The default gui theme is //"/shareddata/guithemes/modern/modern.guitheme.xml"//. The default #@LinkApiDocDEDS2_HTML~classDragengine_1_1Gui_1_1Panel.html,Panel~@# designer selector is //"RenderablePanel"//.
To use this behavior add an [[behavior_dynamicskin|ECBehaviorDynamicSkin]] to the element class before adding this behavior. Create **ECBehaviorRenderablePanel** behavior and set the dynamic skin and designer selector and #@LinkApiDocDEDS2_HTML~classDragengine_1_1Gui_1_1GuiTheme.html,GuiTheme~@# for the #@LinkApiDocDEDS2_HTML~classDragengine_1_1Gui_1_1Panel.html,Panel~@#. Now you can add other behaviors targeting the ECBehaviorRenderablePanel to add #@LinkApiDocDEDS2_HTML~classDragengine_1_1Gui_1_1Widget.html,Widget~@# resources to.
The #@LinkApiDocDEDS2_HTML~classDragengine_1_1Gui_1_1Panel.html,Panel~@# is created with a default size of 512x512 . You can change the size using the element property to fit the texture requirements.
====== Instance Counts ======
Multiple instances of **ECBehaviorRenderablePanel** can be added to affect individual dynamic skin textures. The example below uses one component with one dynamic skin to two individual renderables named //"content1"// and //"content2"// each allowing to be individiaully filled with content by different behaviors.
class MyElement extends BehaviorElementClass
public func new()
ECBehaviorComponent.new(this)
ECBehaviorDynamicSkin.new(this)
ECBehaviorCanvas.new(this)
ECBehaviorCanvas.new(this, "canvas2")
var ECBehaviorRenderablePanel behavior = ECBehaviorRenderablePanel.new(this)
behavior.getRenderable().setValue("content1")
behavior.getGuiTheme().setPath("/content/renderable.guitheme.xml")
behavior.getDesignerSelector().setValue("Panel.MyElement")
behavior = ECBehaviorRenderablePanel.new(this, "renderablePanel2")
behavior.setBackgroundColor(Color.blue)
behavior.getRenderable().setValue("intensity2")
behavior.getGuiTheme().setPath("/content/renderable.guitheme.xml")
behavior.getDesignerSelector().setValue("Panel.MyElement")
end
end
====== Element Class Properties ======
Element class properties have the prefix **renderablePanel.** or **renderablePanel(id).** if id is not empty.
===== renderable =====
Name of the [[gamedev:renderables|renderable]] in the component skin to modify.
* Full name: "renderablePanel.renderable" or "renderablePanel(id).renderable"
* Type: string
* Default Value: "" (empty string)
* Example (*.deeclass): monitor content
===== size =====
Size of panel in pixels.
* Full name: "renderablePanel.size" or "renderablePanel(id).size"
* Type: #@LinkApiDocDEDS2_HTML~classDragengine_1_1Gui_1_1Point.html,Point~@#
* Default value: (512, 512)
* Example (*.deeclass):
===== guiTheme =====
Path to gui theme (*.guitheme.xml) to load. If the same gui theme is used in multiple elements it is loaded only once and shared.
* Full name: "renderablePanel.guiTheme" or "renderablePanel(id).guiTheme"
* Type: Path (*.guitheme.xml)
* Default value: "/shareddata/guithemes/modern/modern.guitheme.xml"
* Example (*.deeclass): /content/ui/ingame.guitheme.xml
===== designerSelector =====
Name of designer selector to use from gui theme specified in //guiTheme// property for panel widget. Allows to define multiple panels in one gui theme potentially sharing definitions.
* Full name: "renderablePanel.designerSelector" or "renderablePanel(id).designerSelector"
* Type: string
* Default Value: "RenderablePanel"
* Example (*.deeclass): RenderablePanel.CockpitMonitor.Center
====== Required Behaviors ======
* [[behavior_dynamicskin|ECBehaviorDynamicSkin]]
====== Optional Behaviors ======
This behavior does not support optional behaviors.
====== Persistency ======
This behavior does not use persistency.
====== API Documentation ======
#@LinkApiDocDEDS2_HTML~classDragengine_1_1Scenery_1_1ECBehaviorRenderablePanel.html,ECBehaviorRenderablePanel~@#.
Since DragonScript Module Version **1.3**
====== Use Cases ======
* Create displays and monitors showing dynamic content like a digital wall clock or a train station time table. The element has one renderable used (typically [[gamedev:textureproperties:emissivity|emissivity]] to show the content. For each dynamic content to show add behavior providing the content.
* Generate textures with randomized content during game loading. Same as previous use case but content typically is static.
* Create dynamic skin content which is difficult to create using skin properties only. This can be individual moving and changing content like advertize board or shop signs.
====== Element Class Example ======
class ExampleElementClass extends BehaviorElementClass
public var ECBehaviorComponent component
public var ECBehaviorCollider collider
public var ECBehaviorDynamicSkin dynamicSkin
public var ECBehaviorRenderablePanel renderablePanel
public func new() super("ExampleElement")
// add required behaviors component and collider
component = ECBehaviorComponent.new(this)
collider = ECBehaviorCollider.new(this, component)
// add dynamic skin to modify component
dynamicSkin = ECBehaviorDynamicSkin.new(this, component)
// create renderable panel. the skin has to use a renderable named "board".
// the panel has a size of 512x256 and uses gui theme loaded from "adboard.guitheme.xml".
// the panel uses by default a stack layout hence all widgets added fill the
// entire panel space and are layered ontop of each other. any behavior can
// change the layout used for the panel if required
renderablePanel = ECBehaviorRenderablePanel.new(this, dynamicSkin)
renderablePanel.getRenderable().setValue("board")
renderablePanel.getSize().setPoint(Point.new(512, 256))
renderablePanel.getGuiTheme().setPath("/content/ui/adboard.guitheme.xml")
// here you could now add behaviors adding content to the renderable.
// the simply have to create (during their init(StubElement) call) one or more widgets
// adding them to the renderable. using behavior makes this a reusable process
//
// MyContentBehavior.new(this, renderablePanel)
end
// another way is adding widgets yourself. this can be useful for prototyping
// and situations where you have a simple gui widget
protected func Element createElement()
var BehaviorElement element = super.createElement()
var Panel panel = renderablePanel.instance(element).getPanel()
// add some content to it, for example a label which we can design using
// the design selector "Label.AdEatMorePears"
panel.addWidget(Label.new("Eat more Pears", "Label.AdEatMorePears"))
// you could also add a panel with composed content inside. this is
// usually the way to go as you can add content with your desited layout.
// this example adds two labels against the top and bottom edge with an
// image stretched between them. each can be designed using a respective
// designer selector like adding borders, changing background, changing
// padding, font and color
panel.addWidget(Panel.new(BorderLayout.new(5), block Panel p
p.addWidget(Label.new("Top-Side", "Label.TopSide"), BorderLayout.Area.top)
p.addWidget(DisplayImage.new("/content/adEatMorePears.png", RepeatMode.stretch, "Image.AdEatMorePears"), BorderLayout.Area.content)
p.addWidget(Label.new("Bottom-Side", "Label.BottomSide"), BorderLayout.Area.bottom)
end))
return element
end
end