diff options
author | Robin Gareus <robin@gareus.org> | 2017-07-17 04:55:52 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2017-07-17 21:06:04 +0200 |
commit | f9e5e4360e54f5ff5327b4384ee451d86f8dec91 (patch) | |
tree | 6ae86878b9d7db86c101df33559ffec913d9ed19 /libs/gtkmm2ext/tabbable.cc | |
parent | b5e9451bc7be12acc5d81c55cdaa6545837f3181 (diff) |
Move more Gtkmm2ext widgets into libwidget
Diffstat (limited to 'libs/gtkmm2ext/tabbable.cc')
-rw-r--r-- | libs/gtkmm2ext/tabbable.cc | 387 |
1 files changed, 0 insertions, 387 deletions
diff --git a/libs/gtkmm2ext/tabbable.cc b/libs/gtkmm2ext/tabbable.cc deleted file mode 100644 index 8653a6a29d..0000000000 --- a/libs/gtkmm2ext/tabbable.cc +++ /dev/null @@ -1,387 +0,0 @@ -/* - 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 <gtkmm/stock.h> - -#include "gtkmm2ext/tabbable.h" -#include "gtkmm2ext/gtk_ui.h" -#include "gtkmm2ext/utils.h" -#include "gtkmm2ext/visibility_tracker.h" - -#include "pbd/stacktrace.h" - -#include "pbd/i18n.h" - -using namespace Gtkmm2ext; -using namespace Gtk; -using std::string; - -Tabbable::Tabbable (Widget& w, const string& name, bool tabbed_by_default) - : WindowProxy (name) - , _contents (w) - , _parent_notebook (0) - , tab_requested_by_state (tabbed_by_default) -{ -} - -Tabbable::~Tabbable () -{ - if (_window) { - delete _window; - _window = 0; - } -} - -void -Tabbable::add_to_notebook (Notebook& notebook, const string& tab_title) -{ - _parent_notebook = ¬ebook; - - if (tab_requested_by_state) { - attach (); - } -} - -Window* -Tabbable::use_own_window (bool and_pack_it) -{ - Gtk::Window* win = get (true); - - if (and_pack_it) { - Gtk::Container* parent = _contents.get_parent(); - if (parent) { - _contents.hide (); - parent->remove (_contents); - } - _own_notebook.append_page (_contents); - _contents.show (); - } - - return win; - -} - -bool -Tabbable::window_visible () const -{ - if (!_window) { - return false; - } - - return _window->is_visible(); -} - -Window* -Tabbable::get (bool create) -{ - if (_window) { - return _window; - } - - if (!create) { - return 0; - } - - /* From here on, we're creating the window - */ - - if ((_window = new Window (WINDOW_TOPLEVEL)) == 0) { - return 0; - } - - _window->add (_own_notebook); - _own_notebook.show (); - _own_notebook.set_show_tabs (false); - - _window->signal_map().connect (sigc::mem_fun (*this, &Tabbable::window_mapped)); - _window->signal_unmap().connect (sigc::mem_fun (*this, &Tabbable::window_unmapped)); - - /* do other window-related setup */ - - setup (); - - /* window should be ready for derived classes to do something with it */ - - return _window; -} - -void -Tabbable::show_own_window (bool and_pack_it) -{ - Gtk::Widget* parent = _contents.get_parent(); - Gtk::Allocation alloc; - - if (parent) { - alloc = parent->get_allocation(); - } - - (void) use_own_window (and_pack_it); - - if (parent) { - _window->set_default_size (alloc.get_width(), alloc.get_height()); - } - - tab_requested_by_state = false; - - _window->present (); -} - -Gtk::Notebook* -Tabbable::tab_root_drop () -{ - /* This is called after a drop of a tab onto the root window. Its - * 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. - */ - - show_own_window (false); - return &_own_notebook; -} - -void -Tabbable::show_window () -{ - make_visible (); - - if (_window && (current_toplevel() == _window)) { - if (!_visible) { /* was hidden, update status */ - set_pos_and_size (); - } - } -} - -/** If this Tabbable is currently parented by a tab, ensure that the tab is the - * current one. If it is parented by a window, then toggle the visibility of - * that window. - */ -void -Tabbable::change_visibility () -{ - if (tabbed()) { - _parent_notebook->set_current_page (_parent_notebook->page_num (_contents)); - return; - } - - if (tab_requested_by_state) { - /* should be tabbed, but currently isn't parented by a notebook */ - return; - } - - if (_window && (current_toplevel() == _window)) { - /* Use WindowProxy method which will rotate then hide */ - toggle(); - } -} - -void -Tabbable::make_visible () -{ - if (_window && (current_toplevel() == _window)) { - set_pos (); - _window->present (); - } else { - - if (!tab_requested_by_state) { - show_own_window (true); - } 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 () -{ - if (!_parent_notebook) { - return; - } - - if (tabbed()) { - /* already tabbed */ - return; - } - - - if (_window && current_toplevel() == _window) { - /* unpack Tabbable from parent, put it back in the main tabbed - * notebook - */ - - save_pos_and_size (); - - _contents.hide (); - _contents.get_parent()->remove (_contents); - - /* leave the window around */ - - _window->hide (); - } - - _parent_notebook->append_page (_contents); - _parent_notebook->set_tab_detachable (_contents); - _parent_notebook->set_tab_reorderable (_contents); - _parent_notebook->set_current_page (_parent_notebook->page_num (_contents)); - _contents.show (); - - /* have to force this on, which is semantically correct, since - * the user has effectively asked for it. - */ - - tab_requested_by_state = true; - StateChange (*this); -} - -bool -Tabbable::delete_event_handler (GdkEventAny *ev) -{ - _window->hide(); - - return true; -} - -bool -Tabbable::tabbed () const -{ - if (_window && (current_toplevel() == _window)) { - return false; - } - - if (_parent_notebook && (_parent_notebook->page_num (_contents) >= 0)) { - return true; - } - - return false; -} - -void -Tabbable::hide_tab () -{ - if (tabbed()) { - _contents.hide(); - _parent_notebook->remove_page (_contents); - StateChange (*this); - } -} - -void -Tabbable::show_tab () -{ - if (!window_visible() && _parent_notebook) { - if (_contents.get_parent() == 0) { - tab_requested_by_state = true; - add_to_notebook (*_parent_notebook, _tab_title); - } - _parent_notebook->set_current_page (_parent_notebook->page_num (_contents)); - _contents.show (); - current_toplevel()->present (); - } -} - -Gtk::Window* -Tabbable::current_toplevel () const -{ - return dynamic_cast<Gtk::Window*> (contents().get_toplevel()); -} - -string -Tabbable::xml_node_name() -{ - return WindowProxy::xml_node_name(); -} - -bool -Tabbable::tabbed_by_default() const -{ - return tab_requested_by_state; -} - -XMLNode& -Tabbable::get_state() -{ - XMLNode& node (WindowProxy::get_state()); - - node.set_property (X_("tabbed"), tabbed()); - - return node; -} - -int -Tabbable::set_state (const XMLNode& node, int version) -{ - int ret; - - if ((ret = WindowProxy::set_state (node, version)) != 0) { - return ret; - } - - if (_visible) { - show_own_window (true); - } - - XMLNodeList children = node.children (); - XMLNode* window_node = node.child ("Window"); - - if (window_node) { - window_node->get_property (X_("tabbed"), tab_requested_by_state); - } - - if (!_visible) { - if (tab_requested_by_state) { - attach (); - } else { - /* this does nothing if not tabbed */ - hide_tab (); - } - } - - return ret; -} - -void -Tabbable::window_mapped () -{ - StateChange (*this); -} - -void -Tabbable::window_unmapped () -{ - StateChange (*this); -} |