Add snap grid toggle button with proper icon.
[synfig.git] / synfig-studio / trunk / src / gtkmm / canvasview.h
1 /* === S Y N F I G ========================================================= */
2 /*!     \file canvasview.h
3 **      \brief Template Header
4 **
5 **      $Id$
6 **
7 **      \legal
8 **      Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
9 **      Copyright (c) 2007, 2008 Chris Moore
10 **
11 **      This package is free software; you can redistribute it and/or
12 **      modify it under the terms of the GNU General Public License as
13 **      published by the Free Software Foundation; either version 2 of
14 **      the License, or (at your option) any later version.
15 **
16 **      This package is distributed in the hope that it will be useful,
17 **      but WITHOUT ANY WARRANTY; without even the implied warranty of
18 **      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 **      General Public License for more details.
20 **      \endlegal
21 */
22 /* ========================================================================= */
23
24 /* === S T A R T =========================================================== */
25
26 #ifndef __SYNFIG_STUDIO_GTKMM_CANVASVIEW_H
27 #define __SYNFIG_STUDIO_GTKMM_CANVASVIEW_H
28
29 /* === H E A D E R S ======================================================= */
30
31 #include <gtkmm/window.h>
32 #include <gtkmm/image.h>
33 #include <gtkmm/tooltips.h>
34 #include <gtkmm/table.h>
35 #include <gtkmm/statusbar.h>
36 #include <gtkmm/progressbar.h>
37 #include <gtkmm/button.h>
38 #include <gtkmm/menu.h>
39 #include <gtkmm/treeview.h>
40 #include <gtkmm/treestore.h>
41 #include <gtkmm/scrolledwindow.h>
42 #include <gtkmm/notebook.h>
43 #include <gdkmm/device.h>
44 #include <gtkmm/spinbutton.h>
45
46 #include <synfigapp/canvasinterface.h>
47 #include <synfigapp/selectionmanager.h>
48
49 #include <synfig/canvas.h>
50 #include <synfig/string.h>
51 #include <synfig/time.h>
52
53 #include "instance.h"
54 #include "canvasproperties.h"
55 #include "canvasoptions.h"
56 #include "render.h"
57 #include "cellrenderer_timetrack.h"
58 #include "app.h"
59
60 #include "layertreestore.h"
61 #include "layertree.h"
62 #include "childrentreestore.h"
63 #include "childrentree.h"
64 #include "keyframetreestore.h"
65 #include "keyframetree.h"
66
67 #include "dialog_waypoint.h"
68 #include "dialog_keyframe.h"
69 #include "framedial.h"
70 #include "toggleducksdial.h"
71 #include "resolutiondial.h"
72
73 #include "duckmatic.h"
74 #include <gtkmm/scale.h>
75
76 #include <gtkmm/uimanager.h>
77
78 #include "smach.h"
79
80 #include <memory>
81 #include <set>
82 #include <map>
83 #include <gtkmm/toggleaction.h>
84 #include <gtkmm/radioaction.h>
85 #include <synfig/rect.h>
86
87 #include "adjust_window.h"
88
89 #include <synfig/transform.h>
90
91 /* === M A C R O S ========================================================= */
92
93 #ifndef DEBUGPOINT_CLASS
94 #if     _DEBUG
95 #define DEBUGPOINT_CLASS(x)             struct debugpointclass_ ## x { debugpointclass_ ## x () { DEBUGPOINT(); } ~debugpointclass_ ## x () { DEBUGPOINT(); } } badfthguae_ ## x ;
96 #else
97 #define DEBUGPOINT_CLASS(x)
98 #endif
99 #endif
100
101 /* === T Y P E D E F S ===================================================== */
102
103 /* === C L A S S E S & S T R U C T S ======================================= */
104
105 namespace synfig {
106         class TransformStack;
107 }
108
109 namespace studio {
110
111 class CanvasViewUIInterface;
112 class CanvasViewSelectionManager;
113
114 class CellRenderer_TimeTrack;
115 class CellRenderer_ValueBase;
116 class UniversalScrubber;
117 class WorkArea;
118
119 class Duckmatic;
120
121 class Preview;
122 struct PreviewInfo;
123 class AudioContainer;
124
125 class Widget_Sound;
126 class Widget_Timeslider;
127 class Widget_Time;
128
129 class Dialog_SoundSelect;
130 class Dialog_Preview;
131
132 class Dock_Layers;
133 class Dock_Children;
134 class Dock_Keyframes;
135
136 class CanvasView : public Gtk::Window, public etl::shared_object
137 {
138         friend class UniversalScrubber;
139         friend class Dock_Layers;
140         friend class Dock_Children;
141         friend class Dock_Keyframes;
142
143         friend class CanvasViewUIInterface;
144         friend class CanvasViewSelectionManager;
145
146         friend class Duckmatic;
147
148         /*
149  -- ** -- P U B L I C   T Y P E S ---------------------------------------------
150         */
151
152 public:
153
154         typedef etl::handle<CanvasView> Handle;
155
156         typedef etl::handle<const CanvasView> ConstHandle;
157
158         typedef etl::loose_handle<CanvasView> LooseHandle;
159
160         typedef LayerTreeStore::Model LayerTreeModel;
161
162         typedef ChildrenTreeStore::Model ChildrenTreeModel;
163
164         //! Create an instance of this class whenever doing a longer task.
165         /*! Make sure that you check the bool value of this class occasionally
166         **      to make sure the action has not been canceled. */
167         class IsWorking
168         {
169                 CanvasView &canvas_view_;
170
171         public:
172                 IsWorking(CanvasView &canvas_view_);
173                 ~IsWorking();
174                 operator bool()const;
175         };
176         friend class IsWorking;
177
178         typedef synfigapp::CanvasInterface::Mode Mode;
179
180         void set_grid_snap_toggle(bool flag) { grid_snap_toggle->set_active(flag); }
181         void set_grid_show_toggle(bool flag) { grid_show_toggle->set_active(flag); }
182
183         /*
184  -- ** -- P R I V A T E   D A T A ---------------------------------------------
185         */
186
187 public:
188         std::auto_ptr<WorkArea> work_area;
189
190         WorkArea* get_work_area() { return work_area.get(); }
191 private:
192
193         synfig::TransformStack curr_transform_stack;
194         bool curr_transform_stack_set;
195
196         synfig::Rect bbox;
197
198         // DEBUGPOINT_CLASS(1);
199
200         //! State Machine
201         Smach smach_;
202
203         // DEBUGPOINT_CLASS(2);
204
205         etl::loose_handle<Instance> instance_;
206         etl::handle<synfigapp::CanvasInterface> canvas_interface_;
207
208         // DEBUGPOINT_CLASS(3);
209
210         //! Sound and information to play it
211         etl::handle<AudioContainer>             audio;
212         studio::Widget_Sound                    *disp_audio; //should this be put into thing too?
213
214         sigc::connection                                playcon;
215         sigc::connection                                stopcon;
216
217         std::auto_ptr<UniversalScrubber> universal_scrubber;
218
219         //! Tooltip controller
220         Gtk::Tooltips tooltips;
221
222         // DEBUGPOINT_CLASS(4);
223
224         //! TreeModel for the layers
225         LayerTreeModel layer_tree_model;
226
227         //! TreeModel for the the children
228         ChildrenTreeModel children_tree_model;
229
230         //Glib::RefPtr<LayerTreeStore> layer_tree_store_;
231
232         //Glib::RefPtr<ChildrenTreeStore> children_tree_store_;
233
234         //Glib::RefPtr<KeyframeTreeStore> keyframe_tree_store_;
235
236         // DEBUGPOINT_CLASS(5);
237
238         //std::map<synfig::String,Glib::RefPtr<Gtk::TreeModel> > tree_model_book_;
239         std::map<synfig::String,Glib::RefPtr<Glib::ObjectBase> > ref_obj_book_;
240         std::map<synfig::String,Gtk::Widget*> ext_widget_book_;
241
242         //! The time adjustment's scope is defined by the time_window adjustment
243         Gtk::Adjustment time_adjustment_;
244
245         //! The time_window adjustment governs the position of the time window on the whole time line
246         //Gtk::Adjustment time_window_adjustment_;
247         studio::Adjust_Window time_window_adjustment_;
248
249         LayerTree *layer_tree;
250
251         ChildrenTree *children_tree;
252
253         KeyframeTree *keyframe_tree;
254
255         Gtk::Widget *keyframe_tab_child;
256
257         Gtk::ProgressBar *progressbar;
258         Gtk::Statusbar *statusbar;
259
260         Gtk::TreeRow children_canvas_row;
261         Gtk::TreeRow children_valuenode_row;
262
263         Gtk::Button *stopbutton;
264         Gtk::Button *refreshbutton;
265         Gtk::Button *treetogglebutton;  // not used
266         Gtk::Notebook *notebook; // not used
267         Gtk::Table *timebar;
268         Gtk::Table *displaybar;
269         Gtk::Button *animatebutton;
270         Gtk::Button *keyframebutton;
271         FrameDial *framedial;
272         ToggleDucksDial *toggleducksdial;
273         bool toggling_ducks_;
274         ResolutionDial *resolutiondial;
275         bool changing_resolution_;
276         Gtk::Adjustment quality_adjustment_;
277         Gtk::SpinButton *quality_spin;
278         bool updating_quality_;
279         Gtk::ToggleButton *show_grid;
280         Gtk::ToggleButton *snap_grid;
281         bool toggling_show_grid;
282         bool toggling_snap_grid;
283         //! Shows current time and allows edition
284         Widget_Time *current_time_widget;
285         void on_current_time_widget_changed();
286
287         //! Time slider class. Same than the Time track panel
288         std::auto_ptr<Widget_Timeslider> timeslider;
289
290         std::list<sigc::connection> duck_changed_connections;
291
292 /*      DEBUGPOINT_CLASS(8);
293
294         Gtk::Menu duckmaskmenu;
295         DEBUGPOINT_CLASS(77);
296         Gtk::Menu qualitymenu;
297         DEBUGPOINT_CLASS(6);
298
299         Gtk::Menu filemenu;
300         DEBUGPOINT_CLASS(777);
301         Gtk::Menu editmenu;
302         DEBUGPOINT_CLASS(71);
303         Gtk::Menu canvasmenu;
304         DEBUGPOINT_CLASS(73);
305 public:
306         Gtk::Menu layermenu;
307 private:
308         DEBUGPOINT_CLASS(74);
309         Gtk::Menu newlayermenu;
310         DEBUGPOINT_CLASS(76);
311         Gtk::Menu viewmenu;
312
313         DEBUGPOINT_CLASS(99);
314         Gtk::Menu keyframemenu;
315
316         Gtk::Menu parammenu;
317         DEBUGPOINT_CLASS(9);
318         Gtk::Menu trackmenu;
319         DEBUGPOINT_CLASS(7);
320
321         Gtk::CheckMenuItem* duck_mask_position;
322         Gtk::CheckMenuItem* duck_mask_vertex;
323         Gtk::CheckMenuItem* duck_mask_tangent;
324         Gtk::CheckMenuItem* duck_mask_radius;
325         Gtk::CheckMenuItem* duck_mask_width;
326         Gtk::CheckMenuItem* duck_mask_angle;
327 */
328         //! Menu members
329         Gtk::Menu parammenu;
330
331         Glib::RefPtr<Gtk::ToggleAction> grid_snap_toggle;
332         Glib::RefPtr<Gtk::ToggleAction> grid_show_toggle;
333
334         Gtk::RadioButtonGroup quality_group;
335         Gtk::RadioButtonGroup low_res_pixel_size_group;
336
337         Glib::RefPtr<Gtk::ActionGroup> action_group;
338
339         etl::handle<synfigapp::UIInterface> ui_interface_;
340         etl::handle<synfigapp::SelectionManager> selection_manager_;
341
342         bool is_playing_;
343
344         sigc::signal<void> signal_deleted_;
345
346         bool rebuild_ducks_queued;
347         sigc::connection queue_rebuild_ducks_connection;
348
349         /*
350  -- ** -- P U B L I C   D A T A -----------------------------------------------
351         */
352
353 public:
354         void queue_rebuild_ducks();
355         sigc::signal<void>& signal_deleted() { return signal_deleted_; }
356
357         Gtk::Menu mainmenu;
358
359         bool duck_refresh_flag;
360         bool duck_refresh_needed;
361
362         //! This is for the IsWorking class.
363         int working_depth;
364
365         bool cancel;
366
367         /*
368  -- ** -- D I A L O G S -------------------------------------------------------
369         */
370
371 public:
372
373         CanvasProperties canvas_properties;
374         CanvasOptions canvas_options;
375         RenderSettings render_settings;
376         Dialog_Waypoint waypoint_dialog;
377         Dialog_Keyframe keyframe_dialog;
378
379         std::auto_ptr<Dialog_Preview>                   preview_dialog;
380         //std::auto_ptr<Dialog_PreviewOptions>  previewoption_dialog;
381         std::auto_ptr<Dialog_SoundSelect>               sound_dialog;
382
383         /*
384  -- ** -- P R I V A T E   M E T H O D S ---------------------------------------
385         */
386
387 private:
388
389         // Constructor is private to force the use of the "create()" constructor
390         CanvasView(etl::loose_handle<Instance> instance,etl::handle<synfigapp::CanvasInterface> canvas_interface);
391
392         //! Constructor Helper
393         // Gtk::Widget* create_layer_tree();
394
395         //! Constructor Helper
396         // Gtk::Widget* create_children_tree();
397
398         //! Constructor Helper
399         // Gtk::Widget* create_keyframe_tree();
400
401         //! Constructor Helper
402         Gtk::Widget* create_status_bar();
403
404         //! Constructor Helper - Initializes all of the menus
405         void init_menus();
406
407         bool duck_change_param(const synfig::Point &value,synfig::Layer::Handle layer, synfig::String param_name);
408
409         void refresh_time_window();
410
411         void time_was_changed();
412
413         void refresh_rend_desc();
414
415         void toggle_duck_mask(Duckmatic::Type type);
416
417         Gtk::Widget *create_work_area();
418
419         Gtk::Widget *create_time_bar();
420
421         Gtk::Widget *create_display_bar();
422
423         //! Pop up menu for the bezier (bline, draw) tool (?)
424         void popup_param_menu_bezier(float location, synfigapp::ValueDesc value_desc)
425         { popup_param_menu(value_desc,location,true); }
426
427         //! Pop up menu for the tools but not the bezier ones.
428         void popup_param_menu(synfigapp::ValueDesc value_desc, float location=0, bool bezier=false);
429
430         void workarea_layer_selected(synfig::Layer::Handle layer);
431
432         void selected_layer_color_set(synfig::Color color);
433
434         void register_layer_type(synfig::Layer::Book::value_type &lyr,std::map<synfig::String,Gtk::Menu*>*);
435
436         //! Rebuilds the "new layer" menu
437         void build_new_layer_menu(Gtk::Menu &menu);
438
439         void rebuild_ducks_layer_(synfig::TransformStack& transform_stack, synfig::Canvas::Handle canvas, std::set<synfig::Layer::Handle>& selected_list);
440
441         void decrease_low_res_pixel_size();
442         void increase_low_res_pixel_size();
443         void toggle_low_res_pixel_flag();
444         void set_quality(int x);
445         void toggle_show_grid();
446         void toggle_snap_grid();
447
448         /*
449  -- ** -- P U B L I C   M E T H O D S -----------------------------------------
450         */
451
452 public:
453         const synfig::TransformStack& get_curr_transform_stack()const { return curr_transform_stack; }
454
455         const synfig::Rect& get_bbox()const { return bbox; }
456
457         Glib::RefPtr<Glib::ObjectBase> get_ref_obj(const synfig::String& x);
458         Glib::RefPtr<const Glib::ObjectBase> get_ref_obj(const synfig::String& x)const;
459         void set_ref_obj(const synfig::String& x, Glib::RefPtr<Glib::ObjectBase> y);
460
461         Glib::RefPtr<Gtk::TreeModel> get_tree_model(const synfig::String& x);
462         Glib::RefPtr<const Gtk::TreeModel> get_tree_model(const synfig::String& x)const;
463         void set_tree_model(const synfig::String& x, Glib::RefPtr<Gtk::TreeModel> y);
464
465         Gtk::Widget* get_ext_widget(const synfig::String& x);
466         void set_ext_widget(const synfig::String& x, Gtk::Widget* y);
467
468         //std::map<synfig::String,Gtk::Widget*>& tree_view_book() { return tree_view_book_; }
469         //std::map<synfig::String,Gtk::Widget*>& ext_widget_book() { return tree_view_book_; }
470
471         void popup_main_menu();
472
473         Smach& get_smach() { return smach_; }
474
475         const Smach& get_smach()const { return smach_; }
476
477         Smach::event_result process_event_key(EventKey x);
478
479         void popup_layer_menu(synfig::Layer::Handle layer);
480
481         virtual ~CanvasView();
482
483         void set_mode(Mode x) { canvas_interface()->set_mode(x); }
484
485         Mode get_mode()const { return canvas_interface()->get_mode(); }
486
487         Gtk::Adjustment &time_adjustment() { return time_adjustment_; }
488
489         const Gtk::Adjustment &time_adjustment()const { return time_adjustment_; }
490
491         studio::Adjust_Window &time_window_adjustment() { return time_window_adjustment_; }
492
493         const studio::Adjust_Window &time_window_adjustment()const { return time_window_adjustment_; }
494
495         etl::handle<synfigapp::UIInterface> get_ui_interface() { return ui_interface_;}
496
497         etl::handle<synfigapp::SelectionManager> get_selection_manager() { return selection_manager_; }
498
499         Glib::RefPtr<Gtk::TreeModel> layer_tree_store() { return get_tree_model("layers"); }
500
501         Glib::RefPtr<const Gtk::TreeModel> layer_tree_store()const { return get_tree_model("layers"); }
502
503         Glib::RefPtr<Gtk::TreeModel> children_tree_store() { return get_tree_model("children"); }
504
505         Glib::RefPtr<const Gtk::TreeModel> children_tree_store()const { return get_tree_model("children"); }
506
507         Glib::RefPtr<Gtk::TreeModel> keyframe_tree_store() { return get_tree_model("keyframes"); }
508
509         Glib::RefPtr<const Gtk::TreeModel> keyframe_tree_store()const { return get_tree_model("keyframes"); }
510
511         void set_time(synfig::Time t) { canvas_interface_->set_time(t); }
512
513         synfig::Time get_time() { return canvas_interface_->get_time(); }
514
515         etl::handle<synfig::Canvas> get_canvas()const { return canvas_interface_->get_canvas(); }
516
517         etl::handle<Instance> get_instance()const { return instance_; }
518
519         etl::handle<synfigapp::CanvasInterface> canvas_interface() { return canvas_interface_; }
520
521         etl::handle<const synfigapp::CanvasInterface> canvas_interface()const { return canvas_interface_; }
522
523         void add_actions_to_menu(Gtk::Menu *menu,   const synfigapp::Action::ParamList &param_list, synfigapp::Action::Category category=synfigapp::Action::CATEGORY_ALL)const;
524
525         //! Updates the title of the window
526         void update_title();
527
528         //! Closes this document
529         bool close_instance();
530
531         //! Closes this canvas view
532         bool close_view();
533
534         //!     Stops the currently executing action
535         /*! \see get_cancel_status(), reset_cancel_status(), IsWorking */
536         void stop() { cancel=true; }
537
538         //! Returns the cancel status
539         /*! \see stop(), reset_cancel_status(), IsWorking */
540         bool get_cancel_status()const { return cancel; }
541
542         //! Resets the cancel status
543         /*! \see stop(), get_cancel_status(), IsWorking */
544         void reset_cancel_status() { cancel=false; }
545
546         void new_child_canvas();
547
548         //! Rebuilds layer_tree_store_ from the Canvas. Maintains selected items.
549         void rebuild_tables();
550
551         //! Builds layer_tree_store_ from the Canvas. Does not maintain selected items.
552         void build_tables();
553
554         //! Refreshes the data for the tables
555         void refresh_tables();
556
557         //void rebuild_layer_table();
558         //void build_layer_table();
559         //void refresh_layer_table();
560
561 //      void rebuild_canvas_table();
562 //      void build_canvas_table();
563 //      void refresh_canvas_table();
564
565 //      void rebuild_valuenode_table();
566 //      void build_valuenode_table();
567 //      void refresh_valuenode_table();
568
569         //! \writeme
570         void rebuild_ducks();
571
572         //bool add_to_ducks(synfigapp::ValueDesc value_desc, synfig::ParamDesc *param_desc=NULL);
573
574         //! Starts "playing" the animation in real-time
575         void play();
576
577         //! Shows the tables (Layer/Children)
578         void show_tables();
579
580         //! Hides the tables (Layer/Children)
581         void hide_tables();
582
583         //! Toggles the tables
584         void toggle_tables();
585
586         //! Gets the table status
587         bool tables_are_visible();
588
589         //! Shows the time bar
590         void show_timebar();
591
592         //! Hides the time bar
593         void hide_timebar();
594
595         //t Enables or disables interaction with the timebar
596         void set_sensitive_timebar(bool sensitive);
597
598         void time_zoom_in();
599         void time_zoom_out();
600
601         void add_layer(synfig::String x);
602
603         void show_keyframe_dialog();
604
605         void play_audio(float t);
606         void stop_audio();
607
608         void image_import();
609
610         void on_waypoint_clicked_canvasview(synfigapp::ValueDesc,std::set<synfig::Waypoint,std::less<synfig::UniqueID> >, int button);
611
612         void preview_option() {on_preview_option();}
613
614         void present();
615
616         bool is_playing() { return is_playing_; }
617
618         void update_quality();
619
620         /*
621  -- ** -- S I G N A L   T E R M I N A L S -------------------------------------
622         */
623
624 private:
625
626         void on_select_layers();
627         void on_unselect_layers();
628
629         void on_input_device_changed(GdkDevice*);
630
631         virtual void on_hide();
632
633         virtual bool on_focus_in_event(GdkEventFocus*);
634         virtual bool on_focus_out_event(GdkEventFocus*);
635
636         //bool on_children_tree_event(GdkEvent *event);
637
638         bool on_keyframe_tree_event(GdkEvent *event);
639
640         //void on_children_edited_value(const Glib::ustring&path_string,synfig::ValueBase value);
641
642         void on_dirty_preview();
643
644         bool on_children_user_click(int, Gtk::TreeRow, ChildrenTree::ColumnID);
645
646         bool on_layer_user_click(int, Gtk::TreeRow, LayerTree::ColumnID);
647
648 //      void on_layer_toggle(const Glib::ustring& path_string, Gtk::TreeModelColumn<bool> column);
649
650         void on_mode_changed(synfigapp::CanvasInterface::Mode mode);
651
652 //      void on_layer_waypoint_clicked(const Glib::ustring &, synfig::ValueNode_Animated::WaypointList::iterator);
653
654         //void on_children_waypoint_clicked(const Glib::ustring &, synfig::ValueNode_Animated::WaypointList::iterator);
655
656         void on_waypoint_changed();
657
658         void on_waypoint_delete();
659
660         void on_refresh_pressed();
661
662         void on_id_changed();
663
664         void on_time_changed();
665
666         /*
667         void on_layer_raise_pressed();
668         void on_layer_lower_pressed();
669         void on_layer_duplicate_pressed();
670         void on_layer_delete_pressed();
671         */
672
673         void on_keyframe_add_pressed();
674
675         void on_keyframe_duplicate_pressed();
676
677         void on_keyframe_remove_pressed();
678
679         void on_animate_button_pressed();
680
681         void on_keyframe_button_pressed();
682
683         void on_preview_option();
684         void on_preview_create(const PreviewInfo &);
685
686         void on_audio_option();
687         void on_audio_file_change(const std::string &f);
688         void on_audio_offset_change(const synfig::Time &t);
689
690         void on_audio_file_notify();
691         void on_audio_offset_notify();
692
693         bool on_duck_changed(const synfig::Point &value,const synfigapp::ValueDesc& value_desc);
694         bool on_duck_angle_changed(const synfig::Angle &rotation,const synfigapp::ValueDesc& value_desc);
695
696         void on_layer_toggle(synfig::Layer::Handle);
697
698         void on_edited_value(synfigapp::ValueDesc,synfig::ValueBase);
699
700         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);
701
702         //void on_audio_play();
703         bool on_audio_scrub();
704
705         void on_play_stop_pressed();
706
707 protected:
708         bool close_instance_when_safe();
709         bool on_delete_event(GdkEventAny* event);
710
711         /*
712  -- ** -- S T A T I C   P U B L I C   M E T H O D S ---------------------------
713         */
714
715 public:
716
717         static etl::handle<studio::CanvasView> create(etl::loose_handle<Instance> instance,etl::handle<synfig::Canvas> canvas);
718         static std::list<int>& get_pixel_sizes();
719
720 }; // END of class CanvasView
721
722 }; // END of namespace studio
723
724 /* === E N D =============================================================== */
725
726 #endif