From bafb1d6cde0968ce5da78bb6dfaae750ecb12537 Mon Sep 17 00:00:00 2001 From: Werner Schweer Date: Tue, 28 Nov 2006 16:02:27 +0000 Subject: cut/copy/paste for parts --- muse/ChangeLog | 1 + muse/TODO | 4 +- muse/doc/man/de/man-de.tex | 40 +++++ muse/muse/arranger/arranger.cpp | 1 - muse/muse/arranger/canvas.cpp | 175 +++++++++------------ muse/muse/arranger/partdrag.h | 8 +- muse/muse/muse.cpp | 327 +++++++++++++++++++++++++--------------- muse/muse/muse.h | 2 + muse/muse/muse.qrc | 4 +- muse/muse/shortcuts.cpp | 25 ++- 10 files changed, 348 insertions(+), 239 deletions(-) diff --git a/muse/ChangeLog b/muse/ChangeLog index f7abcbf7..ec26f7f1 100644 --- a/muse/ChangeLog +++ b/muse/ChangeLog @@ -1,5 +1,6 @@ 28.11 (ws) - application spanning drag&drop of parts + - cut/copy/paste for parts 24.11 (ws) - added new make target: "doxy" to generate doxygen source documentation diff --git a/muse/TODO b/muse/TODO index 23488d7f..79f7235f 100644 --- a/muse/TODO +++ b/muse/TODO @@ -3,9 +3,7 @@ ---------------------------------------------------------------------------- - dont allow for overlapping parts - - add shortcuts as QAction - - extend Shortcut with ShortcutContext - - extend shortcuts with Help Text, Icons etc. + - automatically create unique default part names BUGS - make sure all track names are unique diff --git a/muse/doc/man/de/man-de.tex b/muse/doc/man/de/man-de.tex index b650501f..2269e25a 100644 --- a/muse/doc/man/de/man-de.tex +++ b/muse/doc/man/de/man-de.tex @@ -362,6 +362,46 @@ Wie bei allen anderen Strukturkommandos werden stummgeschaltete Spuren nicht berücksichtigt. + \section{Arranger} + \subsection{Spurtypen} + \startitemize[packed] + \item Midispur + \item Audiospur + \item Midiinput + \item Midioutput + \item Midigenerator + \item Audioinput + \item Audiooutput + \item Audiogruppe + \item Software Synthesizer + \stopitemize + + \subsection{Spur Operationen} + \startitemize[packed] + \item Spur erzeugen + \item Spur löschen + \item Spur verschieben + \item Spur kopieren + \stopitemize + + \subsection{Part Operationen} + \startitemize[packed] + \item Part erzeugen + \item Part löschen + \item Part verschieben + \item Part kopieren + \item Part clonen + \item Part declonen + \item Part nach Vorne verlängern + \item Part nach Hinten verlängern + \item Part stummschalten + \item Part einfärben + \stopitemize + + \section{Pianoroll Editor} + \section{Drum Editor} + \section{Master Editor} + \chapter{Installation} \component installation.tex diff --git a/muse/muse/arranger/arranger.cpp b/muse/muse/arranger/arranger.cpp index cf8bbb14..a904cb1f 100644 --- a/muse/muse/arranger/arranger.cpp +++ b/muse/muse/arranger/arranger.cpp @@ -1383,4 +1383,3 @@ void Arranger::removeMarker(const AL::Pos& pos) } printf("marker not found\n"); } - diff --git a/muse/muse/arranger/canvas.cpp b/muse/muse/arranger/canvas.cpp index 1bcc3d71..f0058d60 100644 --- a/muse/muse/arranger/canvas.cpp +++ b/muse/muse/arranger/canvas.cpp @@ -405,25 +405,18 @@ void PartCanvas::contextMenu(const QPoint& pos) QMenu* pop = new QMenu(widget()); QAction* a; if (part) { - a = pop->addAction(*editcutIconSet, tr("C&ut")); - a->setData(4); - a->setShortcut(Qt::CTRL + Qt::Key_X); - - a = pop->addAction(*editcopyIconSet, tr("&Copy")); - a->setData(5); - a->setShortcut(Qt::CTRL + Qt::Key_C); - + pop->addAction(getAction("cut", this)); + pop->addAction(getAction("copy", this)); pop->addSeparator(); + a = pop->addAction(tr("Rename")); + a->setData("rename"); - a = pop->addAction(tr("rename")); - a->setData(0); - - QMenu* cp = pop->addMenu(tr("color")); + QMenu* cp = pop->addMenu(tr("Color")); // part color selection for (int i = 0; i < NUM_PARTCOLORS; ++i) { a = cp->addAction(partColorNames[i]); - a->setData(20 + i); + a->setData(QString("color%1").arg(i)); QPixmap pm(20, 20); QPainter p(&pm); p.fillRect(0, 0, 20, 20, config.partColors[i]); @@ -431,106 +424,85 @@ void PartCanvas::contextMenu(const QPoint& pos) } a = getAction("delete", this); pop->addAction(a); - a->setData(1); - a = getAction("cut", this); + a->setData("delete"); + a = getAction("scissor", this); pop->addAction(a); - a->setData(2); a = getAction("glue", this); pop->addAction(a); - a->setData(3); - a = pop->addAction(tr("de-clone")); - a->setData(15); + a = pop->addAction(tr("Declone")); + a->setData("declone"); a->setEnabled(part->isClone()); if (track->type() == Track::MIDI) { a = pop->addAction(tr("AutoFill...")); - a->setData(16); + a->setData("autofill"); } pop->addSeparator(); if (track->type() == Track::MIDI) { MidiTrack* track = (MidiTrack*)part->track(); if (track->useDrumMap()) { a = pop->addAction(*edit_drummsIcon, tr("drums")); - a->setData(13); + a->setData("editdrums"); } else { a = pop->addAction(QIcon(":/xpm/piano.xpm"), tr("pianoroll")); - a->setData(10); + a->setData("editpiano"); } - a = pop->addAction(*edit_listIcon, tr("miditracker")); - a->setData(11); + a = pop->addAction(*edit_listIcon, tr("miditracker")); + a->setData("miditracker"); a = pop->addAction(*edit_listIcon, tr("list")); - a->setData(12); + a->setData("listedit"); } else { a = pop->addAction(*waveIcon, tr("wave edit")); - a->setData(14); + a->setData("waveedit"); } a = pop->exec(mapToGlobal(pos)); if (a) { - int n = a->data().toInt(); - switch (n) { - case 0: - renamePart(part); - break; - case 1: - song->cmdRemovePart(part); - track->partListChanged(); - break; - case 2: - splitPart(part, startDrag); - break; - case 3: - song->cmdGluePart(part); - break; - case 4: - cutPart(part); - break; - case 5: - copyPart(part); - break; - case 10: // pianoroll edit - emit startEditor(part, 0); - break; - case 11: //miditracker edit - emit startEditor(part, 2); - break; - case 12: // list edit - emit startEditor(part, 1); - break; - case 13: // drum edit - emit startEditor(part, 3); - break; - case 14: - emit startEditor(part, 4); - break; - case 15: - declonePart(part); - break; - case 16: - // auto fill: ask for loop length - { - bool ok; - int ticksM = AL::sigmap.ticksMeasure(part->tick()); - int n = QInputDialog::getInteger(this, - tr("MusE: Get auto fill loop len"), - tr("Measures: "), - part->fillLen() / ticksM, - 0, 16, 1, &ok); - if (ok) { - part->setFillLen(n * ticksM); - } + QString cmd = a->data().toString(); + if (cmd == "rename") + renamePart(part); + else if (cmd == "delete") + song->cmdRemovePart(part); + else if (cmd == "scissor") + splitPart(part, startDrag); + else if (cmd == "glue") + song->cmdGluePart(part); + else if (cmd == "cut") + cutPart(part); + else if (cmd == "copy") + copyPart(part); + else if (cmd == "editpiano") + emit startEditor(part, 0); + else if (cmd == "miditracker") + emit startEditor(part, 2); + else if (cmd == "listedit") + emit startEditor(part, 1); + else if (cmd == "drumedit") + emit startEditor(part, 3); + else if (cmd == "waveedit") + emit startEditor(part, 4); + else if (cmd == "declone") + declonePart(part); + else if (cmd == "autofill") { + bool ok; + int ticksM = AL::sigmap.ticksMeasure(part->tick()); + int n = QInputDialog::getInteger(this, + tr("MusE: Get auto fill loop len"), + tr("Measures: "), + part->fillLen() / ticksM, + 0, 16, 1, &ok); + if (ok) { + part->setFillLen(n * ticksM); } - break; - case 20 ... NUM_PARTCOLORS+20: - part->setColorIndex(n - 20); - widget()->update(); - break; - case -1: - break; - default: - printf("unknown action %d\n", n); - break; + } + else if (cmd.startsWith("color")) { + int idx = cmd.mid(5).toInt(); + part->setColorIndex(idx); + widget()->update(); + } + else { + printf("unknown action <%s>\n", cmd.toLatin1().data()); } } } @@ -540,17 +512,12 @@ void PartCanvas::contextMenu(const QPoint& pos) continue; a = getAction(toolList[i], this); pop->addAction(a); - int id = 1 << i; - a->setData(id); a->setCheckable(true); - if (id == (int)_tool) - a->setChecked(true); + a->setChecked((1 <exec(mapToGlobal(pos)); - if (a) { - int n = a->data().toInt(); - muse->setTool(n); - } + if (a) + muse->setTool(a->data().toString()); } } @@ -933,18 +900,26 @@ void PartCanvas::renamePart(Part* part) // cutPart //--------------------------------------------------------- -void PartCanvas::cutPart(Part*) +void PartCanvas::cutPart(Part* part) { - printf("cut part: not impl.\n"); + copyPart(part); + song->cmdRemovePart(part); } //--------------------------------------------------------- // copyPart //--------------------------------------------------------- -void PartCanvas::copyPart(Part*) +void PartCanvas::copyPart(Part* part) { - printf("copy part: not impl.\n"); + QBuffer buffer; + buffer.open(QIODevice::WriteOnly); + AL::Xml xml(&buffer); + part->write(xml); + buffer.close(); + QMimeData* mimeData = new QMimeData; + mimeData->setData(MidiPartDrag::type, buffer.buffer()); + QApplication::clipboard()->setMimeData(mimeData); } //--------------------------------------------------------- diff --git a/muse/muse/arranger/partdrag.h b/muse/muse/arranger/partdrag.h index 3f9a71c1..d8c2e978 100644 --- a/muse/muse/arranger/partdrag.h +++ b/muse/muse/arranger/partdrag.h @@ -28,10 +28,10 @@ class Part; //--------------------------------------------------------- class MidiPartDrag : public QDrag { - static const char type[]; Q_OBJECT public: + static const char type[]; MidiPartDrag(Part*, QWidget* src); static bool canDecode(const QMimeData*); static bool decode(const QMimeData* s, Part*& p); @@ -42,10 +42,10 @@ class MidiPartDrag : public QDrag { //--------------------------------------------------------- class AudioPartDrag : public QDrag { - static const char type[]; Q_OBJECT public: + static const char type[]; AudioPartDrag(Part*, QWidget* src); static bool canDecode(const QMimeData*); static bool decode(const QMimeData* s, Part*& p); @@ -56,16 +56,14 @@ class AudioPartDrag : public QDrag { //--------------------------------------------------------- class WavUriDrag : public QDrag { - static const char type[]; Q_OBJECT public: + static const char type[]; WavUriDrag(const QString&, QWidget* src); static bool canDecode(const QMimeData*); static bool decode(const QMimeData* s, QString* p); }; - - #endif diff --git a/muse/muse/muse.cpp b/muse/muse/muse.cpp index df4f9a51..eb177d4c 100644 --- a/muse/muse/muse.cpp +++ b/muse/muse/muse.cpp @@ -524,12 +524,10 @@ MusE::MusE() undoAction = getAction("undo", this); undoAction->setEnabled(false); - undoAction->setData(-1); connect(undoAction, SIGNAL(triggered()), song, SLOT(undo())); redoAction = getAction("redo", this); redoAction->setEnabled(false); - redoAction->setData(-1); connect(redoAction, SIGNAL(triggered()), song, SLOT(redo())); #ifdef __APPLE__ @@ -643,25 +641,18 @@ MusE::MusE() menuEdit->addAction(redoAction); menuEdit->addSeparator(); - cutAction = menuEdit->addAction(*editcutIconSet, tr("C&ut")); - cutAction->setData(CMD_CUT); - cutAction->setShortcut(Qt::CTRL + Qt::Key_X); - - copyAction = menuEdit->addAction(*editcopyIconSet, tr("&Copy")); - copyAction->setData(CMD_COPY); - copyAction->setShortcut(Qt::CTRL + Qt::Key_C); - - pasteAction = menuEdit->addAction(*editpasteIconSet, tr("&Paste")); - pasteAction->setData(CMD_PASTE); - pasteAction->setShortcut(Qt::CTRL + Qt::Key_V); + cutAction = getAction("cut", this); + menuEdit->addAction(cutAction); + copyAction = getAction("copy", this); + menuEdit->addAction(copyAction); + pasteAction = getAction("paste", this); + menuEdit->addAction(pasteAction); menuEditActions[CMD_DELETE] = getAction("delete", this); - menuEdit->addAction(menuEditActions[CMD_DELETE]); - menuEditActions[CMD_DELETE]->setData(CMD_DELETE); menuEdit->addSeparator(); a = menuEdit->addAction(QIcon(*edit_track_delIcon), tr("Delete Selected Tracks")); - a->setData(CMD_DELETE_TRACK); + a->setData("delete_track"); addTrack = menuEdit->addMenu(*edit_track_addIcon, tr("Add Track")); // delay creation of menu (at this moment the list of software @@ -672,11 +663,9 @@ MusE::MusE() select = menuEdit->addMenu(QIcon(*selectIcon), tr("Select")); menuEditActions[CMD_SELECT_ALL] = getAction("sel_all", this); select->addAction(menuEditActions[CMD_SELECT_ALL]); - menuEditActions[CMD_SELECT_ALL]->setData(CMD_SELECT_ALL); menuEditActions[CMD_SELECT_NONE] = getAction("sel_none", this); select->addAction(menuEditActions[CMD_SELECT_NONE]); - menuEditActions[CMD_SELECT_NONE]->setData(CMD_SELECT_NONE); menuEditActions[CMD_SELECT_INVERT] = getAction("sel_inv", this); select->addAction(menuEditActions[CMD_SELECT_INVERT]); @@ -692,7 +681,6 @@ MusE::MusE() menuEditActions[CMD_SELECT_PARTS] = getAction("select_parts_on_track", this); select->addAction(menuEditActions[CMD_SELECT_PARTS]); - menuEditActions[CMD_SELECT_PARTS]->setData(CMD_SELECT_PARTS); menuEdit->addSeparator(); menuEdit->addAction(pianoAction); @@ -842,13 +830,13 @@ MusE::MusE() follow = menuSettings->addMenu(QIcon(*settings_follow_songIcon), tr("follow song")); //follow->menuAction()->setShortcut(Qt::Key_F); fid0 = follow->addAction(tr("dont follow Song")); - fid0->setData(CMD_FOLLOW_NO); + fid0->setData("follow_no"); fid0->setCheckable(true); fid1 = follow->addAction(tr("follow page")); - fid1->setData(CMD_FOLLOW_JUMP); + fid1->setData("follow_jump"); fid1->setCheckable(true); fid2 = follow->addAction(tr("follow continuous")); - fid2->setData(CMD_FOLLOW_CONTINUOUS); + fid2->setData("follow_continuous"); fid2->setCheckable(true); fid0->setChecked(TimeCanvas::followMode == FOLLOW_NO); fid1->setChecked(TimeCanvas::followMode == FOLLOW_JUMP); @@ -1782,6 +1770,47 @@ void MusE::setFollow(FollowMode fm) changeConfig(true); // save settings } +//--------------------------------------------------------- +// copyParts +// copy all selected Parts of type MIDI or WAVE to +// clipboard whatever first found +//--------------------------------------------------------- + +void MusE::copyParts(bool cutFlag) + { + QBuffer buffer; + buffer.open(QIODevice::WriteOnly); + AL::Xml xml(&buffer); + + if (cutFlag) + song->startUndo(); + int midiType = -1; + TrackList* tl = song->tracks(); + for (iTrack i = tl->begin(); i != tl->end(); ++i) { + Track* track = *i; + if (midiType == 1 && !track->isMidiTrack()) + continue; + PartList* pl = track->parts(); + for (iPart ip = pl->begin(); ip != pl->end(); ++ip) { + Part* part = ip->second; + if (part->selected()) { + if (midiType == -1) + midiType = track->isMidiTrack(); + part->write(xml); + if (cutFlag) + song->removePart(part); + } + } + } + buffer.close(); + QMimeData* mimeData = new QMimeData; + const char* t = midiType ? "application/muse/part/midi" : "application/muse/part/audio"; + mimeData->setData(t, buffer.buffer()); + QApplication::clipboard()->setMimeData(mimeData); + if (cutFlag) + song->endUndo(0); + } + //--------------------------------------------------------- // cmd // some cmd's from pulldown menu @@ -1789,104 +1818,155 @@ void MusE::setFollow(FollowMode fm) void MusE::cmd(QAction* a) { - int cmd = a->data().toInt(); + QString cmd = a->data().toString(); TrackList* tracks = song->tracks(); int l = song->lpos(); int r = song->rpos(); - switch(cmd) { - case CMD_CUT: -//TODO1 arranger->cmd(Arranger::CMD_CUT_PART); - break; - case CMD_COPY: -//TODO1 arranger->cmd(Arranger::CMD_COPY_PART); - break; - case CMD_PASTE: -//TODO1 arranger->cmd(Arranger::CMD_PASTE_PART); - break; - case CMD_DELETE: - { - TrackList* tl = song->tracks(); - bool partsMarked = false; - for (iTrack it = tl->begin(); it != tl->end(); ++it) { - PartList* pl2 = (*it)->parts(); - for (iPart ip = pl2->begin(); ip != pl2->end(); ++ip) { - if (ip->second->selected()) { - partsMarked = true; - break; - } - } - } - if (partsMarked) - song->cmdRemoveParts(); - else - audio->msgRemoveTracks(); + if (cmd == "cut") + copyParts(true); + else if (cmd == "copy") + copyParts(false); + else if (cmd == "paste") { + const QMimeData* s = QApplication::clipboard()->mimeData(); + int isMidi = -1; + QByteArray data; + if (s->hasFormat("application/muse/part/midi")) { + isMidi = 1; + data = s->data("application/muse/part/midi"); + } + else if (s->hasFormat("application/muse/part/audio")) { + isMidi = 0; + data = s->data("application/muse/part/audio"); + } + // exit if unknown format + if (isMidi == -1) { + printf("paste: unknown format\n"); + return; } - break; - case CMD_DELETE_TRACK: - audio->msgRemoveTracks(); - break; + // search target track + TrackList* tl = song->tracks(); + Track* track = 0; + for (iTrack i = tl->begin(); i != tl->end(); ++i) { + Track* t = *i; + if ((isMidi == 1 && t->type() == Track::MIDI) + || (isMidi == 0 && t->type() == Track::WAVE)) { + track = t; + break; + } + } + if (track == 0) { + printf("no destination track selected\n"); + return; + } - case CMD_SELECT_ALL: - case CMD_SELECT_NONE: - case CMD_SELECT_INVERT: - case CMD_SELECT_ILOOP: - case CMD_SELECT_OLOOP: - for (iTrack i = tracks->begin(); i != tracks->end(); ++i) { - PartList* parts = (*i)->parts(); - for (iPart p = parts->begin(); p != parts->end(); ++p) { - bool f = false; - int t1 = p->second->tick(); - int t2 = t1 + p->second->lenTick(); - bool inside = - ((t1 >= l) && (t1 < r)) - || ((t2 > l) && (t2 < r)) - || ((t1 <= l) && (t2 > r)); - switch(cmd) { - case CMD_SELECT_INVERT: - f = !p->second->selected(); - break; - case CMD_SELECT_NONE: - f = false; - break; - case CMD_SELECT_ALL: - f = true; - break; - case CMD_SELECT_ILOOP: - f = inside; - break; - case CMD_SELECT_OLOOP: - f = !inside; - break; - } - p->second->setSelected(f); + QDomDocument doc; + int line, column; + QString err; + PartList pl; + if (!doc.setContent(data, false, &err, &line, &column)) { + QString col, ln, error; + col.setNum(column); + ln.setNum(line); + error = err + "\n at line: " + ln + " col: " + col; + printf("error parsing part: %s\n", error.toLatin1().data()); + return; + } + int tick = -1; + for (QDomNode node = doc.documentElement(); !node.isNull(); node = node.nextSibling()) { + QDomElement e = node.toElement(); + if (e.isNull()) + continue; + if (e.tagName() == "part") { + Part* p = new Part(0); + p->ref(); + p->read(node, true); + pl.add(p); + if (tick == -1 || p->tick() < unsigned(tick)) + tick = int(p->tick()); + } + else + printf("MusE: %s not supported\n", e.tagName().toLatin1().data()); + } + + unsigned cpos = song->cpos(); + song->startUndo(); + for (iPart ip = pl.begin(); ip != pl.end(); ++ip) { + Part* part = ip->second; + part->setTick(part->tick() - tick + cpos); + part->setTrack(track); + song->addPart(part); + cpos += part->lenTick(); + } + song->endUndo(0); + track->partListChanged(); + } + + else if (cmd == "delete") { + TrackList* tl = song->tracks(); + bool partsMarked = false; + for (iTrack it = tl->begin(); it != tl->end(); ++it) { + PartList* pl2 = (*it)->parts(); + for (iPart ip = pl2->begin(); ip != pl2->end(); ++ip) { + if (ip->second->selected()) { + partsMarked = true; + break; } - (*i)->partListChanged(); // repaints canvaswidget } - song->update(); - break; - - case CMD_SELECT_PARTS: - for (iTrack i = tracks->begin(); i != tracks->end(); ++i) { - if (!(*i)->selected()) - continue; - PartList* parts = (*i)->parts(); - for (iPart p = parts->begin(); p != parts->end(); ++p) - p->second->setSelected(true); + } + if (partsMarked) + song->cmdRemoveParts(); + else + audio->msgRemoveTracks(); + } + else if (cmd == "delete_track") + audio->msgRemoveTracks(); + else if (cmd == "sel_all" || cmd == "sel_none" || cmd == "sel_inv" + || cmd == "sel_ins_loc" || cmd == "sel_out_loc") { + for (iTrack i = tracks->begin(); i != tracks->end(); ++i) { + PartList* parts = (*i)->parts(); + for (iPart p = parts->begin(); p != parts->end(); ++p) { + bool f = false; + int t1 = p->second->tick(); + int t2 = t1 + p->second->lenTick(); + bool inside = + ((t1 >= l) && (t1 < r)) + || ((t2 > l) && (t2 < r)) + || ((t1 <= l) && (t2 > r)); + if (cmd == "sel_inv") + f = !p->second->selected(); + else if (cmd == "sel_none") + f = false; + else if (cmd == "sel_all") + f = true; + else if (cmd == "sel_ins_loc") + f = inside; + else if (cmd == "sel_out_loc") + f = !inside; + p->second->setSelected(f); } - song->update(); - break; - case CMD_FOLLOW_NO: - setFollow(FOLLOW_NO); - break; - case CMD_FOLLOW_JUMP: - setFollow(FOLLOW_JUMP); - break; - case CMD_FOLLOW_CONTINUOUS: - setFollow(FOLLOW_CONTINUOUS); - break; + (*i)->partListChanged(); // repaints canvaswidget + } + song->update(); + } + else if (cmd == "select_parts_on_track") { + for (iTrack i = tracks->begin(); i != tracks->end(); ++i) { + if (!(*i)->selected()) + continue; + PartList* parts = (*i)->parts(); + for (iPart p = parts->begin(); p != parts->end(); ++p) + p->second->setSelected(true); + } + song->update(); } + + else if (cmd == "follow_no") + setFollow(FOLLOW_NO); + else if (cmd == "follow_jump") + setFollow(FOLLOW_JUMP); + else if (cmd == "follow_continuous") + setFollow(FOLLOW_CONTINUOUS); } //--------------------------------------------------------- @@ -1895,22 +1975,13 @@ void MusE::cmd(QAction* a) void MusE::clipboardChanged() { -#if 0 //TD QString subtype("partlist"); - QMimeSource* ms = QApplication::clipboard()->data(QClipboard::Clipboard); + const QMimeData* ms = QApplication::clipboard()->mimeData(); if (ms == 0) return; - bool flag = false; - for (int i = 0; ms->format(i); ++i) { -// printf("Format <%s\n", ms->format(i)); - if ((strncmp(ms->format(i), "text/midipartlist", 17) == 0) - || strncmp(ms->format(i), "text/wavepartlist", 17) == 0) { - flag = true; - break; - } - } + bool flag = ms->hasFormat("application/muse/part/midi") + || ms->hasFormat("application/muse/part/audio"); pasteAction->setEnabled(flag); -#endif } //--------------------------------------------------------- @@ -2729,6 +2800,20 @@ void MusE::setTool(int tool) arranger->setTool(tool); } +void MusE::setTool(const QString& s) + { + int id = 0; + for (int i = 0; i < TOOLS; ++i) { + if (toolList[i] == s) { + id = i; + break; + } + } + id = 1 << id; + tools1->set(id); + arranger->setTool(id); + } + //--------------------------------------------------------- // globalPitchChanged //--------------------------------------------------------- diff --git a/muse/muse/muse.h b/muse/muse/muse.h index 9b2ac9ff..1b2a451d 100644 --- a/muse/muse/muse.h +++ b/muse/muse/muse.h @@ -178,6 +178,7 @@ class MusE : public QMainWindow // , public Ui::MuseBase virtual void focusInEvent(QFocusEvent*); void addMidiFile(const QString name); + void copyParts(bool); signals: void configChanged(); @@ -278,6 +279,7 @@ class MusE : public QMainWindow // , public Ui::MuseBase void setTempo200(); void setGlobalTempo(int val); void setTool(int); + void setTool(const QString&); void startEditor(Part*, int); bool save(); diff --git a/muse/muse/muse.qrc b/muse/muse/muse.qrc index 4f17f18a..20cc4209 100644 --- a/muse/muse/muse.qrc +++ b/muse/muse/muse.qrc @@ -37,7 +37,6 @@ xpm/view_cliplist.xpm xpm/view_marker.xpm xpm/view_mixer.xpm - xpm/pointer.xpm xpm/pencil.xpm xpm/delete.xpm @@ -52,6 +51,9 @@ xpm/select_invert_selection.xpm xpm/select_inside_loop.xpm xpm/select_outside_loop.xpm + xpm/editcut.xpm + xpm/editcopy.xpm + xpm/editpaste.xpm diff --git a/muse/muse/shortcuts.cpp b/muse/muse/shortcuts.cpp index 34b91293..c0f31008 100644 --- a/muse/muse/shortcuts.cpp +++ b/muse/muse/shortcuts.cpp @@ -162,12 +162,6 @@ Shortcut MuseApplication::sc[] = { QT_TR_NOOP("send note off to all midi channels"), ":/xpm/panic.xpm" ), - Shortcut( - "copy", - QT_TR_NOOP("Edit: Copy"), - INVIS_SHRT, - Qt::CTRL + Qt::Key_C - ), Shortcut( "undo", QT_TR_NOOP("Edit: Undo"), @@ -190,13 +184,28 @@ Shortcut MuseApplication::sc[] = { "cut", QT_TR_NOOP("Edit: Cut" ), INVIS_SHRT, - Qt::CTRL + Qt::Key_X + Qt::CTRL + Qt::Key_X, + QT_TR_NOOP("Cut"), + QT_TR_NOOP("Cut"), + ":/xpm/editcut.xpm" + ), + Shortcut( + "copy", + QT_TR_NOOP("Edit: Copy"), + INVIS_SHRT, + Qt::CTRL + Qt::Key_C, + QT_TR_NOOP("Copy"), + QT_TR_NOOP("Copy"), + ":/xpm/editcopy.xpm" ), Shortcut( "paste", QT_TR_NOOP("Edit: Paste,"), INVIS_SHRT, - Qt::CTRL + Qt::Key_V + Qt::CTRL + Qt::Key_V, + QT_TR_NOOP("Paste"), + QT_TR_NOOP("Paste"), + ":/xpm/editpaste.xpm" ), Shortcut( "delete", -- cgit v1.2.3