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;