Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /XspfQT/XspfQTMovieWindowController.m

Parent Directory Parent Directory | Revision Log Revision Log


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

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