diff --git a/include/TrackGrip.h b/include/TrackGrip.h index aa19222a6ff..50244b93583 100644 --- a/include/TrackGrip.h +++ b/include/TrackGrip.h @@ -33,16 +33,16 @@ class QPixmap; namespace lmms { -class Track; - namespace gui { +class TrackView; + class TrackGrip : public QWidget { Q_OBJECT public: - TrackGrip(Track* track, QWidget* parent = 0); + TrackGrip(TrackView* trackView, QWidget* parent = nullptr); ~TrackGrip() override = default; signals: @@ -55,7 +55,7 @@ class TrackGrip : public QWidget void paintEvent(QPaintEvent*) override; private: - Track* m_track = nullptr; + TrackView* m_trackView = nullptr; bool m_isGrabbed = false; static QPixmap* s_grabbedPixmap; static QPixmap* s_releasedPixmap; diff --git a/include/TrackOperationsWidget.h b/include/TrackOperationsWidget.h index 77dc2966cdf..8e652033ebe 100644 --- a/include/TrackOperationsWidget.h +++ b/include/TrackOperationsWidget.h @@ -46,7 +46,6 @@ class TrackOperationsWidget : public QWidget TrackGrip* getTrackGrip() const { return m_trackGrip; } protected: - void mousePressEvent( QMouseEvent * me ) override; void paintEvent( QPaintEvent * pe ) override; bool confirmRemoval(); diff --git a/src/gui/tracks/TrackGrip.cpp b/src/gui/tracks/TrackGrip.cpp index 6133c6e962d..0ae6808b248 100644 --- a/src/gui/tracks/TrackGrip.cpp +++ b/src/gui/tracks/TrackGrip.cpp @@ -24,8 +24,12 @@ #include "TrackGrip.h" +#include "DataFile.h" #include "embed.h" +#include "KeyboardShortcuts.h" +#include "StringPairDrag.h" #include "Track.h" +#include "TrackView.h" #include #include @@ -40,9 +44,9 @@ QPixmap* TrackGrip::s_releasedPixmap = nullptr; constexpr int c_margin = 2; -TrackGrip::TrackGrip(Track* track, QWidget* parent) : +TrackGrip::TrackGrip(TrackView* trackView, QWidget* parent) : QWidget(parent), - m_track(track) + m_trackView(trackView) { if (!s_grabbedPixmap) { @@ -63,14 +67,31 @@ TrackGrip::TrackGrip(Track* track, QWidget* parent) : void TrackGrip::mousePressEvent(QMouseEvent* m) { - m->accept(); - - m_isGrabbed = true; - setCursor(Qt::ClosedHandCursor); + // Allow the user to Ctrl-drag copy the track if it is not a pattern track + if (m->button() == Qt::LeftButton + && m->modifiers() & KBD_COPY_MODIFIER + && m_trackView->getTrack()->type() != Track::Type::Pattern) + { + m->accept(); + DataFile dataFile(DataFile::Type::DragNDropData); + m_trackView->getTrack()->saveState(dataFile, dataFile.content()); + new StringPairDrag( + QString("track_%1").arg(static_cast(m_trackView->getTrack()->type())), + dataFile.toString(), + m_trackView->getTrackSettingsWidget()->grab(), + this + ); + } + else + { + m->accept(); - emit grabbed(); + m_isGrabbed = true; + setCursor(Qt::ClosedHandCursor); - update(); + emit grabbed(); + update(); + } } void TrackGrip::mouseReleaseEvent(QMouseEvent* m) @@ -90,8 +111,8 @@ void TrackGrip::paintEvent(QPaintEvent*) QPainter p(this); // Check if the color of the track should be used for the background - const auto color = m_track->color(); - const auto muted = m_track->getMutedModel()->value(); + const auto color = m_trackView->getTrack()->color(); + const auto muted = m_trackView->getTrack()->getMutedModel()->value(); if (color.has_value() && !muted) { diff --git a/src/gui/tracks/TrackOperationsWidget.cpp b/src/gui/tracks/TrackOperationsWidget.cpp index 16c0ca3e424..609634ba9d2 100644 --- a/src/gui/tracks/TrackOperationsWidget.cpp +++ b/src/gui/tracks/TrackOperationsWidget.cpp @@ -37,7 +37,6 @@ #include "AutomationTrackView.h" #include "ColorChooser.h" #include "ConfigManager.h" -#include "DataFile.h" #include "embed.h" #include "Engine.h" #include "InstrumentTrackView.h" @@ -77,7 +76,7 @@ TrackOperationsWidget::TrackOperationsWidget( TrackView * parent ) : layout->setSpacing(0); layout->setAlignment(Qt::AlignTop); - m_trackGrip = new TrackGrip(m_trackView->getTrack(), this); + m_trackGrip = new TrackGrip(m_trackView, this); layout->addWidget(m_trackGrip); // This widget holds the gear icon and the mute and solo @@ -120,35 +119,6 @@ TrackOperationsWidget::TrackOperationsWidget( TrackView * parent ) : } -/*! \brief Respond to trackOperationsWidget mouse events - * - * If it's the left mouse button, and Ctrl is held down, and we're - * not a Pattern Editor track, then start a new drag event to - * copy this track. - * - * Otherwise, ignore all other events. - * - * \param me The mouse event to respond to. - */ -void TrackOperationsWidget::mousePressEvent( QMouseEvent * me ) -{ - if (me->button() == Qt::LeftButton && me->modifiers() & KBD_COPY_MODIFIER && - m_trackView->getTrack()->type() != Track::Type::Pattern) - { - DataFile dataFile( DataFile::Type::DragNDropData ); - m_trackView->getTrack()->saveState( dataFile, dataFile.content() ); - new StringPairDrag( QString( "track_%1" ).arg( - static_cast(m_trackView->getTrack()->type()) ), - dataFile.toString(), m_trackView->getTrackSettingsWidget()->grab(), - this ); - } - else if( me->button() == Qt::LeftButton ) - { - // track-widget (parent-widget) initiates track-move - me->ignore(); - } -} - /*! * \brief Repaint the trackOperationsWidget