summaryrefslogtreecommitdiff
path: root/muse2/muse/structure.cpp
diff options
context:
space:
mode:
authorFlorian Jung <flo@windfisch.org>2011-08-31 20:15:13 +0000
committerFlorian Jung <flo@windfisch.org>2011-08-31 20:15:13 +0000
commite64c6677de790368781f7d9f1ba1c98bcfc521d2 (patch)
tree6b4d788a846b021e13ee4875d43c4604965943ab /muse2/muse/structure.cpp
parente6b32e0c06254a99b09133b39e4f7c06bd9ec6ed (diff)
structure operations operate on selected tracks, not on non-muted tracks
fixed infinite recursion bug in global operations
Diffstat (limited to 'muse2/muse/structure.cpp')
-rw-r--r--muse2/muse/structure.cpp33
1 files changed, 28 insertions, 5 deletions
diff --git a/muse2/muse/structure.cpp b/muse2/muse/structure.cpp
index 53180ddd..1fb1668d 100644
--- a/muse2/muse/structure.cpp
+++ b/muse2/muse/structure.cpp
@@ -126,10 +126,17 @@ void globalCut()
Undo operations;
TrackList* tracks = song->tracks();
+ bool at_least_one_selected=false;
+
+ for (iTrack it = tracks->begin(); it != tracks->end(); ++it)
+ if ( (*it)->selected() ) {
+ at_least_one_selected=true;
+ break;
+ }
for (iTrack it = tracks->begin(); it != tracks->end(); ++it) {
MidiTrack* track = dynamic_cast<MidiTrack*>(*it);
- if (track == 0 || track->mute())
+ if (track == 0 || (at_least_one_selected && !track->selected()))
continue;
PartList* pl = track->parts();
for (iPart p = pl->begin(); p != pl->end(); ++p) {
@@ -221,22 +228,30 @@ void globalCut()
void globalInsert()
{
- Undo operations=movePartsTotheRight(song->lpos(), song->rpos()-song->lpos());
+ Undo operations=movePartsTotheRight(song->lpos(), song->rpos()-song->lpos(), true);
song->applyOperationGroup(operations);
}
-Undo movePartsTotheRight(unsigned int startTicks, int moveTicks)
+Undo movePartsTotheRight(unsigned int startTicks, int moveTicks, bool only_selected)
{
if (moveTicks<=0)
return Undo();
Undo operations;
TrackList* tracks = song->tracks();
+ bool at_least_one_selected=false;
+
+ for (iTrack it = tracks->begin(); it != tracks->end(); ++it)
+ if ( (*it)->selected() ) {
+ at_least_one_selected=true;
+ break;
+ }
+
for (iTrack it = tracks->begin(); it != tracks->end(); ++it) {
MidiTrack* track = dynamic_cast<MidiTrack*>(*it);
- if (track == 0 || track->mute())
+ if (track == 0 || (only_selected && at_least_one_selected && !track->selected()))
continue;
PartList* pl = track->parts();
for (riPart p = pl->rbegin(); p != pl->rend(); ++p) {
@@ -285,10 +300,18 @@ void globalSplit()
int pos = song->cpos();
Undo operations;
TrackList* tracks = song->tracks();
+ bool at_least_one_selected=false;
+
+ for (iTrack it = tracks->begin(); it != tracks->end(); ++it)
+ if ( (*it)->selected() ) {
+ at_least_one_selected=true;
+ break;
+ }
+
for (iTrack it = tracks->begin(); it != tracks->end(); ++it) {
Track* track = *it;
- if (track == 0 || track->mute())
+ if (track == 0 || (at_least_one_selected && !track->selected()))
continue;
PartList* pl = track->parts();