change/extend Tabbable API to allow for show/hide/attach/detach
authorPaul Davis <paul@linuxaudiosystems.com>
Wed, 22 Jul 2015 19:22:23 +0000 (15:22 -0400)
committerPaul Davis <paul@linuxaudiosystems.com>
Mon, 22 Feb 2016 20:31:22 +0000 (15:31 -0500)
libs/gtkmm2ext/gtkmm2ext/tabbable.h
libs/gtkmm2ext/tabbable.cc

index 9d3a66adcb57eb5c9e8e572e764daa1b1fd4fe07..e47c94f0953b97cda1715d9235cf491fd0df7b9a 100644 (file)
@@ -46,6 +46,9 @@ class LIBGTKMM2EXT_API Tabbable : public WindowProxy {
 
        void add_to_notebook (Gtk::Notebook& notebook, const std::string& tab_title);
        void make_visible ();
+       void make_invisible ();
+       void attach ();
+       void detach ();
        
        Gtk::Widget& contents() const { return _contents; }
        
@@ -56,6 +59,8 @@ class LIBGTKMM2EXT_API Tabbable : public WindowProxy {
        bool has_own_window () const;
        bool is_tabbed () const;
 
+       void set_allow_hide (bool);
+       
        virtual void show_window ();
 
        bool window_visible ();
@@ -83,9 +88,12 @@ class LIBGTKMM2EXT_API Tabbable : public WindowProxy {
        CairoIcon       tab_close_image;
        
        void show_tab ();
+       void hide_tab ();
        void tab_close_clicked ();
+       void show_own_window (bool and_pack_it);
 };
 
+
 }
 
 #endif
index 34979d6bbe6f6bd7dd978a53c6d24883cd196c80..01f3ae43947ca3cba2a9c2f2e4be506f5e6ab27b 100644 (file)
@@ -58,18 +58,21 @@ Tabbable::~Tabbable ()
 }
 
 void
-Tabbable::tab_close_clicked ()
+Tabbable::set_allow_hide (bool yn)
 {
-       /* for this to happen, the tab must be visible so we
-          can assume that the contents are displayed in the
-          parent notebook
-       */
-       
-       if (_parent_notebook) {
-               _parent_notebook->remove_page (_contents);
+       if (yn) {
+               tab_close_image.show ();
+       } else {
+               tab_close_image.hide ();
        }
 }
 
+void
+Tabbable::tab_close_clicked ()
+{
+       hide_tab ();
+}
+
 void
 Tabbable::add_to_notebook (Notebook& notebook, const string& tab_title)
 {
@@ -147,26 +150,37 @@ Tabbable::get (bool create)
        return _window;
 }
 
-Gtk::Notebook*
-Tabbable::tab_root_drop ()
+void
+Tabbable::show_own_window (bool and_pack_it)
 {
+       Gtk::Widget* parent = _contents.get_parent();
        Gtk::Allocation alloc;
 
-       alloc = _contents.get_parent()->get_allocation();
+       if (parent) {
+               alloc = parent->get_allocation();
+       }
        
-       (void) use_own_window (false);
+       (void) use_own_window (and_pack_it);
        
+       if (parent) {
+               _window->set_default_size (alloc.get_width(), alloc.get_height());
+       }
+
+       _window->show_all ();
+       _window->present ();
+}
+
+Gtk::Notebook*
+Tabbable::tab_root_drop ()
+{
        /* This is called after a drop of a tab onto the root window. Its
-        * responsibility is to return the notebook that this Tabbable's
+        * responsibility xois to return the notebook that this Tabbable's
         * contents should be packed into before the drop handling is
         * completed. It is not responsible for actually taking care of this
         * packing.
         */
 
-       _window->set_default_size (alloc.get_width(), alloc.get_height());
-       _window->show_all ();
-       _window->present ();
-
+       show_own_window (false);
        return &_own_notebook;
 }
 
@@ -182,40 +196,71 @@ Tabbable::show_window ()
        }
 }
 
-bool
-Tabbable::delete_event_handler (GdkEventAny *ev)
+void
+Tabbable::make_visible ()
+{
+       if (_window && (current_toplevel() == _window)) {
+               _window->present ();
+       } else {
+               show_tab ();
+       }
+}
+
+void
+Tabbable::make_invisible ()
+{
+       if (_window && (current_toplevel() == _window)) {
+               _window->hide ();
+       } else {
+               hide_tab ();
+       }
+}
+       
+void
+Tabbable::detach ()
+{
+       show_own_window (true);
+}
+
+void
+Tabbable::attach ()
 {
-       Window* toplevel = dynamic_cast<Window*> (_contents.get_toplevel());
+       if (!_parent_notebook) {
+               return;
+       }
+       
+       if (_parent_notebook->page_num (_contents) >= 0) {
+               /* already tabbed */
+               return;
+       }
 
-       if (_window == toplevel) {
 
+       if (_window && current_toplevel() == _window) {
                /* unpack Tabbable from parent, put it back in the main tabbed
                 * notebook
                 */
-
+               
                save_pos_and_size ();
-
+               
                _contents.get_parent()->remove (_contents);
-
+       
                /* leave the window around */
-
-               _window->hide ();
                
-               if (_parent_notebook) {
-
-                       _parent_notebook->append_page (_contents, _tab_box);
-                       _parent_notebook->set_tab_detachable (_contents);
-                       _parent_notebook->set_tab_reorderable (_contents);
-                       _parent_notebook->set_current_page (_parent_notebook->page_num (_contents));
-               }
+               _window->hide ();
+       }
+       
+       _parent_notebook->append_page (_contents, _tab_box);
+       _parent_notebook->set_tab_detachable (_contents);
+       _parent_notebook->set_tab_reorderable (_contents);
+       _parent_notebook->set_current_page (_parent_notebook->page_num (_contents));
+}
 
-               /* don't let anything else handle this */
-               
-               return true;
-       } 
+bool
+Tabbable::delete_event_handler (GdkEventAny *ev)
+{
+       _window->hide();
 
-       /* nothing to do */
-       return false;
+       return true;
 }
 
 bool
@@ -234,6 +279,14 @@ Tabbable::is_tabbed () const
        return false;
 }
 
+void
+Tabbable::hide_tab ()
+{
+       if (_parent_notebook) {
+               _parent_notebook->remove_page (_contents);
+       }
+}
+
 void
 Tabbable::show_tab ()
 {
@@ -281,12 +334,3 @@ Tabbable::set_state (const XMLNode& node, int version)
        return ret;
 }
 
-void
-Tabbable::make_visible ()
-{
-       if (_window && (current_toplevel() == _window)) {
-               _window->present ();
-       } else {
-               show_tab ();
-       }
-}