- Timestamp:
- 03/17/20 10:43:15 (4 years ago)
- Location:
- trunk/src/org
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/org/apollo/ApolloGestureActions.java
r1517 r1523 16 16 import org.expeditee.core.Dimension; 17 17 import org.expeditee.core.Point; 18 import org.expeditee.core.bounds.AxisAlignedBoxBounds; 18 19 import org.expeditee.gio.EcosystemManager; 19 20 import org.expeditee.gio.gesture.Gesture; … … 203 204 @Override 204 205 public void exec(Gesture gesture) { 205 mouseMoved(gesture.getData().getPosition()); 206 //mouseMoved(gesture.getData().getPosition()); 207 if (isSnapOn()) { 208 snapFreeTracks(gesture.getData().getPosition()); 209 } 206 210 } 207 211 }); … … 481 485 private static final int COARSE_Y_PLACEMENT_TOLERANCE = 20; 482 486 483 public void mouseMoved(Point to) { 484 boolean forwareToExpeditee = true; 485 486 if (isYAxisRestictionOn() && !FreeItems.getInstance().isEmpty()) { 487 488 // Restrict movement of free items to Y-Axis only 489 forwareToExpeditee = false; 490 491 int smallestY = FreeItems.getInstance().get(0).getY(); 492 493 for (Item i : FreeItems.getInstance()) { 494 if (i.getY() < smallestY) { 495 smallestY = i.getY(); 496 } 497 } 498 499 for (Item i : FreeItems.getInstance()) { 500 i.setY(to.getY() + (i.getY() - smallestY)); 501 } 502 503 } else if (isSnapOn() && !FreeItems.getInstance().isEmpty()) { 504 505 // Couse movement of free items: Restraining left-most pixel in items 506 // to the closest anchored track widgets x position. 507 508 Frame currentFrame = DisplayController.getCurrentFrame(); 509 if (currentFrame != null) { 510 511 // Search all anchored track x positions for the current frame 512 List<Widget> widgets = currentFrame.getInteractiveWidgets(); 513 514 int closestXPosition = -1; 515 int closestYPosition = -1; 516 int closestXDistance = -1; 517 int closestYDistance = -1; 518 519 for (Widget iw : widgets) { 520 521 if (iw instanceof SampledTrack || iw instanceof LinkedTrack) { 522 523 // Determine TOP-LEFT Snapping 524 int xDistance = Math.abs(to.getX() - iw.getX()); 525 if (closestXDistance < 0 || xDistance < closestXDistance) { 526 closestXDistance = xDistance; 527 closestXPosition = iw.getX(); 528 } 529 530 int yDistance = Math.abs(to.getY() - iw.getY()); 531 if (closestYDistance < 0 || yDistance < closestYDistance) { 532 closestYDistance = yDistance; 533 closestYPosition = iw.getY(); 534 } 535 536 // Determine BOTTOM-RIGHT Snapping 537 xDistance = Math.abs(to.getX() - (iw.getX() + iw.getWidth())); 538 if (closestXDistance < 0 || xDistance < closestXDistance) { 539 closestXDistance = xDistance; 540 closestXPosition = iw.getX() + iw.getWidth(); 541 } 542 543 yDistance = Math.abs(to.getY() - (iw.getY() + iw.getHeight())); 544 if (closestYDistance < 0 || yDistance < closestYDistance) { 545 closestYDistance = yDistance; 546 closestYPosition = iw.getY() + iw.getHeight(); 547 } 548 } 549 550 } 551 552 // Determine top-left position of free items 553 int smallestX = FreeItems.getInstance().get(0).getX(); 554 int smallestY = FreeItems.getInstance().get(0).getY(); 555 for (Item i : FreeItems.getInstance()) { 556 if (i.getX() < smallestX) { 557 smallestX = i.getX(); 558 } 559 if (i.getY() < smallestY) { 560 smallestY = i.getY(); 561 } 562 } 563 564 for (Item i : FreeItems.getInstance()) { 565 566 int x; 567 int y; 568 569 if (closestXDistance > 0 && closestXDistance < COARSE_X_PLACEMENT_TOLERANCE) { 570 x = closestXPosition + (i.getX() - smallestX); 571 } else { 572 x = to.getX() + (i.getX() - smallestX); 573 } 574 575 if (closestYDistance > 0 && closestYDistance < COARSE_Y_PLACEMENT_TOLERANCE) { 576 y = closestYPosition + (i.getY() - smallestY); 577 } else { 578 y = to.getY() + (i.getY() - smallestY); 579 } 580 581 i.setPosition(x, y); 582 583 } 584 585 forwareToExpeditee = false; 586 587 } 588 487 private void snapFreeTracks(Point position) { 488 // Get Apollo widgets that are attached to cursor 489 FreeItems freeItems = FreeItems.getInstance(); 490 List<Widget> freeWidgets = ItemUtils.extractWidgets(freeItems); 491 List<Widget> freeApolloWidgets = new ArrayList<Widget>(); 492 for (Widget w: freeWidgets) { 493 if (w instanceof SampledTrack || w instanceof LinkedTrack) { freeApolloWidgets.add(w); } 494 } 495 if (freeApolloWidgets.isEmpty()) { return; } 496 497 // Get Apollo widgets that are on frame 498 Frame currentFrame = DisplayController.getCurrentFrame(); 499 List<Widget> interactiveWidgets = currentFrame.getInteractiveWidgets(); 500 List<Widget> anchoredApolloWidgets = new ArrayList<Widget>(); 501 for (Widget w: interactiveWidgets) { 502 if (w instanceof SampledTrack || w instanceof LinkedTrack) { anchoredApolloWidgets.add(w); } 589 503 } 590 591 // Expeditees frame mouse actions uses an offset and fights over free-item 592 // movement if it listens to the mouse event router... therefore add an extra 593 // layer to avoid this... otherwise auto-aligned items jitter like crazy while 594 // moving the cursus 595 // if (forwareToExpeditee) { 596 // FrameMouseActions.getInstance().mouseMoved(e); 597 // } else { 598 // FrameGraphics.refresh(true); 599 // } 600 } 601 504 if (anchoredApolloWidgets.isEmpty()) { return; } 505 506 // Snap the first freeApolloWidget. 507 // Snap the freeApolloWidgets, using the first as a guidepost. 508 Widget toSnap = freeApolloWidgets.remove(0); 509 Point origin = new Point(0,0); 510 Point canditateDistance = new Point(Integer.MAX_VALUE, Integer.MAX_VALUE); 511 Widget anchoredWidgetToSnapTo = null; 512 AxisAlignedBoxBounds freeWidgetBounds = toSnap.getBounds(); 513 for (Widget anchoredWidget: anchoredApolloWidgets) { 514 AxisAlignedBoxBounds anchoredWidgetBounds = anchoredWidget.getBounds(); 515 Point distance = freeWidgetBounds.distanceFrom(anchoredWidgetBounds); 516 if (distance.getDistanceTo(origin) < canditateDistance.getDistanceTo(origin)) { 517 canditateDistance = distance; 518 anchoredWidgetToSnapTo = anchoredWidget; 519 } 520 } 521 AxisAlignedBoxBounds anchoredWidgetToSnapToBounds = anchoredWidgetToSnapTo.getBounds(); 522 523 int xDist = anchoredWidgetToSnapToBounds.getCentreX() < freeWidgetBounds.getCentreX() ? canditateDistance.getX() : -canditateDistance.getX(); 524 int yDist = anchoredWidgetToSnapToBounds.getCentreY() < freeWidgetBounds.getCentreY() ? canditateDistance.getY() : -canditateDistance.getY(); 525 526 int direction = -1; 527 int tlX = toSnap.getX(); 528 int tlY = toSnap.getY(); 529 if ((xDist > 0 && yDist == 0) || (xDist == 0 && yDist == 0)) { 530 tlX = anchoredWidgetToSnapTo.getBounds().getMaxX(); 531 tlY = anchoredWidgetToSnapTo.getBounds().getMinY(); 532 direction = 0; 533 } else if (xDist < 0 && yDist == 0) { 534 tlX = anchoredWidgetToSnapTo.getBounds().getMinX() - toSnap.getWidth(); 535 tlY = anchoredWidgetToSnapTo.getBounds().getMinY(); 536 direction = 1; 537 } else if (yDist > 0 && xDist == 0) { 538 tlX = anchoredWidgetToSnapTo.getBounds().getMinX(); 539 tlY = anchoredWidgetToSnapTo.getBounds().getMaxY(); 540 direction = 2; 541 } else if (yDist < 0 && xDist == 0) { 542 tlX = anchoredWidgetToSnapTo.getBounds().getMinX(); 543 tlY = anchoredWidgetToSnapTo.getBounds().getMinY() - toSnap.getHeight(); 544 direction = 3; 545 } 546 toSnap.setPosition(tlX, tlY); 547 548 for (Widget toSnapNext: freeApolloWidgets) { 549 switch (direction) { 550 case 0: 551 tlX = toSnap.getBounds().getMaxX(); 552 tlY = toSnap.getBounds().getMinY(); 553 toSnapNext.setPosition(tlX, tlY); 554 break; 555 case 1: 556 tlX = toSnap.getBounds().getMinX() - toSnapNext.getWidth(); 557 tlY = toSnap.getBounds().getMinY(); 558 toSnapNext.setPosition(tlX, tlY); 559 break; 560 case 2: 561 tlX = toSnap.getBounds().getMinX(); 562 tlY = toSnap.getBounds().getMaxX(); 563 toSnapNext.setPosition(tlX, tlY); 564 break; 565 case 3: 566 tlX = toSnap.getBounds().getMinX(); 567 tlY = toSnap.getBounds().getMinY() - toSnapNext.getHeight(); 568 toSnapNext.setPosition(tlX, tlY); 569 break; 570 default: 571 break; 572 } 573 toSnap = toSnapNext; 574 } 575 } 576 602 577 /** 603 578 * @return True if the user is restricting movement on the y-axis only -
trunk/src/org/expeditee/core/bounds/AxisAlignedBoxBounds.java
r1258 r1523 5 5 import org.expeditee.core.Line; 6 6 import org.expeditee.core.Point; 7 import org.expeditee.gui.DisplayController;8 7 9 8 /** … … 347 346 } 348 347 } 349 348 349 public Point distanceFrom(AxisAlignedBoxBounds other) { 350 boolean left = other.getMaxX() < this.getMinX(); 351 boolean right = this.getMaxX() < other.getMinX(); 352 boolean top = this.getMaxY() < other.getMinY(); 353 boolean bottom = other.getMaxY() < this.getMinY(); 354 355 if (top && left) { 356 Point thisP = new Point(this.getMinX(), this.getMaxY()); 357 Point otherP = new Point(other.getMaxX(), other.getMinY()); 358 return Point.difference(thisP, otherP); 359 } else if (left && bottom) { 360 Point thisP = new Point(this.getMinX(), this.getMinY()); 361 Point otherP = new Point(other.getMaxX(), other.getMaxY()); 362 return Point.difference(thisP, otherP); 363 } else if (bottom && right) { 364 Point thisP = new Point(this.getMaxX(), this.getMinY()); 365 Point otherP = new Point(other.getMinX(), other.getMaxY()); 366 return Point.difference(thisP, otherP); 367 } else if (right && top) { 368 Point thisP = new Point(this.getMaxX(), this.getMaxY()); 369 Point otherP = new Point(other.getMinX(), other.getMinY()); 370 return Point.difference(thisP, otherP); 371 } else if (left) { 372 return new Point(this.getMinX() - other.getMaxX(), 0); 373 } else if (right) { 374 return new Point(other.getMinX() - this.getMaxX(), 0); 375 } else if (top) { 376 return new Point(0, other.getMinY() - this.getMaxY()); 377 } else if (bottom) { 378 return new Point(0, this.getMinY() - other.getMaxY()); 379 } else { 380 return new Point(0, 0); 381 } 382 } 383 350 384 /** Gets the bounds that is linearly-interpolated between the two given bounds. */ 351 385 public static AxisAlignedBoxBounds lerp(AxisAlignedBoxBounds a, AxisAlignedBoxBounds b, float t)
Note:
See TracChangeset
for help on using the changeset viewer.