summaryrefslogtreecommitdiff
path: root/libs/gtkmm2ext/tabbable.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2015-07-03 15:06:29 -0400
committerPaul Davis <paul@linuxaudiosystems.com>2016-02-22 15:31:21 -0500
commita29f76c1c45e112279d9cb0a002f41d0fb9155ab (patch)
tree25e5ceec3fa2a17b0cbaa09ecf6cc5d85c474425 /libs/gtkmm2ext/tabbable.cc
parentdf05e97288b48f10d9133d0dd9e56a156a5c3287 (diff)
initial versions of Tabbable object
Diffstat (limited to 'libs/gtkmm2ext/tabbable.cc')
-rw-r--r--libs/gtkmm2ext/tabbable.cc165
1 files changed, 165 insertions, 0 deletions
diff --git a/libs/gtkmm2ext/tabbable.cc b/libs/gtkmm2ext/tabbable.cc
new file mode 100644
index 0000000000..123649036a
--- /dev/null
+++ b/libs/gtkmm2ext/tabbable.cc
@@ -0,0 +1,165 @@
+/*
+ Copyright (C) 2015 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include <gtkmm/action.h>
+#include <gtkmm/notebook.h>
+#include <gtkmm/window.h>
+
+#include "gtkmm2ext/tabbable.h"
+#include "gtkmm2ext/visibility_tracker.h"
+
+using namespace Gtkmm2ext;
+using namespace Gtk;
+using std::string;
+
+Tabbable::Tabbable (Widget& w)
+ : _contents (w)
+{
+}
+
+Tabbable::~Tabbable ()
+{
+ if (_window) {
+ delete _window;
+ _window = 0;
+ }
+}
+
+void
+Tabbable::add_to_notebook (Notebook& notebook, const string& tab_title, int position)
+{
+ notebook.insert_page (_contents, tab_title, position, false);
+ notebook.set_tab_detachable (_contents);
+
+ _parent_notebook = &notebook;
+ _tab_title = tab_title;
+ _notebook_position = position;
+}
+
+Window*
+Tabbable::use_own_window ()
+{
+ return get (true);
+}
+
+bool
+Tabbable::window_visible ()
+{
+ if (!own_window()) {
+ return false;
+ }
+
+ return visible();
+}
+
+Window*
+Tabbable::get (bool create)
+{
+ if (_window) {
+ return _window;
+ }
+
+ if (!create) {
+ return 0;
+ }
+
+ if ((_window = new Window (WINDOW_TOPLEVEL)) == 0) {
+ return 0;
+ }
+
+ /* allow parent window to become the key focus window */
+ _window->set_flags (CAN_FOCUS);
+
+ return _window;
+}
+
+void
+Tabbable::show_window ()
+{
+ Window* toplevel = dynamic_cast<Window*> (_contents.get_toplevel());
+
+ if (toplevel == _window) {
+ _window->present ();
+ }
+
+ if (!_visible) { /* was hidden, update status */
+ set_pos_and_size ();
+ }
+
+ if (toplevel != _window) {
+ /* not in its own window, just switch parent notebook to show
+ this Tabbable.
+ */
+ if (_parent_notebook) {
+ _parent_notebook->set_current_page (_notebook_position);
+ }
+ }
+}
+
+bool
+Tabbable::delete_event_handler (GdkEventAny *ev)
+{
+ Window* toplevel = dynamic_cast<Window*> (_contents.get_toplevel());
+
+ if (_window == toplevel) {
+
+ /* 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->insert_page (_contents, _tab_title, _notebook_position);
+ _parent_notebook->set_tab_detachable (_contents);
+ }
+
+ show_all ();
+
+ /* don't let anything else handle this */
+
+ return true;
+ }
+
+ /* nothing to do */
+ return false;
+}
+
+bool
+Tabbable::is_tabbed () const
+{
+ Window* toplevel = (Window*) _contents.get_toplevel();
+
+ if (_window && (toplevel == _window)) {
+ return false;
+ }
+
+ if (_parent_notebook) {
+ return true;
+ }
+
+ return false;
+}