AnalogTapeModel

Physical modelling signal processing for analog tape recording
Log | Files | Refs | Submodules | README | LICENSE

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 }