]> git.tdb.fi Git - libs/gl.git/blobdiff - source/bindable.h
Animate only those components which are present in Transforms
[libs/gl.git] / source / bindable.h
index 8651c70ee066b6cbfa2e8f40cd967b0a92f148cd..b2634ea92bd4b1b43bb1f88b502af230f1e3c4bd 100644 (file)
@@ -15,6 +15,7 @@ protected:
        static const T *cur_obj;
 
        Bindable() { }
+       ~Bindable() { if(cur_obj==this) T::unbind(); }
 
        static bool set_current(const T *obj)
        {
@@ -39,8 +40,11 @@ A helper class for Bindables that revert to a default object on unbind.
 template<typename T>
 class BindableWithDefault: protected Bindable<T>
 {
+       friend class Bindable<T>;
+
 protected:
        BindableWithDefault() { }
+       ~BindableWithDefault() { if(this==&default_object()) Bindable<T>::set_current(0); }
 
 public:
        static const T *current()
@@ -52,7 +56,8 @@ public:
 
        static void unbind()
        {
-               default_object().bind();
+               if(Bindable<T>::cur_obj)
+                       default_object().bind();
        }
 
        static const T &default_object()
@@ -99,7 +104,8 @@ private:
        template<typename T>
        void init(const T *o)
        {
-               cleanup = (o ? &unbind<T> : 0);
+               cleanup = (o ? static_cast<CleanupFunc *>(&unbind<T>) : 0);
+               slot = 0;
                if(o)
                        o->bind();
                else
@@ -109,7 +115,7 @@ private:
        template<typename T, typename S>
        void init(const T *o, S s)
        {
-               cleanup = (o ? &unbind_from<T, S> : 0);
+               cleanup = (o ? static_cast<CleanupFunc *>(&unbind_from<T, S>) : 0);
                slot = s;
                if(o)
                        o->bind_to(s);
@@ -168,7 +174,8 @@ private:
        void init(T *o)
        {
                old = T::current();
-               cleanup = (o!=old ? &restore<T> : 0);
+               slot = 0;
+               cleanup = (o!=old ? static_cast<CleanupFunc *>(&restore<T>) : 0);
                if(o)
                        o->bind();
                else if(old)
@@ -180,7 +187,7 @@ private:
        {
                old = T::current(s);
                slot = s;
-               cleanup = (o!=old ? &restore_to<T, S> : 0);
+               cleanup = (o!=old ? static_cast<CleanupFunc *>(&restore_to<T, S>) : 0);
                if(o)
                        o->bind_to(s);
                else if(old)