From 93d8aaba7304ed9287da7f997da3a34df733f59d Mon Sep 17 00:00:00 2001 From: Matthias Neeracher Date: Sat, 30 Dec 2006 09:57:40 +0000 Subject: [PATCH] Model, input, display repeats & endings --- English.lproj/MainMenu.nib/classes.nib | 2 + English.lproj/MainMenu.nib/info.nib | 8 +- English.lproj/MainMenu.nib/keyedobjects.nib | Bin 22738 -> 23357 bytes English.lproj/VLDocument.nib/classes.nib | 25 +- English.lproj/VLDocument.nib/info.nib | 8 +- English.lproj/VLDocument.nib/keyedobjects.nib | Bin 22153 -> 38743 bytes Sources/VLDocument.h | 3 + Sources/VLDocument.mm | 11 + Sources/VLModel.cpp | 274 +++++++++++++++++- Sources/VLModel.h | 26 ++ Sources/VLSheetView.h | 8 + Sources/VLSheetView.mm | 135 ++++++--- Sources/VLSheetViewChords.mm | 1 + Sources/VLSheetViewLyrics.mm | 1 + Sources/VLSheetViewNotes.mm | 1 + Sources/VLSheetViewSelection.h | 27 ++ Sources/VLSheetViewSelection.mm | 188 ++++++++++++ Vocalese.xcodeproj/project.pbxproj | 40 +-- 18 files changed, 683 insertions(+), 75 deletions(-) create mode 100644 Sources/VLSheetViewSelection.h create mode 100644 Sources/VLSheetViewSelection.mm diff --git a/English.lproj/MainMenu.nib/classes.nib b/English.lproj/MainMenu.nib/classes.nib index ebcef93..8bb0c8d 100644 --- a/English.lproj/MainMenu.nib/classes.nib +++ b/English.lproj/MainMenu.nib/classes.nib @@ -2,6 +2,8 @@ IBClasses = ( { ACTIONS = { + editRepeat = id; + editRepeatEnding = id; zoomIn = id; zoomOut = id; zoomToActualSize = id; diff --git a/English.lproj/MainMenu.nib/info.nib b/English.lproj/MainMenu.nib/info.nib index de6a62d..250a48c 100644 --- a/English.lproj/MainMenu.nib/info.nib +++ b/English.lproj/MainMenu.nib/info.nib @@ -3,20 +3,20 @@ IBDocumentLocation - 62 66 356 240 0 0 1024 746 + 86 70 356 240 0 0 1280 778 IBEditorPositions 29 - 232 309 349 44 0 0 1024 746 + 320 324 349 44 0 0 1280 778 IBFramework Version - 453.0 + 454.0 IBOpenObjects 217 29 IBSystem Version - 9A300 + 9A321 diff --git a/English.lproj/MainMenu.nib/keyedobjects.nib b/English.lproj/MainMenu.nib/keyedobjects.nib index a8b88f1eebae2e7273f2abf86089804caa7f4665..ded72fefd18f7440994c6e7608981efd50c02d72 100644 GIT binary patch literal 23357 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 literal 22738 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 Vo_4%PMu_7tf7S8V_1pT@{|A5pi~#@u diff --git a/English.lproj/VLDocument.nib/classes.nib b/English.lproj/VLDocument.nib/classes.nib index 15afee3..e7dc315 100644 --- a/English.lproj/VLDocument.nib/classes.nib +++ b/English.lproj/VLDocument.nib/classes.nib @@ -1,7 +1,14 @@ { IBClasses = ( { - ACTIONS = {engrave = id; showLog = id; showOutput = id; zoomIn = id; zoomOut = id; }; + ACTIONS = { + endRepeatSheet = id; + engrave = id; + showLog = id; + showOutput = id; + zoomIn = id; + zoomOut = id; + }; CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; @@ -21,10 +28,22 @@ SUPERCLASS = NSWindowController; }, { - ACTIONS = {hideFieldEditor = id; setDivisions = id; setKey = id; setTime = id; }; + ACTIONS = { + endRepeatSheet = id; + hideFieldEditor = id; + setDivisions = id; + setKey = id; + setTime = id; + }; CLASS = VLSheetView; LANGUAGE = ObjC; - OUTLETS = {fFieldEditor = id; }; + OUTLETS = { + fEndingMsg = id; + fEndingSheet = id; + fFieldEditor = id; + fRepeatMsg = id; + fRepeatSheet = id; + }; SUPERCLASS = NSView; }, { diff --git a/English.lproj/VLDocument.nib/info.nib b/English.lproj/VLDocument.nib/info.nib index 7bacffc..6d9a89c 100644 --- a/English.lproj/VLDocument.nib/info.nib +++ b/English.lproj/VLDocument.nib/info.nib @@ -3,15 +3,17 @@ IBDocumentLocation - 43 29 356 240 0 0 1280 778 + 372 26 356 240 0 0 1280 778 IBFramework Version - 453.0 + 454.0 IBOpenObjects + 216 + 196 5 144 IBSystem Version - 9A300 + 9A321 diff --git a/English.lproj/VLDocument.nib/keyedobjects.nib b/English.lproj/VLDocument.nib/keyedobjects.nib index 9d7e229844ebfe0c5765bfba46c086e53eba4754..0af9b3da4d2f51c3eb84dbc6099ebdbbfa304c2d 100644 GIT binary patch literal 38743 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 diff --git a/Sources/VLDocument.h b/Sources/VLDocument.h index 475b6d4..65de5e3 100644 --- a/Sources/VLDocument.h +++ b/Sources/VLDocument.h @@ -26,6 +26,7 @@ NSNumber * songTempo; NSString * tmpPath; NSFileWrapper * vcsWrapper; + int repeatVolta; VLSheetWindow * sheetWin; VLLogWindow * logWin; @@ -37,10 +38,12 @@ - (NSNumber *) songKey; - (NSNumber *) songTime; - (NSNumber *) songDivisions; +- (int) repeatVolta; - (void) setKey:(int)key transpose:(BOOL)transpose; - (void) setTimeNum:(int)num denom:(int)denom; - (void) setDivisions:(int)divisions; +- (void) setRepeatVolta:(int)repeatVolta; - (IBAction) engrave:(id)sender; - (IBAction) showOutput:(id)sender; diff --git a/Sources/VLDocument.mm b/Sources/VLDocument.mm index 8f4bdab..03462e6 100644 --- a/Sources/VLDocument.mm +++ b/Sources/VLDocument.mm @@ -72,6 +72,7 @@ logWin = nil; tmpPath = nil; vcsWrapper = nil; + repeatVolta = 2; [self setHasUndoManager:YES]; undo = [[VLKeyValueUndo alloc] initWithOwner:self @@ -217,6 +218,16 @@ [self updateChangeCount:NSChangeDone]; } +- (int) repeatVolta +{ + return repeatVolta; +} + +- (void) setRepeatVolta:(int)volta +{ + repeatVolta = volta; +} + - (NSString *) tmpPath { if (!tmpPath) { diff --git a/Sources/VLModel.cpp b/Sources/VLModel.cpp index 9557de3..ee11bea 100644 --- a/Sources/VLModel.cpp +++ b/Sources/VLModel.cpp @@ -1153,6 +1153,8 @@ bool VLSong::PrevWord(size_t stanza, size_t & measure, VLFraction & at) at = fProperties[meas.fPropIdx].fTime; } } while (measure-- > 0); + + measure = 0; return false; } @@ -1164,7 +1166,6 @@ bool VLSong::NextWord(size_t stanza, size_t & measure, VLFraction & at) VLMeasure & meas = fMeasures[measure]; VLNoteList::iterator note = fMeasures[measure].fMelody.begin(); VLNoteList::iterator end = fMeasures[measure].fMelody.end(); - bool hasWord = false; VLFraction now(0); while (note != meas.fMelody.end()) { @@ -1191,11 +1192,11 @@ std::string VLSong::GetWord(size_t stanza, size_t measure, VLFraction at) do { VLMeasure & meas = fMeasures[measure]; - VLNoteList::iterator note = fMeasures[measure].fMelody.begin(); - VLNoteList::iterator end = fMeasures[measure].fMelody.end(); + VLNoteList::iterator note = meas.fMelody.begin(); + VLNoteList::iterator end = meas.fMelody.end(); VLFraction now(0); - while (note != meas.fMelody.end()) { + while (note != end) { if (now >= at && note->fPitch != VLNote::kNoPitch) { if (word.size()) word += '-'; @@ -1261,3 +1262,268 @@ void VLSong::SetWord(size_t stanza, size_t measure, VLFraction at, std::string w } while (++measure < fMeasures.size()); } +void VLSong::AddRepeat(size_t beginMeasure, size_t endMeasure, int times) +{ + for (size_t r=0; r= endMeasure + ) + if (fRepeats[r].fEndings[0].fEnd == endMeasure) { + // + // Exact match, just change times + // + size_t mask = ((1< times) + for (size_t e=0; e= endMeasure + ) { + fRepeats.erase(fRepeats.begin()+r); + + break; + } +} + +void VLSong::AddEnding(size_t beginMeasure, size_t endMeasure, size_t volta) +{ + for (size_t r=0; r= beginMeasure + ) { + VLRepeat & repeat = fRepeats[r]; + for (size_t e=1; e(fRepeats[r].fEndings[0].fEnd, endMeasure); + fRepeats[r].fEndings.push_back( + VLRepeat::Ending(beginMeasure, endMeasure, volta)); + + return; + } +} + +void VLSong::DelEnding(size_t beginMeasure, size_t endMeasure) +{ + for (size_t r=0; r beginMeasure + ) + for (size_t e=1; e 1 && e == fRepeats[r].fEndings.size()-1) + fRepeats[r].fEndings[0].fEnd = fRepeats[r].fEndings[e].fBegin; + fRepeats[r].fEndings.erase(fRepeats[r].fEndings.begin()+e); + } +} + +bool VLSong::CanBeRepeat(size_t beginMeasure, size_t endMeasure, int * times) +{ + for (size_t r=0; r 1) { + if (fRepeats[r].fEndings[1].fBegin == endMeasure) + return true; + if (fRepeats[r].fEndings[1].fEnd == endMeasure) + return true; + } + } + // + // Look for overlap and reject + // + if (fRepeats[r].fEndings[0].fBegin >= beginMeasure + && fRepeats[r].fEndings[0].fBegin < endMeasure + ) + return false; + if (fRepeats[r].fEndings[0].fEnd > beginMeasure + && fRepeats[r].fEndings[0].fEnd <= endMeasure + ) + return false; + } + // + // Virgin territory, accept + // + if (times) + *times = 2; + return true; +} + +bool VLSong::CanBeEnding(size_t beginMeasure, size_t endMeasure, + size_t * volta, size_t * voltaOK) +{ + for (size_t r=0; r fRepeats[r].fEndings[0].fBegin + && beginMeasure <= fRepeats[r].fEndings[0].fEnd + ) { + // + // Found right repeat + // + VLRepeat & repeat = fRepeats[r]; + + // + // Append new repeat, or carve out from ending + // + if (beginMeasure == repeat.fEndings[0].fEnd) { + for (size_t r2=0; r2= beginMeasure + && fRepeats[r2].fEndings[0].fBegin < endMeasure + ) + return false; // Overlap + if (volta) + *volta = repeat.fEndings[0].fVolta; + if (voltaOK) + *voltaOK = repeat.fEndings[0].fVolta; + + return true; + } else if (repeat.fEndings.size() == 1 + && endMeasure >= repeat.fEndings[0].fEnd + ) { + if (volta) + *volta = repeat.fEndings[0].fVolta; + if (voltaOK) + *voltaOK = repeat.fEndings[0].fVolta; + + return true; + } + // + // Otherwise must match existing + // + for (size_t e=1; e= measure + && fRepeats[r].fEndings.size() > 1 + ) { + *volta = (1<= measure + && fRepeats[r].fEndings.size() > 1 + ) { + size_t volta = (1< fEndings; +}; + struct VLSong { VLSong(); void swap(VLSong & other); std::vector fProperties; std::vector fMeasures; + std::vector fRepeats; + void AddChord(VLChord chord, size_t measure, VLFraction at); void AddNote(VLLyricsNote note, size_t measure, VLFraction at); void DelChord(size_t measure, VLFraction at); void DelNote(size_t measure, VLFraction at); + void AddRepeat(size_t beginMeasure, size_t endMeasure, int times); + void DelRepeat(size_t beginMeasure, size_t endMeasure); + void AddEnding(size_t beginMeasure, size_t endMeasure, size_t volta); + void DelEnding(size_t beginMeasure, size_t endMeasure); + bool CanBeRepeat(size_t beginMeasure, size_t endMeasure, int * times = 0); + bool CanBeEnding(size_t beginMeasure, size_t endMeasure, + size_t * volta = 0, size_t * voltaOK = 0); + bool DoesBeginRepeat(size_t measure) const; + bool DoesEndRepeat(size_t measure, int * times) const; + bool DoesBeginEnding(size_t measure, size_t * volta) const; + bool DoesEndEnding(size_t measure, bool * repeat) const; void Transpose(int semitones); bool FindWord(size_t stanza, size_t & measure, VLFraction & at); diff --git a/Sources/VLSheetView.h b/Sources/VLSheetView.h index 82961ac..c6ae350 100644 --- a/Sources/VLSheetView.h +++ b/Sources/VLSheetView.h @@ -78,14 +78,21 @@ enum VLRecalc { size_t fCursorStanza; int fSelStart; int fSelEnd; + size_t fVolta; + size_t fVoltaOK; IBOutlet id fFieldEditor; + IBOutlet id fRepeatSheet; + IBOutlet id fEndingSheet; + IBOutlet id fRepeatMsg; + IBOutlet id fEndingMsg; } - (IBAction) setKey:(id)sender; - (IBAction) setTime:(id)sender; - (IBAction) setDivisions:(id)sender; - (IBAction) hideFieldEditor:(id)sender; +- (IBAction) endRepeatSheet:(id)sender; - (VLDocument *) document; - (VLSong *) song; @@ -108,6 +115,7 @@ enum VLRecalc { - (VLEditable *) editTarget; - (void) setEditTarget:(VLEditable *)editable; +- (VLRegion) findRegionForEvent:(NSEvent *) event; @end diff --git a/Sources/VLSheetView.mm b/Sources/VLSheetView.mm index 0898999..f44637a 100644 --- a/Sources/VLSheetView.mm +++ b/Sources/VLSheetView.mm @@ -11,6 +11,7 @@ #import "VLSheetViewChords.h" #import "VLSheetViewNotes.h" #import "VLSheetViewLyrics.h" +#import "VLSheetViewSelection.h" #import "VLSoundOut.h" #import "VLDocument.h" @@ -320,14 +321,99 @@ VLMusicElement sSemi2Accidental[12][12] = { // Draw measure lines // [bz setLineWidth:2.0]; - for (int measure = 0; measure<=fMeasPerSystem; ++measure) { + int m = system*fMeasPerSystem; + for (int measure = 0; measure<=fMeasPerSystem; ++measure, ++m) { + const float kDblLineOff = 1.5f; + const float kThick = 2.5f; + const float kThin = 1.0f; + const float kDotOff = 4.5f; + const float kDotRadius = 2.0f; + const float kVoltaTextOff = 7.0f; const float x = fClefKeyW+measure*fMeasureW; const float yy = kSystemY+4.0f*kLineH; - [bz moveToPoint: NSMakePoint(x, kSystemY)]; - [bz lineToPoint: NSMakePoint(x, yy)]; + bool repeat; + int times; + size_t volta; + bool dotsPrecede= measure != 0 && + (song->DoesEndRepeat(m, ×) + || (song->DoesEndEnding(m, &repeat) && repeat)); + bool dotsFollow = measureDoesBeginRepeat(m); + if (!dotsPrecede && !dotsFollow) { + // + // Regular + // + [bz moveToPoint: NSMakePoint(x, kSystemY)]; + [bz lineToPoint: NSMakePoint(x, yy)]; + [bz stroke]; + [bz removeAllPoints]; + } else { + [bz stroke]; + [bz removeAllPoints]; + [bz setLineWidth: dotsFollow ? kThick : kThin]; + [bz moveToPoint: NSMakePoint(x-kDblLineOff, kSystemY)]; + [bz lineToPoint: NSMakePoint(x-kDblLineOff, yy)]; + [bz stroke]; + [bz removeAllPoints]; + [bz setLineWidth: dotsPrecede ? kThick : kThin]; + [bz moveToPoint: NSMakePoint(x+kDblLineOff, kSystemY)]; + [bz lineToPoint: NSMakePoint(x+kDblLineOff, yy)]; + [bz stroke]; + [bz removeAllPoints]; + [bz setLineWidth:2.0]; + if (dotsPrecede) { + [bz appendBezierPathWithOvalInRect: + NSMakeRect(x-kDotOff-kDotRadius, + kSystemY+1.5*kLineH-kDotRadius, + 2.0f*kDotRadius, 2.0f*kDotRadius)]; + [bz appendBezierPathWithOvalInRect: + NSMakeRect(x-kDotOff-kDotRadius, + kSystemY+2.5*kLineH-kDotRadius, + 2.0f*kDotRadius, 2.0f*kDotRadius)]; + } + if (dotsFollow) { + [bz appendBezierPathWithOvalInRect: + NSMakeRect(x+kDotOff-kDotRadius, + kSystemY+1.5*kLineH-kDotRadius, + 2.0f*kDotRadius, 2.0f*kDotRadius)]; + [bz appendBezierPathWithOvalInRect: + NSMakeRect(x+kDotOff-kDotRadius, + kSystemY+2.5*kLineH-kDotRadius, + 2.0f*kDotRadius, 2.0f*kDotRadius)]; + } + [bz fill]; + [bz removeAllPoints]; + } + if (measureDoesBeginEnding(m, &volta)) { + [bz setLineWidth:kThin]; + [bz moveToPoint: NSMakePoint(x+kDblLineOff, yy+0.5f*kLineH)]; + [bz lineToPoint: NSMakePoint(x+kDblLineOff, yy+2.0f*kLineH)]; + [bz lineToPoint: NSMakePoint(x+0.5f*fMeasureW, yy+2.0f*kLineH)]; + [bz stroke]; + [bz removeAllPoints]; + [bz setLineWidth:2.0]; + NSString * vs = nil; + for (size_t v=0; v<8; ++v) + if (volta & (1<DoesEndEnding(m+1, &repeat)) { + [bz setLineWidth:kThin]; + [bz moveToPoint: NSMakePoint(x+0.5f*fMeasureW, yy+2.0f*kLineH)]; + [bz lineToPoint: NSMakePoint(x+fMeasureW-kDblLineOff, yy+2.0f*kLineH)]; + if (repeat) + [bz lineToPoint: NSMakePoint(x+fMeasureW-kDblLineOff, yy+0.5f*kLineH)]; + [bz stroke]; + [bz removeAllPoints]; + [bz setLineWidth:2.0]; + } + } } - [bz stroke]; - [bz removeAllPoints]; // // Draw division lines @@ -701,8 +787,7 @@ static int8_t sSharpAcc[] = { [self editLyrics]; break; case kRegionMeasure: - fSelStart = fSelEnd = fCursorMeasure; - [self setNeedsDisplay:YES]; + [self editSelection]; break; default: break; @@ -714,36 +799,7 @@ static int8_t sSharpAcc[] = { if (fCursorRegion != kRegionMeasure) [super mouseDragged:event]; [self autoscroll:event]; - int prevMeasure = fCursorMeasure; - switch ([self findRegionForEvent:event]) { - case kRegionNote: - case kRegionChord: - case kRegionLyrics: - if (fCursorAt.fNum) - ++fCursorMeasure; - // - // Fall through - // - case kRegionMeasure: - if (fCursorMeasure > fSelEnd) { - fSelEnd = fCursorMeasure; - [self setNeedsDisplay:YES]; - } else if (fCursorMeasure < fSelStart) { - fSelStart = fCursorMeasure; - [self setNeedsDisplay:YES]; - } else if (prevMeasure == fSelEnd && fCursorMeasureprevMeasure) { - fSelStart = fCursorMeasure; - [self setNeedsDisplay:YES]; - } - break; - default: - fCursorMeasure = prevMeasure; - break; - } - fCursorRegion = kRegionMeasure; + [self adjustSelection:event]; } - (void) keyDown:(NSEvent *)event @@ -841,4 +897,9 @@ static int8_t sSharpAcc[] = { [self setNeedsDisplay: YES]; } +- (IBAction)endRepeatSheet:(id)sender +{ + [NSApp endSheet:[sender window] returnCode:[sender tag]]; +} + @end diff --git a/Sources/VLSheetViewChords.mm b/Sources/VLSheetViewChords.mm index 2d4a109..23e1363 100644 --- a/Sources/VLSheetViewChords.mm +++ b/Sources/VLSheetViewChords.mm @@ -9,6 +9,7 @@ #import "VLSheetView.h" #import "VLSheetViewChords.h" #import "VLSheetViewInternal.h" +#import "VLDocument.h" #import "VLModel.h" #import "VLSoundOut.h" diff --git a/Sources/VLSheetViewLyrics.mm b/Sources/VLSheetViewLyrics.mm index 9a16ff2..373de77 100644 --- a/Sources/VLSheetViewLyrics.mm +++ b/Sources/VLSheetViewLyrics.mm @@ -9,6 +9,7 @@ #import "VLSheetView.h" #import "VLSheetViewLyrics.h" #import "VLSheetViewInternal.h" +#import "VLDocument.h" #import "VLModel.h" #import "VLSoundOut.h" diff --git a/Sources/VLSheetViewNotes.mm b/Sources/VLSheetViewNotes.mm index 4a3e1a1..044bc7d 100644 --- a/Sources/VLSheetViewNotes.mm +++ b/Sources/VLSheetViewNotes.mm @@ -9,6 +9,7 @@ #import "VLSheetView.h" #import "VLSheetViewNotes.h" #import "VLSheetViewInternal.h" +#import "VLDocument.h" #import "VLSoundOut.h" #include diff --git a/Sources/VLSheetViewSelection.h b/Sources/VLSheetViewSelection.h new file mode 100644 index 0000000..1dc3c2b --- /dev/null +++ b/Sources/VLSheetViewSelection.h @@ -0,0 +1,27 @@ +// +// VLSheetViewSelection.h +// Vocalese +// +// Created by Matthias Neeracher on 12/28/06. +// Copyright 2006 __MyCompanyName__. All rights reserved. +// + +@interface VLSheetView (Selection) + +- (void)editSelection; +- (void)adjustSelection:(NSEvent *)event; + +- (BOOL)validateUserInterfaceItem:(id)item; +- (IBAction)cut:(id)sender; +- (IBAction)copy:(id)sender; +- (IBAction)paste:(id)sender; +- (IBAction)delete:(id)sender; + +- (IBAction)editRepeat:(id)sender; +- (IBAction)editRepeatEnding:(id)sender; + +@end + +// Local Variables: +// mode:ObjC +// End: diff --git a/Sources/VLSheetViewSelection.mm b/Sources/VLSheetViewSelection.mm new file mode 100644 index 0000000..240b18e --- /dev/null +++ b/Sources/VLSheetViewSelection.mm @@ -0,0 +1,188 @@ +// +// VLSheetViewSelection.mm +// Vocalese +// +// Created by Matthias Neeracher on 12/28/06. +// Copyright 2006 __MyCompanyName__. All rights reserved. +// + +#import "VLSheetView.h" +#import "VLSheetViewSelection.h" +#import "VLDocument.h" + +@implementation VLSheetView (Selection) + +- (void)editSelection +{ + fSelStart = fSelEnd = fCursorMeasure; + [self setNeedsDisplay:YES]; +} + +- (void)adjustSelection:(NSEvent *)event +{ + int prevMeasure = fCursorMeasure; + switch ([self findRegionForEvent:event]) { + case kRegionNote: + case kRegionChord: + case kRegionLyrics: + if (fCursorAt.fNum) + ++fCursorMeasure; + // + // Fall through + // + case kRegionMeasure: + if (fCursorMeasure > fSelEnd) { + fSelEnd = fCursorMeasure; + [self setNeedsDisplay:YES]; + } else if (fCursorMeasure < fSelStart) { + fSelStart = fCursorMeasure; + [self setNeedsDisplay:YES]; + } else if (prevMeasure == fSelEnd && fCursorMeasureprevMeasure) { + fSelStart = fCursorMeasure; + [self setNeedsDisplay:YES]; + } + break; + default: + fCursorMeasure = prevMeasure; + break; + } + fCursorRegion = kRegionMeasure; +} + +- (BOOL)validateUserInterfaceItem:(id) item +{ + SEL action = [item action]; + if (action == @selector(cut:) + || action == @selector(copy:) + || action == @selector(delete:) + ) + return fSelStart < fSelEnd; + else if (action == @selector(editRepeat:)) + return fSelEnd > fSelStart + && [self song]->CanBeRepeat(fSelStart, fSelEnd); + else if (action == @selector(editRepeatEnding:)) + return fSelEnd > fSelStart + && [self song]->CanBeEnding(fSelStart, fSelEnd); + else if (action == @selector(paste:)) + return fSelStart <= fSelEnd; + else + return YES; +} + +- (IBAction)cut:(id)sender +{ +} + +- (IBAction)copy:(id)sender +{ +} + +- (IBAction)paste:(id)sender +{ +} + +- (IBAction)delete:(id)sender +{ +} + +- (IBAction)editRepeat:(id)sender +{ + int volta; + [self song]->CanBeRepeat(fSelStart, fSelEnd, &volta); + + [fRepeatMsg setStringValue: + [NSString stringWithFormat:@"Repeat measures %d through %d", + fSelStart+1, fSelEnd]]; + [NSApp beginSheet:fRepeatSheet modalForWindow:[self window] + modalDelegate:self + didEndSelector:@selector(didEndRepeatSheet:returnCode:contextInfo:) + contextInfo:nil]; +} + +- (void)didEndRepeatSheet:(NSWindow *)sheet returnCode:(int)returnCode + contextInfo:(void *)ctx +{ + switch (returnCode) { + case NSAlertFirstButtonReturn: + [[self document] willChangeSong]; + [self song]->AddRepeat(fSelStart, fSelEnd, [[self document] repeatVolta]); + [self setNeedsDisplay:YES]; + [[self document] didChangeSong]; + break; + case NSAlertThirdButtonReturn: + [[self document] willChangeSong]; + [self song]->DelRepeat(fSelStart, fSelEnd); + [[self document] didChangeSong]; + [self setNeedsDisplay:YES]; + break; + default: + break; + } + [sheet orderOut:self]; +} + +- (IBAction)editRepeatEnding:(id)sender +{ + [self song]->CanBeEnding(fSelStart, fSelEnd, &fVolta, &fVoltaOK); + + [fEndingMsg setStringValue: + [NSString stringWithFormat:@"Ending in measures %d through %d applies to repeats:", + fSelStart+1, fSelEnd]]; + + [NSApp beginSheet:fEndingSheet modalForWindow:[self window] + modalDelegate:self + didEndSelector:@selector(didEndEndingSheet:returnCode:contextInfo:) + contextInfo:nil]; +} + +- (void)didEndEndingSheet:(NSWindow *)sheet returnCode:(int)returnCode + contextInfo:(void *)ctx +{ + switch (returnCode) { + case NSAlertFirstButtonReturn: + [[self document] willChangeSong]; + [self song]->AddEnding(fSelStart, fSelEnd, fVolta); + [self setNeedsDisplay:YES]; + [[self document] didChangeSong]; + break; + case NSAlertThirdButtonReturn: + [[self document] willChangeSong]; + [self song]->DelEnding(fSelStart, fSelEnd); + [[self document] didChangeSong]; + [self setNeedsDisplay:YES]; + break; + default: + break; + } + [sheet orderOut:self]; +} + +// +// Data source for endings +// +- (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView +{ + return 1; +} + +- (id)tableView:(NSTableView*)tv objectValueForTableColumn:(NSTableColumn *)col + row:(NSInteger)rowIndex +{ + int mask = [[col identifier] intValue]; + return (fVoltaOK & mask) ? [NSNumber numberWithBool:(fVolta & mask)] : nil; +} + +- (void)tableView:(NSTableView *)tv setObjectValue:(id)val forTableColumn:(NSTableColumn *)col row:(NSInteger)rowIndex +{ + int mask = [[col identifier] intValue]; + + if ([val boolValue]) + fVolta |= mask; + else + fVolta &= ~mask; +} + +@end diff --git a/Vocalese.xcodeproj/project.pbxproj b/Vocalese.xcodeproj/project.pbxproj index 1a6659e..d5d7e1f 100644 --- a/Vocalese.xcodeproj/project.pbxproj +++ b/Vocalese.xcodeproj/project.pbxproj @@ -8,8 +8,6 @@ /* Begin PBXBuildFile section */ 8D15AC2C0486D014006FF6A4 /* Credits.rtf in Resources */ = {isa = PBXBuildFile; fileRef = 2A37F4B9FDCFA73011CA2CEA /* Credits.rtf */; }; - 8D15AC2D0486D014006FF6A4 /* MainMenu.nib in Resources */ = {isa = PBXBuildFile; fileRef = 2A37F4B6FDCFA73011CA2CEA /* MainMenu.nib */; }; - 8D15AC2E0486D014006FF6A4 /* VLDocument.nib in Resources */ = {isa = PBXBuildFile; fileRef = 2A37F4B4FDCFA73011CA2CEA /* VLDocument.nib */; }; 8D15AC2F0486D014006FF6A4 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165FFE840EACC02AAC07 /* InfoPlist.strings */; }; 8D15AC310486D014006FF6A4 /* VLDocument.mm in Sources */ = {isa = PBXBuildFile; fileRef = 2A37F4ACFDCFA73011CA2CEA /* VLDocument.mm */; settings = {ATTRIBUTES = (); }; }; 8D15AC320486D014006FF6A4 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A37F4B0FDCFA73011CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; }; @@ -40,6 +38,8 @@ 95498DBD0AE3812F006B5F81 /* VLSoundSched.mm in Sources */ = {isa = PBXBuildFile; fileRef = 95498DBC0AE3812F006B5F81 /* VLSoundSched.mm */; }; 954BBD860AEDDE5300BBFD5F /* VLAppController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 954BBD850AEDDE5300BBFD5F /* VLAppController.mm */; }; 954BBD9A0AEDE81500BBFD5F /* VLPitchTransformer.mm in Sources */ = {isa = PBXBuildFile; fileRef = 954BBD990AEDE81500BBFD5F /* VLPitchTransformer.mm */; }; + 954DD4B90B444B220056C504 /* VLSheetViewSelection.h in Copy MMA Library */ = {isa = PBXBuildFile; fileRef = 954DD4B70B444B220056C504 /* VLSheetViewSelection.h */; }; + 954DD4E60B44E67F0056C504 /* VLSheetViewSelection.mm in Sources */ = {isa = PBXBuildFile; fileRef = 954DD4E50B44E67F0056C504 /* VLSheetViewSelection.mm */; }; 955CBA4E0B2366DD001CF4A1 /* VLKeyValueUndo.h in Copy MMA Library */ = {isa = PBXBuildFile; fileRef = 955CBA4C0B2366DD001CF4A1 /* VLKeyValueUndo.h */; }; 955CBA4F0B2366DD001CF4A1 /* VLKeyValueUndo.mm in Sources */ = {isa = PBXBuildFile; fileRef = 955CBA4D0B2366DD001CF4A1 /* VLKeyValueUndo.mm */; }; 955E58E5095658AB0045FDA5 /* VLModel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 955E58E4095658AB0045FDA5 /* VLModel.cpp */; }; @@ -51,6 +51,8 @@ 9593E4E90AE0ED1F00035816 /* vocalese.icns in Resources */ = {isa = PBXBuildFile; fileRef = 9593E4E70AE0ED1F00035816 /* vocalese.icns */; }; 959408AD096922EA007CCCF8 /* TVLEdit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 959408AC096922EA007CCCF8 /* TVLEdit.cpp */; }; 959408AE096922F7007CCCF8 /* VLModel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 955E58E4095658AB0045FDA5 /* VLModel.cpp */; }; + 959420EB0B44E769006BC62C /* MainMenu.nib in Resources */ = {isa = PBXBuildFile; fileRef = 954DD4DA0B44E6000056C504 /* MainMenu.nib */; }; + 959420EC0B44E77A006BC62C /* VLDocument.nib in Resources */ = {isa = PBXBuildFile; fileRef = 954DD4DF0B44E61E0056C504 /* VLDocument.nib */; }; 95A1C37C0AF1D4370076597D /* Quartz.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 95A1C37B0AF1D4370076597D /* Quartz.framework */; }; 95A1C3860AF2ACE20076597D /* VLSheetWindow.mm in Sources */ = {isa = PBXBuildFile; fileRef = 95A1C3850AF2ACE20076597D /* VLSheetWindow.mm */; }; 95B3E1A70960E58B000E9C0D /* Music in Resources */ = {isa = PBXBuildFile; fileRef = 95B3E1980960E58B000E9C0D /* Music */; }; @@ -109,6 +111,7 @@ 95009B650B0ED18700EB33A4 /* CAMath.h in Copy MMA Library */, 95E299BF0B2006F5001977D2 /* VLSheetViewLyrics.h in Copy MMA Library */, 955CBA4E0B2366DD001CF4A1 /* VLKeyValueUndo.h in Copy MMA Library */, + 954DD4B90B444B220056C504 /* VLSheetViewSelection.h in Copy MMA Library */, ); name = "Copy MMA Library"; runOnlyForDeploymentPostprocessing = 0; @@ -135,8 +138,6 @@ 2A37F4ACFDCFA73011CA2CEA /* VLDocument.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = VLDocument.mm; path = Sources/VLDocument.mm; sourceTree = ""; }; 2A37F4AEFDCFA73011CA2CEA /* VLDocument.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLDocument.h; path = Sources/VLDocument.h; sourceTree = ""; }; 2A37F4B0FDCFA73011CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = Sources/main.m; sourceTree = ""; }; - 2A37F4B5FDCFA73011CA2CEA /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/VLDocument.nib; sourceTree = ""; }; - 2A37F4B7FDCFA73011CA2CEA /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/MainMenu.nib; sourceTree = ""; }; 2A37F4BAFDCFA73011CA2CEA /* English */ = {isa = PBXFileReference; lastKnownFileType = text.rtf; name = English; path = English.lproj/Credits.rtf; sourceTree = ""; }; 2A37F4C4FDCFA73011CA2CEA /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = /System/Library/Frameworks/AppKit.framework; sourceTree = ""; }; 2A37F4C5FDCFA73011CA2CEA /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = /System/Library/Frameworks/Foundation.framework; sourceTree = ""; }; @@ -170,6 +171,10 @@ 954BBD850AEDDE5300BBFD5F /* VLAppController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = VLAppController.mm; path = Sources/VLAppController.mm; sourceTree = ""; }; 954BBD980AEDE81500BBFD5F /* VLPitchTransformer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLPitchTransformer.h; path = Sources/VLPitchTransformer.h; sourceTree = ""; }; 954BBD990AEDE81500BBFD5F /* VLPitchTransformer.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = VLPitchTransformer.mm; path = Sources/VLPitchTransformer.mm; sourceTree = ""; }; + 954DD4B70B444B220056C504 /* VLSheetViewSelection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLSheetViewSelection.h; path = Sources/VLSheetViewSelection.h; sourceTree = ""; }; + 954DD4DA0B44E6000056C504 /* MainMenu.nib */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = MainMenu.nib; path = English.lproj/MainMenu.nib; sourceTree = ""; }; + 954DD4DF0B44E61E0056C504 /* VLDocument.nib */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = VLDocument.nib; path = English.lproj/VLDocument.nib; sourceTree = ""; }; + 954DD4E50B44E67F0056C504 /* VLSheetViewSelection.mm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.objcpp; name = VLSheetViewSelection.mm; path = Sources/VLSheetViewSelection.mm; sourceTree = ""; }; 955CBA4C0B2366DD001CF4A1 /* VLKeyValueUndo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLKeyValueUndo.h; path = Sources/VLKeyValueUndo.h; sourceTree = ""; }; 955CBA4D0B2366DD001CF4A1 /* VLKeyValueUndo.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = VLKeyValueUndo.mm; path = Sources/VLKeyValueUndo.mm; sourceTree = ""; }; 955E58E3095658AB0045FDA5 /* VLModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLModel.h; path = Sources/VLModel.h; sourceTree = ""; }; @@ -363,6 +368,8 @@ 954BBD990AEDE81500BBFD5F /* VLPitchTransformer.mm */, 955CBA4C0B2366DD001CF4A1 /* VLKeyValueUndo.h */, 955CBA4D0B2366DD001CF4A1 /* VLKeyValueUndo.mm */, + 954DD4B70B444B220056C504 /* VLSheetViewSelection.h */, + 954DD4E50B44E67F0056C504 /* VLSheetViewSelection.mm */, ); name = Classes; sourceTree = ""; @@ -379,6 +386,8 @@ 2A37F4B8FDCFA73011CA2CEA /* Resources */ = { isa = PBXGroup; children = ( + 954DD4DF0B44E61E0056C504 /* VLDocument.nib */, + 954DD4DA0B44E6000056C504 /* MainMenu.nib */, 95FC66BC0AF0A4D4003D9C11 /* console.icns */, 95FC66BD0AF0A4D4003D9C11 /* music.tiff */, 95FC66BE0AF0A4D4003D9C11 /* nextpage.tiff */, @@ -394,8 +403,6 @@ 95F5F51E0ADCCFBB003980B2 /* DTD */, 95B3E1980960E58B000E9C0D /* Music */, 2A37F4B9FDCFA73011CA2CEA /* Credits.rtf */, - 2A37F4B6FDCFA73011CA2CEA /* MainMenu.nib */, - 2A37F4B4FDCFA73011CA2CEA /* VLDocument.nib */, 8D15AC360486D014006FF6A4 /* Info.plist */, 089C165FFE840EACC02AAC07 /* InfoPlist.strings */, ); @@ -575,8 +582,6 @@ buildActionMask = 2147483647; files = ( 8D15AC2C0486D014006FF6A4 /* Credits.rtf in Resources */, - 8D15AC2D0486D014006FF6A4 /* MainMenu.nib in Resources */, - 8D15AC2E0486D014006FF6A4 /* VLDocument.nib in Resources */, 8D15AC2F0486D014006FF6A4 /* InfoPlist.strings in Resources */, 95B3E1A70960E58B000E9C0D /* Music in Resources */, 95F5F5340ADCCFBB003980B2 /* DTD in Resources */, @@ -592,6 +597,8 @@ 95FC66C70AF0A4D5003D9C11 /* run.icns in Resources */, 95FC66C80AF0A4D5003D9C11 /* zoomin.tiff in Resources */, 95FC66C90AF0A4D5003D9C11 /* zoomout.tiff in Resources */, + 959420EB0B44E769006BC62C /* MainMenu.nib in Resources */, + 959420EC0B44E77A006BC62C /* VLDocument.nib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -642,6 +649,7 @@ 95009B500B0ED0BB00EB33A4 /* CADebugMacros.cpp in Sources */, 95E299C00B2006F5001977D2 /* VLSheetViewLyrics.mm in Sources */, 955CBA4F0B2366DD001CF4A1 /* VLKeyValueUndo.mm in Sources */, + 954DD4E60B44E67F0056C504 /* VLSheetViewSelection.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -700,22 +708,6 @@ name = InfoPlist.strings; sourceTree = ""; }; - 2A37F4B4FDCFA73011CA2CEA /* VLDocument.nib */ = { - isa = PBXVariantGroup; - children = ( - 2A37F4B5FDCFA73011CA2CEA /* English */, - ); - name = VLDocument.nib; - sourceTree = ""; - }; - 2A37F4B6FDCFA73011CA2CEA /* MainMenu.nib */ = { - isa = PBXVariantGroup; - children = ( - 2A37F4B7FDCFA73011CA2CEA /* English */, - ); - name = MainMenu.nib; - sourceTree = ""; - }; 2A37F4B9FDCFA73011CA2CEA /* Credits.rtf */ = { isa = PBXVariantGroup; children = (