From 3d8173d0e43ddacbbb28d8c99fc6d4926ce58c78 Mon Sep 17 00:00:00 2001 From: Robert Jonsson Date: Thu, 10 Feb 2011 18:58:42 +0000 Subject: cut/copy/paste in wave editor --- muse2/ChangeLog | 2 ++ muse2/muse/waveedit/waveedit.cpp | 25 +++++++++++++++ muse2/muse/waveedit/waveedit.h | 6 ++++ muse2/muse/waveedit/waveview.cpp | 66 +++++++++++++++++++++++++++++++++++++++- muse2/muse/waveedit/waveview.h | 4 ++- 5 files changed, 101 insertions(+), 2 deletions(-) diff --git a/muse2/ChangeLog b/muse2/ChangeLog index 9928262c..a0dd731c 100644 --- a/muse2/ChangeLog +++ b/muse2/ChangeLog @@ -1,3 +1,5 @@ +10.02.2011: + - added cut/copy/paste and keyboard shortcuts to wave editor (rj) 09.02.2011: - fixed regression with Bounce to File and Bounce to Track (rj) [[[ By Tim. Marked as p4.0.15 ... diff --git a/muse2/muse/waveedit/waveedit.cpp b/muse2/muse/waveedit/waveedit.cpp index a6251503..89e7fb78 100644 --- a/muse2/muse/waveedit/waveedit.cpp +++ b/muse2/muse/waveedit/waveedit.cpp @@ -100,6 +100,19 @@ WaveEdit::WaveEdit(PartList* pl) menuFunctions->addSeparator(); + copyAction = menuEdit->addAction(tr("&Copy")); + mapper->setMapping(copyAction, CMD_EDIT_COPY); + connect(copyAction, SIGNAL(triggered()), mapper, SLOT(map())); + + cutAction = menuEdit->addAction(tr("C&ut")); + mapper->setMapping(cutAction, CMD_EDIT_CUT); + connect(cutAction, SIGNAL(triggered()), mapper, SLOT(map())); + + pasteAction = menuEdit->addAction(tr("&Paste")); + mapper->setMapping(pasteAction, CMD_EDIT_PASTE); + connect(pasteAction, SIGNAL(triggered()), mapper, SLOT(map())); + + act = menuEdit->addAction(tr("Edit in E&xternal Editor")); mapper->setMapping(act, CMD_EDIT_EXTERNAL); connect(act, SIGNAL(triggered()), mapper, SLOT(map())); @@ -226,6 +239,9 @@ WaveEdit::WaveEdit(PartList* pl) connect(hscroll, SIGNAL(scaleChanged(int)), SLOT(updateHScrollRange())); connect(song, SIGNAL(songChanged(int)), SLOT(songChanged1(int))); + + + initShortcuts(); updateHScrollRange(); configChanged(); @@ -237,6 +253,15 @@ WaveEdit::WaveEdit(PartList* pl) } } +void WaveEdit::initShortcuts() + { + cutAction->setShortcut(shortcuts[SHRT_CUT].key); + copyAction->setShortcut(shortcuts[SHRT_COPY].key); + pasteAction->setShortcut(shortcuts[SHRT_PASTE].key); + selectAllAction->setShortcut(shortcuts[SHRT_SELECT_ALL].key); + selectNoneAction->setShortcut(shortcuts[SHRT_SELECT_NONE].key); + } + //--------------------------------------------------------- // configChanged //--------------------------------------------------------- diff --git a/muse2/muse/waveedit/waveedit.h b/muse2/muse/waveedit/waveedit.h index 79102410..67230897 100644 --- a/muse2/muse/waveedit/waveedit.h +++ b/muse2/muse/waveedit/waveedit.h @@ -40,6 +40,9 @@ class WaveEdit : public MidiEditor { PosLabel* pos2; QAction* selectAllAction; QAction* selectNoneAction; + QAction* cutAction; + QAction* copyAction; + QAction* pasteAction; static int _widthInit, _heightInit; @@ -50,6 +53,8 @@ class WaveEdit : public MidiEditor { QMenu* menuFunctions, *select, *menuGain; + void initShortcuts(); + private slots: void cmd(int); void setTime(unsigned t); @@ -75,6 +80,7 @@ class WaveEdit : public MidiEditor { enum { CMD_MUTE=0, CMD_NORMALIZE, CMD_FADE_IN, CMD_FADE_OUT, CMD_REVERSE, CMD_GAIN_FREE, CMD_GAIN_200, CMD_GAIN_150, CMD_GAIN_75, CMD_GAIN_50, CMD_GAIN_25, + CMD_EDIT_COPY, CMD_EDIT_CUT, CMD_EDIT_PASTE, CMD_EDIT_EXTERNAL, CMD_SELECT_ALL, CMD_SELECT_NONE }; }; diff --git a/muse2/muse/waveedit/waveview.cpp b/muse2/muse/waveedit/waveview.cpp index 668d8bea..fab731ba 100644 --- a/muse2/muse/waveedit/waveview.cpp +++ b/muse2/muse/waveedit/waveview.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include "editgain.h" #include "globals.h" @@ -499,6 +500,15 @@ void WaveView::cmd(int n) selectionStart = selectionStop = 0; redraw(); break; + case WaveEdit::CMD_EDIT_COPY: + modifyoperation = COPY; + break; + case WaveEdit::CMD_EDIT_CUT: + modifyoperation = CUT; + break; + case WaveEdit::CMD_EDIT_PASTE: + modifyoperation = PASTE; + break; case WaveEdit::CMD_MUTE: modifyoperation = MUTE; @@ -561,7 +571,7 @@ void WaveView::cmd(int n) } if (modifyoperation != -1) { - if (selectionStart == selectionStop) { + if (selectionStart == selectionStop && modifyoperation!=PASTE) { printf("No selection. Ignoring\n"); //@!TODO: Disable menu options when no selection QMessageBox::information(this, QString("MusE"), @@ -643,6 +653,18 @@ void WaveView::modifySelection(int operation, unsigned startpos, unsigned stoppo { song->startUndo(); + if (operation == PASTE) { + // we need to redefine startpos and stoppos + if (copiedPart =="") + return; + SndFile pasteFile(copiedPart); + pasteFile.openRead(); + startpos = pos[0]; + stoppos = startpos+ pasteFile.samples(); // possibly this is wrong if there are tempo changes + pasteFile.close(); + pos[0]=stoppos; + } + WaveSelectionList selection = getSelection(startpos, stoppos); for (iWaveSelection i = selection.begin(); i != selection.end(); i++) { WaveEventSelection w = *i; @@ -706,6 +728,20 @@ void WaveView::modifySelection(int operation, unsigned startpos, unsigned stoppo case GAIN: applyGain(file_channels, tmpdata, tmpdatalen, paramA); break; + case CUT: + copySelection(file_channels, tmpdata, tmpdatalen, true, file.format(), file.samplerate()); + break; + case COPY: + copySelection(file_channels, tmpdata, tmpdatalen, false, file.format(), file.samplerate()); + break; + case PASTE: + { + SndFile pasteFile(copiedPart); + pasteFile.openRead(); + pasteFile.seek(tmpdataoffset, 0); + pasteFile.readWithHeap(file_channels, tmpdata, tmpdatalen); + } + break; case EDIT_EXTERNAL: editExternal(file.format(), file.samplerate(), file_channels, tmpdata, tmpdatalen); @@ -736,6 +772,34 @@ void WaveView::modifySelection(int operation, unsigned startpos, unsigned stoppo redraw(); } +//--------------------------------------------------------- +// copySelection +//--------------------------------------------------------- +void WaveView::copySelection(unsigned file_channels, float** tmpdata, unsigned length, bool blankData, unsigned format, unsigned sampleRate) +{ + if (copiedPart!="") { + QFile::remove(copiedPart); + } + if (!getUniqueTmpfileName(copiedPart)) { + return; + } + + SndFile tmpFile(copiedPart); + tmpFile.setFormat(format, file_channels, sampleRate); + tmpFile.openWrite(); + tmpFile.write(file_channels, tmpdata, length); + tmpFile.close(); + + if (blankData) { + // Set everything to 0! + for (unsigned i=0; i