From 8e9d902fa0541ba45b0860f98da52bde520bc19a Mon Sep 17 00:00:00 2001 From: Amadeus Folego Date: Mon, 26 Jan 2015 22:00:23 -0200 Subject: [PATCH 1/2] Refactor moving track views up and down --- include/TrackContainerView.h | 5 ++- src/gui/TrackContainerView.cpp | 67 ++++++++++++++++++---------------- 2 files changed, 38 insertions(+), 34 deletions(-) diff --git a/include/TrackContainerView.h b/include/TrackContainerView.h index 42e56128f..c6e555651 100644 --- a/include/TrackContainerView.h +++ b/include/TrackContainerView.h @@ -103,8 +103,9 @@ public: return m_tc; } - void moveTrackViewUp( TrackView * _tv ); - void moveTrackViewDown( TrackView * _tv ); + void moveTrackView( TrackView * trackView, int indexTo ); + void moveTrackViewUp( TrackView * trackView ); + void moveTrackViewDown( TrackView * trackView ); // -- for usage by trackView only --------------- TrackView * addTrackView( TrackView * _tv ); diff --git a/src/gui/TrackContainerView.cpp b/src/gui/TrackContainerView.cpp index 4513e9edf..5c908856d 100644 --- a/src/gui/TrackContainerView.cpp +++ b/src/gui/TrackContainerView.cpp @@ -156,45 +156,48 @@ void TrackContainerView::removeTrackView( TrackView * _tv ) -void TrackContainerView::moveTrackViewUp( TrackView * _tv ) +void TrackContainerView::moveTrackView( TrackView * trackView, int indexTo ) { - for( int i = 1; i < m_trackViews.size(); ++i ) - { - TrackView * t = m_trackViews[i]; - if( t == _tv ) - { - BBTrack::swapBBTracks( t->getTrack(), - m_trackViews[i - 1]->getTrack() ); - m_scrollLayout->removeWidget( t ); - m_scrollLayout->insertWidget( i - 1, t ); - qSwap( m_tc->m_tracks[i-1], m_tc->m_tracks[i] ); - m_trackViews.swap( i - 1, i ); - realignTracks(); - break; - } - } + // Can't move out of bounds + if ( indexTo >= m_trackViews.size() || indexTo < 0 ) { return; } + + // Does not need to move to itself + int indexFrom = m_trackViews.indexOf( trackView ); + if ( indexFrom == indexTo ) { return; } + + BBTrack::swapBBTracks( trackView->getTrack(), + m_trackViews[indexTo]->getTrack() ); + + m_scrollLayout->removeWidget( trackView ); + m_scrollLayout->insertWidget( indexTo, trackView ); + + Track * track = m_tc->m_tracks[indexFrom]; + + m_tc->m_tracks.remove( indexFrom ); + m_tc->m_tracks.insert( indexTo, track ); + m_trackViews.move( indexFrom, indexTo ); + + realignTracks(); } -void TrackContainerView::moveTrackViewDown( TrackView * _tv ) +void TrackContainerView::moveTrackViewUp( TrackView * trackView ) { - for( int i = 0; i < m_trackViews.size()-1; ++i ) - { - TrackView * t = m_trackViews[i]; - if( t == _tv ) - { - BBTrack::swapBBTracks( t->getTrack(), - m_trackViews[i + 1]->getTrack() ); - m_scrollLayout->removeWidget( t ); - m_scrollLayout->insertWidget( i + 1, t ); - qSwap( m_tc->m_tracks[i], m_tc->m_tracks[i+1] ); - m_trackViews.swap( i, i + 1 ); - realignTracks(); - break; - } - } + int index = m_trackViews.indexOf( trackView ); + + moveTrackView( trackView, index - 1 ); +} + + + + +void TrackContainerView::moveTrackViewDown( TrackView * trackView ) +{ + int index = m_trackViews.indexOf( trackView ); + + moveTrackView( trackView, index + 1 ); } From 33893e51c4f9e403057538687e7641a84073c17c Mon Sep 17 00:00:00 2001 From: Amadeus Folego Date: Tue, 27 Jan 2015 16:05:18 -0200 Subject: [PATCH 2/2] Move cloned tracks under the original --- include/Track.h | 2 +- include/TrackContainerView.h | 12 ++++++------ src/core/Track.cpp | 13 +++++++++---- src/gui/TrackContainerView.cpp | 11 +++++++++-- 4 files changed, 25 insertions(+), 13 deletions(-) diff --git a/include/Track.h b/include/Track.h index 1bebffbf1..73db6017a 100644 --- a/include/Track.h +++ b/include/Track.h @@ -441,7 +441,7 @@ public: static Track * create( TrackTypes tt, TrackContainer * tc ); static Track * create( const QDomElement & element, TrackContainer * tc ); - void clone(); + Track * clone(); // pure virtual functions diff --git a/include/TrackContainerView.h b/include/TrackContainerView.h index c6e555651..b340325bd 100644 --- a/include/TrackContainerView.h +++ b/include/TrackContainerView.h @@ -103,6 +103,11 @@ public: return m_tc; } + const QList & trackViews() const + { + return( m_trackViews ); + } + void moveTrackView( TrackView * trackView, int indexTo ); void moveTrackViewUp( TrackView * trackView ); void moveTrackViewDown( TrackView * trackView ); @@ -122,7 +127,7 @@ public: public slots: void realignTracks(); - void createTrackView( Track * _t ); + TrackView * createTrackView( Track * _t ); void deleteTrackView( TrackView * _tv ); virtual void dropEvent( QDropEvent * _de ); @@ -142,11 +147,6 @@ public slots: protected: static const int DEFAULT_PIXELS_PER_TACT = 16; - const QList & trackViews() const - { - return( m_trackViews ); - } - virtual void mousePressEvent( QMouseEvent * _me ); virtual void mouseMoveEvent( QMouseEvent * _me ); virtual void mouseReleaseEvent( QMouseEvent * _me ); diff --git a/src/core/Track.cpp b/src/core/Track.cpp index 4f5440af0..e80e5eb24 100644 --- a/src/core/Track.cpp +++ b/src/core/Track.cpp @@ -1688,13 +1688,18 @@ void TrackOperationsWidget::paintEvent( QPaintEvent * pe ) - /*! \brief Clone this track * */ void TrackOperationsWidget::cloneTrack() { - m_trackView->getTrack()->clone(); + TrackContainerView *tcView = m_trackView->trackContainerView(); + + Track *newTrack = m_trackView->getTrack()->clone(); + TrackView *newTrackView = tcView->createTrackView( newTrack ); + + int index = tcView->trackViews().indexOf( m_trackView ); + tcView->moveTrackView( newTrackView, index + 1 ); } @@ -1904,12 +1909,12 @@ Track * Track::create( const QDomElement & element, TrackContainer * tc ) /*! \brief Clone a track from this track * */ -void Track::clone() +Track * Track::clone() { QDomDocument doc; QDomElement parent = doc.createElement( "clone" ); saveState( doc, parent ); - create( parent.firstChild().toElement(), m_trackContainer ); + return create( parent.firstChild().toElement(), m_trackContainer ); } diff --git a/src/gui/TrackContainerView.cpp b/src/gui/TrackContainerView.cpp index 5c908856d..2c823c264 100644 --- a/src/gui/TrackContainerView.cpp +++ b/src/gui/TrackContainerView.cpp @@ -222,11 +222,18 @@ void TrackContainerView::realignTracks() -void TrackContainerView::createTrackView( Track * _t ) +TrackView * TrackContainerView::createTrackView( Track * _t ) { //m_tc->addJournalCheckPoint(); - _t->createView( this ); + // Avoid duplicating track views + for( trackViewList::iterator it = m_trackViews.begin(); + it != m_trackViews.end(); ++it ) + { + if ( ( *it )->getTrack() == _t ) { return ( *it ); } + } + + return _t->createView( this ); }