source: synfigstudio/trunk/fuentes/src/gui/workarea.h @ 481

Last change on this file since 481 was 481, checked in by jrpelegrina, 4 years ago

First release to xenial

File size: 17.3 KB
Line 
1/* === S Y N F I G ========================================================= */
2/*!     \file workarea.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**  Copyright (c) 2011 Nikita Kitaev
11**
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.
16**
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.
21**      \endlegal
22*/
23/* ========================================================================= */
24
25/* === S T A R T =========================================================== */
26
27#ifndef __SYNFIG_GTKMM_WORKAREA_H
28#define __SYNFIG_GTKMM_WORKAREA_H
29
30/* === H E A D E R S ======================================================= */
31
32#include <list>
33#include <map>
34#include <set>
35
36#include <ETL/smart_ptr>
37#include <ETL/handle>
38
39#include <gtkmm/drawingarea.h>
40#include <gtkmm/table.h>
41#include <gtkmm/adjustment.h>
42#include <gtkmm/image.h>
43#include <gdkmm/pixbuf.h>
44#include <gdkmm/cursor.h>
45#include <gdkmm/device.h>
46
47#include <synfig/time.h>
48#include <synfig/vector.h>
49#include <synfig/general.h>
50#include <synfig/renddesc.h>
51#include <synfig/canvas.h>
52
53#include "dials/zoomdial.h"
54#include "widgets/widget_ruler.h"
55#include "duckmatic.h"
56#include "instance.h"
57#include "app.h"
58
59/* === M A C R O S ========================================================= */
60
61/* === T Y P E D E F S ===================================================== */
62
63/* === C L A S S E S & S T R U C T S ======================================= */
64
65/*
66namespace etl {
67
68template <typename T_, typename C_=std::less<T_,T_> >
69class dereferenced_compare
70{
71public:
72        typedef etl::loose_handle<T_> first_argument_type;
73        typedef etl::loose_handle<T_> second_argument_type;
74        typedef bool result_type;
75
76}
77};
78*/
79
80namespace synfigapp { class CanvasInterface; };
81
82namespace synfig { class Layer; };
83namespace Gtk { class Frame; };
84
85namespace studio
86{
87class WorkAreaTarget;
88class WorkAreaTarget_Full;
89class WorkAreaTarget_Cairo;
90class WorkAreaTarget_Cairo_Tile;
91
92class Instance;
93class CanvasView;
94class WorkArea;
95class WorkAreaRenderer;
96class AsyncRenderer;
97class DirtyTrap
98{
99        friend class WorkArea;
100        WorkArea *work_area;
101public:
102        DirtyTrap(WorkArea *work_area);
103        ~DirtyTrap();
104};
105
106
107class WorkArea : public Gtk::Table, public Duckmatic
108{
109        friend class WorkAreaTarget;
110        friend class WorkAreaTarget_Full;
111        friend class WorkAreaTarget_Cairo;
112        friend class WorkAreaTarget_Cairo_Tile;
113        friend class DirtyTrap;
114        friend class WorkAreaRenderer;
115        friend class WorkAreaProgress;
116
117        /*
118 -- ** -- P U B L I C   T Y P E S ---------------------------------------------
119        */
120
121public:
122
123        class PushState;
124        friend class PushState;
125
126        void insert_renderer(const etl::handle<WorkAreaRenderer> &x);
127        void insert_renderer(const etl::handle<WorkAreaRenderer> &x,int priority);
128        void erase_renderer(const etl::handle<WorkAreaRenderer> &x);
129        void resort_render_set();
130
131        enum DragMode
132        {
133                DRAG_NONE=0,
134                DRAG_WINDOW,
135                DRAG_DUCK,
136                DRAG_GUIDE,
137                DRAG_BOX,
138                DRAG_BEZIER
139        };
140        // Class used to store the cairo surface
141        class SurfaceElement
142        {
143        public:
144                cairo_surface_t* surface;
145                int refreshes;
146                SurfaceElement()
147                {
148                        surface=NULL;
149                        refreshes=0;
150                }
151                //Copy constructor
152                SurfaceElement(const SurfaceElement& other): surface(cairo_surface_reference(other.surface)), refreshes(other.refreshes)
153                {
154                }
155                ~SurfaceElement()
156                {
157                        if(surface)
158                                cairo_surface_destroy(surface);
159                }
160        };
161
162        typedef std::vector<SurfaceElement>      SurfaceBook;
163
164        /*
165 -- ** -- P R I V A T E   D A T A ---------------------------------------------
166        */
167
168private:
169
170        std::set<etl::handle<WorkAreaRenderer> > renderer_set_;
171
172        etl::handle<studio::AsyncRenderer> async_renderer;
173
174
175        etl::loose_handle<synfigapp::CanvasInterface> canvas_interface;
176        etl::handle<synfig::Canvas> canvas;
177        etl::loose_handle<studio::Instance> instance;
178        etl::loose_handle<studio::CanvasView> canvas_view;
179
180        // Widgets
181        Gtk::DrawingArea *drawing_area;
182        Glib::RefPtr<Gtk::Adjustment> scrollx_adjustment;
183        Glib::RefPtr<Gtk::Adjustment> scrolly_adjustment;
184        // TODO: Implement Rulers
185        Widget_Ruler *vruler;
186        Widget_Ruler *hruler;
187        Gtk::Button *menubutton;
188        Gtk::Frame *drawing_frame;
189
190        GdkDevice* curr_input_device;
191
192        // Bleh!
193        int     w;                                              //!< Width of the image (in pixels)
194        int     h;                                              //!< Height of the image (in pixels)
195        synfig::Real    canvaswidth;    //!< Width of the canvas
196        synfig::Real    canvasheight;   //!< Height of the canvas
197        synfig::Real    pw;                             //!< The width of a pixel
198        synfig::Real    ph;                             //!< The height of a pixel
199        // float zoom and prev_zoom are declared in Duckmatic
200        synfig::Point window_tl;                //!< The (theoretical) top-left corner of the view window
201        synfig::Point window_br;                //!< The (theoretical) bottom-right corner of the view window
202
203        guint32 last_event_time;
204
205        int bpp;
206        //unsigned char *buffer;
207
208        //! ???
209        synfig::ProgressCallback *progresscallback;
210
211        //! ???
212        synfig::RendDesc desc;
213
214        //! This flag is set if the user is dragging the video window
215        /*! \see drag_point */
216        DragMode dragging;
217
218        etl::handle<Duckmatic::Duck> clicked_duck;
219        etl::handle<Duckmatic::Duck> hover_duck;
220
221        //! When dragging the viewport, this is set to the origin of the drag
222        synfig::Point drag_point;
223
224        synfig::Point curr_point;
225
226        //! ???
227        synfig::Point previous_focus;
228
229        //! This flag is set if the grid should be drawn
230        bool show_grid;
231
232        //! This flag is set if the guides should be drawn
233        bool show_guides;
234
235        //! Checker background size
236        synfig::Vector background_size;
237        //! Checker background first color
238        synfig::Color background_first_color;
239        //! Checker background second color
240        synfig::Color background_second_color;
241
242        synfig::Time jack_offset;
243
244        bool low_resolution;
245
246        bool meta_data_lock;
247
248        //! This flag is set if the entire frame is rendered rather than using tiles
249        bool full_frame;
250
251        //Glib::RefPtr<Gdk::Pixbuf> pix_buf;
252
253        //! This vector holds all of the tiles for this frame
254        std::vector< std::pair<Glib::RefPtr<Gdk::Pixbuf>,int> > tile_book;
255        // This vector holds all the cairo surfaces for the frame
256        SurfaceBook cairo_book;
257
258        //! This integer describes the total times that the work area has been refreshed
259        int refreshes;
260
261        //! This list holds the queue of tiles that need to be rendered
262        //std::list<int> tile_queue;
263
264        int tile_w, tile_h;
265
266        gint render_idle_func_id;
267
268        //! The coordinates of the focus the last time a part of the screen was refreshed
269        synfig::Point last_focus_point;
270
271        bool canceled_;
272
273        int quality;
274        int low_res_pixel_size;
275
276        bool dirty_trap_enabled;
277
278        int dirty_trap_queued;
279
280        // This flag is set if onion skin is visible
281        bool onion_skin;
282        //! stores the future [1] and past [0] onion skins based on keyframes
283        int onion_skins[2];
284
285        etl::loose_handle<synfig::ValueNode> selected_value_node_;
286
287        bool allow_duck_clicks;
288        bool allow_bezier_clicks;
289        bool allow_layer_clicks;
290        bool cancel;
291        bool curr_guide_is_x;
292        bool dirty;
293        bool queued;
294        bool rendering;
295       
296#ifdef SINGLE_THREADED
297        /* resize bug workaround */
298        int old_window_width;
299        int old_window_height;
300#endif
301
302        /*
303 -- ** -- P U B L I C   D A T A -----------------------------------------------
304        */
305
306public:
307
308        const etl::loose_handle<synfig::ValueNode>& get_selected_value_node() { return  selected_value_node_; }
309        const synfig::Point& get_drag_point()const { return drag_point; }
310        std::vector< std::pair<Glib::RefPtr<Gdk::Pixbuf>,int> >& get_tile_book(){ return tile_book; }
311        SurfaceBook& get_cairo_book() { return cairo_book; }
312        int get_refreshes()const { return refreshes; }
313        bool get_canceled()const { return canceled_; }
314        bool get_queued()const { return queued; }
315        bool get_rendering()const { return rendering; }
316#ifdef SINGLE_THREADED
317        bool get_updating()const;
318        void stop_updating(bool cancel = false);
319#endif
320        bool get_full_frame()const { return full_frame; }
321        //int get_w()const { return w; }
322        //int get_h()const { return h; }
323
324        int get_tile_w()const { return tile_w; }
325        int get_tile_h()const { return tile_h; }
326
327        bool get_allow_layer_clicks() { return allow_layer_clicks; }
328        void set_allow_layer_clicks(bool value) { allow_layer_clicks=value; }
329
330        bool get_allow_duck_clicks() { return allow_duck_clicks; }
331        void set_allow_duck_clicks(bool value) { allow_duck_clicks=value; }
332
333        bool get_allow_bezier_clicks() { return allow_bezier_clicks; }
334        void set_allow_bezier_clicks(bool value) { allow_bezier_clicks=value; }
335
336        // used in renderer_ducks.cpp
337        bool solid_lines;
338
339        // used in renderer_guides.cpp
340        GuideList::iterator curr_guide;
341
342        // used in renderer_timecode.cpp
343        int timecode_width, timecode_height;
344
345        // used in renderer_bonesetup.cpp
346        int bonesetup_width, bonesetup_height;
347
348        /*
349 -- ** -- P R I V A T E   M E T H O D S ---------------------------------------
350        */
351
352private:
353
354        //unsigned char *get_buffer() { return buffer; }
355        bool set_wh(int w, int h,int chan=3);
356
357        int next_unrendered_tile(int refreshes)const;
358        int next_unrendered_tile()const { return next_unrendered_tile(refreshes); }
359
360        /*
361 -- ** -- S I G N A L S -------------------------------------------------------
362        */
363
364private:
365
366        sigc::signal<void,GdkDevice* > signal_input_device_changed_;
367
368        //! One signal per button
369        sigc::signal<void,synfig::Point> signal_user_click_[5];
370
371        sigc::signal<void> signal_popup_menu_;
372
373        sigc::signal<void> signal_cursor_moved_;
374        sigc::signal<void> signal_rendering_;
375
376        //! Signal for when the user clicks on a layer
377        sigc::signal<void, etl::handle<synfig::Layer> > signal_layer_selected_;
378
379        sigc::signal<void> signal_view_window_changed_;
380
381        sigc::signal<void> signal_meta_data_changed_;
382
383public:
384
385        sigc::signal<void>& signal_rendering() { return signal_rendering_; }
386
387        sigc::signal<void>& signal_cursor_moved() { return signal_cursor_moved_; }
388
389        sigc::signal<void>& signal_view_window_changed() { return signal_view_window_changed_; }
390
391        sigc::signal<void>& signal_meta_data_changed() { return signal_meta_data_changed_; }
392
393        void view_window_changed() { signal_view_window_changed()(); }
394
395        sigc::signal<void,GdkDevice* >& signal_input_device_changed() { return signal_input_device_changed_; }
396
397        sigc::signal<void> &signal_popup_menu() { return signal_popup_menu_; }
398
399        //! One signal per button (5 buttons)
400        sigc::signal<void,synfig::Point> &signal_user_click(int button=0){ return signal_user_click_[button]; }
401
402        sigc::signal<void, etl::handle<synfig::Layer> >& signal_layer_selected() { return signal_layer_selected_; }
403
404        /*
405 -- ** -- P U B L I C   M E T H O D S -----------------------------------------
406        */
407
408public:
409        void set_onion_skin(bool x);
410        bool get_onion_skin()const;
411        void toggle_onion_skin() { set_onion_skin(!get_onion_skin()); }
412        void set_onion_skins(int *onions);
413        int const * get_onion_skins()const;
414
415        void set_selected_value_node(etl::loose_handle<synfig::ValueNode> x);
416
417        bool is_dragging() { return dragging!=DRAG_NONE; }
418
419        DragMode get_dragging_mode() { return dragging; }
420
421        WorkArea(etl::loose_handle<synfigapp::CanvasInterface> canvas_interface);
422        virtual ~WorkArea();
423
424        void set_cursor(const Glib::RefPtr<Gdk::Cursor> &x);
425        void set_cursor(Gdk::CursorType x);
426
427        const synfig::Point& get_cursor_pos()const { return curr_point; }
428
429        Glib::RefPtr<Gtk::Adjustment> get_scrollx_adjustment() { return scrollx_adjustment; }
430        Glib::RefPtr<Gtk::Adjustment> get_scrolly_adjustment() { return scrolly_adjustment; }
431        Glib::RefPtr<const Gtk::Adjustment> get_scrollx_adjustment() const { return scrollx_adjustment; }
432        Glib::RefPtr<const Gtk::Adjustment> get_scrolly_adjustment() const { return scrolly_adjustment; }
433
434        void set_instance(etl::loose_handle<studio::Instance> x) { instance=x; }
435        void set_canvas(etl::handle<synfig::Canvas> x) { canvas=x; }
436        void set_canvas_view(etl::loose_handle<studio::CanvasView> x) { canvas_view=x; }
437        etl::handle<synfig::Canvas> get_canvas()const { return canvas; }
438        etl::handle<studio::Instance> get_instance()const { return instance; }
439        etl::loose_handle<studio::CanvasView> get_canvas_view()const { return canvas_view; }
440
441        void refresh_dimension_info();
442
443        //! Enables showing of the grid
444        void enable_grid();
445        //! Disables showing of the grid
446        void disable_grid();
447        //! Toggles the showing of the grid
448        void toggle_grid();
449        //! Returns the state of the show_grid flag
450        bool grid_status()const { return show_grid; }
451        //! Toggles the snap of the grid
452        void toggle_grid_snap();
453        //! Sets the size of the grid
454        void set_grid_size(const synfig::Vector &s);
455        //! Sets the color of the grid
456        void set_grid_color(const synfig::Color &c);
457        //! Returns the color of the grid
458        const synfig::Color &get_grid_color()const { return Duckmatic::get_grid_color();}
459
460        //! Returns the state of the show_guides flag
461        bool get_show_guides()const { return show_guides; }
462        //! Sets the showing of the grid
463        void set_show_guides(bool x);
464        //! Toggles the showing of the guides
465        void toggle_show_guides() { set_show_guides(!get_show_guides()); }
466        //! Toggles the snap of the guides
467        void toggle_guide_snap();
468        //! Sets the color of the guides
469        void set_guides_color(const synfig::Color &c);
470        //! Returns the color of the guides
471        const synfig::Color &get_guides_color()const { return Duckmatic::get_guides_color();}
472
473        synfig::Time get_jack_offset()const { return jack_offset; }
474        void set_jack_offset(const synfig::Time &x);
475
476        //! Sets the size of the checker background
477        void set_background_size(const synfig::Vector &s);
478        //! Sets the first color of the checker background
479        void set_background_first_color(const synfig::Color &c);
480        //! Sets the second color of the checker background
481        void set_background_second_color(const synfig::Color &c);
482        //! Sets the size of the checker background
483        const synfig::Vector &get_background_size()const { return background_size;}
484        //! Returns the first color of the checker background
485        const synfig::Color &get_background_first_color()const { return background_first_color;}
486        //! Returns the second color of the checker background
487        const synfig::Color &get_background_second_color()const { return background_second_color;}
488
489        bool get_low_resolution_flag()const { return low_resolution; }
490        void set_low_resolution_flag(bool x);
491        void toggle_low_resolution_flag();
492
493        //! ???
494        void queue_scroll();
495
496        //! ??
497        void popup_menu();
498
499        int get_quality()const { return quality; }
500        int get_low_res_pixel_size()const { return low_res_pixel_size; }
501
502        void set_quality(int x);
503        void set_low_res_pixel_size(int x);
504
505
506        int get_w()const { return w; }
507        int get_h()const { return h; }
508        int get_bpp()const { return bpp; }
509
510        //! ??
511        const synfig::RendDesc &get_rend_desc()const { return desc; }
512
513        //! ??
514        void set_rend_desc(const synfig::RendDesc &x) { desc=x; }
515
516        //! Converts screen coords (ie: pixels) to composition coordinates
517        synfig::Point screen_to_comp_coords(synfig::Point pos)const;
518
519        //! Converts composition coordinates to screen coords (ie: pixels)
520        synfig::Point comp_to_screen_coords(synfig::Point pos)const;
521
522        float get_pw()const { return pw; }
523        float get_ph()const { return ph; }
524
525        const synfig::Point &get_window_tl()const { return window_tl; }
526        const synfig::Point &get_window_br()const { return window_br; }
527
528
529        bool async_update_preview();
530        void async_update_finished();
531        void async_render_preview(synfig::Time time);
532        void async_render_preview();
533
534        bool sync_update_preview();
535        bool sync_render_preview(synfig::Time time);
536        bool sync_render_preview();
537        void sync_render_preview_hook();
538
539        void queue_render_preview();
540
541
542        void queue_draw_preview();
543
544        void zoom_in();
545        void zoom_out();
546        void zoom_fit();
547        void zoom_norm();
548        float get_zoom()const { return zoom; } // zoom is declared in Duckmatic
549
550        void set_zoom(float z);
551
552
553        void set_progress_callback(synfig::ProgressCallback *x) { progresscallback=x; }
554        synfig::ProgressCallback *get_progress_callback() { return progresscallback; }
555
556        void set_focus_point(const synfig::Point &x);
557
558        synfig::Point get_focus_point()const;
559
560        void done_rendering();
561
562#ifdef SINGLE_THREADED
563        /* resize bug workaround */
564        void refresh_second_check();
565#endif
566        bool refresh(const Cairo::RefPtr<Cairo::Context> &cr);
567
568        void reset_cursor();
569        void refresh_cursor();
570
571        void save_meta_data();
572        void load_meta_data();
573        //! Test initial meta data values
574        bool have_meta_data();
575
576        /*
577 -- ** -- S I G N A L   T E R M I N A L S -------------------------------------
578        */
579
580private:
581        bool on_key_press_event(GdkEventKey* event);
582        bool on_key_release_event(GdkEventKey* event);
583        bool on_drawing_area_event(GdkEvent* event);
584        bool on_hruler_event(GdkEvent* event);
585        bool on_vruler_event(GdkEvent* event);
586
587        /*
588 -- ** -- S T A T I C   P U B L I C   M E T H O D S ---------------------------
589        */
590
591public:
592
593        /*
594 -- ** -- S T A T I C   P R I V A T E   M E T H O D S -------------------------
595        */
596
597private:
598
599        static gboolean __render_preview(gpointer data);
600#ifdef SINGLE_THREADED
601        /* resize bug workaround */
602        static gboolean __refresh_second_check(gpointer data);
603#endif
604
605}; // END of class WorkArea
606
607/*! \class WorkArea::PushState
608**      Saves the current duck view and editing options
609**  Should be used by tools that hide ducks or change clickability settings */
610class WorkArea::PushState
611{
612        WorkArea *workarea_;
613        Type type_mask;
614        bool allow_duck_clicks;
615        bool allow_bezier_clicks;
616        bool allow_layer_clicks;
617
618        bool needs_restore;
619
620public:
621        PushState(WorkArea *workarea_);
622        ~PushState();
623        void restore();
624}; // END of class WorkArea::PushState
625
626}; // END of namespace studio
627
628/* === E N D =============================================================== */
629
630#endif
Note: See TracBrowser for help on using the repository browser.