00001
00023
00024
00025
00026
00027 #ifndef __SYNFIG_STUDIO_GTKMM_CANVASVIEW_H
00028 #define __SYNFIG_STUDIO_GTKMM_CANVASVIEW_H
00029
00030
00031
00032 #include <gtkmm/window.h>
00033 #include <gtkmm/image.h>
00034 #include <gtkmm/tooltips.h>
00035 #include <gtkmm/table.h>
00036 #include <gtkmm/statusbar.h>
00037 #include <gtkmm/progressbar.h>
00038 #include <gtkmm/button.h>
00039 #include <gtkmm/menu.h>
00040 #include <gtkmm/treeview.h>
00041 #include <gtkmm/treestore.h>
00042 #include <gtkmm/scrolledwindow.h>
00043 #include <gtkmm/notebook.h>
00044 #include <gdkmm/device.h>
00045 #include <gtkmm/spinbutton.h>
00046
00047 #include <synfigapp/canvasinterface.h>
00048 #include <synfigapp/selectionmanager.h>
00049
00050 #include <synfig/canvas.h>
00051 #include <synfig/string.h>
00052 #include <synfig/time.h>
00053
00054 #include "instance.h"
00055 #include "canvasproperties.h"
00056 #include "canvasoptions.h"
00057 #include "render.h"
00058 #include "cellrenderer_timetrack.h"
00059 #include "app.h"
00060
00061 #include "layertreestore.h"
00062 #include "layertree.h"
00063 #include "childrentreestore.h"
00064 #include "childrentree.h"
00065 #include "keyframetreestore.h"
00066 #include "keyframetree.h"
00067
00068 #include "dialog_waypoint.h"
00069 #include "dialog_keyframe.h"
00070 #include "framedial.h"
00071 #include "toggleducksdial.h"
00072 #include "resolutiondial.h"
00073
00074 #include "duckmatic.h"
00075 #include <gtkmm/scale.h>
00076
00077 #include <gtkmm/uimanager.h>
00078
00079 #include "smach.h"
00080
00081 #include <memory>
00082 #include <set>
00083 #include <map>
00084 #include <gtkmm/toggleaction.h>
00085 #include <gtkmm/radioaction.h>
00086 #include <synfig/rect.h>
00087
00088 #include "adjust_window.h"
00089
00090 #include <synfig/transform.h>
00091
00092
00093
00094 #ifndef DEBUGPOINT_CLASS
00095 #if _DEBUG
00096 #define DEBUGPOINT_CLASS(x) struct debugpointclass_ ## x { debugpointclass_ ## x () { DEBUGPOINT(); } ~debugpointclass_ ## x () { DEBUGPOINT(); } } badfthguae_ ## x ;
00097 #else
00098 #define DEBUGPOINT_CLASS(x)
00099 #endif
00100 #endif
00101
00102
00103
00104
00105
00106 namespace synfig {
00107 class TransformStack;
00108 }
00109
00110 namespace studio {
00111
00112 class CanvasViewUIInterface;
00113 class CanvasViewSelectionManager;
00114
00115 class CellRenderer_TimeTrack;
00116 class CellRenderer_ValueBase;
00117 class UniversalScrubber;
00118 class WorkArea;
00119
00120 class Duckmatic;
00121
00122 class Preview;
00123 struct PreviewInfo;
00124 class AudioContainer;
00125
00126 class Widget_Sound;
00127 class Widget_Timeslider;
00128 class Widget_Time;
00129
00130 class Dialog_SoundSelect;
00131 class Dialog_Preview;
00132
00133 class Dock_Layers;
00134 class Dock_Children;
00135 class Dock_Keyframes;
00136
00137 class CanvasView : public Gtk::Window, public etl::shared_object
00138 {
00139 friend class UniversalScrubber;
00140 friend class Dock_Layers;
00141 friend class Dock_Children;
00142 friend class Dock_Keyframes;
00143
00144 friend class CanvasViewUIInterface;
00145 friend class CanvasViewSelectionManager;
00146
00147 friend class Duckmatic;
00148
00149
00150
00151
00152
00153 public:
00154
00155 typedef etl::handle<CanvasView> Handle;
00156
00157 typedef etl::handle<const CanvasView> ConstHandle;
00158
00159 typedef etl::loose_handle<CanvasView> LooseHandle;
00160
00161 typedef LayerTreeStore::Model LayerTreeModel;
00162
00163 typedef ChildrenTreeStore::Model ChildrenTreeModel;
00164
00166
00168 class IsWorking
00169 {
00170 CanvasView &canvas_view_;
00171
00172 public:
00173 IsWorking(CanvasView &canvas_view_);
00174 ~IsWorking();
00175 operator bool()const;
00176 };
00177 friend class IsWorking;
00178
00179 typedef synfigapp::CanvasInterface::Mode Mode;
00180
00181 void set_grid_snap_toggle(bool flag) { grid_snap_toggle->set_active(flag); }
00182 void set_grid_show_toggle(bool flag) { grid_show_toggle->set_active(flag); }
00183
00184
00185
00186
00187
00188 public:
00189 std::auto_ptr<WorkArea> work_area;
00190
00191 WorkArea* get_work_area() { return work_area.get(); }
00192 private:
00193
00194 synfig::TransformStack curr_transform_stack;
00195 bool curr_transform_stack_set;
00196
00197 synfig::Rect bbox;
00198
00199
00200
00202 Smach smach_;
00203
00204
00205
00206 etl::loose_handle<Instance> instance_;
00207 etl::handle<synfigapp::CanvasInterface> canvas_interface_;
00208
00209
00210
00212 etl::handle<AudioContainer> audio;
00213 studio::Widget_Sound *disp_audio;
00214
00215 sigc::connection playcon;
00216 sigc::connection stopcon;
00217
00218 std::auto_ptr<UniversalScrubber> universal_scrubber;
00219
00221 Gtk::Tooltips tooltips;
00222
00223
00224
00226 LayerTreeModel layer_tree_model;
00227
00229 ChildrenTreeModel children_tree_model;
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240 std::map<synfig::String,Glib::RefPtr<Glib::ObjectBase> > ref_obj_book_;
00241 std::map<synfig::String,Gtk::Widget*> ext_widget_book_;
00242
00244 Gtk::Adjustment time_adjustment_;
00245
00247
00248 studio::Adjust_Window time_window_adjustment_;
00249
00250 LayerTree *layer_tree;
00251
00252 ChildrenTree *children_tree;
00253
00254 KeyframeTree *keyframe_tree;
00255
00256 Gtk::Widget *keyframe_tab_child;
00257
00258 Gtk::ProgressBar *progressbar;
00259 Gtk::Statusbar *statusbar;
00260
00261 Gtk::TreeRow children_canvas_row;
00262 Gtk::TreeRow children_valuenode_row;
00263
00264 Gtk::Button *stopbutton;
00265 Gtk::Button *refreshbutton;
00266 Gtk::Button *treetogglebutton;
00267 Gtk::Notebook *notebook;
00268 Gtk::Table *timebar;
00269 Gtk::Table *displaybar;
00270 Gtk::Button *animatebutton;
00271 Gtk::Button *keyframebutton;
00272 FrameDial *framedial;
00273 ToggleDucksDial *toggleducksdial;
00274 bool toggling_ducks_;
00275 ResolutionDial *resolutiondial;
00276 bool changing_resolution_;
00277 Gtk::Adjustment quality_adjustment_;
00278 Gtk::SpinButton *quality_spin;
00279 Gtk::Adjustment past_onion_adjustment_;
00280 Gtk::SpinButton *past_onion_spin;
00281 Gtk::Adjustment future_onion_adjustment_;
00282 Gtk::SpinButton *future_onion_spin;
00283 bool updating_quality_;
00284 Gtk::ToggleButton *show_grid;
00285 Gtk::ToggleButton *snap_grid;
00286 Gtk::ToggleButton *onion_skin;
00287 bool toggling_show_grid;
00288 bool toggling_snap_grid;
00289 bool toggling_onion_skin;
00291 Widget_Time *current_time_widget;
00292 void on_current_time_widget_changed();
00293
00295 std::auto_ptr<Widget_Timeslider> timeslider;
00296
00297 std::list<sigc::connection> duck_changed_connections;
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00336 Gtk::Menu parammenu;
00337
00338 Glib::RefPtr<Gtk::ToggleAction> grid_snap_toggle;
00339 Glib::RefPtr<Gtk::ToggleAction> grid_show_toggle;
00340
00341 Gtk::RadioButtonGroup quality_group;
00342 Gtk::RadioButtonGroup low_res_pixel_size_group;
00343
00344 Glib::RefPtr<Gtk::ActionGroup> action_group;
00345
00346 etl::handle<synfigapp::UIInterface> ui_interface_;
00347 etl::handle<synfigapp::SelectionManager> selection_manager_;
00348
00349 bool is_playing_;
00350
00351 sigc::signal<void> signal_deleted_;
00352
00353 bool rebuild_ducks_queued;
00354 sigc::connection queue_rebuild_ducks_connection;
00355
00356
00357
00358
00359
00360 public:
00361 void queue_rebuild_ducks();
00362 sigc::signal<void>& signal_deleted() { return signal_deleted_; }
00363
00364 Gtk::Menu mainmenu;
00365
00366 bool duck_refresh_flag;
00367 bool duck_refresh_needed;
00368
00370 int working_depth;
00371
00372 bool cancel;
00373
00374
00375
00376
00377
00378 public:
00379
00380 CanvasProperties canvas_properties;
00381 CanvasOptions canvas_options;
00382 RenderSettings render_settings;
00383 Dialog_Waypoint waypoint_dialog;
00384 Dialog_Keyframe keyframe_dialog;
00385
00386 std::auto_ptr<Dialog_Preview> preview_dialog;
00387
00388 std::auto_ptr<Dialog_SoundSelect> sound_dialog;
00389
00390
00391
00392
00393
00394 private:
00395
00396
00397 CanvasView(etl::loose_handle<Instance> instance,etl::handle<synfigapp::CanvasInterface> canvas_interface);
00398
00400
00401
00403
00404
00406
00407
00409 Gtk::Widget* create_status_bar();
00410
00412 void init_menus();
00413
00414 bool duck_change_param(const synfig::Point &value,synfig::Layer::Handle layer, synfig::String param_name);
00415
00416 void refresh_time_window();
00417
00418 void time_was_changed();
00419
00420 void refresh_rend_desc();
00421
00422 void toggle_duck_mask(Duckmatic::Type type);
00423
00424 Gtk::Widget *create_work_area();
00425
00426 Gtk::Widget *create_time_bar();
00427
00428 Gtk::Widget *create_display_bar();
00429
00431 void popup_param_menu_bezier(float location, synfigapp::ValueDesc value_desc)
00432 { popup_param_menu(value_desc,location,true); }
00433
00435 void popup_param_menu(synfigapp::ValueDesc value_desc, float location=0, bool bezier=false);
00436
00437 void workarea_layer_selected(synfig::Layer::Handle layer);
00438
00439 void selected_layer_color_set(synfig::Color color);
00440
00441 void register_layer_type(synfig::Layer::Book::value_type &lyr,std::map<synfig::String,Gtk::Menu*>*);
00442
00444 void build_new_layer_menu(Gtk::Menu &menu);
00445
00446 void rebuild_ducks_layer_(synfig::TransformStack& transform_stack, synfig::Canvas::Handle canvas, std::set<synfig::Layer::Handle>& selected_list);
00447
00448 void decrease_low_res_pixel_size();
00449 void increase_low_res_pixel_size();
00450 void toggle_low_res_pixel_flag();
00451 void set_quality(int x);
00452 void set_onion_skins();
00453 void toggle_show_grid();
00454 void toggle_snap_grid();
00455 void toggle_onion_skin();
00456
00457
00458
00459
00460
00461 public:
00462 const synfig::TransformStack& get_curr_transform_stack()const { return curr_transform_stack; }
00463
00464 const synfig::Rect& get_bbox()const { return bbox; }
00465
00466 Glib::RefPtr<Glib::ObjectBase> get_ref_obj(const synfig::String& x);
00467 Glib::RefPtr<const Glib::ObjectBase> get_ref_obj(const synfig::String& x)const;
00468 void set_ref_obj(const synfig::String& x, Glib::RefPtr<Glib::ObjectBase> y);
00469
00470 Glib::RefPtr<Gtk::TreeModel> get_tree_model(const synfig::String& x);
00471 Glib::RefPtr<const Gtk::TreeModel> get_tree_model(const synfig::String& x)const;
00472 void set_tree_model(const synfig::String& x, Glib::RefPtr<Gtk::TreeModel> y);
00473
00474 Gtk::Widget* get_ext_widget(const synfig::String& x);
00475 void set_ext_widget(const synfig::String& x, Gtk::Widget* y);
00476
00477
00478
00479
00480 void popup_main_menu();
00481
00482 Smach& get_smach() { return smach_; }
00483
00484 const Smach& get_smach()const { return smach_; }
00485
00486 Smach::event_result process_event_key(EventKey x);
00487
00488 void popup_layer_menu(synfig::Layer::Handle layer);
00489
00490 virtual ~CanvasView();
00491
00492 void set_mode(Mode x) { canvas_interface()->set_mode(x); }
00493
00494 Mode get_mode()const { return canvas_interface()->get_mode(); }
00495
00496 Gtk::Adjustment &time_adjustment() { return time_adjustment_; }
00497
00498 const Gtk::Adjustment &time_adjustment()const { return time_adjustment_; }
00499
00500 studio::Adjust_Window &time_window_adjustment() { return time_window_adjustment_; }
00501
00502 const studio::Adjust_Window &time_window_adjustment()const { return time_window_adjustment_; }
00503
00504 etl::handle<synfigapp::UIInterface> get_ui_interface() { return ui_interface_;}
00505
00506 etl::handle<synfigapp::SelectionManager> get_selection_manager() { return selection_manager_; }
00507
00508 Glib::RefPtr<Gtk::TreeModel> layer_tree_store() { return get_tree_model("layers"); }
00509
00510 Glib::RefPtr<const Gtk::TreeModel> layer_tree_store()const { return get_tree_model("layers"); }
00511
00512 Glib::RefPtr<Gtk::TreeModel> children_tree_store() { return get_tree_model("children"); }
00513
00514 Glib::RefPtr<const Gtk::TreeModel> children_tree_store()const { return get_tree_model("children"); }
00515
00516 Glib::RefPtr<Gtk::TreeModel> keyframe_tree_store() { return get_tree_model("keyframes"); }
00517
00518 Glib::RefPtr<const Gtk::TreeModel> keyframe_tree_store()const { return get_tree_model("keyframes"); }
00519
00520 void set_time(synfig::Time t) { canvas_interface_->set_time(t); }
00521
00522 synfig::Time get_time() { return canvas_interface_->get_time(); }
00523
00524 etl::handle<synfig::Canvas> get_canvas()const { return canvas_interface_->get_canvas(); }
00525
00526 etl::handle<Instance> get_instance()const { return instance_; }
00527
00528 etl::handle<synfigapp::CanvasInterface> canvas_interface() { return canvas_interface_; }
00529
00530 etl::handle<const synfigapp::CanvasInterface> canvas_interface()const { return canvas_interface_; }
00531
00532 void add_actions_to_menu(Gtk::Menu *menu, const synfigapp::Action::ParamList ¶m_list, synfigapp::Action::Category category=synfigapp::Action::CATEGORY_ALL)const;
00533
00535 void update_title();
00536
00538 bool close_instance();
00539
00541 bool close_view();
00542
00544
00545 void stop() { cancel=true; }
00546
00548
00549 bool get_cancel_status()const { return cancel; }
00550
00552
00553 void reset_cancel_status() { cancel=false; }
00554
00555 void new_child_canvas();
00556
00558 void rebuild_tables();
00559
00561 void build_tables();
00562
00564 void refresh_tables();
00565
00566
00567
00568
00569
00570
00571
00572
00573
00574
00575
00576
00577
00579 void rebuild_ducks();
00580
00581
00582
00584 void play();
00585
00587 void show_tables();
00588
00590 void hide_tables();
00591
00593 void toggle_tables();
00594
00596 bool tables_are_visible();
00597
00599 void show_timebar();
00600
00602 void hide_timebar();
00603
00604
00605 void set_sensitive_timebar(bool sensitive);
00606
00607 void time_zoom_in();
00608 void time_zoom_out();
00609
00610 void add_layer(synfig::String x);
00611
00612 void show_keyframe_dialog();
00613
00614 void play_audio(float t);
00615 void stop_audio();
00616
00617 void image_import();
00618
00619 void on_waypoint_clicked_canvasview(synfigapp::ValueDesc,std::set<synfig::Waypoint,std::less<synfig::UniqueID> >, int button);
00620
00621 void preview_option() {on_preview_option();}
00622
00623 void present();
00624
00625 bool is_playing() { return is_playing_; }
00626
00627 void update_quality();
00628
00629
00630
00631
00632
00633
00634
00635 private:
00636
00637 void on_select_layers();
00638 void on_unselect_layers();
00639
00640 void on_input_device_changed(GdkDevice*);
00641
00642 virtual void on_hide();
00643
00644 virtual bool on_focus_in_event(GdkEventFocus*);
00645 virtual bool on_focus_out_event(GdkEventFocus*);
00646
00647
00648
00649 bool on_keyframe_tree_event(GdkEvent *event);
00650
00651
00652
00653 void on_dirty_preview();
00654
00655 bool on_children_user_click(int, Gtk::TreeRow, ChildrenTree::ColumnID);
00656
00657 bool on_layer_user_click(int, Gtk::TreeRow, LayerTree::ColumnID);
00658
00659
00660
00661 void on_mode_changed(synfigapp::CanvasInterface::Mode mode);
00662
00663
00664
00665
00666
00667 void on_waypoint_changed();
00668
00669 void on_waypoint_delete();
00670
00671 void on_refresh_pressed();
00672
00673 void on_id_changed();
00674
00675 void on_time_changed();
00676
00677
00678
00679
00680
00681
00682
00683
00684 void on_keyframe_add_pressed();
00685
00686 void on_keyframe_duplicate_pressed();
00687
00688 void on_keyframe_remove_pressed();
00689
00690 void on_animate_button_pressed();
00691
00692 void on_keyframe_button_pressed();
00693
00694 void on_preview_option();
00695 void on_preview_create(const PreviewInfo &);
00696
00697 void on_audio_option();
00698 void on_audio_file_change(const std::string &f);
00699 void on_audio_offset_change(const synfig::Time &t);
00700
00701 void on_audio_file_notify();
00702 void on_audio_offset_notify();
00703
00704 bool on_duck_changed(const synfig::Point &value,const synfigapp::ValueDesc& value_desc);
00705 bool on_duck_angle_changed(const synfig::Angle &rotation,const synfigapp::ValueDesc& value_desc);
00706
00707 void on_layer_toggle(synfig::Layer::Handle);
00708
00709 void on_edited_value(synfigapp::ValueDesc,synfig::ValueBase);
00710
00711 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);
00712
00713
00714 bool on_audio_scrub();
00715
00716 void on_play_stop_pressed();
00717
00718 protected:
00719 bool close_instance_when_safe();
00720 bool on_delete_event(GdkEventAny* event);
00721
00722
00723
00724
00725
00726 public:
00727
00728 static etl::handle<studio::CanvasView> create(etl::loose_handle<Instance> instance,etl::handle<synfig::Canvas> canvas);
00729 static std::list<int>& get_pixel_sizes();
00730
00731 };
00732
00733 };
00734
00735
00736
00737 #endif