ewol/tutorial_011_ObjectConfig.html
2014-10-18 09:23:18 +02:00

170 lines
11 KiB
HTML

<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<title>ewol Library</title>
<link rel="stylesheet" href="base.css">
<link rel="stylesheet" href="menu.css">
</head>
<body>
<div class="navbar navbar-fixed-top">
<div class="container">
<h1><a href="index.html">ewol library</a></h1>
<h4><a href="http://github.com/heeroyui/ewol/">&nbsp;&nbsp;&nbsp;[ sources ]</a></h4>
<h3>API:</h3> <div id="menu">
<ul class="niveau1">
<li class="sousmenu"><a href="namespace_ewol.html">ewol</a>
<ul class="niveau2">
<li><a href="namespace_ewol__translate.html">translate</a>
</li>
<li><a href="namespace_ewol__key.html">key</a>
</li>
<li><a href="namespace_ewol__widget.html">widget</a>
</li>
<li><a href="namespace_ewol__openGL.html">openGL</a>
</li>
<li class="sousmenu"><a href="namespace_ewol__context.html">context</a>
<ul class="niveau3">
<li><a href="namespace_ewol__context__clipBoard.html">clipBoard</a>
</li>
</ul>
</li>
<li><a href="namespace_ewol__compositing.html">compositing</a>
</li>
<li><a href="namespace_ewol__object.html">object</a>
</li>
<li><a href="namespace_ewol__resource.html">resource</a>
</li>
<li><a href="namespace_ewol__font.html">font</a>
</li>
<li><a href="namespace_ewol__event.html">event</a>
</li>
</ul>
</li>
<li><a href="namespace_MacOs.html">MacOs</a>
</li>
<li><a href="namespace_IOs.html">IOs</a>
</li>
</ul>
</div>
<h3>Documentation:</h3><div id="menu">
<ul class="niveau1"><li><a href="001_bases.html">Bases</a></li>
</ul><ul class="niveau1"><li><a href="faq.html">Faq</a></li>
</ul></div>
<h3>Tutorials:</h3><div id="menu">
<ul class="niveau1"><li><a href="tutorial_000_Build.html">Build</a></li>
</ul><ul class="niveau1"><li><a href="tutorial_001_HelloWord.html">Hello word</a></li>
</ul><ul class="niveau1"><li><a href="tutorial_010_ObjectModel.html">Object model</a></li>
</ul><ul class="niveau1"><li><a href="tutorial_011_ObjectConfig.html">Object config</a></li>
</ul><ul class="niveau1"><li><a href="tutorial_012_ObjectMessage.html">Object message</a></li>
</ul><ul class="niveau1"><li><a href="tutorial_020_FileAccess.html">File access</a></li>
</ul><ul class="niveau1"><li><a href="tutorial_021_Resources.html">Resources</a></li>
</ul><ul class="niveau1"><li><a href="tutorial_030_ConplexeXmlGui.html">Conplexe xml gui</a></li>
</ul><ul class="niveau1"><li><a href="tutorial_050_CreateCustomWidget.html">Create custom widget</a></li>
</ul><ul class="niveau1"><li><a href="tutorial_051_AddWidgetCustumInXML.html">Add widget custum in x m l</a></li>
</ul></div>
<br/><h3>Associate libraries:</h3><div id="menu">
<ul class="niveau1"><li><a href="../ejson/index.html">ejson</a></li>
</ul><ul class="niveau1"><li><a href="../egami/index.html">egami</a></li>
</ul><ul class="niveau1"><li><a href="../ege/index.html">ege</a></li>
</ul><ul class="niveau1"><li><a href="../esvg/index.html">esvg</a></li>
</ul><ul class="niveau1"><li><a href="../etk/index.html">etk</a></li>
</ul><ul class="niveau1"><li><a href="../exml/index.html">exml</a></li>
</ul></div>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
</div>
</div>
<div class="container" id="content">
<h1><center>object config</center></h1>
<hr><div align="left"><a href="tutorial_010_ObjectModel.html">Previous: Object model</a></div> <div align="right"><a href="tutorial_012_ObjectMessage.html">Next: Object message</a></div>
<h2> Objectif </h2>
<ul><li> Understand ewol::Object configuration parameter</li><li> Create an configurable object</li></ul>
<h1> Configuration using </h1><br/>
All <a href="class_ewol__Object.html">ewol::Object</a> have a configuration of parameters (the object name is a parameter), Then we need to set get and use xml to update parameters.<br/>
<h2> Set a Parameter </h2><br/>
<br/>
<b>Note:</b><pre>
Using getter and setter is really better, and faster.
</pre><br/>
<h3> With a string configuration </h3><br/>
<pre>
<span class="code-keyword">if </span>(tmpObject-&gt;<span class="code-function-name">parameterSet(</span><span class="code-text-quote">"name"</span>, <span class="code-text-quote">"new name of object"</span>) <span class="code-operator">==</span> <span class="<code-operator">false</span>) <span class="code-operator">{</span>
<span class="code-function-name">APPL_ERROR(</span><span class="code-text-quote">"Can not set object parameter"</span>);
<span class="code-operator">}</span>
</pre><br/>
<h3> whith the object name </h3><br/>
<pre>
<span class="code-keyword">if </span>(<span class="code-function-name">parameterSetOnWidgetNamed(</span><span class="code-text-quote">"objectName"</span>, <span class="code-text-quote">"value"</span>, <span class="code-text-quote">"16.2"</span>) <span class="code-operator">==</span> <span class="<code-operator">false</span>) <span class="code-operator">{</span>
<span class="code-function-name">APPL_ERROR(</span><span class="code-text-quote">"Can not set object parameter"</span>);
<span class="code-operator">}</span>
</pre><br/>
<h2> Get Parameter </h2><br/>
<pre>
<span class="code-class">std::string</span> val = tmpObject-&gt;<span class="code-function-name">parameterGet(</span><span class="code-text-quote">"name"</span>);
<span class="code-function-name">APPL_INFO(</span><span class="code-text-quote">"Get Object property : name='"</span> &lt;&lt; val &lt;&lt; <span class="code-text-quote">"'"</span>);
</pre><br/>
<h1> Implement configuration </h1><br/>
<pre>
<span class="code-preproc">#include &lt;ewol/object/Object.h&gt;
</span>namespace appl <span class="code-operator">{</span>
<span class="code-storage-keyword">class</span> MyObj : <span class="code-storage-keyword">public</span> <span class="code-class">ewol::Object</span> <span class="code-operator">{</span>
<span class="code-storage-keyword">protected</span>:
<span class="code-doxygen">//! @brief Constructor
</span> <span class="code-function-name">MyObj(</span><span class="code-type">void</span>) :
<span class="code-member">m_v</span><span class="code-function-name">alue(</span>*this, <span class="code-text-quote">"value"</span>, <span class="<code-operator">false</span>, <span class="code-text-quote">"Value of the parameter (descrition string)"</span>) <span class="code-operator">{</span>
<span class="code-comment">// nothing to do..
</span> <span class="code-operator">}</span>
<span class="code-type">void</span> <span class="code-function-name">init(</span>) <span class="code-operator">{</span>
<span class="code-class">ewol::Object</span>::<span class="code-function-name">init(</span>);
<span class="code-operator">}</span>
<span class="code-storage-keyword">public</span>:
<span class="code-doxygen">//! @brief Destructor
</span> <span class="code-storage-keyword">virtual</span> ~<span class="code-function-name">MyObj(</span><span class="code-type">void</span>) <span class="code-operator">{</span> <span class="code-operator">}</span>
<span class="code-function-name">DECLARE_FACTORY(</span>MyObj);
<span class="code-storage-keyword">private</span>:
<span class="code-class">ewol::object::Param</span>&lt;<span class="code-type">bool</span>&gt; <span class="code-member">m_v</span>alue; <span class="code-doxygen">//!&lt; Internal Object value
</span> <span class="code-storage-keyword">public</span>:
<span class="code-doxygen">//! @brief Setter
</span> <span class="code-type">void</span> <span class="code-function-name">setValue(</span><span class="code-type">bool</span><span class="code-input-function"> _val</span>) <span class="code-operator">{</span>
<span class="code-member">m_v</span>alue.<span class="code-function-name">set(</span>_val);
<span class="code-operator">}</span>
<span class="code-doxygen">//! @brief Getter
</span> <span class="code-type">bool</span> <span class="code-function-name">getValue(</span>) <span class="code-storage-keyword">const</span> <span class="code-operator">{</span>
<span class="code-keyword">return </span><span class="code-member">m_v</span>alue.<span class="code-function-name">get(</span>);
<span class="code-operator">}</span>
<span class="code-storage-keyword">public</span>: <span class="code-comment">// herited function:
</span> <span class="code-type">void</span> <span class="code-function-name">onParameterChangeValue(</span><span class="code-storage-keyword">const</span> <span class="code-class">ewol::object::ParameterRef</span>&<span class="code-input-function"> _paramPo</span><span class="code-type">int</span>er) <span class="code-operator">{</span>
<span class="code-keyword">if </span>(_paramPo<span class="code-type">int</span>er <span class="code-operator">==</span> <span class="code-member">m_v</span>alue) <span class="code-operator">{</span>
<span class="code-function-name">APPL_DEBUG(</span><span class="code-text-quote">"The internal value has change, new value is : '"</span> &lt;&lt; <span class="code-member">m_v</span>alue.<span class="code-function-name">get(</span>) &lt;&lt; <span class="code-text-quote">"'"</span>);
<span class="code-operator">}</span>
<span class="code-operator">}</span>
<span class="code-operator">}</span>
<span class="code-operator">}</span>
</pre><br/>
In the contructor we need to add:
<pre>
<span class="code-member">m_v</span><span class="code-function-name">alue(</span>*this, <span class="code-text-quote">"value"</span>, <span class="<code-operator">false</span>, <span class="code-text-quote">"Value of the parameter (descrition string)"</span>)
</pre>
<ul><li> <span style="font-weight: bold;">'*this':</span> Reference the main class to call it chen value change.</li><li> <span style="font-weight: bold;">"value":</span> Is the name of the parameter.</li><li> <span style="font-weight: bold;">false:</span> The default value.</li><li> <span style="font-weight: bold;">"....."</span> Description of the parameter (optionnal).</li></ul><br/>
The function <span style="font-weight: bold;">onParameterChangeValue</span> is called only the parameter change (no historic has been registered)<br/>
The last point is that the m_value.get() is an inline fuction then it take no more CPU cycle to access the value than normal variable.<br/>
Some other parameter are availlable :
<ul><li> ewol::object::Param&lt;T&gt; Basic parameter.</li><li> ewol::object::ParamRange&lt;T&gt; For numeric parameter that range value are check befor setting new value.</li><li> ewol::object::ParamList&lt;T&gt; For List of parameter values.</li></ul><br/>
</div>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-46753803-1', 'heeroyui.github.io');
ga('send', 'pageview');
</script>
</body>
</html>