Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfQT/XspfQTMovieWindowController.m

Parent Directory Parent Directory | Revision Log Revision Log


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

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