172 lines
3.8 KiB
Clojure
172 lines
3.8 KiB
Clojure
|
|
=== Objectif ===
|
|
:** Understand ewol::Object Messaging system
|
|
:** Create extern message and receive Object message
|
|
|
|
== Message system ==
|
|
|
|
Message system is based on generic std::funtion and std::bind methode:
|
|
|
|
It permit to an object to generate some [b]'signals'[/b].
|
|
|
|
All signal are synchronous
|
|
|
|
|
|
== Receive signals from other object ==
|
|
|
|
[todo]
|
|
Link with the signal name
|
|
[/todo]
|
|
|
|
Register on the 'up' and 'value' signal of a button:
|
|
|
|
Button header :
|
|
[code style=c++]
|
|
...
|
|
public:
|
|
ewol::object::Signal<void> signalDown;
|
|
ewol::object::Signal<void> signalUp;
|
|
...
|
|
ewol::object::Signal<bool> signalValue;
|
|
...
|
|
[/code]
|
|
|
|
=== simple signal connection: ===
|
|
|
|
[code style=c++]
|
|
#include <ewol/object/Object.h>
|
|
#include <ewol/widget/Button.h>
|
|
namespace appl {
|
|
class MyObj : public ewol::Object {
|
|
private:
|
|
std::shared_ptr<ewol::widget::Button> m_button;
|
|
protected:
|
|
//! @brief Constructor
|
|
MyObj(void) {
|
|
// nothing to do..
|
|
}
|
|
void init() {
|
|
ewol::Object::init();
|
|
m_button = ewol::widget::Button::Create();
|
|
if (m_button == nullptr) {
|
|
APPL_ERROR("Can not create button...");
|
|
return;
|
|
}
|
|
// We connect signals here :
|
|
m_button->signalUp.bind(shared_from_this(), &appl::MyObj::onCallbackUp);
|
|
m_button->signalValue.bind(shared_from_this(), &appl::MyObj::onCallbackValue);
|
|
}
|
|
public:
|
|
//! @brief Destructor
|
|
virtual ~MyObj(void) { }
|
|
DECLARE_FACTORY(MyObj);
|
|
private:
|
|
void onCallbackUp() {
|
|
APPL_INFO("button pressed: UP);
|
|
}
|
|
void onCallbackValue(const bool& _value) {
|
|
APPL_INFO("button value: " << _value);
|
|
}
|
|
}
|
|
}
|
|
[/code]
|
|
|
|
|
|
=== Advenced signal connection: ===
|
|
|
|
Here we will see how to connect an advance function on a signal
|
|
|
|
[code style=c++]
|
|
#include <ewol/object/Object.h>
|
|
#include <ewol/widget/Button.h>
|
|
namespace appl {
|
|
class MyObj : public ewol::Object {
|
|
private:
|
|
std::shared_ptr<ewol::widget::Button> m_button;
|
|
protected:
|
|
//! @brief Constructor
|
|
MyObj(void) {
|
|
// nothing to do..
|
|
}
|
|
void init() {
|
|
ewol::Object::init();
|
|
m_button = ewol::widget::Button::Create();
|
|
if (m_button == nullptr) {
|
|
APPL_ERROR("Can not create button...");
|
|
return;
|
|
}
|
|
// We connect signals here :
|
|
m_button->signalUp.register(shared_from_this(), std::bind(&appl::MyObj::onCallbackUp, this, std::string("tmpVariableToSend")));
|
|
m_button->signalValue.register(shared_from_this(), std::bind(&appl::MyObj::onCallbackValue, this));
|
|
}
|
|
public:
|
|
//! @brief Destructor
|
|
virtual ~MyObj(void) { }
|
|
DECLARE_FACTORY(MyObj);
|
|
private:
|
|
void onCallbackUp(const std::string& _value) {
|
|
APPL_INFO("button pressed: UP inputMessage: " << _value);
|
|
}
|
|
void onCallbackValue() {
|
|
APPL_INFO("button value: " << _value);
|
|
}
|
|
}
|
|
}
|
|
[/code]
|
|
|
|
=== Connect to a signal with a named widget ===
|
|
|
|
TODO: documentation :
|
|
:** subBind(_type, _name, _event, _obj, _func)
|
|
:** globalBind(_type, _name, _event, _obj, _func)
|
|
:** externSubBind(_object, _type, _name, _event, _obj, _func)
|
|
|
|
|
|
== Declare Signal ==
|
|
|
|
=== source ===
|
|
|
|
[code style=c++]
|
|
#include <ewol/object/Object.h>
|
|
#include <ewol/widget/Button.h>
|
|
namespace appl {
|
|
class MyObj : public ewol::Object {
|
|
public:
|
|
ewol::object::Signal<void> signalEmpty;
|
|
ewol::object::Signal<bool> signalBoolean;
|
|
ewol::object::Signal<std::string> signalString;
|
|
protected:
|
|
//! @brief Constructor
|
|
MyObj(void) :
|
|
signalEmpty(*this, "empty"),
|
|
signalBoolean(*this, "boolean"),
|
|
signalString(*this, "string") {
|
|
// nothing to do..
|
|
}
|
|
void init() {
|
|
ewol::Object::init();
|
|
}
|
|
public:
|
|
//! @brief Destructor
|
|
virtual ~MyObj(void) { }
|
|
DECLARE_FACTORY(MyObj);
|
|
private:
|
|
void process() {
|
|
signalEmpty.emit();
|
|
signalBoolean.emit(false);
|
|
signalString.emit("plop... plop");
|
|
}
|
|
}
|
|
}
|
|
[/code]
|
|
|
|
== Conclusion ==
|
|
|
|
You will now able to reise signals between objects...
|
|
|
|
|
|
|
|
|
|
|
|
|