リビジョン | 195 (tree) |
---|---|
日時 | 2020-03-29 20:19:06 |
作者 | toshinagata1964 |
Handling of editing range is improved (especially empty time range is selected in TimeChartView)
@@ -67,7 +67,6 @@ | ||
67 | 67 | |
68 | 68 | // Editing range |
69 | 69 | MDTickType startEditingRange, endEditingRange; |
70 | - BOOL needsUpdateEditingRange; | |
71 | 70 | |
72 | 71 | // Selection stack (for undo/redo selection) |
73 | 72 | NSMutableArray *selectionStack; |
@@ -100,6 +99,7 @@ | ||
100 | 99 | - (NSArray *)getDestinationNames; |
101 | 100 | |
102 | 101 | - (void)enqueueTrackModifiedNotification: (int32_t)trackNo; |
102 | +- (void)enqueueTrackAttributeChangedNotification: (int32_t)trackNo; | |
103 | 103 | - (void)postTrackModifiedNotification: (NSNotification *)notification; |
104 | 104 | - (void)postPlayPositionNotification: (MDTickType)tick; |
105 | 105 | //- (void)postSelectionDidChangeNotification: (int32_t)trackNo selectionChange: (IntGroupObject *)set sender: (id)sender; |
@@ -164,7 +164,6 @@ | ||
164 | 164 | - (void)trackDeleted: (NSNotification *)notification; |
165 | 165 | - (void)documentSelectionDidChange: (NSNotification *)notification; |
166 | 166 | |
167 | -//- (void)setNeedsUpdateEditingRange: (BOOL)flag; | |
168 | 167 | - (void)getEditingRangeStart: (MDTickType *)startTick end: (MDTickType *)endTick; |
169 | 168 | - (void)setEditingRangeStart: (MDTickType)startTick end: (MDTickType)endTick; |
170 | 169 | - (void)getSelectionStartTick: (MDTickType *)startTickPtr endTick: (MDTickType *)endTickPtr editableTracksOnly: (BOOL)flag; |
@@ -103,7 +103,6 @@ | ||
103 | 103 | for (i = 0; i < [myMIDISequence trackCount]; i++) { |
104 | 104 | [selections addObject: [[[MDSelectionObject allocWithZone: [self zone]] init] autorelease]]; |
105 | 105 | } |
106 | - // [self setNeedsUpdateEditingRange: YES]; | |
107 | 106 | [[NSNotificationCenter defaultCenter] |
108 | 107 | addObserver: self |
109 | 108 | selector: @selector(selectionWillChange:) |
@@ -568,7 +567,7 @@ | ||
568 | 567 | MDTrackSetExtraInfo(tp, "color", newValue); |
569 | 568 | free(newValue); |
570 | 569 | } |
571 | - [self enqueueTrackModifiedNotification: track]; | |
570 | + [self enqueueTrackAttributeChangedNotification: track]; | |
572 | 571 | } |
573 | 572 | |
574 | 573 | + (NSColor *)colorForEditingRange |
@@ -734,12 +733,14 @@ | ||
734 | 733 | } |
735 | 734 | } |
736 | 735 | |
737 | -- (void)enqueueTrackModifiedNotification: (int32_t)trackNo | |
736 | +- (void)enqueueTrackModifiedNotification: (int32_t)trackNo withEventEdited: (BOOL)eventEdited | |
738 | 737 | { |
739 | 738 | int i; |
740 | 739 | |
741 | 740 | /* Calibrators should be reset */ |
742 | - MDSequenceResetCalibrators([myMIDISequence mySequence]); | |
741 | + if (eventEdited) { | |
742 | + MDSequenceResetCalibrators([myMIDISequence mySequence]); | |
743 | + } | |
743 | 744 | |
744 | 745 | /* Add a track to the modifiedTracks array (if not already present) */ |
745 | 746 | for (i = (int)[modifiedTracks count] - 1; i >= 0; i--) { |
@@ -762,12 +763,28 @@ | ||
762 | 763 | forModes: nil]; |
763 | 764 | |
764 | 765 | /* Update editing range */ |
765 | - [self updateEditingRange]; | |
766 | - | |
766 | + if (eventEdited) { | |
767 | + /* Clear the cached tick range in the selection */ | |
768 | + MDSelectionObject *selection = (MDSelectionObject *)[selections objectAtIndex: trackNo]; | |
769 | + selection->startTick = kMDNegativeTick; | |
770 | + selection->endTick = kMDNegativeTick; | |
771 | + [self updateEditingRange]; | |
772 | + } | |
773 | + | |
767 | 774 | /* Any track modification should clear the selection undo stack */ |
768 | 775 | [self enqueueSelectionUndoerWithKey: sStackShouldBeCleared value: sStackShouldBeCleared]; |
769 | 776 | } |
770 | 777 | |
778 | +- (void)enqueueTrackModifiedNotification: (int32_t)trackNo | |
779 | +{ | |
780 | + [self enqueueTrackModifiedNotification:trackNo withEventEdited:YES]; | |
781 | +} | |
782 | + | |
783 | +- (void)enqueueTrackAttributeChangedNotification: (int32_t)trackNo | |
784 | +{ | |
785 | + [self enqueueTrackModifiedNotification:trackNo withEventEdited:NO]; | |
786 | +} | |
787 | + | |
771 | 788 | - (void)postPlayPositionNotification: (MDTickType)tick |
772 | 789 | { |
773 | 790 | float beat; |
@@ -1061,7 +1078,7 @@ | ||
1061 | 1078 | // Probably we do not want undo registration |
1062 | 1079 | // [[[self undoManager] prepareWithInvocationTarget: self] |
1063 | 1080 | // setTrackAttribute: oldAttr forTrack: trackNo]; |
1064 | - [self enqueueTrackModifiedNotification: trackNo]; | |
1081 | + [self enqueueTrackAttributeChangedNotification: trackNo]; | |
1065 | 1082 | } |
1066 | 1083 | } |
1067 | 1084 | } |
@@ -1080,12 +1097,7 @@ | ||
1080 | 1097 | { |
1081 | 1098 | MDSequence *sequence = [[self myMIDISequence] mySequence]; |
1082 | 1099 | if (sequence != NULL) { |
1083 | - // NSData *attr = [self getTrackAttributes]; | |
1084 | 1100 | if (MDSequenceSetRecordFlagOnTrack(sequence, trackNo, flag)) { |
1085 | - // [[[self undoManager] prepareWithInvocationTarget: self] | |
1086 | - // setTrackAttributes: attr]; | |
1087 | - // [self enqueueTrackModifiedNotification: trackNo]; | |
1088 | - // [self updateTrackDestinations]; | |
1089 | 1101 | return YES; |
1090 | 1102 | } |
1091 | 1103 | } |
@@ -1160,7 +1172,7 @@ | ||
1160 | 1172 | [[[self undoManager] prepareWithInvocationTarget: self] |
1161 | 1173 | changeDevice: [NSString stringWithUTF8String: oldname] forTrack: trackNo]; |
1162 | 1174 | [self updateDeviceNumberForTrack: trackNo]; |
1163 | - [self enqueueTrackModifiedNotification: trackNo]; | |
1175 | + [self enqueueTrackAttributeChangedNotification: trackNo]; | |
1164 | 1176 | return YES; |
1165 | 1177 | } else return NO; |
1166 | 1178 | } |
@@ -1209,7 +1221,7 @@ | ||
1209 | 1221 | MDTrackSetTrackChannel(track, channel); |
1210 | 1222 | [[[self undoManager] prepareWithInvocationTarget: self] |
1211 | 1223 | changeTrackChannel: oldchannel forTrack: trackNo]; |
1212 | - [self enqueueTrackModifiedNotification: trackNo]; | |
1224 | + [self enqueueTrackAttributeChangedNotification: trackNo]; | |
1213 | 1225 | [self updateTrackDestinations]; |
1214 | 1226 | return YES; |
1215 | 1227 | } |
@@ -1229,7 +1241,7 @@ | ||
1229 | 1241 | MDTrackSetName(track, name); |
1230 | 1242 | [[[self undoManager] prepareWithInvocationTarget: self] |
1231 | 1243 | changeTrackName: [NSString stringWithUTF8String: oldname] forTrack: trackNo]; |
1232 | - [self enqueueTrackModifiedNotification: trackNo]; | |
1244 | + [self enqueueTrackAttributeChangedNotification: trackNo]; | |
1233 | 1245 | return YES; |
1234 | 1246 | } |
1235 | 1247 | return NO; |
@@ -2455,15 +2467,8 @@ | ||
2455 | 2467 | |
2456 | 2468 | #pragma mark ====== Editing range ====== |
2457 | 2469 | |
2458 | -//- (void)setNeedsUpdateEditingRange: (BOOL)flag | |
2459 | -//{ | |
2460 | -// needsUpdateEditingRange = YES; | |
2461 | -//} | |
2462 | - | |
2463 | 2470 | - (void)getEditingRangeStart: (MDTickType *)startTick end: (MDTickType *)endTick |
2464 | 2471 | { |
2465 | -// if (needsUpdateEditingRange) | |
2466 | -// [self updateEditingRange]; | |
2467 | 2472 | *startTick = startEditingRange; |
2468 | 2473 | *endTick = endEditingRange; |
2469 | 2474 | } |
@@ -2482,8 +2487,6 @@ | ||
2482 | 2487 | [self enqueueSelectionUndoerWithKey: sEditingRangeKey value: [[[MDTickRangeObject alloc] initWithStartTick: startEditingRange endTick: endEditingRange] autorelease]]; |
2483 | 2488 | startEditingRange = startTick; |
2484 | 2489 | endEditingRange = endTick; |
2485 | -// needsUpdateEditingRange = NO; | |
2486 | -// [self postEditingRangeDidChangeNotification]; | |
2487 | 2490 | } |
2488 | 2491 | |
2489 | 2492 | #pragma mark ====== Selection ====== |
@@ -2493,24 +2496,11 @@ | ||
2493 | 2496 | |
2494 | 2497 | - (BOOL)setSelection: (MDSelectionObject *)set inTrack: (int32_t)trackNo sender: (id)sender |
2495 | 2498 | { |
2496 | -/* MDSelectionObject *diffSet = [[[MDSelectionObject allocWithZone: [self zone]] init] autorelease]; */ | |
2497 | 2499 | MDSelectionObject *oldSet = (MDSelectionObject *)[[[selections objectAtIndex: trackNo] retain] autorelease]; |
2498 | 2500 | |
2499 | 2501 | [selections replaceObjectAtIndex: trackNo withObject: set]; |
2500 | 2502 | [self enqueueSelectionUndoerWithKey: [NSNumber numberWithInt: (int)trackNo] value: oldSet]; |
2501 | 2503 | return YES; |
2502 | -/* MDStatus sts = IntGroupXor([oldSet pointSet], [set pointSet], [diffSet pointSet]); | |
2503 | - if (sts == kMDNoError) { | |
2504 | - [selections replaceObjectAtIndex: trackNo withObject: set]; | |
2505 | -#if DEBUG | |
2506 | - if (gMDVerbose > 0) | |
2507 | - IntGroupDump([set pointSet]); | |
2508 | -#endif | |
2509 | - [self setNeedsUpdateEditingRange: YES]; | |
2510 | - [self postSelectionDidChangeNotification: trackNo selectionChange: diffSet sender: sender]; | |
2511 | - [self postEditingRangeDidChangeNotification]; | |
2512 | - return YES; | |
2513 | - } else return NO; */ | |
2514 | 2504 | } |
2515 | 2505 | |
2516 | 2506 | - (BOOL)toggleSelection: (MDSelectionObject *)pointSet inTrack: (int32_t)trackNo sender: (id)sender |
@@ -2519,10 +2509,6 @@ | ||
2519 | 2509 | MDSelectionObject *oldSet = (MDSelectionObject *)[[[selections objectAtIndex: trackNo] retain] autorelease]; |
2520 | 2510 | MDStatus sts = IntGroupXor([oldSet pointSet], [pointSet pointSet], [newSet pointSet]); |
2521 | 2511 | if (sts == kMDNoError) { |
2522 | - /* Register undo action */ | |
2523 | - /* [[[self undoManager] prepareWithInvocationTarget: self] | |
2524 | - toggleSelection: pointSet inTrack: trackNo sender: self]; */ | |
2525 | - /* Do set selection */ | |
2526 | 2512 | [selections replaceObjectAtIndex: trackNo withObject: newSet]; |
2527 | 2513 | /* For debug */ |
2528 | 2514 | #if DEBUG |
@@ -2530,12 +2516,6 @@ | ||
2530 | 2516 | IntGroupDump([newSet pointSet]); |
2531 | 2517 | #endif |
2532 | 2518 | [self enqueueSelectionUndoerWithKey: [NSNumber numberWithInt: (int)trackNo] value: oldSet]; |
2533 | - | |
2534 | - /* Update editing range */ | |
2535 | - // [self setNeedsUpdateEditingRange: YES]; | |
2536 | - /* Post notification */ | |
2537 | - // [self postSelectionDidChangeNotification: trackNo selectionChange: pointSet sender: sender]; | |
2538 | - // [self postEditingRangeDidChangeNotification]; | |
2539 | 2519 | return YES; |
2540 | 2520 | } else return NO; |
2541 | 2521 | } |
@@ -510,11 +510,7 @@ | ||
510 | 510 | if (IntGroupAdd(pset, pos1, pos2 - pos1) != kMDNoError) |
511 | 511 | break; |
512 | 512 | } |
513 | - /* startTick and endTick are set in the selection object | |
514 | - (even if there are no events in between) */ | |
515 | 513 | obj = [[MDSelectionObject allocWithZone: [self zone]] initWithMDPointSet: pset]; |
516 | - obj->startTick = tick1; | |
517 | - obj->endTick = tick2; | |
518 | 514 | obj->track = track; |
519 | 515 | if (shiftDown) { |
520 | 516 | [document toggleSelection: obj inTrack: trackNo sender: self]; |