void AnnotationInterface::DynamicMouseMove( View& v, const DPoint& p, unsigned buttons, unsigned modifiers ) { // mouse move is processed only on active view if (view == 0 || v != *view) return; // get view image window ImageWindow w = view->Window(); // and image coordinates of the mouse position int imageX = RoundI(p.x); int imageY = RoundI(p.y); // set cursor to dragging cursor if mouse is inside one of the grip rectangles if (annotationPlaced && textRect.Includes(imageX, imageY)) w.SetDynamicCursor(move_all_XPM, 10, 10); else if (leaderPlaced && instance.annotationShowLeader && leaderRect.Includes(imageX, imageY)) w.SetDynamicCursor(move_all_XPM, 10, 10); else // otherwise, reset cursor w.ResetDynamicCursor(); // if we are currently dragging something if ( dragging != DraggingType::None ) { // compute delta int deltaX = imageX-lastX; int deltaY = imageY-lastY; // update text position if needed if (dragging == DraggingType::Text || dragging == DraggingType::Both) { instance.annotationPositionX += deltaX; instance.annotationPositionY += deltaY; } // update leader endpoint position if needed if (dragging == DraggingType::Leader || dragging == DraggingType::Both) { instance.annotationLeaderPositionX += deltaX; instance.annotationLeaderPositionY += deltaY; } // update annotation rectangle UpdateAnnotationRect(); // redraw dynamic view UpdateView(); // remember current point lastX = imageX; lastY = imageY; } }
void AnnotationInterface::DynamicMousePress( View& v, const DPoint& p, int button, unsigned buttons, unsigned modifiers ) { // we only use left mouse button if ( button != MouseButton::Left ) return; if (view == 0) { // can not run on previews if ( !v.IsMainView() ) throw Error( "Annotation cannot run on previews. Please select a main view." ); view = new View( v ); } // only handle events in our active view if (v != *view) return; // get view image window ImageWindow w = view->Window(); // and image coordinates of the click point int imageX = RoundI(p.x); int imageY = RoundI(p.y); // if annotation is not yet placed, place it now if (!annotationPlaced) { // set annotation position instance.annotationPositionX = imageX; instance.annotationPositionY = imageY; annotationPlaced = true; // place leader if needed if (instance.annotationShowLeader) { PlaceLeaderDefault(); } // update annotation rectangle UpdateAnnotationRect( true ); // redraw dynamic view UpdateView(); // start dragging mode until user release the mouse dragging = DraggingType::Text; w.SetDynamicCursor(move_all_XPM, 10, 10); } // if the annotation is already placed else { // if mouse is pressed on annotation text rectangle // let's start dragging if (textRect.Includes(imageX, imageY)) { // with Ctrl, both text and leader are dragged simulaneously if (modifiers & KeyModifier::Control) { dragging = DraggingType::Both; } // otherwise, just text is dragged else { dragging = DraggingType::Text; } } // if mouse is pressed on annotation leader rectangle and leader is visible // let's start dragging else if (instance.annotationShowLeader && leaderRect.Includes(imageX, imageY)) { // with Ctrl, both text and leader are dragged simulaneously if (modifiers & KeyModifier::Control) { dragging = DraggingType::Both; } // otherwise, just leader endpoint is dragged else { dragging = DraggingType::Leader; } } } // if any dragging is started, remember current point if (dragging != DraggingType::None) { lastX = imageX; lastY = imageY; } }