240 lines
15 KiB
HTML
240 lines
15 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/"> [ 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 message</center></h1>
|
|
<hr><div align="left"><a href="tutorial_011_ObjectConfig.html">Previous: Object config</a></div> <div align="right"><a href="tutorial_020_FileAccess.html">Next: File access</a></div>
|
|
|
|
<h2> Objectif </h2>
|
|
<ul><li> Understand ewol::Object Messaging system</li><li> Create extern message and receive Object message</li></ul>
|
|
<h1> Message system </h1><br/>
|
|
Message system is based on generic std::funtion and std::bind methode:<br/>
|
|
It permit to an object to generate some <span style="font-weight: bold;">'signals'</span>.<br/>
|
|
All signal are synchronous<br/>
|
|
|
|
<h1> Receive signals from other object </h1><br/>
|
|
[todo]
|
|
Link with the signal name
|
|
[/todo]<br/>
|
|
Register on the 'up' and 'value' signal of a button:<br/>
|
|
Button header :
|
|
<pre>
|
|
...
|
|
<span class="code-storage-keyword">public</span>:
|
|
<span class="code-class">ewol::object::Signal</span><<span class="code-type">void</span>> signalDown;
|
|
<span class="code-class">ewol::object::Signal</span><<span class="code-type">void</span>> signalUp;
|
|
...
|
|
<span class="code-class">ewol::object::Signal</span><<span class="code-type">bool</span>> signalValue;
|
|
...
|
|
</pre><br/>
|
|
<h2> simple signal connection: </h2><br/>
|
|
<pre>
|
|
<span class="code-preproc">#include <ewol/object/Object.h>
|
|
</span><span class="code-preproc">#include <ewol/widget/Button.h>
|
|
</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">private</span>:
|
|
<span class="code-class">std::shared_ptr</span><<span class="code-class">ewol::widget::Button</span>> <span class="code-member">m_b</span>utton;
|
|
<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-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-member">m_b</span>utton = <span class="code-class">ewol::widget::Button</span>::<span class="code-function-name">Create(</span>);
|
|
<span class="code-keyword">if </span>(<span class="code-member">m_b</span>utton <span class="code-operator">==</span> nullptr) <span class="code-operator">{</span>
|
|
<span class="code-function-name">APPL_ERROR(</span><span class="code-text-quote">"Can not create button..."</span>);
|
|
return;
|
|
<span class="code-operator">}</span>
|
|
<span class="code-comment">// We connect signals here :
|
|
</span> <span class="code-member">m_b</span>utton->signalUp.<span class="code-function-name">bind(</span>shared_fro<span class="code-member">m_t</span><span class="code-function-name">his(</span>), &<span class="code-class">appl::MyObj::onCallbackUp</span>);
|
|
<span class="code-member">m_b</span>utton->signalValue.<span class="code-function-name">bind(</span>shared_fro<span class="code-member">m_t</span><span class="code-function-name">his(</span>), &<span class="code-class">appl::MyObj::onCallbackValue</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-type">void</span> <span class="code-function-name">onCallbackUp(</span>) <span class="code-operator">{</span>
|
|
<span class="code-function-name">APPL_INFO(</span><span class="code-text-quote">"button pressed: UP);
|
|
}
|
|
void onCallbackValue(const bool& _value) {
|
|
APPL_INFO("</span>button value: " <<<span class="code-input-function"> _value</span>);
|
|
<span class="code-operator">}</span>
|
|
<span class="code-operator">}</span>
|
|
<span class="code-operator">}</span>
|
|
</pre><br/>
|
|
|
|
<h2> Advenced signal connection: </h2><br/>
|
|
Here we will see how to connect an advance function on a signal<br/>
|
|
<pre>
|
|
<span class="code-preproc">#include <ewol/object/Object.h>
|
|
</span><span class="code-preproc">#include <ewol/widget/Button.h>
|
|
</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">private</span>:
|
|
<span class="code-class">std::shared_ptr</span><<span class="code-class">ewol::widget::Button</span>> <span class="code-member">m_b</span>utton;
|
|
<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-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-member">m_b</span>utton = <span class="code-class">ewol::widget::Button</span>::<span class="code-function-name">Create(</span>);
|
|
<span class="code-keyword">if </span>(<span class="code-member">m_b</span>utton <span class="code-operator">==</span> nullptr) <span class="code-operator">{</span>
|
|
<span class="code-function-name">APPL_ERROR(</span><span class="code-text-quote">"Can not create button..."</span>);
|
|
return;
|
|
<span class="code-operator">}</span>
|
|
<span class="code-comment">// We connect signals here :
|
|
</span> <span class="code-member">m_b</span>utton->signalUp.<span class="code-storage-keyword">register</span>(shared_fro<span class="code-member">m_t</span><span class="code-function-name">his(</span>), std::<span class="code-function-name">bind(</span>&<span class="code-class">appl::MyObj::onCallbackUp</span>, this, std::<span class="code-function-name">string(</span><span class="code-text-quote">"tmpVariableToSend"</span>)));
|
|
<span class="code-member">m_b</span>utton->signalValue.<span class="code-storage-keyword">register</span>(shared_fro<span class="code-member">m_t</span><span class="code-function-name">his(</span>), std::<span class="code-function-name">bind(</span>&<span class="code-class">appl::MyObj::onCallbackValue</span>, this));
|
|
<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-type">void</span> <span class="code-function-name">onCallbackUp(</span><span class="code-storage-keyword">const</span> <span class="code-class">std::string</span>&<span class="code-input-function"> _value</span>) <span class="code-operator">{</span>
|
|
<span class="code-function-name">APPL_INFO(</span><span class="code-text-quote">"button pressed: UP inputMessage: "</span> <<<span class="code-input-function"> _value</span>);
|
|
<span class="code-operator">}</span>
|
|
<span class="code-type">void</span> <span class="code-function-name">onCallbackValue(</span>) <span class="code-operator">{</span>
|
|
<span class="code-function-name">APPL_INFO(</span><span class="code-text-quote">"button value: "</span> <<<span class="code-input-function"> _value</span>);
|
|
<span class="code-operator">}</span>
|
|
<span class="code-operator">}</span>
|
|
<span class="code-operator">}</span>
|
|
</pre><br/>
|
|
<h2> Connect to a signal with a named widget </h2><br/>
|
|
TODO: documentation :
|
|
<ul><li> subBind(_type, _name, _event, _obj, _func)</li><li> globalBind(_type, _name, _event, _obj, _func)</li><li> externSubBind(_object, _type, _name, _event, _obj, _func)</li></ul><br/>
|
|
<h1> Declare Signal </h1><br/>
|
|
<h2> source </h2><br/>
|
|
<pre>
|
|
<span class="code-preproc">#include <ewol/object/Object.h>
|
|
</span><span class="code-preproc">#include <ewol/widget/Button.h>
|
|
</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">public</span>:
|
|
<span class="code-class">ewol::object::Signal</span><<span class="code-type">void</span>> signalEmpty;
|
|
<span class="code-class">ewol::object::Signal</span><<span class="code-type">bool</span>> signalBoolean;
|
|
<span class="code-class">ewol::object::Signal</span><<span class="code-class">std::string</span>> signalString;
|
|
<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-function-name">signalEmpty(</span>*this, <span class="code-text-quote">"empty"</span>),
|
|
<span class="code-function-name">signalBoolean(</span>*this, <span class="code-text-quote">"boolean"</span>),
|
|
<span class="code-function-name">signalString(</span>*this, <span class="code-text-quote">"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-type">void</span> <span class="code-function-name">process(</span>) <span class="code-operator">{</span>
|
|
signalEmpty.<span class="code-function-name">emit(</span>);
|
|
signalBoolean.<span class="code-function-name">emit(</span><span class="<code-operator">false</span>);
|
|
signalString.<span class="code-function-name">emit(</span><span class="code-text-quote">"plop... plop"</span>);
|
|
<span class="code-operator">}</span>
|
|
<span class="code-operator">}</span>
|
|
<span class="code-operator">}</span>
|
|
</pre><br/>
|
|
<h1> Conclusion </h1><br/>
|
|
You will now able to reise signals between objects...<br/>
|
|
<br/>
|
|
<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>
|