X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-studio%2Ftrunk%2Fsrc%2Fgtkmm%2Fcanvasview.cpp;h=ad2ab6be9aa8d1ed479bb2e93408f1371d4b94f9;hb=756c0d29ac1742f231e6615f9a577e574e35a4af;hp=e17fb3e192c4fed3ddeef20ddce48f6495cd13ab;hpb=3516deebd394af6e2c1d8c546777d04043eaa29a;p=synfig.git diff --git a/synfig-studio/trunk/src/gtkmm/canvasview.cpp b/synfig-studio/trunk/src/gtkmm/canvasview.cpp index e17fb3e..ad2ab6b 100644 --- a/synfig-studio/trunk/src/gtkmm/canvasview.cpp +++ b/synfig-studio/trunk/src/gtkmm/canvasview.cpp @@ -2,10 +2,11 @@ /*! \file canvasview.cpp ** \brief Template File ** -** $Id: canvasview.cpp,v 1.7 2005/01/16 19:55:57 darco Exp $ +** $Id$ ** ** \legal ** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley +** Copyright (c) 2007, 2008 Chris Moore ** ** This package is free software; you can redistribute it and/or ** modify it under the terms of the GNU General Public License as @@ -37,6 +38,7 @@ #include #include #include +#include #include #include @@ -44,9 +46,9 @@ #include #include -#include -#include -#include +#include +#include +#include #include #include #include @@ -97,6 +99,8 @@ #include #include +#include "general.h" + #endif /* === U S I N G =========================================================== */ @@ -105,7 +109,7 @@ using namespace std; using namespace etl; using namespace synfig; using namespace studio; -using namespace SigC; +using namespace sigc; /* === M A C R O S ========================================================= */ @@ -119,13 +123,6 @@ using namespace SigC; #define DEFAULT_TIME_WINDOW_SIZE (10.0) -/* -#ifdef DEBUGPOINT -#undef DEBUGPOINT -#endif -#define DEBUGPOINT() -*/ - #ifndef SMALL_BUTTON #define SMALL_BUTTON(button,stockid,tooltip) \ button = manage(new class Gtk::Button()); \ @@ -155,17 +152,17 @@ using namespace SigC; #define NOT_IMPLEMENTED_SLOT sigc::mem_fun(*reinterpret_cast(get_ui_interface().get()),&studio::CanvasViewUIInterface::not_implemented) #define SLOT_EVENT(x) sigc::hide_return(sigc::bind(sigc::mem_fun(*this,&studio::CanvasView::process_event_key),x)) - + /* === C L A S S E S ======================================================= */ - + class studio::UniversalScrubber { CanvasView *canvas_view; bool scrubbing; etl::clock scrub_timer; - + sigc::connection end_scrub_connection; public: UniversalScrubber(CanvasView *canvas_view): @@ -176,12 +173,12 @@ public: sigc::mem_fun(*this,&studio::UniversalScrubber::on_time_changed) ); } - + ~UniversalScrubber() { end_scrub_connection.disconnect(); } - + void on_time_changed() { // Make sure we are changing the time quickly @@ -191,14 +188,14 @@ public: scrub_timer.reset(); return; } - + // If we aren't scrubbing already, enable it if(!scrubbing) { - scrubbing=true; + scrubbing=true; audio_container()->start_scrubbing(canvas_view->get_time()); } - + // Reset the scrubber ender end_scrub_connection.disconnect(); end_scrub_connection=Glib::signal_timeout().connect( @@ -214,14 +211,14 @@ public: scrub_timer.reset(); } - + void end_of_scrubbing() - { + { scrubbing=false; audio_container()->stop_scrubbing(); scrub_timer.reset(); } - + handle audio_container() { assert(canvas_view->audio); @@ -229,7 +226,7 @@ public: } }; - + class studio::CanvasViewUIInterface : public synfigapp::UIInterface { CanvasView *view; @@ -239,8 +236,8 @@ public: CanvasViewUIInterface(CanvasView *view): view(view) { - - view->statusbar->push("Idle"); + + view->statusbar->push(_("Idle")); } ~CanvasViewUIInterface() @@ -261,11 +258,11 @@ public: ); Gtk::Label label(message); label.show(); - + dialog.get_vbox()->pack_start(label); dialog.add_button(Gtk::StockID("gtk-yes"),RESPONSE_YES); dialog.add_button(Gtk::StockID("gtk-no"),RESPONSE_NO); - + dialog.set_default_response(dflt); dialog.show(); return (Response)dialog.run(); @@ -282,12 +279,12 @@ public: ); Gtk::Label label(message); label.show(); - + dialog.get_vbox()->pack_start(label); dialog.add_button(Gtk::StockID("gtk-yes"),RESPONSE_YES); dialog.add_button(Gtk::StockID("gtk-no"),RESPONSE_NO); dialog.add_button(Gtk::StockID("gtk-cancel"),RESPONSE_CANCEL); - + dialog.set_default_response(dflt); dialog.show(); return (Response)dialog.run(); @@ -304,11 +301,11 @@ public: ); Gtk::Label label(message); label.show(); - + dialog.get_vbox()->pack_start(label); dialog.add_button(Gtk::StockID("gtk-ok"),RESPONSE_OK); dialog.add_button(Gtk::StockID("gtk-cancel"),RESPONSE_CANCEL); - + dialog.set_default_response(dflt); dialog.show(); return (Response)dialog.run(); @@ -318,7 +315,7 @@ public: task(const std::string &task) { if(!view->is_playing_) - { + { view->statusbar->pop(); view->statusbar->push(task); } @@ -330,24 +327,13 @@ public: virtual bool error(const std::string &err) { - view->statusbar->push("ERROR"); - + view->statusbar->push(_("ERROR")); + // If we are in the process of canceling, // then just go ahead and return false -- // don't bother displaying a dialog if(view->cancel)return false; - - Gtk::Dialog dialog( - "Error", // Title - *view, // Parent - true, // Modal - true // use_separator - ); - Gtk::Label label(err); - label.show(); - - dialog.get_vbox()->pack_start(label); - dialog.add_button(Gtk::StockID("gtk-ok"),RESPONSE_OK); + Gtk::MessageDialog dialog(*view, err, false, Gtk::MESSAGE_ERROR, Gtk::BUTTONS_CLOSE, true); dialog.show(); dialog.run(); view->statusbar->pop(); @@ -359,7 +345,7 @@ public: { view->statusbar->pop(); view->statusbar->push(err); - + //while(studio::App::events_pending())studio::App::iteration(false); if(view->cancel)return false; return true; @@ -369,7 +355,7 @@ public: amount_complete(int current, int total) { if(!view->is_playing_) - { + { if(!view->working_depth) { if(current) @@ -386,11 +372,11 @@ public: if(view->cancel){/*view->cancel=false;*/return false;} return true; } - + void not_implemented() { - error("Feature not yet implemented"); + error(_("Feature not yet implemented")); } }; @@ -402,10 +388,10 @@ class studio::CanvasViewSelectionManager : public synfigapp::SelectionManager public: CanvasViewSelectionManager(CanvasView *view): view(view) -{ - +{ + } - + private: void _set_selected_layer(const synfig::Layer::Handle &layer) @@ -417,7 +403,7 @@ private: // It musta been for some reason, but I cannot recall. //if(App::Busy::count) // return; - + if(view->layer_tree->get_selection()->get_selected()) { const Gtk::TreeRow row = *(view->layer_tree->get_selection()->get_selected()); @@ -444,7 +430,7 @@ private: */ } public: - + //! Returns the number of layers selected. virtual int get_selected_layer_count()const { @@ -455,26 +441,26 @@ public: virtual LayerList get_selected_layers()const { // assert(view->layer_tree); - - if(!view->layer_tree) { DEBUGPOINT(); synfig::error("canvas_view.layer_tree not defined!?"); return LayerList(); } + + if(!view->layer_tree) { synfig::error("%s:%d canvas_view.layer_tree not defined!?", __FILE__, __LINE__); return LayerList(); } return view->layer_tree->get_selected_layers(); } - + //! Returns the first layer selected or an empty handle if none are selected. virtual synfig::Layer::Handle get_selected_layer()const { // assert(view->layer_tree); - - if(!view->layer_tree) { DEBUGPOINT(); synfig::error("canvas_view.layer_tree not defined!?"); return 0; } + + if(!view->layer_tree) { synfig::error("%s:%d canvas_view.layer_tree not defined!?", __FILE__, __LINE__); return 0; } return view->layer_tree->get_selected_layer(); } - + //! Sets which layers should be selected virtual void set_selected_layers(const LayerList &layer_list) { // assert(view->layer_tree); - - if(!view->layer_tree) { DEBUGPOINT(); synfig::error("canvas_view.layer_tree not defined!?"); return; } + + if(!view->layer_tree) { synfig::error("%s:%d canvas_view.layer_tree not defined!?", __FILE__, __LINE__); return; } view->layer_tree->select_layers(layer_list); //view->get_smach().process_event(EVENT_REFRESH_DUCKS); @@ -485,8 +471,8 @@ public: virtual void set_selected_layer(const synfig::Layer::Handle &layer) { // assert(view->layer_tree); - - if(!view->layer_tree) { DEBUGPOINT(); synfig::error("canvas_view.layer_tree not defined!?"); return; } + + if(!view->layer_tree) { synfig::error("canvas_view.layer_tree not defined!?"); return; } view->layer_tree->select_layer(layer); //view->queue_rebuild_ducks(); } @@ -505,7 +491,7 @@ public: { return get_selected_children().size(); } - + static inline void __child_grabber(const Gtk::TreeModel::iterator& iter, ChildrenList* ret) { const CanvasView::ChildrenTreeModel children_tree_model; @@ -513,19 +499,19 @@ public: if(value_desc) ret->push_back(value_desc); } - + //! Returns a list of the currently selected value_nodes. virtual ChildrenList get_selected_children()const { if(!view->children_tree) return ChildrenList(); - + Glib::RefPtr selection=view->children_tree->get_selection(); if(!selection) return ChildrenList(); - + ChildrenList ret; - + selection->selected_foreach_iter( sigc::bind( sigc::ptr_fun( @@ -534,7 +520,7 @@ public: &ret ) ); - + /* Gtk::TreeModel::Children::iterator iter(view->children_tree_store()->children().begin()); iter++; @@ -548,7 +534,7 @@ public: */ return ret; } - + //! Returns the first value_node selected or an empty handle if none are selected. virtual ChildrenList::value_type get_selected_child()const { @@ -561,15 +547,15 @@ public: return children.front(); } - + //! Sets which value_nodes should be selected - virtual void set_selected_children(const ChildrenList &children_list) + virtual void set_selected_children(const ChildrenList &/*children_list*/) { return; } //! Sets which value_node should be selected. Empty handle if none. - virtual void set_selected_child(const ChildrenList::value_type &child) + virtual void set_selected_child(const ChildrenList::value_type &/*child*/) { return; } @@ -579,14 +565,14 @@ public: { return; } - - - + + + int get_selected_layer_parameter_count()const { return get_selected_layer_parameters().size(); } - + LayerParamList get_selected_layer_parameters()const { if(!view->layer_tree) return LayerParamList(); @@ -595,9 +581,9 @@ public: if(!selection) return LayerParamList(); - + LayerParamList ret; - + Gtk::TreeModel::Children children = const_cast(view)->layer_tree_store()->children(); Gtk::TreeModel::Children::iterator iter; for(iter = children.begin(); iter != children.end(); ++iter) @@ -613,23 +599,23 @@ public: } return ret; } - + LayerParam get_selected_layer_parameter() const { if(!view->layer_tree) return LayerParam(); return get_selected_layer_parameters().front(); } - - void set_selected_layer_parameters(const LayerParamList &layer_param_list) + + void set_selected_layer_parameters(const LayerParamList &/*layer_param_list*/) { return; } - - void set_selected_layer_param(const LayerParam &layer_param) + + void set_selected_layer_param(const LayerParam &/*layer_param*/) { return; } - + void clear_selected_layer_parameters() { return; @@ -673,16 +659,16 @@ CanvasView::CanvasView(etl::loose_handle instance,etl::handle instance,etl::handleset_time(0); //layer_tree_store_->rebuild(); - + // Set up the UI and Selection managers canvas_interface()->set_ui_interface(get_ui_interface()); canvas_interface()->set_selection_manager(get_selection_manager()); rebuild_ducks_queued=false; - + //notebook=manage(new class Gtk::Notebook()); //Gtk::VPaned *vpaned = manage(new class Gtk::VPaned()); //vpaned->pack1(*create_work_area(), Gtk::EXPAND|Gtk::SHRINK); @@ -717,25 +703,25 @@ CanvasView::CanvasView(etl::loose_handle instance,etl::handleshow(); - - //notebook->append_page(*create_layer_tree(),"Layers"); - //notebook->append_page(*create_children_tree(),"Children"); - //notebook->append_page(*create_keyframe_tree(),"Keyframes"); - + + //notebook->append_page(*create_layer_tree(),_("Layers")); + //notebook->append_page(*create_children_tree(),_("Children")); + //notebook->append_page(*create_keyframe_tree(),_("Keyframes")); + //synfig::info("Canvasview: Before big chunk of allocation and tabling stuff"); //create all allocated stuff for this canvas audio = new AudioContainer(); - - Gtk::Table *layout_table= manage(new class Gtk::Table(1, 3, false)); + + Gtk::Table *layout_table= manage(new class Gtk::Table(1, 3, false)); //layout_table->attach(*vpaned, 0, 1, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); layout_table->attach(*create_work_area(), 0, 1, 1, 2, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); - init_menus(); + init_menus(); //layout_table->attach(*App::ui_manager()->get_widget("/menu-main"), 0, 1, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 0, 0); - - + + layout_table->attach(*create_time_bar(), 0, 1, 3, 4, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 0, 0); layout_table->attach(*create_status_bar(), 0, 1, 4, 5, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK|Gtk::FILL, 0, 0); - + update_title(); layout_table->show(); @@ -758,10 +744,10 @@ CanvasView::CanvasView(etl::loose_handle instance,etl::handlesignal_rend_desc_changed().connect(sigc::mem_fun(*this,&studio::CanvasView::refresh_rend_desc)); waypoint_dialog.signal_changed().connect(sigc::mem_fun(*this,&studio::CanvasView::on_waypoint_changed)); waypoint_dialog.signal_delete().connect(sigc::mem_fun(*this,&studio::CanvasView::on_waypoint_delete)); - + //MODIFIED TIME ADJUSTMENT STUFF.... time_window_adjustment().set_child_adjustment(&time_adjustment()); - time_window_adjustment().signal_value_changed().connect(sigc::mem_fun(*this,&studio::CanvasView::refresh_time_window)); + time_window_adjustment().signal_value_changed().connect(sigc::mem_fun(*this,&studio::CanvasView::refresh_time_window)); time_adjustment().signal_value_changed().connect(sigc::mem_fun(*this,&studio::CanvasView::time_was_changed)); @@ -786,38 +772,45 @@ CanvasView::CanvasView(etl::loose_handle instance,etl::handlequeue_render_preview(); - + // If the canvas is really big, zoom out so that we can fit it all in the window - /*! \todo In other words, this is a zoom-to-fit, and should be - ** in it's own function. + /*! \todo In other words, this is a zoom-to-fit, and should be + ** in its own function. */ int w=get_canvas()->rend_desc().get_w()+70; int h=get_canvas()->rend_desc().get_h()+70; while(w>700 || h>600) { + // Minor hack: + // zoom_out() => + // WorkArea::async_update_preview() => + // WorkArea::set_zoom(float) => + // WorkArea::async_update_preview() => + // desc.set_time(cur_time), where cur_time isn't initialized + work_area->set_time(0); work_area->zoom_out(); w=round_to_int(get_canvas()->rend_desc().get_w()*work_area->get_zoom()+70); h=round_to_int(get_canvas()->rend_desc().get_h()*work_area->get_zoom()+70); - } + } if(w>700)w=700; - if(h>600)h=600; + if(h>600)h=600; set_default_size(w,h); property_window_position().set_value(Gtk::WIN_POS_NONE); - - - - + + + + std::list listTargets; listTargets.push_back( Gtk::TargetEntry("STRING") ); listTargets.push_back( Gtk::TargetEntry("text/plain") ); @@ -840,38 +833,38 @@ CanvasView::CanvasView(etl::loose_handle instance,etl::handlesignal_file_changed().connect(sigc::mem_fun(*this,&CanvasView::on_audio_file_change)); sound_dialog->signal_offset_changed().connect(sigc::mem_fun(*this,&CanvasView::on_audio_offset_change)); - - //attach to the preview when it's visible + + //attach to the preview when it's visible //preview_dialog->get_widget().signal_play().connect(sigc::mem_fun(*this,&CanvasView::play_audio)); //preview_dialog->get_widget().signal_stop().connect(sigc::mem_fun(*this,&CanvasView::stop_audio)); - + //hook to metadata signals get_canvas()->signal_meta_data_changed("audiofile").connect(sigc::mem_fun(*this,&CanvasView::on_audio_file_notify)); get_canvas()->signal_meta_data_changed("audiooffset").connect(sigc::mem_fun(*this,&CanvasView::on_audio_offset_notify)); //universal_scrubber=std::auto_ptr(new UniversalScrubber(this)); } - + //synfig::info("Canvasview: Before Final time set up"); //MORE TIME STUFF time_window_adjustment().set_value(get_canvas()->rend_desc().get_time_start()); time_window_adjustment().value_changed(); - + GRAB_HINT_DATA("canvas_view"); /* { @@ -880,12 +873,12 @@ CanvasView::CanvasView(etl::loose_handle instance,etl::handlesecond) delete ext_widget_book_.begin()->second; } - + //delete preview audio.reset(); - + hide(); - - synfig::info("CanvasView:~CanvasView(): Destructor Finished"); + + // don't be calling on_dirty_preview once this object has been deleted; + // this was causing a crash before + canvas_interface()->signal_dirty_preview().clear(); + + if (getenv("SYNFIG_DEBUG_DESTRUCTORS")) + synfig::info("CanvasView::~CanvasView(): Deleted"); } +std::list& +CanvasView::get_pixel_sizes() +{ + // prime factors of 120 are 2, 2, 2, 3, 5 - see TILE_SIZE in synfig-core/trunk/src/synfig/target_tile.h + static int pixel_size_array[] = {2,3,4,5,6,8,10,12,15,20,24,30,40,60,120}; + static list pixel_sizes = list(pixel_size_array, pixel_size_array + sizeof(pixel_size_array) / sizeof(int)); + + return pixel_sizes; +} + Gtk::Widget * CanvasView::create_time_bar() { @@ -933,8 +941,8 @@ CanvasView::create_time_bar() timeslider->set_time_adjustment(&time_adjustment()); timeslider->set_bounds_adjustment(&time_window_adjustment()); //layout_table->attach(*timeslider, 0, 1, 2, 3, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK|Gtk::FILL); - - + + tooltips.set_tip(*time_window_scroll,_("Moves the time window")); tooltips.set_tip(*timeslider,_("Changes the current time")); time_window_scroll->show(); @@ -944,19 +952,19 @@ CanvasView::create_time_bar() //time_scroll->signal_value_changed().connect(sigc::mem_fun(*work_area, &studio::WorkArea::render_preview_hook)); //time_scroll->set_update_policy(Gtk::UPDATE_DISCONTINUOUS); - - NORMAL_BUTTON(animatebutton,"gtk-yes","Animate"); + + NORMAL_BUTTON(animatebutton,"gtk-yes",_("Animate")); animatebutton->signal_clicked().connect(sigc::mem_fun(*this, &studio::CanvasView::on_animate_button_pressed)); animatebutton->show(); - NORMAL_BUTTON(keyframebutton,"synfig-keyframe_lock_all","All Keyframes Locked"); + NORMAL_BUTTON(keyframebutton,"synfig-keyframe_lock_all",_("All Keyframes Locked")); keyframebutton->signal_clicked().connect(sigc::mem_fun(*this, &studio::CanvasView::on_keyframe_button_pressed)); keyframebutton->show(); - + Gtk::Table *table= manage(new class Gtk::Table(2, 3, false)); //setup the audio display - disp_audio->set_size_request(-1,32); //disp_audio.show(); + disp_audio->set_size_request(-1,32); //disp_audio->show(); disp_audio->set_time_adjustment(&time_adjustment()); disp_audio->signal_start_scrubbing().connect( sigc::mem_fun(*audio,&AudioContainer::start_scrubbing) @@ -967,7 +975,7 @@ CanvasView::create_time_bar() disp_audio->signal_stop_scrubbing().connect( sigc::mem_fun(*audio,&AudioContainer::stop_scrubbing) ); - + table->attach(*manage(disp_audio), 0, 1, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK); table->attach(*timeslider, 0, 1, 1, 2, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK, 0, 0); table->attach(*time_window_scroll, 0, 1, 2, 3, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK, 0, 0); @@ -1004,11 +1012,11 @@ CanvasView::create_status_bar() Gtk::Table *statusbartable= manage(new class Gtk::Table(7, 1, false)); // statusbar = manage(new class Gtk::Statusbar()); // This is already done at construction progressbar =manage(new class Gtk::ProgressBar()); - SMALL_BUTTON(stopbutton,"gtk-stop","Stop"); - SMALL_BUTTON(refreshbutton,"gtk-refresh","Refresh"); - //SMALL_BUTTON(treetogglebutton,"gtk-go-down","Toggle Layer Tree"); -// NEW_SMALL_BUTTON(raisebutton,"gtk-go-up","Raise Layer"); -// NEW_SMALL_BUTTON(lowerbutton,"gtk-go-down","Lower Layer"); + SMALL_BUTTON(stopbutton,"gtk-stop",_("Stop")); + SMALL_BUTTON(refreshbutton,"gtk-refresh",_("Refresh")); + //SMALL_BUTTON(treetogglebutton,"gtk-go-down",_("Toggle Layer Tree")); +// NEW_SMALL_BUTTON(raisebutton,"gtk-go-up",_("Raise Layer")); +// NEW_SMALL_BUTTON(lowerbutton,"gtk-go-down",_("Lower Layer")); //statusbartable->attach(*treetogglebutton, 0, 1, 0, 1, Gtk::SHRINK, Gtk::SHRINK, 0, 0); // statusbartable->attach(*lowerbutton, 0, 1, 0, 1, Gtk::SHRINK, Gtk::SHRINK, 0, 0); // statusbartable->attach(*raisebutton, 1, 2, 0, 1, Gtk::SHRINK, Gtk::SHRINK, 0, 0); @@ -1040,7 +1048,7 @@ CanvasView::create_status_bar() refreshbutton->signal_clicked().connect(SLOT_EVENT(EVENT_REFRESH)); stopbutton->signal_clicked().connect(SLOT_EVENT(EVENT_STOP)); - + statusbartable->show_all(); return statusbartable; } @@ -1049,109 +1057,117 @@ void CanvasView::on_current_time_widget_changed() { set_time(current_time_widget->get_value()); -} - -Gtk::Widget* -CanvasView::create_children_tree() -{ - // Create the layer tree - children_tree=manage(new class ChildrenTree()); - - // Set up the layer tree - //children_tree->set_model(children_tree_store()); - if(children_tree)children_tree->set_time_adjustment(time_adjustment()); - if(children_tree)children_tree->show(); - - // Connect Signals - if(children_tree)children_tree->signal_edited_value().connect(sigc::mem_fun(*this, &studio::CanvasView::on_edited_value)); - if(children_tree)children_tree->signal_user_click().connect(sigc::mem_fun(*this, &studio::CanvasView::on_children_user_click)); - if(children_tree)children_tree->signal_waypoint_clicked().connect(sigc::mem_fun(*this, &studio::CanvasView::on_waypoint_clicked)); - if(children_tree)children_tree->get_selection()->signal_changed().connect(SLOT_EVENT(EVENT_REFRESH_DUCKS)); - - return children_tree; -} - -Gtk::Widget* -CanvasView::create_keyframe_tree() -{ - keyframe_tree=manage(new KeyframeTree()); - - //keyframe_tree->get_selection()->set_mode(Gtk::SELECTION_MULTIPLE); - //keyframe_tree->show(); - //keyframe_tree->set_model(keyframe_tree_store()); - keyframe_tree->set_editable(true); - //keyframe_tree->signal_edited().connect(sigc::hide_return(sigc::mem_fun(*canvas_interface(), &synfigapp::CanvasInterface::update_keyframe))); - - keyframe_tree->signal_event().connect(sigc::mem_fun(*this, &studio::CanvasView::on_keyframe_tree_event)); - - Gtk::ScrolledWindow *scroll_layer_tree = manage(new class Gtk::ScrolledWindow()); - scroll_layer_tree->set_flags(Gtk::CAN_FOCUS); - scroll_layer_tree->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); - scroll_layer_tree->add(*keyframe_tree); - scroll_layer_tree->set_shadow_type(Gtk::SHADOW_ETCHED_IN); - //scroll_layer_tree->show(); - - - Gtk::Table *layout_table= manage(new Gtk::Table(1, 2, false)); - layout_table->attach(*scroll_layer_tree, 0, 1, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); - - Gtk::Image *icon; - Gtk::IconSize iconsize(Gtk::IconSize::from_name("synfig-small_icon")); - - NEW_SMALL_BUTTON(button_add,"gtk-add","New Keyframe"); - NEW_SMALL_BUTTON(button_duplicate,"synfig-duplicate","Duplicate Keyframe"); - NEW_SMALL_BUTTON(button_delete,"gtk-delete","Delete Keyframe"); - - Gtk::HBox *hbox(manage(new Gtk::HBox())); - layout_table->attach(*hbox, 0, 1, 1, 2, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK, 0, 0); - - hbox->pack_start(*button_add,Gtk::PACK_SHRINK); - hbox->pack_start(*button_duplicate,Gtk::PACK_SHRINK); - hbox->pack_start(*button_delete,Gtk::PACK_SHRINK); - - /* - button_raise->set_relief(Gtk::RELIEF_HALF); - button_lower->set_relief(Gtk::RELIEF_HALF); - button_duplicate->set_relief(Gtk::RELIEF_HALF); - button_delete->set_relief(Gtk::RELIEF_HALF); - */ - - button_add->signal_clicked().connect(sigc::mem_fun(*this, &studio::CanvasView::on_keyframe_add_pressed)); - button_duplicate->signal_clicked().connect(sigc::mem_fun(*this, &studio::CanvasView::on_keyframe_duplicate_pressed)); - button_delete->signal_clicked().connect(sigc::mem_fun(*this, &studio::CanvasView::on_keyframe_remove_pressed)); - //layout_table->show_all(); - - keyframe_tab_child=layout_table; - - - layout_table->hide(); - - return layout_table; -} - -Gtk::Widget* -CanvasView::create_layer_tree() -{ - // Create the layer tree - layer_tree=manage(new class LayerTree()); - - // Set up the layer tree - //layer_tree->set_model(layer_tree_store()); - layer_tree->set_time_adjustment(time_adjustment()); - layer_tree->show(); - - // Connect Signals - layer_tree->signal_layer_toggle().connect(sigc::mem_fun(*this, &studio::CanvasView::on_layer_toggle)); - layer_tree->signal_edited_value().connect(sigc::mem_fun(*this, &studio::CanvasView::on_edited_value)); - layer_tree->signal_layer_user_click().connect(sigc::mem_fun(*this, &studio::CanvasView::on_layer_user_click)); - layer_tree->signal_param_user_click().connect(sigc::mem_fun(*this, &studio::CanvasView::on_children_user_click)); - layer_tree->signal_waypoint_clicked().connect(sigc::mem_fun(*this, &studio::CanvasView::on_waypoint_clicked)); - layer_tree->get_selection()->signal_changed().connect(SLOT_EVENT(EVENT_REFRESH_DUCKS)); - - layer_tree->hide(); - return layer_tree; -} + // show the value being used - it will have been rounded to nearest frame + // this was already being done elsewhere, but only if the time was really changed; + // if the current time was 6f and the user edited it to 6.1f, then the 6.1f would + // be left in the display without the following line to fix it + current_time_widget->set_value(get_time()); + current_time_widget->set_position(-1); // leave the cursor at the end +} + +// Gtk::Widget* +// CanvasView::create_children_tree() +// { +// // Create the layer tree +// children_tree=manage(new class ChildrenTree()); +// +// // Set up the layer tree +// //children_tree->set_model(children_tree_store()); +// if(children_tree)children_tree->set_time_adjustment(time_adjustment()); +// if(children_tree)children_tree->show(); +// +// // Connect Signals +// if(children_tree)children_tree->signal_edited_value().connect(sigc::mem_fun(*this, &studio::CanvasView::on_edited_value)); +// if(children_tree)children_tree->signal_user_click().connect(sigc::mem_fun(*this, &studio::CanvasView::on_children_user_click)); +// if(children_tree)children_tree->signal_waypoint_clicked_childrentree().connect(sigc::mem_fun(*this, &studio::CanvasView::on_waypoint_clicked_canvasview)); +// if(children_tree)children_tree->get_selection()->signal_changed().connect(SLOT_EVENT(EVENT_REFRESH_DUCKS)); +// +// return children_tree; +// } + +// Gtk::Widget* +// CanvasView::create_keyframe_tree() +// { +// keyframe_tree=manage(new KeyframeTree()); +// +// //keyframe_tree->get_selection()->set_mode(Gtk::SELECTION_MULTIPLE); +// //keyframe_tree->show(); +// //keyframe_tree->set_model(keyframe_tree_store()); +// keyframe_tree->set_editable(true); +// //keyframe_tree->signal_edited().connect(sigc::hide_return(sigc::mem_fun(*canvas_interface(), &synfigapp::CanvasInterface::update_keyframe))); +// +// keyframe_tree->signal_event().connect(sigc::mem_fun(*this, &studio::CanvasView::on_keyframe_tree_event)); +// +// Gtk::ScrolledWindow *scroll_layer_tree = manage(new class Gtk::ScrolledWindow()); +// scroll_layer_tree->set_flags(Gtk::CAN_FOCUS); +// scroll_layer_tree->set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); +// scroll_layer_tree->add(*keyframe_tree); +// scroll_layer_tree->set_shadow_type(Gtk::SHADOW_ETCHED_IN); +// //scroll_layer_tree->show(); +// +// +// Gtk::Table *layout_table= manage(new Gtk::Table(1, 2, false)); +// layout_table->attach(*scroll_layer_tree, 0, 1, 0, 1, Gtk::EXPAND|Gtk::FILL, Gtk::EXPAND|Gtk::FILL, 0, 0); +// +// Gtk::Image *icon; +// Gtk::IconSize iconsize(Gtk::IconSize::from_name("synfig-small_icon")); +// +// NEW_SMALL_BUTTON(button_add,"gtk-add",_("New Keyframe")); +// NEW_SMALL_BUTTON(button_duplicate,"synfig-duplicate",_("Duplicate Keyframe")); +// NEW_SMALL_BUTTON(button_delete,"gtk-delete",_("Delete Keyframe")); +// +// Gtk::HBox *hbox(manage(new Gtk::HBox())); +// layout_table->attach(*hbox, 0, 1, 1, 2, Gtk::EXPAND|Gtk::FILL, Gtk::SHRINK, 0, 0); +// +// hbox->pack_start(*button_add,Gtk::PACK_SHRINK); +// hbox->pack_start(*button_duplicate,Gtk::PACK_SHRINK); +// hbox->pack_start(*button_delete,Gtk::PACK_SHRINK); +// +// /* +// button_raise->set_relief(Gtk::RELIEF_HALF); +// button_lower->set_relief(Gtk::RELIEF_HALF); +// button_duplicate->set_relief(Gtk::RELIEF_HALF); +// button_delete->set_relief(Gtk::RELIEF_HALF); +// */ +// +// button_add->signal_clicked().connect(sigc::mem_fun(*this, &studio::CanvasView::on_keyframe_add_pressed)); +// button_duplicate->signal_clicked().connect(sigc::mem_fun(*this, &studio::CanvasView::on_keyframe_duplicate_pressed)); +// button_delete->signal_clicked().connect(sigc::mem_fun(*this, &studio::CanvasView::on_keyframe_remove_pressed)); +// +// //layout_table->show_all(); +// +// keyframe_tab_child=layout_table; +// +// +// layout_table->hide(); +// +// return layout_table; +// } + +// Gtk::Widget* +// CanvasView::create_layer_tree() +// { +// // Create the layer tree +// printf("CanvasView::create_layer_tree()\n"); +// layer_tree=manage(new class LayerTree()); +// +// // Set up the layer tree +// //layer_tree->set_model(layer_tree_store()); +// layer_tree->set_time_adjustment(time_adjustment()); +// layer_tree->show(); +// +// // Connect Signals +// layer_tree->signal_layer_toggle().connect(sigc::mem_fun(*this, &studio::CanvasView::on_layer_toggle)); +// layer_tree->signal_edited_value().connect(sigc::mem_fun(*this, &studio::CanvasView::on_edited_value)); +// layer_tree->signal_layer_user_click().connect(sigc::mem_fun(*this, &studio::CanvasView::on_layer_user_click)); +// layer_tree->signal_param_user_click().connect(sigc::mem_fun(*this, &studio::CanvasView::on_children_user_click)); +// layer_tree->signal_waypoint_clicked_layertree().connect(sigc::mem_fun(*this, &studio::CanvasView::on_waypoint_clicked_canvasview)); +// layer_tree->get_selection()->signal_changed().connect(SLOT_EVENT(EVENT_REFRESH_DUCKS)); +// +// layer_tree->hide(); +// return layer_tree; +// } void CanvasView::init_menus() @@ -1170,7 +1186,7 @@ CanvasView::init_menus() layermenu.set_accel_path("/Layer"); */ //cache the position of desired widgets - + /*Menus to worry about: - filemenu - editmenu @@ -1181,8 +1197,14 @@ CanvasView::init_menus() - viewmenu */ action_group = Gtk::ActionGroup::create(); - - //action_group->add( Gtk::Action::create("MenuFile", "_File") ); + + //action_group->add( Gtk::Action::create("MenuFile", _("_File")) ); + action_group->add( Gtk::Action::create("new", Gtk::Stock::NEW), + sigc::hide_return(sigc::ptr_fun(&studio::App::new_instance)) + ); + action_group->add( Gtk::Action::create("open", Gtk::Stock::OPEN), + sigc::hide_return(sigc::ptr_fun(&studio::App::dialog_open)) + ); action_group->add( Gtk::Action::create("save", Gtk::Stock::SAVE), hide_return(sigc::mem_fun(*get_instance().get(), &studio::Instance::save)) ); @@ -1219,8 +1241,14 @@ CanvasView::init_menus() action_group->add( Gtk::Action::create("options", _("Options")), sigc::mem_fun0(canvas_options,&studio::CanvasOptions::present) ); - action_group->add( Gtk::Action::create("close", Gtk::StockID("gtk-close")), - sigc::hide_return(sigc::mem_fun(*this,&studio::CanvasView::close)) + action_group->add( Gtk::Action::create("close", Gtk::StockID("gtk-close"), _("Close Window")), + sigc::hide_return(sigc::mem_fun(*this,&studio::CanvasView::close_view)) + ); + action_group->add( Gtk::Action::create("close-document", Gtk::StockID("gtk-close"), _("Close Document")), + sigc::hide_return(sigc::mem_fun(*this,&studio::CanvasView::close_instance)) + ); + action_group->add( Gtk::Action::create("quit", Gtk::StockID("gtk-quit"), _("Quit")), + sigc::hide_return(sigc::ptr_fun(&studio::App::quit)) ); //action_group->add( Gtk::Action::create("undo", Gtk::StockID("gtk-undo")), @@ -1242,7 +1270,7 @@ CanvasView::init_menus() action_group->add( Gtk::Action::create("stop", Gtk::StockID("gtk-stop")), SLOT_EVENT(EVENT_STOP) ); - + action_group->add( Gtk::Action::create("refresh", Gtk::StockID("gtk-refresh")), SLOT_EVENT(EVENT_REFRESH) ); @@ -1262,9 +1290,16 @@ CanvasView::init_menus() ); for(i=1;i<=10;i++) { - Glib::RefPtr action(Gtk::RadioAction::create(quality_group,strprintf("quality-%02d",i), strprintf("Set Quality to %d",i))); - if(i==10) - action->property_value()=10; + String note; + if (i == 1) note = _(" (best)"); + if (i == 10) note = _(" (fastest)"); + Glib::RefPtr action(Gtk::RadioAction::create(quality_group,strprintf("quality-%02d",i), + strprintf(_("Set Quality to %d"),i) + note)); + if (i==8) // default quality + { + action->set_active(); + work_area->set_quality(i); + } action_group->add( action, sigc::bind( sigc::mem_fun(*work_area, &studio::WorkArea::set_quality), @@ -1274,30 +1309,68 @@ CanvasView::init_menus() } } - action_group->add( Gtk::Action::create("play", Gtk::StockID("synfig-play")), + // Low-Res Quality Menu + { + int i; + for(list::iterator iter = CanvasView::get_pixel_sizes().begin(); iter != CanvasView::get_pixel_sizes().end(); iter++) + { + i = *iter; + Glib::RefPtr action(Gtk::RadioAction::create(low_res_pixel_size_group,strprintf("lowres-pixel-%d",i), + strprintf(_("Set Low-Res pixel size to %d"),i))); + if(i==2) // default pixel size + { + action->set_active(); + work_area->set_low_res_pixel_size(i); + } + action_group->add( action, + sigc::bind( + sigc::mem_fun(*work_area, &studio::WorkArea::set_low_res_pixel_size), + i + ) + ); + } + + Glib::RefPtr action; + + action=Gtk::Action::create("decrease-low-res-pixel-size", _("Decrease Low-Res Pixel Size")); + action_group->add( action,sigc::mem_fun(this, &studio::CanvasView::decrease_low_res_pixel_size)); + + action=Gtk::Action::create("increase-low-res-pixel-size", _("Increase Low-Res Pixel Size")); + action_group->add( action, sigc::mem_fun(this, &studio::CanvasView::increase_low_res_pixel_size)); + + } + + action_group->add( Gtk::Action::create("play", Gtk::Stock::MEDIA_PLAY), sigc::mem_fun(*this, &studio::CanvasView::play) ); - + action_group->add( Gtk::Action::create("dialog-flipbook", _("Flipbook Dialog")), sigc::mem_fun0(*preview_dialog, &studio::Dialog_Preview::present) ); - action_group->add( Gtk::Action::create("toggle-grid-show", _("Toggle Grid Show")), - sigc::mem_fun(*work_area, &studio::WorkArea::toggle_grid) - ); - action_group->add( Gtk::Action::create("toggle-grid-snap", _("Toggle Grid Snap")), - sigc::mem_fun(*work_area, &studio::WorkArea::toggle_grid_snap) - ); - action_group->add( Gtk::Action::create("toggle-guide-show", _("Toggle Guide Show")), - sigc::mem_fun(*work_area, &studio::WorkArea::toggle_guide_snap) - ); - action_group->add( Gtk::Action::create("toggle-low-res", _("Toggle Low-Res")), - sigc::mem_fun(*work_area, &studio::WorkArea::toggle_low_resolution_flag) - ); - action_group->add( Gtk::Action::create("toggle-onion-skin", _("Toggle Onion Skin")), - sigc::mem_fun(*work_area, &studio::WorkArea::toggle_onion_skin) - ); + { + Glib::RefPtr action; + + action = Gtk::ToggleAction::create("toggle-grid-show", _("Show Grid")); + action->set_active(work_area->grid_status()); + action_group->add(action, sigc::mem_fun(*work_area, &studio::WorkArea::toggle_grid)); + + action = Gtk::ToggleAction::create("toggle-grid-snap", _("Snap to Grid")); + action->set_active(work_area->get_grid_snap()); + action_group->add(action, sigc::mem_fun(*work_area, &studio::WorkArea::toggle_grid_snap)); + action = Gtk::ToggleAction::create("toggle-guide-show", _("Show Guides")); + action->set_active(work_area->get_show_guides()); + action_group->add(action, sigc::mem_fun(*work_area, &studio::WorkArea::toggle_guide_snap)); + + action = Gtk::ToggleAction::create("toggle-low-res", _("Use Low-Res")); + action->set_active(work_area->get_low_resolution_flag()); + action_group->add(action, sigc::mem_fun(*work_area, &studio::WorkArea::toggle_low_resolution_flag)); + + action = Gtk::ToggleAction::create("toggle-onion-skin", _("Show Onion Skin")); + action->set_active(work_area->get_onion_skin()); + action_group->add(action, sigc::mem_fun(*work_area, &studio::WorkArea::toggle_onion_skin)); + } action_group->add( Gtk::Action::create("canvas-zoom-fit", Gtk::StockID("gtk-zoom-fit")), sigc::mem_fun(*work_area, &studio::WorkArea::zoom_fit) @@ -1306,25 +1379,22 @@ CanvasView::init_menus() sigc::mem_fun(*work_area, &studio::WorkArea::zoom_norm) ); - { Glib::RefPtr action; - + action=Gtk::Action::create("seek-next-frame", Gtk::Stock::GO_FORWARD,_("Next Frame"),_("Next Frame")); action_group->add(action,sigc::bind(sigc::mem_fun(*canvas_interface().get(), &synfigapp::CanvasInterface::seek_frame),1)); action=Gtk::Action::create("seek-prev-frame", Gtk::Stock::GO_BACK,_("Prev Frame"),_("Prev Frame")); action_group->add( action, sigc::bind(sigc::mem_fun(*canvas_interface().get(), &synfigapp::CanvasInterface::seek_frame),-1)); - action=Gtk::Action::create("seek-next-second", Gtk::Stock::GO_FORWARD,_("Seek Foward"),_("Seek Foward")); + action=Gtk::Action::create("seek-next-second", Gtk::Stock::GO_FORWARD,_("Seek Forward"),_("Seek Forward")); action_group->add(action,sigc::bind(sigc::mem_fun(*canvas_interface().get(), &synfigapp::CanvasInterface::seek_time),Time(1))); action=Gtk::Action::create("seek-prev-second", Gtk::Stock::GO_BACK,_("Seek Backward"),_("Seek Backward")); action_group->add( action, sigc::bind(sigc::mem_fun(*canvas_interface().get(), &synfigapp::CanvasInterface::seek_time),Time(-1))); - // Broken...!? - /* action=Gtk::Action::create("seek-end", Gtk::Stock::GOTO_LAST,_("Seek to End"),_("Seek to End")); action_group->add(action,sigc::bind(sigc::mem_fun(*canvas_interface().get(), &synfigapp::CanvasInterface::seek_time),Time::end())); - */ + action=Gtk::Action::create("seek-begin", Gtk::Stock::GOTO_FIRST,_("Seek to Begin"),_("Seek to Begin")); action_group->add( action, sigc::bind(sigc::mem_fun(*canvas_interface().get(), &synfigapp::CanvasInterface::seek_time),Time::begin())); @@ -1336,34 +1406,34 @@ CanvasView::init_menus() action=Gtk::Action::create("canvas-zoom-in", Gtk::Stock::ZOOM_IN); action_group->add( action,sigc::mem_fun(*work_area, &studio::WorkArea::zoom_in)); - + action=Gtk::Action::create("canvas-zoom-out", Gtk::Stock::ZOOM_OUT); action_group->add( action, sigc::mem_fun(*work_area, &studio::WorkArea::zoom_out) ); - + action=Gtk::Action::create("time-zoom-in", Gtk::Stock::ZOOM_IN, _("Zoom In on Timeline")); action_group->add( action, sigc::mem_fun(*this, &studio::CanvasView::time_zoom_in) ); - + action=Gtk::Action::create("time-zoom-out", Gtk::Stock::ZOOM_OUT, _("Zoom Out on Timeline")); action_group->add( action, sigc::mem_fun(*this, &studio::CanvasView::time_zoom_out) ); - + } -#define DUCK_MASK(lower,upper) \ - duck_mask_##lower=Gtk::ToggleAction::create("mask-" #lower "-ducks", _("Mask "#lower" ducks")); \ +#define DUCK_MASK(lower,upper,string) \ + duck_mask_##lower=Gtk::ToggleAction::create("mask-" #lower "-ducks", string); \ duck_mask_##lower->set_active((bool)(work_area->get_type_mask()&Duck::TYPE_##upper)); \ action_group->add( duck_mask_##lower, \ sigc::bind( \ sigc::mem_fun(*this, &studio::CanvasView::toggle_duck_mask), \ Duck::TYPE_##upper \ ) \ - ) - DUCK_MASK(position,POSITION); - DUCK_MASK(tangent,TANGENT); - DUCK_MASK(vertex,VERTEX); - DUCK_MASK(radius,RADIUS); - DUCK_MASK(width,WIDTH); - DUCK_MASK(angle,ANGLE); + ) + DUCK_MASK(position,POSITION,_("Show Position Ducks")); + DUCK_MASK(tangent,TANGENT,_("Show Tangent Ducks")); + DUCK_MASK(vertex,VERTEX,_("Show Vertex Ducks")); + DUCK_MASK(radius,RADIUS,_("Show Radius Ducks")); + DUCK_MASK(width,WIDTH,_("Show Width Ducks")); + DUCK_MASK(angle,ANGLE,_("Show Angle Ducks")); #undef DUCK_MASK add_accel_group(App::ui_manager()->get_accel_group()); @@ -1373,7 +1443,7 @@ CanvasView::init_menus() { Glib::RefPtr accel_action_group(Gtk::ActionGroup::create("canvas_view")); Glib::RefPtr action; - + action=Gtk::Action::create("seek-next-frame", Gtk::StockID("gtk-forward"),_("Next Frame"),_("Next Frame")); accel_action_group->add(action,sigc::bind(sigc::mem_fun(*canvas_interface().get(), &synfigapp::CanvasInterface::seek),1)); @@ -1388,16 +1458,16 @@ CanvasView::init_menus() action=Gtk::Action::create("canvas-zoom-in", Gtk::StockID("gtk-zoom-in")); accel_action_group->add( action,sigc::mem_fun(*work_area, &studio::WorkArea::zoom_in)); - + action=Gtk::Action::create("canvas-zoom-out", Gtk::StockID("gtk-zoom-out")); accel_action_group->add( action, sigc::mem_fun(*work_area, &studio::WorkArea::zoom_out) ); - + action=Gtk::Action::create("time-zoom-in", Gtk::StockID("gtk-zoom-in"), _("Zoom In on Timeline")); accel_action_group->add( action, sigc::mem_fun(*this, &studio::CanvasView::time_zoom_in) ); - + action=Gtk::Action::create("time-zoom-out", Gtk::StockID("gtk-zoom-out"), _("Zoom Out on Timeline")); accel_action_group->add( action, sigc::mem_fun(*this, &studio::CanvasView::time_zoom_out) ); - + Glib::RefPtr accel_ui_manager(Gtk::UIManager::create()); Glib::ustring ui_info = @@ -1416,7 +1486,7 @@ CanvasView::init_menus() accel_ui_manager->add_ui_from_string(ui_info); add_accel_group(accel_ui_manager->get_accel_group()); - + accel_ui_manager->insert_action_group(accel_action_group); set_ref_obj("accel_ui_manager",accel_ui_manager); set_ref_obj("accel_action_group",accel_action_group); @@ -1425,249 +1495,249 @@ CanvasView::init_menus() -#if 0 - - //Test some key stuff - - filemenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-save"), - hide_return(sigc::mem_fun(*get_instance().get(), &studio::Instance::save)))); - filemenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-save-as"),sigc::hide_return(sigc::mem_fun(*get_instance(), &studio::Instance::dialog_save_as)))); - filemenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-revert-to-saved"),hide_return(sigc::mem_fun(*get_instance().get(), &studio::Instance::safe_revert)))); - filemenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem()); - - filemenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("synfig-cvs_add"),sigc::hide_return(sigc::mem_fun(*get_instance(), &studio::Instance::dialog_cvs_add)))); - filemenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("synfig-cvs_update"),sigc::hide_return(sigc::mem_fun(*get_instance(), &studio::Instance::dialog_cvs_update)))); - filemenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("synfig-cvs_commit"),sigc::hide_return(sigc::mem_fun(*get_instance(), &studio::Instance::dialog_cvs_commit)))); - - filemenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem()); - filemenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Import..."),Gtk::AccelKey('I',Gdk::CONTROL_MASK),sigc::hide_return(sigc::mem_fun(*this, &studio::CanvasView::image_import)))); - filemenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem()); - filemenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Render"),Gtk::AccelKey("F9"), - sigc::mem_fun(render_settings,&studio::RenderSettings::present) - )); - filemenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Preview"),Gtk::AccelKey("F11"), - sigc::mem_fun(*this,&CanvasView::on_preview_option) - )); - filemenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Sound File"), - sigc::mem_fun(*this,&CanvasView::on_audio_option) - )); - - filemenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem()); - filemenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Options"),Gtk::AccelKey("F12"), - sigc::mem_fun(canvas_options,&studio::CanvasOptions::present) - )); - filemenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem()); - filemenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-close"),sigc::hide_return(sigc::mem_fun(*this,&studio::CanvasView::close)))); - - editmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-undo"),Gtk::AccelKey('Z',Gdk::CONTROL_MASK),SLOT_EVENT(EVENT_UNDO))); - editmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-redo"),Gtk::AccelKey('R',Gdk::CONTROL_MASK),SLOT_EVENT(EVENT_REDO))); - editmenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem()); - editmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-cut"),NOT_IMPLEMENTED_SLOT)); - editmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-copy"),NOT_IMPLEMENTED_SLOT)); - editmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-paste"),NOT_IMPLEMENTED_SLOT)); - editmenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem()); - editmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Select All Ducks"),Gtk::AccelKey('E',Gdk::CONTROL_MASK),sigc::mem_fun(*work_area,&studio::WorkArea::select_all_ducks))); - editmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Unselect All Layers"),Gtk::AccelKey('D',Gdk::CONTROL_MASK),sigc::mem_fun(*this,&CanvasView::on_unselect_layers))); - editmenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem()); - - //editmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-stop"),Gtk::AccelKey(GDK_Escape,static_cast(0)),sigc::hide_return(sigc::mem_fun(*this, &studio::CanvasView::stop)))); - //editmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-refresh"),Gtk::AccelKey('k',Gdk::CONTROL_MASK),sigc::hide_return(sigc::mem_fun(*this, &studio::CanvasView::on_refresh_pressed)))); - editmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-stop"),Gtk::AccelKey(GDK_Escape,static_cast(0)),SLOT_EVENT(EVENT_STOP))); - editmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-refresh"),Gtk::AccelKey('k',Gdk::CONTROL_MASK),SLOT_EVENT(EVENT_REFRESH))); - editmenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem()); - editmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("synfig-rotoscope_bline"), - sigc::mem_fun(*this, &studio::CanvasView::do_rotoscope_bline))); - editmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("synfig-rotoscope_polygon"), - sigc::mem_fun(*this, &studio::CanvasView::do_rotoscope_poly))); - editmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("synfig-eyedrop"), - sigc::mem_fun(*this, &studio::CanvasView::do_eyedrop))); - editmenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem()); - editmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-properties"),Gtk::AccelKey("F8"), - sigc::mem_fun(canvas_properties,&studio::CanvasProperties::present) - )); - - build_new_layer_menu(newlayermenu); - layermenu.items().push_back(Gtk::Menu_Helpers::MenuElem("New",newlayermenu)); - - - { - synfigapp::Action::ParamList param_list; - param_list.add("canvas",Canvas::Handle(get_canvas())); - param_list.add("canvas_interface",canvas_interface()); - add_actions_to_menu(&canvasmenu, param_list,synfigapp::Action::CATEGORY_CANVAS); - } - - - //canvasmenu.items().push_back(Gtk::Menu_Helpers::MenuElem("Keyframe Dialog",sigc::mem_fun(keyframe_dialog,&studio::Dialog_Keyframe::present))); - - // Duck Mask Menu - if(1) - { - duckmaskmenu.items().push_back(Gtk::Menu_Helpers::TearoffMenuElem()); - - duckmaskmenu.items().push_back(Gtk::Menu_Helpers::CheckMenuElem(_("Position Ducks"),Gtk::AccelKey('1',Gdk::MOD1_MASK))); - duck_mask_position=static_cast(&duckmaskmenu.items().back()); - duck_mask_position->set_active((bool)(work_area->get_type_mask()&Duck::TYPE_POSITION)); - duck_mask_position->signal_toggled().connect( - sigc::bind( - sigc::mem_fun(*this, &studio::CanvasView::toggle_duck_mask), - Duck::TYPE_POSITION - ) - ); - - duckmaskmenu.items().push_back(Gtk::Menu_Helpers::CheckMenuElem(_("Vertex Ducks"),Gtk::AccelKey('2',Gdk::MOD1_MASK))); - duck_mask_vertex=static_cast(&duckmaskmenu.items().back()); - duck_mask_vertex->set_active((bool)(work_area->get_type_mask()&Duck::TYPE_VERTEX)); - duck_mask_vertex->signal_toggled().connect( - sigc::bind( - sigc::mem_fun(*this, &studio::CanvasView::toggle_duck_mask), - Duck::TYPE_VERTEX - ) - ); - - duckmaskmenu.items().push_back(Gtk::Menu_Helpers::CheckMenuElem(_("Tangent Ducks"),Gtk::AccelKey('3',Gdk::MOD1_MASK))); - duck_mask_tangent=static_cast(&duckmaskmenu.items().back()); - duck_mask_tangent->set_active((bool)(work_area->get_type_mask()&Duck::TYPE_TANGENT)); - duck_mask_tangent->signal_toggled().connect( - sigc::bind( - sigc::mem_fun(*this, &studio::CanvasView::toggle_duck_mask), - Duck::TYPE_TANGENT - ) - ); - - duckmaskmenu.items().push_back(Gtk::Menu_Helpers::CheckMenuElem(_("Radius Ducks"),Gtk::AccelKey('4',Gdk::MOD1_MASK))); - duck_mask_radius=static_cast(&duckmaskmenu.items().back()); - duck_mask_radius->set_active((bool)(work_area->get_type_mask()&Duck::TYPE_RADIUS)); - duck_mask_radius->signal_toggled().connect( - sigc::bind( - sigc::mem_fun(*this, &studio::CanvasView::toggle_duck_mask), - Duck::TYPE_RADIUS - ) - ); - - duckmaskmenu.items().push_back(Gtk::Menu_Helpers::CheckMenuElem(_("Width Ducks"),Gtk::AccelKey('5',Gdk::MOD1_MASK))); - duck_mask_width=static_cast(&duckmaskmenu.items().back()); - duck_mask_width->set_active((bool)(work_area->get_type_mask()&Duck::TYPE_WIDTH)); - duck_mask_width->signal_toggled().connect( - sigc::bind( - sigc::mem_fun(*this, &studio::CanvasView::toggle_duck_mask), - Duck::TYPE_WIDTH - ) - ); - - duckmaskmenu.items().push_back(Gtk::Menu_Helpers::CheckMenuElem(_("Angle Ducks"),Gtk::AccelKey('6',Gdk::MOD1_MASK))); - duck_mask_angle=static_cast(&duckmaskmenu.items().back()); - duck_mask_angle->set_active((bool)(work_area->get_type_mask()&Duck::TYPE_ANGLE)); - duck_mask_angle->signal_toggled().connect( - sigc::bind( - sigc::mem_fun(*this, &studio::CanvasView::toggle_duck_mask), - Duck::TYPE_ANGLE - ) - ); - - viewmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("_Mask Ducks"),duckmaskmenu)); - } - - // Preview Quality Menu - if(1) - { - qualitymenu.items().push_back(Gtk::Menu_Helpers::TearoffMenuElem()); - int i; - qualitymenu.items().push_back(Gtk::Menu_Helpers::MenuElem(strprintf(_("Use Parametric Renderer"),0), - sigc::bind( - sigc::mem_fun(*work_area, &studio::WorkArea::set_quality), - 0 - ) - )); - for(i=1;i<=10;i++) - { - qualitymenu.items().push_back(Gtk::Menu_Helpers::MenuElem(strprintf(_("Set Quality to %d"),i),Gtk::AccelKey('0'+(i%10),Gdk::CONTROL_MASK), - sigc::bind( - sigc::mem_fun(*work_area, &studio::WorkArea::set_quality), - i - ) - )); - } - viewmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Preview Quality"),qualitymenu)); - } - - viewmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("synfig-play"), - sigc::mem_fun(*this, &studio::CanvasView::play))); - viewmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("Flipbook Dialog"), - sigc::mem_fun(*preview_dialog, &studio::Dialog_Preview::present))); - - viewmenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem()); - - viewmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Toggle Grid Show"),Gtk::AccelKey('g',Gdk::CONTROL_MASK), - sigc::mem_fun(*work_area, &studio::WorkArea::toggle_grid))); - viewmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Toggle Grid Snap"),Gtk::AccelKey('l',Gdk::CONTROL_MASK), - sigc::mem_fun(*work_area, &studio::WorkArea::toggle_grid_snap))); - viewmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Toggle Guide Snap"),Gtk::AccelKey('k',Gdk::CONTROL_MASK), - sigc::mem_fun(*work_area, &studio::WorkArea::toggle_guide_snap))); - viewmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Toggle Low-Res"),Gtk::AccelKey('`',Gdk::CONTROL_MASK), - sigc::mem_fun(*work_area, &studio::WorkArea::toggle_low_resolution_flag))); - - viewmenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem()); - - viewmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-zoom-in"),Gtk::AccelKey('=',static_cast(0)), - sigc::mem_fun(*work_area, &studio::WorkArea::zoom_in))); - viewmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-zoom-out"),Gtk::AccelKey('-',static_cast(0)), - sigc::mem_fun(*work_area, &studio::WorkArea::zoom_out))); - viewmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-zoom-fit"), - sigc::mem_fun(*work_area, &studio::WorkArea::zoom_fit))); - viewmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-zoom-100"),Gtk::AccelKey('`',static_cast(0)), - sigc::mem_fun(*work_area, &studio::WorkArea::zoom_norm))); - viewmenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem()); - - viewmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-zoom-in"),Gtk::AccelKey('+',static_cast(0)), - sigc::mem_fun(*this, &studio::CanvasView::time_zoom_in))); - viewmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-zoom-out"),Gtk::AccelKey('_',static_cast(0)), - sigc::mem_fun(*this, &studio::CanvasView::time_zoom_out))); - - viewmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Jump to Next Keyframe"),Gtk::AccelKey(']',static_cast(0)), - sigc::mem_fun(*canvas_interface().get(), &synfigapp::CanvasInterface::jump_to_next_keyframe))); - viewmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Jump to Prev Keyframe"),Gtk::AccelKey('[',static_cast(0)), - sigc::mem_fun(*canvas_interface().get(), &synfigapp::CanvasInterface::jump_to_prev_keyframe))); - - mainmenu.items().push_back(Gtk::Menu_Helpers::TearoffMenuElem()); - mainmenu.items().push_back(Gtk::Menu_Helpers::MenuElem("_File",filemenu)); - mainmenu.items().push_back(Gtk::Menu_Helpers::MenuElem("_Edit",editmenu)); - mainmenu.items().push_back(Gtk::Menu_Helpers::MenuElem("_View",viewmenu)); - mainmenu.items().push_back(Gtk::Menu_Helpers::MenuElem("_Canvas",canvasmenu)); - mainmenu.items().push_back(Gtk::Menu_Helpers::MenuElem("_Layer",layermenu)); - - mainmenu.accelerate(*this); - - { - - trackmenu.items().push_back(Gtk::Menu_Helpers::MenuElem("New Waypoint",NOT_IMPLEMENTED_SLOT)); - trackmenu.items().push_back(Gtk::Menu_Helpers::MenuElem("Delete Waypoint",NOT_IMPLEMENTED_SLOT)); - trackmenu.items().push_back(Gtk::Menu_Helpers::MenuElem("Export",NOT_IMPLEMENTED_SLOT)); - trackmenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem()); - trackmenu.items().push_back(Gtk::Menu_Helpers::MenuElem("Properties",NOT_IMPLEMENTED_SLOT)); - } - mainmenu.show(); - filemenu.show(); - editmenu.show(); - canvasmenu.show(); - layermenu.show(); - - keyframemenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-properties"), - sigc::mem_fun(*this,&studio::CanvasView::show_keyframe_dialog) - )); - - - get_accel_group()->unlock(); - - //Set the accelerator paths for all the menus - filemenu.set_accel_path("/File"); - editmenu.set_accel_path("/Edit"); - layermenu.set_accel_path("/Layer"); - //mainmenu.set_accel_path(""); - canvasmenu.set_accel_path("/Canvas"); - viewmenu.set_accel_path("/View"); - duckmaskmenu.set_accel_path("/DuckMask"); -#endif +#if 0 +// +// //Test some key stuff +// +// filemenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-save"), +// hide_return(sigc::mem_fun(*get_instance().get(), &studio::Instance::save)))); +// filemenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-save-as"),sigc::hide_return(sigc::mem_fun(*get_instance(), &studio::Instance::dialog_save_as)))); +// filemenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-revert-to-saved"),hide_return(sigc::mem_fun(*get_instance().get(), &studio::Instance::safe_revert)))); +// filemenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem()); +// +// filemenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("synfig-cvs_add"),sigc::hide_return(sigc::mem_fun(*get_instance(), &studio::Instance::dialog_cvs_add)))); +// filemenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("synfig-cvs_update"),sigc::hide_return(sigc::mem_fun(*get_instance(), &studio::Instance::dialog_cvs_update)))); +// filemenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("synfig-cvs_commit"),sigc::hide_return(sigc::mem_fun(*get_instance(), &studio::Instance::dialog_cvs_commit)))); +// +// filemenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem()); +// filemenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Import..."),Gtk::AccelKey('I',Gdk::CONTROL_MASK),sigc::hide_return(sigc::mem_fun(*this, &studio::CanvasView::image_import)))); +// filemenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem()); +// filemenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Render"),Gtk::AccelKey("F9"), +// sigc::mem_fun(render_settings,&studio::RenderSettings::present) +// )); +// filemenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Preview"),Gtk::AccelKey("F11"), +// sigc::mem_fun(*this,&CanvasView::on_preview_option) +// )); +// filemenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Sound File"), +// sigc::mem_fun(*this,&CanvasView::on_audio_option) +// )); +// +// filemenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem()); +// filemenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Options"),Gtk::AccelKey("F12"), +// sigc::mem_fun(canvas_options,&studio::CanvasOptions::present) +// )); +// filemenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem()); +// filemenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Close View"), +// sigc::hide_return(sigc::mem_fun(*this,&studio::CanvasView::close_view)) +// )); +// filemenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Close Document"), +// sigc::hide_return(sigc::mem_fun(*this,&studio::CanvasView::close_document)) +// )); +// +// editmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-undo"),Gtk::AccelKey('Z',Gdk::CONTROL_MASK),SLOT_EVENT(EVENT_UNDO))); +// editmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-redo"),Gtk::AccelKey('R',Gdk::CONTROL_MASK),SLOT_EVENT(EVENT_REDO))); +// editmenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem()); +// editmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-cut"),NOT_IMPLEMENTED_SLOT)); +// editmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-copy"),NOT_IMPLEMENTED_SLOT)); +// editmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-paste"),NOT_IMPLEMENTED_SLOT)); +// editmenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem()); +// editmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Select All Ducks"),Gtk::AccelKey('E',Gdk::CONTROL_MASK),sigc::mem_fun(*work_area,&studio::WorkArea::select_all_ducks))); +// editmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Unselect All Layers"),Gtk::AccelKey('D',Gdk::CONTROL_MASK),sigc::mem_fun(*this,&CanvasView::on_unselect_layers))); +// editmenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem()); +// +// //editmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-stop"),Gtk::AccelKey(GDK_Escape,static_cast(0)),sigc::hide_return(sigc::mem_fun(*this, &studio::CanvasView::stop)))); +// //editmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-refresh"),Gtk::AccelKey('k',Gdk::CONTROL_MASK),sigc::hide_return(sigc::mem_fun(*this, &studio::CanvasView::on_refresh_pressed)))); +// editmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-stop"),Gtk::AccelKey(GDK_Escape,static_cast(0)),SLOT_EVENT(EVENT_STOP))); +// editmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-refresh"),Gtk::AccelKey('k',Gdk::CONTROL_MASK),SLOT_EVENT(EVENT_REFRESH))); +// editmenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem()); +// editmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-properties"),Gtk::AccelKey("F8"), +// sigc::mem_fun(canvas_properties,&studio::CanvasProperties::present) +// )); +// +// build_new_layer_menu(newlayermenu); +// layermenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("New"),newlayermenu)); +// +// +// { +// synfigapp::Action::ParamList param_list; +// param_list.add("canvas",Canvas::Handle(get_canvas())); +// param_list.add("canvas_interface",canvas_interface()); +// add_actions_to_menu(&canvasmenu, param_list,synfigapp::Action::CATEGORY_CANVAS); +// } +// +// +// //canvasmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Keyframe Dialog"),sigc::mem_fun(keyframe_dialog,&studio::Dialog_Keyframe::present))); +// +// // Duck Mask Menu +// if(1) +// { +// duckmaskmenu.items().push_back(Gtk::Menu_Helpers::TearoffMenuElem()); +// +// duckmaskmenu.items().push_back(Gtk::Menu_Helpers::CheckMenuElem(_("Position Ducks"),Gtk::AccelKey('1',Gdk::MOD1_MASK))); +// duck_mask_position=static_cast(&duckmaskmenu.items().back()); +// duck_mask_position->set_active((bool)(work_area->get_type_mask()&Duck::TYPE_POSITION)); +// duck_mask_position->signal_toggled().connect( +// sigc::bind( +// sigc::mem_fun(*this, &studio::CanvasView::toggle_duck_mask), +// Duck::TYPE_POSITION +// ) +// ); +// +// duckmaskmenu.items().push_back(Gtk::Menu_Helpers::CheckMenuElem(_("Vertex Ducks"),Gtk::AccelKey('2',Gdk::MOD1_MASK))); +// duck_mask_vertex=static_cast(&duckmaskmenu.items().back()); +// duck_mask_vertex->set_active((bool)(work_area->get_type_mask()&Duck::TYPE_VERTEX)); +// duck_mask_vertex->signal_toggled().connect( +// sigc::bind( +// sigc::mem_fun(*this, &studio::CanvasView::toggle_duck_mask), +// Duck::TYPE_VERTEX +// ) +// ); +// +// duckmaskmenu.items().push_back(Gtk::Menu_Helpers::CheckMenuElem(_("Tangent Ducks"),Gtk::AccelKey('3',Gdk::MOD1_MASK))); +// duck_mask_tangent=static_cast(&duckmaskmenu.items().back()); +// duck_mask_tangent->set_active((bool)(work_area->get_type_mask()&Duck::TYPE_TANGENT)); +// duck_mask_tangent->signal_toggled().connect( +// sigc::bind( +// sigc::mem_fun(*this, &studio::CanvasView::toggle_duck_mask), +// Duck::TYPE_TANGENT +// ) +// ); +// +// duckmaskmenu.items().push_back(Gtk::Menu_Helpers::CheckMenuElem(_("Radius Ducks"),Gtk::AccelKey('4',Gdk::MOD1_MASK))); +// duck_mask_radius=static_cast(&duckmaskmenu.items().back()); +// duck_mask_radius->set_active((bool)(work_area->get_type_mask()&Duck::TYPE_RADIUS)); +// duck_mask_radius->signal_toggled().connect( +// sigc::bind( +// sigc::mem_fun(*this, &studio::CanvasView::toggle_duck_mask), +// Duck::TYPE_RADIUS +// ) +// ); +// +// duckmaskmenu.items().push_back(Gtk::Menu_Helpers::CheckMenuElem(_("Width Ducks"),Gtk::AccelKey('5',Gdk::MOD1_MASK))); +// duck_mask_width=static_cast(&duckmaskmenu.items().back()); +// duck_mask_width->set_active((bool)(work_area->get_type_mask()&Duck::TYPE_WIDTH)); +// duck_mask_width->signal_toggled().connect( +// sigc::bind( +// sigc::mem_fun(*this, &studio::CanvasView::toggle_duck_mask), +// Duck::TYPE_WIDTH +// ) +// ); +// +// duckmaskmenu.items().push_back(Gtk::Menu_Helpers::CheckMenuElem(_("Angle Ducks"),Gtk::AccelKey('6',Gdk::MOD1_MASK))); +// duck_mask_angle=static_cast(&duckmaskmenu.items().back()); +// duck_mask_angle->set_active((bool)(work_area->get_type_mask()&Duck::TYPE_ANGLE)); +// duck_mask_angle->signal_toggled().connect( +// sigc::bind( +// sigc::mem_fun(*this, &studio::CanvasView::toggle_duck_mask), +// Duck::TYPE_ANGLE +// ) +// ); +// +// viewmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("_Mask Ducks"),duckmaskmenu)); +// } +// +// // Preview Quality Menu +// if(1) +// { +// qualitymenu.items().push_back(Gtk::Menu_Helpers::TearoffMenuElem()); +// int i; +// qualitymenu.items().push_back(Gtk::Menu_Helpers::MenuElem(strprintf(_("Use Parametric Renderer"),0), +// sigc::bind( +// sigc::mem_fun(*work_area, &studio::WorkArea::set_quality), +// 0 +// ) +// )); +// for(i=1;i<=10;i++) +// { +// qualitymenu.items().push_back(Gtk::Menu_Helpers::MenuElem(strprintf(_("Set Quality to %d"),i),Gtk::AccelKey('0'+(i%10),Gdk::CONTROL_MASK), +// sigc::bind( +// sigc::mem_fun(*work_area, &studio::WorkArea::set_quality), +// i +// ) +// )); +// } +// viewmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Preview Quality"),qualitymenu)); +// } +// +// viewmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::Stock::MEDIA_PLAY, +// sigc::mem_fun(*this, &studio::CanvasView::play))); +// viewmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("Flipbook Dialog"), +// sigc::mem_fun(*preview_dialog, &studio::Dialog_Preview::present))); +// +// viewmenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem()); +// +// viewmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Toggle Grid Show"),Gtk::AccelKey('g',Gdk::CONTROL_MASK), +// sigc::mem_fun(*work_area, &studio::WorkArea::toggle_grid))); +// viewmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Toggle Grid Snap"),Gtk::AccelKey('l',Gdk::CONTROL_MASK), +// sigc::mem_fun(*work_area, &studio::WorkArea::toggle_grid_snap))); +// viewmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Toggle Guide Snap"),Gtk::AccelKey('k',Gdk::CONTROL_MASK), +// sigc::mem_fun(*work_area, &studio::WorkArea::toggle_guide_snap))); +// viewmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Toggle Low-Res"),Gtk::AccelKey('`',Gdk::CONTROL_MASK), +// sigc::mem_fun(*work_area, &studio::WorkArea::toggle_low_resolution_flag))); +// +// viewmenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem()); +// +// viewmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-zoom-in"),Gtk::AccelKey('=',static_cast(0)), +// sigc::mem_fun(*work_area, &studio::WorkArea::zoom_in))); +// viewmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-zoom-out"),Gtk::AccelKey('-',static_cast(0)), +// sigc::mem_fun(*work_area, &studio::WorkArea::zoom_out))); +// viewmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-zoom-fit"), +// sigc::mem_fun(*work_area, &studio::WorkArea::zoom_fit))); +// viewmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-zoom-100"),Gtk::AccelKey('`',static_cast(0)), +// sigc::mem_fun(*work_area, &studio::WorkArea::zoom_norm))); +// viewmenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem()); +// +// viewmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-zoom-in"),Gtk::AccelKey('+',static_cast(0)), +// sigc::mem_fun(*this, &studio::CanvasView::time_zoom_in))); +// viewmenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-zoom-out"),Gtk::AccelKey('_',static_cast(0)), +// sigc::mem_fun(*this, &studio::CanvasView::time_zoom_out))); +// +// viewmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Jump to Next Keyframe"),Gtk::AccelKey(']',static_cast(0)), +// sigc::mem_fun(*canvas_interface().get(), &synfigapp::CanvasInterface::jump_to_next_keyframe))); +// viewmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Jump to Prev Keyframe"),Gtk::AccelKey('[',static_cast(0)), +// sigc::mem_fun(*canvas_interface().get(), &synfigapp::CanvasInterface::jump_to_prev_keyframe))); +// +// mainmenu.items().push_back(Gtk::Menu_Helpers::TearoffMenuElem()); +// mainmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("_File"),filemenu)); +// mainmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("_Edit"),editmenu)); +// mainmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("_View"),viewmenu)); +// mainmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("_Canvas"),canvasmenu)); +// mainmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("_Layer"),layermenu)); +// +// mainmenu.accelerate(*this); +// +///* +// { +// +// trackmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("New Waypoint"),NOT_IMPLEMENTED_SLOT)); +// trackmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Delete Waypoint"),NOT_IMPLEMENTED_SLOT)); +// trackmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Export"),NOT_IMPLEMENTED_SLOT)); +// trackmenu.items().push_back(Gtk::Menu_Helpers::SeparatorElem()); +// trackmenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Properties"),NOT_IMPLEMENTED_SLOT)); +// } +//*/ +// mainmenu.show(); +// filemenu.show(); +// editmenu.show(); +// canvasmenu.show(); +// layermenu.show(); +// +// keyframemenu.items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-properties"), +// sigc::mem_fun(*this,&studio::CanvasView::show_keyframe_dialog) +// )); +// +// +// get_accel_group()->unlock(); +// +// //Set the accelerator paths for all the menus +// filemenu.set_accel_path("/File"); +// editmenu.set_accel_path("/Edit"); +// layermenu.set_accel_path("/Layer"); +// //mainmenu.set_accel_path(""); +// canvasmenu.set_accel_path("/Canvas"); +// viewmenu.set_accel_path("/View"); +// duckmaskmenu.set_accel_path("/DuckMask"); +#endif } void @@ -1683,9 +1753,9 @@ CanvasView::show_keyframe_dialog() if(selection->get_selected()) { Gtk::TreeRow row(*selection->get_selected()); - + Keyframe keyframe(row[keyframe_tree->model.keyframe]); - + keyframe_dialog.set_keyframe(keyframe); keyframe_dialog.present(); } @@ -1695,11 +1765,11 @@ void CanvasView::add_layer(synfig::String x) { Canvas::Handle canvas; - + synfigapp::SelectionManager::LayerList layer_list(get_selection_manager()->get_selected_layers()); - + int target_depth(0); - + if(layer_list.empty()) { canvas=get_canvas(); @@ -1710,12 +1780,12 @@ CanvasView::add_layer(synfig::String x) target_depth=canvas->get_depth(*layer_list.begin()); } - + Layer::Handle layer(canvas_interface()->add_layer_to(x,canvas,target_depth)); if(layer) { get_selection_manager()->clear_selected_layers(); - get_selection_manager()->set_selected_layer(layer); + get_selection_manager()->set_selected_layer(layer); } } @@ -1725,16 +1795,16 @@ CanvasView::popup_layer_menu(synfig::Layer::Handle layer) //Gtk::Menu* menu(manage(new Gtk::Menu)); Gtk::Menu* menu(¶mmenu); menu->items().clear(); - + synfigapp::Action::ParamList param_list; param_list.add("time",canvas_interface()->get_time()); param_list.add("canvas",Canvas::Handle(layer->get_canvas())); param_list.add("canvas_interface",canvas_interface()); param_list.add("layer",layer); - + //Gtk::Menu *newlayers(manage(new Gtk::Menu())); //build_new_layer_menu(*newlayers); - + //parammenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("New Layer"),*newlayers)); if(layer->get_name()=="PasteCanvas") @@ -1749,18 +1819,18 @@ CanvasView::popup_layer_menu(synfig::Layer::Handle layer) ) )); } - + add_actions_to_menu(menu, param_list,synfigapp::Action::CATEGORY_LAYER); - + menu->popup(3,gtk_get_current_event_time()); } void -CanvasView::register_layer_type(synfig::Layer::Book::value_type &lyr,std::map* category_map) +CanvasView::register_layer_type(synfig::Layer::Book::value_type &/*lyr*/,std::map* /*category_map*/) { -/* if(lyr.second.category==_("Do Not Use")) +/* if(lyr.second.category==CATEGORY_DO_NOT_USE) return; - + if(category_map->count(lyr.second.category)==0) (*category_map)[lyr.second.category]=manage(new Gtk::Menu()); @@ -1776,7 +1846,7 @@ CanvasView::register_layer_type(synfig::Layer::Book::value_type &lyr,std::map category_map; @@ -1798,7 +1868,7 @@ CanvasView::build_new_layer_menu(Gtk::Menu &menu) std::map::iterator iter; for(iter=category_map.begin();iter!=category_map.end();++iter) - menu.items().push_back(Gtk::Menu_Helpers::MenuElem(iter->first,*iter->second)); + menu.items().push_back(Gtk::Menu_Helpers::MenuElem(iter->first,*iter->second)); menu.show(); */ @@ -1839,7 +1909,7 @@ CanvasView::refresh_rend_desc() { current_time_widget->set_fps(get_canvas()->rend_desc().get_frame_rate()); - + //???? //synfig::info("Canvasview: Refreshing render desc info"); if(!get_time().is_equal(time_adjustment().get_value())) @@ -1862,7 +1932,7 @@ CanvasView::refresh_rend_desc() //set the FPS of the timeslider timeslider->set_global_fps(get_canvas()->rend_desc().get_frame_rate()); - + //set the beginning and ending time of the time slider Time begin_time=get_canvas()->rend_desc().get_time_start(); Time end_time=get_canvas()->rend_desc().get_time_end(); @@ -1878,35 +1948,35 @@ CanvasView::refresh_rend_desc() time_window_adjustment().set_page_increment(length); time_window_adjustment().set_page_size(length); } - + /*synfig::info("w: %p - [%.3f,%.3f] (%.3f,%.3f) child: %p\n", &time_window_adjustment_, time_window_adjustment_.get_lower(), time_window_adjustment_.get_upper(),time_window_adjustment_.get_value(), time_window_adjustment_.get_page_size(),time_window_adjustment_.get_child_adjustment() );*/ - + time_window_adjustment().changed(); //only non-value stuff was changed // Setup the time adjustment - + //NOTE THESE TWO SHOULD BE CHANGED BY THE changed() CALL ABOVE //time_adjustment().set_lower(time_window_adjustment().get_value()); //time_adjustment().set_upper(time_window_adjustment().get_value()+time_window_adjustment().get_page_size()); - + // time_adjustment().set_lower(get_canvas()->rend_desc().get_time_start()); // time_adjustment().set_upper(get_canvas()->rend_desc().get_time_end()); time_adjustment().set_step_increment(synfig::Time(1.0/get_canvas()->rend_desc().get_frame_rate())); time_adjustment().set_page_increment(synfig::Time(1.0)); time_adjustment().set_page_size(0); - + time_adjustment().changed(); - + /*synfig::info("w: %p - [%.3f,%.3f] (%.3f,%.3f) child: %p\n", &time_window_adjustment_, time_window_adjustment_.get_lower(), time_window_adjustment_.get_upper(),time_window_adjustment_.get_value(), time_window_adjustment_.get_page_size(),time_window_adjustment_.get_child_adjustment() ); */ - + if(begin_time==end_time) { hide_timebar(); @@ -1922,13 +1992,13 @@ CanvasView::refresh_rend_desc() time_adjustment().set_value(begin_time); time_adjustment().value_changed(); } - + if(time_adjustment().get_value() > end_time) { time_adjustment().set_value(end_time); time_adjustment().value_changed(); } - + /*synfig::info("Time stats: \n" "w: %p - [%.3f,%.3f] (%.3f,%.3f) child: %p\n" "t: %p - [%.3f,%.3f] %.3f", @@ -1944,16 +2014,45 @@ CanvasView::refresh_rend_desc() bool -CanvasView::close() +CanvasView::close_view() { - hide(); - // I think this is bad..., removing - // get_instance()->canvas_view_list().erase(std::find(get_instance()->canvas_view_list().begin(),get_instance()->canvas_view_list().end(),this)); + if(get_instance()->get_visible_canvases()==1) + close_instance(); + else + hide(); + return false; +} + +static bool _close_instance(etl::handle instance) +{ + etl::handle argh(instance); + instance->safe_close(); + synfig::info("closed"); + return false; +} + +bool +CanvasView::close_instance() +{ + if (get_work_area()->get_updating()) + { + get_work_area()->stop_updating(true); // stop and mark as cancelled + + // give the workarea chances to stop updating + Glib::signal_timeout().connect( + sigc::mem_fun(*this, &CanvasView::close_instance), + 250); + } + else + Glib::signal_timeout().connect( + sigc::bind(sigc::ptr_fun(_close_instance), + (etl::handle)get_instance()), + 250); return false; } handle -CanvasView::create(loose_handle instance,handle canvas) +CanvasView::create(etl::loose_handle instance, etl::handle canvas) { etl::handle view(new CanvasView(instance,instance->synfigapp::Instance::find_canvas_interface(canvas))); instance->canvas_view_list().push_front(view); @@ -1966,6 +2065,8 @@ CanvasView::update_title() { string title; + if(get_instance()->synfigapp::Instance::get_action_count()) + title="*"; title+=etl::basename(get_instance()->get_file_name()) +" : "; if(get_canvas()->get_name().empty()) @@ -1973,9 +2074,6 @@ CanvasView::update_title() else title+='"'+get_canvas()->get_name()+'"'; - if(get_instance()->synfigapp::Instance::get_action_count()) - title+=_(" (Unsaved)"); - if(get_instance()->synfigapp::Instance::in_repository()) { title+=" (CVS"; @@ -2021,14 +2119,14 @@ CanvasView::on_focus_in_event(GdkEventFocus*x) get_smach().process_event(EVENT_REFRESH_TOOL_OPTIONS); studio::App::set_selected_canvas_view(this); - + App::ui_manager()->insert_action_group(action_group); } - + // HACK ... Questionable...? if(x) return Gtk::Window::on_focus_in_event(x); - + return true; } @@ -2066,10 +2164,10 @@ CanvasView::on_layer_toggle(synfig::Layer::Handle layer) { synfigapp::Action::Handle action(synfigapp::Action::create("layer_activate")); assert(action); - + if(!action) return; - + action->set_param("canvas",Canvas::Handle(layer->get_canvas())); if(!action->set_param("canvas_interface",canvas_interface())) // if(!action->set_param("canvas_interface",get_instance()->find_canvas_interface(layer->get_canvas()))) @@ -2079,7 +2177,7 @@ CanvasView::on_layer_toggle(synfig::Layer::Handle layer) action->set_param("new_status",!layer->active()); assert(action->is_ready()); - + canvas_interface()->get_instance()->perform_action(action); } @@ -2089,7 +2187,7 @@ CanvasView::popup_param_menu(synfigapp::ValueDesc value_desc, float location) { parammenu.items().clear(); get_instance()->make_param_menu(¶mmenu,get_canvas(),value_desc,location); - + parammenu.popup(3,gtk_get_current_event_time()); } @@ -2100,8 +2198,8 @@ CanvasView::add_actions_to_menu(Gtk::Menu *menu, const synfigapp::Action::ParamL } bool -CanvasView::on_layer_user_click(int button, Gtk::TreeRow row, LayerTree::ColumnID column_id) -{ +CanvasView::on_layer_user_click(int button, Gtk::TreeRow /*row*/, LayerTree::ColumnID /*column_id*/) +{ switch(button) { case 3: @@ -2115,10 +2213,10 @@ CanvasView::on_layer_user_click(int button, Gtk::TreeRow row, LayerTree::ColumnI menu->get_submenu()->popup(button,gtk_get_current_event_time()); } - + #if 0 bool multiple_selected=true; - + if(layer_tree->get_selection()->count_selected_rows()<=1) multiple_selected=false; @@ -2130,15 +2228,15 @@ CanvasView::on_layer_user_click(int button, Gtk::TreeRow row, LayerTree::ColumnI layer_tree->get_selection()->select(row); multiple_selected=false; } - + if(column_id==COLUMNID_TIME_TRACK) return false; - + //synfigapp::ValueDesc value_desc(row[layer_param_tree_model.value_desc]); //ValueNode::Handle value_node(row[layer_param_tree_model.value_node]); //ValueNode::Handle parent_value_node; //ValueBase value=row[layer_param_tree_model.value]; - + //if(row.parent()) //{ // parent_value_node=(*row.parent())[layer_tree_model.value_node]; @@ -2156,17 +2254,19 @@ CanvasView::on_layer_user_click(int button, Gtk::TreeRow row, LayerTree::ColumnI { synfigapp::SelectionManager::LayerList layer_list(get_selection_manager()->get_selected_layers()); synfigapp::SelectionManager::LayerList::iterator iter; - + for(iter=layer_list.begin();iter!=layer_list.end();++iter) param_list.add("layer",Layer::Handle(*iter)); } - + parammenu.items().clear(); Gtk::Menu *newlayers(manage(new Gtk::Menu())); + // do we need this? the code is all #ifdef'ed out anyway + // newlayers->signal_hide().connect(sigc::bind(sigc::ptr_fun(&delete_widget), newlayers)); build_new_layer_menu(*newlayers); - - parammenu.items().push_back(Gtk::Menu_Helpers::MenuElem("New Layer",*newlayers)); + + parammenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("New Layer"),*newlayers)); if(!multiple_selected && layer->get_name()=="PasteCanvas") { parammenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Select All Children"), @@ -2179,14 +2279,14 @@ CanvasView::on_layer_user_click(int button, Gtk::TreeRow row, LayerTree::ColumnI ) )); } - + add_actions_to_menu(¶mmenu, param_list,synfigapp::Action::CATEGORY_LAYER); parammenu.popup(button,gtk_get_current_event_time()); return true; } /* else if(column_id==LayerTree::COLUMNID_TIME_TRACK && value_node && handle::cast_dynamic(value_node)) - { + { // Right-click on time track with animated // trackmenu.popup(0,0); return true; @@ -2203,10 +2303,10 @@ CanvasView::on_layer_user_click(int button, Gtk::TreeRow row, LayerTree::ColumnI #warning update me! #if 0 parammenu.items().clear(); - parammenu.items().push_back(Gtk::Menu_Helpers::MenuElem("Connect", + parammenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Connect"), hide_return(sigc::mem_fun(*canvas_interface().get(),&synfigapp::CanvasInterface::connect_selected_layer_params)) )); - parammenu.items().push_back(Gtk::Menu_Helpers::MenuElem("Disconnect", + parammenu.items().push_back(Gtk::Menu_Helpers::MenuElem(_("Disconnect"), hide_return(sigc::mem_fun(*canvas_interface().get(),&synfigapp::CanvasInterface::disconnect_selected_layer_params)) )); parammenu.popup(0,0); @@ -2219,10 +2319,10 @@ CanvasView::on_layer_user_click(int button, Gtk::TreeRow row, LayerTree::ColumnI } return true; break; - + default: return false; - break; + break; } } @@ -2230,7 +2330,7 @@ CanvasView::on_layer_user_click(int button, Gtk::TreeRow row, LayerTree::ColumnI bool CanvasView::on_children_user_click(int button, Gtk::TreeRow row, ChildrenTree::ColumnID column_id) -{ +{ switch(button) { case 3: @@ -2240,6 +2340,12 @@ CanvasView::on_children_user_click(int button, Gtk::TreeRow row, ChildrenTree::C if(!(bool)row[children_tree_model.is_canvas]) { synfigapp::ValueDesc value_desc=row[children_tree_model.value_desc]; + if (!value_desc) + { + //! \todo fix properly -- what is the child dialog for? + synfig::info("preventing child dialog right-click crash"); + return true; + } assert(value_desc); popup_param_menu(value_desc); return true; @@ -2247,10 +2353,10 @@ CanvasView::on_children_user_click(int button, Gtk::TreeRow row, ChildrenTree::C } return true; break; - + default: return false; - break; + break; } } @@ -2262,7 +2368,7 @@ CanvasView::on_keyframe_tree_event(GdkEvent *event) case GDK_BUTTON_PRESS: switch(event->button.button) { - case 3: + case 3: { //keyframemenu.popup(event->button.button,gtk_get_current_event_time()); return true; @@ -2287,14 +2393,14 @@ CanvasView::refresh_time_window() //THESE SHOULD AUTOMATICALLY BE TAKEN CARE OF //time_adjustment().set_lower(time_window_adjustment().get_value()); //time_adjustment().set_upper(time_window_adjustment().get_value()+time_window_adjustment().get_page_size()); - + time_adjustment().set_page_increment(1.0); // One second time_adjustment().set_page_size(0); - + if(get_canvas()) time_adjustment().set_step_increment(1.0/get_canvas()->rend_desc().get_frame_rate()); time_adjustment().changed(); - + //NOTE THIS SHOULD HOOK INTO THE CORRECT SIGNALS... if(children_tree) children_tree->queue_draw(); @@ -2304,18 +2410,18 @@ void CanvasView::on_time_changed() { Time time(get_time()); - + current_time_widget->set_value(time); try { get_canvas()->keyframe_list().find(time); current_time_widget->modify_text(Gtk::STATE_NORMAL,Gdk::Color("#FF0000")); }catch(...){ - current_time_widget->modify_text(Gtk::STATE_NORMAL,Gdk::Color("#000000")); + current_time_widget->modify_text(Gtk::STATE_NORMAL,Gdk::Color("#000000")); } - + if(get_time() != time_adjustment().get_value()) { - + //Recenters the window, causing it to jump (possibly undesirably... but whatever) if(time < time_window_adjustment().get_value() || time > time_window_adjustment().get_value()+time_window_adjustment().get_page_size()) @@ -2326,7 +2432,7 @@ CanvasView::on_time_changed() } time_adjustment().set_value(time); time_adjustment().value_changed(); - + // Shouldn't these trees just hook into // the time changed signal...? //YES THEY SHOULD... @@ -2338,18 +2444,28 @@ CanvasView::on_time_changed() void CanvasView::time_zoom_in() { + float frame_rate = get_canvas()->rend_desc().get_frame_rate(); + Time min_page_size = 2/frame_rate; + time_window_adjustment().set_page_size(time_window_adjustment().get_page_size()*0.75); + if (time_window_adjustment().get_page_size() < min_page_size) + time_window_adjustment().set_page_size(min_page_size); time_window_adjustment().changed(); - + refresh_time_window(); } void CanvasView::time_zoom_out() { + Time length = (get_canvas()->rend_desc().get_time_end() - + get_canvas()->rend_desc().get_time_start()); + time_window_adjustment().set_page_size(time_window_adjustment().get_page_size()/0.75); + if (time_window_adjustment().get_page_size() > length) + time_window_adjustment().set_page_size(length); time_window_adjustment().changed(); - + refresh_time_window(); } @@ -2371,7 +2487,7 @@ void CanvasView::on_children_edited_value(const Glib::ustring&path_string,synfig::ValueBase value) { Gtk::TreePath path(path_string); - + const Gtk::TreeRow row = *(children_tree->get_model()->get_iter(path)); assert((bool)row[children_tree_model.is_value_node]); @@ -2393,13 +2509,13 @@ CanvasView::on_id_changed() void CanvasView::on_mode_changed(synfigapp::CanvasInterface::Mode mode) { - // If the aninimate flag was set in mode... + // If the animate flag was set in mode... if(mode&synfigapp::MODE_ANIMATE) { Gtk::Image *icon; icon=manage(new Gtk::Image(Gtk::StockID("gtk-no"),Gtk::ICON_SIZE_BUTTON)); - animatebutton->remove(); - animatebutton->add(*icon); + animatebutton->remove(); + animatebutton->add(*icon); tooltips.set_tip(*animatebutton,_("In Animate Editing Mode")); icon->set_padding(0,0); icon->show(); @@ -2408,8 +2524,8 @@ CanvasView::on_mode_changed(synfigapp::CanvasInterface::Mode mode) { Gtk::Image *icon; icon=manage(new Gtk::Image(Gtk::StockID("gtk-yes"),Gtk::ICON_SIZE_BUTTON)); - animatebutton->remove(); - animatebutton->add(*icon); + animatebutton->remove(); + animatebutton->add(*icon); tooltips.set_tip(*animatebutton,_("Not in Animate Editing Mode")); icon->set_padding(0,0); icon->show(); @@ -2419,8 +2535,8 @@ CanvasView::on_mode_changed(synfigapp::CanvasInterface::Mode mode) { Gtk::Image *icon; icon=manage(new Gtk::Image(Gtk::StockID("synfig-keyframe_lock_all"),Gtk::ICON_SIZE_BUTTON)); - keyframebutton->remove(); - keyframebutton->add(*icon); + keyframebutton->remove(); + keyframebutton->add(*icon); tooltips.set_tip(*keyframebutton,_("All Keyframes Locked")); icon->set_padding(0,0); icon->show(); @@ -2429,8 +2545,8 @@ CanvasView::on_mode_changed(synfigapp::CanvasInterface::Mode mode) { Gtk::Image *icon; icon=manage(new Gtk::Image(Gtk::StockID("synfig-keyframe_lock_future"),Gtk::ICON_SIZE_BUTTON)); - keyframebutton->remove(); - keyframebutton->add(*icon); + keyframebutton->remove(); + keyframebutton->add(*icon); tooltips.set_tip(*keyframebutton,_("Future Keyframes Locked")); icon->set_padding(0,0); icon->show(); @@ -2439,8 +2555,8 @@ CanvasView::on_mode_changed(synfigapp::CanvasInterface::Mode mode) { Gtk::Image *icon; icon=manage(new Gtk::Image(Gtk::StockID("synfig-keyframe_lock_past"),Gtk::ICON_SIZE_BUTTON)); - keyframebutton->remove(); - keyframebutton->add(*icon); + keyframebutton->remove(); + keyframebutton->add(*icon); tooltips.set_tip(*keyframebutton,_("Past Keyframes Locked")); icon->set_padding(0,0); icon->show(); @@ -2449,13 +2565,13 @@ CanvasView::on_mode_changed(synfigapp::CanvasInterface::Mode mode) { Gtk::Image *icon; icon=manage(new Gtk::Image(Gtk::StockID("synfig-keyframe_lock_none"),Gtk::ICON_SIZE_BUTTON)); - keyframebutton->remove(); - keyframebutton->add(*icon); + keyframebutton->remove(); + keyframebutton->add(*icon); tooltips.set_tip(*keyframebutton,_("No Keyframes Locked")); icon->set_padding(0,0); icon->show(); } - + work_area->queue_draw(); } @@ -2472,27 +2588,23 @@ void CanvasView::on_keyframe_button_pressed() { synfigapp::CanvasInterface::Mode mode(get_mode()); - + + // future && past --> past if((mode&synfigapp::MODE_ANIMATE_FUTURE) && (mode&synfigapp::MODE_ANIMATE_PAST)) - { set_mode(get_mode()-synfigapp::MODE_ANIMATE_FUTURE); - } + // past --> future else if(!(mode&synfigapp::MODE_ANIMATE_FUTURE) && (mode&synfigapp::MODE_ANIMATE_PAST)) - { - set_mode(get_mode()-synfigapp::MODE_ANIMATE_PAST|synfigapp::MODE_ANIMATE_FUTURE); - } + set_mode((get_mode()-synfigapp::MODE_ANIMATE_PAST)|synfigapp::MODE_ANIMATE_FUTURE); + // future --> (nothing) else if((mode&synfigapp::MODE_ANIMATE_FUTURE) && !(mode&synfigapp::MODE_ANIMATE_PAST)) - { set_mode(get_mode()-synfigapp::MODE_ANIMATE_FUTURE); - } + // (nothing) --> future && past else if(!(mode&synfigapp::MODE_ANIMATE_FUTURE) && !(mode&synfigapp::MODE_ANIMATE_PAST)) - { set_mode(get_mode()|synfigapp::MODE_ANIMATE_FUTURE|synfigapp::MODE_ANIMATE_PAST); - } } bool -CanvasView::duck_change_param(const Point &value,synfig::Layer::Handle layer, synfig::String param_name) +CanvasView::duck_change_param(const synfig::Point &value,synfig::Layer::Handle layer, synfig::String param_name) { return canvas_interface()->change_value(synfigapp::ValueDesc(layer,param_name),value); } @@ -2516,8 +2628,16 @@ CanvasView::on_duck_changed(const synfig::Point &value,const synfigapp::ValueDes return true; } +bool +CanvasView::on_duck_angle_changed(const synfig::Angle &rotation,const synfigapp::ValueDesc& value_desc) +{ + // \todo will this really always be the case? + assert(value_desc.get_value_type() == ValueBase::TYPE_ANGLE); + return canvas_interface()->change_value(value_desc, value_desc.get_value(get_time()).get(Angle()) + rotation); +} + void -CanvasView::selected_layer_color_set(Color color) +CanvasView::selected_layer_color_set(synfig::Color color) { synfigapp::SelectionManager::LayerList selected_list(get_selection_manager()->get_selected_layers()); synfigapp::SelectionManager::LayerList::iterator iter; @@ -2536,12 +2656,12 @@ CanvasView::selected_layer_color_set(Color color) } void -CanvasView::rebuild_ducks_layer_(synfig::TransformStack& transform_stack, Canvas::Handle canvas, std::set& selected_list) +CanvasView::rebuild_ducks_layer_(synfig::TransformStack& transform_stack, synfig::Canvas::Handle canvas, std::set& selected_list) { int transforms(0); String layer_name; - -#define QUEUE_REBUILD_DUCKS sigc::mem_fun(*this,&CanvasView::queue_rebuild_ducks) + +#define QUEUE_REBUILD_DUCKS sigc::mem_fun(*this,&CanvasView::queue_rebuild_ducks) if(!canvas) { @@ -2562,17 +2682,17 @@ CanvasView::rebuild_ducks_layer_(synfig::TransformStack& transform_stack, Canvas // This layer is currently selected. duck_changed_connections.push_back(layer->signal_changed().connect(QUEUE_REBUILD_DUCKS)); - + // do the bounding box thing bbox|=transform_stack.perform(layer->get_bounding_rect()); - - // Grab the layer's list pf parameters + + // Grab the layer's list of parameters Layer::ParamList paramlist(layer->get_param_list()); - + // Grab the layer vocabulary Layer::Vocab vocab=layer->get_param_vocab(); Layer::Vocab::iterator iter; - + for(iter=vocab.begin();iter!=vocab.end();iter++) { if(!iter->get_hidden() && !iter->get_invisible_duck()) @@ -2594,15 +2714,15 @@ CanvasView::rebuild_ducks_layer_(synfig::TransformStack& transform_stack, Canvas *this, &studio::CanvasView::selected_layer_color_set ) - ); + ); } */ } } } - + layer_name=layer->get_name(); - + if(layer->active()) { Transform::Handle trans(layer->get_transform()); @@ -2638,7 +2758,7 @@ CanvasView::rebuild_ducks_layer_(synfig::TransformStack& transform_stack, Canvas } */ } - + // If this is a paste canvas layer, then we need to // descend into it if(layer_name=="PasteCanvas") @@ -2646,16 +2766,16 @@ CanvasView::rebuild_ducks_layer_(synfig::TransformStack& transform_stack, Canvas Vector scale; scale[0]=scale[1]=exp(layer->get_param("zoom").get(Real())); Vector origin(layer->get_param("origin").get(Vector())); - + Canvas::Handle child_canvas(layer->get_param("canvas").get(Canvas::Handle())); - + if(!scale.is_equal_to(Vector(1,1))) transform_stack.push(new Transform_Scale(scale,origin)); if(!scale.is_equal_to(Vector(0,0))) transform_stack.push(new Transform_Translate(origin)); - + rebuild_ducks_layer_(transform_stack,child_canvas,selected_list); - + if(!scale.is_equal_to(Vector(0,0))) transform_stack.pop(); if(!scale.is_equal_to(Vector(1,1))) @@ -2674,11 +2794,11 @@ CanvasView::queue_rebuild_ducks() #if 0 if(rebuild_ducks_queued) return; -#else +#else if(rebuild_ducks_queued) queue_rebuild_ducks_connection.disconnect(); #endif - + queue_rebuild_ducks_connection=Glib::signal_timeout().connect( sigc::bind_return( sigc::mem_fun(*this,&CanvasView::rebuild_ducks), @@ -2686,36 +2806,36 @@ CanvasView::queue_rebuild_ducks() ), 50 ); - + rebuild_ducks_queued=true; } void CanvasView::rebuild_ducks() -{ +{ /*static int i=0; i++; if(i>30) synfig::info("%d",i/(i-i)); */ - + rebuild_ducks_queued=false; //queue_rebuild_ducks_connection.disconnect(); - + if(work_area->is_dragging()) { queue_rebuild_ducks(); return; } - + if(!duck_refresh_flag) { duck_refresh_needed=true; return; } - + bbox=Rect::zero(); - + work_area->clear_ducks(); work_area->set_time(get_time()); get_canvas()->set_time(get_time()); @@ -2724,20 +2844,20 @@ CanvasView::rebuild_ducks() curr_transform_stack_set=false; for(;!duck_changed_connections.empty();duck_changed_connections.pop_back())duck_changed_connections.back().disconnect(); - + //get_canvas()->set_time(get_time()); bool not_empty(false); - - // First do the layers... + + // First do the layers... do{ synfigapp::SelectionManager::LayerList selected_list(get_selection_manager()->get_selected_layers()); std::set layer_set(selected_list.begin(),selected_list.end()); - + if(!layer_set.empty()) not_empty=true; - + synfig::TransformStack transform_stack; - + rebuild_ducks_layer_(transform_stack, get_canvas(), layer_set); }while(0); @@ -2747,7 +2867,7 @@ CanvasView::rebuild_ducks() synfigapp::SelectionManager::ChildrenList selected_list(get_selection_manager()->get_selected_children()); synfigapp::SelectionManager::ChildrenList::iterator iter; synfig::TransformStack transform_stack; - + if(selected_list.empty()) { break; @@ -2766,6 +2886,55 @@ CanvasView::rebuild_ducks() } void +CanvasView::decrease_low_res_pixel_size() +{ + list sizes = CanvasView::get_pixel_sizes(); + int pixel_size = work_area->get_low_res_pixel_size(); + + for (list::iterator iter = sizes.begin(); iter != sizes.end(); iter++) + if (*iter == pixel_size) + { + if (iter == sizes.begin()) + // we already have the smallest low-res pixels possible - turn off low-res instead + work_area->set_low_resolution_flag(false); + else + { + iter--; + Glib::RefPtr action = action_group->get_action(strprintf("lowres-pixel-%d", *iter)); + action->activate(); // to make sure the radiobutton in the menu is updated too + work_area->set_low_resolution_flag(true); + } + break; + } +} + +void +CanvasView::increase_low_res_pixel_size() +{ + list sizes = CanvasView::get_pixel_sizes(); + int pixel_size = work_area->get_low_res_pixel_size(); + + if (!work_area->get_low_resolution_flag()) + { + work_area->set_low_resolution_flag(true); + return; + } + + for (list::iterator iter = sizes.begin(); iter != sizes.end(); iter++) + if (*iter == pixel_size) + { + iter++; + if (iter != sizes.end()) + { + Glib::RefPtr action = action_group->get_action(strprintf("lowres-pixel-%d", *iter)); + action->activate(); // to make sure the radiobutton in the menu is updated too + work_area->set_low_resolution_flag(true); + } + break; + } +} + +void CanvasView::on_dirty_preview() { if(!is_playing_) @@ -2780,13 +2949,13 @@ void CanvasView::play() { assert(get_canvas()); - + // If we are already busy, don't play! if(working_depth)return; - + // Set us up as working IsWorking is_working(*this); - + etl::clock timer; Time time=work_area->get_time(), @@ -2795,16 +2964,16 @@ CanvasView::play() // If we are already at the end of time, start over if(time==endtime) time=get_canvas()->rend_desc().get_time_start(); - - is_playing_=true; + + is_playing_=true; work_area->clear_ducks(); - + for(timer.reset(); time + timer() < endtime;) { //Clamp the time window so we can see the time value as it races across the horizon bool timewindreset = false; - + while( time + timer() > Time(time_window_adjustment().get_sub_upper()) ) { time_window_adjustment().set_value( @@ -2814,7 +2983,7 @@ CanvasView::play() ); timewindreset = true; } - + while( time + timer() < Time(time_window_adjustment().get_sub_lower()) ) { time_window_adjustment().set_value( @@ -2822,26 +2991,31 @@ CanvasView::play() time_window_adjustment().get_value()-time_window_adjustment().get_page_size()/2, time_window_adjustment().get_lower()) ); - + timewindreset = true; } - + //we need to tell people that the value changed if(timewindreset) time_window_adjustment().value_changed(); - + //update actual time to next step time_adjustment().set_value(time+timer()); time_adjustment().value_changed(); - + if(!work_area->sync_render_preview()) break; - - studio::App::iteration(false); - + + // wait for the workarea to refresh itself + while (studio::App::events_pending()) + studio::App::iteration(false); + if(get_cancel_status()) + { + is_playing_=false; return; + } } - is_playing_=false; + is_playing_=false; time_adjustment().set_value(endtime); time_adjustment().value_changed(); @@ -2856,7 +3030,7 @@ CanvasView::show_tables() { Gtk::IconSize iconsize=Gtk::IconSize::from_name("synfig-small_icon"); treetogglebutton->remove(); - treetogglebutton->add(*manage(new Gtk::Image(Gtk::StockID("gtk-go-down"),iconsize))); + treetogglebutton->add(*manage(new Gtk::Image(Gtk::StockID("gtk-go-down"),iconsize))); treetogglebutton->show_all(); notebook->show(); } @@ -2872,7 +3046,7 @@ CanvasView::hide_tables() { Gtk::IconSize iconsize=Gtk::IconSize::from_name("synfig-small_icon"); treetogglebutton->remove(); - treetogglebutton->add(*manage(new Gtk::Image(Gtk::StockID("gtk-go-up"),iconsize))); + treetogglebutton->add(*manage(new Gtk::Image(Gtk::StockID("gtk-go-up"),iconsize))); treetogglebutton->show_all(); notebook->hide(); } @@ -2896,35 +3070,11 @@ CanvasView::toggle_tables() } void -CanvasView::do_rotoscope_bline() -{ - smach_.enter(&state_bline); -} - -void -CanvasView::do_rotoscope() -{ - smach_.enter(&state_draw); -} - -void -CanvasView::do_rotoscope_poly() -{ - smach_.enter(&state_polygon); -} - -void -CanvasView::do_eyedrop() -{ - smach_.enter(&state_eyedrop); -} - -void CanvasView::show_timebar() { timebar->show(); current_time_widget->show(); - + //keyframe_tab_child->show(); if(layer_tree) layer_tree->set_show_timetrack(true); @@ -2944,67 +3094,173 @@ CanvasView::hide_timebar() children_tree->set_show_timetrack(false); } +void +CanvasView::set_sensitive_timebar(bool sensitive) +{ + timebar->set_sensitive(sensitive); + current_time_widget->set_sensitive(sensitive); + //keyframe_tab_child->set_sensitive(sensitive); + if(layer_tree) + layer_tree->set_sensitive(sensitive); + if(children_tree) + children_tree->set_sensitive(sensitive); +} + + +static void +set_waypoint_model(std::set > waypoints, + Waypoint::Model model, + etl::loose_handle canvas_interface) +{ + // Create the action group + synfigapp::Action::PassiveGrouper group(canvas_interface->get_instance().get(),_("Change Waypoint Group")); + + std::set >::const_iterator iter; + for(iter=waypoints.begin();iter!=waypoints.end();++iter) + { + Waypoint waypoint(*iter); + waypoint.apply_model(model); + + synfigapp::Action::Handle action(synfigapp::Action::create("waypoint_set")); + + assert(action); + + action->set_param("canvas",canvas_interface->get_canvas()); + action->set_param("canvas_interface",canvas_interface); + + action->set_param("waypoint",waypoint); + action->set_param("value_node",waypoint.get_parent_value_node()); + + if(!canvas_interface->get_instance()->perform_action(action)) + { + group.cancel(); + return; + } + } +} + +static void +duplicate_waypoints(std::set > waypoints, + etl::loose_handle canvas_interface) +{ + // Create the action group + synfigapp::Action::PassiveGrouper group(canvas_interface->get_instance().get(),_("Duplicate Waypoints")); + + std::set >::const_iterator iter; + for (iter = waypoints.begin(); iter != waypoints.end(); iter++) + { + Waypoint waypoint(*iter); + ValueNode::Handle value_node(iter->get_parent_value_node()); + canvas_interface->waypoint_duplicate(value_node, waypoint); + } +} + +static void +remove_waypoints(std::set > waypoints, + etl::loose_handle canvas_interface) +{ + // Create the action group + synfigapp::Action::PassiveGrouper group(canvas_interface->get_instance().get(),_("Remove Waypoints")); + std::set >::const_iterator iter; + for (iter = waypoints.begin(); iter != waypoints.end(); iter++) + { + Waypoint waypoint(*iter); + ValueNode::Handle value_node(iter->get_parent_value_node()); + canvas_interface->waypoint_remove(value_node, waypoint); + } +} void -CanvasView::on_waypoint_clicked(synfigapp::ValueDesc value_desc,synfig::Waypoint waypoint,int button) +CanvasView::on_waypoint_clicked_canvasview(synfigapp::ValueDesc value_desc, + std::set > waypoint_set, + int button, + synfig::Waypoint::Side side) { - waypoint_dialog.set_value_desc(value_desc); - waypoint_dialog.set_waypoint(waypoint); + int size = waypoint_set.size(); + Waypoint waypoint(*(waypoint_set.begin())); + Time time(waypoint.get_time()); + + if (size == 1) + { + waypoint_dialog.set_value_desc(value_desc); + waypoint_dialog.set_waypoint(waypoint); + } switch(button) { case -1: - waypoint_dialog.show(); + if (size == 1) + waypoint_dialog.show(); break; case 2: - { - Gtk::Menu* waypoint_menu(manage(new Gtk::Menu())); + { + Gtk::Menu* waypoint_menu(manage(new Gtk::Menu())); + waypoint_menu->signal_hide().connect(sigc::bind(sigc::ptr_fun(&delete_widget), waypoint_menu)); - waypoint_menu->items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-jump-to"), - sigc::bind( - sigc::mem_fun( - *canvas_interface(), - &synfigapp::CanvasInterface::set_time - ), - waypoint.get_time() - ) - )); + Waypoint::Model model; + String side_string(String(" ") + (side==Waypoint::SIDE_LEFT ? _("In") : _("Out"))); + + // ------------------------------------------------------------------------ + if(side==Waypoint::SIDE_LEFT) model.set_before(INTERPOLATION_TCB); + else model.set_after(INTERPOLATION_TCB); + waypoint_menu->items().push_back(Gtk::Menu_Helpers::MenuElem(_("_TCB") + side_string, + sigc::bind(sigc::ptr_fun(set_waypoint_model), waypoint_set, model, canvas_interface()))); + + if(side==Waypoint::SIDE_LEFT) model.set_before(INTERPOLATION_LINEAR); + else model.set_after(INTERPOLATION_LINEAR); + waypoint_menu->items().push_back(Gtk::Menu_Helpers::MenuElem(_("_Linear") + side_string, + sigc::bind(sigc::ptr_fun(set_waypoint_model), waypoint_set, model, canvas_interface()))); + + if(side==Waypoint::SIDE_LEFT) model.set_before(INTERPOLATION_HALT); + else model.set_after(INTERPOLATION_HALT); + waypoint_menu->items().push_back(Gtk::Menu_Helpers::MenuElem(_("_Ease") + side_string, + sigc::bind(sigc::ptr_fun(set_waypoint_model), waypoint_set, model, canvas_interface()))); + + if(side==Waypoint::SIDE_LEFT) model.set_before(INTERPOLATION_CONSTANT); + else model.set_after(INTERPOLATION_CONSTANT); + waypoint_menu->items().push_back(Gtk::Menu_Helpers::MenuElem(_("_Constant") + side_string, + sigc::bind(sigc::ptr_fun(set_waypoint_model), waypoint_set, model, canvas_interface()))); + + // ------------------------------------------------------------------------ + waypoint_menu->items().push_back(Gtk::Menu_Helpers::SeparatorElem()); + + model.set_after(INTERPOLATION_TCB); model.set_before(INTERPOLATION_TCB); + waypoint_menu->items().push_back(Gtk::Menu_Helpers::MenuElem(_("TC_B Both"), + sigc::bind(sigc::ptr_fun(set_waypoint_model), waypoint_set, model, canvas_interface()))); + + model.set_after(INTERPOLATION_LINEAR); model.set_before(INTERPOLATION_LINEAR); + waypoint_menu->items().push_back(Gtk::Menu_Helpers::MenuElem(_("Li_near Both"), + sigc::bind(sigc::ptr_fun(set_waypoint_model), waypoint_set, model, canvas_interface()))); + + model.set_after(INTERPOLATION_HALT); model.set_before(INTERPOLATION_HALT); + waypoint_menu->items().push_back(Gtk::Menu_Helpers::MenuElem(_("Ea_se Both"), + sigc::bind(sigc::ptr_fun(set_waypoint_model), waypoint_set, model, canvas_interface()))); + + model.set_after(INTERPOLATION_CONSTANT); model.set_before(INTERPOLATION_CONSTANT); + waypoint_menu->items().push_back(Gtk::Menu_Helpers::MenuElem(_("C_onstant Both"), + sigc::bind(sigc::ptr_fun(set_waypoint_model), waypoint_set, model, canvas_interface()))); + + // ------------------------------------------------------------------------ + waypoint_menu->items().push_back(Gtk::Menu_Helpers::SeparatorElem()); + + waypoint_menu->items().push_back(Gtk::Menu_Helpers::MenuElem(_("_Jump To"), + sigc::bind(sigc::mem_fun(*canvas_interface(), &synfigapp::CanvasInterface::set_time), time))); + + waypoint_menu->items().push_back(Gtk::Menu_Helpers::MenuElem(_("_Duplicate"), + sigc::bind(sigc::ptr_fun(duplicate_waypoints), waypoint_set, canvas_interface()))); + + waypoint_menu->items().push_back(Gtk::Menu_Helpers::MenuElem((size == 1) ? _("_Remove") : strprintf(_("_Remove %d Waypoints"), size), + sigc::bind(sigc::ptr_fun(remove_waypoints), waypoint_set, canvas_interface()))); + + if (size == 1 && value_desc.is_valid()) + waypoint_menu->items().push_back(Gtk::Menu_Helpers::MenuElem(_("_Properties"), + sigc::mem_fun(waypoint_dialog,&Gtk::Widget::show))); + + waypoint_menu->popup(button+1,gtk_get_current_event_time()); + } + break; - waypoint_menu->items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("Edit Waypoint"), - sigc::mem_fun( - waypoint_dialog, - &Gtk::Widget::show - ) - )); - - waypoint_menu->items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("synfig-duplicate"), - sigc::bind( - sigc::bind( - sigc::mem_fun( - *canvas_interface(), - &synfigapp::CanvasInterface::waypoint_duplicate - ), - waypoint - ), - value_desc - ) - )); - waypoint_menu->items().push_back(Gtk::Menu_Helpers::StockMenuElem(Gtk::StockID("gtk-delete"), - sigc::bind( - sigc::bind( - sigc::mem_fun( - *canvas_interface(), - &synfigapp::CanvasInterface::waypoint_remove - ), - waypoint - ), - value_desc - ) - )); - waypoint_menu->popup(button+1,gtk_get_current_event_time()); - } - break; default: break; } @@ -3037,14 +3293,14 @@ CanvasView::on_waypoint_delete() } void -CanvasView::on_drop_drag_data_received(const Glib::RefPtr& context, int x, int y, const Gtk::SelectionData& selection_data_, guint info, guint time) +CanvasView::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); - //synfig::info("Droped data of type \"%s\"",selection_data.get_data_type()); - //synfig::info("Droped data of target \"%s\"",gdk_atom_name(selection_data->target)); + //synfig::info("Dropped data of type \"%s\"",selection_data.get_data_type()); + //synfig::info("Dropped data of target \"%s\"",gdk_atom_name(selection_data->target)); //synfig::info("selection=\"%s\"",gdk_atom_name(selection_data->selection)); - + if ((selection_data_.get_length() >= 0) && (selection_data_.get_format() == 8)) { if(synfig::String(selection_data_.get_data_type())=="STRING")do @@ -3058,44 +3314,44 @@ CanvasView::on_drop_drag_data_received(const Glib::RefPtr& con break; synfigapp::Action::Handle action(synfigapp::Action::create("layer_add")); - + assert(action); if(!action) break; - + action->set_param("canvas",get_canvas()); action->set_param("canvas_interface",canvas_interface()); action->set_param("new",layer); if(!get_instance()->perform_action(action)) break; - - // Ok, we have successfuly imported at least one item. + + // Ok, we have successfully imported at least one item. success=true; } while(0); // END of "STRING" - + if(synfig::String(selection_data_.get_data_type())=="text/plain") { synfig::String selection_data((gchar *)(selection_data_.get_data())); - - // For some reason, GTK hands us a list of URL's seperated - // by not only Carrage-Returns, but also Line-Feeds. + + // 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); - + //synfigapp::PassiveGrouper group(canvas_interface()->get_instance(),_("Insert Image")); 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://") @@ -3103,13 +3359,13 @@ CanvasView::on_drop_drag_data_received(const Glib::RefPtr& con 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()); - String ext; - try{ext=(String(filename.begin()+filename.find_last_of('.')+1,filename.end()));}catch(...){continue;} - + String ext(filename_extension(filename)); + if (ext.size()) ext = ext.substr(1); // skip initial '.' + // If this is a SIF file, then we need to do things slightly differently if(ext=="sketch") { @@ -3145,8 +3401,8 @@ CanvasView::on_keyframe_add_pressed() { ui_interface_->error("I am unable to find the appropriate action"); return; - } - + } + action->set_param("canvas",get_canvas()); action->set_param("canvas_interface",canvas_interface()); action->set_param("keyframe",Keyframe(get_time())); @@ -3164,7 +3420,7 @@ CanvasView::on_keyframe_duplicate_pressed() { ui_interface_->error("I am unable to duplicate the keyframe"); return; - } + } keyframe=row[model.keyframe]; synfigapp::Action::Handle action(synfigapp::Action::create("keyframe_duplicate")); @@ -3173,8 +3429,8 @@ CanvasView::on_keyframe_duplicate_pressed() { ui_interface_->error("I am unable to find the appropriate action"); return; - } - + } + action->set_param("canvas",get_canvas()); action->set_param("canvas_interface",canvas_interface()); action->set_param("keyframe",keyframe); @@ -3193,7 +3449,7 @@ CanvasView::on_keyframe_remove_pressed() { ui_interface_->error("I am unable to remove the keyframe"); return; - } + } keyframe=row[model.keyframe]; synfigapp::Action::Handle action(synfigapp::Action::create("keyframe_remove")); @@ -3202,8 +3458,8 @@ CanvasView::on_keyframe_remove_pressed() { ui_interface_->error("I am unable to find the appropriate action"); return; - } - + } + action->set_param("canvas",get_canvas()); action->set_param("canvas_interface",canvas_interface()); action->set_param("keyframe",keyframe); @@ -3223,22 +3479,22 @@ CanvasView::toggle_duck_mask(Duckmatic::Type type) if(duck_mask_position) duck_mask_position->set_active(!is_currently_on); break; - + case Duck::TYPE_VERTEX: if(duck_mask_vertex) duck_mask_vertex->set_active(!is_currently_on); break; - + case Duck::TYPE_TANGENT: if(duck_mask_tangent) duck_mask_tangent->set_active(!is_currently_on); break; - + case Duck::TYPE_RADIUS: if(duck_mask_radius) duck_mask_radius->set_active(!is_currently_on); break; - + case Duck::TYPE_WIDTH: if(duck_mask_width) duck_mask_width->set_active(!is_currently_on); @@ -3258,7 +3514,7 @@ CanvasView::toggle_duck_mask(Duckmatic::Type type) work_area->set_type_mask(work_area->get_type_mask()-type); else work_area->set_type_mask(work_area->get_type_mask()|type); - + work_area->queue_draw(); } @@ -3266,8 +3522,9 @@ CanvasView::toggle_duck_mask(Duckmatic::Type type) void CanvasView::image_import() { - String filename(dirname(get_canvas()->get_file_name())); - if(App::dialog_open_file(_("Import Image"), filename)) + // String filename(dirname(get_canvas()->get_file_name())); + String filename("*.*"); + if(App::dialog_open_file(_("Import Image"), filename, IMAGE_DIR_PREFERENCE)) canvas_interface()->import(filename); } @@ -3285,7 +3542,7 @@ CanvasView::on_input_device_changed(GdkDevice* device) get_smach().egress(); } assert(device); - + synfigapp::InputDevice::Handle input_device; input_device=synfigapp::Main::select_input_device(device->name); App::toolbox->change_state(input_device->get_state()); @@ -3296,9 +3553,9 @@ void CanvasView::on_preview_option() { Dialog_PreviewOptions *po = dynamic_cast(get_ext_widget("prevoptions")); - + Canvas::Handle canv = get_canvas(); - + if(canv) { RendDesc &r = canv->rend_desc(); @@ -3317,7 +3574,7 @@ CanvasView::on_preview_option() po->set_begin_override(false); po->set_endtime(end); po->set_end_override(false); - + set_ext_widget("prevoptions",po); } /*po->set_zoom(work_area->get_zoom()/2); @@ -3326,7 +3583,7 @@ CanvasView::on_preview_option() po->set_begin_override(false); po->set_endtime(end); po->set_end_override(false);*/ - + po->set_global_fps(r.get_frame_rate()); po->signal_finish().connect(sigc::mem_fun(*this,&CanvasView::on_preview_create)); po->present(); @@ -3336,10 +3593,10 @@ CanvasView::on_preview_option() void CanvasView::on_preview_create(const PreviewInfo &info) -{ +{ //set all the options etl::handle prev = new Preview; - + prev->set_canvasview(this); prev->set_zoom(info.zoom); prev->set_fps(info.fps); @@ -3351,10 +3608,11 @@ CanvasView::on_preview_create(const PreviewInfo &info) //render it out... prev->render(); - + Dialog_Preview *pd = preview_dialog.get(); assert(pd); - + + pd->set_default_size(700,510); pd->set_preview(prev.get()); pd->present(); } @@ -3369,13 +3627,13 @@ CanvasView::on_audio_option() void CanvasView::on_audio_file_change(const std::string &f) -{ +{ //save in meta data - always even when not valid... canvas_interface()->set_meta_data("audiofile",f); } void -CanvasView::on_audio_offset_change(const Time &t) +CanvasView::on_audio_offset_change(const synfig::Time &t) { canvas_interface()->set_meta_data("audiooffset",t.get_string()); } @@ -3385,7 +3643,7 @@ CanvasView::on_audio_file_notify() { std::string file(get_canvas()->get_meta_data("audiofile")); if(!file.c_str()) return; - + if(!audio->load(file,dirname(get_canvas()->get_file_name())+string("/"))) { if(file != "") synfig::warning("Could not load the file: %s", file.c_str()); @@ -3394,25 +3652,25 @@ CanvasView::on_audio_file_notify() disp_audio->set_profile(etl::handle()); }else { - //save in canvasview + //save in canvasview synfig::warning("Getting the profile of the music stuff"); - + //profile specific stuff for the preview widget //similar for other attachments Dialog_Preview *pd = preview_dialog.get(); pd->get_widget().set_audio(audio); - + handle prof = audio->get_profile(); - + if(!prof) { - synfig::warning("Agh, I couldn't build the profile captain!"); + synfig::warning("Agh, I couldn't build the profile captain!"); } pd->get_widget().set_audioprofile(prof); - + disp_audio->set_profile(audio->get_profile()); disp_audio->show(); - + synfig::warning("successfully set the profiles and stuff"); } disp_audio->queue_draw(); @@ -3425,8 +3683,8 @@ CanvasView::on_audio_offset_notify() audio->set_offset(t); sound_dialog->set_offset(t); disp_audio->queue_draw(); - - synfig::info("CanvasView::on_audio_offset_notify(): offset time set to %s",t.get_string(get_canvas()->rend_desc().get_frame_rate()).c_str()); + + // synfig::info("CanvasView::on_audio_offset_notify(): offset time set to %s",t.get_string(get_canvas()->rend_desc().get_frame_rate()).c_str()); } void @@ -3436,7 +3694,7 @@ CanvasView::play_audio(float t) { synfig::info("Playing audio at %f s",t); audio->play(t); - } + } } void @@ -3511,43 +3769,27 @@ CanvasView::set_ext_widget(const synfig::String& x, Gtk::Widget* y) layer_tree->get_selection()->signal_changed().connect(SLOT_EVENT(EVENT_REFRESH_DUCKS)); layer_tree->signal_layer_user_click().connect(sigc::mem_fun(*this, &studio::CanvasView::on_layer_user_click)); layer_tree->signal_param_user_click().connect(sigc::mem_fun(*this, &studio::CanvasView::on_children_user_click)); - layer_tree->signal_waypoint_clicked().connect(sigc::mem_fun(*this, &studio::CanvasView::on_waypoint_clicked)); + layer_tree->signal_waypoint_clicked_layertree().connect(sigc::mem_fun(*this, &studio::CanvasView::on_waypoint_clicked_canvasview)); } if(x=="children") { children_tree=dynamic_cast(y); if(children_tree)children_tree->signal_user_click().connect(sigc::mem_fun(*this, &studio::CanvasView::on_children_user_click)); - if(children_tree)children_tree->signal_waypoint_clicked().connect(sigc::mem_fun(*this, &studio::CanvasView::on_waypoint_clicked)); + if(children_tree)children_tree->signal_waypoint_clicked_childrentree().connect(sigc::mem_fun(*this, &studio::CanvasView::on_waypoint_clicked_canvasview)); if(children_tree)children_tree->get_selection()->signal_changed().connect(SLOT_EVENT(EVENT_REFRESH_DUCKS)); } if(x=="keyframes") keyframe_tree=dynamic_cast(y); } -static bool _close_instance(etl::handle instance) -{ - etl::handle argh(instance); - instance->safe_close(); - synfig::info("closed"); - return false; -} - bool -CanvasView::on_delete_event(GdkEventAny* event) +CanvasView::on_delete_event(GdkEventAny* event __attribute__ ((unused))) { - if(get_instance()->get_visible_canvases()==1) - { - // Schedule a close to occur in a few moments - Glib::signal_timeout().connect( - sigc::bind( - sigc::ptr_fun(_close_instance), - (etl::handle)get_instance() - ) - ,250 - ); - } - if(event) - return Gtk::Window::on_delete_event(event); - + close_view(); + + //! \todo This causes the window to be deleted straight away - but what if we prompt 'save?' and the user cancels? + // Is there ever any need to pass on the delete event to the window here? + // if(event) return Gtk::Window::on_delete_event(event); + return true; }