X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;ds=sidebyside;f=synfig-studio%2Ftrunk%2Fsrc%2Fgtkmm%2Fworkarea.cpp;h=a6ca612562e375f1d5352e82381071907404f67d;hb=65fb935293f8601f3042482dddc35a21eaa46d87;hp=a1bd112814bee04a0f2404690fe3aa25dc797a26;hpb=c34eaa5441242b3e9a7b7645e9ee4983d14eae85;p=synfig.git diff --git a/synfig-studio/trunk/src/gtkmm/workarea.cpp b/synfig-studio/trunk/src/gtkmm/workarea.cpp index a1bd112..a6ca612 100644 --- a/synfig-studio/trunk/src/gtkmm/workarea.cpp +++ b/synfig-studio/trunk/src/gtkmm/workarea.cpp @@ -2,7 +2,7 @@ /*! \file workarea.cpp ** \brief Template Header ** -** $Id: workarea.cpp,v 1.3 2005/01/16 19:55:57 darco Exp $ +** $Id$ ** ** \legal ** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley @@ -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; } @@ -786,7 +787,7 @@ WorkArea::WorkArea(etl::loose_handle canvas_interfac if(!data.empty()) { if(!load_sketch(data)) - load_sketch(dirname(canvas->get_file_name())+ETL_DIRECTORY_SEPERATOR+basename(data)); + load_sketch(dirname(canvas->get_file_name())+ETL_DIRECTORY_SEPARATOR+basename(data)); } } @@ -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) - { - //synfig::info("DUCK_DRAG_RELEASE: SHIFT-MASK ON!"); - if(clicked_duck) - { - //synfig::info("DUCK_DRAG_RELEASE: CLICKED DUCK!"); - unselect_duck(clicked_duck); - } - } - else if(modifier&GDK_CONTROL_MASK) + // if we originally clicked on a selected duck ... + if(clicked_duck) { - //synfig::info("DUCK_DRAG_RELEASE: CONTROL-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 - { - //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(); @@ -2039,17 +2067,22 @@ WorkArea::refresh(GdkEventExpose*event) // If we are in animate mode, draw a red border around the screen if(canvas_interface->get_mode()&synfigapp::MODE_ANIMATE) { - /*gc->set_rgb_fg_color(Gdk::Color("#FF0000")); +#ifdef USE_FRAME_BACKGROUND_TO_SHOW_EDIT_MODE + // This method of drawing the red border doesn't work on any + // Gtk theme which uses the crux-engine, hcengine, industrial, + // mist, or ubuntulooks engine, such as the default ubuntu + // 'Human' theme. + drawing_frame->modify_bg(Gtk::STATE_NORMAL,Gdk::Color("#FF0000")); +#else + // So let's do it in a more primitive fashion. + gc->set_rgb_fg_color(Gdk::Color("#FF0000")); gc->set_line_attributes(1,Gdk::LINE_SOLID,Gdk::CAP_BUTT,Gdk::JOIN_MITER); drawing_area->get_window()->draw_rectangle( gc, false, // Fill? 0,0, // x,y - drawing_area->get_width()-1,drawing_area->get_height()-1 //w,h - ); - */ - drawing_frame->modify_bg(Gtk::STATE_NORMAL,Gdk::Color("#FF0000")); - //get_window()->set_background(Gdk::Color("#FF0000")); + drawing_area->get_width()-1,drawing_area->get_height()-1); // w,h +#endif } else drawing_frame->unset_bg(Gtk::STATE_NORMAL); @@ -2091,6 +2124,8 @@ WorkArea::set_quality(int x) } +namespace studio +{ class WorkAreaProgress : public synfig::ProgressCallback { WorkArea *work_area; @@ -2128,6 +2163,7 @@ public: return cb->amount_complete(current,total); } }; +} bool studio::WorkArea::async_update_preview() @@ -2226,7 +2262,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()) { @@ -2287,7 +2323,6 @@ again: dirty=false; get_canvas_view()->reset_cancel_status(); - bool ret=false; RendDesc desc=get_canvas()->rend_desc(); //newdesc->set_flags(RendDesc::PX_ASPECT|RendDesc::IM_SPAN); @@ -2314,7 +2349,7 @@ again: if(cb) cb->task(strprintf("Rendering canvas %s...",get_canvas()->get_name().c_str())); - target->render(cb); + bool ret = target->render(cb); if(!ret && !get_canvas_view()->get_cancel_status() && dirty) { @@ -2338,7 +2373,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) { @@ -2506,7 +2541,12 @@ 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,queue_time,__render_preview,this,NULL); + render_idle_func_id=g_timeout_add_full( + 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 + NULL); // notify - function to call when the idle is removed, or NULL queued=true; } /* else if(rendering)