From 0f8c9ddb6b9e692d7466384a2a4ee12e29b7ef7b Mon Sep 17 00:00:00 2001 From: plaques Date: Fri, 2 Jan 2015 00:52:02 -0500 Subject: [PATCH 01/28] OSX 10.10 Fixes --- Controller Classes/EndpointTableDataSource.h | 2 +- Controller Classes/EndpointTableDataSource.m | 37 +- Controller Classes/PatchTableDataSource.h | 2 +- Controller Classes/PatchbayDocument.h | 6 +- Controller Classes/PatchbayDocument.m | 56 +- English.lproj/MainMenu.nib/classes.nib | 36 - English.lproj/MainMenu.nib/designable.nib | 224 +++++++ English.lproj/MainMenu.nib/info.nib | 20 - English.lproj/MainMenu.nib/keyedobjects.nib | Bin 12745 -> 10696 bytes .../PatchbayDocument.nib/classes.nib | 144 ---- .../PatchbayDocument.nib/designable.nib | 628 ++++++++++++++++++ English.lproj/PatchbayDocument.nib/info.nib | 18 - .../PatchbayDocument.nib/keyedobjects.nib | Bin 29203 -> 29857 bytes .../PatchbayDocument~.nib/classes.nib | 72 -- English.lproj/PatchbayDocument~.nib/info.nib | 16 - .../PatchbayDocument~.nib/objects.nib | Bin 12269 -> 0 bytes Info.plist | 8 +- MIDI Patchbay.xcodeproj/project.pbxproj | 68 +- Model Classes/Patch.m | 1 + PYMIDI/PYMIDIEndpoint.m | 4 +- PYMIDI/PYMIDIEndpointSet.h | 2 +- PYMIDI/PYMIDIRealDestination.m | 12 +- PYMIDI/PYMIDIRealEndpoint.m | 2 +- PYMIDI/PYMIDIRealSource.m | 12 +- PYMIDI/PYMIDIUtils.m | 14 +- PYMIDI/PYMIDIVirtualDestination.m | 2 +- View Classes/KeyTableView.h | 6 +- View Classes/KeyTableView.m | 6 +- 28 files changed, 981 insertions(+), 417 deletions(-) delete mode 100644 English.lproj/MainMenu.nib/classes.nib create mode 100644 English.lproj/MainMenu.nib/designable.nib delete mode 100644 English.lproj/MainMenu.nib/info.nib delete mode 100644 English.lproj/PatchbayDocument.nib/classes.nib create mode 100644 English.lproj/PatchbayDocument.nib/designable.nib delete mode 100644 English.lproj/PatchbayDocument.nib/info.nib delete mode 100644 English.lproj/PatchbayDocument~.nib/classes.nib delete mode 100644 English.lproj/PatchbayDocument~.nib/info.nib delete mode 100644 English.lproj/PatchbayDocument~.nib/objects.nib diff --git a/Controller Classes/EndpointTableDataSource.h b/Controller Classes/EndpointTableDataSource.h index 7b24e91..732e316 100644 --- a/Controller Classes/EndpointTableDataSource.h +++ b/Controller Classes/EndpointTableDataSource.h @@ -2,7 +2,7 @@ #import -@interface EndpointTableDataSource : NSObject { +@interface EndpointTableDataSource : NSObject { Class endpointClass; NSMutableArray* endpointArray; NSUndoManager* undoManager; diff --git a/Controller Classes/EndpointTableDataSource.m b/Controller Classes/EndpointTableDataSource.m index aba0f8a..930a9a1 100644 --- a/Controller Classes/EndpointTableDataSource.m +++ b/Controller Classes/EndpointTableDataSource.m @@ -54,11 +54,13 @@ - (id)tableView:(NSTableView*)tableView objectValueForTableColumn:(NSTableColumn - (BOOL)control:(NSControl*)control isValidObject:(id)value { if (PYMIDIIsEndpointNameTaken (value)) { - NSRunAlertPanel ( - [NSString stringWithFormat:@"The name \"%@\" is already taken.", value], - @"Please choose a different name.", - nil, nil, nil - ); + NSAlert *alert = [[NSAlert alloc] init]; + [alert addButtonWithTitle:@"OK"]; + [alert setMessageText: [NSString stringWithFormat:@"The name \"%@\" is already taken.", value]]; + [alert setInformativeText:@"Please choose a different name."]; + [alert setAlertStyle:NSWarningAlertStyle]; + [alert runModal]; + return NO; } else @@ -72,11 +74,13 @@ - (void)tableView:(NSTableView*)tableView setObjectValue:(id)value forTableColum if (![value isEqualToString:@""] && ![value isEqualToString:[endpoint name]]) { if (PYMIDIIsEndpointNameTaken (value)) { - NSRunAlertPanel ( - [NSString stringWithFormat:@"The name \"%@\" is already taken.", value], - @"Please choose a different name.", - nil, nil, nil - ); + NSAlert *alert = [[NSAlert alloc] init]; + [alert addButtonWithTitle:@"OK"]; + [alert setMessageText: [NSString stringWithFormat:@"The name \"%@\" is already taken.", value]]; + [alert setInformativeText:@"Please choose a different name."]; + [alert setAlertStyle:NSWarningAlertStyle]; + [alert runModal]; + } else { [self tableView:tableView setName:(NSString*)value forEndpointAtIndex:rowIndex]; @@ -90,11 +94,14 @@ - (void)deleteSelection:(NSTableView*)tableView PYMIDIVirtualEndpoint* endpoint = [endpointArray objectAtIndex:[tableView selectedRow]]; if ([endpoint isInUse]) { - NSRunAlertPanel ( - @"The selection is in use by one or more patches and cannot be deleted.", - @"", - nil, nil, nil - ); + NSAlert *alert = [[NSAlert alloc] init]; + + [alert addButtonWithTitle:@"OK"]; + [alert setMessageText:@"The selection is in use by one or more patches and cannot be deleted."]; + [alert setInformativeText:@""]; + [alert setAlertStyle:NSWarningAlertStyle]; + [alert runModal]; + } else { [self tableView:tableView removeEndpointAtIndex:[tableView selectedRow]]; diff --git a/Controller Classes/PatchTableDataSource.h b/Controller Classes/PatchTableDataSource.h index fe58e2d..35230e5 100644 --- a/Controller Classes/PatchTableDataSource.h +++ b/Controller Classes/PatchTableDataSource.h @@ -4,7 +4,7 @@ @class PatchbayDocument; -@interface PatchTableDataSource : NSObject { +@interface PatchTableDataSource : NSObject { PatchbayDocument* document; NSMutableArray* patchArray; } diff --git a/Controller Classes/PatchbayDocument.h b/Controller Classes/PatchbayDocument.h index 7a7a497..2d62942 100644 --- a/Controller Classes/PatchbayDocument.h +++ b/Controller Classes/PatchbayDocument.h @@ -11,7 +11,7 @@ @class EndpointTableDataSource; -@interface PatchbayDocument : NSDocument { +@interface PatchbayDocument : NSDocument { IBOutlet NSWindow* documentWindow; // Stuff related to the table of patches @@ -20,10 +20,11 @@ PatchTableDataSource* patchTableDataSource; IBOutlet NSButton* addPatchButton; + IBOutlet NSButton* removePatchButton; NSMutableArray* patchArray; Patch* selectedPatch; - + int selectedIndex; // Stuff related to editing a patch @@ -89,6 +90,7 @@ - (void)selectedPatchChanged:(NSNotification*)notification; - (IBAction)addPatchButtonPressed:(id)sender; +- (IBAction)removePatchButtonPressed:(id)sender; - (void)addPatch:(Patch*)patch atIndex:(int)index; - (void)addPatchFromArchive:(NSData*)data atIndex:(int)index; diff --git a/Controller Classes/PatchbayDocument.m b/Controller Classes/PatchbayDocument.m index 1c80f9c..0a26042 100644 --- a/Controller Classes/PatchbayDocument.m +++ b/Controller Classes/PatchbayDocument.m @@ -41,7 +41,7 @@ - (id)init // Uncomment the following line for debugging if you want to // disable undo, which makes tracking retain/release issues easier. //[self setUndoManager:nil]; - + selectedIndex = -1; return self; } @@ -50,7 +50,7 @@ - (void)windowControllerDidLoadNib:(NSWindowController*)windowController { NSButtonCell* buttonCell; PatchTableCell* patchTableCell; - + [super windowControllerDidLoadNib:windowController]; // These are so that our window and panel use the correct undo manager @@ -113,7 +113,6 @@ - (void)windowControllerDidLoadNib:(NSWindowController*)windowController // See the comment on tabView:shouldSelectTabViewItem; in EndpointTableDataSource [virtualEndpointTabView setDelegate:inputTableDataSource]; - [self syncWithLoadedData]; } @@ -192,7 +191,7 @@ - (void)syncWithLoadedData [patchTable reloadData]; if ([patchArray count] > 0) - [patchTable selectRow:0 byExtendingSelection:NO]; + [patchTable selectRowIndexes:[NSIndexSet indexSetWithIndex:0] byExtendingSelection:NO]; else [patchTable deselectAll:self]; @@ -252,15 +251,17 @@ - (void)selectedPatchChanged:(NSNotification*)notification [self setTransposeControls]; [self setTransmitClockControls]; [self setOutputPopUp]; + + selectedIndex = patchIndex; } -- (IBAction)addPatchButtonPressed:(id)sender +- (IBAction) addPatchButtonPressed:(id)sender { - Patch* patch; - if (selectedPatch != nil) { - patch = [[Patch alloc] initFromPatch:selectedPatch]; + Patch *patch = [[Patch alloc] initFromPatch:selectedPatch]; + [self addPatch:patch atIndex:[patchArray count]]; + [patch release]; } else { // Pick a default input and output for a blank patch @@ -276,14 +277,20 @@ - (IBAction)addPatchButtonPressed:(id)sender PYMIDIEndpoint* output; do { output = [enumerator nextObject]; } while ([output isIACBus]); - patch = [[Patch alloc] initWithInput:input output:output]; + Patch *patch = [[Patch alloc] initWithInput:input output:output]; + [self addPatch:patch atIndex:[patchArray count]]; + [patch release]; } - - [self addPatch:patch atIndex:[patchArray count]]; - - [patch release]; + } +- (IBAction)removePatchButtonPressed:(id)sender +{ + if (selectedIndex >= 0) { + [self removePatchAtIndex: selectedIndex]; + } + +} - (void)addPatch:(Patch*)patch atIndex:(int)index { @@ -293,7 +300,7 @@ - (void)addPatch:(Patch*)patch atIndex:(int)index [patchArray insertObject:patch atIndex:index]; [patchTable reloadData]; - [patchTable selectRow:index byExtendingSelection:NO]; + [patchTable selectRowIndexes:[NSIndexSet indexSetWithIndex:index] byExtendingSelection:NO]; [[undoManager prepareWithInvocationTarget:self] removePatchAtIndex:index @@ -1021,13 +1028,15 @@ - (IBAction)editVirtualInputs:(id)sender panelWasOpenedToInputs = YES; + [documentWindow beginSheet: virtualEndpointPanel completionHandler: nil]; + /* [[NSApplication sharedApplication] beginSheet:virtualEndpointPanel modalForWindow:documentWindow modalDelegate:self didEndSelector:@selector(endpointPanelDidEnd:returnCode:contextInfo:) contextInfo:nil - ]; + ];*/ } @@ -1041,14 +1050,15 @@ - (IBAction)editVirtualOutputs:(id)sender [[self undoManager] beginUndoGrouping]; panelWasOpenedToInputs = NO; - + [documentWindow beginSheet:virtualEndpointPanel completionHandler: nil]; + /* [[NSApplication sharedApplication] beginSheet:virtualEndpointPanel modalForWindow:documentWindow modalDelegate:self didEndSelector:@selector(endpointPanelDidEnd:returnCode:contextInfo:) contextInfo:nil - ]; + ];*/ } @@ -1058,10 +1068,11 @@ - (IBAction)newInputButtonPressed:(id)sender [[[self displayName] lastPathComponent] stringByDeletingPathExtension] ]; - [[inputTable dataSource] tableView:inputTable newEndpointWithName:baseName]; + [(EndpointTableDataSource *)[inputTable dataSource] tableView:inputTable newEndpointWithName:baseName]; // Set up the newly created endpoint for editing - [inputTable selectRow:[inputTable numberOfRows]-1 byExtendingSelection:NO]; + + [inputTable selectRowIndexes:[NSIndexSet indexSetWithIndex:[inputTable numberOfRows]-1] byExtendingSelection:NO]; [inputTable editColumn:0 row:[inputTable selectedRow] withEvent:nil select:YES]; } @@ -1073,10 +1084,11 @@ - (IBAction)newOutputButtonPressed:(id)sender [[[self displayName] lastPathComponent] stringByDeletingPathExtension] ]; - [[outputTable dataSource] tableView:outputTable newEndpointWithName:baseName]; + [(EndpointTableDataSource *)[outputTable dataSource] tableView:outputTable newEndpointWithName:baseName]; // Set up the newly created endpoint for editing - [outputTable selectRow:[outputTable numberOfRows]-1 byExtendingSelection:NO]; + [outputTable selectRowIndexes:[NSIndexSet indexSetWithIndex:[outputTable numberOfRows]-1] byExtendingSelection:NO]; + [outputTable editColumn:0 row:[outputTable selectedRow] withEvent:nil select:YES]; } @@ -1086,7 +1098,7 @@ - (IBAction)endpointPanelButtonPressed:(id)sender { if ([virtualEndpointPanel makeFirstResponder:nil]) { [virtualEndpointPanel orderOut:self]; - [[NSApplication sharedApplication] endSheet:virtualEndpointPanel returnCode:0]; + [documentWindow endSheet:virtualEndpointPanel returnCode:0]; } } diff --git a/English.lproj/MainMenu.nib/classes.nib b/English.lproj/MainMenu.nib/classes.nib deleted file mode 100644 index aefca1a..0000000 --- a/English.lproj/MainMenu.nib/classes.nib +++ /dev/null @@ -1,36 +0,0 @@ - - - - - IBClasses - - - CLASS - FirstResponder - LANGUAGE - ObjC - SUPERCLASS - NSObject - - - ACTIONS - - displayLicense - id - sendFeedback - id - visitWebSite - id - - CLASS - PatchbayController - LANGUAGE - ObjC - SUPERCLASS - NSObject - - - IBVersion - 1 - - diff --git a/English.lproj/MainMenu.nib/designable.nib b/English.lproj/MainMenu.nib/designable.nib new file mode 100644 index 0000000..f1b8717 --- /dev/null +++ b/English.lproj/MainMenu.nib/designable.nib @@ -0,0 +1,224 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/English.lproj/MainMenu.nib/info.nib b/English.lproj/MainMenu.nib/info.nib deleted file mode 100644 index bb86cd1..0000000 --- a/English.lproj/MainMenu.nib/info.nib +++ /dev/null @@ -1,20 +0,0 @@ - - - - - IBFramework Version - 629 - IBLastKnownRelativeProjectPath - ../../MIDI Patchbay.xcodeproj - IBOldestOS - 5 - IBOpenObjects - - 57 - - IBSystem Version - 9B18 - targetFramework - IBCocoaFramework - - diff --git a/English.lproj/MainMenu.nib/keyedobjects.nib b/English.lproj/MainMenu.nib/keyedobjects.nib index 24c52be42cb0d887f4c194bf43aa79550c3f78e3..b30779f92233dac3d37c81e35961dc394d8595db 100644 GIT binary patch literal 10696 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 YQukE%A{73Ejh67AjE$Vjf89&|3qwsj6#xJL literal 12745 zcmb_?2Y3|K7Vy2Z_iit{0@ALn^KOxM_oqNwY_w;k_RL!od4LA4h zeGFm5Aq66cA|=uwZAoBms3~0A*iaZ~Zk#?cO$*4aXj7Fj~G#X`~EL4l;APKEP zH=rBQE$CKs8@dDCg*Kpj(7osZv<+=XJJ1to7kUcqMtji<=oR!TdJVmf-a<#vd*~=S zhCV`HqOZ`u(Q)(*`U(AtPNUz@8FUUKj4_9m*no}Lgl*V^z1W8nacA5E_r$$$Z`>ab z#l!G$JOZcTadk+JPl9BGjJUa<9T>KUVxY4m3S4t0pEo0!0YgO zd?&seZ^m2jR{Su20`J66;$3(TejXpdFW?vPtN0Lp7yk<%!SCS@@aOmo{3ZShpTIxj zllUk6Gd_*a;q&+chd33d<}{pvvvGFL!8th(SHe|uGq_rACRfKbaf`Vn9OJI%R&lGj zHQYLGJ@+8DgL{Ts2{T^g4s!2tN8#=>G>H3>`;Pk+?oV@PxIejb3Zx(ks!%F43bVqc za4X^ziHanJpy;aTrs%HdtLUfbuNa^hsu;u7D$*4hiUNfi?#dJ)_f=nfqq>5CN z8WJMY$aFG;)RLKG7O5lkq=7V&*<=oBB4N@@TF6||O6HOIWC2-77Lmnd30X=Qk;pQ# zoLon)C#%S6@--bohtgqmI2}Pp(or;(rqR)K3{9tFX$H-tQJXdSJm4YZNYrgLZ$ z4bx`YLg&&}I*-n$3+O_+h%Tl}=u*n4M3>R!^g4PyT|rmURrCgWBVA3`(3|MZ^cH$6 zT}#)~4Ml;5mb$txc?&WiBQhZ#nUMuqkqz0A138fkxltVQATRQvc$9$rC=n$g0R@nV zf~XVfjJlw%s2l2zdZ3=D7wTP{Q;^@-*jyZ_uB!}(%X12HqoxS97LFKQnmir~7gyG` zgkZ#-Q!uK!Ius7qR@K(kHqXzkt!aA)YttGV8o-Xh!o!nu3UVszLtz;X+^09eLu+Hx zEO}NGqWq>5@Bsk%7G6Xa{2ih;*o{r{%=E^F=IqLb%ITq|3ZBm?D6R#1>OvE18)_O` zqjb0JqaB>H1G;6jlK^dKUNcZp7NsS+fN>I@$L^4@Pr|KC!~V^b681_so*kEP3qwrB zzLM}<{xbDxT zdng4BK||57lBfVe;nL_$1HjmVhN0nTL_`ePEzOm%!-5EulAMCeH_?4Y;fzA5n^7tn zF$D-|2{$*^M_&SqGE>tUs~amXi$NxB3`$31K>}@#Hq6wUqF^%7xGiWL8jnT*PudZO znu`Eys5!ba8|ARIPw;Ul7fnEUC?6G|LR5r`(L_{&CZSR^8I_@OGzC?lsi+cFp=wlv zLTDPAj%F||bFl;_vaYNb>(2(WVQdr|%d%J=D`KUrf>pB_td7lLbJ-#$u@&q_cJncy zcP5&J>QFssbt9S$Y#bd5H`g{q*eElkv8AaxG%=?jtFkIo$DE8~I_CHY)-|CpYDO(+ zE^0;d(0sH2EkujZVzdM;MGO`c);8CLDtL1wz>JyGQad-hu_n7RJPUXODiRq1blDA| z`o@OZ>a50UkY{c~W<98%%%IwNp_<48*iv?=p@rF*!2*_vn9;KIufP6cCT3-Nc?V5s z8Cs66L)W7fXeG>+6$O+=UXb!*%tOV+gia}GHPo={_M=rnf?it&DAriD(C0T zI0_*8pw(y%x(VG3GR_Z$Bb$!sn}zYr47-U?5>*)hn>Hg(hejR_?=9KW{b>{iHmHppt-U+6a}*p-MtyzjYa^2+G#JE0R*Q+U*CuB--7N( zn`At8*kx@M7;ke^W8GyN2I8Zmvb$((ik0pbv=u!F;`1^$i|xI*xgw z90qb_KhW%-7^;FxsAtcf6WVR_Nw7yBu(h3;Z3NYYn#$+OYhXzMEJ=~M5Y@6h=oz5G z&jKCM@GQ{qTpJAsfQBR{L}*Bq*EdCE{1SQ@#Q84!*Tme}p$4EOud%!l?nXCOx73Fk znqyGCi4Fp)AnVc*s<#2v;TTk%Sm!7z@LR2U4P_0X)(${^fIb9}-B{0#Kz;%sKaBy| zo%M)d9r&nl483=aR0k^HA5~YES6Ld4JivWQtVSfDv*=Gi$FTuy(1#HQ$C~qntF&R@ z6>YGNs%mU$zS@W?cwb{vO{gio2{aNkx}m1BsU|XSLS;j!?#dQ1!4z<&u%R7n5vyT~ z?K&uLaY!51b2Y)Ko9~`55cOqi`zV$Yv8d!Y~Ffq{rxY4$F<| zcTrkhV>p!8THdyY$YTuOa`6O!n$HS5f?9AzJQ2PXw23DT=uVYmyR5|i=0<-+x4?QT zo0=*criU^cA_FmK%5XWLDQ1&8LNgVJuZ*#tiL4}QJw+2L!_A?*xy7^PYYe!Vcou-0 z%%*e%t|5l%Cg65?8`Wj8(r&?XAsI(xL92=uTpBxEvxy>`6GOXYoaukU?#N zODxV0LA}}xgf>NP+F4TAD0|MD7}(qJLjb#;&F+ZMM}g4CVhC+ujctVHhk(%1q9(Y+ z0Nah924GFBr6XW_0ocA6U}4rA1qK1WId5KJbxTaF!7t-i08}em*b%7L0n{5&Q1~s_ z_k6Y>0&3o6&y5e`cR*3zVuvOd%nsGnf!fQ#B1H}sGa6gRLX8l<){`E??*q!kjCF+a zBS86a49X>JX%yv@Nb2Hm$C5W>O0}HJv_Hpi=Q#cv;4fp>cLe_%fd6d_cb2p3+E|^| zID39xbx}23Vt}2(zXGt8?1qkjory6fnLn%A^kQBGA9ppm{>rd_Qe%t1aQHM^+;8aVC>4M=vMYuaegmlS{iWFG|D z+0q~z65MxeMx2h*1CCqR?Hyq-p@kgZ#xhy^Z)LYdSe95QD|ueHJT@(erhJ@>b8q3? zTwJ8~Xe${;f&ZHi8ENDiDH}L1=VM zTn}^t6SRd(=K6rezs2?E25mgH| z3>KQf9)qmwL6*o~V#%!b6J+EjU0r~1rD#6x#FbwWBbUWhK}Au}QU!To3zRaWA|*6% zK8@YkCf)Vyt{8{Sg}7JdrnG#hDXElNJ(}$p*9h9L^EPg{a&USRR2?;Sr27zw1`{JcF1CZb_(|e zlx#cy=>}v!b%l~dSk@78a2G#bK@N`L6f7%aPqiUWWV?sE@CbFE=N@br%-?~>}StIeqB%vm2xDJ zjMhfbCCZ!GMvFqtNMSm3x!QDBp<`)t3S9JJ zw(@V(0v%9{xS|$ZmSQwWDUlt%tds8m&+9_%G8l7N9~9%*+K17bXb;ze>xxHlI`jd= znIOc1T@Y2WA#!y4+Ze$0Q50W6icTsf1JZr$y*8xD?C9T7ds0zxWg$>2``~2u{$*-E zC>&E$8|l+Q^HCAHLhVep_A!X3+qguCj>jS55_Ez~gQ%JT5w9L1V-v)~Vu*shA;KMD zpZrtfyT;4@4c+)HeE168u;G{X@6} z2-t5!AYL~a4DZT3=$N9Ptn@@sW6vK>Q?;BoP5UNkkGPok(ZW zg>)s|NO#hM^d!AVZ<0*!^sFPL`IQRl14_8F(jRg zB^e}>j3eXO*X#uQ5Br9F%f4gZvme-x>?He%{mg!0r`WITH2aO6VZSpU`-7cjf3kDz zJiEXyvj4J6>@Nu;31bPvQG-IlM8Z_UaLS;Puv)?z32P;+ldxXG1_>J_Y?3g~;Jm>s zVT**V61GX$E@6j+of39Q*e&5W341Ddn`}aUxuNXu++GuOfhI-Fa5P7QK~rR~b9-*p zW%A`Lug8FPNS&|BnqUzh14%AeVJI$U=;}%cUb3p8|&3rP5Ym$4aG71)mf{S;wL98mKaLT_#$H24Mt{)zdcuicd@K&&v#^|UCm0FDbdkbJ-*V}gXyuB2c04qiIwjEc4A|-uE{7Uv^q);5gdC842_czJj zzvyz@n<2LpP(`GvP$Rb$P%%D^a${Qya5h;DsZSo9N47;mG*xahpn|I#4QP@a58({6 z3{EWz|EJ|pg!17$b3%LT0Zrt_!MSJE-!vdf;54-Isy4*U5ZmkFtW$19EQ&NE21EL# zy{aLR$L2yhmH?-q?a^~aq&d;`n)bxlNDQrj^V1vQO!eAEMSnPJT>)pV?G1}zP$Oi) z`D({)i&1a}TL*bYZ9C`x6X7uVhI~uDBj1xB$dBYC`HB2Yej%sGujDlOjhrFBlRwB= z@+Ub*&XWt|BKa@5ME;_PV#-kkC6rPnRZ%t7P%YI_JvC4xHBp|LsfAjpjoPV$I;o4g zX&m)XFZI!Qnn3+DktR`r2B=7bv=i-2yU?z*8|_Ye(4Mpx?M;(uAKI7pqy6asI*<;c zgK3I{{Sr=;aFT=t2?r!BN;oLtP7>}c;Vu&HD&cMt?k?dT67DJCUJ~vt;baN-k#JuL z_mgmc2@jC)KnV|$@L&l8z#$SID&b)g9xmY#5*{hxQ4&s-aGHciOL&Zg(LPmpk)g!3g_AmKs@7fHBS!V@K2BH>9AE|u_P371K@T*6Z% zTp{7960VeRm4vG$TqEI-gr`Y(x`by)xK_e5B|J;QbrP%BWd~PzkDu#3!lO-;veTb@%#C$ z{44y^Jm%l#@8<94U+3@R_wldsxAG701$-I*Fh8E(!ms8j@8oaick&zfr}*3Wjr?-n z#V_V}@GJOC{$~DV{zd*1{$u`qelPz5|0%zje~EvBe~$O@8T=A{6TgaI$4}rt;`8{2 zc#&Vq@8TcfXGio5Wz*ZC)zhYP6ms~>_jg6^A=9TD>D`+toIAtuab{}t+lJBbc^Fb7 zH%fx9Taw{xiV^S`SU!A=FbzIBs#0uM>{dLdIH>qkah6a>5q*&I4S*zWDts^`k+ozy zd4{}7UMC01A@UA6LXML6$%o_<@;UjE949A0>AwSY{|OZR9H_7g)Yk&a84n8BA3ht( zgwKMi;3J=A_=sm2y^U_A+v#5VEPal?N)OSG=oj=``n}SxOi~7vL1kxUS7mo)Pi1dq zA7ww~0OcTMigKuOxN@X2RXJLjuFO!5Q)Vf1loOQs%0gvG8CEV*UZ-54T&28GxkkBN z`Lyz&@|g0t@}%;d3aL01QE5~<6|b_WY$}JUld7jGMKx44Ts2aas+y>pq?)E`QMIb( zs}`!3tJbORQ*BZ0QN5yiP4$NApz1T#e^fuHepg*k6SYn)sQakX)MM0R)tTz?>N<6U zdbYYr-K?Igo~K@|UZY;8zEizHy+gfUeNcT!eOUdj`jq;#`i%My^`GkV>WdnUMyD}o zOd6-gt?8ucrx~Cbq)E|C)|6{1G?kiaO-M6cGfPviS)f^|xk0m9bCYI=W~XMCX18XK zX0PU1&1;%BG#_ie(R`=*L32`T(3-SntyOE+I<;6tYENlTYtLx^(Eh1Cuf3>K=yW=-E?(!? zCFugXF}kt3Ox<{0wk}tfr<y={0(tzPrAszPG-QzMp=8evm#}pQ|s`PuJJ#XX)$pH|uZJ->$zy zzg~ZrexrVqezSh3{(1ci`j_;t=uhas(SN7^L4Q*Jv;LHU8k~lJA!z7q=xP{m$Ts8} z@(cxrBEv*OxuL=^%@8)U7+MYU4I2&j816G{GHf<%HEc6HW7ubS&hWh91;bm0-zXY88M_#}8G9H98}p47#!6$gF=Sj}TxGn`xW;(1@mAyQ#ygE0 zjQ1NKH|{X*H10CKYdm5+YJA`Lq48tmr^e&P3nsNmYtoyHre3CGQ(sem(?HW;(-6~0 zQ>rP$RAicHnq-=6T4Y*cVy0!L>r5+5t4wQ5H=EX)Hkme?wwkt?-Y^|B9Wos@y=yvR zI%@jLblh~p^o{AX=?t#~uVe@3;Rcs8lpoHI!M#xd$B2 zCU6{E`EB5_wu75_5!}kF;E=xMzvqACf8u}Pf8~EO^X6o8s(G|I-JD?_XP#xQH#eH+ zn8W54bE}z|H<-7XA2vT~e%yT6{I2SRS-IWO>B$m}R@=3Coj~rz}rfp0Vt+JZE{{@`B|h%PW@GEN@s2 zS`JwbTi&%Cu^hF$Z~4&jvE@_C=aw%m|F(Q>`H$sW%lDQaEk9X)vHWWJ&GNhDtmT~L zg5|%KzpU7*uu`kast~JkEU@fvvw9c^3wANW0th24H))m%U zthZS=TJN!Lu|8;h$oh!&J?mH2pRB)Ff3=>rp0WOJJ!?H@y;fjhpm?_ z*_L7(Y8zwAu}!e$*{W@8Y&Y9(wcTc0YrDg?-gcL5qwQhaleVX9Z`t9b~tuAb~$!C z_Bi%Bo^|YZyy-aNIO_P!@rC2xj;|dTojzxRGtntHMQ0~x7v})yAZLnms59SL=qz_u zIBT5s&PL|~=OX74Cvz@yUgvz!`H=Gw=VQ+8&L^BtI`=uBbAIOh!ugf+xbuYb8|Qb< z)6O$4yUXcvyF4zRE5ViM>g7sy<+}=9#jX-psjJL2#ntMX?^@NnB}MS=^MknQ`H`d2v$Q^0@PH7vnB@kcaaSkJ6*|Xgzw5(ZhQz9-GJEae3lA zUQfKo?@96mJV8%qPghTOPft&8PajV|&j8OLPl{)#XSipiC)G3BlkUmzjPqo9ay%0} z`JO^gv8TjS>M8R~@l5qpd1^egjK8w%hbNF1oIG@)S@ALbTd;wq3*V)(2 z*VC8m>*pKjOYsf!jr67Y(tVk}EMKlK-&f=-@lE!X`=id(^kz_onYl-|2W$e7E>v@p#jlEgH2&52&*M+W|CNxK&?8}FLVm)O zgyjkA6E-D0mGFAP#|h{CW`8&TD1WYhnt!2xrT=07e*dS5DAAcXGO;XiZsMB62NR!3 z{3!86;(wDgN%o{3NrRJek|riiN-9mNP6{PWOKMD-Bg6}SAxQ`bL7}tIRp>7C6nYDN zgnq&RVUUm_3>Ah8BZX99w2&@j2;+n-AxD@X!mYyX!X3hT;VxmLaF1}Guu0e~ zY!$W%4-1b9j|)45ox(0*x3EXpD?BUg7Y+z73NH(<3a<-q3P*&a0Tx&uSP{4(uqJRz z;P$|}z+Hj61NQ|U2y6{J6nHeSJ+L$IRA5hFUtoXWg}}>!*8*<_4h7x`90?o?d>Hs7 z@Oj{?z}JCq0^bKt27U>g4*VYYGjJhrNyH)%Riaijh`eYO9im(GiV0$pD2koMZemX{ zS?nhc6jQ`u;z%(~Ocyi7EHPKi7mLIaak4l?tQ2d+>EcYWUYsq4#kt~qagn%Gl*HxY z_2NqL2644`lX#1Go48h7C*CP;5bqZ674H`x79SNK7k7v|#a-fVagVrHd{*2q9uQv? zUlv~#Ul-pL-xA*z-x2>Mz9$|NKM+3>KM_9@zYxC?kBcY7Z^ZA!AHu_+27 - - - - IBClasses - - - ACTIONS - - addPatchButtonPressed - id - endpointPanelButtonPressed - id - filterChannelMatrixChanged - id - filterChannelRadioButtonsChanged - id - filterRangeRadioButtonsChanged - id - highestAllowedNoteSliderChanged - id - highestAllowedNoteStepperChanged - id - inputPopUpChanged - id - lowestAllowedNoteSliderChanged - id - lowestAllowedNoteStepperChanged - id - newInputButtonPressed - id - newOutputButtonPressed - id - outputPopUpChanged - id - remapChannelButtonChanged - id - remapChannelPopUpChanged - id - transmitClockButtonChanged - id - transposeButtonChanged - id - transposeDistanceSliderChanged - id - transposeDistanceStepperChanged - id - - CLASS - PatchbayDocument - LANGUAGE - ObjC - OUTLETS - - addPatchButton - NSButton - documentWindow - NSWindow - filterChannelMatrix - NSMatrix - filterChannelRadioButtons - NSMatrix - filterRangeLabelField - NSTextField - filterRangeRadioButtons - NSMatrix - highestAllowedNoteField - NSTextField - highestAllowedNoteSlider - NSSlider - highestAllowedNoteStepper - NSStepper - inputPopUp - NSPopUpButton - inputTable - NSTableView - lowestAllowedNoteField - NSTextField - lowestAllowedNoteSlider - NSSlider - lowestAllowedNoteStepper - NSStepper - outputPopUp - NSPopUpButton - outputTable - NSTableView - patchTable - NSTableView - remapChannelButton - NSButton - remapChannelPopUp - NSPopUpButton - transmitClockButton - NSButton - transposeButton - NSButton - transposeDistanceField - NSTextField - transposeDistanceSlider - NSSlider - transposeDistanceStepper - NSStepper - virtualEndpointPanel - NSPanel - virtualEndpointTabView - NSTabView - - SUPERCLASS - NSDocument - - - ACTIONS - - clear - id - deleteBackward - id - deleteForward - id - moveDown - id - moveUp - id - - CLASS - KeyTableView - LANGUAGE - ObjC - SUPERCLASS - NSTableView - - - CLASS - FirstResponder - LANGUAGE - ObjC - SUPERCLASS - NSObject - - - IBVersion - 1 - - diff --git a/English.lproj/PatchbayDocument.nib/designable.nib b/English.lproj/PatchbayDocument.nib/designable.nib new file mode 100644 index 0000000..0642ecd --- /dev/null +++ b/English.lproj/PatchbayDocument.nib/designable.nib @@ -0,0 +1,628 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/English.lproj/PatchbayDocument.nib/info.nib b/English.lproj/PatchbayDocument.nib/info.nib deleted file mode 100644 index b25c89f..0000000 --- a/English.lproj/PatchbayDocument.nib/info.nib +++ /dev/null @@ -1,18 +0,0 @@ - - - - - IBFramework Version - 629 - IBLastKnownRelativeProjectPath - ../../MIDI Patchbay.xcodeproj - IBOldestOS - 3 - IBOpenObjects - - IBSystem Version - 9B18 - targetFramework - IBCocoaFramework - - diff --git a/English.lproj/PatchbayDocument.nib/keyedobjects.nib b/English.lproj/PatchbayDocument.nib/keyedobjects.nib index 6766a1c6563ab875c42ed41eee90581de2ddd681..83f602bc04df810de729cdf05742d35d0e820ae6 100644 GIT binary patch literal 29857 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 L6hC*pR&V@2XERLw literal 29203 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 diff --git a/English.lproj/PatchbayDocument~.nib/classes.nib b/English.lproj/PatchbayDocument~.nib/classes.nib deleted file mode 100644 index 0083d00..0000000 --- a/English.lproj/PatchbayDocument~.nib/classes.nib +++ /dev/null @@ -1,72 +0,0 @@ -{ - IBClasses = ( - {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; }, - { - ACTIONS = { - clear = id; - deleteBackward = id; - deleteForward = id; - moveDown = id; - moveUp = id; - }; - CLASS = KeyTableView; - LANGUAGE = ObjC; - SUPERCLASS = NSTableView; - }, - { - ACTIONS = { - addPatchButtonPressed = id; - endpointPanelButtonPressed = id; - filterChannelMatrixChanged = id; - filterChannelRadioButtonsChanged = id; - filterRangeRadioButtonsChanged = id; - highestAllowedNoteSliderChanged = id; - highestAllowedNoteStepperChanged = id; - inputPopUpChanged = id; - lowestAllowedNoteSliderChanged = id; - lowestAllowedNoteStepperChanged = id; - newInputButtonPressed = id; - newOutputButtonPressed = id; - outputPopUpChanged = id; - remapChannelButtonChanged = id; - remapChannelPopUpChanged = id; - transmitClockButtonChanged = id; - transposeButtonChanged = id; - transposeDistanceSliderChanged = id; - transposeDistanceStepperChanged = id; - }; - CLASS = PatchbayDocument; - LANGUAGE = ObjC; - OUTLETS = { - addPatchButton = NSButton; - documentWindow = NSWindow; - filterChannelMatrix = NSMatrix; - filterChannelRadioButtons = NSMatrix; - filterRangeLabelField = NSTextField; - filterRangeRadioButtons = NSMatrix; - highestAllowedNoteField = NSTextField; - highestAllowedNoteSlider = NSSlider; - highestAllowedNoteStepper = NSStepper; - inputPopUp = NSPopUpButton; - inputTable = NSTableView; - lowestAllowedNoteField = NSTextField; - lowestAllowedNoteSlider = NSSlider; - lowestAllowedNoteStepper = NSStepper; - outputPopUp = NSPopUpButton; - outputTable = NSTableView; - patchTable = NSTableView; - remapChannelButton = NSButton; - remapChannelPopUp = NSPopUpButton; - transmitClockButton = NSButton; - transposeButton = NSButton; - transposeDistanceField = NSTextField; - transposeDistanceSlider = NSSlider; - transposeDistanceStepper = NSStepper; - virtualEndpointPanel = NSPanel; - virtualEndpointTabView = NSTabView; - }; - SUPERCLASS = NSDocument; - } - ); - IBVersion = 1; -} \ No newline at end of file diff --git a/English.lproj/PatchbayDocument~.nib/info.nib b/English.lproj/PatchbayDocument~.nib/info.nib deleted file mode 100644 index 50938ff..0000000 --- a/English.lproj/PatchbayDocument~.nib/info.nib +++ /dev/null @@ -1,16 +0,0 @@ - - - - - IBDocumentLocation - 145 64 474 240 0 0 1600 1178 - IBFramework Version - 291.0 - IBOpenObjects - - 5 - - IBSystem Version - 6G30 - - diff --git a/English.lproj/PatchbayDocument~.nib/objects.nib b/English.lproj/PatchbayDocument~.nib/objects.nib deleted file mode 100644 index ffa3815bf53bb1405d3e7c66a4d729d9aaea6bd0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12269 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 H{|EjbY6GS+ diff --git a/Info.plist b/Info.plist index 600c0d5..a24bd72 100644 --- a/Info.plist +++ b/Info.plist @@ -33,15 +33,17 @@ ${PRODUCT_NAME} CFBundlePackageType APPL + CFBundleShortVersionString + 1.0.4 CFBundleSignature ???? CFBundleVersion - 1.0.3 + 1.0.4 + LSApplicationCategoryType + public.app-category.music NSMainNibFile MainMenu NSPrincipalClass NSApplication - CFBundleShortVersionString - 1.0.3 diff --git a/MIDI Patchbay.xcodeproj/project.pbxproj b/MIDI Patchbay.xcodeproj/project.pbxproj index 3183293..36dd127 100644 --- a/MIDI Patchbay.xcodeproj/project.pbxproj +++ b/MIDI Patchbay.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 44; + objectVersion = 46; objects = { /* Begin PBXBuildFile section */ @@ -257,7 +257,6 @@ C12C7FE805AECD9D0066E007 /* Resources */, C12C7FF005AECD9D0066E007 /* Sources */, C12C7FFA05AECD9D0066E007 /* Frameworks */, - C14601500D3CB30B002E94E5 /* ShellScript */, ); buildRules = ( ); @@ -274,9 +273,16 @@ /* Begin PBXProject section */ 2A37F4A9FDCFA73011CA2CEA /* Project object */ = { isa = PBXProject; + attributes = { + LastUpgradeCheck = 0610; + }; buildConfigurationList = C101046C088A0A7C001DFE4F /* Build configuration list for PBXProject "MIDI Patchbay" */; - compatibilityVersion = "Xcode 3.0"; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; hasScannedForEncodings = 1; + knownRegions = ( + en, + ); mainGroup = 2A37F4AAFDCFA73011CA2CEA /* MIDI Patchbay */; projectDirPath = ""; projectRoot = ""; @@ -303,22 +309,6 @@ }; /* End PBXResourcesBuildPhase section */ -/* Begin PBXShellScriptBuildPhase section */ - C14601500D3CB30B002E94E5 /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = "/usr/bin/perl -w"; - shellScript = "# Xcode auto-versioning script for Subversion\n# by Axel Andersson, modified by Daniel Jalkut to add\n# \"--revision HEAD\" to the svn info line, which allows\n# the latest revision to always be used.\n\n# See http://www.red-sweater.com/blog/23/automatic-build-sub-versioning-in-xcode#finalscript\n\nuse strict;\n\ndie \"$0: Must be run from Xcode\" unless $ENV{\"BUILT_PRODUCTS_DIR\"};\n\n# Get the current subversion revision number and use it to set the CFBundleVersion value\nmy $REV = `/opt/local/bin/svnversion -n ./`;\nmy $INFO = \"$ENV{BUILT_PRODUCTS_DIR}/$ENV{WRAPPER_NAME}/Contents/Info.plist\";\n\nmy $version = $REV;\n\n# (Match the last group of digits and optional letter M/S):\n\n# ugly yet functional (barely) regex by Daniel Jalkut:\n#$version =~ s/([\\d]*:)(\\d+[M|S]*).*/$2/;\n\n# better yet still functional regex via Kevin \"Regex Nerd\" Ballard\n#($version =~ m/\\d+[MS]*$/) && ($version = $&);\n\n# or a custom version that ignores the M and S flags by Pete Yandell\n($version =~ m/(\\d+)[MS]*$/) && ($version = $1);\n\ndie \"$0: No Subversion revision found\" unless $version;\n\nopen(FH, \"$INFO\") or die \"$0: $INFO: $!\";\nmy $info = join(\"\", );\nclose(FH);\n\n$info =~ s/([\\t ]+CFBundleVersion<\\/key>\\n[\\t ]+).*?(<\\/string>)/$1$version$2/;\n\nopen(FH, \">$INFO\") or die \"$0: $INFO: $!\";\nprint FH $info;\nclose(FH);"; - }; -/* End PBXShellScriptBuildPhase section */ - /* Begin PBXSourcesBuildPhase section */ C12C7FF005AECD9D0066E007 /* Sources */ = { isa = PBXSourcesBuildPhase; @@ -380,8 +370,9 @@ C1010469088A0A7C001DFE4F /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; - FRAMEWORK_SEARCH_PATHS = ../PYMIDI/build; + FRAMEWORK_SEARCH_PATHS = ""; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; GCC_GENERATE_DEBUGGING_SYMBOLS = YES; @@ -391,11 +382,14 @@ INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; LIBRARY_SEARCH_PATHS = ""; - MACOSX_DEPLOYMENT_TARGET = 10.2; + MACOSX_DEPLOYMENT_TARGET = 10.10; + ONLY_ACTIVE_ARCH = YES; OTHER_CFLAGS = ""; OTHER_LDFLAGS = ""; PRODUCT_NAME = "MIDI Patchbay"; + SDKROOT = macosx10.10; SECTORDER_FLAGS = ""; + VALID_ARCHS = x86_64; WARNING_CFLAGS = ( "-Wmost", "-Wno-four-char-constants", @@ -409,8 +403,9 @@ C101046A088A0A7C001DFE4F /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = YES; - FRAMEWORK_SEARCH_PATHS = ../PYMIDI/build; + FRAMEWORK_SEARCH_PATHS = ""; GCC_ENABLE_FIX_AND_CONTINUE = NO; GCC_GENERATE_DEBUGGING_SYMBOLS = NO; GCC_OPTIMIZATION_LEVEL = 3; @@ -419,11 +414,16 @@ INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; LIBRARY_SEARCH_PATHS = ""; - MACOSX_DEPLOYMENT_TARGET = 10.2; + MACOSX_DEPLOYMENT_TARGET = 10.10; + ONLY_ACTIVE_ARCH = YES; OTHER_CFLAGS = ""; OTHER_LDFLAGS = ""; PRODUCT_NAME = "MIDI Patchbay"; + SDKROOT = macosx10.10; + "SDKROOT[arch=i386]" = macosx10.10; + "SDKROOT[arch=ppc]" = macosx10.10; SECTORDER_FLAGS = ""; + VALID_ARCHS = x86_64; WARNING_CFLAGS = ( "-Wmost", "-Wno-four-char-constants", @@ -439,9 +439,11 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = YES; HEADER_SEARCH_PATHS = ""; - MACOSX_DEPLOYMENT_TARGET = 10.2; - SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.4u.sdk"; + MACOSX_DEPLOYMENT_TARGET = 10.10; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx10.10; USER_HEADER_SEARCH_PATHS = .; + VALID_ARCHS = x86_64; }; name = Debug; }; @@ -449,20 +451,16 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = YES; - ARCHS = ( - i386, - ppc, - ); GCC_VERSION_i386 = 4.0; GCC_VERSION_ppc = 3.3; HEADER_SEARCH_PATHS = ""; - MACOSX_DEPLOYMENT_TARGET = 10.2; - "MACOSX_DEPLOYMENT_TARGET[arch=i386]" = 10.4; - "MACOSX_DEPLOYMENT_TARGET[arch=ppc]" = 10.3; - SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.4u.sdk"; - "SDKROOT[arch=i386]" = "$(DEVELOPER_SDK_DIR)/MacOSX10.4u.sdk"; - "SDKROOT[arch=ppc]" = /Developer/SDKs/MacOSX10.3.9.sdk; + MACOSX_DEPLOYMENT_TARGET = 10.10; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx10.10; + "SDKROOT[arch=i386]" = macosx10.10; + "SDKROOT[arch=ppc]" = macosx10.10; USER_HEADER_SEARCH_PATHS = .; + VALID_ARCHS = x86_64; }; name = Release; }; diff --git a/Model Classes/Patch.m b/Model Classes/Patch.m index 4736a20..4a15cab 100644 --- a/Model Classes/Patch.m +++ b/Model Classes/Patch.m @@ -45,6 +45,7 @@ - (Patch*)initWithInput:(PYMIDIEndpoint*)newInput output:(PYMIDIEndpoint*)newOut isEnabled = YES; + return self; } diff --git a/PYMIDI/PYMIDIEndpoint.m b/PYMIDI/PYMIDIEndpoint.m index 46c0cdd..9a6cfd8 100644 --- a/PYMIDI/PYMIDIEndpoint.m +++ b/PYMIDI/PYMIDIEndpoint.m @@ -96,7 +96,7 @@ - (PYMIDIEndpointDescriptor*)descriptor - (void)setPropertiesFromMIDIEndpoint { - if (midiEndpointRef == NULL) return; + if (!midiEndpointRef) return; [self setUniqueIDFromMIDIEndpoint]; [self setNameFromMIDIEndpoint]; @@ -301,7 +301,7 @@ - (BOOL)isOffline SInt32 isOffline; OSStatus result; - if (midiEndpointRef == nil) return YES; + if (!midiEndpointRef) return YES; result = MIDIObjectGetIntegerProperty (midiEndpointRef, kMIDIPropertyOffline, &isOffline); return result == noErr && isOffline; diff --git a/PYMIDI/PYMIDIEndpointSet.h b/PYMIDI/PYMIDIEndpointSet.h index c58b48e..f715688 100644 --- a/PYMIDI/PYMIDIEndpointSet.h +++ b/PYMIDI/PYMIDIEndpointSet.h @@ -3,7 +3,7 @@ @class PYMIDIEndpointDescriptor; @class PYMIDIEndpoint; -@interface PYMIDIEndpointSet : NSObject { +@interface PYMIDIEndpointSet : NSObject { NSArray* endpointArray; } diff --git a/PYMIDI/PYMIDIRealDestination.m b/PYMIDI/PYMIDIRealDestination.m index 62fcb84..09ed862 100644 --- a/PYMIDI/PYMIDIRealDestination.m +++ b/PYMIDI/PYMIDIRealDestination.m @@ -22,7 +22,7 @@ - (id)initWithCoder:(NSCoder*)coder descriptor = [PYMIDIEndpointDescriptor descriptorWithName:newName uniqueID:newUniqueID]; [self release]; - return [[manager realDestinationWithDescriptor:descriptor] retain]; + return [(PYMIDIRealDestination *)[manager realDestinationWithDescriptor:descriptor] retain]; } @@ -35,8 +35,8 @@ - (void)syncWithMIDIEndpoint else newEndpointRef = NULL; - if (newEndpointRef == NULL) newEndpointRef = PYMIDIGetDestinationByUniqueID (uniqueID); - if (newEndpointRef == NULL) newEndpointRef = PYMIDIGetDestinationByName (name); + if (!newEndpointRef) newEndpointRef = PYMIDIGetDestinationByUniqueID (uniqueID); + if (!newEndpointRef) newEndpointRef = PYMIDIGetDestinationByName (name); if (midiEndpointRef != newEndpointRef) { [self stopIO]; @@ -50,7 +50,7 @@ - (void)syncWithMIDIEndpoint - (void)startIO { - if (midiEndpointRef == nil || midiPortRef != nil) return; + if ( !midiEndpointRef || midiPortRef ) return; MIDIOutputPortCreate ( [[PYMIDIManager sharedInstance] midiClientRef], CFSTR("PYMIDIRealDestination"), @@ -61,7 +61,7 @@ - (void)startIO - (void)stopIO { - if (midiPortRef == nil) return; + if (!midiPortRef) return; MIDIPortDispose (midiPortRef); midiPortRef = nil; @@ -70,7 +70,7 @@ - (void)stopIO - (void)processMIDIPacketList:(const MIDIPacketList*)packetList sender:(id)sender { - if (midiEndpointRef != NULL && midiPortRef != NULL) + if (midiEndpointRef && midiPortRef) MIDISend (midiPortRef, midiEndpointRef, packetList); } diff --git a/PYMIDI/PYMIDIRealEndpoint.m b/PYMIDI/PYMIDIRealEndpoint.m index 4ae7d2a..a05affe 100644 --- a/PYMIDI/PYMIDIRealEndpoint.m +++ b/PYMIDI/PYMIDIRealEndpoint.m @@ -36,7 +36,7 @@ - (void)syncWithMIDIEndpoint - (BOOL)ioIsRunning { - return midiPortRef != nil; + return !midiPortRef; } diff --git a/PYMIDI/PYMIDIRealSource.m b/PYMIDI/PYMIDIRealSource.m index 9623a91..8921645 100644 --- a/PYMIDI/PYMIDIRealSource.m +++ b/PYMIDI/PYMIDIRealSource.m @@ -25,7 +25,7 @@ - (id)initWithCoder:(NSCoder*)coder descriptor = [PYMIDIEndpointDescriptor descriptorWithName:newName uniqueID:newUniqueID]; [self release]; - return [[manager realSourceWithDescriptor:descriptor] retain]; + return (PYMIDIRealSource *)[[manager realSourceWithDescriptor:descriptor] retain]; } @@ -39,8 +39,8 @@ - (void)syncWithMIDIEndpoint else newEndpointRef = NULL; - if (newEndpointRef == NULL) newEndpointRef = PYMIDIGetSourceByUniqueID (uniqueID); - if (newEndpointRef == NULL) newEndpointRef = PYMIDIGetSourceByName (name); + if (!newEndpointRef) newEndpointRef = PYMIDIGetSourceByUniqueID (uniqueID); + if (!newEndpointRef) newEndpointRef = PYMIDIGetSourceByName (name); if (midiEndpointRef != newEndpointRef) { [self stopIO]; @@ -54,7 +54,7 @@ - (void)syncWithMIDIEndpoint - (void)startIO { - if (midiEndpointRef == nil || midiPortRef != nil) return; + if (!midiEndpointRef || midiPortRef ) return; MIDIInputPortCreate ( [[PYMIDIManager sharedInstance] midiClientRef], CFSTR("PYMIDIRealSource"), @@ -66,7 +66,7 @@ - (void)startIO - (void)stopIO { - if (midiPortRef == nil) return; + if (!midiPortRef) return; MIDIPortDisconnectSource (midiPortRef, midiEndpointRef); MIDIPortDispose (midiPortRef); @@ -86,7 +86,7 @@ - (void)processMIDIPacketList:(const MIDIPacketList*)packetList sender:(id)sende NSEnumerator* enumerator = [receivers objectEnumerator]; id receiver; - while (receiver = [[enumerator nextObject] nonretainedObjectValue]) + while ((receiver = [[enumerator nextObject] nonretainedObjectValue])) [receiver processMIDIPacketList:packetList sender:self]; [pool release]; diff --git a/PYMIDI/PYMIDIUtils.m b/PYMIDI/PYMIDIUtils.m index a82fe1c..e1970e7 100644 --- a/PYMIDI/PYMIDIUtils.m +++ b/PYMIDI/PYMIDIUtils.m @@ -27,15 +27,11 @@ // Stick the two names together, handling all the cases where one or the other doesn't exist NSString* name; - if (endpointName != nil) { if (deviceName != nil) { - bool endpointNameBeginsWithDeviceName = - CFStringCompareWithOptions ( - endpointName, deviceName, - CFRangeMake(0, CFStringGetLength (deviceName)), - kCFCompareCaseInsensitive - ) == kCFCompareEqualTo; + NSString *endpointNameNS = (NSString *)endpointName; + NSString *deviceNameNS = (NSString *)deviceName; + bool endpointNameBeginsWithDeviceName = [endpointNameNS compare:deviceNameNS options:NSCaseInsensitiveSearch] == NSOrderedSame; if (endpointNameBeginsWithDeviceName) name = [NSString stringWithString:(NSString*)endpointName]; @@ -215,8 +211,8 @@ Boolean PYMIDIIsEndpointNameTaken (NSString* name) { - return PYMIDIGetSourceByName (name) != NULL || - PYMIDIGetDestinationByName (name) != NULL; + return PYMIDIGetSourceByName (name) || + PYMIDIGetDestinationByName (name) ; } diff --git a/PYMIDI/PYMIDIVirtualDestination.m b/PYMIDI/PYMIDIVirtualDestination.m index 0ff7865..16d209e 100644 --- a/PYMIDI/PYMIDIVirtualDestination.m +++ b/PYMIDI/PYMIDIVirtualDestination.m @@ -58,7 +58,7 @@ - (void)processMIDIPacketList:(const MIDIPacketList*)packetList sender:(id)sende pool = [[NSAutoreleasePool alloc] init]; enumerator = [receivers objectEnumerator]; - while (receiver = [[enumerator nextObject] nonretainedObjectValue]) + while ((receiver = [[enumerator nextObject] nonretainedObjectValue])) [receiver processMIDIPacketList:packetList sender:self]; [pool release]; diff --git a/View Classes/KeyTableView.h b/View Classes/KeyTableView.h index 56d039a..47effee 100644 --- a/View Classes/KeyTableView.h +++ b/View Classes/KeyTableView.h @@ -1,7 +1,7 @@ #import +#import - -@interface KeyTableView : NSTableView { +@interface KeyTableView : NSTableView { } @@ -11,7 +11,7 @@ - (void)moveUp:(id)sender; - (void)moveDown:(id)sender; -- (BOOL)validateMenuItem:(id )menuItem; +- (BOOL)validateUserInterfaceItem:(id) menuItem; - (void)clear:(id)sender; - (void)textDidEndEditing:(NSNotification*)notification; diff --git a/View Classes/KeyTableView.m b/View Classes/KeyTableView.m index 7984b5b..32d813b 100644 --- a/View Classes/KeyTableView.m +++ b/View Classes/KeyTableView.m @@ -25,7 +25,7 @@ - (void)deleteBackward:(id)sender - (void)moveUp:(id)sender { if ([self selectedRow] > 0) { - [self selectRow:[self selectedRow] - 1 byExtendingSelection:NO]; + [self selectRowIndexes:[NSIndexSet indexSetWithIndex:[self selectedRow] - 1] byExtendingSelection:NO]; } } @@ -33,12 +33,12 @@ - (void)moveUp:(id)sender - (void)moveDown:(id)sender { if ([self selectedRow] != -1 && [self selectedRow] < [self numberOfRows]-1) { - [self selectRow:[self selectedRow] + 1 byExtendingSelection:NO]; + [self selectRowIndexes:[NSIndexSet indexSetWithIndex:[self selectedRow] + 1] byExtendingSelection:NO]; } } -- (BOOL)validateMenuItem:(id )menuItem +- (BOOL)validateUserInterfaceItem:(id) menuItem { if ([menuItem action] == @selector(clear:)) return [self numberOfSelectedRows] > 0; From 39ecd25c8f852822244ae9917aa881ae2a9790c1 Mon Sep 17 00:00:00 2001 From: danomatika Date: Thu, 5 Dec 2019 16:58:07 +0100 Subject: [PATCH 02/28] xcode project modernization, use & for header search paths, build version to 1 --- .../MainMenu.nib/designable.nib | 0 .../MainMenu.nib/keyedobjects.nib | Bin .../PatchbayDocument.nib/designable.nib | 0 .../PatchbayDocument.nib/keyedobjects.nib | Bin Info.plist | 4 +- MIDI Patchbay.xcodeproj/project.pbxproj | 108 +++++++++++++----- {English.lproj => en.lproj}/InfoPlist.strings | Bin 7 files changed, 84 insertions(+), 28 deletions(-) rename {English.lproj => Base.lproj}/MainMenu.nib/designable.nib (100%) rename {English.lproj => Base.lproj}/MainMenu.nib/keyedobjects.nib (100%) rename {English.lproj => Base.lproj}/PatchbayDocument.nib/designable.nib (100%) rename {English.lproj => Base.lproj}/PatchbayDocument.nib/keyedobjects.nib (100%) rename {English.lproj => en.lproj}/InfoPlist.strings (100%) diff --git a/English.lproj/MainMenu.nib/designable.nib b/Base.lproj/MainMenu.nib/designable.nib similarity index 100% rename from English.lproj/MainMenu.nib/designable.nib rename to Base.lproj/MainMenu.nib/designable.nib diff --git a/English.lproj/MainMenu.nib/keyedobjects.nib b/Base.lproj/MainMenu.nib/keyedobjects.nib similarity index 100% rename from English.lproj/MainMenu.nib/keyedobjects.nib rename to Base.lproj/MainMenu.nib/keyedobjects.nib diff --git a/English.lproj/PatchbayDocument.nib/designable.nib b/Base.lproj/PatchbayDocument.nib/designable.nib similarity index 100% rename from English.lproj/PatchbayDocument.nib/designable.nib rename to Base.lproj/PatchbayDocument.nib/designable.nib diff --git a/English.lproj/PatchbayDocument.nib/keyedobjects.nib b/Base.lproj/PatchbayDocument.nib/keyedobjects.nib similarity index 100% rename from English.lproj/PatchbayDocument.nib/keyedobjects.nib rename to Base.lproj/PatchbayDocument.nib/keyedobjects.nib diff --git a/Info.plist b/Info.plist index a24bd72..2e133c0 100644 --- a/Info.plist +++ b/Info.plist @@ -26,7 +26,7 @@ CFBundleIconFile AppIcon CFBundleIdentifier - com.notahat.MIDIPatchBay + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -38,7 +38,7 @@ CFBundleSignature ???? CFBundleVersion - 1.0.4 + 1 LSApplicationCategoryType public.app-category.music NSMainNibFile diff --git a/MIDI Patchbay.xcodeproj/project.pbxproj b/MIDI Patchbay.xcodeproj/project.pbxproj index 36dd127..74d4295 100644 --- a/MIDI Patchbay.xcodeproj/project.pbxproj +++ b/MIDI Patchbay.xcodeproj/project.pbxproj @@ -39,12 +39,12 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ - 089C1660FE840EACC02AAC07 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = English.lproj/InfoPlist.strings; sourceTree = ""; }; 2A37F4B0FDCFA73011CA2CEA /* main.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 2A37F4B5FDCFA73011CA2CEA /* PatchbayDocument.nib */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = PatchbayDocument.nib; path = English.lproj/PatchbayDocument.nib; sourceTree = ""; }; - 2A37F4B7FDCFA73011CA2CEA /* English */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = English; path = English.lproj/MainMenu.nib; 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 = ""; }; + 3092FEA123995FA60057E329 /* Base */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = Base; path = Base.lproj/MainMenu.nib; sourceTree = ""; }; + 3092FEA223995FA60057E329 /* Base */ = {isa = PBXFileReference; lastKnownFileType = wrapper.nib; name = Base; path = Base.lproj/PatchbayDocument.nib; sourceTree = ""; }; + 3092FEA323995FA90057E329 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; C12C800205AECD9D0066E007 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; C12C800305AECD9D0066E007 /* MIDI Patchbay.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "MIDI Patchbay.app"; sourceTree = BUILT_PRODUCTS_DIR; }; C152A6E907559AE9004FF49E /* AppIcon.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = AppIcon.icns; sourceTree = ""; }; @@ -274,14 +274,15 @@ 2A37F4A9FDCFA73011CA2CEA /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0610; + LastUpgradeCheck = 1030; }; buildConfigurationList = C101046C088A0A7C001DFE4F /* Build configuration list for PBXProject "MIDI Patchbay" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 1; knownRegions = ( en, + Base, ); mainGroup = 2A37F4AAFDCFA73011CA2CEA /* MIDI Patchbay */; projectDirPath = ""; @@ -343,7 +344,7 @@ 089C165FFE840EACC02AAC07 /* InfoPlist.strings */ = { isa = PBXVariantGroup; children = ( - 089C1660FE840EACC02AAC07 /* English */, + 3092FEA323995FA90057E329 /* en */, ); name = InfoPlist.strings; sourceTree = ""; @@ -351,7 +352,7 @@ 2A37F4B4FDCFA73011CA2CEA /* PatchbayDocument.nib */ = { isa = PBXVariantGroup; children = ( - 2A37F4B5FDCFA73011CA2CEA /* PatchbayDocument.nib */, + 3092FEA223995FA60057E329 /* Base */, ); name = PatchbayDocument.nib; sourceTree = ""; @@ -359,7 +360,7 @@ 2A37F4B6FDCFA73011CA2CEA /* MainMenu.nib */ = { isa = PBXVariantGroup; children = ( - 2A37F4B7FDCFA73011CA2CEA /* English */, + 3092FEA123995FA60057E329 /* Base */, ); name = MainMenu.nib; sourceTree = ""; @@ -370,15 +371,15 @@ C1010469088A0A7C001DFE4F /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + CLANG_ENABLE_OBJC_WEAK = YES; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; FRAMEWORK_SEARCH_PATHS = ""; GCC_DYNAMIC_NO_PIC = NO; - GCC_ENABLE_FIX_AND_CONTINUE = YES; GCC_GENERATE_DEBUGGING_SYMBOLS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_USE_GCC3_PFE_SUPPORT = NO; - HEADER_SEARCH_PATHS = ""; + HEADER_SEARCH_PATHS = "$(inherited)"; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; LIBRARY_SEARCH_PATHS = ""; @@ -386,8 +387,9 @@ ONLY_ACTIVE_ARCH = YES; OTHER_CFLAGS = ""; OTHER_LDFLAGS = ""; + PRODUCT_BUNDLE_IDENTIFIER = com.notahat.MIDIPatchBay; PRODUCT_NAME = "MIDI Patchbay"; - SDKROOT = macosx10.10; + SDKROOT = macosx; SECTORDER_FLAGS = ""; VALID_ARCHS = x86_64; WARNING_CFLAGS = ( @@ -403,14 +405,14 @@ C101046A088A0A7C001DFE4F /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + CLANG_ENABLE_OBJC_WEAK = YES; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = YES; FRAMEWORK_SEARCH_PATHS = ""; - GCC_ENABLE_FIX_AND_CONTINUE = NO; GCC_GENERATE_DEBUGGING_SYMBOLS = NO; GCC_OPTIMIZATION_LEVEL = 3; GCC_USE_GCC3_PFE_SUPPORT = NO; - HEADER_SEARCH_PATHS = ""; + HEADER_SEARCH_PATHS = "$(inherited)"; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; LIBRARY_SEARCH_PATHS = ""; @@ -418,10 +420,11 @@ ONLY_ACTIVE_ARCH = YES; OTHER_CFLAGS = ""; OTHER_LDFLAGS = ""; + PRODUCT_BUNDLE_IDENTIFIER = com.notahat.MIDIPatchBay; PRODUCT_NAME = "MIDI Patchbay"; - SDKROOT = macosx10.10; - "SDKROOT[arch=i386]" = macosx10.10; - "SDKROOT[arch=ppc]" = macosx10.10; + SDKROOT = macosx; + "SDKROOT[arch=i386]" = macosx; + "SDKROOT[arch=ppc]" = macosx; SECTORDER_FLAGS = ""; VALID_ARCHS = x86_64; WARNING_CFLAGS = ( @@ -437,12 +440,39 @@ C101046D088A0A7C001DFE4F /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - ALWAYS_SEARCH_USER_PATHS = YES; - HEADER_SEARCH_PATHS = ""; + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = "$(PROJECT_DIR)"; MACOSX_DEPLOYMENT_TARGET = 10.10; ONLY_ACTIVE_ARCH = YES; - SDKROOT = macosx10.10; - USER_HEADER_SEARCH_PATHS = .; + SDKROOT = macosx; + USER_HEADER_SEARCH_PATHS = ""; VALID_ARCHS = x86_64; }; name = Debug; @@ -450,16 +480,42 @@ C101046E088A0A7C001DFE4F /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - ALWAYS_SEARCH_USER_PATHS = YES; + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_NO_COMMON_BLOCKS = YES; GCC_VERSION_i386 = 4.0; GCC_VERSION_ppc = 3.3; - HEADER_SEARCH_PATHS = ""; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + HEADER_SEARCH_PATHS = "$(PROJECT_DIR)"; MACOSX_DEPLOYMENT_TARGET = 10.10; ONLY_ACTIVE_ARCH = YES; - SDKROOT = macosx10.10; - "SDKROOT[arch=i386]" = macosx10.10; - "SDKROOT[arch=ppc]" = macosx10.10; - USER_HEADER_SEARCH_PATHS = .; + SDKROOT = macosx; + "SDKROOT[arch=i386]" = macosx; + "SDKROOT[arch=ppc]" = macosx; + USER_HEADER_SEARCH_PATHS = ""; VALID_ARCHS = x86_64; }; name = Release; diff --git a/English.lproj/InfoPlist.strings b/en.lproj/InfoPlist.strings similarity index 100% rename from English.lproj/InfoPlist.strings rename to en.lproj/InfoPlist.strings From 2257a3ad296f186acd37895ec5342eb27e106e38 Mon Sep 17 00:00:00 2001 From: danomatika Date: Thu, 5 Dec 2019 17:05:49 +0100 Subject: [PATCH 03/28] fix conversion warnings --- Controller Classes/EndpointTableDataSource.m | 6 +++--- Controller Classes/PatchTableDataSource.m | 4 ++-- Controller Classes/PatchbayDocument.m | 10 +++++----- Model Classes/Patch.m | 2 +- PYMIDI/PYMIDIManager.m | 8 +++++--- PYMIDI/PYMIDIRealDestination.m | 4 ++-- PYMIDI/PYMIDIRealEndpoint.m | 4 ++-- PYMIDI/PYMIDIRealSource.m | 4 ++-- PYMIDI/PYMIDIUtils.m | 14 +++++++------- 9 files changed, 29 insertions(+), 27 deletions(-) diff --git a/Controller Classes/EndpointTableDataSource.m b/Controller Classes/EndpointTableDataSource.m index 930a9a1..9d4dfbc 100644 --- a/Controller Classes/EndpointTableDataSource.m +++ b/Controller Classes/EndpointTableDataSource.m @@ -38,7 +38,7 @@ - (void)setEndpointArray:(NSMutableArray*)newEndpointArray - (int)numberOfRowsInTableView:(NSTableView*)tableView { - return [endpointArray count]; + return (int)[endpointArray count]; } @@ -104,7 +104,7 @@ - (void)deleteSelection:(NSTableView*)tableView } else { - [self tableView:tableView removeEndpointAtIndex:[tableView selectedRow]]; + [self tableView:tableView removeEndpointAtIndex:(int)[tableView selectedRow]]; } } @@ -136,7 +136,7 @@ - (void)tableView:(NSTableView*)tableView newEndpointWithName:(NSString*)name // Allocate the new endpoint and add it to the endpoint array newEndpoint = [[endpointClass alloc] initWithName:newName]; - [self tableView:tableView addEndpoint:newEndpoint atIndex:[endpointArray count]]; + [self tableView:tableView addEndpoint:newEndpoint atIndex:(int)[endpointArray count]]; [newEndpoint release]; } diff --git a/Controller Classes/PatchTableDataSource.m b/Controller Classes/PatchTableDataSource.m index 80c097b..5ccb971 100644 --- a/Controller Classes/PatchTableDataSource.m +++ b/Controller Classes/PatchTableDataSource.m @@ -38,7 +38,7 @@ - (void)setPatchArray:(NSMutableArray*)newPatchArray - (int)numberOfRowsInTableView:(NSTableView*)tableView { - return [patchArray count]; + return (int)[patchArray count]; } @@ -91,7 +91,7 @@ - (void)tableView:(NSTableView*)tableView setObjectValue:(id)value forTableColum - (void)deleteSelection:(NSTableView*)tableView { - [document removePatchAtIndex:[tableView selectedRow]]; + [document removePatchAtIndex:(int)[tableView selectedRow]]; } diff --git a/Controller Classes/PatchbayDocument.m b/Controller Classes/PatchbayDocument.m index 0a26042..b361de1 100644 --- a/Controller Classes/PatchbayDocument.m +++ b/Controller Classes/PatchbayDocument.m @@ -237,7 +237,7 @@ - (void)midiSetupChanged:(NSNotification*)notification - (void)selectedPatchChanged:(NSNotification*)notification { - int patchIndex = [patchTable selectedRow]; + int patchIndex = (int)[patchTable selectedRow]; if (patchIndex != -1) selectedPatch = [patchArray objectAtIndex:patchIndex]; @@ -260,7 +260,7 @@ - (IBAction) addPatchButtonPressed:(id)sender { if (selectedPatch != nil) { Patch *patch = [[Patch alloc] initFromPatch:selectedPatch]; - [self addPatch:patch atIndex:[patchArray count]]; + [self addPatch:patch atIndex:(int)[patchArray count]]; [patch release]; } else { @@ -278,7 +278,7 @@ - (IBAction) addPatchButtonPressed:(id)sender do { output = [enumerator nextObject]; } while ([output isIACBus]); Patch *patch = [[Patch alloc] initWithInput:input output:output]; - [self addPatch:patch atIndex:[patchArray count]]; + [self addPatch:patch atIndex:(int)[patchArray count]]; [patch release]; } @@ -632,7 +632,7 @@ - (void)setShouldRemapChannel:(BOOL)shouldRemapChannel forPatch:(Patch*)patch - (IBAction)remapChannelPopUpChanged:(id)sender { - [self setRemappingChannel:[remapChannelPopUp indexOfSelectedItem] + 1 forPatch:selectedPatch]; + [self setRemappingChannel:(int)[remapChannelPopUp indexOfSelectedItem] + 1 forPatch:selectedPatch]; } @@ -1105,7 +1105,7 @@ - (IBAction)endpointPanelButtonPressed:(id)sender - (void)endpointPanelDidEnd:(NSWindow*)sheet returnCode:(int)returnCode contextInfo:(void*)contextInfo { - int tab = [virtualEndpointTabView indexOfTabViewItem:[virtualEndpointTabView selectedTabViewItem]]; + int tab = (int)[virtualEndpointTabView indexOfTabViewItem:[virtualEndpointTabView selectedTabViewItem]]; if (panelWasOpenedToInputs) { if (tab == 0 && [inputTable selectedRow] != -1) { diff --git a/Model Classes/Patch.m b/Model Classes/Patch.m index 4a15cab..59b7e01 100644 --- a/Model Classes/Patch.m +++ b/Model Classes/Patch.m @@ -504,7 +504,7 @@ - (void)setOutput:(PYMIDIEndpoint*)newOutput for (i = 0; i < packetList->numPackets; i++) packet = MIDIPacketNext (packet); - return (void*)packet - (void*)packetList; + return (unsigned int)((void*)packet - (void*)packetList); } diff --git a/PYMIDI/PYMIDIManager.m b/PYMIDI/PYMIDIManager.m index ab1af66..968ffc6 100644 --- a/PYMIDI/PYMIDIManager.m +++ b/PYMIDI/PYMIDIManager.m @@ -112,6 +112,8 @@ - (void)processMIDINotification:(const MIDINotification*)message [[NSNotificationCenter defaultCenter] postNotificationName:@"PYMIDISetupChanged" object:self]; } break; + default: + break; } isHandlingNotification = NO; @@ -143,7 +145,7 @@ - (void)updateRealSources // Find any non-virtual endpoints that we don't already know about int i; - int count = MIDIGetNumberOfSources(); + int count = (int)MIDIGetNumberOfSources(); for (i = 0; i < count; i++) { MIDIEndpointRef midiEndpointRef = MIDIGetSource (i); @@ -220,7 +222,7 @@ - (void)updateRealDestinations // Find any non-virtual endpoints that we don't already know about int i; - int count = MIDIGetNumberOfDestinations(); + int count = (int)MIDIGetNumberOfDestinations(); for (i = 0; i < count; i++) { MIDIEndpointRef midiEndpointRef = MIDIGetDestination (i); @@ -317,4 +319,4 @@ - (NSString*)nameOfNote:(Byte)note -@end \ No newline at end of file +@end diff --git a/PYMIDI/PYMIDIRealDestination.m b/PYMIDI/PYMIDIRealDestination.m index 09ed862..5749ce8 100644 --- a/PYMIDI/PYMIDIRealDestination.m +++ b/PYMIDI/PYMIDIRealDestination.m @@ -33,7 +33,7 @@ - (void)syncWithMIDIEndpoint if (midiEndpointRef && PYMIDIDoesDestinationStillExist (midiEndpointRef)) newEndpointRef = midiEndpointRef; else - newEndpointRef = NULL; + newEndpointRef = 0; if (!newEndpointRef) newEndpointRef = PYMIDIGetDestinationByUniqueID (uniqueID); if (!newEndpointRef) newEndpointRef = PYMIDIGetDestinationByName (name); @@ -64,7 +64,7 @@ - (void)stopIO if (!midiPortRef) return; MIDIPortDispose (midiPortRef); - midiPortRef = nil; + midiPortRef = 0; } diff --git a/PYMIDI/PYMIDIRealEndpoint.m b/PYMIDI/PYMIDIRealEndpoint.m index a05affe..34cb3ec 100644 --- a/PYMIDI/PYMIDIRealEndpoint.m +++ b/PYMIDI/PYMIDIRealEndpoint.m @@ -10,7 +10,7 @@ - (id)initWithMIDIEndpointRef:(MIDIEndpointRef)newMIDIEndpointRef self = [super initWithMIDIEndpointRef:newMIDIEndpointRef]; if (self != nil) { - midiPortRef = nil; + midiPortRef = 0; } return self; @@ -22,7 +22,7 @@ - (id)initWithDescriptor:(PYMIDIEndpointDescriptor*)descriptor self = [super initWithName:[descriptor name] uniqueID:[descriptor uniqueID]]; if (self != nil) { - midiPortRef = nil; + midiPortRef = 0; } return self; diff --git a/PYMIDI/PYMIDIRealSource.m b/PYMIDI/PYMIDIRealSource.m index 8921645..b46a45f 100644 --- a/PYMIDI/PYMIDIRealSource.m +++ b/PYMIDI/PYMIDIRealSource.m @@ -37,7 +37,7 @@ - (void)syncWithMIDIEndpoint if (midiEndpointRef && PYMIDIDoesSourceStillExist (midiEndpointRef)) newEndpointRef = midiEndpointRef; else - newEndpointRef = NULL; + newEndpointRef = 0; if (!newEndpointRef) newEndpointRef = PYMIDIGetSourceByUniqueID (uniqueID); if (!newEndpointRef) newEndpointRef = PYMIDIGetSourceByName (name); @@ -70,7 +70,7 @@ - (void)stopIO MIDIPortDisconnectSource (midiPortRef, midiEndpointRef); MIDIPortDispose (midiPortRef); - midiPortRef = nil; + midiPortRef = 0; } diff --git a/PYMIDI/PYMIDIUtils.m b/PYMIDI/PYMIDIUtils.m index e1970e7..e86e963 100644 --- a/PYMIDI/PYMIDIUtils.m +++ b/PYMIDI/PYMIDIUtils.m @@ -91,7 +91,7 @@ return endpoint; } - return NULL; + return 0; } @@ -109,7 +109,7 @@ if (name != nil && [name isEqualToString:nameToMatch]) return endpoint; } - return NULL; + return 0; } @@ -147,7 +147,7 @@ return endpoint; } - return NULL; + return 0; } @@ -164,7 +164,7 @@ if (name != nil && [name isEqualToString:nameToMatch]) return endpoint; } - return NULL; + return 0; } @@ -176,14 +176,14 @@ MIDIEndpointRef endpoint; SInt32 usedID; - count = MIDIGetNumberOfSources(); + count = (int)MIDIGetNumberOfSources(); for (index = 0; index < count; index++) { endpoint = MIDIGetSource (index); MIDIObjectGetIntegerProperty (endpoint, kMIDIPropertyUniqueID, &usedID); if (usedID == uniqueID) return true; } - count = MIDIGetNumberOfDestinations(); + count = (int)MIDIGetNumberOfDestinations(); for (index = 0; index < count; index++) { endpoint = MIDIGetDestination (index); MIDIObjectGetIntegerProperty (endpoint, kMIDIPropertyUniqueID, &usedID); @@ -201,7 +201,7 @@ static SInt32 sequence = 0; do { - uniqueID = time (NULL) + sequence++; + uniqueID = (SInt32)time(NULL) + sequence++; } while (PYMIDIIsUniqueIDInUse (uniqueID)); return uniqueID; From 5625a0a2dad0a157e1b251dc1ce6be37d4f47f2a Mon Sep 17 00:00:00 2001 From: danomatika Date: Thu, 5 Dec 2019 17:40:29 +0100 Subject: [PATCH 04/28] rework table view data source into base class to avoid need for performSelector: which was causing ARC warnings --- .../PatchbayDocument.nib/designable.nib | 48 +++++++++--------- .../PatchbayDocument.nib/keyedobjects.nib | Bin 29857 -> 35080 bytes Controller Classes/EndpointTableDataSource.h | 5 +- Controller Classes/PatchTableDataSource.h | 4 +- Controller Classes/TableDataSource.h | 8 +++ Controller Classes/TableDataSource.m | 7 +++ MIDI Patchbay.xcodeproj/project.pbxproj | 6 +++ View Classes/KeyTableView.m | 9 ++-- 8 files changed, 52 insertions(+), 35 deletions(-) create mode 100644 Controller Classes/TableDataSource.h create mode 100644 Controller Classes/TableDataSource.m diff --git a/Base.lproj/PatchbayDocument.nib/designable.nib b/Base.lproj/PatchbayDocument.nib/designable.nib index 0642ecd..b11bb5f 100644 --- a/Base.lproj/PatchbayDocument.nib/designable.nib +++ b/Base.lproj/PatchbayDocument.nib/designable.nib @@ -1,8 +1,9 @@ - - + + - + + @@ -52,11 +53,11 @@ - + - + @@ -74,7 +75,7 @@ - + @@ -90,14 +91,13 @@ - -

- - - - - - - - - - - - + @@ -249,6 +177,24 @@ + + + + + + + + + + + + + + + + + + @@ -258,7 +204,7 @@ - + @@ -267,18 +213,8 @@ - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -299,7 +262,7 @@ - + @@ -328,17 +291,8 @@ - - - - - - - - - - + @@ -347,7 +301,7 @@ - + @@ -355,7 +309,7 @@ - + @@ -363,7 +317,7 @@ - + @@ -371,16 +325,8 @@ - - - - - - - - - + @@ -412,13 +358,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -525,7 +523,7 @@ DQ - + diff --git a/Base.lproj/PatchbayDocument.nib/keyedobjects.nib b/Base.lproj/PatchbayDocument.nib/keyedobjects.nib index aa0d60ea123db1c5a9c612cbb886f102d22d838e..b4a6ba35ce34eea09831f6c7817af32926cb0fbd 100644 GIT binary patch delta 20660 zcmc(`2YeJ&_cuOw`fl20lh8{bKzg#-B%2=6d+*saHp_&~Zb%S94X`r^NJm^m6zNqu z(xn#x6+wD$iijd8hzLk|&&(ze)W_fR|G%H#=gnr5-7|M?IrV$bJu_(n{&YP4ZX4n= zn;kRSd!k7*;=|3@3+yGr5JI-74Qh`%pa2w%Qc)JlMun&d6(cRGL{+E{(xbk}hz6lX zGzyJI0vd-Vp!d-GXck(8R-tuhGun*~qm$?iI*YENYv?C*2mOrxK#y@8CvXzC#hvkX zcqiNycf&n!Puvd=z=LpeG~OFe!jthbyb3qq4ft?;1U?R*j=zh~#NWqf;|uVG_#%8M zz8^n;AHk2~-{7b4)A(il3VszkhF`;P;XmL%;y+^yeiwg2-~>(B5-vm+qASsj=uUVL zDk6XgBEpFnBAX~B%83eM0MSScCWaFuiE+euGck>rPRu4gBo-4Zh);;M#71Hhv5VME z93hSp$B7HXW#S5PlekCRCms-wNrq%ed(wq$Lv|*+kUhy>q&w+HMv#$Y0+~prk?CXs zSxA$hXPK

r$X(2x(=aS3F<>WeYJ-LDWlr(Q4x05Hy^W=}@ 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 urhX=a$!Hp6YBUWs@uumfnWkl?b*7`HiYhsg delta 20675 zcmc(G2Vm1y*S4-COLm;$I0?I~0NII0oayYn_a4S^><~L7kc8C$mI}0N3S#fQ_a3EC z_9#%GP&Sm&J%E;$LV5X*FdBk}qG4zxvZD9U2WTdmg%+a~XdT*!cA?#9 z4?2iWpij|f=yP-heTnX(2k1NWJ^B$nM9&P!cgK6+eQ*!l z7Z1Q=@K`(!PsDR^YaX7D7vp-o3a`Oy@j84kJ`8^spNvn#m*Z>jwfJUy3%(WKf$zch z;`{KA@dNl#{49PBzk*-IZ{T08nL>Q4kBoawP zHjzUV5=BHgQ9<-2%!Gw#B$|jZ#5iJ_m6$^;CstuJv6|RU>?b}UjuW2|SBZPXec~tL zXW|#)SK@c#C5e%UB+2e%53&#GNBWaWQbmT5;iMKjOGc3KWCEE)CX=aT8ks|ukfme= zX&`IKq2zny81j8`HaVYMKrSJdlN-q`LfwD2k#fd&+^5Q!Z2o%9rw^La0zGkxHYos1iy? z^`#7ynd(mspaxQdsUg&GY6SHjHHsQbjiV-0i>W2ldTIl;mD))ippH_wOKU3CUsVCGk>N$JNo#@VV7rH0yL91vD9Yjac zQFJt&LFdpVbR}I!H`0UYA@pdBrpM6l)6-~*&q&PI?!; zpFT{VpfA%m=sWb6^pEsU^fUT7{ihfclVXurW)-`LUBz9*?})pKyNSDtdx(3A-Nl|_ zFR{NkKpZI6h{MF;;%IS1M z;t$1B#WTgT#Ph`q#7o7?#H+wYni$4{g5nm8r6uVy$ zUlrdH-xl8&Kak{0iX_F7<8}j4Gxid#K{{z?v>g##Z?dtSv_M)YEs_>XOQfaJGHJQA zLRyKf<2I11+HaL^lWv#pknWW3lJ1u7k?xi5lYT7ygewv~?r@JqU$W>Hi%(=k@WJ8} zSbP$T?rzgleUP;ii@LC=D~r0bs3(hhv8WG=JXz$;qA(U|Sro~lXcon?D2GLPEGl48 z5sOM#RK}tT7U@`|XVEeitzgkA7Oi2?Iu>nU(MA?+V$o(6ZDG+?7HwnEb{6em(QX#) zWzk10`j|xrS#*fA7x$o8bd5zfw)u%wNDO^&VKC+su0|4U*RG{S6B_K>T^+h@m1HEI z*^%jVTPDZ8#O`AEu>05p>?`bR>>KP`>^tmxOpg74{fPa9{fs@t9$}BM3D~dL6KpK@ zJ2nyf1AB%&hu;_2zd)@RLf8aQYK^_0t|Bw9sJ6bkVMu;$bDgmyGcQ9wG_UquV|kmr zu+}()7uVMFVx7#j?M6yduCb}Pp;2E|2jX^Z;<$$TW@CMGYc<>+`*%1y2Pf`l`_3KT z@|3MsuDwI1m4QiU$JnvRO~Sxrv}cj4@Y#XsA;aZ;hhiAhjlpEJPS&NRB}Ae2*Z6i1 z3=Z+vjPUK=5~@+d|AG`FMiknHQ{2{{(!cJ#_VohhgUOK{R=*lakv($2nyttQ$&fRW zGwzIm8O}(UG0b>oIy0NGzb$h{Zm1nVgeN?_dn-in^ih zs0Zo^pS@6T(EE67Eb>HN$Q$_}U(mO|PUgg`x2C?=`F`_v79MqdNWl_DYq}eJF^#42;iu&^^)@h5;O)lPDA$fenZ5g`seyg)0(8!GL41iSQZE1xF@YnOqskc)*pz6fo}2 z2$O&U`Y@QSjU=po3DUw{P(o*HGSrxc(y@18@EIr*Wq~rXQ4Y#Qc_<$hph8rHiZNIo z*ho~0F<5t0hRRWe(4Gz(4V|q*2Dqw`5t&d8>W6CEAv3bTfBQq18sLF}ps6O*%(+Fy z$(=LvV)X_~O=H8L`s%obx`sxsFzQ1)Kx6*k#5#RV6ZcirqBL)bj1+?g(qtHu&1AVp z+ti0KUhdKHw(oK|2wh&b{$qTYEGAvz9xb-rg|hyjRZkh>4oCN}1}cL`TmrRC1{E?e z&l6A!8V;W^@Qg3x$6&=RN`Rh9G2#N&8|#A@#8&7s^WqvB>y3^4YFUmL>~riA=4Dgi zD6D=d8jZ#<0Zam8e+7+2?7fTxA0mZJ5T*CnW96Iz8fqb+DH z+6Gj<1MP&)2~T9|`x{{e#Oa&$bqzKA|JuriFo8_4jADYAkixuSP0hysuy*%*^BeXM5;8y6}c_mZFQ8*BcVsbC=L%oeWT&&sUZ#j3>@mSGNLPLSJBKF{oDH z2!4###9CurHGlUCO!Ue(rur%@86Xi@|C43#- z`QmL;d5@pUSS7{;zBwsh+a?7x9?R=nCzBa~!5ga@>RzeZ*7+~c56j!SX_Nefeg@qL zgMkSh)E{vE6XtadFfAY)Jpz3`7EnGGdi*PT0w`aDI9TaV(I4m;=M&eB_Fz(&BqpBA ziF36k77Wlg8~VK+*)MI#7J!`01G#lzIKdC>bvQDC|EMxtVpCbGwo-X*wbkQbeWjr` zk?fV^4V~exyw31;ptB6nS!PL1W37#!UIQiG5$^=W0hAdE|3Fn>P_RlJq)}lB3V)3a zoPrYZu6VafSOj(YCTmmP5dDAw#>S<1R~`wjEiFpl?n>Ug1*${9ya6!*GrhK=aCf02 zy`dv{(2;yFu)^du)cuV&U+jQ{m5@a&xGGMPuuiAMRhu z_p5e*z-hRjjni)83f>N4@8U{ag^k43z?4=@jt624uEBQUK|u3T{^Csx9)U-KbOIRT z7z1zc;7h)~vBucU$r7}knPR3$4AurNFggN1GZ?~{5~i55Bq*$SJe~l3$TKuH)YTaq zSK#s3MO!a!;0nGE(C(`~K!1cj;K|r%JhH6^Co4AUkknVWDrPw^)M1Tpw&A0{F z!ZuEuw#{6crn43AkJrO!2H*q1pWr=;3D`uCd)3scS5!G%d|eHwz*FJ|m@vi2~d zU>K1)ROq@&#apVN5hHHPT(CuW3$_>^jxEKOV9T%-Kq|}e5%@@KHMRz~;tb9L$*jfJ zp*8q>_$X{6wxI*I3EKkR(H(3eJ`Nv`?F3J9A`Ej9H^FhJUYM`Z(O_HpF>Xvd#+5Nh zm|CVrB4OTrWnr-W_!Qp4IE&nP!*U(x@R9g*T!GI3rOkvnn}yHD=iqap{`vRTEKWV$z}RQir}Wp?7y$|3C?yOWR6Cg4?&O|WE5~GD8wWBLrV%<|V$4j# zMW}BD)Vva3g|7xXlVPkMlmh0XiD_b*nPCO|cjZNV9Xzrg-+*t#H*xRCx`^tSdZs@Y zDeFe!+wkq2Ugp{!--da;{@`wge`o+VQRZvKKf?DzZ`vwfihqQ8m1Z^fvzh-U+l(9p z?+hP>AHolVeg-i^82f9s!9&|KT8FN9HS|UJLSf*iK?%!1i;XZUeoTX5d<{akRj-O$ z|3mppe=9%qRe7}yYS-}VV7mCOFU7C5;qNAXOR!7X4Fd`W#13k1Zm8!?$4dMrejEGL zW|@GbS_j;tKY!C!-Iw@XFafWXTZw;(o##?C?^yBs_yYmF-@FE1D>IS@?}#_R`_o_G z4ORl>{qKVJF%Mp=0A2?HyiZ>TFSd(eS^+y;!mu{L{xdM2z6Q+uHef=bHq=?)Kpi2* zR|C@CV}@P8tUwinln23M!hvvvHb*g|{}}{)Gd2+1$88{BTR~v8f#B8j|84ePFKC;6 zTfx3=jFl0l|2j5QAj=k5-@}2f`OOQ1v4lI(3mc7%!QLl4Uz?$^%m-q|k?Fv^|N0ye z{;hKa)EKM~wxrx=F2Qb2L=d(e+X2+Dt5v6Cm~mVe*IpfnaA-nHL|~(dC?fh*124H^ zS0C#nW`dZR$Z)Mq2#l)O4DJg~98Is=p5&o5;*$X8haGLlnG)u?;;C zw7?JjZR2%*HQs?l7VJ%VkB=Yftir58%`nVcL^Cl6wZj625rc(kmZN-Z1Tlmd%5MUR zVZ^&c3o)D+0kbilu%ct|7Z{xw#f5o!(Lf7{;Q4XydHGw9Fo&7B%pn#z^BZzGV+W)@ zr*%(AybpUqq6O~TUjal7vtbHanNOI5%skjb&t|qT7;LTu zZX`IYemOCnm_f`WrZDrFmCOdXZQq7dIc61L+FB(`%q8aWL_#ct-nS4-zzU8BMJ{F* z@>H?_Ix?48)Mg2Z6@LL$6%q)#R0Q#e;=?HaZ9@nSO`9bo*6?J)a|tn>=MrMm-?(H+ zEAHn@n5F*(mq6K9Mvj=<$|Xx*amnIWT*5n4D~SUFnJnYUgy)h&z$L^Q;s|k+S;8!5 zR{SHE2+asw0*%sa9kU)h$h;x7uuHJ5zbC|RT$WG!Fyaa3WkX~4zj{VICH^3u z3B8)Z_lnufY-BbGU0TVzf52ryDsHh)cPojL1ixP!1Ocu7f(J(8Hc#`m%#9QQup#6@ zQYeF@NiiwG2KfeN8~4b! ztBmXk(FD?+?8R(nc0<62`z*LacWfQDzD={F7wK)&D>^2qbSJZeEAsQP=M_o@5RaK% z%zAFJpNBW8{#&`=wsNQ$cF6hqn%44rxZ8fEVXrk1)AnHN10OT(8RvpreRXYvFe{KM zNL)c;ZO%H!XghL02GCYAWtmN>Ha|58_B6o)-3JD%V0DHnTRm(torn4`GLy_=jxfhr zBxdY^mdRYKk<3F|$b6!OECh;42g>3niw_9ttN3rsG0@dfV4Eq$asBl5^~O5z#=yfS z%gFKy>#N6jH*hIgCd4QHs+H7{efe6Uk`pYV`C2Xmn1%xxFfh*$2_lUc2cP|b*f8cK zkQ>ChC}DMyW~_caX(8*#{$xGbKn@@Wl8s~&*-Q>12Q#Ob3(RH4UD8nhSdvt7Ti0Q1m?F)vvA8eJ0na^Ii^yD1u7&(^@8hN%BILEk@Bpd4n8=E1n zY18*YauL6ysjG#M4G;6>EK>=%CQ@|zWb6x=# z-%!A&zsQ|efKnj@f7OBpV3+e>X`l{T*#XNDG=RN?UtR+{n9K_>c-=u^Fw9vP>ebgt z4(1)EncPe6<0xKBSmE$fmSGf>% zFRn}@wUTGZv%=WVzgG24<_16Z>u-$xi@%Ls9r8al`>>IOu?w^RYV6Y)>ou`3H1_-3YeL$V|07ubk|d<{tClA9(KB-)QJAX9^DJ z^>DmB~a^InePpo$is#A{zUCX9l#Vs zznayT;Ie$rd?yB{_ch3r zO%(OPHi|q&UbfwLHh8?>@@}An`2qU;vm67L_YDtL zPDM(Q$`%cR&|sX>7MOaog5Xy!@I&4OE@^HHEZ+db#|L4C0znE15h7fq6-B^unJ9|F zMvG$j(PQJ`7sif_!6xWrUBT!z)N@-xf~}9m%r7=wNMO5Rv&QNWJ{Y44!#^w74;LV3XWq19 zP&JDjxjb!=RrI+KMXNvd^|0@aNb7Y#`PMOV^c{ zDf$W<%-{^<<~wuQ$?gus6wwcY1TysRa7?n7136IiSdctoQ8#X9a&HH+LG)CR++tA= z?we!}M{=;}U%Uh+kVWoXmlO{NvW_B!hc2+FHdnu)zeLO;KNf}X2~<9BsNo6?j}UE9p3 z^q{#Q7O9zdNG>;R7If$yU3w4azrl##lGw7Mc~m)CKvkked}fP98b-sSK%LB`u(q*z zkiM>aMoN52cOi(?)S8x}^kA|7>x>uW#uG4AgKj}a_zpDBGY*S_A?MYWJEJU}`KpAh zU|Z$&uOwVUdOHWQnQ9gg3mcYjZd!UDIayD=D@fqbN(7JY_MEk{J=Z@)DkmE$M!5Ba zMN#~%4&0QA4%{EvQU~Nfy)WDv&Y~F3Kcka%0yU8ruqcj2**x<97ta?^Q(obI8pXW@ z_p{oL7f{ov`Pc+%A)GCm$XZb%kNN}_W!X^Aq9oy5fFMie`85822I&*13DgQe`YHkG ztEja$q{HCgX9`omqKN<`ab~kbzE-aaS7*#QvMm2yQw{|aQP9npPB$| z0g_W8v$`qM%{%Tb&;#Th0^}WOLtZ+Myfp5o%nrPN2-$z?_elg9XY)TI!mB7!MZZGM!3=-0*8p*?4^hbw_w;C5!U8 zkFt6?5Ys6e)6Zv7A@_Y&4@c2Ql)&_Yy(;E9X1hC({V5yOUuID$my+GhfgC{DsQz0P zm2-o#`#6vmN}zh?6pJdk)!9J)gJ^;2g{^yE?nbs(orD&co<&tGTFQgiNjRN#AI@hz zfOA=2!?~>Q!2Y~Cmqj~Z6KE$|Mmxi4tcln&+6{XF5h9Fk59GXtMFt*sOITFRA`_f` zf?0%fP>WdvHrdDx%n7%4rMtlvi{nqDu&9QG$-|gW1p1=gAv8qyqI=%vk>`bQLWIrsV(k6t6R68ZY`WoZiqDm+l+02mcniR z03Z5iQGW)GYeB=$I@|hJTZdr0UwNpzYvV3)36CF`hZ36 zvuFT|#y|*K=!_gbC7_N5h%(!Tn+dCehP5@|t#N2NkItui)4jn$2yti@jb_n6(2MZX z*c!{GOF?H~M#2Si@$P@`s8=wY^`dpC2i=$If_hQjbR0GwhGL>?kT>0r*1-&eE(f!y z1?(mRzz7hAGJv~N*j3#GclfCrZW}~@*y>VUXdUG(*jOkOz}VYvHSwz+6zjt&i#q1r z;tk?IXWr>y*e)9U_rHu{Tkf4VibGj6ap8Hz>bzvdz-|wU6VI1y~Er#aMbA zHkzJ*z27=Si0NZvU=mmsF;L%oysHS41V2`Qp(EF&xSQ{E$d1!9STy3_(&O}ON^MJz zvuGr5nEBjzHxb0P=>=R$L2~Vib;dLG;{G@PphY>fL`JP@?M zjqc4y?u5>a<>5c2&}KB>aH;7%^xn1y$Fpdm@ZjHqeDnd{r=}0teCi1{pW3>>HYrDV zysV<39au5{{iA`@G=R$~`0PcWq4xk>_Rycv=K(Gk=!?+SCBf!Qhff|Z(^v$38=obU z#dOCo;deIoW1+Kp5{o|Mu`|Qg7YGO~qo&ap=`%v{520imc5d?6fpruI*y)t^pO0+N z_W(Al_zV1-Rj7Nf@&=2{;7j1Q+7^qJ;e8D0PPG9_0 z6<=F1hZl$XzTn~VFBZ-GH@Juqlon1?uxJ)vpf6Wj92h93#I%jR#8OZrDAPt?^H?;u zmA+uV$1AXnzQoSl`QqgE$HX1~j;`4(n$Iap3b;E-J-AUN?hd`heQZ7n(8O|XTZvbu zuV7ueuxKUIsc?vJQueQH#ZAmrtbzx+@NUd%rc*H-Co|UQn~kqMg0$ig;Sn%nYdP=I zUNWF)aU=#yy`R8E>$%F(4p!hGn-JVq@L|_8onF;JOP~PMAs89x*xJ|bQQ>qiTRA8M z^}SJUBQ?QRZk*tRyk3qz)>aO50OhQ26pW$VYz1Mh`MlX6aB6FV(38J4$S(|AXZXeO zx6bqeUDb*ELm^&SJ6W_#C+lpiuO84)Ti=|`HJ5cD28ai8Q_4EQ-$w3*w37=J4rK=O zW!~k>?13`e)iQVaF%S>u#j|<-+j3THXlA8zl4!k78G=lD94D&4^w2l2-szQ&8s z^Wx!^K5}9@h>w7HJ}5Td6c-UfLQ?%_q~vWIRj~!2c%VqBa;I} z?O}T#LpF-?ARcBRn?=JQJTw8e^Yh3oh=F`0IsnVe8JrqVKzIxt2Zpo@>|HacT;4dt zGMhker1t=`O#?rFJGGmqT|hgwsDuj2c1ZN7? ztwrD-Sl?j0fpYwWg{~6zue=i?kkETzX$2~UEeT?KDxgatm2fpkxIOfD(F zda~#aLqg~?X25{D*5mEGnX<|yB?1C4SGZosfEF;opA#J0ih*(XIQVYEz*GDwHWn~2 z7CFJM41S&A_jL?x0vxme2KW;JQ}_$XTQQ&m4Cnv@I>3OAv^D??_)7;lIUQu>bP&1K zL1s<|xj7wV=XB&?C@Nq8b8W?d^WQK4aRxv{I7nZ|09Z^gK*u1cguej+4}buFsL_sx zfE6&nUv@w=JOud54rs~_AYca&umcF#y#axx0E4-(K>5u17U7!B*dTBMAaDX8Z~`E3 z0w7?!PCy3W1VG>fK;Q&G-~>S61WzLHK`>U};Z^|f%ktIyoBm<`0SoX0pa6RU4FB)* zZ*vI1zRu<+ADlPI34VT8!Qy}08n^zxSmggY>*Eyw3lxFLUdEUgxi7 z`Txo?7c-rKNIL!hd{>II6T8EP;2OLs)e1bjMge%+elUe0SE)?uER{=Lq^?poX*+3q zX$NV?ZK{6X0ik@r;$vBS9E*=<^xL|c;oZ)Ug#E05Ug-h6XfaF>my>BKxhkw0~UP`Zk*ZbB15pAKj!^?ep>HSvv zAiUvsj6O+!N}q!r#U=U*eVx7q@A}=Rzox%~H~t>dztF$Yf6#x@FU2^#^CuQd#g1ZU zcjN+R`N9i-DtO^9Sez`*ftUPh;3YqcxIet+Hy>W)TL-V~-4TB; zej$-a`vKzYIol5 zqTMCCFYK<`UAMbscgOBKyXR6|DuqezEbS`oF6}7|mPSjHr0G_85l|=9OAXR$sZm-l zZIOJoFxp|7!$OCx4%;1eI_!4X=dj=5pu;B)haHYNoOJlq;he*H zhl>tZ9IiRsaJc1Qec?ztIyiQ4ba(W1jBt!{jB$)}OmIwcOmR$e%y7(doawmQai`+} z$1{#s9lvsX?j&>S;-q%cIz>9gIVCtHIi)zIIb}FyIaN7XoSK~mI}LSu*J-%Z7^jI& zlbt?vn&vd!>8R5=r>jo)WD=QF<{)#DIm=vRZnE~WPO{FjcdW8*vK}&TnV&2`rj#v~ z9hTje{o?HA9PXUxtal#bJj!{J^Lpn!&c~cDIRD`MT;5LZBlna0%N25^TrJnggXN*} zaCy8uQJy8wmsiMja=qLjua@_hH^>Ldo8*J!L*zr{W8_oi^W|IQ+vGdsyX1T1hvcW_ zSLJu*-^;BJ<&WjR%71fd@6yX9z(wnlSA)~=VErLa~b3^#D#Hr&t<&JDwl08 zyIuCWeB|=6%R!ezE=OH1yWDoU>vG@aE0gDS18t0njTH$JR zt#Pe&wYc_oZEzjzI@Wc8>sr?Xu7_NYxt?%6<$B%qj_X%e*PmP;x;}RO)%7>mmu_^Q zrapuEjO;V957%dIpJjbE_u0|sP@mI%Zuj}F&z~Oec=Yt><`Wl@O1KY z^Hg~TdIouhc!qguJ*_F81)fEoLp|U19PT;Nlkt4dbF}AF&*`2sJ(qc|^jz(^-}8Xy zC!U8rk9wZ-yzlwg^Qq@E&p*9HUanppy%b&vUP)dlUTIz#UM8;=ud!aUyyke#^IGn; z$!oXQk6yodz4UhW_VNz*j_{81j`oiAj`vRVPV!Fi&h^gsF7z(;Znk=}-s8PzcrW%o z?|sqxlJ{lrE8f?`_dV|i-YK?>C?-nk580Ojn8PGB|aB?e)D}^r+q*5J?s0K?*-q_eJ}fd;d{sT zOW%9GFZ|N|D*bBx-uIj2x72U5pY@R6X}>dm=lst5UG%%;ciHcX-!;GMemDGX`Tgwo z*zZ@r-~8SEmHr9-S^lN|RsLrGA^yYtNBWQQALIXl|2Y2%{*(Nt_)qm;=)cx~z5ho4 z&Hg+65Bs0Xpce!wJa zz?6Wg0bIb0fR6(X1{?}F5^yZwM8K(lPXo>dd>-&3;H3g72!%*NDmpXx^kv+k#ePSwQ{X;y>g@S z3*}Yib>&UvZRMBBd&&pOuT?UYT;-~2r|O{Ur0SyTs_L%FP-UrdRJp2rRiUa_RjMji zRjPEVeyUoPMKxNrN3~D2Uv)tBiR!TGsOq@tb2U7-l5*5KBB&=zOKHhzODXJ{e${RAPTe( z3=Iqqj0lVjj1G(qj1NotF7WHX-vVD~+G)Hs zz8ZgxLZi}XG{G8cm`1CK&_rsYHL;pBO{OMWldEac4AKnI4AZn|Mrf=WRx?^NNi$P3 zTQgTPU$aoNSaU{mPIF#!LG!uhvgV5Bn&yV)mgctR8_lL61P7c?ViR?wWFc|i+;76mN{S{Af9Xsb17d(h6H13|}vP6V9_`ZVZl z(Cc6BtAYcAgMveX!-BQJk-^cywZWF){=xOZ1A-fan}Y`j z4-Fm`JT3Tm@Tb9NgFg$t5d3-Y<=`v9*Me_^;33kG_8}cZI*0TM@e7FyNe-zEv4r#w zX$Tn@(iAc%#5yG8!;m>4OG7q=><)Db^$693#)M{s7Kc`a)`ha6Q$iPnt_WQfx;k`i z==#u&p_@auhHekt8M-fYf9QeGgQ15)kAxlzy&d{Z=#Qa4hdv7ZC9GFipD@ob?=asm z|1d>ZVVEvVA7%&}7`8HOeb~mZ&0$-^wukKu+Z}c%?7Of>;XSS4y~6v1dxm?5`-c06 z2Zl$4Cx`39&EW&XCxlNApBKI$d{Ow)@a5rq!ViX@3jZ|xZ1`v47s5XezZw2j_^;uA zXdSgOtz7G-ZLjU9RcQmYLD~>)m^MP2sMTrpT7%Z8t3-KO2H-LL&vdr*5N!Xd&tLKBf1Q5;bpF)U(q#KefH5nROd zhy@XgB34IiiP##kJ>qD@*@({~E=1gjco6Y8;(4Sv(mAqIWbeq#$n416$h^pc$fC%S z$g;?a$jZo?$bOOL$Wf8IBlkw`i#!r}Eb@5d$;h7~A4Wco{KXpiB=YyjKO&z;{u$*O zl@gT}l@XN{l@pa0RS;Da)jw)x)a)coW1C|K#SV!b z7TXfb#LkGF6+0((UhIO{ZLud}Psg5%Js*29_M6!6Vt^oxaPP)aYN#U#Z8Ob7PljASKOYseR2Ea4#XXaJ0AB#+)r^2;~vHR689wT z_qadep2fSwE8?~BDe;-{+3~sYdGY1(=J=*~Hhz5k^!P>bN8*pgpNKyhe>(n5{JHq^ z@fYI1OOPfwBse9=5<(Ng6Cx6HOY`PJ85px{G^3ROOlo+txQ^-bUx|3q=(5UnM|gV z#mUaeos)Yd2P7vY=O$MqS10#RW|GGwPfuQvyefH3^7`bB$w!heC4Z58HTg#Jt>kAZ z(iDdjrxbaLYl?45L`qaj4CLk$Q>=Yc2BtKn3{DxA(vmVGWo63hl(i`vQZ}WWO1YkL zGv#*5-IV*OSgLcXOR8IHhty7~y;FlyLsG+2BU7VOx25h(-IcmKbzkbosRvUJr5;H= zlloceh1AbeFQr~dy`FkA^-k)&)cdKA(t4)#O7lqbPV-9(NK>V$(}L1M)56md(^{-) zBhr|(QE8*oK1ds%HYsg#+SD{IZARLxwDoBl(>AAVP1~NfKkZ=J;k2V^KcziS`!nrj zI-X9Zi_#s_+oyL*4^9tF4^NLwk4}$EFG)A0H>NkI&q$x0J~w@S`l9qD>C4hLr*BK& zk$x!sX!`N=3+eaLAEbYs{$2VH8KR7K867gLoig6Z=#~+hk(!a7k(rT`k(W`QVa;GO zMrFL8F*aj*#)^zp8EZ2(WNgapn%N_>XQq2*pG>bzpG?2ZfJ{|pU}jKeaAsI$L}pZG zY-U_$b|#xSD)ar!ahVe{CudI0oR&Ewb9Uz3%oUk?Ge64wIP+lUq0G~nXEV=dUd;S6 z^Fi{@DYv8?(n|&&i&by&!vW_R{R_*+;XFXP?ZrewuwY`|Iqd+0U~7%zl}JaysYu z=J@9*a{_aMa&mI2a;kG`a?Ck(IqPyZ=4{T{ma{WwPtHd<`*RNF9L_nGb28_2&R01< zX6~KbyLp}Sy5{xB>y_t`=bh)5r^r+11?Fk;Lh{1$ z;_?#nQu5OB>hkLI2Ie*A4as{qZ$zFoZ*1PAybtrZycu~n@^0td&3lmdb>4S*KjuBm zC-Uv{o$}@RuKDfryXSl4d*}P*EAmzO;rWsIG5K-%rTJDae@6c7{CWBF^B3hW&0mqf zGJj3}y8I3KoAOWR-z#t}a4YCg(7B*XLAQb)1-%M93cL$^3;YX`3bG6G3JME~3kDW6 z7Yr#FRxq<*QNiMZr3L#69u_<<__g4-fKPD9kR*EvzZ5 zEvzeSC~PcjE^M(DepooIa7N+m!g+-Y3U?OnF5FkRzwkiep~BOJpA}v#yj*yts9RCb zqTWTGMczezMT#PIQDRY6QEpK|QBhH8k)g<3)W2vzQB%>NqLD>x(deT0ixw1JDEhqU zi=rz<*NbiyeOYw3=t0rfMc)>EUrZN=6o(Z@6h{_E7snMR7AF;3Q;Rc-vx;+yYm472 zo=`lwcxo|MyuNr-@z&z)#pjFvRf0;$5>W|VA}O&iaVn9QxR$t;bS>#t(xW7-q@iSB zNmI$7lA$FnB_m3#CF4t$m8>h-S#q}IQK`7JV`=BouBAOn-AlEl8KqgJIi>lfg{2jx z^`!$!8%qb34k=|yr&>$7(ix?*OXrquEj?U%tn_5*r=@30ua$mZ`cvtn(qBt|E2GQo z${fmMW%4rjvOZ;AWxi$pWl?3ZWeH`;WvOLlWtC<6vg$HZ*^sh#%SMzjW$%@7Wi!j> zl+7<&ShlHbYuS#n-DP{rPM4i6`>gC@+2yid%U+bbm3JxkDc6=qm0M%V!Bi}**jBNlVpql9iv1OLDjrq*Qt_nXX~px(u9X3m%1U)* zP-SRkMP+^Ez{;k|!Ii@*=T}#5sN7V!rE+`auFCV3cPsB#epUHxwzPb^*$+{19({wX*vvoUl$8{%lr*&s_=XFo|QhmjJ?fN?OmGxEi zjq97xH>q!G-;BPseH--|oOon_b)=rrzo#Fqe_uaVKVCmkKUx2wewu!|ex`o5ey)DL zexZJ`eyM)Bex-i3eyx7JexrV~eye`Fey4u7ey{!`{m1%)`a}97`eXVN`cwK(^=I{; z=`ZL%*I(9O(O=Ww(BIPE(cja5rT?{)Ps_Ktq#ZkYR{nn4!fm!eBM9hEaww zh7Szm3=<5K3{wnK4OY%D!!XM*$1u;Zz_7@$#IVe;!m!G)#<0$?!LZ4&#jwq=!?4S+ z$FR?^-*CY2iQ%x}sNuNbq~WyTjNzQ&yy2qZlHm)(Rl{||O~Y-&UBi9D*M@HmKNx;C zJU0Al_}%c#@S+;4CaS4wNws~oQ?t-3>X=jyK2J*sdTG())XmhxAumx0pwoS@US~2j=nSN#+mD zoOz~sj(MJWfq9X6iFuiMg?W{Ejd`7UgL#vAi+P)Qhk2KIk9nVYzxjaq6Z2v7QS))D z`K0-@`HcCT`Mmj}`I7ky^HuY8^G)+@^Oxp(<_G4l&EJ~8H~(n<+5E`-i}{K9ck>_S z=jIpYmlk9pEFueSkyxY_2aA)%+2Uexv$VH#v~;$-W9eq;VR5(gws=^)EIt-LOMpdb zQCl>YU`wba+!A4lvcy>8ED08Ck|o8GX34N*S#m6SmI6zWrNmNZsj%oQdW*qgwA5H? zEf!0EOM_*grO7hLGQ={>(qb85v07NmD9aej2bOV`36@EgDVC`g&N9O?%QD9@&$7U> z$g;$;%(B9=%Cg3?&a%O>$+E?=&9cL?%d*F^&$8cg!19UZu;pmB<+$af<+SCD<(%cb z<)Y=1XPdUG2tJM+x|*V+WxkE))oH` Dq@VXh From f8dec92bbc57317122ed5b72b67268f4b4bdeab2 Mon Sep 17 00:00:00 2001 From: danomatika Date: Fri, 6 Dec 2019 12:57:13 +0100 Subject: [PATCH 16/28] replaced table add/remove buttons with segmented +/- controls, try to reselect previous row on table item deletion --- .../PatchbayDocument.nib/designable.nib | 205 +++++++++--------- .../PatchbayDocument.nib/keyedobjects.nib | Bin 33658 -> 33861 bytes Controller Classes/PatchbayDocument.h | 21 +- Controller Classes/PatchbayDocument.m | 92 +++++++- 4 files changed, 197 insertions(+), 121 deletions(-) diff --git a/Base.lproj/PatchbayDocument.nib/designable.nib b/Base.lproj/PatchbayDocument.nib/designable.nib index 6183499..22d24e7 100644 --- a/Base.lproj/PatchbayDocument.nib/designable.nib +++ b/Base.lproj/PatchbayDocument.nib/designable.nib @@ -8,7 +8,6 @@ - @@ -47,6 +46,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -83,28 +134,6 @@ - - @@ -358,58 +387,20 @@ - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + @@ -453,20 +444,20 @@ DQ - + - + - + - + @@ -488,25 +479,28 @@ DQ - + - + - + @@ -519,20 +513,20 @@ DQ - + - + - + - + @@ -554,25 +548,28 @@ DQ - + - + - + @@ -592,4 +589,8 @@ DQ + + + + diff --git a/Base.lproj/PatchbayDocument.nib/keyedobjects.nib b/Base.lproj/PatchbayDocument.nib/keyedobjects.nib index b4a6ba35ce34eea09831f6c7817af32926cb0fbd..d01d244801c1265c40a537324db90f026836d18e 100644 GIT binary patch literal 33861 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 z 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 diff --git a/Controller Classes/PatchbayDocument.h b/Controller Classes/PatchbayDocument.h index 2d62942..54788b9 100644 --- a/Controller Classes/PatchbayDocument.h +++ b/Controller Classes/PatchbayDocument.h @@ -19,9 +19,6 @@ IBOutlet NSTableView* patchTable; PatchTableDataSource* patchTableDataSource; - IBOutlet NSButton* addPatchButton; - IBOutlet NSButton* removePatchButton; - NSMutableArray* patchArray; Patch* selectedPatch; int selectedIndex; @@ -85,12 +82,12 @@ - (void)midiSetupChanged:(NSNotification*)notification; - #pragma mark Patch table - (void)selectedPatchChanged:(NSNotification*)notification; -- (IBAction)addPatchButtonPressed:(id)sender; -- (IBAction)removePatchButtonPressed:(id)sender; +- (IBAction)addRemovePatchButtonPressed:(NSSegmentedControl*)sender; +- (void)addPatchButtonPressed:(id)sender; +- (void)removePatchButtonPressed:(id)sender; - (void)addPatch:(Patch*)patch atIndex:(int)index; - (void)addPatchFromArchive:(NSData*)data atIndex:(int)index; @@ -100,7 +97,6 @@ - (NSData*)archivePatchForPasteBoard:(Patch*)patch; - (Patch*)unarchivePatchFromPasteBoard:(NSData*)data; - #pragma mark Patch editing - MIDI Input - (void)buildInputPopUp; @@ -164,15 +160,18 @@ - (IBAction)outputPopUpChanged:(id)sender; - (void)setOutput:(PYMIDIEndpoint*)output forPatch:(Patch*)patch; - #pragma mark Virtual endpoints -- (IBAction)newInputButtonPressed:(id)sender; -- (IBAction)newOutputButtonPressed:(id)sender; +- (IBAction)addRemoveInputButtonPressed:(NSSegmentedControl*)sender; +- (void)addInputButtonPressed:(id)sender; +- (void)removeInputButtonPressed:(id)sender; + +- (IBAction)addRemoveOutputButtonPressed:(NSSegmentedControl*)sender; +- (void)addOutputButtonPressed:(id)sender; +- (void)removeOutputButtonPressed:(id)sender; - (IBAction)endpointPanelButtonPressed:(id)sender; - (void)endpointPanelDidEnd:(NSWindow*)sheet returnCode:(int)returnCode contextInfo:(void*)contextInfo; - @end diff --git a/Controller Classes/PatchbayDocument.m b/Controller Classes/PatchbayDocument.m index b361de1..238fb96 100644 --- a/Controller Classes/PatchbayDocument.m +++ b/Controller Classes/PatchbayDocument.m @@ -255,8 +255,21 @@ - (void)selectedPatchChanged:(NSNotification*)notification selectedIndex = patchIndex; } +- (IBAction)addRemovePatchButtonPressed:(NSSegmentedControl*)sender +{ + switch(sender.selectedSegment) { + case 0: + [self addPatchButtonPressed:sender]; + break; + case 1: + [self removePatchButtonPressed:sender]; + break; + default: + break; + } +} -- (IBAction) addPatchButtonPressed:(id)sender +- (void)addPatchButtonPressed:(id)sender { if (selectedPatch != nil) { Patch *patch = [[Patch alloc] initFromPatch:selectedPatch]; @@ -281,15 +294,21 @@ - (IBAction) addPatchButtonPressed:(id)sender [self addPatch:patch atIndex:(int)[patchArray count]]; [patch release]; } - } -- (IBAction)removePatchButtonPressed:(id)sender +- (void)removePatchButtonPressed:(id)sender { if (selectedIndex >= 0) { + NSInteger row = selectedIndex; [self removePatchAtIndex: selectedIndex]; + + // Try to re-select previous row + row--; + if (row >= 0) { + [patchTable selectRowIndexes:[NSIndexSet indexSetWithIndex:row] + byExtendingSelection:NO]; + } } - } - (void)addPatch:(Patch*)patch atIndex:(int)index @@ -758,7 +777,6 @@ - (void)setShouldFilterRange:(BOOL)shouldFilterRange forPatch:(Patch*)patch } - - (IBAction)lowestAllowedNoteSliderChanged:(id)sender { [self setLowestAllowedNote:[lowestAllowedNoteSlider intValue] forPatch:selectedPatch]; @@ -1062,7 +1080,22 @@ - (IBAction)editVirtualOutputs:(id)sender } -- (IBAction)newInputButtonPressed:(id)sender +- (IBAction)addRemoveInputButtonPressed:(NSSegmentedControl*)sender +{ + switch(sender.selectedSegment) { + case 0: + [self addInputButtonPressed:sender]; + break; + case 1: + [self removeInputButtonPressed:sender]; + break; + default: + break; + } +} + + +- (void)addInputButtonPressed:(id)sender { NSString* baseName = [NSString stringWithFormat:@"%@ input", [[[self displayName] lastPathComponent] stringByDeletingPathExtension] @@ -1075,10 +1108,39 @@ - (IBAction)newInputButtonPressed:(id)sender [inputTable selectRowIndexes:[NSIndexSet indexSetWithIndex:[inputTable numberOfRows]-1] byExtendingSelection:NO]; [inputTable editColumn:0 row:[inputTable selectedRow] withEvent:nil select:YES]; } - -- (IBAction)newOutputButtonPressed:(id)sender +- (void)removeInputButtonPressed:(id)sender +{ + NSInteger row = inputTable.selectedRow; + if (row < 0) {return;} + [(EndpointTableDataSource *)[inputTable dataSource] deleteSelection:inputTable]; + + // Try to re-select previous row + row--; + if (row >= 0) { + [inputTable selectRowIndexes:[NSIndexSet indexSetWithIndex:row] + byExtendingSelection:NO]; + } +} + + +- (IBAction)addRemoveOutputButtonPressed:(NSSegmentedControl*)sender +{ + switch(sender.selectedSegment) { + case 0: + [self addOutputButtonPressed:sender]; + break; + case 1: + [self removeOutputButtonPressed:sender]; + break; + default: + break; + } +} + + +- (void)addOutputButtonPressed:(id)sender { NSString* baseName = [NSString stringWithFormat:@"%@ output", [[[self displayName] lastPathComponent] stringByDeletingPathExtension] @@ -1093,6 +1155,20 @@ - (IBAction)newOutputButtonPressed:(id)sender } +- (void)removeOutputButtonPressed:(id)sender +{ + NSInteger row = outputTable.selectedRow; + if (row < 0) {return;} + [(EndpointTableDataSource *)[outputTable dataSource] deleteSelection:outputTable]; + + // Try to re-select previous row + row--; + if (row >= 0) { + [outputTable selectRowIndexes:[NSIndexSet indexSetWithIndex:row] + byExtendingSelection:NO]; + } +} + - (IBAction)endpointPanelButtonPressed:(id)sender { From 50c72dd967b336d342e4ebc5eee64498f82910c2 Mon Sep 17 00:00:00 2001 From: danomatika Date: Fri, 6 Dec 2019 12:58:45 +0100 Subject: [PATCH 17/28] default to Notes tab on open --- .../PatchbayDocument.nib/designable.nib | 2 +- .../PatchbayDocument.nib/keyedobjects.nib | Bin 33861 -> 33976 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Base.lproj/PatchbayDocument.nib/designable.nib b/Base.lproj/PatchbayDocument.nib/designable.nib index 22d24e7..2a3d6fc 100644 --- a/Base.lproj/PatchbayDocument.nib/designable.nib +++ b/Base.lproj/PatchbayDocument.nib/designable.nib @@ -152,7 +152,7 @@ - + diff --git a/Base.lproj/PatchbayDocument.nib/keyedobjects.nib b/Base.lproj/PatchbayDocument.nib/keyedobjects.nib index d01d244801c1265c40a537324db90f026836d18e..d1ce465611e5a90aeac2bb3be28d19eb955b1f96 100644 GIT binary patch delta 15452 zcmd6NcU)8F_y2uzCxnsU#8E^xB!m$54q*id0TT8OfsouNsHnASbFZt8IfT#x zt99?XH_p0e9j(?{JFLIw2C%jLe15Or>-+uZXHuZ&S?4+DecsP`&bfMM%_$4njXdhoUxg1o|mD5&ayUh0a62Ko_Em(WU5mbOZVg zdH_9w9z{=~=g|vj3wi^+gWgA;!fmyNcbz?qkofU$NhC0alKqIDvP@yWl-=FWegs!X>yA55pr75|6@Da1EY^7va^o z8Mojx-WPAi2jW9<79WjI!YAW1@z3#D_-yP=X>H2p7VY=ty)Tx)I%pUPKrX zP9zaZB8SisMMMo@A{q#q=uZqJJ|u<^9}_lW6fv3@PfQ@D5L1cIh!w<2;!7K`h4_Zp zMI0th5GRQ<#3kY?ahH)PbQG*WCp1w3&~Q_K$^&bP2}`-c$e; zOodVrR3sHeMN=_UER{qlsWd8`%BD0_KBc3IsS>J^s-+sJK2(2dFg1)~sWH?i)C6h@ zHI@2|nn}&2=245N#ncLFWj3{rT2FmRZK1xQwo`kkz0@JnRL6{GIA$*M z1+$V_2L~Ns4l&1>Q_NW=_Nu@a*?>Gm+>pr8qD6|1JqZX8gN?Fl9pdXq6 zr)mNS+7IoIOhX62{~L(*=MKh1mRFL0+kh#IXGun#bx>Wixwhsk;)D32!_eX7IXa!yY^>|As`pdWK{ z49XU_H!MXN@F(y9y^w$_@3#N<&5uM!K^@1~x1Q0q^%=}`ikV~I_jt}ZF4{H;oeY$M z47j~%(CE|A8DP912c7ALLG9c!qVf>t1E!Rj2@U@lGnKNw>jwCvK*bdPmQTAr>0LG^Eoq%S9h?vxwfHoXYG^~wdj(ig0=12{ma{b+pgdTbQ!uF zc_Vmf-*8szhLK6kd}bcSu=Xu~0bN}s>NIqyA~HnMD>Q1j#MWzQSQz{>bolW9Y{ZS| zCTPSj`8ko5ZAM(iETxzg_8G^(883rKFa~jhh>;+VKn#cmvFLU*6O04nk@4srphWkf z`#Zda|3>8^Nf5vaM&`gQfQDV{=7}U>$OSmK6y$?4P!0;vL!b&&qu(-K%tFS8S;R@> zJ>$@0=y9M2W>AnUM^y4&a>k$WdVkm%ei*2M!uXC^BJ#1fiCFQh1a=C-op0>YR-F6ebRRJB@T-Vgp zj>y}s{&`>A+WRhgujF0trRd#%`|bTGeSkhh-UPrfeQbB#vo+PCs>1(n=WZs`O{pQFaY(h&o|zkfa_WGqDcH zBdjCV3F{2!?1FX0+_7$u&SoP&Bb%}A$U3YCia_FegUSGjBA6%E8}q`vAs)n-59aHF z`9U?u+Z#2Qgrmd1$k@y5VRkY5ncZ%BxM$`|s4~=j9kZoM)OqMod6cA=JR*9yq}R|; zxm?mKJZkuGI|E`e#JU&@!Q@yd^A+ zX|*;E?p0&8wo-zf4zPH1F0+l9#qEyplVD1L3jO;`sqHfXaY2qwUt?;UaXT}cyOkvM z{nr3Z`v4fzJSS~scEYYGcG&Rlr z%^xns%G>ez9W?kl{v3gHx>@i8bk0ny3c92kx?((gB0^E4-yB4We#)Qle;JUM^?f5VvW$9c2+^N+dy`VIoi%DE1|zi zhlYlSaMwe+ctf*kc``u}@G15&W`hSGWDsUJBWI4dAxQ|5-`vQpOzvSrFG3=LL5^O6 z3w%ihySd~C)n6`s;JvkImw)8SA~PB*eNqi9xdq=E$2bQ{}mcJ zeE20033&xlA3Px8qIqqr=D~Gex2=1eS?=&xti4Cq*k{*J&3>La*FO7kPM8wx0cY3!WA?Luo1Md>J;6@S zFWS#*4<8$QQ7N{cxy<~={K3RR0>%y@P1s>jj(v+A!H#nMqC02*%3NVy!>ndF^acbI z&o8a%$O7yXb{ZLtokd2YsZ0y=3v(6bO7|F~HTEtb)+JaAb`d*^U1qK^w_wY4E=1AA z6T60e2VFD(^5gk7>>^A#hf`38;mp$n$a_zC-ed0bly?PM@xfn|7u8C6k&yBf?UaXiMXZZ( zcf1?(kolgcJCAqf!6NZq|6r0wka5OG_;ZVr-2X*TxPN?F`lg!n2#@jiBX#cmf-WbehJ-W_#%8U@&;duFGI${Pur@F zEO4M$(2)fc;|xD-cNBaL*DcMr=LUQuz6sxqxZz*oTaZ1mDJ0q}7Fy zjEn_B7IbLc^>!ZRJ8*dKb7FxAQWw4l-;3|V_roa;z*~(H4m`xYN~@@FX5dBC^_-v? z0%f3JkYF%=l&NCi1=9sOPiZvj>-scVYntm?cXR?j$!CCdrapCjn_GQ)0tslb&wjdX z{xfiXaoY+T(mQp7(eaNJF1D`V#@$GF_q&2$g$c#GN$ZUE8xVfwZ}$QGJN!E5kw(k{Hm0uNr8p!O4? zTKqS=@Bj-udEr2{mk3o6h+PP8;9k6Nh1y4i>IlLvJj((fUih8brwf`*IN60OS>OkS zRids9W>W(^QpGW#4jYty&d`Dy{(be8X&w?O+PFrS| z4n2tvco_?%EQp1|8=@Xu&m1rAcxGplCjwJ` zBjgz;*e(MCLJq`4C?5wQJRTvaVi+Zp#B}mXlH1d17+Ik($l_rc05&QZSf~hQft*{L zBMIzD^dzE@D?}{6CJ{>{Afp+TT`Q>AU?zVA_b}y%YXRp$Tjc^ zJb^>hEEvXup>TQFmH+aCm`p~^Ae>0+<)VinO~9f^7!!MiDCU&fPVuEg8IZ#a8EQ^c z5>-S`cpj+-q#Di5H3n-P93RDka3;*bE2&vz--cIG=^X+87gUd9vO9M$f+V6IBr_5Q zdODJU6_N;UW%dWa%$?Hu+IsRi1JMXRg}9yshwv!_3!-64_Q5%j2l5d&VgOv8zpgP} z?UF(7B&FuQO#_=D5m@W~=1Vl67-sk7DHg=r-Q5{x)pY}!?b&smk*C5mbDhUTRC5BC~FTZnJyCbi0LAhRv+jgsVU;zxh?xjsNu*mUGk76yvLwm1lEGXn{%I5YG zVV8+kYPrsWVqUm0x0mZkqLo?T`BBQtZsvN5P&LuYEF25Ud7(J3rwGj?TbX4p3o3bG zLY}t>%^+Ku1=_xv7xvHd>40XDt<3TT3k*;QnT4BQ*|o>toKA{KJHfEP$b#kkz-r1f zj_d?azA-6$B!3@nktRr@7To%(aviat;bge|;5KW??;Aegif z-edz2YG+FCnKx4YSFa(4(+;%7RfW7y)~CWC7c%91BKr^9p(g&J~CjlJi(#WAa-BZh{Vi zjxdGjBoA^N zp_5vZ8FC$uq4gvzagSlaC;ugxVL@vq^Ivlj7PKZJRos__k+z-uoSEcqI}#@T<8BAH ze}I(oX{mk3pF$rq!wc0shrgeil1Is7?H!@sOY9y0k(`pJ`Q(&5$LFRjnB1D2c3Rx( zId}O1!AN(x1qRu5CxDo;8ptw!F^QHIiw5Km4_nL9qu05pfxd{&w?*nfe1mzZ@ZlzD9?Yx zioDnkE6T4OR&#k+Eog@o6$oul1yK?fEM&o=|2?egO6x^ZDxvjIZDPSno?ow)`Z=fA zj|6DL)x5;DtdnyllsNEb?^<3WFYDr*YnOCj!Fpa&P}bW9Ns}r>AU!}zgR^af^0L0L z$eUF+guhU|V|AWxT06qN!&*DOYlMU^rQqCl!iTf)v;Wn&o8Vd-C)!Wo_Zn?vCegFC z6>=ry@Aq0E6-rtcg_A-BdF|fK%LBT#aS8V?c@#6Emcx08Y8+H+jTcG$BFK*$*+pGLK!TMB3>KYW^3WsUGs4n9GZ=@#22f!7k5u5y^`n>+ImxRtLE8<6rXPVZ8Vz zFMe3Ib2Oikw33CXYf=n+&(y*7iH%gl#PT?Wyy7P@N_G~C|S;ySG3 zeha~I3?ktqENPyB4>Hfgvf>-Qh5(@1Sm0<6(*`^8VLAju3x*!dQJUEb{;~ywFwB0F z;m>}1ti!VzhA!kn7-*2>Q(>-b&xfbmj|LcE^O^j!NH4_Ap$_TIf;$YxU+SBhtnkre zv$?Ua{itv-bAK9??M~o}j%V#3SbVfQArVi6<(F0`$eDcB3_kTD6UI0n=Z0H2(drp9766F7j+{N1X zHv9AC&wKU{EQ8wZ{}c4Vm^S;5h4vo{?LQXUe=M{={{&<#w14YoEVTbvX#cU${$rv2 z$3pv$X|+G&+=g1CJrjhi1by%~>jN3IY^(Jllfp0b$uN75e_J1V0)C-O=JKY8NsmJd z5B0?`4F10Wd-wkf*g0pi9|oiJ{|m_5{>PA~SkU8t|9*w-fAfOH|I7OoZTN5;X2*x) zaL11wZH|m1>o~%3q~j>Z&Cg8TK{sIsVMk#nVP|0%VOOEMu$!>Eu!pdx@B^X8W;gRq z;J^w#VFhDZ!MM#YEJ;AR3$ZR}OY?+#1)>G~8t@GR;Q`^nN>~v|)*39Z@Rd^2T(d}c zfUB~0CchOP0b=1%ZkRQ$tOBpar@+^kmcnA=0sJifi~#WcqevowP!m~%hRB8Q9~BZM zL>a8H)DTAa9#RuA48DKFK+c>?EGIS)yNLtvb)y#I7I7QCX!Ml$jRYh~ipY^%mp*-L zepDbOq2l2?J$kAfzR6P!-{q;NmcrxlEIfg}hp*psbO>_Da43K;;q-H`IZSYv@37Ee zvBNTl6%MN$);g?n*y!-3!`BYm9CkVEaoFc@z~Pp|Lx<;%j*dMX{TvmJO250K zK~8y2I;R4sBBv6kGN%fsDkpotHST zcRuQT)A@<>E0<0#yYnN>< z`&5o#(pBb&Jh)pX&+N3$8a^pSV7A{n7P>>+h~_M1+VEi9}LS zv`8h=ib_Q$kyX@J)FkRJY8DL=4H11Lnjo4cnj=~yS}j^9+928_IxIRZx+uCPdL()- z`cv#Eb`raYyNEr+-r{I+s#qs36IY0<#5Lktah=#I{#eY37l^lrw~B2$#Jj|M#An1U z;%nl&;``!<;_t;z#6OGQc$vLuuV$|iUgNx`c+K)!=C#^utJhwy3tl(9UU)!sU9qjw+gChz{<&EBl{DDN@ebG+wy&-Y&Fz1aIJ@7>rr_WKJ6F#SWF8Mt0dFJ!V7xg84Dc_#H9=@KwUcNrQGT#*6eBWZ< zQr~jlI^SmBA-+?5m-;UEUFo~pcdhRs->be4eSh)&)%SNl%+J-YtDnZtR_Isd*UxX9 z-yFYre)Ihn`YrNX;`zQJ<{geGu z{L}n1{MG(h{u+O+f1bbDe}w-8|4IH+{HOV^_CM$UV}Nr&LVzK_7*HS35HLDmQo!A0&IX+ex)5|R=t|Jl zpld;G|%+Ex01s5SO^h9g*b*dg}8)>Lfk?+hQx>15<`?Bs*u!>^bmDO zR){9#qmW4 zC{z?HMk_v1j8lwPe5#nFn4*}bn6CItF;lTXu~4yCv0Y*NG0ZuvYnU`FHY_i!Jj@i< z7}gv%C~R;T6E-4jLfG`M8DTTSR)lQ~+Z?tfYmxQsY>wCx z@pZ)3i0>lqM?8%9KH^El(}*7;o=5x?@jB8u(lt^X*&(u1WKd*Mq$)B!QXQEUSsiJJ zG)C4(HbnN193Qzl^6SV0kw+qrMV^mriM$wjGxAa7FHuO8OO&lklxLJAswAo`sv@c~ zsyfOLWsItiYKXE#(NWD&1EU5a#Egg;6*DhpSk;=sT(7v^ao%yhasF|^aglLJaanOp+`_n>al7Jdd*b%R?TaVO(W$32R7i|-iUIlfE0dwlo!p79>>p7FiorSUoOx$*h&`uM{5;`q||s(3^E z(D={eXUETtpBH~9{@eJY@yFs%#Gi^k6MruLLVQd7vjo=!aYBcLjtR;HRYGb)T0%xb zW7(w0+%o&;j@I#6J{sOO*oQpEa61L$%NAhXA{mRv?N?gxSa4j zv2$YA#BPZ_5_=|kBzh)#CB`MDCT1trCpIPyO8hYKqr_o}A188&vlEvjE=ydIxGHf? z;=06Ri6;_IC7wwv6Wns#)ltrf*VOK*JyShWQ&Q7YGgGrtHL2Rvyi{GPKDAHkqSPg+%TiaQu1Z~-x;}Md>Xp== zQh!ZzOmj|iO%tbeOY^p+Nz)3`O47>HD$=UcYSZe{OljscOWJ_6=Cna+6Vtv*JDPSm z?QuGq?v~yqy<2*ZbdU7j=|Sls>5BA-^r&=Ax*>gV`lsnD(pRUiP2Z5dGktgZ-t+_M zXVb5yKT3a=L1uKz=$YY>(K|zyAPmHu+Nl0WJwZKDJy|_XJwv@wy-$5WeMo&oeO!H4{j>TP z^{?tb)NeE0GXpavnZcRz%&^Ry%&N?q%-YQQOmpU_%o&+8GiPPa&77aPJ@a_x$;{K4 z=Q3L|Z)Lv7e3|)6=5MylH(5WYjW1qtZ7*@vOdq6 zoi#6OLDs^oby+vEZe`ugdXV*f)|0FsvVP3^DeG0%>ufYTDmx}SK07H}nVpiIo}HPU zm7SBFo1LGn&o*b%*?qDbv-@R#ls!C~$sUotI(uvOw(K3*yR-LZ@5{Cw%RZldG5clq ztL)d=zh}SEAezn^FO5ti*W_yoG)0;cO}VC0Q?2QvY0~u9*fb+FqcoE>3p9%~OEk+h zt2FyH=QS;wOPZ^i>zda&4mrXc=NwT^hn(P?#2jUgDkm*Rol}rgpVN>-=k(3#mvb}c zPR`w&dpQqt9_KvG`N5X+Jm+Q3tDM(4zvldr^HvMAm=@Q%X;s=(ZH6{Wo1@Lu>a==o zk+xJ@t~F_gX+PF7+7a4O+KJjJT24DdyGy%UyH9&idszFe_Kfz5_B-uw+CQ{^=7L=K z95%OSZeVUiZd7hbZh3BHZgp;LZe6Y^w>fuk?vUIux#Mze6LM$fuE<@LyC!#i?xx(G zxhHc^=bp{Ikb5cjY3`qSNS+`M&!h5swee$sRw$29@P_iN-x%T)OXRl>tpnBdRwACS)Z!U&}Zp2`a*q~zEWSK zuhp;8uhnnRZ`ND77fFNK=$slwV{jG8b8k8jJcDH5Uynno=~aXhzZJ zMRSVg6@68-wP<_M&Z6B#`-+Ygoh~|8)KYY**rT|2vCXI0zc{d1S{zcWC{8QZ7Uvfi z6c-hj7S|SAiu)8d6%QyLSp0D@TRf_GO!2(pv&H9&FBV@azFK^}_*U`l;(NspiXRm} zE+I>zN@7alOA<n9jCFv!ZC7Kd#NnVM$WJJk?l1U{~OSqCXCF@Hzm3&!prsTJh zH>F4^D8+20WT|7RbE#{osMNi*TWOC{MQM3yRcTGBvD8%BR64Nq!_uLp!%L@?&M2K( zI=ggp=~ty&OShMvFTGa!p!987=Q6*tfHFy$tSq!FtE{}NvaGtSwyeIaPua(1OxcLC z(Pd-Hrj{)#TT-^HY-QP+vIAuo$}W{%ExTTJtL$mnpXHo!c$jTQ`RCyFW*$Y zrF?7ok@Dl^r^?TkUnsv{{;2$M`Lpup6|NOsD?%zFE7B^8DoQHKDk>{#Dh5@2QZcS# zLdB$tsTIpBwpM&ov7=&l#lDK070)Yvs`$C$b;a+MJu8DNLn=cn!z-gI%POsveJh(P z2UHHKoK?B1a!uvB%8iv@+A1$qKB|0N`Ly!K%Acw_SNT;1R0UN9SIMigs>-V>tE#JN ztLm%9R?VuKQ#G$@LDk}_-BqWn&Q_hTx>$9k>X&M&+OgWH+O^uPI;2`zt*TC~&Zy3+ zZmediM^ulh{-k<*^_uFP)qAS4M*1tBW zHn>(^tEi2uO{`VcYHN#)GNat6Foqi=jnT$fW4tlZ$epx>*#;U18;2N&8iyNgM%Fme zINJD$ah!32aiVduajKCs&M?k2&N9w1&NI$8E;KGSE;TMUt~9PTt~IVVZZvK-ZZUps z+-BTv+-clx+-ux#JZL;@JYqa%JZU^_JZEe%UN&Ac-Z0)a-ZMTlJ~loxJ~zHJ{$l*i z_@)l2L+gmHbq;k-b*^=8b)D+E)^)G@psrV4Kz;xEW^NXvD%e)Py?$r??)ts;`|A(Z zAFe-Af2{sQ{i*sh_2=p@)L*Q>Tz|FxyZRgTx9acI->ZL6|ET_P{nPp%>YvyDRR44R zFZI9H|6c#5{;dg^P!nzW@km-o&xapMXtm%U3lIg1H zy6KkbuIYj4d(%_XkEWkYuS~z1{xH355H#QoRD-a=r9sr-ZZ??f%nfGR+}GUCW^OhQ zHh*LuZf49Q&11~t%%7Sko2Qv)m_IkqF@IrRXkKDoZeC?xYu;eqZ2ro;&Ah|B+q}0$A(^tSj|{4GJ2V2e#|3A036Vl45NB#X+DW>H(REm}*yrNB~bDYH~sYAi;J z$zrkeu{2o*SO!^!ScX|_mJycGma&!zmPwYWmg$z6mf4nhmIao@mSvWemNl03mQ9u| zmaUfUmR**;mIIclT|rmTHFPaqN1JFfP1AkoM!Fw8fF4K>riai&>EX1EX6cdiX!;X+96f=yO{6E& zQ)!N#LC>UT(R1i|^n7|Dy_jA~FQ-@1tLe4$dU_+hnchNwO>d*O(>v+i^j>;DeULs( zAEA%YC+Ji38TuT3fxbvzrmxc9(KqN@^d0&h{eXT%Kc=73KhV$VpXi_IU+7=y-|08> zTPv`lR@_Qj9jro|)!FK56Lb{Rc+0(YOGpoo>gZpuohWMtYy{;Yn8ReT5GMdnyh9kZS7-i zwDz+Ounx2iwhpllwGOx1tgLmUb+mPob+R>ls&%$?j&+`OnRScx8|!iF1?!7G_LuPx TL|}gx4?%>-+5~OC`Uw6H(m{uQ delta 15373 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 From 8fd22d38cd0e283afcd9bb23587154ec03eb4651 Mon Sep 17 00:00:00 2001 From: danomatika Date: Fri, 6 Dec 2019 13:03:15 +0100 Subject: [PATCH 18/28] slim endpoint input/output panel --- .../PatchbayDocument.nib/designable.nib | 38 +++++++++--------- .../PatchbayDocument.nib/keyedobjects.nib | Bin 33976 -> 33976 bytes 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/Base.lproj/PatchbayDocument.nib/designable.nib b/Base.lproj/PatchbayDocument.nib/designable.nib index 2a3d6fc..7eb82ae 100644 --- a/Base.lproj/PatchbayDocument.nib/designable.nib +++ b/Base.lproj/PatchbayDocument.nib/designable.nib @@ -412,29 +412,14 @@ - + - + - - + @@ -581,12 +566,27 @@ DQ + - + diff --git a/Base.lproj/PatchbayDocument.nib/keyedobjects.nib b/Base.lproj/PatchbayDocument.nib/keyedobjects.nib index d1ce465611e5a90aeac2bb3be28d19eb955b1f96..b0152c0d8841384d8100899f00161d5b187da60a 100644 GIT binary patch delta 2562 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 Dfle-V From 5ccbda52fbe8616ebc6551eae790083286d1b616 Mon Sep 17 00:00:00 2001 From: danomatika Date: Fri, 6 Dec 2019 13:07:33 +0100 Subject: [PATCH 19/28] removed unused plus icon --- MIDI Patchbay.xcodeproj/project.pbxproj | 4 ---- Plus.tiff | Bin 3266 -> 0 bytes 2 files changed, 4 deletions(-) delete mode 100644 Plus.tiff diff --git a/MIDI Patchbay.xcodeproj/project.pbxproj b/MIDI Patchbay.xcodeproj/project.pbxproj index 9ec5fa1..f9b2408 100644 --- a/MIDI Patchbay.xcodeproj/project.pbxproj +++ b/MIDI Patchbay.xcodeproj/project.pbxproj @@ -12,7 +12,6 @@ C12C7FEA05AECD9D0066E007 /* PatchbayDocument.nib in Resources */ = {isa = PBXBuildFile; fileRef = 2A37F4B4FDCFA73011CA2CEA /* PatchbayDocument.nib */; }; C12C7FEB05AECD9D0066E007 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165FFE840EACC02AAC07 /* InfoPlist.strings */; }; C12C7FEC05AECD9D0066E007 /* Credits.html in Resources */ = {isa = PBXBuildFile; fileRef = F5C0AB170331972E018C91A3 /* Credits.html */; }; - C12C7FEF05AECD9D0066E007 /* Plus.tiff in Resources */ = {isa = PBXBuildFile; fileRef = F598A8BE0342EE1E01B9BE79 /* Plus.tiff */; }; C12C7FF105AECD9D0066E007 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A37F4B0FDCFA73011CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; }; C12C7FF205AECD9D0066E007 /* PatchbayDocument.m in Sources */ = {isa = PBXBuildFile; fileRef = F5C0AB14033196D6018C91A3 /* PatchbayDocument.m */; }; C12C7FF305AECD9D0066E007 /* EndpointTableDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = F5C0AB4203319CEA018C91A3 /* EndpointTableDataSource.m */; }; @@ -87,7 +86,6 @@ F598A8B30342E47401B9BE79 /* PatchTableCell.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; name = PatchTableCell.m; path = "View Classes/PatchTableCell.m"; sourceTree = ""; }; F598A8BA0342E64501B9BE79 /* PatchTableDataSource.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; name = PatchTableDataSource.m; path = "Controller Classes/PatchTableDataSource.m"; sourceTree = ""; }; F598A8BB0342E64501B9BE79 /* PatchTableDataSource.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = PatchTableDataSource.h; path = "Controller Classes/PatchTableDataSource.h"; sourceTree = ""; }; - F598A8BE0342EE1E01B9BE79 /* Plus.tiff */ = {isa = PBXFileReference; lastKnownFileType = image.tiff; path = Plus.tiff; sourceTree = ""; }; F5C0AB13033196D6018C91A3 /* PatchbayDocument.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = PatchbayDocument.h; path = "Controller Classes/PatchbayDocument.h"; sourceTree = ""; }; F5C0AB14033196D6018C91A3 /* PatchbayDocument.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; name = PatchbayDocument.m; path = "Controller Classes/PatchbayDocument.m"; sourceTree = ""; }; F5C0AB170331972E018C91A3 /* Credits.html */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text.html; path = Credits.html; sourceTree = ""; }; @@ -184,7 +182,6 @@ 2A37F4B4FDCFA73011CA2CEA /* PatchbayDocument.nib */, C12C800205AECD9D0066E007 /* Info.plist */, 089C165FFE840EACC02AAC07 /* InfoPlist.strings */, - F598A8BE0342EE1E01B9BE79 /* Plus.tiff */, C152A6E907559AE9004FF49E /* AppIcon.icns */, C1AB8C7B075DAF9B00C4B27B /* DocIcon.icns */, ); @@ -307,7 +304,6 @@ C12C7FEA05AECD9D0066E007 /* PatchbayDocument.nib in Resources */, C12C7FEB05AECD9D0066E007 /* InfoPlist.strings in Resources */, C12C7FEC05AECD9D0066E007 /* Credits.html in Resources */, - C12C7FEF05AECD9D0066E007 /* Plus.tiff in Resources */, C152A6EA07559AE9004FF49E /* AppIcon.icns in Resources */, C1AB8C7C075DAF9B00C4B27B /* DocIcon.icns in Resources */, ); diff --git a/Plus.tiff b/Plus.tiff deleted file mode 100644 index 97cb1377fc1c82fd7c8d9f1e81f5bed3b6a57230..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3266 zcmeHK&8mV>5T5A|34>Z(ifYlW=qYri2r0G@1QFC1>3LeV?Ad~8#*X(&t%AH~(HX%R zzjJ2B`DTvb;Q)I8+X5qo0mH!C47jdKzVA~I1oXD^2OK=lqbQ0fj$INhnQI zE%_yPmSvRZ`M>0M9H;KLaNguDih|0rB+>FNg3I~`+WQhh=1pcz`YoJG-IBYis#?pl z;9bpw?)vFTnjT2q&+bHpG!s9@C}u{V7ph_ z1O7`mV_)IC8Ar Date: Fri, 6 Dec 2019 13:08:23 +0100 Subject: [PATCH 20/28] reintroduced min/max window sizing --- .../PatchbayDocument.nib/designable.nib | 4 +++- .../PatchbayDocument.nib/keyedobjects.nib | Bin 33976 -> 34135 bytes 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Base.lproj/PatchbayDocument.nib/designable.nib b/Base.lproj/PatchbayDocument.nib/designable.nib index 7eb82ae..5cb71fe 100644 --- a/Base.lproj/PatchbayDocument.nib/designable.nib +++ b/Base.lproj/PatchbayDocument.nib/designable.nib @@ -42,6 +42,8 @@ + + @@ -502,7 +504,7 @@ - + diff --git a/Base.lproj/PatchbayDocument.nib/keyedobjects.nib b/Base.lproj/PatchbayDocument.nib/keyedobjects.nib index b0152c0d8841384d8100899f00161d5b187da60a..69ce45d0a692bb2927ad338c09c6e428cedd13f1 100644 GIT binary patch delta 22131 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 Z|J)C1Hu!(IQ0k0f;={JT+kW=L{|{D^XA=Mb From 47ea940a573c5a981573bb5bc1d611f734770959 Mon Sep 17 00:00:00 2001 From: danomatika Date: Fri, 6 Dec 2019 13:10:18 +0100 Subject: [PATCH 21/28] flesh out comment stub --- Controller Classes/TableDataSource.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Controller Classes/TableDataSource.h b/Controller Classes/TableDataSource.h index c666cde..8650eef 100644 --- a/Controller Classes/TableDataSource.h +++ b/Controller Classes/TableDataSource.h @@ -1,6 +1,6 @@ #import -// simple base class to +// simple base class for deletion selector @interface TableDataSource : NSObject - (void)deleteSelection:(NSTableView*)tableView; From 23778a87ba4aa34c31f35258651081ca2709fbf8 Mon Sep 17 00:00:00 2001 From: danomatika Date: Fri, 6 Dec 2019 15:44:09 +0100 Subject: [PATCH 22/28] comment text end handling as it doesn't appear to be needed any longer, defocus tableview by pressing escape key --- View Classes/KeyTableView.h | 3 +- View Classes/KeyTableView.m | 55 +++++++++++++++++++++---------------- 2 files changed, 32 insertions(+), 26 deletions(-) diff --git a/View Classes/KeyTableView.h b/View Classes/KeyTableView.h index 47effee..53e6a7a 100644 --- a/View Classes/KeyTableView.h +++ b/View Classes/KeyTableView.h @@ -8,12 +8,11 @@ - (void)keyDown:(NSEvent *)theEvent; - (void)deleteForward:(id)sender; - (void)deleteBackward:(id)sender; +- (void)cancelOperation:(id)sender; - (void)moveUp:(id)sender; - (void)moveDown:(id)sender; - (BOOL)validateUserInterfaceItem:(id) menuItem; - (void)clear:(id)sender; -- (void)textDidEndEditing:(NSNotification*)notification; - @end diff --git a/View Classes/KeyTableView.m b/View Classes/KeyTableView.m index 4d63ed6..cb90f53 100644 --- a/View Classes/KeyTableView.m +++ b/View Classes/KeyTableView.m @@ -22,6 +22,12 @@ - (void)deleteBackward:(id)sender } +// remove focus from table view on Esc so Ok button can respond to Enter +- (void)cancelOperation:(id)sender { + [[self window] makeFirstResponder:self.window.contentView]; +} + + - (void)moveUp:(id)sender { if ([self selectedRow] > 0) { @@ -59,30 +65,31 @@ - (void)clear:(id)sender } -- (void)textDidEndEditing:(NSNotification*)notification -{ - // This is a hack to make the return key end editing and leave the selection - // on the current row rather than begin editing the next row. It works by - // substituting a dodgy key code in place of the return key. - - if ([[[notification userInfo] objectForKey:@"NSTextMovement"] intValue] == NSReturnTextMovement) { - NSMutableDictionary *newUserInfo = - [NSMutableDictionary dictionaryWithDictionary:[notification userInfo]]; - [newUserInfo setObject:[NSNumber numberWithInt:NSIllegalTextMovement] forKey:@"NSTextMovement"]; - - NSNotification *newNotification = [NSNotification - notificationWithName:[notification name] - object:[notification object] - userInfo:newUserInfo - ]; - - [super textDidEndEditing:newNotification]; - - [[self window] makeFirstResponder:self]; - } - else - [super textDidEndEditing:notification]; -} +// UPDATE: this isn't needed anymore in 10.10+ as the current selection appears to no longer change +//- (void)textDidEndEditing:(NSNotification*)notification +//{ +// // This is a hack to make the return key end editing and leave the selection +// // on the current row rather than begin editing the next row. It works by +// // substituting a dodgy key code in place of the return key. +// +// if ([[[notification userInfo] objectForKey:@"NSTextMovement"] intValue] == NSReturnTextMovement) { +// NSMutableDictionary *newUserInfo = +// [NSMutableDictionary dictionaryWithDictionary:[notification userInfo]]; +// [newUserInfo setObject:[NSNumber numberWithInt:NSIllegalTextMovement] forKey:@"NSTextMovement"]; +// +// NSNotification *newNotification = [NSNotification +// notificationWithName:[notification name] +// object:[notification object] +// userInfo:newUserInfo +// ]; +// +// [super textDidEndEditing:newNotification]; +// +// [[self window] makeFirstResponder:self]; +// } +// else +// [super textDidEndEditing:notification]; +//} @end From 44e20d8196fbf89e7f1ec2058109038056fe59f6 Mon Sep 17 00:00:00 2001 From: danomatika Date: Fri, 6 Dec 2019 16:11:17 +0100 Subject: [PATCH 23/28] ARC transition --- Controller Classes/EndpointTableDataSource.h | 1 - Controller Classes/EndpointTableDataSource.m | 23 +----- Controller Classes/PatchTableDataSource.h | 1 - Controller Classes/PatchTableDataSource.m | 12 +-- Controller Classes/PatchbayDocument.m | 35 +------- MIDI Patchbay.xcodeproj/project.pbxproj | 2 + Model Classes/Patch.m | 87 ++++++++++---------- PYMIDI/PYMIDIEndpoint.m | 24 ++---- PYMIDI/PYMIDIEndpointDescriptor.h | 2 - PYMIDI/PYMIDIEndpointDescriptor.m | 14 +--- PYMIDI/PYMIDIEndpointSet.h | 1 - PYMIDI/PYMIDIEndpointSet.m | 14 +--- PYMIDI/PYMIDIManager.h | 3 +- PYMIDI/PYMIDIManager.m | 17 +--- PYMIDI/PYMIDIRealDestination.m | 5 +- PYMIDI/PYMIDIRealSource.m | 24 +++--- PYMIDI/PYMIDIUtils.m | 10 +-- PYMIDI/PYMIDIVirtualDestination.m | 17 ++-- PYMIDI/PYMIDIVirtualEndpoint.m | 2 - PYMIDI/PYMIDIVirtualSource.m | 2 +- View Classes/PatchTableCellData.h | 1 - View Classes/PatchTableCellData.m | 22 ++--- 22 files changed, 99 insertions(+), 220 deletions(-) diff --git a/Controller Classes/EndpointTableDataSource.h b/Controller Classes/EndpointTableDataSource.h index 228429c..1f15659 100644 --- a/Controller Classes/EndpointTableDataSource.h +++ b/Controller Classes/EndpointTableDataSource.h @@ -9,7 +9,6 @@ } - (EndpointTableDataSource*)initWithEndpointClass:(Class)newEndpointClass endpointArray:(NSMutableArray*)newEndpointArray undoManager:(NSUndoManager*)newUndoManager; -- (void)dealloc; - (void)setEndpointArray:(NSMutableArray*)newEndpointArray; diff --git a/Controller Classes/EndpointTableDataSource.m b/Controller Classes/EndpointTableDataSource.m index 9d4dfbc..4124fc8 100644 --- a/Controller Classes/EndpointTableDataSource.m +++ b/Controller Classes/EndpointTableDataSource.m @@ -11,27 +11,16 @@ - (EndpointTableDataSource*)initWithEndpointClass:(Class)newEndpointClass endpoi if (self != nil) { endpointClass = newEndpointClass; - endpointArray = [newEndpointArray retain]; - undoManager = [newUndoManager retain]; + endpointArray = newEndpointArray; + undoManager = newUndoManager; } return self; } -- (void)dealloc -{ - [endpointArray release]; - [undoManager release]; - - [super dealloc]; -} - - - (void)setEndpointArray:(NSMutableArray*)newEndpointArray { - [newEndpointArray retain]; - [endpointArray release]; endpointArray = newEndpointArray; } @@ -137,8 +126,6 @@ - (void)tableView:(NSTableView*)tableView newEndpointWithName:(NSString*)name newEndpoint = [[endpointClass alloc] initWithName:newName]; [self tableView:tableView addEndpoint:newEndpoint atIndex:(int)[endpointArray count]]; - - [newEndpoint release]; } @@ -164,7 +151,7 @@ - (void)tableView:(NSTableView*)tableView removeEndpointAtIndex:(int)index NSWindow* window = [tableView window]; if ([window isKeyWindow] && ![window makeFirstResponder:nil]) return; - PYMIDIVirtualEndpoint* endpoint = [[endpointArray objectAtIndex:index] retain]; + PYMIDIVirtualEndpoint* endpoint = [endpointArray objectAtIndex:index]; [endpoint makePrivate:YES]; [endpointArray removeObjectAtIndex:index]; @@ -175,15 +162,13 @@ - (void)tableView:(NSTableView*)tableView removeEndpointAtIndex:(int)index [[undoManager prepareWithInvocationTarget:self] tableView:tableView addEndpoint:endpoint atIndex:index ]; - - [endpoint release]; } - (void)tableView:(NSTableView*)tableView setName:(NSString*)name forEndpointAtIndex:(int)index { PYMIDIVirtualEndpoint* endpoint = [endpointArray objectAtIndex:index]; - NSString* oldName = [[endpoint name] retain]; + NSString* oldName = [endpoint name]; [endpoint setName:name]; [tableView reloadData]; diff --git a/Controller Classes/PatchTableDataSource.h b/Controller Classes/PatchTableDataSource.h index e9f885b..f8e69f0 100644 --- a/Controller Classes/PatchTableDataSource.h +++ b/Controller Classes/PatchTableDataSource.h @@ -11,7 +11,6 @@ } - (PatchTableDataSource*)initWithDocument:(PatchbayDocument*)newDocument patchArray:(NSMutableArray*)newPatchArray; -- (void)dealloc; - (void)setPatchArray:(NSMutableArray*)newPatchArray; diff --git a/Controller Classes/PatchTableDataSource.m b/Controller Classes/PatchTableDataSource.m index 5ccb971..3568962 100644 --- a/Controller Classes/PatchTableDataSource.m +++ b/Controller Classes/PatchTableDataSource.m @@ -13,25 +13,15 @@ - (PatchTableDataSource*)initWithDocument:(PatchbayDocument*)newDocument patchAr if (self != nil) { document = newDocument; - patchArray = [newPatchArray retain]; + patchArray = newPatchArray; } return self; } -- (void)dealloc -{ - [patchArray release]; - - [super dealloc]; -} - - - (void)setPatchArray:(NSMutableArray*)newPatchArray { - [newPatchArray retain]; - [patchArray release]; patchArray = newPatchArray; } diff --git a/Controller Classes/PatchbayDocument.m b/Controller Classes/PatchbayDocument.m index b361de1..0ae3255 100644 --- a/Controller Classes/PatchbayDocument.m +++ b/Controller Classes/PatchbayDocument.m @@ -32,7 +32,6 @@ - (id)init selectedPatch = [[Patch alloc] initWithInput:input output:output]; [selectedPatch rescueFromLimbo]; patchArray = [[NSMutableArray alloc] initWithObjects:selectedPatch, nil]; - [selectedPatch release]; // Virtual endpoint related initialisation virtualSourceArray = [[NSMutableArray alloc] init]; @@ -65,11 +64,9 @@ - (void)windowControllerDidLoadNib:(NSWindowController*)windowController [buttonCell setButtonType:NSSwitchButton]; [buttonCell setTitle:@""]; [[patchTable tableColumnWithIdentifier:@"enabled"] setDataCell:buttonCell]; - [buttonCell release]; patchTableCell = [[PatchTableCell alloc] init]; [[patchTable tableColumnWithIdentifier:@"patch"] setDataCell:patchTableCell]; - [patchTableCell release]; patchTableDataSource = [[PatchTableDataSource alloc] initWithDocument:self patchArray:patchArray]; [patchTable setDataSource:patchTableDataSource]; @@ -120,17 +117,6 @@ - (void)windowControllerDidLoadNib:(NSWindowController*)windowController - (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; - - [patchTableDataSource release]; - [patchArray release]; - - [inputTableDataSource release]; - [outputTableDataSource release]; - - [virtualSourceArray release]; - [virtualDestinationArray release]; - - [super dealloc]; } @@ -149,7 +135,6 @@ - (NSData*)dataRepresentationOfType:(NSString*)type [archiver encodeObject:patchArray forKey:@"patchArray"]; [archiver finishEncoding]; - [archiver release]; return data; } @@ -157,21 +142,16 @@ - (NSData*)dataRepresentationOfType:(NSString*)type - (BOOL)loadDataRepresentation:(NSData*)data ofType:(NSString*)type { - [patchArray release]; - [virtualDestinationArray release]; - [virtualSourceArray release]; - NSKeyedUnarchiver* unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; - virtualDestinationArray = [[unarchiver decodeObjectForKey:@"virtualDestinationArray"] retain]; + virtualDestinationArray = [unarchiver decodeObjectForKey:@"virtualDestinationArray"]; - virtualSourceArray = [[unarchiver decodeObjectForKey:@"virtualSourceArray"] retain]; + virtualSourceArray = [unarchiver decodeObjectForKey:@"virtualSourceArray"]; - patchArray = [[unarchiver decodeObjectForKey:@"patchArray"] retain]; + patchArray = [unarchiver decodeObjectForKey:@"patchArray"]; [patchArray makeObjectsPerformSelector:@selector(rescueFromLimbo)]; [unarchiver finishDecoding]; - [unarchiver release]; // We need to do this to handle redisplay of the new data when a Revert is done [self syncWithLoadedData]; @@ -261,7 +241,6 @@ - (IBAction) addPatchButtonPressed:(id)sender if (selectedPatch != nil) { Patch *patch = [[Patch alloc] initFromPatch:selectedPatch]; [self addPatch:patch atIndex:(int)[patchArray count]]; - [patch release]; } else { // Pick a default input and output for a blank patch @@ -279,7 +258,6 @@ - (IBAction) addPatchButtonPressed:(id)sender Patch *patch = [[Patch alloc] initWithInput:input output:output]; [self addPatch:patch atIndex:(int)[patchArray count]]; - [patch release]; } } @@ -320,7 +298,7 @@ - (void)addPatchFromArchive:(NSData*)data atIndex:(int)index - (void)removePatchAtIndex:(int)index { NSUndoManager* undoManager = [self undoManager]; - Patch* patch = [[patchArray objectAtIndex:index] retain]; + Patch* patch = [patchArray objectAtIndex:index]; [patch banishToLimbo]; [patchArray removeObjectAtIndex:index]; @@ -330,8 +308,6 @@ - (void)removePatchAtIndex:(int)index [[undoManager prepareWithInvocationTarget:self] addPatch:patch atIndex:index ]; - - [patch release]; } @@ -369,7 +345,6 @@ - (NSData*)archivePatchForPasteBoard:(Patch*)patch [archiver encodeObject:patch forKey:@"patch"]; [archiver finishEncoding]; - [archiver release]; return data; } @@ -391,7 +366,6 @@ - (Patch*)unarchivePatchFromPasteBoard:(NSData*)data patch = [unarchiver decodeObjectForKey:@"patch"]; [unarchiver finishDecoding]; - [unarchiver release]; return patch; } @@ -487,7 +461,6 @@ - (void)buildFilterChannelControls [filterChannelMatrix setIntercellSpacing:NSMakeSize(5,4)]; [filterChannelMatrix setMode:NSTrackModeMatrix]; [filterChannelMatrix renewRows:2 columns:8]; - [buttonCell release]; for (i = 0; i < 8; i++) { buttonCell = [filterChannelMatrix cellAtRow:0 column:i]; diff --git a/MIDI Patchbay.xcodeproj/project.pbxproj b/MIDI Patchbay.xcodeproj/project.pbxproj index 9ec5fa1..dbc30ab 100644 --- a/MIDI Patchbay.xcodeproj/project.pbxproj +++ b/MIDI Patchbay.xcodeproj/project.pbxproj @@ -377,6 +377,7 @@ C1010469088A0A7C001DFE4F /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + CLANG_ENABLE_OBJC_ARC = YES; CLANG_ENABLE_OBJC_WEAK = YES; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; @@ -411,6 +412,7 @@ C101046A088A0A7C001DFE4F /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + CLANG_ENABLE_OBJC_ARC = YES; CLANG_ENABLE_OBJC_WEAK = YES; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = YES; diff --git a/Model Classes/Patch.m b/Model Classes/Patch.m index 59b7e01..76872e7 100644 --- a/Model Classes/Patch.m +++ b/Model Classes/Patch.m @@ -17,11 +17,11 @@ @implementation Patch #pragma mark Initialisation -- (Patch*)initWithInput:(PYMIDIEndpoint*)newInput output:(PYMIDIEndpoint*)newOutput +- (void)setupInput:(PYMIDIEndpoint*)newInput output:(PYMIDIEndpoint*)newOutput { isInLimbo = YES; - input = [newInput retain]; + input = newInput; [input addReceiver:self]; shouldFilterChannel = NO; @@ -40,45 +40,53 @@ - (Patch*)initWithInput:(PYMIDIEndpoint*)newInput output:(PYMIDIEndpoint*)newOut shouldTransmitClock = NO; - output = [newOutput retain]; + output = newOutput; [output addSender:self]; isEnabled = YES; - +} - return self; +- (Patch*)initWithInput:(PYMIDIEndpoint*)newInput output:(PYMIDIEndpoint*)newOutput +{ + self = [super init]; + if (self) { + [self setupInput:newInput output:newOutput]; + } + return self; } - (Patch*)initFromPatch:(Patch*)patch { - BOOL useNextMIDIChannel = NO; - - [self initWithInput:[patch input] output:[patch output]]; - - if ([patch shouldFilterChannel]) { - [self setShouldFilterChannel:YES]; - channelMask = [patch channelMask]; - } - - [self setShouldAllowNotes:[patch shouldAllowNotes]]; - - if ([patch shouldFilterRange]) { - [self setShouldFilterRange:YES]; - if ([patch highestAllowedNote] < 127) - [self setLowestAllowedNote:[patch highestAllowedNote] + 1]; - useNextMIDIChannel = YES; - } - - if ([patch shouldRemapChannel]) { - [self setShouldRemapChannel:YES]; - // *** Need to bounds check this: - if (useNextMIDIChannel) - [self setRemappingChannel:[patch remappingChannel] + 1]; - else - [self setRemappingChannel:[patch remappingChannel]]; - } - + self = [super init]; + if (self) { + [self setupInput:[patch input] output:[patch output]]; + + BOOL useNextMIDIChannel = NO; + + if ([patch shouldFilterChannel]) { + [self setShouldFilterChannel:YES]; + channelMask = [patch channelMask]; + } + + [self setShouldAllowNotes:[patch shouldAllowNotes]]; + + if ([patch shouldFilterRange]) { + [self setShouldFilterRange:YES]; + if ([patch highestAllowedNote] < 127) + [self setLowestAllowedNote:[patch highestAllowedNote] + 1]; + useNextMIDIChannel = YES; + } + + if ([patch shouldRemapChannel]) { + [self setShouldRemapChannel:YES]; + // *** Need to bounds check this: + if (useNextMIDIChannel) + [self setRemappingChannel:[patch remappingChannel] + 1]; + else + [self setRemappingChannel:[patch remappingChannel]]; + } + } return self; } @@ -86,12 +94,7 @@ - (Patch*)initFromPatch:(Patch*)patch - (void)dealloc { [input removeReceiver:self]; - [input release]; - [output removeSender:self]; - [output release]; - - [super dealloc]; } @@ -315,10 +318,7 @@ - (PYMIDIEndpoint*)input - (void)setInput:(PYMIDIEndpoint*)newInput { [input removeReceiver:self]; - - [input autorelease]; - input = [newInput retain]; - + input = newInput; [input addReceiver:self]; } @@ -477,10 +477,7 @@ - (PYMIDIEndpoint*)output - (void)setOutput:(PYMIDIEndpoint*)newOutput { [output removeSender:self]; - - [output autorelease]; - output = [newOutput retain]; - + output = newOutput; [output addSender:self]; } diff --git a/PYMIDI/PYMIDIEndpoint.m b/PYMIDI/PYMIDIEndpoint.m index 1fb7cf9..8779552 100644 --- a/PYMIDI/PYMIDIEndpoint.m +++ b/PYMIDI/PYMIDIEndpoint.m @@ -57,12 +57,6 @@ - (id)initWithMIDIEndpointRef:(MIDIEndpointRef)newMIDIEndpointRef; - (void)dealloc { [self stopIO]; - [name release]; - [displayName release]; - [receivers release]; - [senders release]; - - [super dealloc]; } @@ -112,8 +106,7 @@ - (void)setUniqueIDFromMIDIEndpoint - (void)setNameFromMIDIEndpoint { - [name release]; - name = [[PYMIDIGetEndpointName (midiEndpointRef) retain] mutableCopy]; + name = [PYMIDIGetEndpointName (midiEndpointRef) mutableCopy]; } @@ -121,8 +114,6 @@ - (void)setDisplayNameFromMIDIEndpoint { CFDataRef externalIDs; OSStatus result; - - [displayName release]; NSMutableArray* names = [NSMutableArray arrayWithCapacity:0]; @@ -158,7 +149,7 @@ - (void)setDisplayNameFromMIDIEndpoint CFStringRef externalName; result = MIDIObjectGetStringProperty (externalDevice, kMIDIPropertyName, &externalName); if (result == noErr) { - [names addObject:[NSString stringWithString:(NSString*)externalName]]; + [names addObject:[NSString stringWithString:(__bridge NSString*)externalName]]; CFRelease (externalName); } } @@ -184,8 +175,6 @@ - (void)setDisplayNameFromMIDIEndpoint else displayName = [@"UNKNOWN DEVICE" mutableCopy]; } - - [displayName retain]; } @@ -202,14 +191,13 @@ - (BOOL)setName:(NSMutableString*)newName [manager disableNotifications]; - result = MIDIObjectSetStringProperty (midiEndpointRef, kMIDIPropertyName, (CFStringRef)newName); + result = MIDIObjectSetStringProperty (midiEndpointRef, kMIDIPropertyName, (__bridge CFStringRef)newName); [manager enableNotifications]; if (result == noErr) { - [name autorelease]; - name = [newName retain]; - displayName = [newName retain]; + name = newName; + displayName = newName; return YES; } else @@ -282,7 +270,7 @@ - (BOOL)isIACBus BOOL isIACBus = driverName != nil && - [@"com.apple.AppleMIDIIACDriver" isEqualToString:(NSString*)driverName]; + [@"com.apple.AppleMIDIIACDriver" isEqualToString:(__bridge NSString*)driverName]; if (driverName != nil) CFRelease (driverName); diff --git a/PYMIDI/PYMIDIEndpointDescriptor.h b/PYMIDI/PYMIDIEndpointDescriptor.h index c806e15..d6ca7cd 100644 --- a/PYMIDI/PYMIDIEndpointDescriptor.h +++ b/PYMIDI/PYMIDIEndpointDescriptor.h @@ -10,8 +10,6 @@ - (id)initWithName:(NSString*)newName uniqueID:(SInt32)newUniqueID; -- (void)dealloc; - - (id)initWithCoder:(NSCoder*)coder; - (void)encodeWithCoder:(NSCoder*)coder; diff --git a/PYMIDI/PYMIDIEndpointDescriptor.m b/PYMIDI/PYMIDIEndpointDescriptor.m index a14bf0f..1875e49 100644 --- a/PYMIDI/PYMIDIEndpointDescriptor.m +++ b/PYMIDI/PYMIDIEndpointDescriptor.m @@ -6,7 +6,7 @@ @implementation PYMIDIEndpointDescriptor + (id)descriptorWithName:(NSString*)newName uniqueID:(SInt32)newUniqueID; { - return [[[PYMIDIEndpointDescriptor alloc] initWithName:newName uniqueID:newUniqueID] autorelease]; + return [[PYMIDIEndpointDescriptor alloc] initWithName:newName uniqueID:newUniqueID]; } @@ -14,26 +14,18 @@ - (id)initWithName:(NSString*)newName uniqueID:(SInt32)newUniqueID { self = [super init]; - name = [newName retain]; + name = newName; uniqueID = newUniqueID; return self; } -- (void)dealloc -{ - [name release]; - - [super dealloc]; -} - - - (id)initWithCoder:(NSCoder*)coder { self = [super init]; - name = [[coder decodeObjectForKey:@"name"] retain]; + name = [coder decodeObjectForKey:@"name"]; uniqueID = [coder decodeInt32ForKey:@"uniqueID"]; return self; diff --git a/PYMIDI/PYMIDIEndpointSet.h b/PYMIDI/PYMIDIEndpointSet.h index f715688..54b89de 100644 --- a/PYMIDI/PYMIDIEndpointSet.h +++ b/PYMIDI/PYMIDIEndpointSet.h @@ -11,7 +11,6 @@ + (id)endpointSetWithArray:(NSArray*)newEndpointArray; - (id)initWithEndpointArray:(NSArray*)newEndpointArray; -- (void)dealloc; - (id)archiver:(NSKeyedArchiver*)archiver willEncodeObject:(id)object; - (id)unarchiver:(NSKeyedUnarchiver*)unarchiver didDecodeObject:(id)object; diff --git a/PYMIDI/PYMIDIEndpointSet.m b/PYMIDI/PYMIDIEndpointSet.m index 59695c2..0fbf968 100644 --- a/PYMIDI/PYMIDIEndpointSet.m +++ b/PYMIDI/PYMIDIEndpointSet.m @@ -8,7 +8,7 @@ @implementation PYMIDIEndpointSet + (id)endpointSetWithArray:(NSArray*)newEndpointArray { - return [[[PYMIDIEndpointSet alloc] initWithEndpointArray:newEndpointArray] retain]; + return [[PYMIDIEndpointSet alloc] initWithEndpointArray:newEndpointArray]; } @@ -17,21 +17,13 @@ - (id)initWithEndpointArray:(NSArray*)newEndpointArray self = [super init]; if (self != nil) { - endpointArray = [newEndpointArray retain]; + endpointArray = newEndpointArray; } return self; } -- (void)dealloc -{ - [endpointArray release]; - - [super dealloc]; -} - - - (id)archiver:(NSKeyedArchiver*)archiver willEncodeObject:(id)object { if ([endpointArray containsObject:object]) @@ -44,7 +36,7 @@ - (id)archiver:(NSKeyedArchiver*)archiver willEncodeObject:(id)object - (id)unarchiver:(NSKeyedUnarchiver*)unarchiver didDecodeObject:(id)object { if ([object isMemberOfClass:[PYMIDIEndpointDescriptor class]]) - object = [[self endpointWithDescriptor:object] retain]; + object = [self endpointWithDescriptor:object]; // Note that we DON'T need to release the original object when doing a // subsitution. This is the opposite of what happens when we do it in diff --git a/PYMIDI/PYMIDIManager.h b/PYMIDI/PYMIDIManager.h index aa9f033..dc1223c 100644 --- a/PYMIDI/PYMIDIManager.h +++ b/PYMIDI/PYMIDIManager.h @@ -18,7 +18,6 @@ + (PYMIDIManager*)sharedInstance; - (PYMIDIManager*)init; -- (void)dealloc; - (MIDIClientRef)midiClientRef; @@ -43,4 +42,4 @@ - (NSString*)nameOfNote:(Byte)note; -@end \ No newline at end of file +@end diff --git a/PYMIDI/PYMIDIManager.m b/PYMIDI/PYMIDIManager.m index 64a51f6..733f297 100644 --- a/PYMIDI/PYMIDIManager.m +++ b/PYMIDI/PYMIDIManager.m @@ -41,7 +41,7 @@ - (PYMIDIManager*)init { notificationsEnabled = NO; - MIDIClientCreate (CFSTR("PYMIDIManager"), midiNotifyProc, (void*)self, &midiClientRef); + MIDIClientCreate (CFSTR("PYMIDIManager"), midiNotifyProc, (__bridge void*)self, &midiClientRef); realSourceArray = [[NSMutableArray alloc] init]; realDestinationArray = [[NSMutableArray alloc] init]; @@ -57,17 +57,6 @@ - (PYMIDIManager*)init } -- (void)dealloc -{ - [realSourceArray release]; - [realDestinationArray release]; - - [noteNamesArray release]; - - [super dealloc]; -} - - - (MIDIClientRef)midiClientRef { return midiClientRef; @@ -124,7 +113,7 @@ - (void)processMIDINotification:(const MIDINotification*)message static void midiNotifyProc (const MIDINotification* message, void* refCon) { - PYMIDIManager* manager = (PYMIDIManager*)refCon; + PYMIDIManager* manager = (__bridge PYMIDIManager*)refCon; [manager processMIDINotification:message]; } @@ -208,7 +197,6 @@ - (PYMIDIEndpoint*)realSourceWithDescriptor:(PYMIDIEndpointDescriptor*)descripto if (endpoint == nil) { endpoint = [[PYMIDIRealSource alloc] initWithDescriptor:descriptor]; [realSourceArray addObject:endpoint]; - [endpoint release]; } return endpoint; @@ -294,7 +282,6 @@ - (PYMIDIEndpoint*)realDestinationWithDescriptor:(PYMIDIEndpointDescriptor*)desc if (endpoint == nil) { endpoint = [[PYMIDIRealDestination alloc] initWithDescriptor:descriptor]; [realDestinationArray addObject:endpoint]; - [endpoint release]; } return endpoint; diff --git a/PYMIDI/PYMIDIRealDestination.m b/PYMIDI/PYMIDIRealDestination.m index 5749ce8..365d83a 100644 --- a/PYMIDI/PYMIDIRealDestination.m +++ b/PYMIDI/PYMIDIRealDestination.m @@ -20,9 +20,8 @@ - (id)initWithCoder:(NSCoder*)coder newUniqueID = [coder decodeInt32ForKey:@"uniqueID"]; descriptor = [PYMIDIEndpointDescriptor descriptorWithName:newName uniqueID:newUniqueID]; - - [self release]; - return [(PYMIDIRealDestination *)[manager realDestinationWithDescriptor:descriptor] retain]; + + return (PYMIDIRealDestination *)[manager realDestinationWithDescriptor:descriptor]; } diff --git a/PYMIDI/PYMIDIRealSource.m b/PYMIDI/PYMIDIRealSource.m index b46a45f..1cf6121 100644 --- a/PYMIDI/PYMIDIRealSource.m +++ b/PYMIDI/PYMIDIRealSource.m @@ -23,9 +23,8 @@ - (id)initWithCoder:(NSCoder*)coder newUniqueID = [coder decodeInt32ForKey:@"uniqueID"]; descriptor = [PYMIDIEndpointDescriptor descriptorWithName:newName uniqueID:newUniqueID]; - - [self release]; - return (PYMIDIRealSource *)[[manager realSourceWithDescriptor:descriptor] retain]; + + return (PYMIDIRealSource *)[manager realSourceWithDescriptor:descriptor]; } @@ -58,7 +57,7 @@ - (void)startIO MIDIInputPortCreate ( [[PYMIDIManager sharedInstance] midiClientRef], CFSTR("PYMIDIRealSource"), - midiReadProc, (void*)self, &midiPortRef + midiReadProc, (__bridge void*)self, &midiPortRef ); MIDIPortConnectSource (midiPortRef, midiEndpointRef, nil); } @@ -81,22 +80,21 @@ - (void)processMIDIPacketList:(const MIDIPacketList*)packetList sender:(id)sende // means that we can do memory allocation freely in the processing and // it will all get automatically cleaned up once we've passed the data // on, which is a win. - NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; - - NSEnumerator* enumerator = [receivers objectEnumerator]; - id receiver; + @autoreleasepool { + NSEnumerator* enumerator = [receivers objectEnumerator]; + id receiver; + + while ((receiver = [[enumerator nextObject] nonretainedObjectValue])) + [receiver processMIDIPacketList:packetList sender:self]; - while ((receiver = [[enumerator nextObject] nonretainedObjectValue])) - [receiver processMIDIPacketList:packetList sender:self]; - - [pool release]; + } } static void midiReadProc (const MIDIPacketList* packetList, void* createRefCon, void* connectRefConn) { - PYMIDIRealSource* source = (PYMIDIRealSource*)createRefCon; + PYMIDIRealSource* source = (__bridge PYMIDIRealSource*)createRefCon; [source processMIDIPacketList:packetList sender:source]; } diff --git a/PYMIDI/PYMIDIUtils.m b/PYMIDI/PYMIDIUtils.m index e86e963..178b22e 100644 --- a/PYMIDI/PYMIDIUtils.m +++ b/PYMIDI/PYMIDIUtils.m @@ -29,22 +29,22 @@ NSString* name; if (endpointName != nil) { if (deviceName != nil) { - NSString *endpointNameNS = (NSString *)endpointName; - NSString *deviceNameNS = (NSString *)deviceName; + NSString *endpointNameNS = (__bridge NSString *)endpointName; + NSString *deviceNameNS = (__bridge NSString *)deviceName; bool endpointNameBeginsWithDeviceName = [endpointNameNS compare:deviceNameNS options:NSCaseInsensitiveSearch] == NSOrderedSame; if (endpointNameBeginsWithDeviceName) - name = [NSString stringWithString:(NSString*)endpointName]; + name = [NSString stringWithString:(__bridge NSString*)endpointName]; else name = [NSString stringWithFormat:@"%@ %@", deviceName, endpointName]; } else - name = [NSString stringWithString:(NSString*)endpointName]; + name = [NSString stringWithString:(__bridge NSString*)endpointName]; } else { if (deviceName != nil) - name = [NSString stringWithString:(NSString*)deviceName]; + name = [NSString stringWithString:(__bridge NSString*)deviceName]; else name = nil; // Hopefully we'll never get here! } diff --git a/PYMIDI/PYMIDIVirtualDestination.m b/PYMIDI/PYMIDIVirtualDestination.m index 16d209e..c83ecca 100644 --- a/PYMIDI/PYMIDIVirtualDestination.m +++ b/PYMIDI/PYMIDIVirtualDestination.m @@ -20,7 +20,7 @@ - (id)initWithName:(NSString*)newName // we're done creating it. [manager disableNotifications]; - MIDIDestinationCreate ([manager midiClientRef], (CFStringRef)newName, midiReadProc, self, &newEndpoint); + MIDIDestinationCreate ([manager midiClientRef], (__bridge CFStringRef)newName, midiReadProc, (__bridge void * _Nullable)(self), &newEndpoint); // This code works around a bug in OS X 10.1 that causes // new sources/destinations to be created without unique IDs. @@ -44,7 +44,6 @@ - (id)initWithName:(NSString*)newName - (void)processMIDIPacketList:(const MIDIPacketList*)packetList sender:(id)sender { - NSAutoreleasePool* pool; NSEnumerator* enumerator; id receiver; @@ -55,20 +54,18 @@ - (void)processMIDIPacketList:(const MIDIPacketList*)packetList sender:(id)sende // means that we can do memory allocation freely in the processing and // it will all get automatically cleaned up once we've passed the data // on, which is a win. - pool = [[NSAutoreleasePool alloc] init]; - - enumerator = [receivers objectEnumerator]; - while ((receiver = [[enumerator nextObject] nonretainedObjectValue])) - [receiver processMIDIPacketList:packetList sender:self]; - - [pool release]; + @autoreleasepool { + enumerator = [receivers objectEnumerator]; + while ((receiver = [[enumerator nextObject] nonretainedObjectValue])) + [receiver processMIDIPacketList:packetList sender:self]; + } } static void midiReadProc (const MIDIPacketList* packetList, void* createRefCon, void* connectRefConn) { - PYMIDIVirtualDestination* destination = (PYMIDIVirtualDestination*)createRefCon; + PYMIDIVirtualDestination* destination = (__bridge PYMIDIVirtualDestination*)createRefCon; [destination processMIDIPacketList:packetList sender:destination]; } diff --git a/PYMIDI/PYMIDIVirtualEndpoint.m b/PYMIDI/PYMIDIVirtualEndpoint.m index 6dc9ed3..33a67eb 100644 --- a/PYMIDI/PYMIDIVirtualEndpoint.m +++ b/PYMIDI/PYMIDIVirtualEndpoint.m @@ -18,8 +18,6 @@ - (void)dealloc [manager disableNotifications]; MIDIEndpointDispose (midiEndpointRef); [manager enableNotifications]; - - [super dealloc]; } diff --git a/PYMIDI/PYMIDIVirtualSource.m b/PYMIDI/PYMIDIVirtualSource.m index 893a793..5599f1c 100644 --- a/PYMIDI/PYMIDIVirtualSource.m +++ b/PYMIDI/PYMIDIVirtualSource.m @@ -17,7 +17,7 @@ - (id)initWithName:(NSString*)newName // we're done creating it. [manager disableNotifications]; - MIDISourceCreate ([manager midiClientRef], (CFStringRef)newName, &newEndpoint); + MIDISourceCreate ([manager midiClientRef], (__bridge CFStringRef)newName, &newEndpoint); // This code works around a bug in OS X 10.1 that causes // new sources/destinations to be created without unique IDs. diff --git a/View Classes/PatchTableCellData.h b/View Classes/PatchTableCellData.h index 428136f..6c5915a 100644 --- a/View Classes/PatchTableCellData.h +++ b/View Classes/PatchTableCellData.h @@ -10,7 +10,6 @@ + (PatchTableCellData*)dataWithInputName:(NSString*)newInputName outputName:(NSString*)newOutputName description:(NSString*)newDescription; - (PatchTableCellData*)initWithInputName:(NSString*)newInputName outputName:(NSString*)newOutputName description:(NSString*)newDescription; -- (void)dealloc; - (NSString*)inputName; - (NSString*)outputName; diff --git a/View Classes/PatchTableCellData.m b/View Classes/PatchTableCellData.m index 2044067..671f8a9 100644 --- a/View Classes/PatchTableCellData.m +++ b/View Classes/PatchTableCellData.m @@ -9,30 +9,20 @@ + (PatchTableCellData*)dataWithInputName:(NSString*)newInputName outputName:(NSS PatchTableCellData* data = [[PatchTableCellData alloc] initWithInputName:newInputName outputName:newOutputName description:newDescription ]; - return [data autorelease]; + return data; } - (PatchTableCellData*)initWithInputName:(NSString*)newInputName outputName:(NSString*)newOutputName description:(NSString*)newDescription { - inputName = [newInputName retain]; - outputName = [newOutputName retain]; - description = [newDescription retain]; + inputName = newInputName; + outputName = newOutputName; + description = newDescription; return self; } -- (void)dealloc -{ - [inputName release]; - [outputName release]; - [description release]; - - [super dealloc]; -} - - - (NSString*)inputName { return inputName; @@ -52,9 +42,7 @@ - (NSString*)description - (id)copyWithZone:(NSZone *)zone { PatchTableCellData* copy = [[self class] allocWithZone:zone]; - [copy initWithInputName:inputName outputName:outputName description:description]; - - return copy; + return [copy initWithInputName:inputName outputName:outputName description:description]; } From 9165bf9e60af5e56b2fdd286aca2ae47901b3076 Mon Sep 17 00:00:00 2001 From: danomatika Date: Fri, 6 Dec 2019 16:20:56 +0100 Subject: [PATCH 24/28] re-enable endpoint switching by selection in endpoint panel --- Controller Classes/PatchbayDocument.h | 2 +- Controller Classes/PatchbayDocument.m | 28 ++++++++------------------- 2 files changed, 9 insertions(+), 21 deletions(-) diff --git a/Controller Classes/PatchbayDocument.h b/Controller Classes/PatchbayDocument.h index 2d62942..4b0b589 100644 --- a/Controller Classes/PatchbayDocument.h +++ b/Controller Classes/PatchbayDocument.h @@ -172,7 +172,7 @@ - (IBAction)endpointPanelButtonPressed:(id)sender; -- (void)endpointPanelDidEnd:(NSWindow*)sheet returnCode:(int)returnCode contextInfo:(void*)contextInfo; +- (void)endpointPanelDidEnd:(NSWindow*)sheet returnCode:(NSModalResponse)returnCode contextInfo:(void*)contextInfo; @end diff --git a/Controller Classes/PatchbayDocument.m b/Controller Classes/PatchbayDocument.m index 0ae3255..357aaf4 100644 --- a/Controller Classes/PatchbayDocument.m +++ b/Controller Classes/PatchbayDocument.m @@ -1000,16 +1000,10 @@ - (IBAction)editVirtualInputs:(id)sender [[self undoManager] beginUndoGrouping]; panelWasOpenedToInputs = YES; - - [documentWindow beginSheet: virtualEndpointPanel completionHandler: nil]; - /* - [[NSApplication sharedApplication] - beginSheet:virtualEndpointPanel - modalForWindow:documentWindow - modalDelegate:self - didEndSelector:@selector(endpointPanelDidEnd:returnCode:contextInfo:) - contextInfo:nil - ];*/ + + [documentWindow beginSheet:virtualEndpointPanel completionHandler:^(NSModalResponse returnCode) { + [self endpointPanelDidEnd:self->virtualEndpointPanel returnCode:returnCode contextInfo:nil]; + }]; } @@ -1023,15 +1017,9 @@ - (IBAction)editVirtualOutputs:(id)sender [[self undoManager] beginUndoGrouping]; panelWasOpenedToInputs = NO; - [documentWindow beginSheet:virtualEndpointPanel completionHandler: nil]; - /* - [[NSApplication sharedApplication] - beginSheet:virtualEndpointPanel - modalForWindow:documentWindow - modalDelegate:self - didEndSelector:@selector(endpointPanelDidEnd:returnCode:contextInfo:) - contextInfo:nil - ];*/ + [documentWindow beginSheet:virtualEndpointPanel completionHandler:^(NSModalResponse returnCode) { + [self endpointPanelDidEnd:self->virtualEndpointPanel returnCode:returnCode contextInfo:nil]; + }]; } @@ -1076,7 +1064,7 @@ - (IBAction)endpointPanelButtonPressed:(id)sender } -- (void)endpointPanelDidEnd:(NSWindow*)sheet returnCode:(int)returnCode contextInfo:(void*)contextInfo +- (void)endpointPanelDidEnd:(NSWindow*)sheet returnCode:(NSModalResponse)returnCode contextInfo:(void*)contextInfo { int tab = (int)[virtualEndpointTabView indexOfTabViewItem:[virtualEndpointTabView selectedTabViewItem]]; From 45fb8182da305e9f8d9639e690fac089ed31b232 Mon Sep 17 00:00:00 2001 From: danomatika Date: Fri, 6 Dec 2019 16:25:40 +0100 Subject: [PATCH 25/28] don't save endpoint change undo action unless endpoint was actually changed --- Controller Classes/PatchbayDocument.m | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Controller Classes/PatchbayDocument.m b/Controller Classes/PatchbayDocument.m index 357aaf4..c82e826 100644 --- a/Controller Classes/PatchbayDocument.m +++ b/Controller Classes/PatchbayDocument.m @@ -1071,13 +1071,17 @@ - (void)endpointPanelDidEnd:(NSWindow*)sheet returnCode:(NSModalResponse)returnC if (panelWasOpenedToInputs) { if (tab == 0 && [inputTable selectedRow] != -1) { PYMIDIEndpoint* input = [virtualDestinationArray objectAtIndex:[inputTable selectedRow]]; - [self setInput:input forPatch:selectedPatch]; + if (selectedPatch.input != input) { + [self setInput:input forPatch:selectedPatch]; + } } } else { if (tab == 1 && [outputTable selectedRow] != -1) { PYMIDIEndpoint* output = [virtualSourceArray objectAtIndex:[outputTable selectedRow]]; - [self setOutput:output forPatch:selectedPatch];; + if (selectedPatch.output != output) { + [self setOutput:output forPatch:selectedPatch]; + } } } From 1bff7c6aed2e87b45009b90dbfb80d02e3c08552 Mon Sep 17 00:00:00 2001 From: danomatika Date: Fri, 6 Dec 2019 16:28:30 +0100 Subject: [PATCH 26/28] bumped build number --- Info.plist | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Info.plist b/Info.plist index 2e133c0..30ccb77 100644 --- a/Info.plist +++ b/Info.plist @@ -38,7 +38,7 @@ CFBundleSignature ???? CFBundleVersion - 1 + 2 LSApplicationCategoryType public.app-category.music NSMainNibFile From f674933e6cd40d92b97cb951b6922724df1e90ad Mon Sep 17 00:00:00 2001 From: danomatika Date: Fri, 6 Dec 2019 16:33:51 +0100 Subject: [PATCH 27/28] added explicit Release build scheme --- .../xcschemes/MIDI Patchbay.xcscheme | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 MIDI Patchbay.xcodeproj/xcshareddata/xcschemes/MIDI Patchbay.xcscheme diff --git a/MIDI Patchbay.xcodeproj/xcshareddata/xcschemes/MIDI Patchbay.xcscheme b/MIDI Patchbay.xcodeproj/xcshareddata/xcschemes/MIDI Patchbay.xcscheme new file mode 100644 index 0000000..a2b2f0d --- /dev/null +++ b/MIDI Patchbay.xcodeproj/xcshareddata/xcschemes/MIDI Patchbay.xcscheme @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From cc0ad3ee5308ae002ae58d08f3142faf2ba15580 Mon Sep 17 00:00:00 2001 From: danomatika Date: Fri, 6 Dec 2019 16:57:06 +0100 Subject: [PATCH 28/28] no focus rings for table views as selection highlight shows this, this matches previous version behavior --- .../PatchbayDocument.nib/designable.nib | 8 ++++---- .../PatchbayDocument.nib/keyedobjects.nib | Bin 34135 -> 34140 bytes 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Base.lproj/PatchbayDocument.nib/designable.nib b/Base.lproj/PatchbayDocument.nib/designable.nib index 5cb71fe..365f903 100644 --- a/Base.lproj/PatchbayDocument.nib/designable.nib +++ b/Base.lproj/PatchbayDocument.nib/designable.nib @@ -55,7 +55,7 @@ - + @@ -437,7 +437,7 @@ - + @@ -504,9 +504,9 @@ - + - + diff --git a/Base.lproj/PatchbayDocument.nib/keyedobjects.nib b/Base.lproj/PatchbayDocument.nib/keyedobjects.nib index 69ce45d0a692bb2927ad338c09c6e428cedd13f1..d65b250c7ce02726e872fb50a912f470de7a589f 100644 GIT binary patch delta 15262 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 delta 15345 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 H`f2|UNhOZr