summaryrefslogtreecommitdiffstats
path: root/src/ui/widget/toolbox.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/widget/toolbox.cpp')
-rw-r--r--src/ui/widget/toolbox.cpp269
1 files changed, 269 insertions, 0 deletions
diff --git a/src/ui/widget/toolbox.cpp b/src/ui/widget/toolbox.cpp
new file mode 100644
index 000000000..e90a58b6e
--- /dev/null
+++ b/src/ui/widget/toolbox.cpp
@@ -0,0 +1,269 @@
+/**
+ * \brief Toolbox Widget - A detachable toolbar for buttons and other widgets.
+ *
+ * Author:
+ * Derek P. Moore <derekm@hackunix.org>
+ *
+ * Copyright (C) 2004 Derek P. Moore
+ *
+ * Released under GNU GPL. Read the file 'COPYING' for more information.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <gtkmm/radioaction.h>
+#include <gtk/gtkmain.h>
+#include "ui/widget/toolbox.h"
+#include "path-prefix.h"
+
+namespace Inkscape {
+namespace UI {
+namespace Widget {
+
+Toolbox::Toolbox(Gtk::Toolbar *toolbar,
+ Gtk::Orientation orientation)
+ : HandleBox(toolbar)
+{
+ init_actions();
+ init_orientation(orientation);
+ init_style(toolbar->get_toolbar_style());
+}
+
+Toolbox::Toolbox(Gtk::Toolbar *toolbar,
+ Gtk::ToolbarStyle style,
+ Gtk::Orientation orientation)
+ : HandleBox(toolbar)
+{
+ init_actions();
+ init_orientation(orientation);
+ init_style(style);
+}
+
+Gtk::Toolbar&
+Toolbox::get_toolbar()
+{
+ return static_cast<Gtk::Toolbar&>(*_widget);
+}
+
+static Glib::ustring
+get_uidir_filename(char const *basename_utf8)
+{
+ char *const ret_str = g_build_filename(INKSCAPE_UIDIR, basename_utf8, NULL);
+ Glib::ustring const ret(ret_str);
+ g_free(ret_str);
+ return ret;
+}
+
+void
+Toolbox::init_actions()
+{
+ _action_grp = Gtk::ActionGroup::create();
+
+ Gtk::RadioAction::Group icons;
+ _action_grp->add(Gtk::RadioAction::create(icons, "Icons", "Icons Only"),
+ sigc::mem_fun(*this, &Toolbox::on_change_style_icons));
+ _action_grp->add(Gtk::RadioAction::create(icons, "Text", "Text Only"),
+ sigc::mem_fun(*this, &Toolbox::on_change_style_text));
+ _action_grp->add(Gtk::RadioAction::create(icons, "Both", "Text Below Icons"),
+ sigc::mem_fun(*this, &Toolbox::on_change_style_both));
+ _action_grp->add(Gtk::RadioAction::create(icons, "BothHoriz", "Text Beside Icons"),
+ sigc::mem_fun(*this, &Toolbox::on_change_style_both_horiz));
+
+ _detach_grp = Gtk::ActionGroup::create();
+
+ Gtk::RadioAction::Group orient;
+ _detach_grp->add(Gtk::RadioAction::create(orient, "OrientHoriz", "Horizontal"),
+ sigc::mem_fun(*this, &Toolbox::on_change_orient_horiz));
+ _detach_grp->add(Gtk::RadioAction::create(orient, "OrientVert", "Vertical"),
+ sigc::mem_fun(*this, &Toolbox::on_change_orient_vert));
+
+ _detach_grp->add(Gtk::ToggleAction::create("ShowArrow", "Show Arrow",
+ Glib::ustring(), true),
+ sigc::mem_fun(*this, &Toolbox::on_show_arrow));
+
+ _ui_mgr = Gtk::UIManager::create();
+ _ui_mgr->insert_action_group(_action_grp);
+ _ui_mgr->insert_action_group(_detach_grp);
+ _ui_mgr->add_ui_from_file(get_uidir_filename("toolbox.xml"));
+
+ _context_menu = static_cast<Gtk::Menu*>(_ui_mgr->get_widget("/ToolboxMenu"));
+
+ static_cast<Gtk::Toolbar*>(_widget)->signal_popup_context_menu()
+ .connect(sigc::mem_fun(*this, &Toolbox::on_popup_context_menu));
+
+ _detach_grp->set_sensitive(false);
+}
+
+void
+Toolbox::init_orientation(Gtk::Orientation const &orientation)
+{
+ static_cast<Gtk::Toolbar*>(_widget)->set_orientation(orientation);
+ if (orientation == Gtk::ORIENTATION_VERTICAL) {
+ set_handle_position(Gtk::POS_TOP);
+ }
+ switch (orientation) {
+ case Gtk::ORIENTATION_HORIZONTAL: {
+ Glib::RefPtr<Gtk::RadioAction>::cast_static(_detach_grp->get_action("OrientHoriz"))
+ ->set_active();
+ break;
+ }
+ case Gtk::ORIENTATION_VERTICAL: {
+ Glib::RefPtr<Gtk::RadioAction>::cast_static(_detach_grp->get_action("OrientVert"))
+ ->set_active();
+ break;
+ }
+ }
+}
+
+void
+Toolbox::init_style(Gtk::ToolbarStyle const &style)
+{
+ switch (style) {
+ case Gtk::TOOLBAR_ICONS: {
+ Glib::RefPtr<Gtk::RadioAction>::cast_static(_action_grp->get_action("Icons"))
+ ->activate();
+ break;
+ }
+ case Gtk::TOOLBAR_TEXT: {
+ Glib::RefPtr<Gtk::RadioAction>::cast_static(_action_grp->get_action("Text"))
+ ->activate();
+ break;
+ }
+ case Gtk::TOOLBAR_BOTH: {
+ Glib::RefPtr<Gtk::RadioAction>::cast_static(_action_grp->get_action("Both"))
+ ->activate();
+ break;
+ }
+ case Gtk::TOOLBAR_BOTH_HORIZ: {
+ Glib::RefPtr<Gtk::RadioAction>::cast_static(_action_grp->get_action("BothHoriz"))
+ ->activate();
+ break;
+ }
+ }
+}
+
+bool
+Toolbox::on_popup_context_menu(int x, int y, int button)
+{
+ (void)x;
+ (void)y;
+ _context_menu->popup(button, gtk_get_current_event_time());
+ return true;
+}
+
+void
+Toolbox::on_child_attached(Gtk::Widget *widget)
+{
+ (void)widget;
+ Gtk::Toolbar *toolbar = static_cast<Gtk::Toolbar*>(_widget);
+
+ if (!(toolbar->get_show_arrow())) {
+ Glib::RefPtr<Gtk::RadioAction>::cast_static(_detach_grp->get_action("ShowArrow"))
+ ->activate();
+ }
+
+ if (get_handle_position() == Gtk::POS_LEFT
+ && toolbar->get_orientation() != Gtk::ORIENTATION_HORIZONTAL) {
+ Glib::RefPtr<Gtk::RadioAction>::cast_static(_detach_grp->get_action("OrientHoriz"))
+ ->activate();
+ } else if (get_handle_position() == Gtk::POS_TOP
+ && toolbar->get_orientation() != Gtk::ORIENTATION_VERTICAL) {
+ Glib::RefPtr<Gtk::RadioAction>::cast_static(_detach_grp->get_action("OrientVert"))
+ ->activate();
+ }
+
+ _detach_grp->set_sensitive(false);
+}
+
+void
+Toolbox::on_child_detached(Gtk::Widget *widget)
+{
+ (void)widget;
+ _detach_grp->set_sensitive(true);
+
+ Glib::RefPtr<Gtk::RadioAction>::cast_static(_detach_grp->get_action("ShowArrow"))
+ ->set_active(false);
+}
+
+void
+Toolbox::on_change_style_icons()
+{
+ Glib::RefPtr<Gtk::RadioAction> action = Glib::RefPtr<Gtk::RadioAction>::cast_static(_action_grp->get_action("Icons"));
+ if (action->get_active()) {
+ static_cast<Gtk::Toolbar*>(_widget)->set_toolbar_style(Gtk::TOOLBAR_ICONS);
+ }
+}
+
+void
+Toolbox::on_change_style_text()
+{
+ Glib::RefPtr<Gtk::RadioAction> action = Glib::RefPtr<Gtk::RadioAction>::cast_static(_action_grp->get_action("Text"));
+ if (action->get_active()) {
+ static_cast<Gtk::Toolbar*>(_widget)->set_toolbar_style(Gtk::TOOLBAR_TEXT);
+ }
+}
+
+void
+Toolbox::on_change_style_both()
+{
+ Glib::RefPtr<Gtk::RadioAction> action = Glib::RefPtr<Gtk::RadioAction>::cast_static(_action_grp->get_action("Both"));
+ if (action->get_active()) {
+ static_cast<Gtk::Toolbar*>(_widget)->set_toolbar_style(Gtk::TOOLBAR_BOTH);
+ }
+}
+
+void
+Toolbox::on_change_style_both_horiz()
+{
+ Glib::RefPtr<Gtk::RadioAction> action = Glib::RefPtr<Gtk::RadioAction>::cast_static(_action_grp->get_action("BothHoriz"));
+ if (action->get_active()) {
+ static_cast<Gtk::Toolbar*>(_widget)->set_toolbar_style(Gtk::TOOLBAR_BOTH_HORIZ);
+ }
+}
+
+void
+Toolbox::on_change_orient_horiz()
+{
+ Glib::RefPtr<Gtk::RadioAction> action = Glib::RefPtr<Gtk::RadioAction>::cast_static(_detach_grp->get_action("OrientHoriz"));
+ if (action->get_active()) {
+ static_cast<Gtk::Toolbar*>(_widget)->set_orientation(Gtk::ORIENTATION_HORIZONTAL);
+ }
+}
+
+void
+Toolbox::on_change_orient_vert()
+{
+ Glib::RefPtr<Gtk::RadioAction> action = Glib::RefPtr<Gtk::RadioAction>::cast_static(_detach_grp->get_action("OrientVert"));
+ if (action->get_active()) {
+ static_cast<Gtk::Toolbar*>(_widget)->set_orientation(Gtk::ORIENTATION_VERTICAL);
+ }
+}
+
+void
+Toolbox::on_show_arrow()
+{
+ Glib::RefPtr<Gtk::RadioAction> action = Glib::RefPtr<Gtk::RadioAction>::cast_static(_detach_grp->get_action("ShowArrow"));
+ Gtk::Toolbar *toolbar = static_cast<Gtk::Toolbar*>(_widget);
+ if (action->get_active()) {
+ toolbar->set_show_arrow(true);
+ } else {
+ toolbar->set_show_arrow(false);
+ }
+}
+
+} // namespace Widget
+} // namespace UI
+} // namespace Inkscape
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=c++:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :