On Friday 13 June 2003 12:03 am, Levi Burton wrote:
> On Wednesday 11 June 2003 05:47 am, Levi Burton wrote:
> > Well.  I uh.  Well.  I sure feel stupid now.
>
> Attached is a patch which is probably a better solution.  It is a fairly
> large patch, so beware.

The last one had white space diffs in it.  Attached is one of cvs -uw.


-- 
Levi Burton
http://www.puresimplicity.net/~ldb/
Index: segmenttool.cpp
===================================================================
RCS file: /cvsroot/rosegarden/gui/segmenttool.cpp,v
retrieving revision 1.26
diff -u -w -r1.26 segmenttool.cpp
--- segmenttool.cpp	7 Jun 2003 22:48:53 -0000	1.26
+++ segmenttool.cpp	13 Jun 2003 05:09:04 -0000
@@ -135,7 +135,9 @@
         m_currentItem = item;
         if (!item->isSelected()) {
 
-            SegmentSelector* selector = dynamic_cast<SegmentSelector*>(getToolBox()->getTool("segmentselector"));
+            SegmentSelector* selector = 
+                dynamic_cast<SegmentSelector*>
+                (getToolBox()->getTool(SegmentSelector::ToolName));
             selector->clearSelected();
             selector->slotSelectSegmentItem(item);
             emit selectedSegments(selector->getSelectedSegments());
@@ -260,7 +262,7 @@
 	// that the segment was created by this tool rather than by
 	// e.g. a simple file load
 	SegmentSelector* selector = dynamic_cast<SegmentSelector*>
-	    (getToolBox()->getTool("segmentselector"));
+	    (getToolBox()->getTool(SegmentSelector::ToolName));
 	Rosegarden::Segment *segment = command->getSegment();
 	SegmentItem *item = m_canvas->addSegmentItem(segment);
 
@@ -382,6 +384,16 @@
     SegmentItem *item = m_canvas->findSegmentClickedOn(e->pos());
 
     if (item) {
+        SegmentSelection selection = m_canvas->getSelectedSegments();
+
+        // There has to be a better way.
+        for (SegmentSelection::iterator it = selection.begin();
+             it != selection.end(); it++) {
+            SegmentItem *si = m_canvas->getSegmentItem((*it));
+            m_selectedItems.push_back
+                (SegmentItemPair(QPoint(int(si->x()), int(si->y())), si));
+        }
+        
         m_currentItem = item;
 	m_currentItemStartX = item->x();
 	m_clickPoint = e->pos();
@@ -408,72 +420,134 @@
     }
 }
 
+
 void SegmentMover::handleMouseButtonRelease(QMouseEvent*)
 {
-    if (m_currentItem)
-    {
-        Rosegarden::Composition &comp = m_doc->getComposition();
-        Rosegarden::Track *track = comp.getTrackByPosition(
-                m_currentItem->getTrackPosition());
+
+    if ( m_currentItem->isSelected() ) {
+        SegmentItemList::iterator it;
+
+        SegmentReconfigureCommand::SegmentRecSet segmentRecSet;
+
+        bool haveChange = false;
 
         SegmentReconfigureCommand *command =
-	    new SegmentReconfigureCommand(i18n("Move Segment"));
+            new SegmentReconfigureCommand
+            (m_selectedItems.size() == 1 ? i18n("Move Segment") :
+             i18n("Move Segments"));
 
-        command->addSegment(m_currentItem->getSegment(),
-                            m_currentItem->getStartTime(),
-                            m_currentItem->getEndTime(),
-                            track->getId());
+        for (it = m_selectedItems.begin(); it != m_selectedItems.end(); it++) {
+            SegmentReconfigureCommand::SegmentRec segmentRec;
+            SegmentItem *item = it->second;
+            
+            Rosegarden::Composition &comp = m_doc->getComposition();
+            Rosegarden::Track *track = 
+                comp.getTrackByPosition(item->getTrackPosition());
+            
+            Rosegarden::TrackId trackId = track->getId();
+            
+            if (item->getStartTime() != item->getSegment()->getStartTime() ||
+                item->getEndTime()   != item->getSegment()->getEndMarkerTime() ||
+                trackId              != item->getSegment()->getTrack()) {
+                
+                segmentRec.segment = item->getSegment();
+                segmentRec.startTime = item->getStartTime();
+                segmentRec.endTime  = item->getEndTime();
+                segmentRec.track    = item->getTrackPosition();
+                segmentRecSet.push_back(segmentRec);
+                item->showRepeatRect(true);
+                
+                haveChange = true;
+            }
+        }
+        
+        if (haveChange) {
+            command->addSegments(segmentRecSet);
         addCommandToHistory(command);
-        m_currentItem->showRepeatRect(true);
+        }
 
         m_foreGuide->hide();
         m_topGuide->hide();
-    }
-
     m_currentItem = 0;
+        m_selectedItems.clear();
+        m_canvas->canvas()->update();
+    }
 }
 
 int SegmentMover::handleMouseMove(QMouseEvent *e)
 {
-    if (m_currentItem) {
-
 	m_canvas->setSnapGrain(true);
 
-	int newX = e->x() - m_clickPoint.x() + int(m_currentItemStartX);
-        //if (newX < 0) newX = 0;
-        int newY = e->y();
-        if (newY < 0) newY = 0;
+    if (m_currentItem->isSelected()) {
+        int guideX = 0;
+        int guideY = 0;
 
-	timeT newStartTime = m_canvas->grid().snapX(newX);
-	m_currentItem->setEndTime(m_currentItem->getEndTime() + newStartTime -
-				  m_currentItem->getStartTime());
-	m_currentItem->setStartTime(newStartTime);
+        for (SegmentItemList::iterator it = m_selectedItems.begin();
+             it != m_selectedItems.end(); it++)
+            {
+                int x = e->pos().x() - m_clickPoint.x(),
+                    y = e->pos().y() - m_clickPoint.y();
 
-	TrackId track = m_canvas->grid().getYBin(newY);
+                const int inertiaDistance = m_canvas->grid().getYSnap() / 3;
+                if (!m_passedInertiaEdge &&
+                    (x < inertiaDistance && x > -inertiaDistance) &&
+                    (y < inertiaDistance && y > -inertiaDistance)) {
+                    return false;
+                } else {
+                    m_passedInertiaEdge = true;
+                }
 
-        int nbTracks = m_doc->getComposition().getNbTracks();
 
-        if (track >= ((unsigned int)nbTracks)) {
-            // Make sure the item isn't dragged to below the last track
-            track = nbTracks - 1;
-        }
+                timeT newStartTime = m_canvas->grid().snapX(it->first.x() + x);
+                it->second->setEndTime(it->second->getEndTime() + newStartTime -
+                                       it->second->getStartTime());
+                it->second->setStartTime(newStartTime);
+                
+                TrackId track;
+                int newY=it->first.y() + y;
+                // Make sure we don't set a non-existing track
+                if (newY < 0) { newY = 0; }
+                track = m_canvas->grid().getYBin(newY);
 
-        // Don't use proper TrackPosition yet - just visual position
-        // until the release.
+                // Make sure we don't set a non-existing track (c'td)
+                // TODO: make this suck less. Either the tool should
+                // not allow it in the first place, or we automatically
+                // create new tracks - might make undo very tricky though
         //
-        m_currentItem->setTrackPosition(track);
+                if (track >= TrackId(m_doc->getComposition().getNbTracks()))
+                    track  = TrackId(m_doc->getComposition().getNbTracks() - 1);
 
-        m_foreGuide->setX(int(m_canvas->grid().getRulerScale()->
-                            getXForTime(newStartTime)) - 2);
+                if (it == m_selectedItems.begin()) {
+                    guideX = int(m_canvas->grid().getRulerScale()->
+                                 getXForTime(newStartTime));
 
-        m_topGuide->setY(m_canvas->grid().getYBinCoordinate(track));
+                    guideY = m_canvas->grid().getYBinCoordinate(track);
+                }
+                else
+                    {
+                        if (x < guideX)
+                            guideX = int(m_canvas->grid().getRulerScale()->
+                                         getXForTime(newStartTime));
 
-        m_canvas->canvas()->update();
+                        if (y < guideY)
+                            guideY = m_canvas->grid().getYBinCoordinate(track);
+                    }
 
-	return FollowHorizontal | FollowVertical;
+                // This is during a "mover" so don't use the normalised (i.e.
+                // proper) TrackPosition value yet.
+                //
+                it->second->setTrackPosition(track);
     }
 
-    return NoFollow;
+        m_foreGuide->setX(guideX - 2);
+        m_topGuide->setY(guideY - 2);
+        
+        m_canvas->canvas()->update();
+    }
+    
+    m_passedInertiaEdge = false;
+    
+    return FollowHorizontal | FollowVertical;
 }
 
 //////////////////////////////
@@ -694,45 +768,30 @@
 
 	if (!m_segmentAddMode &&
 	    SegmentResizer::cursorIsCloseEnoughToEdge(item, e, threshold)) {
-            SegmentResizer* resizer = dynamic_cast<SegmentResizer*>(getToolBox()->getTool(SegmentResizer::ToolName));
+            SegmentResizer* resizer = 
+                dynamic_cast<SegmentResizer*>(getToolBox()->getTool(SegmentResizer::ToolName));
+            if (resizer) {
             resizer->setEdgeThreshold(threshold);
-
+                resizer->handleMouseButtonPress(e);
 	    m_dispatchTool = resizer;
-            
-	    m_dispatchTool->handleMouseButtonPress(e);
 	    return;
 	}
-
+        }
 
         // Moving
-        //
+        // dispatch to SegmentMover
+        m_dispatchTool = getToolBox()->getTool(SegmentMover::ToolName);
+
+        if (m_dispatchTool) {
         m_currentItem = item;
         m_clickPoint = e->pos();
         slotSelectSegmentItem(m_currentItem);
-
-        m_foreGuide->setX(int(m_canvas->grid().getRulerScale()->
-                           getXForTime(item->getSegment()->getStartTime())) -2);
-        m_foreGuide->setY(0);
-        m_foreGuide->setZ(10);
-        m_foreGuide->setSize(2, m_canvas->canvas()->height());
-
-        m_topGuide->setX(0);
-        m_topGuide->setY(int(m_canvas->grid().getYBinCoordinate(
-                              item->getSegment()->getTrack())));
-        m_topGuide->setZ(10);
-        m_topGuide->setSize(m_canvas->canvas()->width(), 2);
-
-        m_foreGuide->show();
-        m_topGuide->show();
-
-        // Don't update until the move - lazy way of making sure the
-        // guides don't flash on while we're double clicking
-        //
-        //m_canvas->canvas()->update();
+            m_dispatchTool->handleMouseButtonPress(e);
+            return;
+        }
 
     } else {
 
-
         // Add on middle button - bounding box on rest
         //
 	if (e->button() == MidButton) {
@@ -760,8 +819,6 @@
     // when the list is empty we're just unselecting.
     //
     emit selectedSegments(getSelectedSegments());
-
-    m_passedInertiaEdge = false;
 }
 
 SegmentSelection
@@ -826,7 +883,7 @@
 
     if (m_dispatchTool) {
 	m_dispatchTool->handleMouseButtonRelease(e);
-	delete m_dispatchTool;
+        //        delete m_dispatchTool;
 	m_dispatchTool = 0;
 	m_canvas->setCursor(Qt::arrowCursor);
 	return;
@@ -844,47 +901,6 @@
 
     m_canvas->setCursor(Qt::arrowCursor);
 
-    if (m_currentItem->isSelected())
-    {
-	SegmentItemList::iterator it;
-
-	bool haveChange = false;
-
-	SegmentReconfigureCommand *command =
-	    new SegmentReconfigureCommand
-	    (m_selectedItems.size() == 1 ? i18n("Move Segment") :
-	                                   i18n("Move Segments"));
-
-	for (it = m_selectedItems.begin();
-	     it != m_selectedItems.end();
-	     it++)
-	{
-
-	    SegmentItem *item = it->second;
-
-            Rosegarden::Composition &comp = m_doc->getComposition();
-            Rosegarden::Track *track = 
-                comp.getTrackByPosition(item->getTrackPosition());
-
-            Rosegarden::TrackId trackId = track->getId();
-
-	    if (item->getStartTime() != item->getSegment()->getStartTime() ||
-		item->getEndTime()   != item->getSegment()->getEndMarkerTime() ||
-		trackId              != item->getSegment()->getTrack()) {
-
-		command->addSegment(item->getSegment(),
-				    item->getStartTime(),
-				    item->getEndTime(),
-				    trackId);
-
-		haveChange = true;
-	    }
-	}
-
-	if (haveChange) addCommandToHistory(command);
-
-	m_canvas->canvas()->update();
-    }
     
     // if we've just finished a quick copy then drop the Z level back
     if (m_segmentQuickCopyDone)
@@ -1015,79 +1031,6 @@
         //m_currentItem->setZ(3); // bring it to the top
         //slotSelectSegmentItem(newItem);
     }
-
-    m_canvas->setSnapGrain(true);
-
-    if (m_currentItem->isSelected())
-    {
-	SegmentItemList::iterator it;
-        int guideX = 0;
-        int guideY = 0;
-	
-	for (it = m_selectedItems.begin();
-	     it != m_selectedItems.end();
-	     it++)
-	{
-	    int x = e->pos().x() - m_clickPoint.x(),
-		y = e->pos().y() - m_clickPoint.y();
-
-	    const int inertiaDistance = m_canvas->grid().getYSnap() / 3;
-	    if (!m_passedInertiaEdge &&
-		(x < inertiaDistance && x > -inertiaDistance) &&
-		(y < inertiaDistance && y > -inertiaDistance)) {
-		return false;
-	    } else {
-		m_passedInertiaEdge = true;
-	    }
-
-
-	    timeT newStartTime = m_canvas->grid().snapX(it->first.x() + x);
-	    it->second->setEndTime(it->second->getEndTime() + newStartTime -
-				   it->second->getStartTime());
-	    it->second->setStartTime(newStartTime);
-
-	    TrackId track;
-            int newY=it->first.y() + y;
-            // Make sure we don't set a non-existing track
-            if (newY < 0) { newY = 0; }
-            track = m_canvas->grid().getYBin(newY);
-
-            // Make sure we don't set a non-existing track (c'td)
-            // TODO: make this suck less. Either the tool should
-            // not allow it in the first place, or we automatically
-            // create new tracks - might make undo very tricky though
-            //
-            if (track >= TrackId(m_doc->getComposition().getNbTracks()))
-                track  = TrackId(m_doc->getComposition().getNbTracks() - 1);
-
-            if (it == m_selectedItems.begin())
-            {
-                guideX = int(m_canvas->grid().getRulerScale()->
-                    getXForTime(newStartTime));
-
-                guideY = m_canvas->grid().getYBinCoordinate(track);
-            }
-            else
-            {
-                if (x < guideX)
-                    guideX = int(m_canvas->grid().getRulerScale()->
-                        getXForTime(newStartTime));
-
-                if (y < guideY)
-                    guideY = m_canvas->grid().getYBinCoordinate(track);
-            }
-
-            // This is during a "mover" so don't use the normalised (i.e.
-            // proper) TrackPosition value yet.
-            //
-	    it->second->setTrackPosition(track);
-	}
-
-        m_foreGuide->setX(guideX - 2);
-        m_topGuide->setY(guideY - 2);
-
-	m_canvas->canvas()->update();
-    }
 
     return FollowHorizontal | FollowVertical;
 }
Index: segmenttool.h
===================================================================
RCS file: /cvsroot/rosegarden/gui/segmenttool.h,v
retrieving revision 1.9
diff -u -w -r1.9 segmenttool.h
--- segmenttool.h	27 Apr 2003 15:47:45 -0000	1.9
+++ segmenttool.h	13 Jun 2003 05:09:05 -0000
@@ -170,11 +170,15 @@
 protected:
     SegmentMover(SegmentCanvas*, RosegardenGUIDoc*);
 
+    typedef std::pair<QPoint, SegmentItem *> SegmentItemPair;
+    typedef std::vector<SegmentItemPair> SegmentItemList;
+
     //--------------- Data members ---------------------------------
 
     QPoint            m_clickPoint;
     double            m_currentItemStartX;
-
+    SegmentItemList   m_selectedItems;
+    bool              m_passedInertiaEdge;
     QCanvasRectangle *m_foreGuide;
     QCanvasRectangle *m_topGuide;
 
@@ -285,7 +289,7 @@
     bool m_segmentCopyMode;
     QPoint m_clickPoint;
     bool m_segmentQuickCopyDone;
-    bool m_passedInertiaEdge;
+
 
     SegmentTool *m_dispatchTool;
 

Reply via email to