Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfQT/XspfQTMovieWindowController.m

Parent Directory Parent Directory | Revision Log Revision Log


Revision 132 - (hide annotations) (download)
Sun Nov 16 15:31:32 2008 UTC (15 years, 5 months ago) by masaki
File size: 11648 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 2
14    
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     @end
21    
22 masaki 72 @implementation XspfQTMovieWindowController
23 masaki 2
24 masaki 10 #pragma mark ### Static variables ###
25 masaki 132 static const float sVolumeDelta = 0.1;
26 masaki 38 static NSString *const kQTMovieKeyPath = @"trackList.qtMovie";
27 masaki 40 static NSString *const kIsPlayedKeyPath = @"trackList.isPlayed";
28 masaki 2
29 masaki 10 - (id)init
30 masaki 2 {
31 masaki 73 if(self = [super initWithWindowNibName:@"XspfQTDocument"]) {
32 masaki 2 updateTime = [NSTimer scheduledTimerWithTimeInterval:0.3
33     target:self
34     selector:@selector(updateTimeIfNeeded:)
35     userInfo:NULL
36     repeats:YES];
37     }
38    
39     return self;
40     }
41    
42     - (void)dealloc
43     {
44     NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
45     [nc removeObserver:self];
46 masaki 49
47     [self setQtMovie:nil];
48 masaki 2
49     [fullscreenWindow release];
50 masaki 66 [updateTime invalidate];
51 masaki 10 [prevMouseMovedDate release];
52 masaki 76
53 masaki 2 [super dealloc];
54     }
55     - (void)awakeFromNib
56     {
57 masaki 3 prevMouseMovedDate = [[NSDate dateWithTimeIntervalSinceNow:0.0] retain];
58    
59 masaki 100 id doc = [self document];
60     // NSLog(@"Add Observed! %@", doc);
61     [doc addObserver:self
62     forKeyPath:kQTMovieKeyPath
63     options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld
64     context:NULL];
65     [doc addObserver:self
66     forKeyPath:kIsPlayedKeyPath
67     options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld
68     context:NULL];
69 masaki 2
70 masaki 100 NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
71     [nc addObserver:self
72     selector:@selector(documentWillClose:)
73     name:XspfQTDocumentWillCloseNotification
74     object:doc];
75    
76 masaki 66 [self setValue:[NSNumber numberWithInt:0]
77     forKeyPath:@"document.trackList.selectionIndex"];
78 masaki 17 [self sizeTofitWidnow];
79 masaki 2 [self play];
80     }
81 masaki 10
82 masaki 62 - (NSString *)windowTitleForDocumentDisplayName:(NSString *)displayName
83     {
84 masaki 70 id title1 = [self valueForKeyPath:@"document.trackList.title"];
85     id title2 = [self valueForKeyPath:@"document.trackList.currentTrack.title"];
86     if(title1 && title2) {
87 masaki 62 return [NSString stringWithFormat:@"%@ - %@",
88 masaki 70 title1, title2];
89 masaki 62 }
90 masaki 116 if(title2) {
91     return [NSString stringWithFormat:@"%@ - %@",
92     displayName, title2];
93     }
94 masaki 62 return displayName;
95     }
96    
97 masaki 10 #pragma mark ### KVO & KVC ###
98 masaki 2 - (void)observeValueForKeyPath:(NSString *)keyPath
99     ofObject:(id)object
100     change:(NSDictionary *)change
101     context:(void *)context
102     {
103     // NSLog(@"Observed!");
104 masaki 49 if([keyPath isEqualToString:kQTMovieKeyPath]) {
105 masaki 2 id new = [change objectForKey:NSKeyValueChangeNewKey];
106 masaki 49 [self setQtMovie:new];
107 masaki 2 return;
108     }
109 masaki 49 if([keyPath isEqualToString:kIsPlayedKeyPath]) {
110 masaki 14 id new = [change objectForKey:NSKeyValueChangeNewKey];
111 masaki 66 // NSLog(@"Observed!");
112 masaki 14 if([new boolValue]) {
113     [playButton setTitle:@"||"];
114     } else {
115     [playButton setTitle:@">"];
116     }
117     return;
118     }
119 masaki 2
120 masaki 14
121 masaki 2 [super observeValueForKeyPath:keyPath
122     ofObject:object
123     change:change
124     context:context];
125     }
126    
127     - (void)setQtMovie:(QTMovie *)qt
128     {
129     if(qtMovie == qt) return;
130     if([qtMovie isEqual:qt]) return;
131 masaki 62 if(qt == (id)[NSNull null]) qt = nil;
132 masaki 2
133     NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
134    
135     if(qtMovie) {
136     [nc removeObserver:self name:nil object:qtMovie];
137     }
138     if(qt) {
139     [nc addObserver:self selector:@selector(didEndMovie:) name:QTMovieDidEndNotification object:qt];
140     }
141 masaki 3
142     if(qtMovie) {
143     [qt setVolume:[qtMovie volume]];
144     [qt setMuted:[qtMovie muted]];
145     }
146 masaki 2 [qtMovie autorelease];
147     qtMovie = [qt retain];
148 masaki 49
149     if(!qtMovie) return;
150    
151 masaki 2 [self synchronizeWindowTitleWithDocumentName];
152 masaki 17 [self sizeTofitWidnow];
153 masaki 2 [self play];
154     }
155     - (QTMovie *)qtMovie
156     {
157     return qtMovie;
158     }
159    
160 masaki 10 #pragma mark ### Other functions ###
161 masaki 45 - (NSSize)windowSizeWithoutQTView
162     {
163     if(windowSizeWithoutQTView.width == 0
164     && windowSizeWithoutQTView.height == 0) {
165     QTMovie *curMovie = [self qtMovie];
166     if(!curMovie) return windowSizeWithoutQTView;
167    
168     NSSize qtViewSize = [qtView frame].size;
169     NSSize currentWindowSize = [[self window] frame].size;
170    
171     windowSizeWithoutQTView = NSMakeSize(currentWindowSize.width - qtViewSize.width,
172     currentWindowSize.height - qtViewSize.height);
173     }
174    
175     return windowSizeWithoutQTView;
176     }
177 masaki 17 - (void)sizeTofitWidnow
178     {
179     id window = [self window];
180     NSRect frame = [window frame];
181     NSSize newSize = [self fitSizeToSize:frame.size];
182 masaki 19 frame.origin.y += frame.size.height - newSize.height;
183 masaki 17 frame.size = newSize;
184    
185 masaki 19 [window setFrame:frame display:YES animate:YES];
186 masaki 17 }
187 masaki 2 - (NSSize)fitSizeToSize:(NSSize)toSize
188     {
189     QTMovie *curMovie = [self qtMovie];
190     if(!curMovie) return toSize;
191    
192 masaki 10 // Area size without QTMovieView.
193 masaki 45 NSSize delta = [self windowSizeWithoutQTView];
194 masaki 2
195     NSSize movieSize = [[curMovie attributeForKey:QTMovieNaturalSizeAttribute] sizeValue];
196 masaki 107 if(movieSize.width == 0) return toSize;
197 masaki 2
198     float targetViewWidth = toSize.width - delta.width;
199     float targetViewHeight = targetViewWidth * (movieSize.height / movieSize.width);
200    
201     targetViewWidth += delta.width;
202     targetViewHeight += delta.height;
203    
204 masaki 107 return NSMakeSize(targetViewWidth, targetViewHeight);
205 masaki 2 }
206    
207     - (void)play
208     {
209     [qtView performSelectorOnMainThread:@selector(play:) withObject:self waitUntilDone:NO];
210     }
211 masaki 14 - (void)pause
212     {
213     [qtView performSelectorOnMainThread:@selector(pause:) withObject:self waitUntilDone:NO];
214     }
215 masaki 56 - (void)stop
216     {
217     [qtView performSelectorOnMainThread:@selector(pause:) withObject:self waitUntilDone:YES];
218     }
219 masaki 3 - (void)enterFullScreen
220 masaki 2 {
221 masaki 17 NSWindow *w = [self fullscreenWindow];
222 masaki 3
223 masaki 17 nomalModeSavedFrame = [qtView frame];
224    
225     [[self window] orderOut:self];
226     [w setContentView:qtView];
227    
228     // [NSMenu setMenuBarVisible:NO];
229 masaki 107 SetSystemUIMode(kUIModeAllHidden, kUIOptionAutoShowMenuBar);
230 masaki 17
231     [w makeKeyAndOrderFront:self];
232     [w makeFirstResponder:qtView];
233 masaki 2 }
234 masaki 3 - (void)exitFullScreen
235 masaki 2 {
236 masaki 17 [qtView retain];
237     {
238     [qtView removeFromSuperview];
239     [qtView setFrame:nomalModeSavedFrame];
240     [[[self window] contentView] addSubview:qtView];
241     }
242     [qtView release];
243    
244 masaki 132 [self sizeTofitWidnow];
245     NSSize movieSize = [[[self qtMovie] attributeForKey:QTMovieNaturalSizeAttribute] sizeValue];
246     if(movieSize.width != 0) {
247     NSRect windowRect = [[self window] frame];
248    
249     CGFloat contentViewHeight = [[[self window] contentView] frame].size.height;
250     NSRect newViewRect = nomalModeSavedFrame;
251     newViewRect.size.height = newViewRect.size.width * (movieSize.height / movieSize.width);
252     newViewRect.origin.y = contentViewHeight - newViewRect.size.height;
253    
254     NSSize delta = [self windowSizeWithoutQTView];
255     windowRect.size.height = newViewRect.size.height + delta.height;
256     [[self window] setFrame:windowRect display:NO];
257    
258     [qtView setFrame:newViewRect];
259     }
260    
261 masaki 17 [NSMenu setMenuBarVisible:YES];
262 masaki 132 [[self fullscreenWindow] orderOut:self];
263 masaki 107
264 masaki 17 [[self window] makeKeyAndOrderFront:self];
265     [[self window] makeFirstResponder:qtView];
266 masaki 3 }
267 masaki 10
268     - (NSWindow *)fullscreenWindow
269     {
270     if(fullscreenWindow) return fullscreenWindow;
271    
272     NSRect mainScreenRect = [[NSScreen mainScreen] frame];
273 masaki 72 fullscreenWindow = [[XspfQTFullScreenWindow alloc] initWithContentRect:mainScreenRect
274 masaki 132 styleMask:NSBorderlessWindowMask
275     backing:NSBackingStoreBuffered
276     defer:YES];
277 masaki 10 [fullscreenWindow setReleasedWhenClosed:NO];
278     [fullscreenWindow setBackgroundColor:[NSColor blackColor]];
279     [fullscreenWindow setDelegate:self];
280 masaki 49 [fullscreenWindow setWindowController:self];
281 masaki 10
282     return fullscreenWindow;
283     }
284    
285     #pragma mark ### Actions ###
286 masaki 14 - (IBAction)togglePlayAndPause:(id)sender
287     {
288     if([[self valueForKeyPath:@"document.trackList.isPlayed"] boolValue]) {
289     [self pause];
290     } else {
291     [self play];
292     }
293     }
294    
295 masaki 3 - (IBAction)turnUpVolume:(id)sender
296     {
297     NSNumber *cv = [self valueForKeyPath:@"qtMovie.volume"];
298     cv = [NSNumber numberWithFloat:[cv floatValue] + sVolumeDelta];
299     [self setValue:cv forKeyPath:@"qtMovie.volume"];
300     }
301     - (IBAction)turnDownVolume:(id)sender
302     {
303     NSNumber *cv = [self valueForKeyPath:@"qtMovie.volume"];
304     cv = [NSNumber numberWithFloat:[cv floatValue] - sVolumeDelta];
305     [self setValue:cv forKeyPath:@"qtMovie.volume"];
306     }
307     - (IBAction)toggleFullScreenMode:(id)sender
308     {
309 masaki 10 if(fullScreenMode) {
310 masaki 3 [self exitFullScreen];
311 masaki 10 fullScreenMode = NO;
312 masaki 2 } else {
313 masaki 3 [self enterFullScreen];
314 masaki 10 fullScreenMode = YES;
315 masaki 2 }
316     }
317    
318 masaki 4 - (IBAction)forwardTagValueSecends:(id)sender
319     {
320     if(![sender respondsToSelector:@selector(tag)]) return;
321    
322     int tag = [sender tag];
323     if(tag == 0) return;
324    
325     QTTime current = [[self qtMovie] currentTime];
326     NSTimeInterval cur;
327     if(!QTGetTimeInterval(current, &cur)) return;
328    
329     QTTime new = QTMakeTimeWithTimeInterval(cur + tag);
330 masaki 9 [[self qtMovie] setCurrentTime:new];
331 masaki 4 }
332     - (IBAction)backwardTagValueSecends:(id)sender
333     {
334     if(![sender respondsToSelector:@selector(tag)]) return;
335    
336     int tag = [sender tag];
337     if(tag == 0) return;
338    
339     QTTime current = [[self qtMovie] currentTime];
340     NSTimeInterval cur;
341     if(!QTGetTimeInterval(current, &cur)) return;
342    
343     QTTime new = QTMakeTimeWithTimeInterval(cur - tag);
344 masaki 9 [[self qtMovie] setCurrentTime:new];
345 masaki 4 }
346 masaki 24 - (IBAction)nextTrack:(id)sender
347     {
348 masaki 49 [qtView pause:sender];
349 masaki 24 [[[self document] trackList] next];
350     }
351     - (IBAction)previousTrack:(id)sender
352     {
353 masaki 49 [qtView pause:sender];
354 masaki 24 [[[self document] trackList] previous];
355     }
356 masaki 4
357 masaki 10 #pragma mark ### Notification & Timer ###
358 masaki 2 - (void)didEndMovie:(id)notification
359     {
360     [[[self document] trackList] next];
361     }
362     - (void)updateTimeIfNeeded:(id)timer
363     {
364     QTMovie *qt = [self qtMovie];
365     if(qt) {
366 masaki 10 // force update time indicator.
367 masaki 2 [qt willChangeValueForKey:@"currentTime"];
368     [qt didChangeValueForKey:@"currentTime"];
369     }
370 masaki 3
371     // Hide cursor and controller, if mouse didn't move for 3 seconds.
372     NSPoint mouse = [NSEvent mouseLocation];
373     if(!NSEqualPoints(prevMouse, mouse)) {
374     prevMouse = mouse;
375     [prevMouseMovedDate autorelease];
376     prevMouseMovedDate = [[NSDate dateWithTimeIntervalSinceNow:0.0] retain];
377 masaki 10 } else if(fullScreenMode && [prevMouseMovedDate timeIntervalSinceNow] < -3.0 ) {
378 masaki 3 [NSCursor setHiddenUntilMouseMoves:YES];
379     //
380     // hide controller.
381     }
382 masaki 2 }
383    
384 masaki 10 #pragma mark ### NSResponder ###
385 masaki 2 - (void)cancelOperation:(id)sender
386     {
387 masaki 10 if(fullScreenMode) {
388 masaki 2 [self toggleFullScreenMode:self];
389     }
390     }
391    
392 masaki 10 #pragma mark ### NSMenu valivation ###
393     - (BOOL)validateMenuItem:(NSMenuItem *)menuItem
394     {
395     if([menuItem action] == @selector(toggleFullScreenMode:)) {
396     if(fullScreenMode) {
397     [menuItem setTitle:NSLocalizedString(@"Exit Full Screen", @"Exit Full Screen")];
398     } else {
399     [menuItem setTitle:NSLocalizedString(@"Full Screen", @"Full Screen")];
400     }
401     return YES;
402     }
403    
404     return YES;
405     }
406    
407 masaki 100 #pragma mark ### XspfQTDocument Notification ###
408     - (void)documentWillClose:(NSNotification *)notification
409 masaki 2 {
410 masaki 100 id doc = [notification object];
411     // NSLog(@"Remove Observed! %@", doc);
412 masaki 10 if(fullScreenMode) {
413 masaki 2 [self toggleFullScreenMode:self];
414     }
415 masaki 100
416     [doc removeObserver:self forKeyPath:kQTMovieKeyPath];
417     [doc removeObserver:self forKeyPath:kIsPlayedKeyPath];
418    
419     NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
420     [nc removeObserver:self name:XspfQTDocumentWillCloseNotification object:doc];
421 masaki 2 }
422    
423 masaki 10 #pragma mark ### NSWindow Delegate ###
424 masaki 2 - (BOOL)windowShouldClose:(id)sender
425     {
426     [qtView pause:self];
427     [self setQtMovie:nil];
428    
429 masaki 66 [updateTime invalidate];
430 masaki 2 updateTime = nil;
431    
432     return YES;
433     }
434     - (NSSize)windowWillResize:(NSWindow *)sender toSize:(NSSize)frameSize
435     {
436     return [self fitSizeToSize:frameSize];
437     }
438 masaki 16 - (void)windowDidMove:(NSNotification *)notification
439     {
440     if(fullscreenWindow && [notification object] == fullscreenWindow) {
441     NSRect r = [fullscreenWindow frame];
442 masaki 45 if(!NSEqualPoints(r.origin, NSZeroPoint)) {
443 masaki 16 [fullscreenWindow setFrameOrigin:NSZeroPoint];
444     }
445     }
446     }
447 masaki 2 @end

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