summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2015-07-22 15:22:23 -0400
committerPaul Davis <paul@linuxaudiosystems.com>2016-02-22 15:31:22 -0500
commitfd938d95bfd37f2ae428938c8efee55e9196fd4f (patch)
treede0e084c964f46e13f8442d59a77e7ab88ef40a6
parent73a22be077413f47258994db06c9e17e1572976c (diff)
change/extend Tabbable API to allow for show/hide/attach/detach
-rw-r--r--libs/gtkmm2ext/gtkmm2ext/tabbable.h8
-rw-r--r--libs/gtkmm2ext/tabbable.cc140
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,19 +58,22 @@ 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)
{
_tab_label.set_text (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
@@ -235,6 +280,14 @@ Tabbable::is_tabbed () const
}
void
+Tabbable::hide_tab ()
+{
+ if (_parent_notebook) {
+ _parent_notebook->remove_page (_contents);
+ }
+}
+
+void
Tabbable::show_tab ()
{
if (!window_visible() && _parent_notebook) {
@@ -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 ();
- }
-}