diff --git a/include/TimeLineWidget.h b/include/TimeLineWidget.h index abf622aaf..37e1f6ee7 100644 --- a/include/TimeLineWidget.h +++ b/include/TimeLineWidget.h @@ -35,6 +35,7 @@ class QPixmap; class QToolBar; class NStateButton; class TextFloat; +class SongEditor; class TimeLineWidget : public QWidget, public JournallingObject @@ -128,6 +129,11 @@ public: m_ppt / MidiTime::ticksPerTact() ); } +signals: + + void regionSelectedFromPixels( int, int ); + void selectionFinished(); + public slots: void updatePosition( const MidiTime & ); @@ -171,6 +177,7 @@ private: TextFloat * m_hint; + int m_initalXSelect; enum actions @@ -178,7 +185,8 @@ private: NoAction, MovePositionMarker, MoveLoopBegin, - MoveLoopEnd + MoveLoopEnd, + SelectSongTCO, } m_action; int m_moveXOff; diff --git a/include/TrackContainerView.h b/include/TrackContainerView.h index fdf28be91..51b8ca0fa 100644 --- a/include/TrackContainerView.h +++ b/include/TrackContainerView.h @@ -126,6 +126,17 @@ public slots: virtual void dropEvent( QDropEvent * _de ); virtual void dragEnterEvent( QDragEnterEvent * _dee ); + /// + /// \brief selectRegionFromPixels + /// \param x + /// \param y + /// Use the rubber band to select TCO from all tracks using x, y pixels + void selectRegionFromPixels(int x, int y); + + /// + /// \brief stopRubberBand + /// Removes the rubber band from display when finished with. + void stopRubberBand(); protected: static const int DEFAULT_PIXELS_PER_TACT = 16; diff --git a/src/gui/TimeLineWidget.cpp b/src/gui/TimeLineWidget.cpp index 5966e7d51..4ab508c9c 100644 --- a/src/gui/TimeLineWidget.cpp +++ b/src/gui/TimeLineWidget.cpp @@ -39,6 +39,7 @@ #include "NStateButton.h" #include "GuiApplication.h" #include "TextFloat.h" +#include "SongEditor.h" #if QT_VERSION < 0x040800 @@ -280,7 +281,7 @@ void TimeLineWidget::mousePressEvent( QMouseEvent* event ) { return; } - if( event->button() == Qt::LeftButton ) + if( event->button() == Qt::LeftButton && !(event->modifiers() & Qt::ShiftModifier) ) { m_action = MovePositionMarker; if( event->x() - m_xOffset < s_posMarkerPixmap->width() ) @@ -292,6 +293,11 @@ void TimeLineWidget::mousePressEvent( QMouseEvent* event ) m_moveXOff = s_posMarkerPixmap->width() / 2; } } + else if( event->button() == Qt::LeftButton && (event->modifiers() & Qt::ShiftModifier) ) + { + m_action = SelectSongTCO; + m_initalXSelect = event->x(); + } else if( event->button() == Qt::RightButton || event->button() == Qt::MiddleButton ) { m_moveXOff = s_posMarkerPixmap->width() / 2; @@ -373,6 +379,9 @@ void TimeLineWidget::mouseMoveEvent( QMouseEvent* event ) update(); break; } + case SelectSongTCO: + emit regionSelectedFromPixels( m_initalXSelect , event->x() ); + break; default: break; @@ -386,6 +395,7 @@ void TimeLineWidget::mouseReleaseEvent( QMouseEvent* event ) { delete m_hint; m_hint = NULL; + if ( m_action == SelectSongTCO ) { emit selectionFinished(); } m_action = NoAction; } diff --git a/src/gui/TrackContainerView.cpp b/src/gui/TrackContainerView.cpp index d8c3a5c40..b4e446d44 100644 --- a/src/gui/TrackContainerView.cpp +++ b/src/gui/TrackContainerView.cpp @@ -313,6 +313,19 @@ void TrackContainerView::dragEnterEvent( QDragEnterEvent * _dee ) arg( Track::SampleTrack ) ); } +void TrackContainerView::selectRegionFromPixels(int x, int y) +{ + m_rubberBand->setEnabled( true ); + m_rubberBand->show(); + m_rubberBand->setGeometry( min( x, y ), 0, max( x, y ) - min( x, y ), std::numeric_limits::max() ); +} + +void TrackContainerView::stopRubberBand() +{ + m_rubberBand->hide(); + m_rubberBand->setEnabled( false ); +} + diff --git a/src/gui/editors/SongEditor.cpp b/src/gui/editors/SongEditor.cpp index a513485f3..a9dab5d83 100644 --- a/src/gui/editors/SongEditor.cpp +++ b/src/gui/editors/SongEditor.cpp @@ -98,6 +98,10 @@ SongEditor::SongEditor( Song * _song ) : SLOT( updatePosition( const MidiTime & ) ) ); connect( m_timeLine, SIGNAL( positionChanged( const MidiTime & ) ), this, SLOT( updatePosition( const MidiTime & ) ) ); + connect( m_timeLine, SIGNAL( regionSelectedFromPixels( int, int ) ), + this, SLOT( selectRegionFromPixels( int, int ) ) ); + connect( m_timeLine, SIGNAL( selectionFinished() ), + this, SLOT( stopRubberBand() ) ); m_positionLine = new positionLine( this );