1 /* === S Y N F I G ========================================================= */
3 ** \brief Template Header
8 ** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
9 ** Copyright (c) 2007, 2008 Chris Moore
10 ** Copyright (c) 2009 Carlos López
12 ** This package is free software; you can redistribute it and/or
13 ** modify it under the terms of the GNU General Public License as
14 ** published by the Free Software Foundation; either version 2 of
15 ** the License, or (at your option) any later version.
17 ** This package is distributed in the hope that it will be useful,
18 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
19 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 ** General Public License for more details.
23 /* ========================================================================= */
25 /* === S T A R T =========================================================== */
27 #ifndef __SYNFIG_STUDIO_GTKMM_CANVASVIEW_H
28 #define __SYNFIG_STUDIO_GTKMM_CANVASVIEW_H
30 /* === H E A D E R S ======================================================= */
32 #include <gtkmm/window.h>
33 #include <gtkmm/image.h>
34 #include <gtkmm/tooltips.h>
35 #include <gtkmm/table.h>
36 #include <gtkmm/statusbar.h>
37 #include <gtkmm/progressbar.h>
38 #include <gtkmm/button.h>
39 #include <gtkmm/menu.h>
40 #include <gtkmm/treeview.h>
41 #include <gtkmm/treestore.h>
42 #include <gtkmm/scrolledwindow.h>
43 #include <gtkmm/notebook.h>
44 #include <gdkmm/device.h>
45 #include <gtkmm/spinbutton.h>
47 #include <synfigapp/canvasinterface.h>
48 #include <synfigapp/selectionmanager.h>
50 #include <synfig/canvas.h>
51 #include <synfig/string.h>
52 #include <synfig/time.h>
55 #include "canvasproperties.h"
56 #include "canvasoptions.h"
58 #include "cellrenderer_timetrack.h"
61 #include "layertreestore.h"
62 #include "layertree.h"
63 #include "childrentreestore.h"
64 #include "childrentree.h"
65 #include "keyframetreestore.h"
66 #include "keyframetree.h"
68 #include "dialog_waypoint.h"
69 #include "dialog_keyframe.h"
70 #include "framedial.h"
71 #include "toggleducksdial.h"
72 #include "resolutiondial.h"
73 #include "widget_keyframe_list.h"
75 #include "duckmatic.h"
76 #include <gtkmm/scale.h>
78 #include <gtkmm/uimanager.h>
85 #include <gtkmm/toggleaction.h>
86 #include <gtkmm/radioaction.h>
87 #include <synfig/rect.h>
89 #include "adjust_window.h"
91 #include <synfig/transform.h>
93 /* === M A C R O S ========================================================= */
95 #ifndef DEBUGPOINT_CLASS
97 #define DEBUGPOINT_CLASS(x) struct debugpointclass_ ## x { debugpointclass_ ## x () { DEBUGPOINT(); } ~debugpointclass_ ## x () { DEBUGPOINT(); } } badfthguae_ ## x ;
99 #define DEBUGPOINT_CLASS(x)
103 /* === T Y P E D E F S ===================================================== */
105 /* === C L A S S E S & S T R U C T S ======================================= */
108 class TransformStack;
113 class CanvasViewUIInterface;
114 class CanvasViewSelectionManager;
116 class CellRenderer_TimeTrack;
117 class CellRenderer_ValueBase;
118 class UniversalScrubber;
125 class AudioContainer;
128 class Widget_Timeslider;
131 class Dialog_SoundSelect;
132 class Dialog_Preview;
136 class Dock_Keyframes;
138 class CanvasView : public Gtk::Window, public etl::shared_object
140 friend class UniversalScrubber;
141 friend class Dock_Layers;
142 friend class Dock_Children;
143 friend class Dock_Keyframes;
145 friend class CanvasViewUIInterface;
146 friend class CanvasViewSelectionManager;
148 friend class Duckmatic;
151 -- ** -- P U B L I C T Y P E S ---------------------------------------------
156 typedef etl::handle<CanvasView> Handle;
158 typedef etl::handle<const CanvasView> ConstHandle;
160 typedef etl::loose_handle<CanvasView> LooseHandle;
162 typedef LayerTreeStore::Model LayerTreeModel;
164 typedef ChildrenTreeStore::Model ChildrenTreeModel;
166 //! Create an instance of this class whenever doing a longer task.
167 /*! Make sure that you check the bool value of this class occasionally
168 ** to make sure the action has not been canceled. */
171 CanvasView &canvas_view_;
174 IsWorking(CanvasView &canvas_view_);
176 operator bool()const;
178 friend class IsWorking;
180 typedef synfigapp::CanvasInterface::Mode Mode;
182 void set_grid_snap_toggle(bool flag) { grid_snap_toggle->set_active(flag); }
183 void set_grid_show_toggle(bool flag) { grid_show_toggle->set_active(flag); }
186 -- ** -- P R I V A T E D A T A ---------------------------------------------
190 std::auto_ptr<WorkArea> work_area;
192 WorkArea* get_work_area() { return work_area.get(); }
195 synfig::TransformStack curr_transform_stack;
196 bool curr_transform_stack_set;
200 // DEBUGPOINT_CLASS(1);
205 // DEBUGPOINT_CLASS(2);
207 etl::loose_handle<Instance> instance_;
208 etl::handle<synfigapp::CanvasInterface> canvas_interface_;
210 // DEBUGPOINT_CLASS(3);
212 //! Sound and information to play it
213 etl::handle<AudioContainer> audio;
214 studio::Widget_Sound *disp_audio; //should this be put into thing too?
216 sigc::connection playcon;
217 sigc::connection stopcon;
219 std::auto_ptr<UniversalScrubber> universal_scrubber;
221 //! Tooltip controller
222 Gtk::Tooltips tooltips;
224 // DEBUGPOINT_CLASS(4);
226 //! TreeModel for the layers
227 LayerTreeModel layer_tree_model;
229 //! TreeModel for the the children
230 ChildrenTreeModel children_tree_model;
232 //Glib::RefPtr<LayerTreeStore> layer_tree_store_;
234 //Glib::RefPtr<ChildrenTreeStore> children_tree_store_;
236 //Glib::RefPtr<KeyframeTreeStore> keyframe_tree_store_;
238 // DEBUGPOINT_CLASS(5);
240 //std::map<synfig::String,Glib::RefPtr<Gtk::TreeModel> > tree_model_book_;
241 std::map<synfig::String,Glib::RefPtr<Glib::ObjectBase> > ref_obj_book_;
242 std::map<synfig::String,Gtk::Widget*> ext_widget_book_;
244 //! The time adjustment's scope is defined by the time_window adjustment
245 Gtk::Adjustment time_adjustment_;
247 //! The time_window adjustment governs the position of the time window on the whole time line
248 //Gtk::Adjustment time_window_adjustment_;
249 studio::Adjust_Window time_window_adjustment_;
251 LayerTree *layer_tree;
253 ChildrenTree *children_tree;
255 KeyframeTree *keyframe_tree;
257 Gtk::Widget *keyframe_tab_child;
259 Gtk::ProgressBar *progressbar;
260 Gtk::Statusbar *statusbar;
262 Gtk::TreeRow children_canvas_row;
263 Gtk::TreeRow children_valuenode_row;
265 Gtk::Button *stopbutton;
266 Gtk::Button *refreshbutton;
267 Gtk::Button *treetogglebutton; // not used
268 Gtk::Notebook *notebook; // not used
270 Gtk::Table *displaybar;
271 Gtk::Button *animatebutton;
272 Gtk::Button *keyframebutton;
273 FrameDial *framedial;
274 ToggleDucksDial *toggleducksdial;
275 bool toggling_ducks_;
276 ResolutionDial *resolutiondial;
277 bool changing_resolution_;
278 Gtk::Adjustment quality_adjustment_;
279 Gtk::SpinButton *quality_spin;
280 Gtk::Adjustment future_onion_adjustment_;
281 Gtk::Adjustment past_onion_adjustment_;
282 Gtk::SpinButton *past_onion_spin;
283 Gtk::SpinButton *future_onion_spin;
284 bool updating_quality_;
285 Gtk::ToggleButton *show_grid;
286 Gtk::ToggleButton *snap_grid;
287 Gtk::ToggleButton *onion_skin;
288 Gtk::Button *render_options_button;
289 Gtk::Button *preview_options_button;
290 bool toggling_show_grid;
291 bool toggling_snap_grid;
292 bool toggling_onion_skin;
293 //! Shows current time and allows edition
294 Widget_Time *current_time_widget;
295 void on_current_time_widget_changed();
297 //! Time slider class. Same than the Time track panel
298 std::auto_ptr<Widget_Timeslider> timeslider;
300 //!Keyframe list slider
301 std::auto_ptr<Widget_Keyframe_List> widget_kf_list;
303 std::list<sigc::connection> duck_changed_connections;
305 /* DEBUGPOINT_CLASS(8);
307 Gtk::Menu duckmaskmenu;
308 DEBUGPOINT_CLASS(77);
309 Gtk::Menu qualitymenu;
313 DEBUGPOINT_CLASS(777);
315 DEBUGPOINT_CLASS(71);
316 Gtk::Menu canvasmenu;
317 DEBUGPOINT_CLASS(73);
321 DEBUGPOINT_CLASS(74);
322 Gtk::Menu newlayermenu;
323 DEBUGPOINT_CLASS(76);
326 DEBUGPOINT_CLASS(99);
327 Gtk::Menu keyframemenu;
334 Gtk::CheckMenuItem* duck_mask_position;
335 Gtk::CheckMenuItem* duck_mask_vertex;
336 Gtk::CheckMenuItem* duck_mask_tangent;
337 Gtk::CheckMenuItem* duck_mask_radius;
338 Gtk::CheckMenuItem* duck_mask_width;
339 Gtk::CheckMenuItem* duck_mask_angle;
344 Glib::RefPtr<Gtk::ToggleAction> grid_snap_toggle;
345 Glib::RefPtr<Gtk::ToggleAction> grid_show_toggle;
347 Gtk::RadioButtonGroup quality_group;
348 Gtk::RadioButtonGroup low_res_pixel_size_group;
350 Glib::RefPtr<Gtk::ActionGroup> action_group;
352 etl::handle<synfigapp::UIInterface> ui_interface_;
353 etl::handle<synfigapp::SelectionManager> selection_manager_;
357 sigc::signal<void> signal_deleted_;
359 bool rebuild_ducks_queued;
360 sigc::connection queue_rebuild_ducks_connection;
363 -- ** -- P U B L I C D A T A -----------------------------------------------
367 void queue_rebuild_ducks();
368 sigc::signal<void>& signal_deleted() { return signal_deleted_; }
372 bool duck_refresh_flag;
373 bool duck_refresh_needed;
375 //! This is for the IsWorking class.
381 -- ** -- D I A L O G S -------------------------------------------------------
386 CanvasProperties canvas_properties;
387 CanvasOptions canvas_options;
388 RenderSettings render_settings;
389 Dialog_Waypoint waypoint_dialog;
390 Dialog_Keyframe keyframe_dialog;
392 std::auto_ptr<Dialog_Preview> preview_dialog;
393 //std::auto_ptr<Dialog_PreviewOptions> previewoption_dialog;
394 std::auto_ptr<Dialog_SoundSelect> sound_dialog;
397 -- ** -- P R I V A T E M E T H O D S ---------------------------------------
402 // Constructor is private to force the use of the "create()" constructor
403 CanvasView(etl::loose_handle<Instance> instance,etl::handle<synfigapp::CanvasInterface> canvas_interface);
405 //! Constructor Helper
406 // Gtk::Widget* create_layer_tree();
408 //! Constructor Helper
409 // Gtk::Widget* create_children_tree();
411 //! Constructor Helper
412 // Gtk::Widget* create_keyframe_tree();
414 //! Constructor Helper
415 Gtk::Widget* create_status_bar();
417 //! Constructor Helper - Initializes all of the menus
420 bool duck_change_param(const synfig::Point &value,synfig::Layer::Handle layer, synfig::String param_name);
422 void refresh_time_window();
424 void time_was_changed();
426 void refresh_rend_desc();
428 void toggle_duck_mask(Duckmatic::Type type);
430 Gtk::Widget *create_work_area();
432 Gtk::Widget *create_time_bar();
434 Gtk::Widget *create_display_bar();
436 //! Pop up menu for the bezier (bline, draw) tool (?)
437 void popup_param_menu_bezier(float location, synfigapp::ValueDesc value_desc)
438 { popup_param_menu(value_desc,location,true); }
440 //! Pop up menu for the tools but not the bezier ones.
441 void popup_param_menu(synfigapp::ValueDesc value_desc, float location=0, bool bezier=false);
443 void workarea_layer_selected(synfig::Layer::Handle layer);
445 void selected_layer_color_set(synfig::Color color);
447 void register_layer_type(synfig::Layer::Book::value_type &lyr,std::map<synfig::String,Gtk::Menu*>*);
449 //! Rebuilds the "new layer" menu
450 void build_new_layer_menu(Gtk::Menu &menu);
452 void rebuild_ducks_layer_(synfig::TransformStack& transform_stack, synfig::Canvas::Handle canvas, std::set<synfig::Layer::Handle>& selected_list);
454 void decrease_low_res_pixel_size();
455 void increase_low_res_pixel_size();
456 void toggle_low_res_pixel_flag();
457 void set_quality(int x);
458 void set_onion_skins();
459 void toggle_show_grid();
460 void toggle_snap_grid();
461 void toggle_onion_skin();
464 -- ** -- P U B L I C M E T H O D S -----------------------------------------
468 const synfig::TransformStack& get_curr_transform_stack()const { return curr_transform_stack; }
470 const synfig::Rect& get_bbox()const { return bbox; }
472 Glib::RefPtr<Glib::ObjectBase> get_ref_obj(const synfig::String& x);
473 Glib::RefPtr<const Glib::ObjectBase> get_ref_obj(const synfig::String& x)const;
474 void set_ref_obj(const synfig::String& x, Glib::RefPtr<Glib::ObjectBase> y);
476 Glib::RefPtr<Gtk::TreeModel> get_tree_model(const synfig::String& x);
477 Glib::RefPtr<const Gtk::TreeModel> get_tree_model(const synfig::String& x)const;
478 void set_tree_model(const synfig::String& x, Glib::RefPtr<Gtk::TreeModel> y);
480 Gtk::Widget* get_ext_widget(const synfig::String& x);
481 void set_ext_widget(const synfig::String& x, Gtk::Widget* y);
483 //std::map<synfig::String,Gtk::Widget*>& tree_view_book() { return tree_view_book_; }
484 //std::map<synfig::String,Gtk::Widget*>& ext_widget_book() { return tree_view_book_; }
486 void popup_main_menu();
488 Smach& get_smach() { return smach_; }
490 const Smach& get_smach()const { return smach_; }
492 Smach::event_result process_event_key(EventKey x);
494 void popup_layer_menu(synfig::Layer::Handle layer);
496 virtual ~CanvasView();
498 void set_mode(Mode x) { canvas_interface()->set_mode(x); }
500 Mode get_mode()const { return canvas_interface()->get_mode(); }
502 Gtk::Adjustment &time_adjustment() { return time_adjustment_; }
504 const Gtk::Adjustment &time_adjustment()const { return time_adjustment_; }
506 studio::Adjust_Window &time_window_adjustment() { return time_window_adjustment_; }
508 const studio::Adjust_Window &time_window_adjustment()const { return time_window_adjustment_; }
510 etl::handle<synfigapp::UIInterface> get_ui_interface() { return ui_interface_;}
512 etl::handle<synfigapp::SelectionManager> get_selection_manager() { return selection_manager_; }
514 Glib::RefPtr<Gtk::TreeModel> layer_tree_store() { return get_tree_model("layers"); }
516 Glib::RefPtr<const Gtk::TreeModel> layer_tree_store()const { return get_tree_model("layers"); }
518 Glib::RefPtr<Gtk::TreeModel> children_tree_store() { return get_tree_model("children"); }
520 Glib::RefPtr<const Gtk::TreeModel> children_tree_store()const { return get_tree_model("children"); }
522 Glib::RefPtr<Gtk::TreeModel> keyframe_tree_store() { return get_tree_model("keyframes"); }
524 Glib::RefPtr<const Gtk::TreeModel> keyframe_tree_store()const { return get_tree_model("keyframes"); }
526 void set_time(synfig::Time t) { canvas_interface_->set_time(t); }
528 synfig::Time get_time() { return canvas_interface_->get_time(); }
530 etl::handle<synfig::Canvas> get_canvas()const { return canvas_interface_->get_canvas(); }
532 etl::handle<Instance> get_instance()const { return instance_; }
534 etl::handle<synfigapp::CanvasInterface> canvas_interface() { return canvas_interface_; }
536 etl::handle<const synfigapp::CanvasInterface> canvas_interface()const { return canvas_interface_; }
538 void add_actions_to_menu(Gtk::Menu *menu, const synfigapp::Action::ParamList ¶m_list, synfigapp::Action::Category category=synfigapp::Action::CATEGORY_ALL)const;
540 //! Updates the title of the window
543 //! Closes this document
544 bool close_instance();
546 //! Closes this canvas view
549 //! Stops the currently executing action
550 /*! \see get_cancel_status(), reset_cancel_status(), IsWorking */
551 void stop() { cancel=true; }
553 //! Returns the cancel status
554 /*! \see stop(), reset_cancel_status(), IsWorking */
555 bool get_cancel_status()const { return cancel; }
557 //! Resets the cancel status
558 /*! \see stop(), get_cancel_status(), IsWorking */
559 void reset_cancel_status() { cancel=false; }
561 void new_child_canvas();
563 //! Rebuilds layer_tree_store_ from the Canvas. Maintains selected items.
564 void rebuild_tables();
566 //! Builds layer_tree_store_ from the Canvas. Does not maintain selected items.
569 //! Refreshes the data for the tables
570 void refresh_tables();
572 //void rebuild_layer_table();
573 //void build_layer_table();
574 //void refresh_layer_table();
576 // void rebuild_canvas_table();
577 // void build_canvas_table();
578 // void refresh_canvas_table();
580 // void rebuild_valuenode_table();
581 // void build_valuenode_table();
582 // void refresh_valuenode_table();
585 void rebuild_ducks();
587 //bool add_to_ducks(synfigapp::ValueDesc value_desc, synfig::ParamDesc *param_desc=NULL);
589 //! Starts "playing" the animation in real-time
592 //! Shows the tables (Layer/Children)
595 //! Hides the tables (Layer/Children)
598 //! Toggles the tables
599 void toggle_tables();
601 //! Gets the table status
602 bool tables_are_visible();
604 //! Shows the time bar
607 //! Hides the time bar
610 //t Enables or disables interaction with the timebar
611 void set_sensitive_timebar(bool sensitive);
614 void time_zoom_out();
616 void add_layer(synfig::String x);
618 void show_keyframe_dialog();
620 void play_audio(float t);
625 void on_waypoint_clicked_canvasview(synfigapp::ValueDesc,std::set<synfig::Waypoint,std::less<synfig::UniqueID> >, int button);
627 void preview_option() {on_preview_option();}
631 bool is_playing() { return is_playing_; }
633 void update_quality();
638 -- ** -- S I G N A L T E R M I N A L S -------------------------------------
643 void on_select_layers();
644 void on_unselect_layers();
646 void on_input_device_changed(GdkDevice*);
648 virtual void on_hide();
650 virtual bool on_focus_in_event(GdkEventFocus*);
651 virtual bool on_focus_out_event(GdkEventFocus*);
653 //bool on_children_tree_event(GdkEvent *event);
655 bool on_keyframe_tree_event(GdkEvent *event);
657 //void on_children_edited_value(const Glib::ustring&path_string,synfig::ValueBase value);
659 void on_dirty_preview();
661 bool on_children_user_click(int, Gtk::TreeRow, ChildrenTree::ColumnID);
663 bool on_layer_user_click(int, Gtk::TreeRow, LayerTree::ColumnID);
665 // void on_layer_toggle(const Glib::ustring& path_string, Gtk::TreeModelColumn<bool> column);
667 void on_mode_changed(synfigapp::CanvasInterface::Mode mode);
669 // void on_layer_waypoint_clicked(const Glib::ustring &, synfig::ValueNode_Animated::WaypointList::iterator);
671 //void on_children_waypoint_clicked(const Glib::ustring &, synfig::ValueNode_Animated::WaypointList::iterator);
673 void on_waypoint_changed();
675 void on_waypoint_delete();
677 void on_refresh_pressed();
679 void on_id_changed();
681 void on_time_changed();
684 void on_layer_raise_pressed();
685 void on_layer_lower_pressed();
686 void on_layer_duplicate_pressed();
687 void on_layer_delete_pressed();
690 void on_keyframe_add_pressed();
692 void on_keyframe_duplicate_pressed();
694 void on_keyframe_remove_pressed();
696 void on_animate_button_pressed();
698 void on_keyframe_button_pressed();
700 void on_preview_option();
701 void on_preview_create(const PreviewInfo &);
703 void on_audio_option();
704 void on_audio_file_change(const std::string &f);
705 void on_audio_offset_change(const synfig::Time &t);
707 void on_audio_file_notify();
708 void on_audio_offset_notify();
710 bool on_duck_changed(const synfig::Point &value,const synfigapp::ValueDesc& value_desc);
711 bool on_duck_angle_changed(const synfig::Angle &rotation,const synfigapp::ValueDesc& value_desc);
713 void on_layer_toggle(synfig::Layer::Handle);
715 void on_edited_value(synfigapp::ValueDesc,synfig::ValueBase);
717 void on_drop_drag_data_received(const Glib::RefPtr<Gdk::DragContext>& context, int x, int y, const Gtk::SelectionData& selection_data, guint info, guint time);
719 //void on_audio_play();
720 bool on_audio_scrub();
722 void on_play_stop_pressed();
725 bool close_instance_when_safe();
726 bool on_delete_event(GdkEventAny* event);
729 -- ** -- S T A T I C P U B L I C M E T H O D S ---------------------------
734 static etl::handle<studio::CanvasView> create(etl::loose_handle<Instance> instance,etl::handle<synfig::Canvas> canvas);
735 static std::list<int>& get_pixel_sizes();
737 }; // END of class CanvasView
739 }; // END of namespace studio
741 /* === E N D =============================================================== */