Fix 6031: Fix inactive MIDI track headers when reloading session
[ardour.git] / gtk2_ardour / window_manager.h
index d0204f20b8df14b3b9c634965b126fdb8ab78f10..6e89be3b267a66482aea6a6c08c5db34fe804cb0 100644 (file)
@@ -43,139 +43,15 @@ namespace ARDOUR {
        class SessionHandlePtr;
 }
 
-class WindowManager 
+namespace WM {
+
+class ProxyBase;
+
+class Manager : public ARDOUR::SessionHandlePtr
 {
   public:
-    static WindowManager& instance();
-
-    class ProxyBase : public sigc::trackable {
-      public:
-       ProxyBase (const std::string& name, const std::string& menu_name);
-       ProxyBase (const std::string& name, const std::string& menu_name, const XMLNode&);
-       virtual ~ProxyBase();
-
-       void show ();
-       void show_all ();
-       void hide ();
-       void present ();
-       void maybe_show ();
-
-       bool visible() const { return _visible; }
-       const std::string& name() const { return _name; }
-       const std::string& menu_name() const { return _menu_name; }
-
-       std::string action_name() const;
-       void set_action (Glib::RefPtr<Gtk::Action>);
-       Glib::RefPtr<Gtk::Action> action() const { return _action; };
-       
-       void clear ();
-       void use_window (Gtk::Window&);
-
-       virtual Gtk::Window* get (bool create = false) = 0;
-
-       virtual bool rc_configured() const { return true; }
-       virtual void toggle ();
-
-        void set_state (const XMLNode&);
-       XMLNode& get_state () const;
-
-       virtual ARDOUR::SessionHandlePtr* session_handle () = 0;
-
-       operator bool() const { return _window != 0; }
-
-      protected:
-       std::string  _name;
-       std::string  _menu_name;
-       Glib::RefPtr<Gtk::Action> _action;
-       Gtk::Window* _window;
-       bool         _visible; ///< true if the window should be visible on startup
-       int          _x_off; ///< x position
-       int          _y_off; ///< y position
-       int          _width; ///< width
-       int          _height; ///< height
-       Gtkmm2ext::VisibilityTracker* vistracker;
-       sigc::connection configure_connection;
-
-       void setup ();
-       bool configured (GdkEventConfigure*);
-    };
-
-    template<typename T>
-    class ProxyWithConstructor: public ProxyBase {
-      public:
-       ProxyWithConstructor (const std::string& name, const std::string& menu_name, const boost::function<T*()>& c)
-               : ProxyBase (name, menu_name) , creator (c) {}
-       
-       ProxyWithConstructor (const std::string& name, const std::string& menu_name, const boost::function<T*()>& c, const XMLNode* node)
-               : ProxyBase (name, menu_name, node) , creator (c) {}
-       
-       Gtk::Window* get (bool create = false) { 
-               if (!_window) {
-                       if (!create) {
-                               return 0;
-                       }
-
-                       _window = creator ();
-
-                       if (_window) {
-                               setup ();
-                       }       
-               }
-
-               return _window;
-       }
-
-       T* operator->() { 
-               return dynamic_cast<T*> (get (true));
-       }
-
-       ARDOUR::SessionHandlePtr* session_handle () {
-               /* may return null */
-               return dynamic_cast<T*> (_window);
-       }
-
-      private:
-       boost::function<T*()>   creator;
-    };
-
-    template<typename T>
-    class Proxy : public ProxyBase {
-      public:
-       Proxy (const std::string& name, const std::string& menu_name)
-               : ProxyBase (name, menu_name) {}
-
-       Proxy (const std::string& name, const std::string& menu_name, const XMLNode* node)
-               : ProxyBase (name, menu_name, node)  {}
-       
-       Gtk::Window* get (bool create = false) { 
-               if (!_window) {
-                       if (!create) {
-                               return 0;
-                       }
-
-                       _window = new T ();
-
-                       if (_window) {
-                               setup ();
-                       }       
-               }
-
-               return _window;
-       }
-
-       T* operator->() { 
-               /* make return null */
-               return dynamic_cast<T*> (_window);
-       }
-
-       ARDOUR::SessionHandlePtr* session_handle () {
-               return dynamic_cast<T*> (get());
-       }
-
-      private:
-       boost::function<T*()>   creator;
-    };
-    
+    static Manager& instance();
+
     void register_window (ProxyBase*);
     void remove (const ProxyBase*);
     void toggle_window (ProxyBase*);
@@ -183,15 +59,185 @@ class WindowManager
     void set_session (ARDOUR::Session*);
     void add_state (XMLNode&) const;
 
+    /* HACK HACK HACK */
+    void set_transient_for (Gtk::Window*);
+    Gtk::Window* transient_parent() const { return current_transient_parent; }
+
   private:
     typedef std::list<ProxyBase*> Windows;
     Windows _windows;
     Glib::RefPtr<Gtk::ActionGroup> window_actions;
+    Gtk::Window* current_transient_parent;
+
+    Manager();
+    ~Manager();
+
+    static Manager* _instance;
+};
+
+class ProxyBase : public ARDOUR::SessionHandlePtr, public sigc::trackable {
+  public:
+    ProxyBase (const std::string& name, const std::string& menu_name);
+    ProxyBase (const std::string& name, const std::string& menu_name, const XMLNode&);
+    virtual ~ProxyBase();
+
+    void show ();
+    void show_all ();
+    void hide ();
+    void present ();
+    void maybe_show ();
+
+    bool visible() const { return _visible; }
+    const std::string& name() const { return _name; }
+    const std::string& menu_name() const { return _menu_name; }
+
+    std::string action_name() const;
+    void set_action (Glib::RefPtr<Gtk::Action>);
+    Glib::RefPtr<Gtk::Action> action() const { return _action; };
+
+    void drop_window ();
+    void use_window (Gtk::Window&);
+
+    virtual Gtk::Window* get (bool create = false) = 0;
+
+    virtual void toggle ();
+
+    void set_state (const XMLNode&);
+    XMLNode& get_state () const;
+
+    virtual ARDOUR::SessionHandlePtr* session_handle () = 0;
+
+    operator bool() const { return _window != 0; }
 
-    WindowManager();
-    ~WindowManager();
+  protected:
+    std::string  _name;
+    std::string  _menu_name;
+    Glib::RefPtr<Gtk::Action> _action;
+    Gtk::Window* _window;
+    mutable bool _visible; ///< true if the window should be visible on startup
+    mutable int  _x_off; ///< x position
+    mutable int  _y_off; ///< y position
+    mutable int  _width; ///< width
+    mutable int  _height; ///< height
+    Gtkmm2ext::VisibilityTracker* vistracker;
 
-    static WindowManager* _instance;
+    void save_pos_and_size ();
+    bool delete_event_handler (GdkEventAny *ev);
+
+    void setup ();
+};
+
+class ProxyTemporary: public ProxyBase {
+  public:
+    ProxyTemporary (const std::string& name, Gtk::Window* win);
+    ~ProxyTemporary();
+
+    Gtk::Window* get (bool create = false) {
+           (void) create;
+           return _window;
+    }
+
+    Gtk::Window* operator->() {
+           return _window;
+    }
+
+    ARDOUR::SessionHandlePtr* session_handle ();
+};
+
+template<typename T>
+class ProxyWithConstructor: public ProxyBase {
+  public:
+    ProxyWithConstructor (const std::string& name, const std::string& menu_name, const boost::function<T*()>& c)
+           : ProxyBase (name, menu_name) , creator (c) {}
+
+    ProxyWithConstructor (const std::string& name, const std::string& menu_name, const boost::function<T*()>& c, const XMLNode* node)
+           : ProxyBase (name, menu_name, *node) , creator (c) {}
+
+    Gtk::Window* get (bool create = false) {
+           if (!_window) {
+                   if (!create) {
+                           return 0;
+                   }
+
+                       _window = dynamic_cast<Gtk::Window*> (creator ());
+
+                   if (_window) {
+                           setup ();
+                   }
+           }
+
+           return _window;
+    }
+
+    T* operator->() {
+           return dynamic_cast<T*> (get (true));
+    }
+
+    ARDOUR::SessionHandlePtr* session_handle () {
+           /* may return null */
+           return dynamic_cast<T*> (_window);
+    }
+
+    void set_session(ARDOUR::Session *s) {
+        SessionHandlePtr::set_session (s);
+        ARDOUR::SessionHandlePtr* sp = session_handle ();
+        if (sp) {
+            sp->set_session (s);
+            dynamic_cast<T*>(_window)->set_session(s);
+        }
+    }
+
+  private:
+    boost::function<T*()>      creator;
 };
 
+template<typename T>
+class Proxy : public ProxyBase {
+  public:
+    Proxy (const std::string& name, const std::string& menu_name)
+           : ProxyBase (name, menu_name) {}
+
+    Proxy (const std::string& name, const std::string& menu_name, const XMLNode* node)
+           : ProxyBase (name, menu_name, *node)  {}
+
+    Gtk::Window* get (bool create = false) {
+           if (!_window) {
+                   if (!create) {
+                           return 0;
+                   }
+
+                   _window = new T ();
+
+                   if (_window) {
+                           setup ();
+                   }
+           }
+
+           return _window;
+    }
+
+    T* operator->() {
+           return dynamic_cast<T*> (get(true));
+    }
+
+    ARDOUR::SessionHandlePtr* session_handle () {
+           /* may return null */
+           return dynamic_cast<T*> (_window);
+    }
+
+    void set_session(ARDOUR::Session *s) {
+        SessionHandlePtr::set_session (s);
+        ARDOUR::SessionHandlePtr* sp = session_handle ();
+        if (sp) {
+            sp->set_session (s);
+            dynamic_cast<T*>(_window)->set_session(s);
+        }
+    }
+
+  private:
+    boost::function<T*()>      creator;
+};
+
+} /* namespace */
+
 #endif /* __gtk2_ardour_window_manager_h__ */