From fd938d95bfd37f2ae428938c8efee55e9196fd4f Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Wed, 22 Jul 2015 15:22:23 -0400 Subject: [PATCH] change/extend Tabbable API to allow for show/hide/attach/detach --- libs/gtkmm2ext/gtkmm2ext/tabbable.h | 8 ++ libs/gtkmm2ext/tabbable.cc | 140 ++++++++++++++++++---------- 2 files changed, 100 insertions(+), 48 deletions(-) diff --git a/libs/gtkmm2ext/gtkmm2ext/tabbable.h b/libs/gtkmm2ext/gtkmm2ext/tabbable.h index 9d3a66adcb..e47c94f095 100644 --- a/libs/gtkmm2ext/gtkmm2ext/tabbable.h +++ b/libs/gtkmm2ext/gtkmm2ext/tabbable.h @@ -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 diff --git a/libs/gtkmm2ext/tabbable.cc b/libs/gtkmm2ext/tabbable.cc index 34979d6bbe..01f3ae4394 100644 --- a/libs/gtkmm2ext/tabbable.cc +++ b/libs/gtkmm2ext/tabbable.cc @@ -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 (_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 (); - } -} -- 2.30.2