[DEV] add subElement bind with multiple argument (TODO: better with template)

This commit is contained in:
Edouard DUPIN 2014-10-20 21:28:23 +02:00
parent 499806edc5
commit 21435b9961
3 changed files with 47 additions and 5 deletions

2
external/egami vendored

@ -1 +1 @@
Subproject commit e07648a33c85a8886c0e9dfb806ed8585c4d7553
Subproject commit aa66ac176f625abf61122e0a71a608adab43fca2

View File

@ -238,6 +238,14 @@ namespace ewol {
EWOL_ERROR("object named='" << _name << "' not exit or can not be cast in : " << #_type); \
} \
} while (false)
#define subBind2(_type, _name, _event, _obj, _func, _param1, _param2) do {\
std::shared_ptr<_type> myObject = std::dynamic_pointer_cast<_type>(getSubObjectNamed(_name)); \
if (myObject != nullptr) { \
myObject->_event.bind2(_obj, _func, _param1, _param2); \
} else { \
EWOL_ERROR("object named='" << _name << "' not exit or can not be cast in : " << #_type); \
} \
} while (false)
/*
template<class TYPE> void bind(std::shared_ptr<ewol::Object> _obj, void (TYPE::*_func)()) {
std::shared_ptr<TYPE> obj2 = std::dynamic_pointer_cast<TYPE>(_obj);

View File

@ -50,7 +50,19 @@ namespace ewol {
* @param[in] _func Link on the fuction that might be called (inside a class)
* @example signalXXXX.bind(shared_from_this(), &ClassName::onCallbackXXX);
*/
template<class TYPE> void bind(std::shared_ptr<ewol::Object> _obj, void (TYPE::*_func)(const T&)) {
/* Maybe later :
template<class TYPE, typename... TArgs>
void bind(std::shared_ptr<ewol::Object> _obj, void (TYPE::*_func)(const T&, TArgs...), TArgs... args2) {
std::shared_ptr<TYPE> obj2 = std::dynamic_pointer_cast<TYPE>(_obj);
if (obj2 == nullptr) {
EWOL_ERROR("Can not bind signal ...");
return;
}
m_callerList.push_back(std::make_pair(std::weak_ptr<ewol::Object>(_obj), std::bind(_func, obj2.get(), std::placeholders::_1, args2)));
}
*/
template<class TYPE>
void bind(std::shared_ptr<ewol::Object> _obj, void (TYPE::*_func)(const T&)) {
std::shared_ptr<TYPE> obj2 = std::dynamic_pointer_cast<TYPE>(_obj);
if (obj2 == nullptr) {
EWOL_ERROR("Can not bind signal ...");
@ -58,7 +70,9 @@ namespace ewol {
}
m_callerList.push_back(std::make_pair(std::weak_ptr<ewol::Object>(_obj), std::bind(_func, obj2.get(), std::placeholders::_1)));
}
template<class TYPE, typename TYPE2> void bind1(std::shared_ptr<ewol::Object> _obj, void (TYPE::*_func)(const T&,const TYPE2&), TYPE2 _param1) {
// TODO : Rework this when I understand the use of variadic template with std::function
template<class TYPE, typename TYPE2>
void bind1(std::shared_ptr<ewol::Object> _obj, void (TYPE::*_func)(const T&, const TYPE2&), TYPE2 _param1) {
std::shared_ptr<TYPE> obj2 = std::dynamic_pointer_cast<TYPE>(_obj);
if (obj2 == nullptr) {
EWOL_ERROR("Can not bind signal ...");
@ -66,6 +80,15 @@ namespace ewol {
}
m_callerList.push_back(std::make_pair(std::weak_ptr<ewol::Object>(_obj), std::bind(_func, obj2.get(), std::placeholders::_1, _param1)));
}
template<class TYPE, typename TYPE2, typename TYPE3>
void bind2(std::shared_ptr<ewol::Object> _obj, void (TYPE::*_func)(const T&, const TYPE2&, const TYPE3&), TYPE2 _param1, TYPE3 _param2) {
std::shared_ptr<TYPE> obj2 = std::dynamic_pointer_cast<TYPE>(_obj);
if (obj2 == nullptr) {
EWOL_ERROR("Can not bind signal ...");
return;
}
m_callerList.push_back(std::make_pair(std::weak_ptr<ewol::Object>(_obj), std::bind(_func, obj2.get(), std::placeholders::_1, _param1, _param2)));
}
/**
* @brief Advanced binding a callback function to the current signal.
* @param[in] _obj Shared pointer on the caller object
@ -153,7 +176,8 @@ namespace ewol {
* @param[in] _func Link on the fuction that might be called (inside a class)
* @example signalXXXX.connect(shared_from_this(), &ClassName::onCallbackXXX);
*/
template<class TYPE> void bind(std::shared_ptr<ewol::Object> _obj, void (TYPE::*_func)()) {
template<class TYPE>
void bind(std::shared_ptr<ewol::Object> _obj, void (TYPE::*_func)()) {
std::shared_ptr<TYPE> obj2 = std::dynamic_pointer_cast<TYPE>(_obj);
if (obj2 == nullptr) {
EWOL_ERROR("Can not bind signal ...");
@ -161,7 +185,8 @@ namespace ewol {
}
m_callerList.push_back(std::make_pair(std::weak_ptr<ewol::Object>(_obj), std::bind(_func, obj2.get())));
}
template<class TYPE, class TYPE2> void bind1(std::shared_ptr<ewol::Object> _obj, void (TYPE::*_func)(const TYPE2&), const TYPE2& _param1) {
template<class TYPE, class TYPE2>
void bind1(std::shared_ptr<ewol::Object> _obj, void (TYPE::*_func)(TYPE2), TYPE2 _param1) {
std::shared_ptr<TYPE> obj2 = std::dynamic_pointer_cast<TYPE>(_obj);
if (obj2 == nullptr) {
EWOL_ERROR("Can not bind signal ...");
@ -169,6 +194,15 @@ namespace ewol {
}
m_callerList.push_back(std::make_pair(std::weak_ptr<ewol::Object>(_obj), std::bind(_func, obj2.get(), _param1)));
}
template<class TYPE, class TYPE2, class TYPE3>
void bind2(std::shared_ptr<ewol::Object> _obj, void (TYPE::*_func)(TYPE2, TYPE2), TYPE2 _param1, TYPE3 _param2) {
std::shared_ptr<TYPE> obj2 = std::dynamic_pointer_cast<TYPE>(_obj);
if (obj2 == nullptr) {
EWOL_ERROR("Can not bind signal ...");
return;
}
m_callerList.push_back(std::make_pair(std::weak_ptr<ewol::Object>(_obj), std::bind(_func, obj2.get(), _param1, _param2)));
}
/**
* @brief Advanced binding a callback function to the current signal.
* @param[in] _obj Shared pointer on the caller object