{
auto cbData = std::make_unique<WidgetCallback::Data<Widget, std::string>>(this, eventName);
auto dataPtr = cbData.get();
- smartCallbacks_.insert_or_assign(eventName, WidgetCallback::Value<Widget, std::string>{std::move(callback), std::move(cbData)});
+ smartCallbacks_.insert_or_assign(eventName,
+ std::make_unique<WidgetCallback::ValueExVoid<Widget,std::string>>(std::move(callback), std::move(cbData)));
+ evas_object_smart_callback_add(getObject(), eventName.c_str(), smartCallbackMethod, dataPtr);
+}
+
+void Widget::setEvasSmartCallback(const std::string &eventName, std::function<void(void*)> callback)
+{
+ auto cbData = std::make_unique<WidgetCallback::Data<Widget, std::string>>(this, eventName);
+ auto dataPtr = cbData.get();
+ smartCallbacks_.insert_or_assign(eventName,
+ std::make_unique<WidgetCallback::ValueExVoidPtr<Widget, std::string>>(std::move(callback), std::move(cbData)));
evas_object_smart_callback_add(getObject(), eventName.c_str(), smartCallbackMethod, dataPtr);
}
ERROR("No callback registered for this event");
return;
}
- auto c = cb->second.callback;
- c();
+ cb->second->callback(event_info);
}
void Widget::eextEventMethod(void *data, Evas_Object *obj, void *event_info)
Rectangle getGeometry();
void setPosition(Point anchor);
void setEvasSmartCallback(const std::string &eventName, std::function<void()> callback);
+ void setEvasSmartCallback(const std::string &eventName, std::function<void(void *)> callback);
void removeEvasSmartCallback(const std::string &eventName);
void setEextEventCallback(const Eext_Callback_Type type, std::function<void()> callback);
void setStyle(const std::string &style);
std::unique_ptr<Evas_Object, utils::EvasDeleter> uniqueObj_;
Widget *parent_ = nullptr;
std::vector<std::unique_ptr<Widget>> children_;
- std::unordered_map<std::string, WidgetCallback::Value<Widget, std::string>> smartCallbacks_;
+ std::unordered_map<std::string, std::unique_ptr<WidgetCallback::ValueEx<Widget, std::string>>> smartCallbacks_;
std::unordered_map<Eext_Callback_Type, WidgetCallback::Value<Widget, Eext_Callback_Type>> eextEventCallbacks_;
};
std::unique_ptr<Data<S, T>> data;
};
+ template <typename S, typename T>
+ struct ValueEx
+ {
+ ValueEx(std::unique_ptr<Data<S,T>> d) : data(std::move(d)) {}
+ virtual void callback(void *event_info) = 0;
+ std::unique_ptr<Data<S, T>> data;
+ virtual ~ValueEx(){}
+ };
+
+ template <typename S, typename T>
+ struct ValueExVoid : public ValueEx<S,T> {
+ ValueExVoid(std::function<void()> fun, std::unique_ptr<Data<S,T>> ptr) : ValueEx<S,T>(std::move(ptr)), call(std::move(fun)) {}
+ std::function<void()> call;
+ void callback(void *) { call(); }
+ };
+
+ template <typename S, typename T>
+ struct ValueExVoidPtr : public ValueEx<S,T> {
+ ValueExVoidPtr(std::function<void(void*)> fun, std::unique_ptr<Data<S,T>> ptr) : ValueEx<S,T>(std::move(ptr)), call(std::move(fun)) {}
+ std::function<void(void*)> call;
+ void callback(void *event_info) { call(event_info); }
+ };
+
} // namespace WidgetCallback
#endif