Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfQT/XspfQTMovieWindowController.m

Parent Directory Parent Directory | Revision Log Revision Log


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

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