Remove .gitignore do nothing is ignored.
[synfig.git] / synfig-studio / trunk / src / gtkmm / workarea.cpp
index 57d079d..edc989d 100644 (file)
@@ -117,34 +117,38 @@ public:
 
        synfig::Mutex mutex;
 
-       void set_onion_skin(bool x)
+       void set_onion_skin(bool x, int *onions)
        {
                onionskin=x;
 
                Time time(rend_desc().get_time_start());
 
+               if(!onionskin)
+                       return;
                onion_skin_queue.push_back(time);
-               //onion_skin_queue.push_back(time-1);
-               //onion_skin_queue.push_back(time+1);
 
                try
                {
-                       onion_skin_queue.push_back(
-                               get_canvas()->keyframe_list().find_prev(
-                                       time
-                               )->get_time()
-                       );
+               Time thistime=time;
+               for(int i=0; i<onions[0]; i++)
+                       {
+                               Time keytime=get_canvas()->keyframe_list().find_prev(thistime)->get_time();
+                               onion_skin_queue.push_back(keytime);
+                               thistime=keytime;
+                       }
                }
                catch(...)
                {  }
 
                try
                {
-                       onion_skin_queue.push_back(
-                               get_canvas()->keyframe_list().find_next(
-                                       time
-                               )->get_time()
-                       );
+               Time thistime=time;
+               for(int i=0; i<onions[1]; i++)
+                       {
+                               Time keytime=get_canvas()->keyframe_list().find_next(thistime)->get_time();
+                               onion_skin_queue.push_back(keytime);
+                               thistime=keytime;
+                       }
                }
                catch(...)
                {  }
@@ -413,36 +417,39 @@ public:
 
        std::list<synfig::Time> onion_skin_queue;
 
-       void set_onion_skin(bool x)
+       void set_onion_skin(bool x, int *onions)
        {
                onionskin=x;
 
                Time time(rend_desc().get_time_start());
 
+               if(!onionskin)
+                       return;
                onion_skin_queue.push_back(time);
                //onion_skin_queue.push_back(time-1);
                //onion_skin_queue.push_back(time+1);
-               if(!onionskin)
-                       return;
-
                try
                {
-                       onion_skin_queue.push_back(
-                               get_canvas()->keyframe_list().find_prev(
-                                       time
-                               )->get_time()
-                       );
+               Time thistime=time;
+               for(int i=0; i<onions[0]; i++)
+                       {
+                               Time keytime=get_canvas()->keyframe_list().find_prev(thistime)->get_time();
+                               onion_skin_queue.push_back(keytime);
+                               thistime=keytime;
+                       }
                }
                catch(...)
                {  }
 
                try
                {
-                       onion_skin_queue.push_back(
-                               get_canvas()->keyframe_list().find_next(
-                                       time
-                               )->get_time()
-                       );
+               Time thistime=time;
+               for(int i=0; i<onions[1]; i++)
+                       {
+                               Time keytime=get_canvas()->keyframe_list().find_next(thistime)->get_time();
+                               onion_skin_queue.push_back(keytime);
+                               thistime=keytime;
+                       }
                }
                catch(...)
                {  }
@@ -672,6 +679,8 @@ WorkArea::WorkArea(etl::loose_handle<synfigapp::CanvasInterface> canvas_interfac
        ph=0.001;
        last_focus_point=Point(0,0);
        onion_skin=false;
+       onion_skins[0]=0;
+       onion_skins[1]=0;
        queued=false;
        dirty_trap_enabled=false;
        solid_lines=true;
@@ -1019,6 +1028,14 @@ WorkArea::get_onion_skin()const
        return onion_skin;
 }
 
+void WorkArea::set_onion_skins(int *onions)
+{
+       onion_skins[0]=onions[0];
+       onion_skins[1]=onions[1];
+       if(onion_skin)
+               queue_render_preview();
+}
+
 void
 WorkArea::enable_grid()
 {
@@ -1371,15 +1388,19 @@ WorkArea::on_drawing_area_event(GdkEvent *event)
                                                // if the tangent isn't split, then split it
                                                if (!((*(parent_value_node->get_link("split")))(get_time()).get(bool())))
                                                {
-                                                       get_canvas_view()->canvas_interface()->
+                                                       if (get_canvas_view()->canvas_interface()->
                                                                change_value(synfigapp::ValueDesc(parent_value_node,
                                                                                                                                  parent_value_node->get_link_index_from_name("split")),
-                                                                                        true);
-                                                       // rebuild the ducks from scratch, so the tangents ducks aren't connected
-                                                       get_canvas_view()->rebuild_ducks();
-
-                                                       // reprocess the mouse click
-                                                       return on_drawing_area_event(event);
+                                                                                        true))
+                                                       {
+                                                               // rebuild the ducks from scratch, so the tangents ducks aren't connected
+                                                               get_canvas_view()->rebuild_ducks();
+
+                                                               // reprocess the mouse click
+                                                               return on_drawing_area_event(event);
+                                                       }
+                                                       else
+                                                               return true;
                                                }
                                        } else {
                                                // I don't know how to access the vertex from the tangent duck when originally drawing the bline in the bline tool
@@ -2133,8 +2154,6 @@ WorkArea::refresh(GdkEventExpose*event)
                drawing_frame->unset_bg(Gtk::STATE_NORMAL);
 #endif
 
-       previous_focus=get_focus_point();
-
        return true;
 }
 
@@ -2281,13 +2300,13 @@ studio::WorkArea::async_update_preview()
        // if we have lots of pixels to render and the tile renderer isn't disabled, use it
        int div;
        div = low_resolution ? low_res_pixel_size : 1;
-       if (w*h > 240*div*135*div && !getenv("SYNFIG_DISABLE_TILE_RENDER"))
+       if ((w*h > 240*div*135*div && !getenv("SYNFIG_DISABLE_TILE_RENDER")) || getenv("SYNFIG_FORCE_TILE_RENDER"))
        {
                // do a tile render
                handle<WorkAreaTarget> trgt(new class WorkAreaTarget(this,w,h));
 
                trgt->set_rend_desc(&desc);
-               trgt->set_onion_skin(get_onion_skin());
+               trgt->set_onion_skin(get_onion_skin(), onion_skins);
                target=trgt;
        }
        else
@@ -2296,7 +2315,7 @@ studio::WorkArea::async_update_preview()
                handle<WorkAreaTarget_Full> trgt(new class WorkAreaTarget_Full(this,w,h));
 
                trgt->set_rend_desc(&desc);
-               trgt->set_onion_skin(get_onion_skin());
+               trgt->set_onion_skin(get_onion_skin(), onion_skins);
                target=trgt;
        }
 
@@ -2543,7 +2562,7 @@ WorkArea::queue_scroll()
                        drawing_area->queue_draw_area(      0, 0,       1, maxy);
                        drawing_area->queue_draw_area(maxx-dx, 0, maxx-dx, maxy);
                }
-               else if (dx < 0) 
+               else if (dx < 0)
                {
                        drawing_area->queue_draw_area(   maxx, 0,    maxx, maxy);
                        drawing_area->queue_draw_area(    -dx, 0,     -dx, maxy);
@@ -2553,7 +2572,7 @@ WorkArea::queue_scroll()
                        drawing_area->queue_draw_area(0,       0, maxx,       1);
                        drawing_area->queue_draw_area(0, maxy-dy, maxx, maxy-dy);
                }
-               else if (dy < 0) 
+               else if (dy < 0)
                {
                        drawing_area->queue_draw_area(0,    maxy, maxx,    maxy);
                        drawing_area->queue_draw_area(0,     -dy, maxx,     -dy);
@@ -2579,10 +2598,17 @@ studio::WorkArea::zoom_out()
 void
 studio::WorkArea::zoom_fit()
 {
-       float new_zoom(min(drawing_area->get_width() * zoom / w, drawing_area->get_height() * zoom / h));
-       if (zoom == new_zoom) return set_zoom(prev_zoom);
+       float new_zoom(min(drawing_area->get_width() * zoom / w,
+                                          drawing_area->get_height() * zoom / h) * 0.995);
+       if (zoom / new_zoom > 0.995 && new_zoom / zoom > 0.995)
+       {
+               set_zoom(prev_zoom);
+               return set_focus_point(previous_focus);
+       }
+       previous_focus = get_focus_point();
        prev_zoom = zoom;
        set_zoom(new_zoom);
+       set_focus_point(Point(0,0));
 }
 
 void
@@ -2641,7 +2667,7 @@ studio::WorkArea::queue_render_preview()
                //synfig::info("queue_render_preview(): (re)queuing...");
                //render_idle_func_id=g_idle_add_full(G_PRIORITY_DEFAULT,__render_preview,this,NULL);
                render_idle_func_id=g_timeout_add_full(
-                       G_PRIORITY_DEFAULT,     // priority - 
+                       G_PRIORITY_DEFAULT,     // priority -
                        queue_time,                     // interval - the time between calls to the function, in milliseconds (1/1000ths of a second)
                        __render_preview,       // function - function to call
                        this,                           // data     - data to pass to function