From 3a1a21d1ea3e060f88ca1d24ea881f3ccb97640c Mon Sep 17 00:00:00 2001 From: Matthew Judy Date: Wed, 1 Oct 2003 11:40:42 +0000 Subject: [PATCH] OMG HUEG COMMIT!!! IT SI LIEK AN XBOX, BECAUES IT SI SO HUEG!! ALL STATUS WINDOW CONTENT IN, AND VARIPUS OTHER STUFF HAHA --- English.lproj/Preferences.nib/info.nib | 6 +- .../Preferences.nib/keyedobjects.nib | Bin 40599 -> 40592 bytes MainController.m | 36 +- MenuController.m | 6 +- OldMainController.m | 4 +- PreferencesController.m | 26 +- Rating.tiff | Bin 0 -> 62964 bytes StatusWindow.h | 17 +- StatusWindow.m | 319 +++++++++++++----- StatusWindowController.h | 13 +- StatusWindowController.m | 125 ++++++- TODO.rtf | 12 +- iTunesRemote.m | 12 +- libValidate.a | Bin 8032 -> 8032 bytes 14 files changed, 428 insertions(+), 148 deletions(-) create mode 100755 Rating.tiff diff --git a/English.lproj/Preferences.nib/info.nib b/English.lproj/Preferences.nib/info.nib index 32b0c27..6d64f8c 100755 --- a/English.lproj/Preferences.nib/info.nib +++ b/English.lproj/Preferences.nib/info.nib @@ -3,9 +3,9 @@ IBDocumentLocation - 6 66 356 240 0 0 1152 746 + 5 69 356 240 0 0 1056 770 IBFramework Version - 291.0 + 286.0 IBGroupedObjects 0 @@ -25,6 +25,6 @@ 6 IBSystem Version - 6R65 + 6L60 diff --git a/English.lproj/Preferences.nib/keyedobjects.nib b/English.lproj/Preferences.nib/keyedobjects.nib index fada2b3a876f5da042b45cfa794d45ca02c3d679..5587b1e08ea5f2cb6acaa5c381f04614412e493b 100755 GIT binary patch delta 18760 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 QLhVyzt9`!vo*4B10AgOXqyPW_ diff --git a/MainController.m b/MainController.m index 06ae1d9..523936c 100755 --- a/MainController.m +++ b/MainController.m @@ -36,7 +36,7 @@ static MainController *sharedController; sharedController = self; remoteArray = [[NSMutableArray alloc] initWithCapacity:1]; - statusWindowController = [[StatusWindowController alloc] init]; + statusWindowController = [StatusWindowController sharedController]; menuController = [[MenuController alloc] init]; df = [[NSUserDefaults standardUserDefaults] retain]; } @@ -89,6 +89,8 @@ static MainController *sharedController; [statusItem setImage:[NSImage imageNamed:@"MenuNormal"]]; [statusItem setAlternateImage:[NSImage imageNamed:@"MenuInverted"]]; + + [NSApp deactivate]; } - (ITMTRemote *)loadRemote @@ -207,7 +209,7 @@ static MainController *sharedController; [menuController rebuildSubmenus]; if ( [df boolForKey:@"showSongInfoOnChange"] ) { -// [self performSelector:@selector(showCurrentTrackInfo) withObject:nil afterDelay:0.0]; + [self performSelector:@selector(showCurrentTrackInfo) withObject:nil afterDelay:0.0]; } } } @@ -493,10 +495,11 @@ static MainController *sharedController; NSString *album = nil; NSString *artist = nil; NSString *time = nil; - int trackNumber = 0; - int trackTotal = 0; + NSString *track = nil; int rating = -1; + ITDebugLog(@"Showing track info status window."); + if ( title ) { if ( [df boolForKey:@"showAlbum"] ) { @@ -508,15 +511,23 @@ static MainController *sharedController; } if ( [df boolForKey:@"showTime"] ) { - time = [currentRemote currentSongLength]; + time = [NSString stringWithFormat:@"%@: %@ / %@", + @"Time", + [currentRemote currentSongElapsed], + [currentRemote currentSongLength]]; } - if ( [df boolForKey:@"showNumber"] ) { - trackNumber = [currentRemote currentSongTrack]; - trackTotal = [currentRemote currentAlbumTrackCount]; + if ( [df boolForKey:@"showTrackNumber"] ) { + int trackNo = [currentRemote currentSongTrack]; + int trackCount = [currentRemote currentAlbumTrackCount]; + + if ( (trackNo > 0) || (trackCount > 0) ) { + track = [NSString stringWithFormat:@"%@: %i %@ %i", + @"Track", trackNo, @"of", trackCount]; + } } - if ( [df boolForKey:@"showRating"] ) { + if ( [df boolForKey:@"showTrackRating"] ) { rating = ( [currentRemote currentSongRating] * 5 ); } @@ -529,8 +540,7 @@ static MainController *sharedController; album:album artist:artist time:time - trackNumber:trackNumber - trackTotal:trackTotal + track:track rating:rating]; } @@ -652,12 +662,12 @@ static MainController *sharedController; - (void)toggleShuffle { - bool newShuffleEnabled = ![currentRemote shuffleEnabled]; + BOOL newShuffleEnabled = ( ! [currentRemote shuffleEnabled] ); ITDebugLog(@"Toggling shuffle mode."); [currentRemote setShuffleEnabled:newShuffleEnabled]; //Show shuffle status window ITDebugLog(@"Setting shuffle mode to %i", newShuffleEnabled); - [statusWindowController showRepeatWindowWithMode:newShuffleEnabled]; + [statusWindowController showShuffleWindow:newShuffleEnabled]; } /*************************************************************************/ diff --git a/MenuController.m b/MenuController.m index 86a65ec..632d45d 100755 --- a/MenuController.m +++ b/MenuController.m @@ -224,7 +224,7 @@ if ([defaults boolForKey:@"showAlbum"]) { NSString *curAlbum = [currentRemote currentSongAlbum]; ITDebugLog(@"Add Track Album (\"%@\") menu item.", curAlbum); - if ([curAlbum length]) { + if ( curAlbum ) { [menu indentItem: [menu addItemWithTitle:curAlbum action:nil keyEquivalent:@""]]; } @@ -233,7 +233,7 @@ if ([defaults boolForKey:@"showArtist"]) { NSString *curArtist = [currentRemote currentSongArtist]; ITDebugLog(@"Add Track Artist (\"%@\") menu item.", curArtist); - if ([curArtist length]) { + if ( curArtist ) { [menu indentItem: [menu addItemWithTitle:curArtist action:nil keyEquivalent:@""]]; } @@ -242,7 +242,7 @@ if ([defaults boolForKey:@"showTrackNumber"]) { int track = [currentRemote currentSongTrack]; ITDebugLog(@"Add Track Number (\"Track %i\") menu item.", track); - if (track) { + if ( track ) { [menu indentItem: [menu addItemWithTitle:[NSString stringWithFormat:@"%@ %i", NSLocalizedString(@"track", @"Track"), track] action:nil keyEquivalent:@""]]; } diff --git a/OldMainController.m b/OldMainController.m index 87d184e..0ade694 100755 --- a/OldMainController.m +++ b/OldMainController.m @@ -390,7 +390,7 @@ if ([defaults boolForKey:@"showAlbum"]) { NSString *album = [currentRemote currentSongAlbum]; - if ([album length] > 0) { + if ( album ) { [menu insertItemWithTitle:[NSString stringWithFormat:@" %@", album] action:nil keyEquivalent:@"" atIndex:trackInfoIndex + 1]; } } @@ -765,7 +765,7 @@ if ([defaults boolForKey:@"showAlbum"]) { NSString *trackAlbum = [currentRemote currentSongAlbum]; - if ([trackAlbum length]) { + if ( trackAlbum ) { stringToShow = [stringToShow stringByAppendingString:trackAlbum]; stringToShow = [stringToShow stringByAppendingString:@"\n"]; } diff --git a/PreferencesController.m b/PreferencesController.m index b827375..590e6de 100755 --- a/PreferencesController.m +++ b/PreferencesController.m @@ -1,6 +1,7 @@ #import "PreferencesController.h" #import "MainController.h" #import "StatusWindow.h" +#import "StatusWindowController.h" #import "CustomMenuTableView.h" #import @@ -105,9 +106,10 @@ static PreferencesController *prefs = nil; //Change the launch player checkbox to the proper name [launchPlayerAtLaunchCheckbox setTitle:[NSString stringWithFormat:@"Launch %@ when MenuTunes launches", [[controller currentRemote] playerSimpleName]]]; //This isn't localized... } - [window setLevel:NSStatusWindowLevel]; + [window center]; - [window makeKeyAndOrderFront:self]; + [NSApp activateIgnoringOtherApps:YES]; + [window performSelector:@selector(makeKeyAndOrderFront:) withObject:self afterDelay:0.0]; } - (IBAction)changeGeneralSetting:(id)sender @@ -308,12 +310,26 @@ static PreferencesController *prefs = nil; [loginWindow release]; if (!found) { - if (NSRunInformationalAlertPanel(NSLocalizedString(@"autolaunch", @"Auto-launch MenuTunes"), NSLocalizedString(@"autolaunch_msg", @"Would you like MenuTunes to automatically launch at login?"), @"Yes", @"No", nil) == NSOKButton) { - [self setLaunchesAtLogin:YES]; - } + [[StatusWindowController sharedController] showSetupQueryWindow]; } } +- (void)autoLaunchOK +{ + [[StatusWindow sharedWindow] setLocked:NO]; + [[StatusWindow sharedWindow] vanish:self]; + [[StatusWindow sharedWindow] setIgnoresMouseEvents:YES]; + + [self setLaunchesAtLogin:YES]; +} + +- (void)autoLaunchCancel +{ + [[StatusWindow sharedWindow] setLocked:NO]; + [[StatusWindow sharedWindow] vanish:self]; + [[StatusWindow sharedWindow] setIgnoresMouseEvents:YES]; +} + - (IBAction)cancelHotKey:(id)sender { ITDebugLog(@"Hot key canceled."); diff --git a/Rating.tiff b/Rating.tiff new file mode 100755 index 0000000000000000000000000000000000000000..1f875c3282e19e81e7b7a3a4b96a9b0bbb85e0cf GIT binary patch literal 62964 zcmeI53vgW3dB^WcShf`#8>qp=#90fBjES@>`Jo50Em@K+fn_VU9E=mNSJFxrUhQso zSH^}3kBsveG8x=7NlTIzk_^eTGlkHS(xhpjVM5Y|mXtO#giMl2N=m{ckcK3E46XbB z-QBagTCG;Q(yktGkLTNa@44rm$M^qU=bU@xo*rwnWm(ItHP-)G7wF6*;-}m`gmvz5 zoR`_>D(9*6l&A7l*i(@@FVp!&rk=(xde)@!dE(O4IdxuU%KXi0&s(h}$tFD)d)B4T z-|D%-QU4}K{dJaFv3^IjRC(&t=i5C8$IF*}l_6YwjmljAfo{$>wpi9Bi4TsLc7OBa zhc>3qf3EuALGoYa>vvmL^=d11Y#WU92fe)~B8f=+L?r5MsP$X*e*czce^YaPy|=ER zd26Fitd?D;qk(~w!GyOzI6M;GQT^&)KT+)+8Qf8Qs4cT^wg>GdWekM@EjM9}CB8?LO5GL`HohM|^d)exDku^x92zXgINvXksK1_6GVRV~HKrV`C$O z&0CxL>lzz_jWxkwe?v`O-C#papnls>%~1WeK;vMbuCYJhudei(aR;J3J=t3ngX|_p zM`_jTZBa%~Pjg3PU~DuPPIPzdOmb{6GN5Lo2FT{%;J~&(pnj`55Ez=G11-Kum1$T$ zSm+p+#+u9%Tg6~s8Z^37`s6lJ5RYAUx$G*40|ga!rORbkK^!Qkuq$0Iy9(k!L4{rE za@kc72MQ|eN|(#7f;do6VOP3bb``{df(p-6y0pGyR)vCLEd|}CH6N>ScX!VP8|^ix z)%LIBhkNBOlkv7c)3c)??{G2ZdZ2bNF<7Pbjbt+u`lZ~#k%7d{%H=I5gJ*VX zA*eQ4Su{2hPSo}WhJ$+|vC)7|d%7aAk=r9$PYN9j##?-p*JG*2vp=60VPUOyAQlWH zA~EyK@|Ji))emPjr>xOHSWT*Aszl}ToE48Gf}?G*Sm4Zf)d4QmF+FIyHbouN4~|OI z_0Z0SdaV<2LcKYAG!Pom+EuzcDqP4|bJsl@8SDrog3ihZb-j~S%^H7QP5qWWe`E7j zfAiLcqb)xB*0lYNCsf0pP+-_utDp}Gg`NHupEN6Z|@fkL&oqXlzKn&IdSWq;L zr6I~HeTzqWvJ4G5G0dx*$VXRzmd{9l4h;lCvJr1I;mH_Q+UQ7XT$_`&FEbOFcgYWq zNNnDK9xKbx(xT(~t0MR-!{7}4e53fRDTbGpA=muC3KQPsZGPfo{e8)(HyThBerzN> z6gifRWb$)d6T;HA!CS}TiQpia2ZICSfn{0>a|aU{fp>w?Xs)Pia_GIh#RP>g&V-7b zPdl}ka+o~rs8v_COZ3+&G#z)2(_}Yn*_y5NwubE!vd3c*wVJ)tCL+xY@(bi^?%F4Z z`QqkyoZn=}`Tpj*`ey%@32}bTK4%N`$0O8?NZ%p%4#9Wi76PfX;7uXAnd6*7c5CVy zCx~52q^HPkXvi+RO%tV$81DUg`^Fe-hc(M8_{J>c zX>DtxqqV(}c;b-#evNajBc}$>-s0vOBGQ^#st5;aLcxR;u*eN7<3NJoI_8ZH&F9r#YMhD*v4t}a(I-LAI*Tb{L zQ4|lKivQYryS1porr&trmntkg@yLu^u-e)gVIJ%Wy?#R`~{o;YRNLlmh>2NJ?I>wX*e^+9A87p z9HJRvi_hK--C1ex>X!e^-pV~~e~Hj#b#YbpgR<81ubh9SyrS%2`S6lW<*(b{ESS5` zmu<4YxfoPYeQ8l{e|K@$d7bO4h4FM^nRU76oPF&b&&@oucaMKz=dQL}rxtplqrK~V zwSDix@#l8kZ6$mDik-J|MPDosjzTiJ;^%WW?%DtN%DGS`ueEduglZd>+LbTW?wJ2fAy29rP96@ zUnrw5G)R?cKG`EI|Bap7W%-7NbSI?W3OmP>%K6OwpG@b}>yF1ds$WxPo1IfLo@4js zzjSSB#2Qz&RQ^+LXS;L${A}*ooS|w7QHpPT`7(aB%)WZ3e#Mir)+7lf%i~ps$7@;E ziU;iGPaW zBs{EZJM9Y&C7jp06Oqx>HC?d|4xcdhxvq$ZMh1fMcZK%Fb>*4R&Jz2cvM&}bwJ*9m z9Ca@pjzz|z6S6Awo`XIF3Wmo<^~{RSL)5MvUgha}Wne53*&7T8V=~bwzttz3n<`wH zEKCk}x<`k-I+S|+U+0lNHRWLb#GIb^aBxCSMIe;u3k*-lyKo>F3iSm~C%WTZ zeLeg7^-U5LE;HE^3NJqqiQV278W}d6T9q8UUK2@X>&c~q!J)udD52Bkr?eH9r8wIV zcJ{>LZ|NUykAxyI2Xik<*1vmi`i35{_D90-dU+xeJusGt2aRBGuQDV-nv}buKa!9@ zP0D|ZAU=^<+}5CrsEiNl>??i2ri9=&+t(ZH>%;n03Cmh#wONB!#Ojxk^;*5w37scI zar;ch$hu^j5?-spsm~O zdc@lMv~SYUV?A=$=d2S;_f0x_tjE?hTcOYX*uL|-JI`2u`r=A!?1fco;qzUmEOIiB zneDpQE(cr=xEydf;Bvs_fXe}w11<+#4!9g}IpA`@<$%ipmjf;bCUd}Z-+lL;d*X>F zo`mkY>#loLB-^Ui>dYtEe(eZ|R_l-zUin=fRhZWm10Em|quzV5_L zI`={4v(lX0)6$8X77Pc_Cw5ye6>i^j;`ZvRul~pC)vMVX1Xow*#DoQu*iE`nv|hM9 zD-5P?=2$mb<@J(z!G(Z-N7q`+dpOEmeM(|?z=iCCM=)?ZoCmtE!@7Hi5u6- ze_Holom)VlsVmds26nQSA5z(+BG=C?4E*xK4eX8|KR%Me*~M=DvCA7be4XF#Z&H_u zWnAp$7rVT1L+6CuFNIx$y6nc6iwHLdcH3R-<`uYt^bOodDZO*Cn?LAggqw@q`~j9~ zdB(W8*v%_;v%<~AZr-q)HEssG*4EZN8igBY&JC0~ar@y9fA|WxpMCZx(_v=ryV#W$G}WF{-*kUK z6c7bPw@UY(G}ugcl)u}nXI#A#6H1V#!|jmTJRmwK;(Ots@c5|w-Y=%Z&0P}{w@R0$ z!>wISUnkQ4{%3WF!11{JUi^_q9(m5iPTZKEG#ze@>ee-)t3`Z`zeCg`dbem;e(WLX z)o*j*=dOu~Q^ily;l{_tyc=|>h`;GjEn;1gx!Su#{fb#Wq?qN!T-fRUbJEevRNj3z zOiU<3nhrN~Y^`Xeh<6qEHr*=%&sI^d=oVoTo6c_PeTS!1mOXP9J2AnLnCq53_Sj=z zdghsD{t;Tcb}fHXBi9@_AKcIr-lJqKgyU+_IuZ7hebnnkH;IO#(dfgu^iJ{UCseLN zl&ep={iaFq0lqH%(T{%gW5c`k>(_5oUanX?AKb8!;6*}L;QI;@`B#ayiaJI7MTi0U zyw92TvmJYTd%>7?UF?$l#0Fg`+|s^AxV=MpMptw?DdmeBb(;jgk%i?V-UWNR$R}zQ z@wa&d-PG7APT_r8>;Q7M=+nhYV`F2dIL=@&@DUwYE8NoS8p3V6@_4Tme6ppP;6^=0 zzmbVmBJAd75%UG+d&h*`XS3-Wc@I4Bz!y}8XBVrlWBg@z+;PWyf2+ipVzJnm@{q+s z>rkGFE3(x!TimDyK@e_sE5pW|$ zzec$I%+w>?_9_oOz!zmp#lVev84Ge|ejMizzWy z>=*uQ!@c+3`+ynK!w*0FxbpBz`RW|?tPyR_z^zMpmy1e`o0^z}UA6L9BkNTha;q7e zIm%Z4O83xD`UWo+OQNsn6#TBf>Z+^yUVr`d|7Bb{zP@hVy4uwJe8yz#E(l=8#eMQ!c&D^B(ouWh1uSwsH2v6c&eB)w@Eg2(vf_-Cr zEssC`__vHao;`c^qsq&7Oz_|Su0}^cd ztaH-u#bzt%FE;*4QRDvo`|mcmJ^%dkKTsaA2D&tz&LQL2)hk5Tit0r0%PXRO>d2Og zt#76c`b*u+5xk=9!sre&HgiACXh^3HA=0AS@5#kQ{wyzHi4BWe7#R~Ms z#1zxvMm^{hzLL6#vH9D-@Pt@lDnD5&+|;BkYxIeAm20*Be8S*mj>4^9_j1{B-CmFh zJdic?YNM!8)FxuT1bxBID$c)FLTu2Z0ONF#?2TD;hBohI?-OaFdH%b5p;h@ zo+zKbPzJsrmy7{l2XRgw_wuPn#R^WP);Ic%AGkv6$qBUR+^`$VS@(Bh zruD9GDgSyAYjDIQ*ip*Pbpi|gDt5YB#2jpos7reGX<^o;bLPPKK=`zfQYmp;qV>o1 z?6n!(bpC7Q-7E&QijZaeODW@JRX=4y=NP}e->f730lQWa`A zl?pdo*Q8sI8_YP$&)utmcZ;w~$TIWRxwesNGMzH9yIObrA~4%5qK~U@xZ#Ean>TO1 zR_6;Pl>#?-Q6c+y(utYo0gowvzi5XDyELD=rsmVhi5+VUVC796iCfUerJA>V=EfUu zJfd^T&vz;|Zj9*y#rW4b?W5j%WsSU7)GqRgn6u&67K*<&*b#%^&xlvBjbKLJvQ?{A zU8c4E?|$SXAGuHaW8}>ze#OSET>k5FVfIU-Yr^dN%6qrQxmUDJ#J@s|Ho66qHeD%MWxRnW?%Y@Uv7|e)6v<4Z} z`0#1XBK!xo2VTra45?=GO5kB|ByK|QSjW9owlc{0UV7=JpYGbVi#h0gjH6h%8O+k( z=m@jdWG^Ec*YzTN8h(DQXd&50bth*6J9q?c$Q$#Px1T$A?vKEZ_Y(B}-6`dvr*o-$ z#lUSU%t9Iqm=RO6ufUjzA8B(=#@MB#cca#;y_qJXbNDm#4coX;{;fu~GW~9X_Dmnu zekrzpPR6BnW{Vp(g1@Q#6!J$(>DjHy$2PW#h(q8VetxceS{bo}Y?=KoDc?*8LS$$r zeB~MXO}v7=*eI%%e{0t}cDxH0!yA$!;%ynZF$_JaJ`Ez0W> zwTk>A_TG_2{KQ<0i8huTJ$m$bQj*4h^{(5G^-lO{y%LViD+EL8#3!S3j0gL%UH)xE zrqX_wi<P$(XM-E#1`FQn*&yt0Qe4ub^G*@A5zM?I?$2c$f-F^T-@d)` z(MKQs$~bD{XaB9Fc>bKqfk(dh+4ZVCb3EcJV&h%%Zyz78Ie8}k_c7^vrS9ijw~7{& zW{VqmFn_*E#2N@|#l(%+3$F{S>+jsWt*$1394es7~=bi7@ zedI3RzJURCD_?+`KGJ-ic?iJko4(|VT@-7JNTnJsQc-|%18h_D}D zWY!7Z;)}4$UJ?7UJ4Kz6|8CjN_lcj+O5OfP{t4Lv19-r5`6Mu4%%=W&owsXFexv+b z`a39t;Y+2PE6f%*o+qxyU$6#(9J0R7xaL~V)TEv06EOt(h8$fd>J$-|bctG}2gFQO zB4ZEo#Z8ac`oq|aonbAyTQNyg{_Q^vX6DFTK|b}2${@dmw4>rvrrF>|rN|%hjV(uZ zAaic=;VI1@c;=CArQ#CV6w9UBSE4G?<8Lt$9A9fRBZ68~X zUBK=Y+F!~u))gXbOs%M0bXYOTmoqUl*VJ^QisU52y^bfWBo-ipek1`v7g)PYLMn z|KDSXJV^7b4SJAv>3^x-pUm2~In0E&*aPGfexV=Oa*kY+&;6Muo<%nBljt<|c)$E- zRPpPtoS1R0`Q8!TM~2`#eIt1^hpN{;*Y9cmoAv+R$gIa)YrW$iSm!X;=BPUH>$7?9 zm3}Rh1fP&|2pxmxhIcxhaiTtCfbVBEiCBw0*wobY{uf_-@l|-q-2C+E)1OlQW)b|v zrrQFXtOaMN%~mXHH%F1{2$+9oeqK|cWv0PA*}OG5&T>$TX==u z1^Dw~;gnfVs+~8AzG*lmOXw{&*UUed8}1gpQv`koM8vV1WfMDP+tT}!nLIDXwc2s@ zO-#r$8DEG0;#~)L$J$Y=h;@}ZVYXkGrQee(21c26uurYFT-?Nj0+PXw7!#XWC8~ym zSx>1k14H@Ce^z_gYS&JR2?ZpuBVIJ~58{=}r3c^1)QwVHYu@lVwMYCzyTrO~%AW%! zc7<;%H5Ut)0;6noDn?DHP2yVScgT;M3gdu@RaWYomVe8}<6`H@4*y17Y!z)3T_hq_ zTF40=P54`Y=5GQzk9qukz+#ROd$~-0t*zMjOjV!W@q9vU5({}n#J0>W7ivn|B=)nX z8WZ{2i$e~Ju|Aj&FKFjN{T+#Wa`ma0_p}B!s5V(|V;v9witH@ZMBnfu6aE%pHhu^< z;w*cuVh#pFpDt0H@cY^NQtUkG+Sk^bVgt}?ujT+}i;a`BKH0~o)edWE$mT{7 zdlSgzLbj3Wp6z?_S;W1pFI9_bMaUk+S|NCPMeJ`^iqO$gCU8SOWWKzIoO~|kxiI^N z+IWv>uLyf$bdB~GdP1(i0e^yBXPp4uV+_PqtT*AO!4>;~EMmt>nT)=%pW3Lkr++Ob zUeqPbzNxy8i+V&2q75R(zZi5)-LwOp~jZIM@?ISC^8^PLqm;BtPW{VwhqrTZ? z{}s&MDcUK*2Vh^26XcS%-86F!p!?Y7t3<>MhlSmPGrjRqt4AD z`~Yzov6hROm@vzP-9`uSvwjh=!@FfO-><#y^!H}DaMT{cPZZ-nBD_xN*`VmCXrJgh z5qbt@Wl(Ji6@(Xi-*gN9Q1$923(gdam!n??9a zuZa54W!E-}2_;DAoSCD*Yp;m;BrzaZ>=zvp9ZnH=qE`n*=w_R!Q3PI9BI1u#B4Qpl z1`!iVm<)FC8k>nvLibp|VeKAV&?S6UlZd$(`CwHoVh#viJj=WW9b2rizPi4s64+rg z@psra;!OM#>jL27br5T);|z~z9;0ha?V2V4%g9B?_{a$t@)Q2wCD Zo}GHmpSP?B%hIc=;Rnmd&nNcf{{b{FcTWHS literal 0 HcmV?d00001 diff --git a/StatusWindow.h b/StatusWindow.h index 6e72123..8432e05 100755 --- a/StatusWindow.h +++ b/StatusWindow.h @@ -16,12 +16,16 @@ #import -#define SW_PAD 24.0 -#define SW_SPACE 24.0 -#define SW_MINW 211.0 -#define SW_BORDER 32.0 -#define SW_METER_PAD 4.0 - +#define SW_PAD 24.00 +#define SW_SPACE 24.00 +#define SW_MINW 211.00 +#define SW_BORDER 32.00 +#define SW_METER_PAD 4.00 +#define SW_BUTTON_PAD_R 30.00 +#define SW_BUTTON_PAD_B 24.00 +#define SW_BUTTON_DIV 12.00 +#define SW_BUTTON_EXTRA_W 8.00 +#define SW_SHADOW_SAT 1.25 @interface StatusWindow : ITTransientStatusWindow { NSImage *_image; @@ -33,6 +37,7 @@ - (void)buildTextWindowWithString:(NSString *)text; - (void)buildMeterWindowWithCharacter:(NSString *)character + size:(float)size count:(int)count active:(int)active; - (void)buildDialogWindowWithMessage:(NSString *)message diff --git a/StatusWindow.m b/StatusWindow.m index 5e1bcfd..0a1ba7f 100755 --- a/StatusWindow.m +++ b/StatusWindow.m @@ -8,12 +8,15 @@ #import "StatusWindow.h" + @interface StatusWindow (Private) - (NSRect)setupWindowWithDataSize:(NSSize)dataSize; @end + @implementation StatusWindow + /*************************************************************************/ #pragma mark - #pragma mark INITIALIZATION / DEALLOCATION METHODS @@ -55,6 +58,7 @@ - (void)setLocked:(BOOL)flag { _locked = flag; + [self setExitMode:(flag ? ITTransientStatusWindowExitOnCommand : ITTransientStatusWindowExitAfterDelay)]; } @@ -63,6 +67,20 @@ #pragma mark INSTANCE METHODS /*************************************************************************/ +- (void)appear:(id)sender +{ + if ( ! _locked ) { + [super appear:sender]; + } +} + +- (void)vanish:(id)sender +{ + if ( ! _locked ) { + [super vanish:sender]; + } +} + - (NSRect)setupWindowWithDataSize:(NSSize)dataSize { NSRect imageRect; @@ -105,97 +123,108 @@ - (void)buildTextWindowWithString:(NSString *)text { - float dataWidth = 0.0; - float dataHeight = 0.0; - NSRect dataRect; - NSArray *lines = [text componentsSeparatedByString:@"\n"]; - id oneLine = nil; - NSEnumerator *lineEnum = [lines objectEnumerator]; - NSFont *font = [NSFont fontWithName:@"Lucida Grande Bold" size:18]; - NSDictionary *attr = [NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName]; - ITTextField *textField; - -// Iterate over each line to get text width and height - while ( (oneLine = [lineEnum nextObject]) ) { -// Get the width of one line, adding 8.0 because Apple sucks donkey rectum. - float oneLineWidth = ( [oneLine sizeWithAttributes:attr].width + 8.0 ); -// Add the height of this line to the total text height - dataHeight += [oneLine sizeWithAttributes:attr].height; -// If this line wider than the last one, set it as the text width. - dataWidth = ( ( dataWidth > oneLineWidth ) ? dataWidth : oneLineWidth ); - } + if ( ! _locked ) { + + float dataWidth = 0.0; + float dataHeight = 0.0; + NSRect dataRect; + NSArray *lines = [text componentsSeparatedByString:@"\n"]; + id oneLine = nil; + NSEnumerator *lineEnum = [lines objectEnumerator]; + NSFont *font = [NSFont fontWithName:@"Lucida Grande Bold" size:18]; + NSDictionary *attr = [NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName]; + ITTextField *textField; -// Add 4.0 to the final dataHeight to accomodate the shadow. - dataHeight += 4.0; - - dataRect = [self setupWindowWithDataSize:NSMakeSize(dataWidth, dataHeight)]; - -// Create, position, setup, fill, and add the text view to the content view. - textField = [[[ITTextField alloc] initWithFrame:dataRect] autorelease]; - [textField setEditable:NO]; - [textField setSelectable:NO]; - [textField setBordered:NO]; - [textField setDrawsBackground:NO]; - [textField setFont:font]; - [textField setTextColor:[NSColor whiteColor]]; - [textField setCastsShadow:YES]; - [textField setStringValue:text]; - [[self contentView] addSubview:textField]; - -// Display the window. - [[self contentView] setNeedsDisplay:YES]; +// Iterate over each line to get text width and height + while ( (oneLine = [lineEnum nextObject]) ) { +// Get the width of one line, adding 8.0 because Apple sucks donkey rectum. + float oneLineWidth = ( [oneLine sizeWithAttributes:attr].width + 8.0 ); +// Add the height of this line to the total text height + dataHeight += [oneLine sizeWithAttributes:attr].height; +// If this line wider than the last one, set it as the text width. + dataWidth = ( ( dataWidth > oneLineWidth ) ? dataWidth : oneLineWidth ); + } + +// Add 4.0 to the final dataHeight to accomodate the shadow. + dataHeight += 4.0; + + dataRect = [self setupWindowWithDataSize:NSMakeSize(dataWidth, dataHeight)]; + +// Create, position, setup, fill, and add the text view to the content view. + textField = [[[ITTextField alloc] initWithFrame:dataRect] autorelease]; + [textField setEditable:NO]; + [textField setSelectable:NO]; + [textField setBordered:NO]; + [textField setDrawsBackground:NO]; + [textField setFont:font]; + [textField setTextColor:[NSColor whiteColor]]; + [textField setCastsShadow:YES]; + [textField setStringValue:text]; + [textField setShadowSaturation:SW_SHADOW_SAT]; + [[self contentView] addSubview:textField]; + +// Display the window. + [[self contentView] setNeedsDisplay:YES]; + + } } - (void)buildMeterWindowWithCharacter:(NSString *)character + size:(float)size count:(int)count active:(int)active { - NSFont *font = [NSFont fontWithName:@"Lucida Grande Bold" size:18]; - NSDictionary *attr = [NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName]; - NSSize charSize = [character sizeWithAttributes:attr]; - float cellHeight = ( charSize.height + 4.0 ); // Add 4.0 for shadow - float cellWidth = ( (charSize.width) + SW_METER_PAD ); // Add 8.0 for Apple suck - float dataWidth = ( cellWidth * count ); - NSRect dataRect = [self setupWindowWithDataSize:NSMakeSize(dataWidth, cellHeight)]; - NSEnumerator *cellEnum = nil; - id aCell = nil; - int activeCount = 0; - NSColor *onColor = [NSColor whiteColor]; - NSColor *offColor = [NSColor colorWithCalibratedWhite:0.0 alpha:0.50]; - NSMatrix *volMatrix = [[[NSMatrix alloc] initWithFrame:dataRect - mode:NSHighlightModeMatrix - cellClass:NSClassFromString(@"ITTextFieldCell") - numberOfRows:1 - numberOfColumns:count] autorelease]; - - [volMatrix setCellSize:NSMakeSize(cellWidth, cellHeight)]; - [volMatrix setIntercellSpacing:NSMakeSize(0, 0)]; - - cellEnum = [[volMatrix cells] objectEnumerator]; - - while ( (aCell = [cellEnum nextObject]) ) { - [aCell setEditable:NO]; - [aCell setSelectable:NO]; - [aCell setBordered:NO]; - [aCell setDrawsBackground:NO]; - [aCell setAlignment:NSCenterTextAlignment]; - [aCell setFont:font]; - [aCell setStringValue:character]; - - activeCount ++; - - if ( active >= activeCount ) { - [aCell setCastsShadow:YES]; - [aCell setTextColor:onColor]; - } else { - [aCell setCastsShadow:NO]; - [aCell setTextColor:offColor]; + if ( ! _locked ) { + + NSFont *font = [NSFont fontWithName:@"Lucida Grande Bold" size:size]; + NSDictionary *attr = [NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName]; + NSSize charSize = [character sizeWithAttributes:attr]; + float cellHeight = ( charSize.height + 4.0 ); // Add 4.0 for shadow + float cellWidth = ( (charSize.width) + SW_METER_PAD ); // Add 8.0 for Apple suck + float dataWidth = ( cellWidth * count ); + NSRect dataRect = [self setupWindowWithDataSize:NSMakeSize(dataWidth, cellHeight)]; + NSEnumerator *cellEnum = nil; + id aCell = nil; + int activeCount = 0; + NSColor *onColor = [NSColor whiteColor]; + NSColor *offColor = [NSColor colorWithCalibratedWhite:0.0 alpha:0.50]; + NSMatrix *volMatrix = [[[NSMatrix alloc] initWithFrame:dataRect + mode:NSHighlightModeMatrix + cellClass:NSClassFromString(@"ITTextFieldCell") + numberOfRows:1 + numberOfColumns:count] autorelease]; + + [volMatrix setCellSize:NSMakeSize(cellWidth, cellHeight)]; + [volMatrix setIntercellSpacing:NSMakeSize(0, 0)]; + + cellEnum = [[volMatrix cells] objectEnumerator]; + + while ( (aCell = [cellEnum nextObject]) ) { + [aCell setEditable:NO]; + [aCell setSelectable:NO]; + [aCell setBordered:NO]; + [aCell setDrawsBackground:NO]; + [aCell setAlignment:NSCenterTextAlignment]; + [aCell setFont:font]; + [aCell setStringValue:character]; + [aCell setShadowSaturation:SW_SHADOW_SAT]; + + activeCount ++; + + if ( active >= activeCount ) { + [aCell setCastsShadow:YES]; + [aCell setTextColor:onColor]; + } else { + [aCell setCastsShadow:NO]; + [aCell setTextColor:offColor]; + } + } + + [[self contentView] addSubview:volMatrix]; + [[self contentView] setNeedsDisplay:YES]; } - - [[self contentView] addSubview:volMatrix]; - [[self contentView] setNeedsDisplay:YES]; } - (void)buildDialogWindowWithMessage:(NSString *)message @@ -205,7 +234,135 @@ defaultAction:(SEL)okAction alternateAction:(SEL)alternateAction { + if ( ! _locked ) { + + float textWidth = 0.0; + float textHeight = 0.0; + float okWidth = 0.0; + float cancelWidth = 0.0; + float wideButtonW = 0.0; + float buttonWidth = 0.0; + float dataHeight = 0.0; + float dataWidth = 0.0; + NSRect dataRect; + float textY = 0.0; + NSRect textRect; + float textAddBelow = 32.0; + float dataMinH = 92.0; + float textMinH = 48.0; + NSArray *lines = [message componentsSeparatedByString:@"\n"]; + id oneLine = nil; + NSEnumerator *lineEnum = [lines objectEnumerator]; + ITTextField *textField; + ITButton *okButton; + ITButton *cancelButton; + NSColor *textColor = [NSColor whiteColor]; + NSFont *font = [NSFont fontWithName:@"Lucida Grande Bold" size:18]; + NSDictionary *attr = [NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName]; + NSFont *buttonFont = [NSFont fontWithName:@"Lucida Grande Bold" size:14]; + NSDictionary *buttonAttr = [NSDictionary dictionaryWithObjectsAndKeys: + buttonFont , NSFontAttributeName, + textColor , NSForegroundColorAttributeName, + nil]; + +// Iterate over each line to get text width and height + while ( (oneLine = [lineEnum nextObject]) ) { +// Get the width of one line, adding 8.0 because Apple sucks donkey rectum. + float oneLineWidth = ( [oneLine sizeWithAttributes:attr].width + 8.0 ); +// Add the height of this line to the total text height + textHeight += [oneLine sizeWithAttributes:attr].height; +// If this line wider than the last one, set it as the text width. + textWidth = ( ( textWidth > oneLineWidth ) ? textWidth : oneLineWidth ); + } + +// Add 4.0 to the final dataHeight to accomodate the shadow. + textHeight += 4.0; + +// Add extra padding below the text + dataHeight = (textHeight + textAddBelow); + +// Test to see if data height is tall enough + if ( dataHeight < dataMinH ) { + dataHeight = dataMinH; + } + +// Make the buttons, set the titles, and size them to fit their titles + okButton = [[ITButton alloc] initWithFrame:NSMakeRect(0, 0, 300, 24)]; + cancelButton = [[ITButton alloc] initWithFrame:NSMakeRect(0, 0, 300, 24)]; + [okButton setBezelStyle:ITGrayRoundedBezelStyle]; + [cancelButton setBezelStyle:ITGrayRoundedBezelStyle]; + [okButton setAlignment:NSRightTextAlignment]; + [cancelButton setAlignment:NSCenterTextAlignment]; + [okButton setImagePosition:NSNoImage]; + [cancelButton setImagePosition:NSNoImage]; + [okButton setAttributedTitle:[[[NSAttributedString alloc] initWithString:defaultTitle + attributes:buttonAttr] autorelease]]; + [cancelButton setAttributedTitle:[[[NSAttributedString alloc] initWithString:alternateTitle + attributes:buttonAttr] autorelease]]; + [okButton sizeToFit]; + [cancelButton sizeToFit]; + +// Get the button widths. Add any extra width here. + okWidth = ([okButton frame].size.width + SW_BUTTON_EXTRA_W); + cancelWidth = ([cancelButton frame].size.width + SW_BUTTON_EXTRA_W); + +// Figure out which button is wider. + wideButtonW = ( (okWidth > cancelWidth) ? okWidth : cancelWidth ); + +// Get the total width of the buttons. Add the divider space. + buttonWidth = ( (wideButtonW * 2) + SW_BUTTON_DIV ); +// Set the dataWidth to whichever is greater: text width or button width. + dataWidth = ( (textWidth > buttonWidth) ? textWidth : buttonWidth); + +// Setup the window + dataRect = [self setupWindowWithDataSize:NSMakeSize(dataWidth, dataHeight)]; + +// Set an initial vertical point for the textRect's origin. + textY = dataRect.origin.y + textAddBelow; + +// Move that point up if the minimimum height of the text area is not occupied. + if ( textHeight < textMinH ) { + textY += ( (textMinH - textHeight) / 2 ); + } + +// Build the text rect. + textRect = NSMakeRect(dataRect.origin.x, + textY, + textWidth, + textHeight); + +// Create, position, setup, fill, and add the text view to the content view. + textField = [[[ITTextField alloc] initWithFrame:textRect] autorelease]; + [textField setEditable:NO]; + [textField setSelectable:NO]; + [textField setBordered:NO]; + [textField setDrawsBackground:NO]; + [textField setFont:font]; + [textField setTextColor:textColor]; + [textField setCastsShadow:YES]; + [textField setStringValue:message]; + [textField setShadowSaturation:SW_SHADOW_SAT]; + [[self contentView] addSubview:textField]; + +// Set the button frames, and add them to the content view. + [okButton setFrame:NSMakeRect( ([[self contentView] frame].size.width - (wideButtonW + SW_BUTTON_PAD_R) ), + SW_BUTTON_PAD_B, + wideButtonW, + 24.0)]; + [cancelButton setFrame:NSMakeRect( ([[self contentView] frame].size.width - ((wideButtonW * 2) + SW_BUTTON_DIV + SW_BUTTON_PAD_R) ), + SW_BUTTON_PAD_B, + wideButtonW, + 24.0)]; + [[self contentView] addSubview:okButton]; + [[self contentView] addSubview:cancelButton]; + NSLog(@"%@", [[self contentView] description]); + + [self setIgnoresMouseEvents:NO]; + +// Display the window. + [[self contentView] setNeedsDisplay:YES]; + } } diff --git a/StatusWindowController.h b/StatusWindowController.h index 2cf440b..01f36f3 100755 --- a/StatusWindowController.h +++ b/StatusWindowController.h @@ -20,9 +20,9 @@ typedef enum { - StatusWindowRepeatNone, + StatusWindowRepeatNone = -1, StatusWindowRepeatGroup, - StatusWindowRepeatSong + StatusWindowRepeatTrack } StatusWindowRepeatMode; @@ -31,10 +31,12 @@ typedef enum { NSUserDefaults *df; } ++ (StatusWindowController *)sharedController; + - (void)showUpcomingSongsWindowWithTitles:(NSArray *)titleStrings; - (void)showVolumeWindowWithLevel:(float)level; -- (void)showRatingWindowWithRating:(int)rating; +- (void)showRatingWindowWithRating:(float)rating; - (void)showShuffleWindow:(BOOL)shuffle; - (void)showRepeatWindowWithMode:(StatusWindowRepeatMode)mode; - (void)showSetupQueryWindow; @@ -43,9 +45,8 @@ typedef enum { title: (NSString *)title album: (NSString *)album artist: (NSString *)artist - time: (NSString *)time - trackNumber: (int)trackNumber - trackTotal: (int)trackTotal + time: (NSString *)time // FLOW: Should probably be NSDate or something. + track: (NSString *)track rating: (int)rating; diff --git a/StatusWindowController.m b/StatusWindowController.m index 49cbf89..e8b1eef 100755 --- a/StatusWindowController.m +++ b/StatusWindowController.m @@ -1,13 +1,6 @@ -// -// StatusWindowController.m -// MenuTunes -// -// Created by Matthew L. Judy on Thu Apr 17 2003. -// Copyright (c) 2003 NibFile.com. All rights reserved. -// - #import "StatusWindowController.h" #import "StatusWindow.h" +#import "PreferencesController.h" #import #import @@ -16,9 +9,23 @@ #import #import + +static StatusWindowController *sharedController; + + @implementation StatusWindowController ++ (StatusWindowController *)sharedController +{ + if ( ! sharedController ) { + sharedController = [[StatusWindowController alloc] init]; + } + + return sharedController; +} + + - (id)init { if ( ( self = [super init] ) ) { @@ -90,47 +97,131 @@ album: (NSString *)album artist: (NSString *)artist time: (NSString *)time // FLOW: Should probably be NSDate or something. - trackNumber: (int)trackNumber - trackTotal: (int)trackTotal + track: (NSString *)track rating: (int)rating { - [_window setImage:[NSImage imageNamed:@"Library"]]; - [_window buildTextWindowWithString:title]; + NSImage *image = nil; + NSString *text = title; + + if ( source == ITMTRemoteLibrarySource ) { + image = [NSImage imageNamed:@"Library"]; + } else if ( source == ITMTRemoteCDSource ) { + image = [NSImage imageNamed:@"CD"]; + } else if ( source == ITMTRemoteRadioSource ) { + image = [NSImage imageNamed:@"Radio"]; + } else if ( source == ITMTRemoteiPodSource ) { + image = [NSImage imageNamed:@"iPod"]; + } else if ( source == ITMTRemoteGenericDeviceSource ) { + image = [NSImage imageNamed:@"MP3Player"]; + } else if ( source == ITMTRemoteSharedLibrarySource ) { + image = [NSImage imageNamed:@"Library"]; + } + + [_window setImage:image]; + + if ( album ) { + text = [text stringByAppendingString:[@"\n" stringByAppendingString:album]]; + } + if ( artist ) { + text = [text stringByAppendingString:[@"\n" stringByAppendingString:artist]]; + } + if ( time ) { + text = [text stringByAppendingString:[@"\n" stringByAppendingString:time]]; + } + if ( track ) { + text = [text stringByAppendingString:[@"\n" stringByAppendingString:track]]; + } + if ( rating > -1 ) { + + NSString *ratingString = [NSString string]; + NSString *emptyChar = [NSString stringWithUTF8String:"☆"]; + NSString *fullChar = [NSString stringWithUTF8String:"★"]; + int i; + + for ( i = 1; i < 6; i++ ) { + + if ( rating >= i ) { + ratingString = [ratingString stringByAppendingString:fullChar]; + } else { + ratingString = [ratingString stringByAppendingString:emptyChar]; + } + } + + text = [text stringByAppendingString:[@"\n" stringByAppendingString:ratingString]]; + } + + [_window buildTextWindowWithString:text]; [_window appear:self]; } - (void)showUpcomingSongsWindowWithTitles:(NSArray *)titleStrings { - +// NSString *bull = [NSString stringWithUTF8String:"‣ "]; + NSString *bull = [NSString stringWithUTF8String:"♪ "]; + NSString *end = [@"\n" stringByAppendingString:bull]; + [_window setImage:[NSImage imageNamed:@"Upcoming"]]; + [_window buildTextWindowWithString:[bull stringByAppendingString:[titleStrings componentsJoinedByString:end]]]; + [_window appear:self]; } - (void)showVolumeWindowWithLevel:(float)level { [_window setImage:[NSImage imageNamed:@"Volume"]]; [_window buildMeterWindowWithCharacter:[NSString stringWithUTF8String:"▊"] + size:18 count:10 active:( ceil(level * 100) / 10 )]; [_window appear:self]; } -- (void)showRatingWindowWithRating:(int)rating +- (void)showRatingWindowWithRating:(float)rating { - + [_window setImage:[NSImage imageNamed:@"Rating"]]; + [_window buildMeterWindowWithCharacter:[NSString stringWithUTF8String:"★"] + size:48 + count:5 + active:( ceil(rating * 100) / 20 )]; + [_window appear:self]; } - (void)showShuffleWindow:(BOOL)shuffle { - + [_window setImage:[NSImage imageNamed:@"Shuffle"]]; + [_window buildTextWindowWithString:( shuffle ? @"Shuffle On" : @"Shuffle Off")]; + [_window appear:self]; } - (void)showRepeatWindowWithMode:(StatusWindowRepeatMode)mode { - + NSString *string = nil; + + if ( mode == StatusWindowRepeatNone ) { + string = @"Repeat Off"; + } else if ( mode == StatusWindowRepeatGroup ) { + string = @"Repeat Playlist"; + } else if ( mode == StatusWindowRepeatTrack ) { + string = @"Repeat One Track"; + } + + [_window setImage:[NSImage imageNamed:@"Repeat"]]; + [_window buildTextWindowWithString:string]; + [_window appear:self]; } - (void)showSetupQueryWindow { + NSString *message = @"Would you like MenuTunes to launch\nautomatically at startup?"; + [_window setImage:[NSImage imageNamed:@"Setup"]]; + [_window buildDialogWindowWithMessage:message + defaultButton:@"Launch at Startup" + alternateButton:@"Launch Manually" + target:[PreferencesController sharedPrefs] + defaultAction:@selector(autoLaunchOK) + alternateAction:@selector(autoLaunchCancel)]; + + [_window appear:self]; + [_window setLocked:YES]; } diff --git a/TODO.rtf b/TODO.rtf index f73d332..86e1598 100755 --- a/TODO.rtf +++ b/TODO.rtf @@ -38,12 +38,6 @@ Status: Analyze\ Issue: iTunesRemote - Toggle loop and shuffle do not work.\ \ - Priority: IMPORTANT\ - Owner: Joseph Spiros\ - Status: Analyze\ - Issue: Menu - Needs to show "Space" as the key equivalent.\ -\pard\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li720\ql\qnatural -\cf0 \ \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural \cf0 \ \pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural @@ -78,4 +72,10 @@ No entries yet.\ Issue: Upcoming Songs - should show the last songs played.\ \pard\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li720\ql\qnatural \cf0 \ +\pard\tx720\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\ql\qnatural +\cf0 Priority: FUTURE\ + Status: Analyze\ + Issue: Menu - Needs to show "Space" as the key equivalent.\ +\pard\tx1440\tx2160\tx2880\tx3600\tx4320\tx5040\tx5760\tx6480\tx7200\tx7920\tx8640\li720\ql\qnatural +\cf0 \ } \ No newline at end of file diff --git a/iTunesRemote.m b/iTunesRemote.m index c00d5fa..cb976a6 100755 --- a/iTunesRemote.m +++ b/iTunesRemote.m @@ -222,7 +222,7 @@ ITDebugLog(@"Getting song title at index %i.", index); temp1 = [[ITAppleEventCenter sharedCenter] sendAEWithSendString:[NSString stringWithFormat:@"'----':obj { form:'prop', want:type('prop'), seld:type('pnam'), from:obj { form:'indx', want:type('cTrk'), seld:long(%lu), from:obj { form:'prop', want:type('prop'), seld:type('pPla'), from:'null'() } } }",index] eventClass:@"core" eventID:@"getd" appPSN:savedPSN]; ITDebugLog(@"Getting song title at index %i done.", index); - return temp1; + return ( ([temp1 length]) ? temp1 : nil ) ; } - (int)currentAlbumTrackCount @@ -249,7 +249,7 @@ ITDebugLog(@"Getting current unique identifier."); temp1 = [NSString stringWithFormat:@"%i-%i", [self currentPlaylistIndex], [[ITAppleEventCenter sharedCenter] sendTwoTierAEWithRequestedKeyForNumber:@"pDID" fromObjectByKey:@"pTrk" eventClass:@"core" eventID:@"getd" appPSN:savedPSN]]; ITDebugLog(@"Getting current unique identifier done."); - return temp1; + return ( ([temp1 length]) ? temp1 : nil ) ; } - (int)currentSongIndex @@ -267,7 +267,7 @@ ITDebugLog(@"Getting current song title."); temp1 = [[ITAppleEventCenter sharedCenter] sendTwoTierAEWithRequestedKey:@"pnam" fromObjectByKey:@"pTrk" eventClass:@"core" eventID:@"getd" appPSN:savedPSN]; ITDebugLog(@"Getting current song title done."); - return temp1; + return ( ([temp1 length]) ? temp1 : nil ) ; } - (NSString *)currentSongArtist @@ -276,7 +276,7 @@ ITDebugLog(@"Getting current song artist."); temp1 = [[ITAppleEventCenter sharedCenter] sendTwoTierAEWithRequestedKey:@"pArt" fromObjectByKey:@"pTrk" eventClass:@"core" eventID:@"getd" appPSN:savedPSN]; ITDebugLog(@"Getting current song artist done."); - return temp1; + return ( ([temp1 length]) ? temp1 : nil ) ; } - (NSString *)currentSongAlbum @@ -285,7 +285,7 @@ ITDebugLog(@"Getting current song album."); temp1 = [[ITAppleEventCenter sharedCenter] sendTwoTierAEWithRequestedKey:@"pAlb" fromObjectByKey:@"pTrk" eventClass:@"core" eventID:@"getd" appPSN:savedPSN]; ITDebugLog(@"Getting current song album done."); - return temp1; + return ( ([temp1 length]) ? temp1 : nil ) ; } - (NSString *)currentSongGenre @@ -294,7 +294,7 @@ ITDebugLog(@"Getting current song genre."); temp1 = [[ITAppleEventCenter sharedCenter] sendTwoTierAEWithRequestedKey:@"pGen" fromObjectByKey:@"pTrk" eventClass:@"core" eventID:@"getd" appPSN:savedPSN]; ITDebugLog(@"Getting current song genre done."); - return temp1; + return ( ([temp1 length]) ? temp1 : nil ) ; } - (NSString *)currentSongLength diff --git a/libValidate.a b/libValidate.a index d2a54bbfcee73d0252c44351edeb8f2986830448..2b0cd4bcaba9567f15a3077506c52295b0842026 100755 GIT binary patch delta 15 WcmaE0_rPv~9E+)?p~*%iJ9z*vfdujZ delta 15 WcmaE0_rPv~9E+iek=aHiJ9z*vP6X@# -- 2.20.1