From e77de8445190a22f24fb2d257e044b10d641c6f0 Mon Sep 17 00:00:00 2001 From: John Maguire Date: Wed, 5 Oct 2011 14:55:39 +0200 Subject: [PATCH] Add a closure variant using tr1::function. This may break the build... --- src/core/closure.cpp | 21 +++++++++++++++++---- src/core/closure.h | 6 ++++++ 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/core/closure.cpp b/src/core/closure.cpp index 6a8920956..9db845a1a 100644 --- a/src/core/closure.cpp +++ b/src/core/closure.cpp @@ -26,6 +26,7 @@ Closure::Closure(QObject* sender, const ClosureArgumentWrapper* val0, const ClosureArgumentWrapper* val1) : QObject(receiver), + callback_(NULL), val0_(val0), val1_(val1) { const QMetaObject* meta_receiver = receiver->metaObject(); @@ -38,11 +39,23 @@ Closure::Closure(QObject* sender, connect(sender, SIGNAL(destroyed()), SLOT(Cleanup())); } +Closure::Closure(QObject* sender, + const char* signal, + std::tr1::function callback) + : callback_(callback) { + connect(sender, signal, SLOT(Invoked())); + connect(sender, SIGNAL(destroyed()), SLOT(Cleanup())); +} + void Closure::Invoked() { - slot_.invoke( - parent(), - val0_ ? val0_->arg() : QGenericArgument(), - val1_ ? val1_->arg() : QGenericArgument()); + if (callback_) { + callback_(); + } else { + slot_.invoke( + parent(), + val0_ ? val0_->arg() : QGenericArgument(), + val1_ ? val1_->arg() : QGenericArgument()); + } deleteLater(); } diff --git a/src/core/closure.h b/src/core/closure.h index a7f4ec982..482cfa9a6 100644 --- a/src/core/closure.h +++ b/src/core/closure.h @@ -18,6 +18,8 @@ #ifndef CLOSURE_H #define CLOSURE_H +#include + #include #include @@ -54,12 +56,16 @@ class Closure : public QObject { const ClosureArgumentWrapper* val0 = 0, const ClosureArgumentWrapper* val1 = 0); + Closure(QObject* sender, const char* signal, + std::tr1::function callback); + private slots: void Invoked(); void Cleanup(); private: QMetaMethod slot_; + std::tr1::function callback_; boost::scoped_ptr val0_; boost::scoped_ptr val1_;