Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Pattern and instrument drag & drop preview #1699

Draft
wants to merge 4 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 75 additions & 0 deletions src/gui/src/PatternEditor/PatternEditorInstrumentList.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -876,8 +876,83 @@ void PatternEditorInstrumentList::dragEnterEvent(QDragEnterEvent *event)
event->acceptProposedAction();
}

void PatternEditorInstrumentList::dragMoveEvent( QDragMoveEvent *pEvent )
{
if ( ! pEvent->mimeData()->hasFormat("text/plain") ) {
pEvent->ignore();
}

QString sText = pEvent->mimeData()->text();
if ( sText.startsWith( "move instrument:" ) ) {
Hydrogen *pHydrogen = Hydrogen::get_instance();
int nSourceInstrument = pHydrogen->getSelectedInstrumentNumber();
int nTargetInstrument = pEvent->pos().y() / m_nGridHeight;

// Move InstrumentLines temporarily into new place
setDropTarget( DropTargetKind::Move, nTargetInstrument, nSourceInstrument );

} else if ( sText.startsWith( "importInstrument:" ) ) {
// Move existing InstrumentLines to show the gap where the new instrument will be inserted.
int nTargetInstrument = pEvent->pos().y() / m_nGridHeight;
setDropTarget( DropTargetKind::Insert, nTargetInstrument );
} else {
setDropTarget( DropTargetKind::None );
}
}

void PatternEditorInstrumentList::dragLeaveEvent( QDragLeaveEvent *pEvent )
{
setDropTarget( DropTargetKind::None );
}

void PatternEditorInstrumentList::setDropTarget( DropTargetKind kind, int nDropTarget, int nSource )
{
// Filter out non-changes
if ( kind == m_dropTargetKind && nDropTarget == m_nDropTarget && nSource == m_nDropSource ) {
return;
}
m_dropTargetKind = kind;
m_nDropTarget = nDropTarget;
m_nDropSource = nSource;
for ( int i = 0; i < MAX_INSTRUMENTS; i++ ) {
InstrumentLine *pInstrumentLine = m_pInstrumentLine[ i ];
if ( pInstrumentLine ) {
int nYPos = i;
switch ( kind ) {
case None:
nYPos = i;
break;
case Insert:
nYPos = i + ( i >= nDropTarget );
break;
case Move:
nYPos = i;
if ( i == nSource ) {
// Show the source at the drop target
nYPos = nDropTarget;
} else if ( nDropTarget < nSource ) {
// Moving up: shift intermediates down
if ( i >= nDropTarget && i <= nSource ) {
nYPos += 1;
}
} else if ( nDropTarget > nSource ) {
// Moving down: shift intermediates up
if ( i > nSource && i <= nDropTarget ) {
nYPos -= 1;
}
}
default:
;
}
pInstrumentLine->move( 0, m_nGridHeight * nYPos + 1 );
}
}
}


void PatternEditorInstrumentList::dropEvent(QDropEvent *event)
{
setDropTarget( DropTargetKind::None );
//WARNINGLOG("Drop!");
if ( ! event->mimeData()->hasFormat("text/plain") ) {
event->ignore();
Expand Down
12 changes: 10 additions & 2 deletions src/gui/src/PatternEditor/PatternEditorInstrumentList.h
Original file line number Diff line number Diff line change
Expand Up @@ -109,8 +109,8 @@ public slots:

virtual void mousePressEvent(QMouseEvent *ev) override;
virtual void mouseDoubleClickEvent( QMouseEvent* ev ) override;
virtual void enterEvent( QEvent *ev );
virtual void leaveEvent( QEvent *ev );
virtual void enterEvent( QEvent *ev ) override;
virtual void leaveEvent( QEvent *ev ) override;
virtual void paintEvent( QPaintEvent* ev ) override;
H2Core::Pattern* getCurrentPattern();

Expand Down Expand Up @@ -142,6 +142,8 @@ class PatternEditorInstrumentList : public QWidget,


virtual void dragEnterEvent(QDragEnterEvent *event) override;
virtual void dragMoveEvent( QDragMoveEvent *pEvent ) override;
virtual void dragLeaveEvent( QDragLeaveEvent *event ) override;
virtual void dropEvent(QDropEvent *event) override;

virtual void selectedInstrumentChangedEvent() override;
Expand All @@ -168,6 +170,12 @@ class PatternEditorInstrumentList : public QWidget,

InstrumentLine* createInstrumentLine();

enum DropTargetKind { None, Move, Insert };
void setDropTarget( DropTargetKind kind, int nDropTarget = -1, int nSource = -1 );
int m_nDropTarget;
int m_nDropSource;
DropTargetKind m_dropTargetKind;

private:
void drawFocus( QPainter& painter );
};
Expand Down
74 changes: 74 additions & 0 deletions src/gui/src/SongEditor/SongEditor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1800,6 +1800,37 @@ void SongEditorPatternList::createBackground()
}
m_pAudioEngine->unlock();

if ( m_nDropTarget >= 0 && m_nDropTarget < nPatterns ) {
switch ( m_dropTargetKind ) {
case DropTargetKind::None:
break;
case DropTargetKind::Insert:
// Add gap for new pattern
for ( int i = nPatterns-1; i > m_nDropTarget; i--) {
PatternArray[ i ] = PatternArray[ i-1 ];
}
PatternArray[ m_nDropTarget ].bActive = false;
PatternArray[ m_nDropTarget ].bNext = false;
PatternArray[ m_nDropTarget ].sPatternName = "";
break;
case DropTargetKind::Move:
{
PatternDisplayInfo Source = PatternArray[ m_nDropSource ];
if ( m_nDropTarget < m_nDropSource ) {
for ( int i = m_nDropSource; i > m_nDropTarget; --i ) {
PatternArray[ i ] = PatternArray[ i-1 ];
}
} else if ( m_nDropSource < m_nDropTarget ) {
for ( int i = m_nDropSource; i < m_nDropTarget; i++ ) {
PatternArray[ i ] = PatternArray[ i+1 ];
}
}
PatternArray[ m_nDropTarget ] = Source;
break;
}
}
}

/// paint the foreground (pattern name etc.)
for ( int i = 0; i < nPatterns; i++ ) {
if ( i == nSelectedPattern ) {
Expand Down Expand Up @@ -2222,9 +2253,52 @@ void SongEditorPatternList::dragEnterEvent(QDragEnterEvent *event)
}
}

void SongEditorPatternList::dragMoveEvent( QDragMoveEvent *pEvent )
{
QString sText = pEvent->mimeData()->text();
const QMimeData* mimeData = pEvent->mimeData();

int nTargetPattern = 0;
if ( m_nGridHeight > 0 ) {
nTargetPattern = pEvent->pos().y() / m_nGridHeight;
}

if ( sText.startsWith( "move pattern:" ) ) {
QStringList tokens = sText.split( ":" );
bool bOK = true;
int nSourcePattern = tokens[1].toInt(&bOK);

setDropTarget( DropTargetKind::Move, nTargetPattern, nSourcePattern );
} else if ( sText.startsWith( "file://" ) ) {
setDropTarget( DropTargetKind::Insert, nTargetPattern );
}
}


void SongEditorPatternList::dragLeaveEvent( QDragLeaveEvent *pEvent )
{
setDropTarget( DropTargetKind::None );
}

void SongEditorPatternList::setDropTarget( SongEditorPatternList::DropTargetKind kind, int nDropTarget, int nSource )
{
// Filter out non-changes
if ( kind == m_dropTargetKind && nDropTarget == m_nDropTarget && nSource == m_nDropSource ) {
return;
}
m_dropTargetKind = kind;
m_nDropTarget = nDropTarget;
m_nDropSource = nSource;

// Now update
createBackground();
update();
}

void SongEditorPatternList::dropEvent(QDropEvent *event)
{
setDropTarget( DropTargetKind::None );

std::shared_ptr<Song> pSong = m_pHydrogen->getSong();

QString sText = event->mimeData()->text();
Expand Down
12 changes: 10 additions & 2 deletions src/gui/src/SongEditor/SongEditor.h
Original file line number Diff line number Diff line change
Expand Up @@ -299,6 +299,8 @@ class SongEditorPatternList : public QWidget
void inlineEditingFinished();
void inlineEditingEntered();
virtual void dragEnterEvent(QDragEnterEvent *event) override;
virtual void dragMoveEvent(QDragMoveEvent *event) override;
virtual void dragLeaveEvent(QDragLeaveEvent *event) override;
virtual void dropEvent(QDropEvent *event) override;
virtual void timelineUpdateEvent( int nValue ) override;
void onPreferencesChanged( H2Core::Preferences::Changes changes );
Expand All @@ -325,14 +327,20 @@ class SongEditorPatternList : public QWidget
H2Core::Pattern * m_pPatternBeingEdited;

DragScroller * m_pDragScroller;


enum DropTargetKind { None, Move, Insert };
void setDropTarget( DropTargetKind kind, int nDropTarget = -1, int nSource = -1 );
int m_nDropTarget;
int m_nDropSource;
DropTargetKind m_dropTargetKind;

void inlineEditPatternName( int row );

virtual void mousePressEvent( QMouseEvent *ev ) override;
virtual void mouseDoubleClickEvent( QMouseEvent *ev ) override;
virtual void paintEvent( QPaintEvent *ev ) override;
virtual void mouseMoveEvent(QMouseEvent *event) override;
virtual void leaveEvent( QEvent *ev );
virtual void leaveEvent( QEvent *ev ) override;

QPoint __drag_start_position;

Expand Down