diff options
author | Florian Jung <flo@windfisch.org> | 2011-09-04 17:43:39 +0000 |
---|---|---|
committer | Florian Jung <flo@windfisch.org> | 2011-09-04 17:43:39 +0000 |
commit | 5669de5d2d1b978bd34c80964d299688282d7027 (patch) | |
tree | d049caa2e608865a0381a7096d0f0b97a30a6474 /muse2/muse/arranger | |
parent | 46369b4c33d841aa1ece363c3deb3775658165ad (diff) |
added paste dialog plus minor fixes:
- moved and changed muse.pro file
- added update_pro.sh and update_translations.sh
- updated translations
- moved stuff from functions.cpp out to dialogs.cpp
- fixed behaviour of movePartsTotheRight(): parts which
begin at "start of move" aren't expanded, but moved now
Diffstat (limited to 'muse2/muse/arranger')
-rw-r--r-- | muse2/muse/arranger/arranger.cpp | 11 | ||||
-rw-r--r-- | muse2/muse/arranger/arranger.h | 4 | ||||
-rw-r--r-- | muse2/muse/arranger/arrangerview.cpp | 49 | ||||
-rw-r--r-- | muse2/muse/arranger/arrangerview.h | 7 | ||||
-rw-r--r-- | muse2/muse/arranger/pcanvas.cpp | 176 | ||||
-rw-r--r-- | muse2/muse/arranger/pcanvas.h | 10 |
6 files changed, 181 insertions, 76 deletions
diff --git a/muse2/muse/arranger/arranger.cpp b/muse2/muse/arranger/arranger.cpp index d9712427..03caae3e 100644 --- a/muse2/muse/arranger/arranger.cpp +++ b/muse2/muse/arranger/arranger.cpp @@ -757,14 +757,11 @@ void Arranger::cmd(int cmd) case CMD_PASTE_CLONE_PART: ncmd = PartCanvas::CMD_PASTE_CLONE_PART; break; - case CMD_PASTE_PART_TO_TRACK: - ncmd = PartCanvas::CMD_PASTE_PART_TO_TRACK; + case CMD_PASTE_DIALOG: + ncmd = PartCanvas::CMD_PASTE_DIALOG; break; - case CMD_PASTE_CLONE_PART_TO_TRACK: - ncmd = PartCanvas::CMD_PASTE_CLONE_PART_TO_TRACK; - break; - case CMD_INSERT_PART: - ncmd = PartCanvas::CMD_INSERT_PART; + case CMD_PASTE_CLONE_DIALOG: + ncmd = PartCanvas::CMD_PASTE_CLONE_DIALOG; break; case CMD_INSERT_EMPTYMEAS: ncmd = PartCanvas::CMD_INSERT_EMPTYMEAS; diff --git a/muse2/muse/arranger/arranger.h b/muse2/muse/arranger/arranger.h index 4e91272e..a89c4de9 100644 --- a/muse2/muse/arranger/arranger.h +++ b/muse2/muse/arranger/arranger.h @@ -150,8 +150,8 @@ class Arranger : public QWidget { void controllerChanged(Track *t); public: - enum { CMD_CUT_PART, CMD_COPY_PART, CMD_COPY_PART_IN_RANGE, CMD_PASTE_PART, CMD_PASTE_CLONE_PART, CMD_PASTE_PART_TO_TRACK, CMD_PASTE_CLONE_PART_TO_TRACK, - CMD_INSERT_PART, CMD_INSERT_EMPTYMEAS }; + enum { CMD_CUT_PART, CMD_COPY_PART, CMD_COPY_PART_IN_RANGE, CMD_PASTE_PART, CMD_PASTE_CLONE_PART, + CMD_PASTE_DIALOG, CMD_PASTE_CLONE_DIALOG, CMD_INSERT_EMPTYMEAS }; Arranger(ArrangerView* parent, const char* name = 0); diff --git a/muse2/muse/arranger/arrangerview.cpp b/muse2/muse/arranger/arrangerview.cpp index 4e844f35..2ba3ab8f 100644 --- a/muse2/muse/arranger/arrangerview.cpp +++ b/muse2/muse/arranger/arrangerview.cpp @@ -374,11 +374,10 @@ ArrangerView::ArrangerView(QWidget* parent) editCopyAction = new QAction(QIcon(*editcopyIconSet), tr("&Copy"), this); editCopyRangeAction = new QAction(QIcon(*editcopyIconSet), tr("&Copy in range"), this); editPasteAction = new QAction(QIcon(*editpasteIconSet), tr("&Paste"), this); - editInsertAction = new QAction(QIcon(*editpasteIconSet), tr("&Insert"), this); - editInsertEMAction = new QAction(QIcon(*editpasteIconSet), tr("&Insert Empty Measure"), this); + editPasteDialogAction = new QAction(QIcon(*editpasteIconSet), tr("Paste (show dialog)"), this); editPasteCloneAction = new QAction(QIcon(*editpasteCloneIconSet), tr("Paste c&lone"), this); - editPaste2TrackAction = new QAction(QIcon(*editpaste2TrackIconSet), tr("Paste to &track"), this); - editPasteC2TAction = new QAction(QIcon(*editpasteClone2TrackIconSet), tr("Paste clone to trac&k"), this); + editPasteCloneDialogAction = new QAction(QIcon(*editpasteCloneIconSet), tr("Paste clone (show dialog)"), this); + editInsertEMAction = new QAction(QIcon(*editpasteIconSet), tr("&Insert Empty Measure"), this); editDeleteSelectedAction = new QAction(QIcon(*edit_track_delIcon), tr("Delete Selected Tracks"), this); editShrinkPartsAction = new QAction(tr("Shrink selected parts"), this); //FINDMICH TODO tooltips! @@ -442,11 +441,10 @@ ArrangerView::ArrangerView(QWidget* parent) menuEdit->addAction(editCopyAction); menuEdit->addAction(editCopyRangeAction); menuEdit->addAction(editPasteAction); - menuEdit->addAction(editInsertAction); - menuEdit->addAction(editInsertEMAction); + menuEdit->addAction(editPasteDialogAction); menuEdit->addAction(editPasteCloneAction); - menuEdit->addAction(editPaste2TrackAction); - menuEdit->addAction(editPasteC2TAction); + menuEdit->addAction(editPasteCloneDialogAction); + menuEdit->addAction(editInsertEMAction); menuEdit->addSeparator(); menuEdit->addAction(editShrinkPartsAction); menuEdit->addAction(editExpandPartsAction); @@ -520,11 +518,10 @@ ArrangerView::ArrangerView(QWidget* parent) connect(editCopyAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); connect(editCopyRangeAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); connect(editPasteAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); - connect(editInsertAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); - connect(editInsertEMAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); connect(editPasteCloneAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); - connect(editPaste2TrackAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); - connect(editPasteC2TAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); + connect(editPasteDialogAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); + connect(editPasteCloneDialogAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); + connect(editInsertEMAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); connect(editDeleteSelectedAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); connect(editShrinkPartsAction, SIGNAL(triggered()), editSignalMapper, SLOT(map())); @@ -542,10 +539,9 @@ ArrangerView::ArrangerView(QWidget* parent) editSignalMapper->setMapping(editCopyAction, CMD_COPY); editSignalMapper->setMapping(editCopyRangeAction, CMD_COPY_RANGE); editSignalMapper->setMapping(editPasteAction, CMD_PASTE); - editSignalMapper->setMapping(editInsertAction, CMD_INSERT); editSignalMapper->setMapping(editPasteCloneAction, CMD_PASTE_CLONE); - editSignalMapper->setMapping(editPaste2TrackAction, CMD_PASTE_TO_TRACK); - editSignalMapper->setMapping(editPasteC2TAction, CMD_PASTE_CLONE_TO_TRACK); + editSignalMapper->setMapping(editPasteDialogAction, CMD_PASTE_DIALOG); + editSignalMapper->setMapping(editPasteCloneDialogAction, CMD_PASTE_CLONE_DIALOG); editSignalMapper->setMapping(editInsertEMAction, CMD_INSERTMEAS); editSignalMapper->setMapping(editDeleteSelectedAction, CMD_DELETE_TRACK); editSignalMapper->setMapping(editShrinkPartsAction, CMD_SHRINK_PART); @@ -715,14 +711,11 @@ void ArrangerView::cmd(int cmd) case CMD_PASTE_CLONE: arranger->cmd(Arranger::CMD_PASTE_CLONE_PART); break; - case CMD_PASTE_TO_TRACK: - arranger->cmd(Arranger::CMD_PASTE_PART_TO_TRACK); - break; - case CMD_PASTE_CLONE_TO_TRACK: - arranger->cmd(Arranger::CMD_PASTE_CLONE_PART_TO_TRACK); + case CMD_PASTE_DIALOG: + arranger->cmd(Arranger::CMD_PASTE_DIALOG); break; - case CMD_INSERT: - arranger->cmd(Arranger::CMD_INSERT_PART); + case CMD_PASTE_CLONE_DIALOG: + arranger->cmd(Arranger::CMD_PASTE_CLONE_DIALOG); break; case CMD_INSERTMEAS: arranger->cmd(Arranger::CMD_INSERT_EMPTYMEAS); @@ -886,11 +879,10 @@ void ArrangerView::updateShortcuts() editCopyAction->setShortcut(shortcuts[SHRT_COPY].key); editCopyRangeAction->setShortcut(shortcuts[SHRT_COPY_RANGE].key); editPasteAction->setShortcut(shortcuts[SHRT_PASTE].key); - editInsertAction->setShortcut(shortcuts[SHRT_INSERT].key); - editInsertEMAction->setShortcut(shortcuts[SHRT_INSERTMEAS].key); editPasteCloneAction->setShortcut(shortcuts[SHRT_PASTE_CLONE].key); - editPaste2TrackAction->setShortcut(shortcuts[SHRT_PASTE_TO_TRACK].key); - editPasteC2TAction->setShortcut(shortcuts[SHRT_PASTE_CLONE_TO_TRACK].key); + editPasteDialogAction->setShortcut(shortcuts[SHRT_PASTE_DIALOG].key); + editPasteCloneDialogAction->setShortcut(shortcuts[SHRT_PASTE_CLONE_DIALOG].key); + editInsertEMAction->setShortcut(shortcuts[SHRT_INSERTMEAS].key); //editDeleteSelectedAction has no acceleration @@ -936,10 +928,9 @@ void ArrangerView::clipboardChanged() flag = true; editPasteAction->setEnabled(flag); - editInsertAction->setEnabled(flag); editPasteCloneAction->setEnabled(flag); - editPaste2TrackAction->setEnabled(flag); - editPasteC2TAction->setEnabled(flag); + editPasteDialogAction->setEnabled(flag); + editPasteCloneDialogAction->setEnabled(flag); } //--------------------------------------------------------- diff --git a/muse2/muse/arranger/arrangerview.h b/muse2/muse/arranger/arrangerview.h index 580173f9..f5214640 100644 --- a/muse2/muse/arranger/arrangerview.h +++ b/muse2/muse/arranger/arrangerview.h @@ -48,8 +48,8 @@ class ArrangerView : public TopWin private: enum cmd_enum - {CMD_CUT, CMD_COPY, CMD_COPY_RANGE, CMD_PASTE, CMD_INSERT, CMD_INSERTMEAS, CMD_PASTE_CLONE, - CMD_PASTE_TO_TRACK, CMD_PASTE_CLONE_TO_TRACK, CMD_DELETE, + {CMD_CUT, CMD_COPY, CMD_COPY_RANGE, CMD_PASTE, CMD_INSERTMEAS, CMD_PASTE_CLONE, + CMD_PASTE_DIALOG, CMD_PASTE_CLONE_DIALOG, CMD_DELETE, CMD_SELECT_ALL, CMD_SELECT_NONE, CMD_SELECT_INVERT, CMD_SELECT_ILOOP, CMD_SELECT_OLOOP, CMD_SELECT_PARTS, CMD_DELETE_TRACK, CMD_EXPAND_PART, CMD_SHRINK_PART, CMD_CLEAN_PART, @@ -74,7 +74,8 @@ class ArrangerView : public TopWin QAction *strGlobalCutAction, *strGlobalInsertAction, *strGlobalSplitAction; QAction *trackMidiAction, *trackDrumAction, *trackWaveAction, *trackAOutputAction, *trackAGroupAction; QAction *trackAInputAction, *trackAAuxAction; - QAction *editCutAction, *editCopyAction, *editCopyRangeAction, *editPasteAction, *editInsertAction, *editPasteCloneAction, *editPaste2TrackAction; + QAction *editCutAction, *editCopyAction, *editCopyRangeAction; + QAction *editPasteAction, *editPasteCloneAction, *editPasteDialogAction, *editPasteCloneDialogAction; QAction *editInsertEMAction, *editPasteC2TAction, *editDeleteSelectedAction, *editSelectAllAction, *editDeselectAllAction; QAction *editInvertSelectionAction, *editInsideLoopAction, *editOutsideLoopAction, *editAllPartsAction; QAction *masterGraphicAction, *masterListAction; diff --git a/muse2/muse/arranger/pcanvas.cpp b/muse2/muse/arranger/pcanvas.cpp index 094cf68a..3cd1e18e 100644 --- a/muse2/muse/arranger/pcanvas.cpp +++ b/muse2/muse/arranger/pcanvas.cpp @@ -46,11 +46,17 @@ #include "midi.h" #include "midictrl.h" #include "utils.h" +#include "dialogs.h" +#include "widgets/pastedialog.h" //#define ABS(x) ((x) < 0) ? -(x) : (x)) //#define ABS(x) (x>=0?x:-x) #define ABS(x) (abs(x)) +using std::set; + +int get_paste_len(); + //--------------------------------------------------------- // colorRect // paints a rectangular icon with a given color @@ -2590,20 +2596,35 @@ void PartCanvas::cmd(int cmd) copy_in_range(&pl); break; case CMD_PASTE_PART: - paste(false, false); - break; - case CMD_PASTE_CLONE_PART: - paste(true, false); - break; - case CMD_PASTE_PART_TO_TRACK: paste(); break; - case CMD_PASTE_CLONE_PART_TO_TRACK: + case CMD_PASTE_CLONE_PART: paste(true); break; - case CMD_INSERT_PART: - paste(false, false, true); + case CMD_PASTE_DIALOG: + case CMD_PASTE_CLONE_DIALOG: + { + unsigned temp_begin = AL::sigmap.raster1(song->vcpos(),0); + unsigned temp_end = AL::sigmap.raster2(temp_begin + get_paste_len(), 0); + paste_dialog->raster = temp_end - temp_begin; + paste_dialog->clone = (cmd == CMD_PASTE_CLONE_DIALOG); + + if (paste_dialog->exec()) + { + paste_mode_t paste_mode; + switch (paste_dialog->insert_method) + { + case 0: paste_mode=PASTEMODE_MIX; break; + case 1: paste_mode=PASTEMODE_MOVEALL; break; + case 2: paste_mode=PASTEMODE_MOVESOME; break; + } + + paste(paste_dialog->clone, paste_mode, paste_dialog->all_in_one_track, + paste_dialog->number, paste_dialog->raster); + } + break; + } case CMD_INSERT_EMPTYMEAS: int startPos=song->vcpos(); int oneMeas=AL::sigmap.ticksMeasure(startPos); @@ -2765,11 +2786,88 @@ void PartCanvas::copy(PartList* pl) fclose(tmp); } -//--------------------------------------------------------- -// pasteAt -//--------------------------------------------------------- -Undo PartCanvas::pasteAt(const QString& pt, Track* track, unsigned int pos, bool clone, bool toTrack, int* finalPosPtr) + +int get_paste_len() +{ + QClipboard* cb = QApplication::clipboard(); + const QMimeData* md = cb->mimeData(QClipboard::Clipboard); + + QString pfx("text/"); + QString mdpl("x-muse-midipartlist"); + QString wvpl("x-muse-wavepartlist"); + QString mxpl("x-muse-mixedpartlist"); + QString txt; + + if(md->hasFormat(pfx + mdpl)) + txt = cb->text(mdpl, QClipboard::Clipboard); + else if(md->hasFormat(pfx + wvpl)) + txt = cb->text(wvpl, QClipboard::Clipboard); + else if(md->hasFormat(pfx + mxpl)) + txt = cb->text(mxpl, QClipboard::Clipboard); + else + return 0; + + + QByteArray ba = txt.toLatin1(); + const char* ptxt = ba.constData(); + Xml xml(ptxt); + bool end = false; + + unsigned begin_tick=-1; //this uses the greatest possible begin_tick + unsigned end_tick=0; + + for (;;) + { + Xml::Token token = xml.parse(); + const QString& tag = xml.s1(); + switch (token) + { + case Xml::Error: + case Xml::End: + end = true; + break; + + case Xml::TagStart: + if (tag == "part") + { + Part* p = 0; + p = readXmlPart(xml, NULL, false, false); + + if (p) + { + if (p->tick() < begin_tick) + begin_tick=p->tick(); + + if (p->endTick() > end_tick) + end_tick=p->endTick(); + + delete p; + } + } + else + xml.unknown("PartCanvas::get_paste_len"); + break; + + case Xml::TagEnd: + break; + + default: + end = true; + break; + } + if(end) + break; + } + + if (begin_tick > end_tick) + return 0; + else + return end_tick - begin_tick; +} + + +Undo PartCanvas::pasteAt(const QString& pt, Track* track, unsigned int pos, bool clone, bool toTrack, int* finalPosPtr, set<Track*>* affected_tracks) { Undo operations; @@ -2821,6 +2919,8 @@ Undo PartCanvas::pasteAt(const QString& pt, Track* track, unsigned int pos, bool } p->setSelected(true); operations.push_back(UndoOp(UndoOp::AddPart,p)); + if (affected_tracks) + affected_tracks->insert(p->track()); } else xml.unknown("PartCanvas::pasteAt"); @@ -2855,16 +2955,12 @@ Undo PartCanvas::pasteAt(const QString& pt, Track* track, unsigned int pos, bool // paste part to current selected track at cpos //--------------------------------------------------------- -void PartCanvas::paste(bool clone, bool toTrack, bool doInsert) +void PartCanvas::paste(bool clone, paste_mode_t paste_mode, bool to_single_track, int amount, int raster) { Track* track = 0; - - if (doInsert) // logic depends on keeping track of newly selected tracks - deselectAll(); - - + // If we want to paste to a selected track... - if(toTrack) + if (to_single_track) { TrackList* tl = song->tracks(); for (iTrack i = tl->begin(); i != tl->end(); ++i) { @@ -2897,7 +2993,7 @@ void PartCanvas::paste(bool clone, bool toTrack, bool doInsert) if(md->hasFormat(pfx + mdpl)) { // If we want to paste to a selected track... - if(toTrack && !track->isMidiTrack()) + if(to_single_track && !track->isMidiTrack()) { QMessageBox::critical(this, QString("MusE"), tr("Can only paste to midi/drum track")); @@ -2905,11 +3001,10 @@ void PartCanvas::paste(bool clone, bool toTrack, bool doInsert) } txt = cb->text(mdpl, QClipboard::Clipboard); } - else - if(md->hasFormat(pfx + wvpl)) + else if(md->hasFormat(pfx + wvpl)) { // If we want to paste to a selected track... - if(toTrack && track->type() != Track::WAVE) + if(to_single_track && track->type() != Track::WAVE) { QMessageBox::critical(this, QString("MusE"), tr("Can only paste to wave track")); @@ -2917,11 +3012,10 @@ void PartCanvas::paste(bool clone, bool toTrack, bool doInsert) } txt = cb->text(wvpl, QClipboard::Clipboard); } - else - if(md->hasFormat(pfx + mxpl)) + else if(md->hasFormat(pfx + mxpl)) { // If we want to paste to a selected track... - if(toTrack && !track->isMidiTrack() && track->type() != Track::WAVE) + if(to_single_track && !track->isMidiTrack() && track->type() != Track::WAVE) { QMessageBox::critical(this, QString("MusE"), tr("Can only paste to midi or wave track")); @@ -2940,15 +3034,35 @@ void PartCanvas::paste(bool clone, bool toTrack, bool doInsert) { int endPos=0; unsigned int startPos=song->vcpos(); + set<Track*> affected_tracks; + deselectAll(); - Undo operations=pasteAt(txt, track, startPos, clone, toTrack, &endPos); + + Undo operations; + for (int i=0;i<amount;i++) + { + Undo temp = pasteAt(txt, track, startPos + i*raster, clone, to_single_track, &endPos, &affected_tracks); + operations.insert(operations.end(), temp.begin(), temp.end()); + } + Pos p(endPos, true); song->setPos(0, p); - if (doInsert) { - int offset = endPos-startPos; - Undo temp=movePartsTotheRight(startPos, offset); + + if (paste_mode != PASTEMODE_MIX) + { + int offset; + if (amount==1) offset = endPos-startPos; + else offset = amount*raster; + + Undo temp; + if (paste_mode==PASTEMODE_MOVESOME) + temp=movePartsTotheRight(startPos, offset, false, &affected_tracks); + else + temp=movePartsTotheRight(startPos, offset); + operations.insert(operations.end(), temp.begin(), temp.end()); } + song->applyOperationGroup(operations); } diff --git a/muse2/muse/arranger/pcanvas.h b/muse2/muse/arranger/pcanvas.h index 837d8c05..f9f9a3df 100644 --- a/muse2/muse/arranger/pcanvas.h +++ b/muse2/muse/arranger/pcanvas.h @@ -10,6 +10,7 @@ #define __PCANVAS_H__ #include <QVector> +#include <set> #include "song.h" #include "canvas.h" @@ -110,8 +111,9 @@ class PartCanvas : public Canvas { void copy(PartList*); void copy_in_range(PartList*); - void paste(bool clone = false, bool toTrack = true, bool doInsert=false); - Undo pasteAt(const QString&, Track*, unsigned int, bool clone = false, bool toTrack = true, int* finalPosPtr = NULL); + enum paste_mode_t { PASTEMODE_MIX, PASTEMODE_MOVEALL, PASTEMODE_MOVESOME }; + void paste(bool clone = false, paste_mode_t paste_mode = PASTEMODE_MIX, bool to_single_track=false, int amount=1, int raster=1536); + Undo pasteAt(const QString&, Track*, unsigned int, bool clone = false, bool toTrack = true, int* finalPosPtr = NULL, std::set<Track*>* affected_tracks = NULL); //Part* readClone(Xml&, Track*, bool toTrack = true); void drawWavePart(QPainter&, const QRect&, WavePart*, const QRect&); //void drawMidiPart(QPainter&, const QRect& rect, EventList* events, MidiTrack*mt, const QRect& r, int pTick, int from, int to); @@ -148,8 +150,8 @@ class PartCanvas : public Canvas { void returnPressed(); public: - enum { CMD_CUT_PART, CMD_COPY_PART, CMD_COPY_PART_IN_RANGE, CMD_PASTE_PART, CMD_PASTE_CLONE_PART, CMD_PASTE_PART_TO_TRACK, CMD_PASTE_CLONE_PART_TO_TRACK, - CMD_INSERT_PART, CMD_INSERT_EMPTYMEAS }; + enum { CMD_CUT_PART, CMD_COPY_PART, CMD_COPY_PART_IN_RANGE, CMD_PASTE_PART, CMD_PASTE_CLONE_PART, + CMD_PASTE_DIALOG, CMD_PASTE_CLONE_DIALOG, CMD_INSERT_EMPTYMEAS }; PartCanvas(int* raster, QWidget* parent, int, int); void partsChanged(); |