Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfQT/XspfQTMovieWindowController.m

Parent Directory Parent Directory | Revision Log Revision Log


Revision 191 - (hide annotations) (download)
Fri Mar 20 03:03:58 2009 UTC (15 years, 1 month ago) by masaki
File size: 15176 byte(s)
情報パネルが表示されていると、フルスクリーンから復帰したときムービーウインドウがアクティブにならなかったのを修正。
1 masaki 2 //
2 masaki 72 // XspfQTMovieWindowController.m
3 masaki 2 // XspfQT
4     //
5     // Created by Hori,Masaki on 08/08/31.
6     // Copyright 2008 masakih. All rights reserved.
7     //
8    
9 masaki 72 #import "XspfQTMovieWindowController.h"
10     #import "XspfQTDocument.h"
11     #import "XspfQTComponent.h"
12     #import "XspfQTFullScreenWindow.h"
13 masaki 144 #import "XspfQTMovieWindow.h"
14 masaki 2
15 masaki 72 @interface XspfQTMovieWindowController (Private)
16 masaki 45 - (NSSize)windowSizeWithoutQTView;
17 masaki 17 - (void)sizeTofitWidnow;
18 masaki 2 - (NSSize)fitSizeToSize:(NSSize)toSize;
19     - (NSWindow *)fullscreenWindow;
20 masaki 151 - (void)movieDidStart;
21     - (void)movieDidPause;
22 masaki 2 @end
23    
24 masaki 72 @implementation XspfQTMovieWindowController
25 masaki 2
26 masaki 10 #pragma mark ### Static variables ###
27 masaki 132 static const float sVolumeDelta = 0.1;
28 masaki 135 static const NSTimeInterval sUpdateTimeInterval = 0.01;
29 masaki 171 static NSString *const kQTMovieKeyPath = @"playingMovie";
30 masaki 40 static NSString *const kIsPlayedKeyPath = @"trackList.isPlayed";
31 masaki 135 static NSString *const kVolumeKeyPath = @"qtMovie.volume";
32 masaki 2
33 masaki 10 - (id)init
34 masaki 2 {
35 masaki 151 self = [super initWithWindowNibName:@"XspfQTDocument"];
36 masaki 2
37     return self;
38     }
39    
40     - (void)dealloc
41     {
42     NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
43     [nc removeObserver:self];
44 masaki 49
45     [self setQtMovie:nil];
46 masaki 2
47     [fullscreenWindow release];
48 masaki 151 [self movieDidPause];
49 masaki 10 [prevMouseMovedDate release];
50 masaki 76
51 masaki 2 [super dealloc];
52     }
53     - (void)awakeFromNib
54     {
55 masaki 3 prevMouseMovedDate = [[NSDate dateWithTimeIntervalSinceNow:0.0] retain];
56    
57 masaki 100 id doc = [self document];
58 masaki 151
59 masaki 100 [doc addObserver:self
60     forKeyPath:kQTMovieKeyPath
61     options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld
62     context:NULL];
63     [doc addObserver:self
64     forKeyPath:kIsPlayedKeyPath
65     options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld
66     context:NULL];
67 masaki 2
68 masaki 100 NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
69     [nc addObserver:self
70     selector:@selector(documentWillClose:)
71     name:XspfQTDocumentWillCloseNotification
72     object:doc];
73    
74 masaki 177 [[doc trackList] setSelectionIndex:0];
75 masaki 17 [self sizeTofitWidnow];
76 masaki 2 [self play];
77     }
78 masaki 10
79 masaki 62 - (NSString *)windowTitleForDocumentDisplayName:(NSString *)displayName
80     {
81 masaki 70 id title1 = [self valueForKeyPath:@"document.trackList.title"];
82     id title2 = [self valueForKeyPath:@"document.trackList.currentTrack.title"];
83     if(title1 && title2) {
84 masaki 62 return [NSString stringWithFormat:@"%@ - %@",
85 masaki 70 title1, title2];
86 masaki 62 }
87 masaki 116 if(title2) {
88     return [NSString stringWithFormat:@"%@ - %@",
89     displayName, title2];
90     }
91 masaki 62 return displayName;
92     }
93    
94 masaki 10 #pragma mark ### KVO & KVC ###
95 masaki 2 - (void)observeValueForKeyPath:(NSString *)keyPath
96     ofObject:(id)object
97     change:(NSDictionary *)change
98     context:(void *)context
99     {
100 masaki 49 if([keyPath isEqualToString:kQTMovieKeyPath]) {
101 masaki 2 id new = [change objectForKey:NSKeyValueChangeNewKey];
102 masaki 49 [self setQtMovie:new];
103 masaki 2 return;
104     }
105 masaki 49 if([keyPath isEqualToString:kIsPlayedKeyPath]) {
106 masaki 14 id new = [change objectForKey:NSKeyValueChangeNewKey];
107     if([new boolValue]) {
108 masaki 151 [self movieDidStart];
109 masaki 14 } else {
110 masaki 151 [self movieDidPause];
111 masaki 14 }
112     return;
113     }
114 masaki 2 }
115    
116     - (void)setQtMovie:(QTMovie *)qt
117     {
118     if(qtMovie == qt) return;
119     if([qtMovie isEqual:qt]) return;
120 masaki 62 if(qt == (id)[NSNull null]) qt = nil;
121 masaki 2
122     NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
123    
124     if(qtMovie) {
125     [nc removeObserver:self name:nil object:qtMovie];
126     }
127     if(qt) {
128 masaki 151 [nc addObserver:self selector:@selector(movieDidEndNotification:) name:QTMovieDidEndNotification object:qt];
129 masaki 2 }
130 masaki 3
131     if(qtMovie) {
132     [qt setVolume:[qtMovie volume]];
133     [qt setMuted:[qtMovie muted]];
134     }
135 masaki 2 [qtMovie autorelease];
136     qtMovie = [qt retain];
137 masaki 49
138     if(!qtMovie) return;
139    
140 masaki 2 [self synchronizeWindowTitleWithDocumentName];
141 masaki 17 [self sizeTofitWidnow];
142 masaki 2 [self play];
143     }
144     - (QTMovie *)qtMovie
145     {
146     return qtMovie;
147     }
148    
149 masaki 10 #pragma mark ### Other functions ###
150 masaki 151 // Area size without QTMovieView.
151 masaki 45 - (NSSize)windowSizeWithoutQTView
152     {
153     if(windowSizeWithoutQTView.width == 0
154     && windowSizeWithoutQTView.height == 0) {
155     QTMovie *curMovie = [self qtMovie];
156     if(!curMovie) return windowSizeWithoutQTView;
157    
158     NSSize qtViewSize = [qtView frame].size;
159     NSSize currentWindowSize = [[self window] frame].size;
160    
161     windowSizeWithoutQTView = NSMakeSize(currentWindowSize.width - qtViewSize.width,
162     currentWindowSize.height - qtViewSize.height);
163     }
164    
165     return windowSizeWithoutQTView;
166     }
167 masaki 17 - (void)sizeTofitWidnow
168     {
169     id window = [self window];
170     NSRect frame = [window frame];
171     NSSize newSize = [self fitSizeToSize:frame.size];
172 masaki 19 frame.origin.y += frame.size.height - newSize.height;
173 masaki 17 frame.size = newSize;
174    
175 masaki 19 [window setFrame:frame display:YES animate:YES];
176 masaki 17 }
177 masaki 2 - (NSSize)fitSizeToSize:(NSSize)toSize
178     {
179     QTMovie *curMovie = [self qtMovie];
180     if(!curMovie) return toSize;
181    
182 masaki 45 NSSize delta = [self windowSizeWithoutQTView];
183 masaki 2
184     NSSize movieSize = [[curMovie attributeForKey:QTMovieNaturalSizeAttribute] sizeValue];
185 masaki 107 if(movieSize.width == 0) return toSize;
186 masaki 2
187     float targetViewWidth = toSize.width - delta.width;
188     float targetViewHeight = targetViewWidth * (movieSize.height / movieSize.width);
189    
190     targetViewWidth += delta.width;
191     targetViewHeight += delta.height;
192    
193 masaki 107 return NSMakeSize(targetViewWidth, targetViewHeight);
194 masaki 2 }
195    
196 masaki 134 - (NSSize)windowSizeFromMovieSize:(NSSize)movieSize
197     {
198    
199     //
200 masaki 135
201     return NSZeroSize;
202 masaki 134 }
203    
204     - (void)setMovieSize:(NSSize)movieSize
205     {
206 masaki 139 NSRect newFrame = [[self window] frame];
207     NSSize newSize;
208    
209     newSize = [self windowSizeWithoutQTView];
210     newSize.width += movieSize.width;
211     newSize.height += movieSize.height;
212    
213     newFrame.origin.y -= newSize.height - newFrame.size.height;
214     newFrame.size = newSize;
215    
216     NSWindow *w = [self window];
217     [w setFrame:newFrame display:YES animate:YES];
218 masaki 134 }
219 masaki 151 - (void)movieDidStart
220 masaki 135 {
221     [playButton setTitle:@"||"];
222    
223     @synchronized(self) {
224     if(updateTime) return;
225    
226     updateTime = [[NSTimer timerWithTimeInterval:sUpdateTimeInterval
227     target:self
228     selector:@selector(updateTimeIfNeeded:)
229     userInfo:NULL
230     repeats:YES] retain];
231    
232     NSRunLoop *currentLoop = [NSRunLoop currentRunLoop];
233     [currentLoop addTimer:updateTime forMode:NSDefaultRunLoopMode];
234     }
235     }
236    
237 masaki 151 - (void)movieDidPause
238 masaki 135 {
239     [playButton setTitle:@">"];
240    
241     @synchronized(self) {
242     [updateTime invalidate];
243     [updateTime release];
244     updateTime = nil;
245     }
246     }
247 masaki 2 - (void)play
248     {
249     [qtView performSelectorOnMainThread:@selector(play:) withObject:self waitUntilDone:NO];
250     }
251 masaki 14 - (void)pause
252     {
253     [qtView performSelectorOnMainThread:@selector(pause:) withObject:self waitUntilDone:NO];
254     }
255 masaki 56 - (void)stop
256     {
257     [qtView performSelectorOnMainThread:@selector(pause:) withObject:self waitUntilDone:YES];
258     }
259 masaki 3 - (void)enterFullScreen
260 masaki 2 {
261 masaki 17 NSWindow *w = [self fullscreenWindow];
262 masaki 3
263 masaki 156 normalModeSavedFrame = [qtView frame];
264 masaki 17
265 masaki 144 XspfQTMovieWindow *player = (XspfQTMovieWindow *)[self window];
266 masaki 143 NSRect originalWFrame = [player frame];
267 masaki 17
268 masaki 107 SetSystemUIMode(kUIModeAllHidden, kUIOptionAutoShowMenuBar);
269 masaki 17
270 masaki 143 NSRect newWFrame = [[NSScreen mainScreen] frame];
271     // NSLog(@"screen ->\t%@",NSStringFromRect(newWFrame));
272    
273 masaki 148 newWFrame.size.width += windowSizeWithoutQTView.width;
274     newWFrame.size.height += windowSizeWithoutQTView.height;
275     newWFrame.origin.y -= windowSizeWithoutQTView.height;
276 masaki 143 // NSLog(@"window ->\t%@",NSStringFromRect(newWFrame));
277    
278 masaki 156 isChangingFullScreen = YES;
279     [player setIsChangingFullScreen:YES];
280 masaki 147
281 masaki 143 [player setFrame:newWFrame display:YES animate:YES];
282 masaki 147
283 masaki 156 [player setIsChangingFullScreen:NO];
284     isChangingFullScreen = NO;
285 masaki 143 // NSLog(@"new window ->\t%@",NSStringFromRect([player frame]));
286    
287 masaki 154 // [w disableScreenUpdatesUntilFlush];
288 masaki 148 [w setContentView:qtView];
289 masaki 17 [w makeKeyAndOrderFront:self];
290 masaki 143
291     [w makeFirstResponder:qtView];
292    
293     [player orderOut:self];
294     [player setFrame:originalWFrame display:NO];
295 masaki 2 }
296 masaki 3 - (void)exitFullScreen
297 masaki 2 {
298 masaki 144 XspfQTMovieWindow *player = (XspfQTMovieWindow *)[self window];
299     NSRect originalWFrame = [player frame];
300    
301     // calculate new Window frame.
302     NSRect windowRect = originalWFrame;
303     NSSize movieSize = [[[self qtMovie] attributeForKey:QTMovieNaturalSizeAttribute] sizeValue];
304     if(movieSize.width != 0) {
305 masaki 156 CGFloat newViewHeight = normalModeSavedFrame.size.width * (movieSize.height / movieSize.width);
306 masaki 144
307     windowRect.size.height = newViewHeight + windowSizeWithoutQTView.height;
308     windowRect.origin.y -= windowRect.size.height - originalWFrame.size.height + [player titlebarHeight];
309     }
310    
311 masaki 156 isChangingFullScreen = YES;
312     [player setIsChangingFullScreen:YES];
313 masaki 144
314     // caluculate screen size window frame.
315     NSRect screenWFrame = [[NSScreen mainScreen] frame];
316     screenWFrame.size.width += windowSizeWithoutQTView.width;
317     screenWFrame.size.height += windowSizeWithoutQTView.height;
318     screenWFrame.origin.y -= windowSizeWithoutQTView.height;
319     [player setFrame:screenWFrame display:NO];
320    
321 masaki 156 isChangingFullScreen = NO;
322 masaki 144
323 masaki 151 // move QTView.
324 masaki 17 [qtView retain];
325     {
326 masaki 154 // [qtView removeFromSuperview];
327 masaki 144 NSRect fViewRec = [qtView frame];
328 masaki 154
329     // for do not flushing qtview.
330     [fullscreenWindow setContentView:[[[NSView alloc] initWithFrame:fViewRec] autorelease]];
331    
332 masaki 144 fViewRec.origin.y += windowSizeWithoutQTView.height - [player titlebarHeight];
333     [qtView setFrame:fViewRec];
334     [[player contentView] addSubview:qtView];
335 masaki 17 }
336     [qtView release];
337    
338 masaki 191 [player makeKeyAndOrderFront:self];
339 masaki 144 [player makeFirstResponder:qtView];
340 masaki 132
341 masaki 154 [fullscreenWindow orderOut:self];
342 masaki 107
343 masaki 144 [player setFrame:windowRect display:YES animate:YES];
344    
345     [NSMenu setMenuBarVisible:YES];
346 masaki 156 [player setIsChangingFullScreen:NO];
347 masaki 3 }
348 masaki 10
349     - (NSWindow *)fullscreenWindow
350     {
351     if(fullscreenWindow) return fullscreenWindow;
352    
353     NSRect mainScreenRect = [[NSScreen mainScreen] frame];
354 masaki 72 fullscreenWindow = [[XspfQTFullScreenWindow alloc] initWithContentRect:mainScreenRect
355 masaki 132 styleMask:NSBorderlessWindowMask
356     backing:NSBackingStoreBuffered
357     defer:YES];
358 masaki 10 [fullscreenWindow setReleasedWhenClosed:NO];
359     [fullscreenWindow setBackgroundColor:[NSColor blackColor]];
360     [fullscreenWindow setDelegate:self];
361 masaki 49 [fullscreenWindow setWindowController:self];
362 masaki 10
363     return fullscreenWindow;
364     }
365    
366     #pragma mark ### Actions ###
367 masaki 14 - (IBAction)togglePlayAndPause:(id)sender
368     {
369     if([[self valueForKeyPath:@"document.trackList.isPlayed"] boolValue]) {
370     [self pause];
371     } else {
372     [self play];
373     }
374     }
375    
376 masaki 3 - (IBAction)turnUpVolume:(id)sender
377     {
378 masaki 135 NSNumber *cv = [self valueForKeyPath:kVolumeKeyPath];
379 masaki 3 cv = [NSNumber numberWithFloat:[cv floatValue] + sVolumeDelta];
380 masaki 135 [self setValue:cv forKeyPath:kVolumeKeyPath];
381 masaki 3 }
382     - (IBAction)turnDownVolume:(id)sender
383     {
384 masaki 135 NSNumber *cv = [self valueForKeyPath:kVolumeKeyPath];
385 masaki 3 cv = [NSNumber numberWithFloat:[cv floatValue] - sVolumeDelta];
386 masaki 135 [self setValue:cv forKeyPath:kVolumeKeyPath];
387 masaki 3 }
388     - (IBAction)toggleFullScreenMode:(id)sender
389     {
390 masaki 10 if(fullScreenMode) {
391 masaki 3 [self exitFullScreen];
392 masaki 10 fullScreenMode = NO;
393 masaki 2 } else {
394 masaki 3 [self enterFullScreen];
395 masaki 10 fullScreenMode = YES;
396 masaki 2 }
397     }
398    
399 masaki 4 - (IBAction)forwardTagValueSecends:(id)sender
400     {
401     if(![sender respondsToSelector:@selector(tag)]) return;
402    
403     int tag = [sender tag];
404     if(tag == 0) return;
405    
406     QTTime current = [[self qtMovie] currentTime];
407     NSTimeInterval cur;
408     if(!QTGetTimeInterval(current, &cur)) return;
409    
410     QTTime new = QTMakeTimeWithTimeInterval(cur + tag);
411 masaki 9 [[self qtMovie] setCurrentTime:new];
412 masaki 4 }
413     - (IBAction)backwardTagValueSecends:(id)sender
414     {
415     if(![sender respondsToSelector:@selector(tag)]) return;
416    
417     int tag = [sender tag];
418     if(tag == 0) return;
419    
420     QTTime current = [[self qtMovie] currentTime];
421     NSTimeInterval cur;
422     if(!QTGetTimeInterval(current, &cur)) return;
423    
424     QTTime new = QTMakeTimeWithTimeInterval(cur - tag);
425 masaki 9 [[self qtMovie] setCurrentTime:new];
426 masaki 4 }
427 masaki 24 - (IBAction)nextTrack:(id)sender
428     {
429 masaki 49 [qtView pause:sender];
430 masaki 24 [[[self document] trackList] next];
431     }
432     - (IBAction)previousTrack:(id)sender
433     {
434 masaki 49 [qtView pause:sender];
435 masaki 24 [[[self document] trackList] previous];
436     }
437 masaki 4
438 masaki 134 - (IBAction)normalSize:(id)sender
439     {
440     if(fullScreenMode) return;
441    
442     QTMovie *curMovie = [self qtMovie];
443     if(!curMovie) return;
444    
445     NSSize movieSize = [[curMovie attributeForKey:QTMovieNaturalSizeAttribute] sizeValue];
446     if(movieSize.width == 0) return;
447    
448     [self setMovieSize:movieSize];
449     }
450     - (IBAction)halfSize:(id)sender
451     {
452     if(fullScreenMode) return;
453    
454     QTMovie *curMovie = [self qtMovie];
455     if(!curMovie) return;
456    
457     NSSize movieSize = [[curMovie attributeForKey:QTMovieNaturalSizeAttribute] sizeValue];
458     if(movieSize.width == 0) return;
459    
460     movieSize.width *= 0.5;
461     movieSize.height *= 0.5;
462    
463     [self setMovieSize:movieSize];
464     }
465     - (IBAction)doubleSize:(id)sender
466     {
467     if(fullScreenMode) return;
468    
469     QTMovie *curMovie = [self qtMovie];
470     if(!curMovie) return;
471    
472     NSSize movieSize = [[curMovie attributeForKey:QTMovieNaturalSizeAttribute] sizeValue];
473     if(movieSize.width == 0) return;
474    
475     movieSize.width *= 2;
476     movieSize.height *= 2;
477    
478     [self setMovieSize:movieSize];
479     }
480 masaki 135 - (IBAction)screenSize:(id)sender
481     {
482     //
483     //
484     }
485 masaki 134
486 masaki 10 #pragma mark ### Notification & Timer ###
487 masaki 151 - (void)movieDidEndNotification:(id)notification
488 masaki 2 {
489     [[[self document] trackList] next];
490     }
491     - (void)updateTimeIfNeeded:(id)timer
492     {
493     QTMovie *qt = [self qtMovie];
494     if(qt) {
495 masaki 10 // force update time indicator.
496 masaki 2 [qt willChangeValueForKey:@"currentTime"];
497     [qt didChangeValueForKey:@"currentTime"];
498     }
499 masaki 3
500     // Hide cursor and controller, if mouse didn't move for 3 seconds.
501     NSPoint mouse = [NSEvent mouseLocation];
502     if(!NSEqualPoints(prevMouse, mouse)) {
503     prevMouse = mouse;
504     [prevMouseMovedDate autorelease];
505     prevMouseMovedDate = [[NSDate dateWithTimeIntervalSinceNow:0.0] retain];
506 masaki 10 } else if(fullScreenMode && [prevMouseMovedDate timeIntervalSinceNow] < -3.0 ) {
507 masaki 3 [NSCursor setHiddenUntilMouseMoves:YES];
508     //
509     // hide controller.
510     }
511 masaki 2 }
512    
513 masaki 10 #pragma mark ### NSResponder ###
514 masaki 2 - (void)cancelOperation:(id)sender
515     {
516 masaki 10 if(fullScreenMode) {
517 masaki 2 [self toggleFullScreenMode:self];
518     }
519     }
520    
521 masaki 10 #pragma mark ### NSMenu valivation ###
522     - (BOOL)validateMenuItem:(NSMenuItem *)menuItem
523     {
524     if([menuItem action] == @selector(toggleFullScreenMode:)) {
525     if(fullScreenMode) {
526     [menuItem setTitle:NSLocalizedString(@"Exit Full Screen", @"Exit Full Screen")];
527     } else {
528     [menuItem setTitle:NSLocalizedString(@"Full Screen", @"Full Screen")];
529     }
530     return YES;
531     }
532    
533 masaki 139 if([menuItem action] == @selector(screenSize:)) {
534     return NO;
535     }
536    
537     if([menuItem action] == @selector(normalSize:)
538     || [menuItem action] == @selector(halfSize:)
539     || [menuItem action] == @selector(doubleSize:)) {
540     if(fullScreenMode) {
541     return NO;
542     } else {
543     return YES;
544     }
545     }
546    
547 masaki 10 return YES;
548     }
549    
550 masaki 100 #pragma mark ### XspfQTDocument Notification ###
551     - (void)documentWillClose:(NSNotification *)notification
552 masaki 2 {
553 masaki 100 id doc = [notification object];
554     // NSLog(@"Remove Observed! %@", doc);
555 masaki 10 if(fullScreenMode) {
556 masaki 2 [self toggleFullScreenMode:self];
557     }
558 masaki 100
559     [doc removeObserver:self forKeyPath:kQTMovieKeyPath];
560     [doc removeObserver:self forKeyPath:kIsPlayedKeyPath];
561    
562     NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
563     [nc removeObserver:self name:XspfQTDocumentWillCloseNotification object:doc];
564 masaki 2 }
565    
566 masaki 10 #pragma mark ### NSWindow Delegate ###
567 masaki 2 - (BOOL)windowShouldClose:(id)sender
568     {
569     [qtView pause:self];
570     [self setQtMovie:nil];
571    
572 masaki 66 [updateTime invalidate];
573 masaki 2 updateTime = nil;
574    
575     return YES;
576     }
577     - (NSSize)windowWillResize:(NSWindow *)sender toSize:(NSSize)frameSize
578     {
579 masaki 156 if(isChangingFullScreen) return frameSize;
580 masaki 143
581 masaki 2 return [self fitSizeToSize:frameSize];
582     }
583 masaki 16 - (void)windowDidMove:(NSNotification *)notification
584     {
585     if(fullscreenWindow && [notification object] == fullscreenWindow) {
586     NSRect r = [fullscreenWindow frame];
587 masaki 45 if(!NSEqualPoints(r.origin, NSZeroPoint)) {
588 masaki 16 [fullscreenWindow setFrameOrigin:NSZeroPoint];
589     }
590     }
591     }
592 masaki 2 @end

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26