From 839371c1ab15c18476f3f341f0fda29bd8c29478 Mon Sep 17 00:00:00 2001 From: Ivan Mahonin Date: Oct 15 2013 06:01:58 +0000 Subject: Convert Toolbox from Gtk::Window to Dockable --- diff --git a/synfig-studio/src/gui/Makefile.am b/synfig-studio/src/gui/Makefile.am index 4aa285e..a22a4f5 100644 --- a/synfig-studio/src/gui/Makefile.am +++ b/synfig-studio/src/gui/Makefile.am @@ -60,7 +60,6 @@ OTHER_HH = \ render.h \ splash.h \ statemanager.h \ - toolbox.h \ valuelink.h \ workarea.h \ mainwindow.h @@ -85,7 +84,6 @@ OTHER_CC = \ render.cpp \ splash.cpp \ statemanager.cpp \ - toolbox.cpp \ valuelink.cpp \ workarea.cpp \ mainwindow.cpp diff --git a/synfig-studio/src/gui/app.cpp b/synfig-studio/src/gui/app.cpp index 9d036da..cd216c9 100644 --- a/synfig-studio/src/gui/app.cpp +++ b/synfig-studio/src/gui/app.cpp @@ -79,7 +79,7 @@ #include "dialogs/dialog_gradient.h" #include "dialogs/dialog_color.h" #include "mainwindow.h" -#include "toolbox.h" +#include "docks/dock_toolbox.h" #include "onemoment.h" #include "docks/dockmanager.h" @@ -241,7 +241,7 @@ studio::About *studio::App::about=NULL; studio::MainWindow *studio::App::main_window=NULL; -studio::Toolbox *studio::App::toolbox=NULL; +studio::Dock_Toolbox *studio::App::dock_toolbox=NULL; studio::AutoRecover *studio::App::auto_recover=NULL; @@ -1361,7 +1361,8 @@ App::App(const synfig::String& basepath, int *argc, char ***argv): studio_init_cb.task(_("Init Toolbox...")); - toolbox=new studio::Toolbox(); + dock_toolbox=new studio::Dock_Toolbox(); + dock_manager->register_dockable(*dock_toolbox); studio_init_cb.task(_("Init About Dialog...")); about=new studio::About(); @@ -1549,7 +1550,7 @@ App::App(const synfig::String& basepath, int *argc, char ***argv): dock_manager->show_all_dock_dialogs(); main_window->present(); - toolbox->present(); + dock_toolbox->present(); splash_screen.hide(); @@ -1595,9 +1596,7 @@ App::~App() delete main_window; - toolbox->hide(); - - delete toolbox; + delete dock_toolbox; delete dialog_setup; diff --git a/synfig-studio/src/gui/app.h b/synfig-studio/src/gui/app.h index 8325cb1..d060c7d 100644 --- a/synfig-studio/src/gui/app.h +++ b/synfig-studio/src/gui/app.h @@ -88,7 +88,6 @@ typedef Gtk::UIManager UIManager; class About; class MainWindow; -class Toolbox; class Instance; class CanvasView; class Dialog_Setup; @@ -100,6 +99,7 @@ class AutoRecover; class DockManager; +class Dock_Toolbox; class Dock_History; class Dock_Canvases; @@ -200,7 +200,7 @@ public: static About *about; static MainWindow *main_window; - static Toolbox *toolbox; + static Dock_Toolbox *dock_toolbox; static std::list > instance_list; diff --git a/synfig-studio/src/gui/canvasview.cpp b/synfig-studio/src/gui/canvasview.cpp index 38a824c..a1b43ed 100644 --- a/synfig-studio/src/gui/canvasview.cpp +++ b/synfig-studio/src/gui/canvasview.cpp @@ -99,7 +99,7 @@ #include "event_layerclick.h" #include "mainwindow.h" -#include "toolbox.h" +#include "docks/dock_toolbox.h" #include "dialogs/dialog_preview.h" #include "dialogs/dialog_soundselect.h" @@ -3945,7 +3945,7 @@ CanvasView::on_input_device_changed(GdkDevice* device) synfigapp::InputDevice::Handle input_device; input_device=synfigapp::Main::select_input_device(device->name); - App::toolbox->change_state(input_device->get_state()); + App::dock_toolbox->change_state(input_device->get_state()); process_event_key(EVENT_INPUT_DEVICE_CHANGED); } diff --git a/synfig-studio/src/gui/docks/Makefile_insert b/synfig-studio/src/gui/docks/Makefile_insert index 279d3ba..e386750 100644 --- a/synfig-studio/src/gui/docks/Makefile_insert +++ b/synfig-studio/src/gui/docks/Makefile_insert @@ -13,6 +13,7 @@ DOCKS_HH = \ docks/dock_navigator.h \ docks/dock_params.h \ docks/dock_timetrack.h \ + docks/dock_toolbox.h \ docks/dockable.h \ docks/dockbook.h \ docks/dockdialog.h \ @@ -34,6 +35,7 @@ DOCKS_CC = \ docks/dock_navigator.cpp \ docks/dock_params.cpp \ docks/dock_timetrack.cpp \ + docks/dock_toolbox.cpp \ docks/dockable.cpp \ docks/dockbook.cpp \ docks/dockdialog.cpp \ diff --git a/synfig-studio/src/gui/docks/dock_toolbox.cpp b/synfig-studio/src/gui/docks/dock_toolbox.cpp new file mode 100644 index 0000000..eabbed0 --- /dev/null +++ b/synfig-studio/src/gui/docks/dock_toolbox.cpp @@ -0,0 +1,491 @@ +/* === S Y N F I G ========================================================= */ +/*! \file dock_toolbox.cpp +** \brief writeme +** +** $Id$ +** +** \legal +** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley +** Copyright (c) 2007, 2008 Chris Moore +** Copyright (c) 2008 Paul Wise +** Copyright (c) 2009 Nikita Kitaev +** +** This package 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 package 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. +** \endlegal +** +** === N O T E S =========================================================== +** +** ========================================================================= */ + +/* === H E A D E R S ======================================================= */ + +#ifdef USING_PCH +# include "pch.h" +#else +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include + +#include + +#include "docks/dock_toolbox.h" +#include "instance.h" +#include "app.h" +#include "canvasview.h" +#include "dialogs/dialog_gradient.h" +#include "dialogs/dialog_color.h" +#include "docks/dialog_tooloptions.h" +#include "dialogs/dialog_preview.h" +#include "docks/dockable.h" +#include "docks/dockmanager.h" +#include "docks/dockdialog.h" + +#include "widgets/widget_defaults.h" + +#include + +#include "general.h" + +#endif + +using namespace std; +using namespace etl; +using namespace synfig; +using namespace studio; +using namespace sigc; + +/* === M A C R O S ========================================================= */ + +/* === G L O B A L S ======================================================= */ + +/* === P R O C E D U R E S ================================================= */ + +/* === M E T H O D S ======================================================= */ + +#define TOGGLE_TOOLBOX_BUTTON(button,stockid,tooltip) \ + button = manage(new class Gtk::ToggleButton()); \ + icon=manage(new Gtk::Image(Gtk::StockID(stockid),Gtk::IconSize(4))); \ + button->add(*icon); \ + button->set_tooltip_text(tooltip); \ + icon->show(); \ + button->show() + +#define TOOLBOX_BUTTON(button,stockid,tooltip) \ + button = manage(new class Gtk::Button()); \ + icon=manage(new Gtk::Image(Gtk::StockID(stockid),Gtk::IconSize(4))); \ + button->add(*icon); \ + button->set_tooltip_text(tooltip); \ + icon->show(); \ + button->show() + +#define ADD_TOOLBOX_BUTTON(button,stockid,tooltip) Gtk::Button *TOOLBOX_BUTTON(button,stockid,tooltip) + +void +save_selected_instance() +{ + if(!studio::App::get_selected_instance()) + { + App::dialog_error_blocking(_("Cannot save"),_("Nothing to save")); + return; + } + + studio::App::get_selected_instance()->save(); +} + +void +save_as_selected_instance() +{ + if(!studio::App::get_selected_instance()) + { + App::dialog_error_blocking(_("Cannot save as"),_("Nothing to save")); + return; + } + + studio::App::get_selected_instance()->dialog_save_as(); +} + +void +save_all() +{ + std::list >::iterator iter; + for(iter=App::instance_list.begin();iter!=App::instance_list.end();iter++) + (*iter)->save(); +} + +void +close_selected_instance() +{ + etl::handle instance=studio::App::get_selected_instance(); + + if(!instance) + { + App::dialog_error_blocking(_("Cannot close"),_("Nothing to close")); + return; + } + + instance->safe_close(); + + //assert(instance.unique()); +} + +Dock_Toolbox::Dock_Toolbox(): + Dockable("toolbox",_("Toolbox"),Gtk::StockID("synfig-toolbox")) +{ + Gtk::Image *icon; + + ADD_TOOLBOX_BUTTON(button_new,"gtk-new",_("New...")); + ADD_TOOLBOX_BUTTON(button_open,"gtk-open",_("Open...")); + ADD_TOOLBOX_BUTTON(button_save,"gtk-save",_("Save")); + ADD_TOOLBOX_BUTTON(button_saveas,"gtk-save-as",_("Save As...")); + ADD_TOOLBOX_BUTTON(button_save_all,"synfig-saveall",_("Save All")); + TOOLBOX_BUTTON(button_undo,"gtk-undo",_("Undo")); + TOOLBOX_BUTTON(button_redo,"gtk-redo",_("Redo")); + ADD_TOOLBOX_BUTTON(button_setup,"gtk-properties",_("Setup")); + ADD_TOOLBOX_BUTTON(button_about,"synfig-about",_("About Synfig Studio")); + ADD_TOOLBOX_BUTTON(button_help,"gtk-help",_("Help")); + + button_setup->signal_clicked().connect(sigc::ptr_fun(studio::App::show_setup)); + button_about->signal_clicked().connect(sigc::ptr_fun(studio::App::dialog_about)); + button_help->signal_clicked().connect(sigc::ptr_fun(studio::App::dialog_help)); + button_new->signal_clicked().connect(sigc::ptr_fun(studio::App::new_instance)); + button_open->signal_clicked().connect(sigc::bind(sigc::ptr_fun(studio::App::dialog_open), "")); + button_save->signal_clicked().connect(sigc::ptr_fun(save_selected_instance)); + button_saveas->signal_clicked().connect(sigc::ptr_fun(save_as_selected_instance)); + button_save_all->signal_clicked().connect(sigc::ptr_fun(save_all)); + button_undo->signal_clicked().connect(sigc::ptr_fun(studio::App::undo)); + button_redo->signal_clicked().connect(sigc::ptr_fun(studio::App::redo)); + + // Create the file button cluster + Gtk::Table *file_buttons=manage(new class Gtk::Table()); + + file_buttons->attach(*button_new, 0,1, 0,1, Gtk::EXPAND, Gtk::EXPAND, 0, 0); + file_buttons->attach(*button_open, 1,2, 0,1, Gtk::EXPAND, Gtk::EXPAND, 0, 0); + file_buttons->attach(*button_save, 2,3, 0,1, Gtk::EXPAND, Gtk::EXPAND, 0, 0); + file_buttons->attach(*button_saveas, 3,4, 0,1, Gtk::EXPAND, Gtk::EXPAND, 0, 0); + file_buttons->attach(*button_save_all, 4,5, 0,1, Gtk::EXPAND, Gtk::EXPAND, 0, 0); + + file_buttons->attach(*button_undo, 0,1, 1,2, Gtk::EXPAND, Gtk::EXPAND, 0, 0); + file_buttons->attach(*button_redo, 1,2, 1,2, Gtk::EXPAND, Gtk::EXPAND, 0, 0); + file_buttons->attach(*button_setup, 2,3, 1,2, Gtk::EXPAND, Gtk::EXPAND, 0, 0); + file_buttons->attach(*button_about, 3,4, 1,2, Gtk::EXPAND, Gtk::EXPAND, 0, 0); + file_buttons->attach(*button_help, 4,5, 1,2, Gtk::EXPAND, Gtk::EXPAND, 0, 0); + + file_buttons->show(); + + tool_table=manage(new class Gtk::Table()); + tool_table->show(); + Gtk::HandleBox* handle_tools(manage(new Gtk::HandleBox())); + handle_tools->add(*tool_table); + handle_tools->show(); + handle_tools->set_handle_position(Gtk::POS_TOP); + handle_tools->set_snap_edge(Gtk::POS_TOP); + + Widget_Defaults* widget_defaults(manage(new Widget_Defaults())); + widget_defaults->show(); + Gtk::HandleBox* handle_defaults(manage(new Gtk::HandleBox())); + handle_defaults->add(*widget_defaults); + handle_defaults->show(); + handle_defaults->set_handle_position(Gtk::POS_TOP); + handle_defaults->set_snap_edge(Gtk::POS_TOP); + + // Create the toplevel table + Gtk::Table *table1 = manage(new class Gtk::Table(1, 2, false)); + table1->set_row_spacings(0); + table1->set_col_spacings(0); + table1->attach(*file_buttons, 0,1, 1,2, Gtk::FILL|Gtk::EXPAND,Gtk::EXPAND|Gtk::FILL, 0, 0); + table1->attach(*handle_tools, 0,1, 2,3, Gtk::FILL|Gtk::EXPAND,Gtk::EXPAND|Gtk::FILL, 0, 0); + table1->attach(*handle_defaults, 0,1, 3,4, Gtk::FILL|Gtk::EXPAND,Gtk::EXPAND|Gtk::FILL, 0, 0); + table1->show_all(); + + add(*table1); + + App::signal_instance_selected().connect( + sigc::hide( + sigc::mem_fun(*this,&studio::Dock_Toolbox::update_undo_redo) + ) + ); + + button_undo->set_sensitive(false); + button_redo->set_sensitive(false); + + std::list listTargets; + listTargets.push_back( Gtk::TargetEntry("text/plain") ); + listTargets.push_back( Gtk::TargetEntry("image") ); +// listTargets.push_back( Gtk::TargetEntry("image/x-sif") ); + + drag_dest_set(listTargets); + signal_drag_data_received().connect( sigc::mem_fun(*this, &studio::Dock_Toolbox::on_drop_drag_data_received) ); + + changing_state_=false; + + App::signal_present_all().connect(sigc::mem_fun0(*this,&Dock_Toolbox::present)); +} + +Dock_Toolbox::~Dock_Toolbox() +{ + hide(); + //studio::App::cb.task(_("Toolbox: I was nailed!")); + //studio::App::quit(); + + if(studio::App::dock_toolbox==this) + studio::App::dock_toolbox=NULL; +} + +void +Dock_Toolbox::set_active_state(const synfig::String& statename) +{ + std::map::iterator iter; + + changing_state_=true; + + synfigapp::Main::set_state(statename); + + try + { + + for(iter=state_button_map.begin();iter!=state_button_map.end();++iter) + { + if(iter->first==statename) + { + if(!iter->second->get_active()) + iter->second->set_active(true); + } + else + { + if(iter->second->get_active()) + iter->second->set_active(false); + } + } + } + catch(...) + { + changing_state_=false; + throw; + } + changing_state_=false; +} + +void +Dock_Toolbox::change_state(const synfig::String& statename) +{ + etl::handle canvas_view(studio::App::get_selected_canvas_view()); + if(canvas_view) + { + if(statename==canvas_view->get_smach().get_state_name()) + { + return; + } + + if(state_button_map.count(statename)) + { + state_button_map[statename]->clicked(); + } + else + { + synfig::error("Unknown state \"%s\"",statename.c_str()); + } + } +} + +void +Dock_Toolbox::change_state_(const Smach::state_base *state) +{ + if(changing_state_) + return; + changing_state_=true; + + try + { + etl::handle canvas_view(studio::App::get_selected_canvas_view()); + if(canvas_view) + canvas_view->get_smach().enter(state); + else + refresh(); + } + catch(...) + { + changing_state_=false; + throw; + } + + changing_state_=false; +} + + +/*! \fn Dock_Toolbox::add_state(const Smach::state_base *state) + * \brief Add and connect a toogle button to the toolbox defined by a state + * \param state a const pointer to Smach::state_base +*/ +void +Dock_Toolbox::add_state(const Smach::state_base *state) +{ + Gtk::Image *icon; + + assert(state); + + String name=state->get_name(); + + Gtk::StockItem stock_item; + Gtk::Stock::lookup(Gtk::StockID("synfig-"+name),stock_item); + + Gtk::ToggleButton* button; + button=manage(new class Gtk::ToggleButton()); + + Gtk::AccelKey key; + //Have a look to global fonction init_ui_manager() from app.cpp for "accel_path" definition + Gtk::AccelMap::lookup_entry ("/action_group_state_manager/state-"+name, key); + //Gets the accelerator representation for labels + Glib::ustring accel_path = key.get_abbrev (); + + icon=manage(new Gtk::Image(stock_item.get_stock_id(),Gtk::IconSize(4))); + button->add(*icon); + button->set_tooltip_text(stock_item.get_label()+" "+accel_path); + icon->show(); + button->show(); + + int row=state_button_map.size()/5; + int col=state_button_map.size()%5; + + tool_table->attach(*button,col,col+1,row,row+1, Gtk::EXPAND, Gtk::EXPAND, 0, 0); + + state_button_map[name]=button; + + button->signal_clicked().connect( + sigc::bind( + sigc::mem_fun(*this,&studio::Dock_Toolbox::change_state_), + state + ) + ); + + refresh(); +} + + +void +Dock_Toolbox::update_undo_redo() +{ + etl::handle instance=App::get_selected_instance(); + if(instance) + { + button_undo->set_sensitive(instance->get_undo_status()); + button_redo->set_sensitive(instance->get_redo_status()); + } + + // This should probably go elsewhere, but it should + // work fine here with no troubles. + // These next several lines just adjust the tool buttons + // so that they are only clickable when they should be. + if(instance && App::get_selected_canvas_view()) + { + std::map::iterator iter; + + for(iter=state_button_map.begin();iter!=state_button_map.end();++iter) + iter->second->set_sensitive(true); + } + else + { + std::map::iterator iter; + + for(iter=state_button_map.begin();iter!=state_button_map.end();++iter) + iter->second->set_sensitive(false); + } + + etl::handle canvas_view=App::get_selected_canvas_view(); + if(canvas_view && canvas_view->get_smach().get_state_name()) + { + set_active_state(canvas_view->get_smach().get_state_name()); + } + else + set_active_state("none"); + +} + +void +Dock_Toolbox::on_drop_drag_data_received(const Glib::RefPtr& context, int /*x*/, int /*y*/, const Gtk::SelectionData& selection_data_, guint /*info*/, guint time) +{ + // We will make this true once we have a solid drop + bool success(false); + + if ((selection_data_.get_length() >= 0) && (selection_data_.get_format() == 8)) + { + synfig::String selection_data((gchar *)(selection_data_.get_data())); + + // For some reason, GTK hands us a list of URLs separated + // by not only Carriage-Returns, but also Line-Feeds. + // Line-Feeds will mess us up. Remove all the line-feeds. + while(selection_data.find_first_of('\r')!=synfig::String::npos) + selection_data.erase(selection_data.begin()+selection_data.find_first_of('\r')); + + std::stringstream stream(selection_data); + + while(stream) + { + synfig::String filename,URI; + getline(stream,filename); + + // If we don't have a filename, move on. + if(filename.empty()) + continue; + + // Make sure this URL is of the "file://" type. + URI=String(filename.begin(),filename.begin()+sizeof("file://")-1); + if(URI!="file://") + { + synfig::warning("Unknown URI (%s) in \"%s\"",URI.c_str(),filename.c_str()); + continue; + } + + // Strip the "file://" part from the filename + filename=synfig::String(filename.begin()+sizeof("file://")-1,filename.end()); + + synfig::info("Attempting to open "+filename); + if(App::open(filename)) + success=true; + else + synfig::error("Drop failed: Unable to open "+filename); + } + } + else + synfig::error("Drop failed: bad selection data"); + + // Finish the drag + context->drag_finish(success, false, time); +} diff --git a/synfig-studio/src/gui/docks/dock_toolbox.h b/synfig-studio/src/gui/docks/dock_toolbox.h new file mode 100644 index 0000000..f2306e8 --- /dev/null +++ b/synfig-studio/src/gui/docks/dock_toolbox.h @@ -0,0 +1,96 @@ +/* === S Y N F I G ========================================================= */ +/*! \file dock_toolbox.h +** \brief Header File +** +** $Id$ +** +** \legal +** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley +** +** This package 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 package 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. +** \endlegal +** +** === N O T E S =========================================================== +** +** ========================================================================= */ + +/* === S T A R T =========================================================== */ + +#ifndef __SYNFIG_GTKMM_DOCK_TOOLBOX_H +#define __SYNFIG_GTKMM_DOCK_TOOLBOX_H + +/* === H E A D E R S ======================================================= */ + +#include "docks/dockable.h" + +#include +#include +#include +#include +#include +#include "smach.h" +#include +#include "dialogsettings.h" + +/* === M A C R O S ========================================================= */ + +// uncomment to enable the blend method selector in the tool options +// panel for the circle and gradient tools +// +// #define BLEND_METHOD_IN_TOOL_OPTIONS + +/* === T Y P E D E F S ===================================================== */ + +/* === C L A S S E S & S T R U C T S ======================================= */ + +namespace studio { + +class StateManager; + +class Dock_Toolbox : public Dockable +{ + friend class studio::StateManager; + + Gtk::Button *button_undo; + Gtk::Button *button_redo; + + Gtk::Table *tool_table; + + std::map state_button_map; + + bool changing_state_; + + void on_drop_drag_data_received(const Glib::RefPtr& context, int x, int y, const Gtk::SelectionData& selection_data, guint info, guint time); + + void change_state_(const Smach::state_base *state); + +public: + + void change_state(const synfig::String& statename); + + void update_undo_redo(); + + void refresh() { update_undo_redo(); } + + void set_active_state(const synfig::String& statename); + + void add_state(const Smach::state_base *state); + + Dock_Toolbox(); + virtual ~Dock_Toolbox(); + +}; + +}; // END of namespace studio + +/* === E N D =============================================================== */ + +#endif diff --git a/synfig-studio/src/gui/docks/dockable.cpp b/synfig-studio/src/gui/docks/dockable.cpp index 007e6e9..820dad8 100644 --- a/synfig-studio/src/gui/docks/dockable.cpp +++ b/synfig-studio/src/gui/docks/dockable.cpp @@ -82,7 +82,6 @@ Dockable::Dockable(const synfig::String& name,const synfig::String& local_name,G title_label_(local_name,Gtk::ALIGN_LEFT), stock_id_(stock_id_) { - parent_=0; scrolled_=0; use_scrolled_=true; @@ -167,13 +166,19 @@ Dockable::on_drag_data_received(const Glib::RefPtr& context, i { Dockable& dockable(**reinterpret_cast(const_cast(selection_data.get_data()))); - if(dockable.parent_ != parent_) - parent_->add(dockable,parent_->page_num(*this)); - else - parent_->reorder_child(dockable,parent_->page_num(*this)); - dockable.present(); - context->drag_finish(true, false, time); - return; + DockBook *parent = dynamic_cast(get_parent()); + DockBook *dockable_parent = dynamic_cast(dockable.get_parent()); + + if (parent) + { + if (dockable_parent != parent) + parent->add(dockable,parent->page_num(*this)); + else + parent->reorder_child(dockable,parent->page_num(*this)); + dockable.present(); + context->drag_finish(true, false, time); + return; + } } context->drag_finish(false, false, time); @@ -307,10 +312,11 @@ Dockable::add_button(const Gtk::StockID& stock_id, const synfig::String& tooltip void Dockable::present() { - if(parent_) + DockBook *parent = dynamic_cast(get_parent()); + if(parent) { - parent_->set_current_page(parent_->page_num(*this)); - parent_->present(); + parent->set_current_page(parent->page_num(*this)); + parent->present(); } else { diff --git a/synfig-studio/src/gui/docks/dockable.h b/synfig-studio/src/gui/docks/dockable.h index 1d4d7b5..f9860aa 100644 --- a/synfig-studio/src/gui/docks/dockable.h +++ b/synfig-studio/src/gui/docks/dockable.h @@ -84,8 +84,6 @@ private: Gtk::StockID stock_id_; - DockBook* parent_; - bool dnd_success_; public: diff --git a/synfig-studio/src/gui/docks/dockbook.cpp b/synfig-studio/src/gui/docks/dockbook.cpp index e470ac8..af5bbfd 100644 --- a/synfig-studio/src/gui/docks/dockbook.cpp +++ b/synfig-studio/src/gui/docks/dockbook.cpp @@ -96,7 +96,7 @@ DockBook::on_drag_data_received(const Glib::RefPtr& context, i if ((selection_data.get_length() >= 0) && (selection_data.get_format() == 8)) { Dockable& dockable(**reinterpret_cast(const_cast(selection_data.get_data()))); - if(dockable.parent_!=this) + if(dockable.get_parent()!=this) add(dockable); dockable.present(); context->drag_finish(true, false, time); @@ -128,8 +128,6 @@ DockBook::add(Dockable& dockable, int position) ) ); - dockable.parent_=this; - dockable.show(); signal_changed_(); @@ -160,7 +158,6 @@ DockBook::remove(Dockable& dockable) { dockable.hide(); remove_page(dockable); - dockable.parent_=0; if(!deleting_) { diff --git a/synfig-studio/src/gui/docks/dockdialog.cpp b/synfig-studio/src/gui/docks/dockdialog.cpp index 612f075..57b5ffa 100644 --- a/synfig-studio/src/gui/docks/dockdialog.cpp +++ b/synfig-studio/src/gui/docks/dockdialog.cpp @@ -36,7 +36,7 @@ #include "docks/dockdialog.h" #include "docks/dockbook.h" #include "docks/dockmanager.h" -#include "toolbox.h" +#include "mainwindow.h" #include "widgets/widget_compselect.h" #include #include @@ -102,7 +102,7 @@ DockDialog::DockDialog(): //! paragraph 3 of http://standards.freedesktop.org/wm-spec/1.3/ar01s07.html suggests we can // this seems to have bad effects on KDE, so leave it disabled by default if(getenv("SYNFIG_TRANSIENT_DIALOGS")) - set_transient_for(*App::toolbox); + set_transient_for(*App::main_window); // Set up the window //set_type_hint(Gdk::WINDOW_TYPE_HINT_UTILITY); diff --git a/synfig-studio/src/gui/docks/dockmanager.cpp b/synfig-studio/src/gui/docks/dockmanager.cpp index a3d096f..48b8bcc 100644 --- a/synfig-studio/src/gui/docks/dockmanager.cpp +++ b/synfig-studio/src/gui/docks/dockmanager.cpp @@ -427,9 +427,6 @@ DockManager::remove_widget_recursive(Gtk::Widget &widget) delete book; } } - - Dockable *dockable = dynamic_cast(&widget); - if (dockable) dockable->parent_ = NULL; } diff --git a/synfig-studio/src/gui/instance.cpp b/synfig-studio/src/gui/instance.cpp index 4439587..9578972 100644 --- a/synfig-studio/src/gui/instance.cpp +++ b/synfig-studio/src/gui/instance.cpp @@ -43,7 +43,7 @@ #include "app.h" #include #include -#include "toolbox.h" +#include "docks/dock_toolbox.h" #include "onemoment.h" #include @@ -176,7 +176,7 @@ void Instance::set_undo_status(bool x) { undo_status_=x; - App::toolbox->update_undo_redo(); + App::dock_toolbox->update_undo_redo(); signal_undo_redo_status_changed()(); } @@ -184,7 +184,7 @@ void Instance::set_redo_status(bool x) { redo_status_=x; - App::toolbox->update_undo_redo(); + App::dock_toolbox->update_undo_redo(); signal_undo_redo_status_changed()(); } diff --git a/synfig-studio/src/gui/ipc.cpp b/synfig-studio/src/gui/ipc.cpp index db949a6..8cc62a9 100644 --- a/synfig-studio/src/gui/ipc.cpp +++ b/synfig-studio/src/gui/ipc.cpp @@ -61,7 +61,7 @@ #define read _read #endif -#include "toolbox.h" +#include "docks/dock_toolbox.h" #include #include #include diff --git a/synfig-studio/src/gui/mainwindow.cpp b/synfig-studio/src/gui/mainwindow.cpp index 0381c71..6f82df0 100644 --- a/synfig-studio/src/gui/mainwindow.cpp +++ b/synfig-studio/src/gui/mainwindow.cpp @@ -31,6 +31,8 @@ #include "mainwindow.h" #include "canvasview.h" +#include "docks/dockable.h" +#include "docks/dockmanager.h" #include "docks/dockdroparea.h" #include @@ -114,6 +116,8 @@ MainWindow::MainWindow() add_accel_group(App::ui_manager()->get_accel_group()); init_menus(); + panels_action_group = Gtk::ActionGroup::create("mainwindow-recentfiles"); + App::ui_manager()->insert_action_group(panels_action_group); notebook_->signal_switch_page().connect( sigc::mem_fun(*this, &MainWindow::on_switch_page) ); @@ -121,6 +125,12 @@ MainWindow::MainWindow() App::signal_recent_files_changed().connect( sigc::mem_fun(*this, &MainWindow::on_recent_files_changed) ); + signal_delete_event().connect( + sigc::ptr_fun(App::shutdown_request) ); + + App::dock_manager->signal_dockable_registered().connect( + sigc::mem_fun(*this,&MainWindow::on_dockable_registered) ); + GRAB_HINT_DATA("canvas_view"); } @@ -224,6 +234,7 @@ MainWindow::init_menus() App::ui_manager()->insert_action_group(action_group); } + void MainWindow::on_recent_files_changed() { @@ -265,6 +276,26 @@ MainWindow::on_recent_files_changed() } void +MainWindow::on_dockable_registered(Dockable* dockable) +{ + panels_action_group->add( Gtk::Action::create("panel-" + dockable->get_name(), dockable->get_local_name()), + sigc::mem_fun(*dockable, &Dockable::present) + ); + + std::string ui_info = + "" + "" + ""; + std::string ui_info_popup = + "" + ui_info + ""; + std::string ui_info_menubar = + "" + ui_info + ""; + + App::ui_manager()->add_ui_from_string(ui_info_popup); + App::ui_manager()->add_ui_from_string(ui_info_menubar); +} + +void MainWindow::on_switch_page(GtkNotebookPage* /* page */, guint page_num) { Gtk::Notebook::PageList::iterator i = App::main_window->notebook().pages().find(page_num); diff --git a/synfig-studio/src/gui/mainwindow.h b/synfig-studio/src/gui/mainwindow.h index a6a4378..f0f8216 100644 --- a/synfig-studio/src/gui/mainwindow.h +++ b/synfig-studio/src/gui/mainwindow.h @@ -40,10 +40,13 @@ /* === C L A S S E S & S T R U C T S ======================================= */ namespace studio { + class Dockable; + class MainWindow: public Gtk::Window { private: Gtk::Notebook *notebook_; + Glib::RefPtr panels_action_group; //! Constructor Helper - Initializes all of the menus void init_menus(); @@ -55,6 +58,7 @@ namespace studio { static void save_all(); static void show_dialog_input(); void on_recent_files_changed(); + void on_dockable_registered(Dockable* dockable); public: MainWindow(); diff --git a/synfig-studio/src/gui/statemanager.cpp b/synfig-studio/src/gui/statemanager.cpp index 3d2974c..2e06ded 100644 --- a/synfig-studio/src/gui/statemanager.cpp +++ b/synfig-studio/src/gui/statemanager.cpp @@ -35,7 +35,7 @@ #include #include #include "app.h" -#include "toolbox.h" +#include "docks/dock_toolbox.h" #include "general.h" @@ -74,7 +74,7 @@ StateManager::~StateManager() void StateManager::change_state_(const Smach::state_base *state) { - App::toolbox->change_state_(state); + App::dock_toolbox->change_state_(state); } void @@ -121,7 +121,7 @@ StateManager::add_state(const Smach::state_base *state) App::ui_manager()->ensure_update(); - App::toolbox->add_state(state); + App::dock_toolbox->add_state(state); } Glib::RefPtr diff --git a/synfig-studio/src/gui/states/state_bline.cpp b/synfig-studio/src/gui/states/state_bline.cpp index 8e5a377..0c05ebc 100644 --- a/synfig-studio/src/gui/states/state_bline.cpp +++ b/synfig-studio/src/gui/states/state_bline.cpp @@ -47,7 +47,7 @@ #include #include "event_mouse.h" #include "event_layerclick.h" -#include "toolbox.h" +#include "docks/dock_toolbox.h" #include "docks/dialog_tooloptions.h" #include #include @@ -433,7 +433,7 @@ StateBLine_Context::StateBLine_Context(CanvasView* canvas_view): get_work_area()->set_cursor(Gdk::CROSSHAIR); - App::toolbox->refresh(); + App::dock_toolbox->refresh(); } void @@ -493,7 +493,7 @@ StateBLine_Context::~StateBLine_Context() // Refresh the work area get_work_area()->queue_draw(); - App::toolbox->refresh(); + App::dock_toolbox->refresh(); } Smach::event_result diff --git a/synfig-studio/src/gui/states/state_circle.cpp b/synfig-studio/src/gui/states/state_circle.cpp index 88ab2f2..282f04c 100644 --- a/synfig-studio/src/gui/states/state_circle.cpp +++ b/synfig-studio/src/gui/states/state_circle.cpp @@ -46,7 +46,7 @@ #include #include "event_mouse.h" #include "event_layerclick.h" -#include "toolbox.h" +#include "docks/dock_toolbox.h" #include "docks/dialog_tooloptions.h" #include #include "duck.h" @@ -506,7 +506,7 @@ options_table.attach(*manage(new Gtk::Label(_("Point Angle Offset:"))), 0, 1, 15 get_work_area()->set_cursor(Gdk::CROSSHAIR); - App::toolbox->refresh(); + App::dock_toolbox->refresh(); } void @@ -540,7 +540,7 @@ StateCircle_Context::~StateCircle_Context() get_canvas_view()->queue_rebuild_ducks(); - App::toolbox->refresh(); + App::dock_toolbox->refresh(); } Smach::event_result diff --git a/synfig-studio/src/gui/states/state_draw.cpp b/synfig-studio/src/gui/states/state_draw.cpp index 93d106c..8af9268 100644 --- a/synfig-studio/src/gui/states/state_draw.cpp +++ b/synfig-studio/src/gui/states/state_draw.cpp @@ -51,7 +51,7 @@ #include #include "event_mouse.h" #include "event_layerclick.h" -#include "toolbox.h" +#include "docks/dock_toolbox.h" #include #include @@ -540,7 +540,7 @@ StateDraw_Context::StateDraw_Context(CanvasView* canvas_view): get_work_area()->set_cursor(Gdk::PENCIL); - App::toolbox->refresh(); + App::dock_toolbox->refresh(); refresh_ducks(); } @@ -620,7 +620,7 @@ StateDraw_Context::~StateDraw_Context() // Refresh the work area get_work_area()->queue_draw(); - App::toolbox->refresh(); + App::dock_toolbox->refresh(); } Smach::event_result diff --git a/synfig-studio/src/gui/states/state_eyedrop.cpp b/synfig-studio/src/gui/states/state_eyedrop.cpp index 47f9891..3bd218b 100644 --- a/synfig-studio/src/gui/states/state_eyedrop.cpp +++ b/synfig-studio/src/gui/states/state_eyedrop.cpp @@ -37,7 +37,7 @@ #include "dialogs/dialog_color.h" #include "event_mouse.h" #include "event_layerclick.h" -#include "toolbox.h" +#include "docks/dock_toolbox.h" #include "canvasview.h" #include @@ -101,14 +101,14 @@ StateEyedrop_Context::StateEyedrop_Context(CanvasView *canvas_view): synfig::info("Entered Eyedrop State"); canvas_view->work_area->set_cursor(Gdk::Cursor(Gdk::CROSSHAIR)); - App::toolbox->refresh(); + App::dock_toolbox->refresh(); } StateEyedrop_Context::~StateEyedrop_Context() { synfig::info("Left Eyedrop State"); canvas_view->work_area->reset_cursor(); - App::toolbox->refresh(); + App::dock_toolbox->refresh(); } Smach::event_result diff --git a/synfig-studio/src/gui/states/state_fill.cpp b/synfig-studio/src/gui/states/state_fill.cpp index d69db2a..275f32c 100644 --- a/synfig-studio/src/gui/states/state_fill.cpp +++ b/synfig-studio/src/gui/states/state_fill.cpp @@ -37,7 +37,7 @@ #include "dialogs/dialog_color.h" #include "event_mouse.h" #include "event_layerclick.h" -#include "toolbox.h" +#include "docks/dock_toolbox.h" #include "canvasview.h" #include @@ -120,14 +120,14 @@ StateFill_Context::StateFill_Context(CanvasView *canvas_view): canvas_view->work_area->set_cursor(Gdk::CROSSHAIR); - App::toolbox->refresh(); + App::dock_toolbox->refresh(); } StateFill_Context::~StateFill_Context() { synfig::info("Left Fill State"); canvas_view->work_area->reset_cursor(); - App::toolbox->refresh(); + App::dock_toolbox->refresh(); } Smach::event_result diff --git a/synfig-studio/src/gui/states/state_gradient.cpp b/synfig-studio/src/gui/states/state_gradient.cpp index 4a8ff38..8d2d088 100644 --- a/synfig-studio/src/gui/states/state_gradient.cpp +++ b/synfig-studio/src/gui/states/state_gradient.cpp @@ -46,7 +46,7 @@ #include #include "event_mouse.h" #include "event_layerclick.h" -#include "toolbox.h" +#include "docks/dock_toolbox.h" #include "docks/dialog_tooloptions.h" #include #include "duck.h" @@ -334,7 +334,7 @@ StateGradient_Context::StateGradient_Context(CanvasView* canvas_view): // Connect a signal //get_work_area()->signal_user_click().connect(sigc::mem_fun(*this,&studio::StateGradient_Context::on_user_click)); - App::toolbox->refresh(); + App::dock_toolbox->refresh(); } void @@ -379,7 +379,7 @@ StateGradient_Context::~StateGradient_Context() get_work_area()->refresh_cursor(); - App::toolbox->refresh(); + App::dock_toolbox->refresh(); } Smach::event_result diff --git a/synfig-studio/src/gui/states/state_mirror.cpp b/synfig-studio/src/gui/states/state_mirror.cpp index 3f7786b..7806af1 100644 --- a/synfig-studio/src/gui/states/state_mirror.cpp +++ b/synfig-studio/src/gui/states/state_mirror.cpp @@ -45,7 +45,7 @@ #include #include "event_mouse.h" #include "event_layerclick.h" -#include "toolbox.h" +#include "docks/dock_toolbox.h" #include "docks/dialog_tooloptions.h" #include #include "duck.h" @@ -194,7 +194,7 @@ StateMirror_Context::StateMirror_Context(CanvasView* canvas_view): get_work_area()->set_cursor(Gdk::SB_H_DOUBLE_ARROW); // get_work_area()->reset_cursor(); - App::toolbox->refresh(); + App::dock_toolbox->refresh(); set_axis(AXIS_Y); } @@ -276,7 +276,7 @@ StateMirror_Context::~StateMirror_Context() App::dialog_tool_options->clear(); - App::toolbox->refresh(); + App::dock_toolbox->refresh(); } DuckDrag_Mirror::DuckDrag_Mirror(): diff --git a/synfig-studio/src/gui/states/state_normal.cpp b/synfig-studio/src/gui/states/state_normal.cpp index bfbd5fc..6ccce30 100644 --- a/synfig-studio/src/gui/states/state_normal.cpp +++ b/synfig-studio/src/gui/states/state_normal.cpp @@ -51,7 +51,7 @@ #include "event_mouse.h" #include "event_layerclick.h" #include "event_keyboard.h" -#include "toolbox.h" +#include "docks/dock_toolbox.h" #include "docks/dialog_tooloptions.h" #include #include "duck.h" @@ -251,7 +251,7 @@ StateNormal_Context::StateNormal_Context(CanvasView* canvas_view): // get_work_area()->set_cursor(Gdk::CROSSHAIR); // get_work_area()->reset_cursor(); - App::toolbox->refresh(); + App::dock_toolbox->refresh(); } void @@ -272,7 +272,7 @@ StateNormal_Context::~StateNormal_Context() App::dialog_tool_options->clear(); - App::toolbox->refresh(); + App::dock_toolbox->refresh(); } DuckDrag_Combo::DuckDrag_Combo(): diff --git a/synfig-studio/src/gui/states/state_polygon.cpp b/synfig-studio/src/gui/states/state_polygon.cpp index 517bfc9..dfe4b87 100644 --- a/synfig-studio/src/gui/states/state_polygon.cpp +++ b/synfig-studio/src/gui/states/state_polygon.cpp @@ -47,7 +47,7 @@ #include #include "event_mouse.h" #include "event_layerclick.h" -#include "toolbox.h" +#include "docks/dock_toolbox.h" #include "docks/dialog_tooloptions.h" #include @@ -408,7 +408,7 @@ StatePolygon_Context::StatePolygon_Context(CanvasView* canvas_view): // Disable the time bar get_canvas_view()->set_sensitive_timebar(false); - App::toolbox->refresh(); + App::dock_toolbox->refresh(); } void @@ -469,7 +469,7 @@ StatePolygon_Context::~StatePolygon_Context() // Refresh the work area get_work_area()->queue_draw(); - App::toolbox->refresh(); + App::dock_toolbox->refresh(); } Smach::event_result diff --git a/synfig-studio/src/gui/states/state_rectangle.cpp b/synfig-studio/src/gui/states/state_rectangle.cpp index a83ba5c..4c43601 100644 --- a/synfig-studio/src/gui/states/state_rectangle.cpp +++ b/synfig-studio/src/gui/states/state_rectangle.cpp @@ -47,7 +47,7 @@ #include #include "event_mouse.h" #include "event_layerclick.h" -#include "toolbox.h" +#include "docks/dock_toolbox.h" #include "docks/dialog_tooloptions.h" #include #include "duck.h" @@ -417,7 +417,7 @@ StateRectangle_Context::StateRectangle_Context(CanvasView* canvas_view): get_work_area()->set_cursor(Gdk::DOTBOX); - App::toolbox->refresh(); + App::dock_toolbox->refresh(); } void @@ -452,7 +452,7 @@ StateRectangle_Context::~StateRectangle_Context() get_canvas_view()->queue_rebuild_ducks(); - App::toolbox->refresh(); + App::dock_toolbox->refresh(); } Smach::event_result diff --git a/synfig-studio/src/gui/states/state_rotate.cpp b/synfig-studio/src/gui/states/state_rotate.cpp index 5d73e92..28de888 100644 --- a/synfig-studio/src/gui/states/state_rotate.cpp +++ b/synfig-studio/src/gui/states/state_rotate.cpp @@ -46,7 +46,7 @@ #include #include "event_mouse.h" #include "event_layerclick.h" -#include "toolbox.h" +#include "docks/dock_toolbox.h" #include "docks/dialog_tooloptions.h" #include #include "duck.h" @@ -215,7 +215,7 @@ StateRotate_Context::StateRotate_Context(CanvasView* canvas_view): get_work_area()->set_cursor(Gdk::EXCHANGE); // get_work_area()->reset_cursor(); - App::toolbox->refresh(); + App::dock_toolbox->refresh(); load_settings(); refresh_scale_flag(); @@ -253,7 +253,7 @@ StateRotate_Context::~StateRotate_Context() App::dialog_tool_options->clear(); - App::toolbox->refresh(); + App::dock_toolbox->refresh(); } diff --git a/synfig-studio/src/gui/states/state_scale.cpp b/synfig-studio/src/gui/states/state_scale.cpp index 3cc7167..9badca2 100644 --- a/synfig-studio/src/gui/states/state_scale.cpp +++ b/synfig-studio/src/gui/states/state_scale.cpp @@ -46,7 +46,7 @@ #include #include "event_mouse.h" #include "event_layerclick.h" -#include "toolbox.h" +#include "docks/dock_toolbox.h" #include "docks/dialog_tooloptions.h" #include #include "duck.h" @@ -201,7 +201,7 @@ StateScale_Context::StateScale_Context(CanvasView* canvas_view): get_work_area()->set_cursor(Gdk::SIZING); // get_work_area()->reset_cursor(); - App::toolbox->refresh(); + App::dock_toolbox->refresh(); set_aspect_lock_flag(true); load_settings(); @@ -239,7 +239,7 @@ StateScale_Context::~StateScale_Context() App::dialog_tool_options->clear(); - App::toolbox->refresh(); + App::dock_toolbox->refresh(); } diff --git a/synfig-studio/src/gui/states/state_sketch.cpp b/synfig-studio/src/gui/states/state_sketch.cpp index 1095d3a..e7bf9c5 100644 --- a/synfig-studio/src/gui/states/state_sketch.cpp +++ b/synfig-studio/src/gui/states/state_sketch.cpp @@ -47,7 +47,7 @@ #include #include "event_mouse.h" #include "event_layerclick.h" -#include "toolbox.h" +#include "docks/dock_toolbox.h" #include #include @@ -359,7 +359,7 @@ StateSketch_Context::StateSketch_Context(CanvasView* canvas_view): // Connect a signal //get_work_area()->signal_user_click().connect(sigc::mem_fun(*this,&studio::StateSketch_Context::on_user_click)); - App::toolbox->refresh(); + App::dock_toolbox->refresh(); } StateSketch_Context::~StateSketch_Context() @@ -377,7 +377,7 @@ StateSketch_Context::~StateSketch_Context() // Refresh the work area //get_work_area()->queue_draw(); - App::toolbox->refresh(); + App::dock_toolbox->refresh(); } void diff --git a/synfig-studio/src/gui/states/state_smoothmove.cpp b/synfig-studio/src/gui/states/state_smoothmove.cpp index bca18b2..a0a2138 100644 --- a/synfig-studio/src/gui/states/state_smoothmove.cpp +++ b/synfig-studio/src/gui/states/state_smoothmove.cpp @@ -49,7 +49,7 @@ #include #include "event_mouse.h" #include "event_layerclick.h" -#include "toolbox.h" +#include "docks/dock_toolbox.h" #include "docks/dialog_tooloptions.h" #include #include "duck.h" @@ -212,7 +212,7 @@ StateSmoothMove_Context::StateSmoothMove_Context(CanvasView* canvas_view): get_work_area()->set_allow_layer_clicks(true); get_work_area()->set_duck_dragger(duck_dragger_); - App::toolbox->refresh(); + App::dock_toolbox->refresh(); get_work_area()->set_cursor(Gdk::FLEUR); //get_work_area()->reset_cursor(); @@ -252,7 +252,7 @@ StateSmoothMove_Context::~StateSmoothMove_Context() App::dialog_tool_options->clear(); - App::toolbox->refresh(); + App::dock_toolbox->refresh(); } diff --git a/synfig-studio/src/gui/states/state_star.cpp b/synfig-studio/src/gui/states/state_star.cpp index 3cd1582..633570a 100644 --- a/synfig-studio/src/gui/states/state_star.cpp +++ b/synfig-studio/src/gui/states/state_star.cpp @@ -47,7 +47,7 @@ #include #include "event_mouse.h" #include "event_layerclick.h" -#include "toolbox.h" +#include "docks/dock_toolbox.h" #include "docks/dialog_tooloptions.h" #include #include "duck.h" @@ -534,7 +534,7 @@ StateStar_Context::StateStar_Context(CanvasView* canvas_view): get_work_area()->set_cursor(Gdk::STAR); - App::toolbox->refresh(); + App::dock_toolbox->refresh(); } void @@ -568,7 +568,7 @@ StateStar_Context::~StateStar_Context() get_canvas_view()->queue_rebuild_ducks(); - App::toolbox->refresh(); + App::dock_toolbox->refresh(); } Smach::event_result diff --git a/synfig-studio/src/gui/states/state_stroke.cpp b/synfig-studio/src/gui/states/state_stroke.cpp index a0f7eca..89ea5ba 100644 --- a/synfig-studio/src/gui/states/state_stroke.cpp +++ b/synfig-studio/src/gui/states/state_stroke.cpp @@ -45,7 +45,7 @@ #include #include "event_mouse.h" #include "event_layerclick.h" -#include "toolbox.h" +#include "docks/dock_toolbox.h" #include #include "general.h" @@ -136,7 +136,7 @@ StateStroke_Context::~StateStroke_Context() { duckmatic_push.restore(); - App::toolbox->refresh(); + App::dock_toolbox->refresh(); // Send the stroke data to whatever previously called this state. if(stroke_data->size()>=2) diff --git a/synfig-studio/src/gui/states/state_text.cpp b/synfig-studio/src/gui/states/state_text.cpp index b5c2e83..737f051 100644 --- a/synfig-studio/src/gui/states/state_text.cpp +++ b/synfig-studio/src/gui/states/state_text.cpp @@ -43,7 +43,7 @@ #include #include "event_mouse.h" #include "event_layerclick.h" -#include "toolbox.h" +#include "docks/dock_toolbox.h" #include "docks/dialog_tooloptions.h" #include #include "duck.h" @@ -336,7 +336,7 @@ StateText_Context::StateText_Context(CanvasView *canvas_view): //get_work_area()->signal_user_click().connect(sigc::mem_fun(*this,&studio::StateText_Context::on_user_click)); get_work_area()->set_cursor(Gdk::XTERM); - App::toolbox->refresh(); + App::dock_toolbox->refresh(); } void @@ -369,7 +369,7 @@ StateText_Context::~StateText_Context() get_canvas_view()->queue_rebuild_ducks(); - App::toolbox->refresh(); + App::dock_toolbox->refresh(); } Smach::event_result diff --git a/synfig-studio/src/gui/states/state_width.cpp b/synfig-studio/src/gui/states/state_width.cpp index a5e751d..cbeec6f 100644 --- a/synfig-studio/src/gui/states/state_width.cpp +++ b/synfig-studio/src/gui/states/state_width.cpp @@ -50,7 +50,7 @@ #include #include "event_mouse.h" #include "event_layerclick.h" -#include "toolbox.h" +#include "docks/dock_toolbox.h" #include "docks/dialog_tooloptions.h" #include "widgets/widget_distance.h" #include @@ -294,7 +294,7 @@ StateWidth_Context::StateWidth_Context(CanvasView* canvas_view): // Turn the mouse pointer to crosshairs get_work_area()->set_cursor(Gdk::CROSSHAIR); - App::toolbox->refresh(); + App::dock_toolbox->refresh(); } void @@ -330,7 +330,7 @@ StateWidth_Context::~StateWidth_Context() // Refresh the work area get_work_area()->queue_draw(); - App::toolbox->refresh(); + App::dock_toolbox->refresh(); } Smach::event_result diff --git a/synfig-studio/src/gui/states/state_zoom.cpp b/synfig-studio/src/gui/states/state_zoom.cpp index 874c0f0..c203612 100644 --- a/synfig-studio/src/gui/states/state_zoom.cpp +++ b/synfig-studio/src/gui/states/state_zoom.cpp @@ -43,7 +43,7 @@ #include "canvasview.h" #include "workarea.h" #include "app.h" -#include "toolbox.h" +#include "docks/dock_toolbox.h" #include #include "general.h" @@ -128,7 +128,7 @@ StateZoom_Context::StateZoom_Context(CanvasView* canvas_view): get_work_area()->set_cursor(Gdk::CROSSHAIR); - App::toolbox->refresh(); + App::dock_toolbox->refresh(); } StateZoom_Context::~StateZoom_Context() @@ -136,7 +136,7 @@ StateZoom_Context::~StateZoom_Context() // Refresh the work area get_work_area()->queue_draw(); - App::toolbox->refresh(); + App::dock_toolbox->refresh(); } Smach::event_result diff --git a/synfig-studio/src/gui/toolbox.cpp b/synfig-studio/src/gui/toolbox.cpp deleted file mode 100644 index 02cccbe..0000000 --- a/synfig-studio/src/gui/toolbox.cpp +++ /dev/null @@ -1,689 +0,0 @@ -/* === S Y N F I G ========================================================= */ -/*! \file toolbox.cpp -** \brief writeme -** -** $Id$ -** -** \legal -** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley -** Copyright (c) 2007, 2008 Chris Moore -** Copyright (c) 2008 Paul Wise -** Copyright (c) 2009 Nikita Kitaev -** -** This package 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 package 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. -** \endlegal -** -** === N O T E S =========================================================== -** -** ========================================================================= */ - -/* === H E A D E R S ======================================================= */ - -#ifdef USING_PCH -# include "pch.h" -#else -#ifdef HAVE_CONFIG_H -# include -#endif - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include -#include -#include - -#include - -#include "toolbox.h" -#include "instance.h" -#include "app.h" -#include "canvasview.h" -#include "dialogs/dialog_gradient.h" -#include "dialogs/dialog_color.h" -#include "docks/dialog_tooloptions.h" -#include "dialogs/dialog_preview.h" -#include "docks/dockable.h" -#include "docks/dockmanager.h" -#include "docks/dockdialog.h" - -#include "widgets/widget_defaults.h" - -#include - -#include "general.h" - -#endif - -using namespace std; -using namespace etl; -using namespace synfig; -using namespace studio; -using namespace sigc; - -/* === M A C R O S ========================================================= */ - -#define GRAB_HINT_DATA(y,default) { \ - String x; \ - if(synfigapp::Main::settings().get_value(String("pref.")+y+"_hints",x)) \ - { \ - set_type_hint((Gdk::WindowTypeHint)atoi(x.c_str())); \ - } else {\ - set_type_hint(default); \ - } \ - } - -/* === G L O B A L S ======================================================= */ - -/* === P R O C E D U R E S ================================================= */ - -/* === M E T H O D S ======================================================= */ - -#define TOGGLE_TOOLBOX_BUTTON(button,stockid,tooltip) \ - button = manage(new class Gtk::ToggleButton()); \ - icon=manage(new Gtk::Image(Gtk::StockID(stockid),Gtk::IconSize(4))); \ - button->add(*icon); \ - button->set_tooltip_text(tooltip); \ - icon->show(); \ - button->show() - -#define TOOLBOX_BUTTON(button,stockid,tooltip) \ - button = manage(new class Gtk::Button()); \ - icon=manage(new Gtk::Image(Gtk::StockID(stockid),Gtk::IconSize(4))); \ - button->add(*icon); \ - button->set_tooltip_text(tooltip); \ - icon->show(); \ - button->show() - -#define ADD_TOOLBOX_BUTTON(button,stockid,tooltip) Gtk::Button *TOOLBOX_BUTTON(button,stockid,tooltip) - -void -save_selected_instance() -{ - if(!studio::App::get_selected_instance()) - { - App::dialog_error_blocking(_("Cannot save"),_("Nothing to save")); - return; - } - - studio::App::get_selected_instance()->save(); -} - -void -save_as_selected_instance() -{ - if(!studio::App::get_selected_instance()) - { - App::dialog_error_blocking(_("Cannot save as"),_("Nothing to save")); - return; - } - - studio::App::get_selected_instance()->dialog_save_as(); -} - -void -save_all() -{ - std::list >::iterator iter; - for(iter=App::instance_list.begin();iter!=App::instance_list.end();iter++) - (*iter)->save(); -} - -void -close_selected_instance() -{ - etl::handle instance=studio::App::get_selected_instance(); - - if(!instance) - { - App::dialog_error_blocking(_("Cannot close"),_("Nothing to close")); - return; - } - - instance->safe_close(); - - //assert(instance.unique()); -} - - -static void -show_dialog_input() -{ - App::dialog_input->present(); -} - -void _create_stock_dialog1() -{ - // TODO: - //DockDialog* dock_dialog(new DockDialog); - //dock_dialog->set_contents("canvases history"); - //dock_dialog->set_composition_selector(true); - //dock_dialog->present(); -} -void _create_stock_dialog2() -{ - // TODO: - //DockDialog* dock_dialog(new DockDialog); - //dock_dialog->set_contents("layers children keyframes | params"); - //dock_dialog->present(); -} - -Toolbox::Toolbox(): - Gtk::Window(Gtk::WINDOW_TOPLEVEL), - dialog_settings(this,"toolbox") -{ - GRAB_HINT_DATA( - "toolbox", -//#ifdef __APPLE__ - Gdk::WINDOW_TYPE_HINT_NORMAL -//#else -// Gdk::WINDOW_TYPE_HINT_UTILITY -//#endif - ); - set_keep_above(false); - set_role("toolbox"); - - - - recent_files_menu= manage(new class Gtk::Menu()); - - Gtk::Menu *filemenu =manage(new class Gtk::Menu()); - - dock_dialogs=manage(new class Gtk::Menu()); - - dock_dialogs->items().push_back(Gtk::Menu_Helpers::MenuElem(_("Vertical Dock: Canvases, History"),sigc::ptr_fun(_create_stock_dialog1))); - dock_dialogs->items().push_back(Gtk::Menu_Helpers::MenuElem(_("Horizontal Dock: Layers, Library, Parameters"),sigc::ptr_fun(_create_stock_dialog2))); - dock_dialogs->items().push_back(Gtk::Menu_Helpers::SeparatorElem()); - dock_dialogs->items().push_back(Gtk::Menu_Helpers::MenuElem(_("Reset Windows to Original Layout"),sigc::ptr_fun(App::reset_initial_window_configuration))); - dock_dialogs->items().push_back(Gtk::Menu_Helpers::SeparatorElem()); - - - filemenu->items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::Stock::NEW, - sigc::ptr_fun(&studio::App::new_instance))); - filemenu->items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::Stock::OPEN, - sigc::bind(sigc::ptr_fun(&studio::App::dialog_open), ""))); - - filemenu->items().push_back(Gtk::Menu_Helpers::MenuElem(_("Open Recent"),*recent_files_menu)); - - filemenu->items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::Stock::SAVE, - sigc::ptr_fun(save_selected_instance))); - filemenu->items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::Stock::SAVE_AS, - sigc::ptr_fun(save_as_selected_instance))); - filemenu->items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("synfig-saveall"), - sigc::ptr_fun(save_all))); - filemenu->items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::Stock::CLOSE, - sigc::ptr_fun(close_selected_instance))); - filemenu->items().push_back(Gtk::Menu_Helpers::SeparatorElem()); - filemenu->items().push_back(Gtk::Menu_Helpers::MenuElem(_("Panels"),*dock_dialogs)); - - filemenu->items().push_back(Gtk::Menu_Helpers::MenuElem(_("Input Devices..."), - sigc::ptr_fun(&show_dialog_input))); - filemenu->items().push_back(Gtk::Menu_Helpers::MenuElem(_("Setup..."), - sigc::ptr_fun(&studio::App::show_setup))); - filemenu->items().push_back(Gtk::Menu_Helpers::MenuElem(_("Reset to default Setup values"), - sigc::ptr_fun(&studio::App::reset_initial_preferences))); - - filemenu->items().push_back(Gtk::Menu_Helpers::SeparatorElem()); - filemenu->items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID(Gtk::Stock::QUIT), - sigc::ptr_fun(studio::App::quit))); - -#define WIKI(title,page) \ - helpmenu->items().push_back(Gtk::Menu_Helpers::MenuElem(title, \ - sigc::bind(sigc::ptr_fun(&studio::App::open_url),String("http://synfig.org/wiki")+page))) - -#define SITE(title,page) \ - helpmenu->items().push_back(Gtk::Menu_Helpers::MenuElem(title, \ - sigc::bind(sigc::ptr_fun(&studio::App::open_url),String("http://synfig.org/cms")+page))) - - Gtk::Menu *helpmenu = manage(new class Gtk::Menu()); - helpmenu->items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::Stock::HELP, sigc::ptr_fun(studio::App::dialog_help))); - helpmenu->items().push_back(Gtk::Menu_Helpers::SeparatorElem()); - - /* TRANSLATORS: Help menu entry */ WIKI(_("Tutorials"), /* TRANSLATORS: a wiki page */ _("/Category:Tutorials") ); - /* TRANSLATORS: Help menu entry */ WIKI(_("Reference"), /* TRANSLATORS: a wiki page */ _("/Category:Reference") ); - /* TRANSLATORS: Help menu entry */ WIKI(_("Frequently Asked Questions"),/* TRANSLATORS: a wiki page */ _("/FAQ") ); - helpmenu->items().push_back(Gtk::Menu_Helpers::SeparatorElem()); - /* TRANSLATORS: Help menu entry */ SITE(_("Get Support"), /* TRANSLATORS: a website page */ _("/en/support") ); - helpmenu->items().push_back(Gtk::Menu_Helpers::SeparatorElem()); - helpmenu->items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("synfig-about"), - sigc::ptr_fun(studio::App::dialog_about))); - - Gtk::MenuBar *menubar1 = manage(new class Gtk::MenuBar()); - menubar1->items().push_back(Gtk::Menu_Helpers::MenuElem(_("_File"),*filemenu)); - menubar1->items().push_back(Gtk::Menu_Helpers::MenuElem(_("_Help"),*helpmenu)); - - - menubar1->show(); - - Gtk::Image *icon; - - ADD_TOOLBOX_BUTTON(button_new,"gtk-new",_("New...")); - ADD_TOOLBOX_BUTTON(button_open,"gtk-open",_("Open...")); - ADD_TOOLBOX_BUTTON(button_save,"gtk-save",_("Save")); - ADD_TOOLBOX_BUTTON(button_saveas,"gtk-save-as",_("Save As...")); - ADD_TOOLBOX_BUTTON(button_save_all,"synfig-saveall",_("Save All")); - TOOLBOX_BUTTON(button_undo,"gtk-undo",_("Undo")); - TOOLBOX_BUTTON(button_redo,"gtk-redo",_("Redo")); - ADD_TOOLBOX_BUTTON(button_setup,"gtk-properties",_("Setup")); - ADD_TOOLBOX_BUTTON(button_about,"synfig-about",_("About Synfig Studio")); - ADD_TOOLBOX_BUTTON(button_help,"gtk-help",_("Help")); - - button_setup->signal_clicked().connect(sigc::ptr_fun(studio::App::show_setup)); - button_about->signal_clicked().connect(sigc::ptr_fun(studio::App::dialog_about)); - button_help->signal_clicked().connect(sigc::ptr_fun(studio::App::dialog_help)); - button_new->signal_clicked().connect(sigc::ptr_fun(studio::App::new_instance)); - button_open->signal_clicked().connect(sigc::bind(sigc::ptr_fun(studio::App::dialog_open), "")); - button_save->signal_clicked().connect(sigc::ptr_fun(save_selected_instance)); - button_saveas->signal_clicked().connect(sigc::ptr_fun(save_as_selected_instance)); - button_save_all->signal_clicked().connect(sigc::ptr_fun(save_all)); - button_undo->signal_clicked().connect(sigc::ptr_fun(studio::App::undo)); - button_redo->signal_clicked().connect(sigc::ptr_fun(studio::App::redo)); - - // Create the file button cluster - Gtk::Table *file_buttons=manage(new class Gtk::Table()); - - file_buttons->attach(*button_new, 0,1, 0,1, Gtk::EXPAND, Gtk::EXPAND, 0, 0); - file_buttons->attach(*button_open, 1,2, 0,1, Gtk::EXPAND, Gtk::EXPAND, 0, 0); - file_buttons->attach(*button_save, 2,3, 0,1, Gtk::EXPAND, Gtk::EXPAND, 0, 0); - file_buttons->attach(*button_saveas, 3,4, 0,1, Gtk::EXPAND, Gtk::EXPAND, 0, 0); - file_buttons->attach(*button_save_all, 4,5, 0,1, Gtk::EXPAND, Gtk::EXPAND, 0, 0); - - file_buttons->attach(*button_undo, 0,1, 1,2, Gtk::EXPAND, Gtk::EXPAND, 0, 0); - file_buttons->attach(*button_redo, 1,2, 1,2, Gtk::EXPAND, Gtk::EXPAND, 0, 0); - file_buttons->attach(*button_setup, 2,3, 1,2, Gtk::EXPAND, Gtk::EXPAND, 0, 0); - file_buttons->attach(*button_about, 3,4, 1,2, Gtk::EXPAND, Gtk::EXPAND, 0, 0); - file_buttons->attach(*button_help, 4,5, 1,2, Gtk::EXPAND, Gtk::EXPAND, 0, 0); - - file_buttons->show(); - - tool_table=manage(new class Gtk::Table()); - tool_table->show(); - Gtk::HandleBox* handle_tools(manage(new Gtk::HandleBox())); - handle_tools->add(*tool_table); - handle_tools->show(); - handle_tools->set_handle_position(Gtk::POS_TOP); - handle_tools->set_snap_edge(Gtk::POS_TOP); - - Widget_Defaults* widget_defaults(manage(new Widget_Defaults())); - widget_defaults->show(); - Gtk::HandleBox* handle_defaults(manage(new Gtk::HandleBox())); - handle_defaults->add(*widget_defaults); - handle_defaults->show(); - handle_defaults->set_handle_position(Gtk::POS_TOP); - handle_defaults->set_snap_edge(Gtk::POS_TOP); - - // Create the toplevel table - Gtk::Table *table1 = manage(new class Gtk::Table(1, 2, false)); - table1->set_row_spacings(0); - table1->set_col_spacings(0); - table1->attach(*menubar1, 0,1, 0,1, Gtk::FILL|Gtk::EXPAND, Gtk::SHRINK, 0, 0); - table1->attach(*file_buttons, 0,1, 1,2, Gtk::FILL|Gtk::EXPAND,Gtk::EXPAND|Gtk::FILL, 0, 0); - table1->attach(*handle_tools, 0,1, 2,3, Gtk::FILL|Gtk::EXPAND,Gtk::EXPAND|Gtk::FILL, 0, 0); - table1->attach(*handle_defaults, 0,1, 3,4, Gtk::FILL|Gtk::EXPAND,Gtk::EXPAND|Gtk::FILL, 0, 0); - table1->show_all(); - - // Set the parameters for this window - add(*table1); - set_title(_("Synfig Studio")); - set_modal(false); - property_window_position().set_value(Gtk::WIN_POS_NONE); - signal_delete_event().connect(sigc::ptr_fun(App::shutdown_request)); - set_resizable(false); - - App::signal_instance_selected().connect( - sigc::hide( - sigc::mem_fun(*this,&studio::Toolbox::update_undo_redo) - ) - ); - - App::signal_recent_files_changed().connect( - sigc::mem_fun(*this,&studio::Toolbox::on_recent_files_changed) - ); - - button_undo->set_sensitive(false); - button_redo->set_sensitive(false); - - std::list listTargets; - listTargets.push_back( Gtk::TargetEntry("text/plain") ); - listTargets.push_back( Gtk::TargetEntry("image") ); -// listTargets.push_back( Gtk::TargetEntry("image/x-sif") ); - - drag_dest_set(listTargets); - signal_drag_data_received().connect( sigc::mem_fun(*this, &studio::Toolbox::on_drop_drag_data_received) ); - - App::dock_manager->signal_dockable_registered().connect(sigc::mem_fun(*this,&Toolbox::dockable_registered)); - - changing_state_=false; - - - add_accel_group(App::ui_manager()->get_accel_group()); - - App::signal_present_all().connect(sigc::mem_fun0(*this,&Toolbox::present)); -} - -Toolbox::~Toolbox() -{ - hide(); - //studio::App::cb.task(_("Toolbox: I was nailed!")); - //studio::App::quit(); - - if(studio::App::toolbox==this) - studio::App::toolbox=NULL; - -} - -void -Toolbox::set_active_state(const synfig::String& statename) -{ - std::map::iterator iter; - - changing_state_=true; - - synfigapp::Main::set_state(statename); - - try - { - - for(iter=state_button_map.begin();iter!=state_button_map.end();++iter) - { - if(iter->first==statename) - { - if(!iter->second->get_active()) - iter->second->set_active(true); - } - else - { - if(iter->second->get_active()) - iter->second->set_active(false); - } - } - } - catch(...) - { - changing_state_=false; - throw; - } - changing_state_=false; -} - -void -Toolbox::change_state(const synfig::String& statename) -{ - etl::handle canvas_view(studio::App::get_selected_canvas_view()); - if(canvas_view) - { - if(statename==canvas_view->get_smach().get_state_name()) - { - return; - } - - if(state_button_map.count(statename)) - { - state_button_map[statename]->clicked(); - } - else - { - synfig::error("Unknown state \"%s\"",statename.c_str()); - } - } -} - -void -Toolbox::change_state_(const Smach::state_base *state) -{ - if(changing_state_) - return; - changing_state_=true; - - try - { - etl::handle canvas_view(studio::App::get_selected_canvas_view()); - if(canvas_view) - canvas_view->get_smach().enter(state); - else - refresh(); - } - catch(...) - { - changing_state_=false; - throw; - } - - changing_state_=false; -} - - -/*! \fn Toolbox::add_state(const Smach::state_base *state) - * \brief Add and connect a toogle button to the toolbox defined by a state - * \param state a const pointer to Smach::state_base -*/ -void -Toolbox::add_state(const Smach::state_base *state) -{ - Gtk::Image *icon; - - assert(state); - - String name=state->get_name(); - - Gtk::StockItem stock_item; - Gtk::Stock::lookup(Gtk::StockID("synfig-"+name),stock_item); - - Gtk::ToggleButton* button; - button=manage(new class Gtk::ToggleButton()); - - Gtk::AccelKey key; - //Have a look to global fonction init_ui_manager() from app.cpp for "accel_path" definition - Gtk::AccelMap::lookup_entry ("/action_group_state_manager/state-"+name, key); - //Gets the accelerator representation for labels - Glib::ustring accel_path = key.get_abbrev (); - - icon=manage(new Gtk::Image(stock_item.get_stock_id(),Gtk::IconSize(4))); - button->add(*icon); - button->set_tooltip_text(stock_item.get_label()+" "+accel_path); - icon->show(); - button->show(); - - int row=state_button_map.size()/5; - int col=state_button_map.size()%5; - - tool_table->attach(*button,col,col+1,row,row+1, Gtk::EXPAND, Gtk::EXPAND, 0, 0); - - state_button_map[name]=button; - - button->signal_clicked().connect( - sigc::bind( - sigc::mem_fun(*this,&studio::Toolbox::change_state_), - state - ) - ); - - refresh(); -} - - -void -Toolbox::update_undo_redo() -{ - etl::handle instance=App::get_selected_instance(); - if(instance) - { - button_undo->set_sensitive(instance->get_undo_status()); - button_redo->set_sensitive(instance->get_redo_status()); - } - - // This should probably go elsewhere, but it should - // work fine here with no troubles. - // These next several lines just adjust the tool buttons - // so that they are only clickable when they should be. - if(instance && App::get_selected_canvas_view()) - { - std::map::iterator iter; - - for(iter=state_button_map.begin();iter!=state_button_map.end();++iter) - iter->second->set_sensitive(true); - } - else - { - std::map::iterator iter; - - for(iter=state_button_map.begin();iter!=state_button_map.end();++iter) - iter->second->set_sensitive(false); - } - - etl::handle canvas_view=App::get_selected_canvas_view(); - if(canvas_view && canvas_view->get_smach().get_state_name()) - { - set_active_state(canvas_view->get_smach().get_state_name()); - } - else - set_active_state("none"); - -} - -void -Toolbox::on_recent_files_changed() -{ - while(recent_files_menu->get_children().size()) - recent_files_menu->remove(**recent_files_menu->get_children().begin()); - - list::const_iterator iter; - for(iter=App::get_recent_files().begin();iter!=App::get_recent_files().end();iter++) - { - string raw = basename(*iter), quoted; - size_t pos = 0, last_pos = 0; - - // replace _ in filenames by __ or it won't show up in the menu - for (pos = last_pos = 0; (pos = raw.find('_', pos)) != string::npos; last_pos = pos) - quoted += raw.substr(last_pos, ++pos - last_pos) + '_'; - quoted += raw.substr(last_pos); - - recent_files_menu->items().push_back(Gtk::Menu_Helpers::MenuElem(quoted, - sigc::hide_return(sigc::bind(sigc::ptr_fun(&App::open),*iter)) - )); - } - - // HACK - show(); -} - -void -Toolbox::on_drop_drag_data_received(const Glib::RefPtr& context, int /*x*/, int /*y*/, const Gtk::SelectionData& selection_data_, guint /*info*/, guint time) -{ - // We will make this true once we have a solid drop - bool success(false); - - if ((selection_data_.get_length() >= 0) && (selection_data_.get_format() == 8)) - { - synfig::String selection_data((gchar *)(selection_data_.get_data())); - - // For some reason, GTK hands us a list of URLs separated - // by not only Carriage-Returns, but also Line-Feeds. - // Line-Feeds will mess us up. Remove all the line-feeds. - while(selection_data.find_first_of('\r')!=synfig::String::npos) - selection_data.erase(selection_data.begin()+selection_data.find_first_of('\r')); - - std::stringstream stream(selection_data); - - while(stream) - { - synfig::String filename,URI; - getline(stream,filename); - - // If we don't have a filename, move on. - if(filename.empty()) - continue; - - // Make sure this URL is of the "file://" type. - URI=String(filename.begin(),filename.begin()+sizeof("file://")-1); - if(URI!="file://") - { - synfig::warning("Unknown URI (%s) in \"%s\"",URI.c_str(),filename.c_str()); - continue; - } - - // Strip the "file://" part from the filename - filename=synfig::String(filename.begin()+sizeof("file://")-1,filename.end()); - - synfig::info("Attempting to open "+filename); - if(App::open(filename)) - success=true; - else - synfig::error("Drop failed: Unable to open "+filename); - } - } - else - synfig::error("Drop failed: bad selection data"); - - // Finish the drag - context->drag_finish(success, false, time); -} - -bool -Toolbox::on_key_press_event(GdkEventKey* event) -{ - Gtk::Widget* focused_widget = get_focus(); - if(focused_widget && focused_widget_has_priority(focused_widget)) - { - if(focused_widget->event((GdkEvent*)event)) - return true; - } - else if(Gtk::Window::on_key_press_event(event)) - return true; - else - if (focused_widget) return focused_widget->event((GdkEvent*)event); - return false; -} - -bool -Toolbox::focused_widget_has_priority(Gtk::Widget * focused) -{ - if(dynamic_cast(focused)) - return true; - return false; -} - -void -Toolbox::dockable_registered(Dockable* x) -{ - dock_dialogs->items().push_back( - Gtk::Menu_Helpers::MenuElem( - x->get_local_name(), - sigc::mem_fun( - *x, - &Dockable::present - ) - ) - ); -} diff --git a/synfig-studio/src/gui/toolbox.h b/synfig-studio/src/gui/toolbox.h deleted file mode 100644 index 9b9ee8e..0000000 --- a/synfig-studio/src/gui/toolbox.h +++ /dev/null @@ -1,110 +0,0 @@ -/* === S Y N F I G ========================================================= */ -/*! \file toolbox.h -** \brief Header File -** -** $Id$ -** -** \legal -** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley -** -** This package 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 package 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. -** \endlegal -** -** === N O T E S =========================================================== -** -** ========================================================================= */ - -/* === S T A R T =========================================================== */ - -#ifndef __SYNFIG_GTKMM_TOOLBOX_H -#define __SYNFIG_GTKMM_TOOLBOX_H - -/* === H E A D E R S ======================================================= */ - -#include -#include -#include -#include -#include -#include -#include -#include "smach.h" -#include -#include "dialogsettings.h" - -/* === M A C R O S ========================================================= */ - -// uncomment to enable the blend method selector in the tool options -// panel for the circle and gradient tools -// -// #define BLEND_METHOD_IN_TOOL_OPTIONS - -/* === T Y P E D E F S ===================================================== */ - -/* === C L A S S E S & S T R U C T S ======================================= */ - -namespace studio { - -class Dockable; -class StateManager; - -class Toolbox : public Gtk::Window -{ - friend class studio::StateManager; - - DialogSettings dialog_settings; - - Gtk::Button *button_undo; - Gtk::Button *button_redo; - - Gtk::Table *tool_table; - - std::map state_button_map; - - Gtk::Menu *recent_files_menu; - - Gtk::Menu *dock_dialogs; - - bool changing_state_; - - void on_recent_files_changed(); - void on_drop_drag_data_received(const Glib::RefPtr& context, int x, int y, const Gtk::SelectionData& selection_data, guint info, guint time); - //! Keyboard event dispatcher following window priority - bool on_key_press_event(GdkEventKey* event); - bool focused_widget_has_priority(Gtk::Widget * focused); - - void change_state_(const Smach::state_base *state); - -public: - - void change_state(const synfig::String& statename); - - void update_undo_redo(); - - void refresh() { update_undo_redo(); } - - void set_active_state(const synfig::String& statename); - - void add_state(const Smach::state_base *state); - - - void dockable_registered(Dockable* x); - - Toolbox(); - virtual ~Toolbox(); - -}; - -}; // END of namespace studio - -/* === E N D =============================================================== */ - -#endif