DragToScrollListener.cpp (2828B)
1 #include "DragToScrollListener.h" 2 3 DragToScrollListener::DragToScrollListener (Viewport& v) : viewport (v) 4 { 5 viewport.getViewedComponent()->addMouseListener (this, true); 6 offsetX.addListener (this); 7 offsetY.addListener (this); 8 offsetX.behaviour.setMinimumVelocity (100); 9 offsetY.behaviour.setMinimumVelocity (100); 10 } 11 12 DragToScrollListener::~DragToScrollListener() 13 { 14 viewport.getViewedComponent()->removeMouseListener (this); 15 Desktop::getInstance().removeGlobalMouseListener (this); 16 } 17 18 void DragToScrollListener::positionChanged (ViewportDragPosition&, double) 19 { 20 if (! isDragging) 21 return; 22 23 viewport.setViewPosition (originalViewPos - juce::Point<int> ((int) offsetX.getPosition(), (int) offsetY.getPosition())); 24 } 25 26 static int getNumSources() 27 { 28 return Desktop::getInstance().getNumDraggingMouseSources(); 29 } 30 31 void DragToScrollListener::mouseDown (const MouseEvent&) 32 { 33 if (! isGlobalMouseListener && getNumSources() >= 2) 34 { 35 offsetX.setPosition (offsetX.getPosition()); 36 offsetY.setPosition (offsetY.getPosition()); 37 38 // switch to a global mouse listener so we still receive mouseUp events 39 // if the original event component is deleted 40 viewport.getViewedComponent()->removeMouseListener (this); 41 Desktop::getInstance().addGlobalMouseListener (this); 42 43 isGlobalMouseListener = true; 44 } 45 } 46 47 void DragToScrollListener::mouseDrag (const MouseEvent& e) 48 { 49 if (getNumSources() >= 2 && ! doesMouseEventComponentBlockViewportDrag (e.eventComponent)) 50 { 51 auto totalOffset = e.getOffsetFromDragStart().toFloat(); 52 53 if (! isDragging && totalOffset.getDistanceFromOrigin() > 8.0f) 54 { 55 isDragging = true; 56 57 originalViewPos = viewport.getViewPosition(); 58 offsetX.setPosition (0.0); 59 offsetX.beginDrag(); 60 offsetY.setPosition (0.0); 61 offsetY.beginDrag(); 62 } 63 64 if (isDragging) 65 { 66 offsetX.drag (totalOffset.x); 67 offsetY.drag (totalOffset.y); 68 } 69 } 70 } 71 72 void DragToScrollListener::mouseUp (const MouseEvent&) 73 { 74 if (isGlobalMouseListener && getNumSources() < 2) 75 endDragAndClearGlobalMouseListener(); 76 } 77 78 void DragToScrollListener::endDragAndClearGlobalMouseListener() 79 { 80 offsetX.endDrag(); 81 offsetY.endDrag(); 82 isDragging = false; 83 84 viewport.getViewedComponent()->addMouseListener (this, true); 85 Desktop::getInstance().removeGlobalMouseListener (this); 86 87 isGlobalMouseListener = false; 88 } 89 90 bool DragToScrollListener::doesMouseEventComponentBlockViewportDrag (const Component* eventComp) 91 { 92 for (auto c = eventComp; c != nullptr && c != &viewport; c = c->getParentComponent()) 93 if (c->getViewportIgnoreDragFlag()) 94 return true; 95 96 return false; 97 }