X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=synfig-studio%2Ftrunk%2Fsrc%2Fgtkmm%2Fworkarea.cpp;h=d662c5508f1651119e0558e0666c0f4cc655780e;hb=82172e34b62d1e335b1deb00bfc714e293f1c165;hp=6c4e252fa918a5a1a45f8bd1921821a4ed87d3a7;hpb=837b63e9fb829d66d43f4f169861f8979f76820d;p=synfig.git diff --git a/synfig-studio/trunk/src/gtkmm/workarea.cpp b/synfig-studio/trunk/src/gtkmm/workarea.cpp index 6c4e252..d662c55 100644 --- a/synfig-studio/trunk/src/gtkmm/workarea.cpp +++ b/synfig-studio/trunk/src/gtkmm/workarea.cpp @@ -51,6 +51,7 @@ #include #include #include +#include #include #include "event_mouse.h" #include "event_layerclick.h" @@ -261,7 +262,7 @@ public: } - virtual bool start_frame(synfig::ProgressCallback *cb) + virtual bool start_frame(synfig::ProgressCallback */*cb*/) { synfig::Mutex::Lock lock(mutex); @@ -505,7 +506,7 @@ public: } - virtual bool start_frame(synfig::ProgressCallback *cb) + virtual bool start_frame(synfig::ProgressCallback */*cb*/) { return true; } @@ -1287,26 +1288,16 @@ WorkArea::on_drawing_area_event(GdkEvent *event) if(duck) { - clicked_duck=0; + // make a note of whether the duck we click on was selected or not if(duck_is_selected(duck)) - { clicked_duck=duck; - } else { - if(modifier&GDK_SHIFT_MASK) - { - select_duck(duck); - } - else if(modifier&GDK_CONTROL_MASK) - { - select_duck(duck); - } - else - { + clicked_duck=0; + // if CTRL isn't pressed, clicking an unselected duck will unselect all other ducks + if(!(modifier&GDK_CONTROL_MASK)) clear_selected_ducks(); - select_duck(duck); - } + select_duck(duck); } } } @@ -1320,6 +1311,37 @@ WorkArea::on_drawing_area_event(GdkEvent *event) { //get_selected_duck()->signal_user_click(0)(); //if(clicked_duck)clicked_duck->signal_user_click(0)(); + + // if the user is holding shift while clicking on a tangent duck, consider splitting the tangent + if (event->motion.state&GDK_SHIFT_MASK && duck->get_type() == Duck::TYPE_TANGENT) + { + synfigapp::ValueDesc value_desc = duck->get_value_desc(); + + // we have the tangent, but need the vertex - that's the parent + if (value_desc.parent_is_value_node()) { + ValueNode_Composite::Handle parent_value_node = value_desc.get_parent_value_node(); + + // 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()-> + 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); + } + } else { + // I don't know how to access the vertex from the tangent duck when originally drawing the bline in the bline tool + + // synfig::ValueNode::Handle vn = value_desc.get_value_node(); + synfig::info("parent isn't value node? shift-drag-tangent doesn't work in bline tool yet..."); + } + } + dragging=DRAG_DUCK; drag_point=mouse_pos; //drawing_area->queue_draw(); @@ -1565,37 +1587,20 @@ WorkArea::on_drawing_area_event(GdkEvent *event) get_canvas_view()->duck_refresh_flag=true; if(!drag_did_anything) { - //etl::handle duck=find_duck(mouse_pos,radius); - - if(modifier&GDK_SHIFT_MASK) + // if we originally clicked on a selected duck ... + if(clicked_duck) { - //synfig::info("DUCK_DRAG_RELEASE: SHIFT-MASK ON!"); - if(clicked_duck) - { - //synfig::info("DUCK_DRAG_RELEASE: CLICKED DUCK!"); + // ... and CTRL is pressed, then just toggle the clicked duck + // otherwise make the clicked duck the only selected duck + if(modifier&GDK_CONTROL_MASK) unselect_duck(clicked_duck); - } - } - else if(modifier&GDK_CONTROL_MASK) - { - //synfig::info("DUCK_DRAG_RELEASE: CONTROL-MASK ON!"); - if(clicked_duck) - { - //synfig::info("DUCK_DRAG_RELEASE: CLICKED DUCK!"); - unselect_duck(clicked_duck); - } - } - else - { - //synfig::info("DUCK_DRAG_RELEASE: NO MASK!"); - if(clicked_duck) + else { - //synfig::info("DUCK_DRAG_RELEASE: CLICKED DUCK!"); clear_selected_ducks(); select_duck(clicked_duck); } + clicked_duck->signal_user_click(0)(); } - if(clicked_duck)clicked_duck->signal_user_click(0)(); } else { @@ -1623,9 +1628,18 @@ WorkArea::on_drawing_area_event(GdkEvent *event) if(canvas_view->get_smach().process_event(EventBox(drag_point,mouse_pos,MouseButton(event->button.button),modifier))==Smach::RESULT_ACCEPT) return true; - if(!(modifier&GDK_CONTROL_MASK) && !(modifier&GDK_SHIFT_MASK)) + // when dragging a box around some ducks: + // SHIFT selects; CTRL toggles; SHIFT+CTRL unselects; clears all then selects + if(modifier&GDK_SHIFT_MASK) + select_ducks_in_box(drag_point,mouse_pos); + + if(modifier&GDK_CONTROL_MASK) + toggle_select_ducks_in_box(drag_point,mouse_pos); + else if(!(modifier&GDK_SHIFT_MASK)) + { clear_selected_ducks(); - select_ducks_in_box(drag_point,mouse_pos); + select_ducks_in_box(drag_point,mouse_pos); + } ret=true; } else @@ -1689,11 +1703,13 @@ WorkArea::on_drawing_area_event(GdkEvent *event) switch(event->scroll.direction) { case GDK_SCROLL_UP: + case GDK_SCROLL_RIGHT: get_scrollx_adjustment()->set_value(scroll_point[0]+(mouse_pos[0]-scroll_point[0])*(1.25-(1+drift))); get_scrolly_adjustment()->set_value(scroll_point[1]-(mouse_pos[1]+scroll_point[1])*(1.25-(1+drift))); zoom_in(); break; case GDK_SCROLL_DOWN: + case GDK_SCROLL_LEFT: get_scrollx_adjustment()->set_value(scroll_point[0]+(mouse_pos[0]-scroll_point[0])*(1/1.25-(1+drift))); get_scrolly_adjustment()->set_value(scroll_point[1]-(mouse_pos[1]+scroll_point[1])*(1/1.25-(1+drift))); zoom_out(); @@ -1719,6 +1735,12 @@ WorkArea::on_drawing_area_event(GdkEvent *event) case GDK_SCROLL_DOWN: get_scrollx_adjustment()->set_value(get_scrollx_adjustment()->get_value()+scroll_pixel*pw); break; + case GDK_SCROLL_LEFT: + get_scrolly_adjustment()->set_value(get_scrolly_adjustment()->get_value()+scroll_pixel*ph); + break; + case GDK_SCROLL_RIGHT: + get_scrolly_adjustment()->set_value(get_scrolly_adjustment()->get_value()-scroll_pixel*ph); + break; default: break; } @@ -1740,6 +1762,12 @@ WorkArea::on_drawing_area_event(GdkEvent *event) case GDK_SCROLL_DOWN: get_scrolly_adjustment()->set_value(get_scrolly_adjustment()->get_value()-scroll_pixel*ph); break; + case GDK_SCROLL_LEFT: + get_scrollx_adjustment()->set_value(get_scrollx_adjustment()->get_value()-scroll_pixel*pw); + break; + case GDK_SCROLL_RIGHT: + get_scrollx_adjustment()->set_value(get_scrollx_adjustment()->get_value()+scroll_pixel*pw); + break; default: break; } @@ -1753,7 +1781,7 @@ WorkArea::on_drawing_area_event(GdkEvent *event) } bool -WorkArea::on_hruler_event(GdkEvent *event) +WorkArea::on_hruler_event(GdkEvent */*event*/) { /* switch(event->type) @@ -1810,7 +1838,7 @@ WorkArea::on_hruler_event(GdkEvent *event) } bool -WorkArea::on_vruler_event(GdkEvent *event) +WorkArea::on_vruler_event(GdkEvent */*event*/) { /* switch(event->type) @@ -1904,7 +1932,7 @@ WorkArea::screen_to_comp_coords(synfig::Point pos)const } synfig::Point -WorkArea::comp_to_screen_coords(synfig::Point pos)const +WorkArea::comp_to_screen_coords(synfig::Point /*pos*/)const { synfig::warning("WorkArea::comp_to_screen_coords: Not yet implemented"); return synfig::Point(); @@ -2226,7 +2254,7 @@ studio::WorkArea::async_update_finished() if(!async_renderer) return; - // If we completed successfuly, then + // If we completed successfully, then // we aren't dirty anymore if(async_renderer->has_success()) { @@ -2338,7 +2366,7 @@ again: // it is being displayed correctly drawing_area->queue_draw(); - // If we completed successfuly, then + // If we completed successfully, then // we aren't dirty anymore if(ret) {