예제 #1
0
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;
   }
}
예제 #2
0
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;
   }
}