Commit 87fe9845 authored by Pierre d'Herbemont's avatar Pierre d'Herbemont

MacOSX/VLC_app: port the fullscreen zoom and the fspanel from gui/macosx to VLC_app.

parent ff7830bb
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -6,6 +6,8 @@
* $Id$
*
* Authors: Pierre d'Herbemont <pdherbemont # videolan.org>
* Felix Kühne <fkuehne at videolan dot org>
* Jérôme Decoodt <djc at videolan dot org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
......@@ -24,20 +26,33 @@
#import <Cocoa/Cocoa.h>
/*****************************************************************************
* NSIndexPath (VLCAppAddition)
*****************************************************************************/
@interface NSIndexPath (VLCAppAddition)
- (NSIndexPath *)indexPathByRemovingFirstIndex;
- (NSUInteger)lastIndex;
@end
/*****************************************************************************
* NSArray (VLCAppAddition)
*****************************************************************************/
@interface NSArray (VLCAppAddition)
- (id)objectAtIndexPath:(NSIndexPath *)path withNodeKeyPath:(NSString *)nodeKeyPath;
@end
/*****************************************************************************
* NSView (VLCAppAdditions)
*****************************************************************************/
@interface NSView (VLCAppAdditions)
- (void)moveSubviewsToVisible;
@end
/* Split view that supports slider animation */
/*****************************************************************************
* VLCOneSplitView
*
* Missing functionality to a one-split view
*****************************************************************************/
@interface VLCOneSplitView : NSSplitView
{
BOOL fixedCursorDuringResize;
......@@ -46,3 +61,64 @@
- (float)sliderPosition;
- (void)setSliderPosition:(float)newPosition;
@end
/*****************************************************************************
* NSScreen (VLCAdditions)
*
* Missing extension to NSScreen
*****************************************************************************/
@interface NSScreen (VLCAdditions)
+ (NSScreen *)screenWithDisplayID: (CGDirectDisplayID)displayID;
- (BOOL)isMainScreen;
- (BOOL)isScreen: (NSScreen*)screen;
- (CGDirectDisplayID)displayID;
- (void)blackoutOtherScreens;
+ (void)unblackoutScreens;
@end
/*****************************************************************************
* VLCWindow
*
* Missing extension to NSWindow (Used only when needing setCanBecomeKeyWindow)
*****************************************************************************/
@interface VLCWindow : NSWindow
{
BOOL canBecomeKeyWindow;
BOOL isset_canBecomeKeyWindow;
}
- (void)setCanBecomeKeyWindow: (BOOL)canBecomeKey;
@end
/*****************************************************************************
* VLCImageCustomizedSlider
*
* Slider personalized by backgroundImage and knobImage
*****************************************************************************/
@interface VLCImageCustomizedSlider : NSSlider
{
NSImage * knobImage;
NSImage * backgroundImage;
}
@property (retain) NSImage * knobImage;
@property (retain) NSImage * backgroundImage;
- (void)drawKnobInRect: (NSRect)knobRect;
- (void)drawBackgroundInRect: (NSRect)knobRect;
- (void)drawRect: (NSRect)rect;
@end
/*****************************************************************************
* NSImageView (VLCAppAdditions)
*
* Make the image view move the window by mouse down by default
*****************************************************************************/
@interface NSImageView (VLCAppAdditions)
- (void)mouseDownCanMoveWindow;
@end
......@@ -6,6 +6,8 @@
* $Id$
*
* Authors: Pierre d'Herbemont <pdherbemont # videolan.org>
* Felix Kühne <fkuehne at videolan dot org>
* Jérôme Decoodt <djc at videolan dot org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
......@@ -123,3 +125,205 @@
}
@end
/*****************************************************************************
* NSScreen (VLCAdditions)
*
* Missing extension to NSScreen
*****************************************************************************/
@implementation NSScreen (VLCAdditions)
static NSMutableArray *blackoutWindows = NULL;
+ (void)load
{
/* init our fake object attribute */
blackoutWindows = [[NSMutableArray alloc] initWithCapacity:1];
}
+ (NSScreen *)screenWithDisplayID: (CGDirectDisplayID)displayID
{
int i;
for( i = 0; i < [[NSScreen screens] count]; i++ )
{
NSScreen *screen = [[NSScreen screens] objectAtIndex: i];
if([screen displayID] == displayID)
return screen;
}
return nil;
}
- (BOOL)isMainScreen
{
return ([self displayID] == [[[NSScreen screens] objectAtIndex:0] displayID]);
}
- (BOOL)isScreen: (NSScreen*)screen
{
return ([self displayID] == [screen displayID]);
}
- (CGDirectDisplayID)displayID
{
return (CGDirectDisplayID)_screenNumber;
}
- (void)blackoutOtherScreens
{
unsigned int i;
/* Free our previous blackout window (follow blackoutWindow alloc strategy) */
[blackoutWindows makeObjectsPerformSelector:@selector(close)];
[blackoutWindows removeAllObjects];
for(i = 0; i < [[NSScreen screens] count]; i++)
{
NSScreen *screen = [[NSScreen screens] objectAtIndex: i];
VLCWindow *blackoutWindow;
NSRect screen_rect;
if([self isScreen: screen])
continue;
screen_rect = [screen frame];
screen_rect.origin.x = screen_rect.origin.y = 0.0f;
/* blackoutWindow alloc strategy
- The NSMutableArray blackoutWindows has the blackoutWindow references
- blackoutOtherDisplays is responsible for alloc/releasing its Windows
*/
blackoutWindow = [[VLCWindow alloc] initWithContentRect: screen_rect styleMask: NSBorderlessWindowMask
backing: NSBackingStoreBuffered defer: NO screen: screen];
[blackoutWindow setBackgroundColor:[NSColor blackColor]];
[blackoutWindow setLevel: NSFloatingWindowLevel]; /* Disappear when Expose is triggered */
[blackoutWindow orderFront: self];
[blackoutWindows addObject: blackoutWindow];
[blackoutWindow release];
}
}
+ (void)unblackoutScreens
{
unsigned int i;
for(i = 0; i < [blackoutWindows count]; i++)
{
VLCWindow *blackoutWindow = [blackoutWindows objectAtIndex: i];
[blackoutWindow close];
}
}
@end
/*****************************************************************************
* VLCWindow
*
* Missing extension to NSWindow
*****************************************************************************/
@implementation VLCWindow
- (id)initWithContentRect:(NSRect)contentRect styleMask:(unsigned int)styleMask
backing:(NSBackingStoreType)backingType defer:(BOOL)flag
{
self = [super initWithContentRect:contentRect styleMask:styleMask backing:backingType defer:flag];
if( self )
isset_canBecomeKeyWindow = NO;
return self;
}
- (void)setCanBecomeKeyWindow: (BOOL)canBecomeKey
{
isset_canBecomeKeyWindow = YES;
canBecomeKeyWindow = canBecomeKey;
}
- (BOOL)canBecomeKeyWindow
{
if(isset_canBecomeKeyWindow)
return canBecomeKeyWindow;
return [super canBecomeKeyWindow];
}
@end
/*****************************************************************************
* VLCImageCustomizedSlider
*
* Slider personalized by backgroundImage and knobImage
*****************************************************************************/
@implementation VLCImageCustomizedSlider
@synthesize backgroundImage;
@synthesize knobImage;
- (id)initWithFrame:(NSRect)frame
{
if(self = [super initWithFrame:frame])
{
knobImage = nil;
backgroundImage = nil;
}
return self;
}
- (void)dealloc
{
[knobImage release];
[knobImage release];
[super dealloc];
}
- (void)drawKnobInRect:(NSRect) knobRect
{
NSRect imageRect;
imageRect.size = [self.knobImage size];
imageRect.origin.x = 0;
imageRect.origin.y = 0;
knobRect.origin.x += (knobRect.size.width - imageRect.size.width) / 2;
knobRect.origin.y += (knobRect.size.width - imageRect.size.width) / 2;
knobRect.size.width = imageRect.size.width;
knobRect.size.height = imageRect.size.height;
[self.knobImage drawInRect:knobRect fromRect:imageRect operation:NSCompositeSourceOver fraction:1];
}
- (void)drawBackgroundInRect:(NSRect) drawRect
{
NSRect imageRect = drawRect;
imageRect.origin.y += ([self.backgroundImage size].height - [self bounds].size.height ) / 2;
[self.backgroundImage drawInRect:drawRect fromRect:imageRect operation:NSCompositeSourceOver fraction:1];
}
- (void)drawRect:(NSRect)rect
{
/* Draw default to make sure the slider behaves correctly */
[[NSGraphicsContext currentContext] saveGraphicsState];
NSRectClip(NSZeroRect);
[super drawRect:rect];
[[NSGraphicsContext currentContext] restoreGraphicsState];
if( self.backgroundImage )
[self drawBackgroundInRect: rect];
if( self.knobImage )
{
NSRect knobRect = [[self cell] knobRectFlipped:NO];
[[[NSColor blackColor] colorWithAlphaComponent:0.6] set];
[self drawKnobInRect: knobRect];
}
}
@end
/*****************************************************************************
* NSImageView (VLCAppAdditions)
*
* Make the image view move the window by mouse down by default
*****************************************************************************/
@implementation NSImageView (VLCAppAdditions)
- (void)mouseDownCanMoveWindow
{
return YES;
}
@end
......@@ -201,6 +201,14 @@
{
return [NSSet setWithObjects:@"state", @"playing", @"canPause", nil];
}
+ (NSSet *)keyPathsForValuesAffectingStateAsFullScreenButtonImage
{
return [NSSet setWithObjects:@"state", @"playing", @"canPause", nil];
}
+ (NSSet *)keyPathsForValuesAffectingStateAsFullScreenButtonAlternateImage
{
return [NSSet setWithObjects:@"state", @"playing", @"canPause", nil];
}
- (NSString *)description
{
......@@ -229,4 +237,25 @@
else
return [NSImage imageNamed:@"play_blue.png"];
}
- (NSImage *)stateAsFullScreenButtonImage
{
if([self state] == VLCMediaPlayerStatePlaying && [self canPause])
return [NSImage imageNamed:@"fs_pause.png"];
else if( [self state] == VLCMediaPlayerStatePlaying )
return [NSImage imageNamed:@"fs_stop.png"];
else
return [NSImage imageNamed:@"fs_play.png"];
}
- (NSImage *)stateAsFullScreenButtonAlternateImage
{
if([self state] == VLCMediaPlayerStatePlaying && [self canPause])
return [NSImage imageNamed:@"fs_pause_highlight.png"];
else if( [self state] == VLCMediaPlayerStatePlaying )
return [NSImage imageNamed:@"fs_stop_highlight.png"];
else
return [NSImage imageNamed:@"fs_play_highlight.png"];
}
@end
......@@ -25,6 +25,7 @@
#import <QuartzCore/QuartzCore.h>
#import <VLCKit/VLCKit.h>
#import "VLCAppAdditions.h"
@interface VLCBrowsableVideoView : VLCVideoView {
BOOL menuDisplayed;
......@@ -43,6 +44,12 @@
/* Actions on non-node items*/
id target;
SEL action;
/* FullScreenTransition */
VLCWindow * fullScreenWindow;
NSViewAnimation * fullScreenAnim1;
NSViewAnimation * fullScreenAnim2;
NSView * tempFullScreenView;
}
/* Binds an nsarray to that property. But don't forget the set the access keys. */
......
/*****************************************************************************
* VLCBrowsableVideoView.h: VideoView subclasses that allow fullscreen
* VLCBrowsableVideoView.h: VideoView subclasses that allow fullScreen
* browsing
*****************************************************************************
* Copyright (C) 2007 Pierre d'Herbemont
......@@ -23,6 +23,9 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
/* DisableScreenUpdates, SetSystemUIMode, ... */
#import <QuickTime/QuickTime.h>
#import "VLCBrowsableVideoView.h"
#import "VLCAppAdditions.h"
......@@ -47,6 +50,16 @@
@end
@interface VLCBrowsableVideoView (FullScreenTransition)
- (void)hasEndedFullScreen;
- (void)hasBecomeFullScreen;
- (void)enterFullScreen:(NSScreen *)screen;
- (void)leaveFullScreen;
- (void)leaveFullScreenAndFadeOut: (BOOL)fadeout;
@end
/******************************************************************************
* VLCBrowsableVideoView
*/
......@@ -72,7 +85,7 @@
- (BOOL)fullScreen
{
return [super isInFullScreenMode];
return [self isInFullScreenMode];
}
- (void)setFullScreen:(BOOL)newFullScreen
......@@ -82,11 +95,13 @@
if( newFullScreen )
{
[super enterFullScreenMode:[[self window] screen] withOptions:nil];
[self enterFullScreenMode:[[self window] screen] withOptions:
[NSDictionary dictionaryWithObject: [NSNumber numberWithInt:1]
forKey: NSFullScreenModeWindowLevel]];
}
else
{
[super exitFullScreenModeWithOptions:nil];
[self exitFullScreenModeWithOptions:nil];
}
}
......@@ -101,11 +116,20 @@
selectionLayer = backLayer = nil;
menuLayer = nil;
selectedPath = [[NSIndexPath alloc] init];
tempFullScreenView = [[NSView alloc] init];
fullScreen = NO;
/* Observe our bindings */
//[self displayMenu];
//[self changeSelectedIndex:0];
}
- (void)dealloc
{
[tempFullScreenView release];
[selectedPath release];
[super dealloc];
}
/* Hiding/Displaying the menu */
- (void)hideMenu
......@@ -206,6 +230,23 @@
[super keyDown: theEvent];
}
- (void)enterFullScreenMode:(NSScreen *)screen withOptions:(NSDictionary *)options
{
[self enterFullScreen: screen];
}
- (void)exitFullScreenModeWithOptions:(NSDictionary *)options
{
[self leaveFullScreen];
}
- (BOOL)isInFullScreenMode
{
return fullScreen;
}
@end
/******************************************************************************
......@@ -430,4 +471,288 @@
menuLayer = layer;
selectionLayer = nil;
}
@end
@implementation VLCBrowsableVideoView (FullScreenTransition)
- (void)enterFullScreen:(NSScreen *)screen
{
NSMutableDictionary *dict1,*dict2;
NSRect screenRect;
NSRect aRect;
screenRect = [screen frame];
[NSCursor setHiddenUntilMouseMoves: YES];
/* Only create the o_fullScreen_window if we are not in the middle of the zooming animation */
if (!fullScreenWindow)
{
/* We can't change the styleMask of an already created NSWindow, so we create an other window, and do eye catching stuff */
aRect = [[self superview] convertRect: [self frame] toView: nil]; /* Convert to Window base coord */
aRect.origin.x += [[self window] frame].origin.x;
aRect.origin.y += [[self window] frame].origin.y;
fullScreenWindow = [[VLCWindow alloc] initWithContentRect:aRect styleMask: NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:YES];
[fullScreenWindow setBackgroundColor: [NSColor blackColor]];
[fullScreenWindow setCanBecomeKeyWindow: YES];
if (![[self window] isVisible] || [[self window] alphaValue] == 0.0 || [self isHiddenOrHasHiddenAncestor] )
{
/* We don't animate if we are not visible or if we are running on
* Mac OS X <10.4 which doesn't support NSAnimation, instead we
* simply fade the display */
CGDisplayFadeReservationToken token;
[fullScreenWindow setFrame:screenRect display:NO];
CGAcquireDisplayFadeReservation(kCGMaxDisplayReservationInterval, &token);
CGDisplayFade( token, 0.3, kCGDisplayBlendNormal, kCGDisplayBlendSolidColor, 0, 0, 0, YES );
if ([screen isMainScreen])
SetSystemUIMode( kUIModeAllHidden, kUIOptionAutoShowMenuBar);
[self retain];
[[self superview] replaceSubview:self with:tempFullScreenView];
[tempFullScreenView setFrame:[self frame]];
[fullScreenWindow setContentView:self];
[fullScreenWindow makeKeyAndOrderFront:self];
[self release];
[[tempFullScreenView window] orderOut: self];
CGDisplayFade( token, 0.5, kCGDisplayBlendSolidColor, kCGDisplayBlendNormal, 0, 0, 0, NO );
CGReleaseDisplayFadeReservation( token);
[self hasBecomeFullScreen];
return;
}
/* Make sure we don't see the o_view disappearing of the screen during this operation */
DisableScreenUpdates();
[self retain]; /* Removing from a view, make sure we won't be released */
/* Make sure our layer won't disappear */
CALayer * layer = [[self layer] retain];
id alayoutManager = layer.layoutManager;
[[self superview] replaceSubview:self with:tempFullScreenView];
[tempFullScreenView setFrame:[self frame]];
[fullScreenWindow setContentView:self];
[self setWantsLayer:YES];
[self setLayer:layer];
layer.layoutManager = alayoutManager;
[fullScreenWindow makeKeyAndOrderFront:self];
EnableScreenUpdates();
}
/* We are in fullScreen (and no animation is running) */
if (fullScreen)
{
/* Make sure we are hidden */
[[tempFullScreenView window] orderOut: self];
return;
}
if (fullScreenAnim1)
{
[fullScreenAnim1 stopAnimation];
[fullScreenAnim1 release];
}
if (fullScreenAnim2)
{
[fullScreenAnim2 stopAnimation];
[fullScreenAnim2 release];
}
if ([screen isMainScreen])
SetSystemUIMode( kUIModeAllHidden, kUIOptionAutoShowMenuBar);
dict1 = [[NSMutableDictionary alloc] initWithCapacity:2];
dict2 = [[NSMutableDictionary alloc] initWithCapacity:3];
[dict1 setObject:[tempFullScreenView window] forKey:NSViewAnimationTargetKey];
[dict1 setObject:NSViewAnimationFadeOutEffect forKey:NSViewAnimationEffectKey];
[dict2 setObject:fullScreenWindow forKey:NSViewAnimationTargetKey];
[dict2 setObject:[NSValue valueWithRect:[fullScreenWindow frame]] forKey:NSViewAnimationStartFrameKey];
[dict2 setObject:[NSValue valueWithRect:screenRect] forKey:NSViewAnimationEndFrameKey];
/* Strategy with NSAnimation allocation:
- Keep at most 2 animation at a time
- leaveFullScreen/enterFullScreen are the only responsible for releasing and alloc-ing
*/
fullScreenAnim1 = [[NSViewAnimation alloc] initWithViewAnimations:[NSArray arrayWithObjects:dict1, nil]];
fullScreenAnim2 = [[NSViewAnimation alloc] initWithViewAnimations:[NSArray arrayWithObjects:dict2, nil]];
[dict1 release];
[dict2 release];
[fullScreenAnim1 setAnimationBlockingMode: NSAnimationNonblocking];
[fullScreenAnim1 setDuration: 0.3];
[fullScreenAnim1 setFrameRate: 30];
[fullScreenAnim2 setAnimationBlockingMode: NSAnimationNonblocking];
[fullScreenAnim2 setDuration: 0.3];
[fullScreenAnim2 setFrameRate: 30];
[fullScreenAnim2 setDelegate: self];
[fullScreenAnim2 startWhenAnimation: fullScreenAnim1 reachesProgress: 1.0];
[fullScreenAnim1 startAnimation];
}
- (void)hasBecomeFullScreen
{
[fullScreenWindow makeFirstResponder: self];
[fullScreenWindow makeKeyWindow];
[fullScreenWindow setAcceptsMouseMovedEvents: TRUE];
[[tempFullScreenView window] orderOut: self];
[self willChangeValueForKey:@"fullScreen"];
fullScreen = YES;
[self didChangeValueForKey:@"fullScreen"];
}
- (void)leaveFullScreen
{
[self leaveFullScreenAndFadeOut: NO];
}
- (void)leaveFullScreenAndFadeOut: (BOOL)fadeout
{
NSMutableDictionary *dict1, *dict2;
NSRect frame;
[self willChangeValueForKey:@"fullScreen"];
fullScreen = NO;
[self didChangeValueForKey:@"fullScreen"];
/* Don't do anything if o_fullScreen_window is already closed */
if (!fullScreenWindow)
return;
if (fadeout || [tempFullScreenView isHiddenOrHasHiddenAncestor])
{
/* We don't animate if we are not visible or if we are running on
* Mac OS X <10.4 which doesn't support NSAnimation, instead we
* simply fade the display */
CGDisplayFadeReservationToken token;
CGAcquireDisplayFadeReservation(kCGMaxDisplayReservationInterval, &token);
CGDisplayFade( token, 0.3, kCGDisplayBlendNormal, kCGDisplayBlendSolidColor, 0, 0, 0, YES );
SetSystemUIMode( kUIModeNormal, kUIOptionAutoShowMenuBar);
[self hasEndedFullScreen];
CGDisplayFade( token, 0.5, kCGDisplayBlendSolidColor, kCGDisplayBlendNormal, 0, 0, 0, NO );
CGReleaseDisplayFadeReservation( token);
return;
}
[[tempFullScreenView window] setAlphaValue: 0.0];
[[tempFullScreenView window] orderFront: self];
SetSystemUIMode( kUIModeNormal, kUIOptionAutoShowMenuBar);
if (fullScreenAnim1)
{
[fullScreenAnim1 stopAnimation];
[fullScreenAnim1 release];
}
if (fullScreenAnim2)
{
[fullScreenAnim2 stopAnimation];
[fullScreenAnim2 release];
}
frame = [[tempFullScreenView superview] convertRect: [tempFullScreenView frame] toView: nil]; /* Convert to Window base coord */
frame.origin.x += [tempFullScreenView window].frame.origin.x;
frame.origin.y += [tempFullScreenView window].frame.origin.y;
dict2 = [[NSMutableDictionary alloc] initWithCapacity:2];
[dict2 setObject:[tempFullScreenView window] forKey:NSViewAnimationTargetKey];
[dict2 setObject:NSViewAnimationFadeInEffect forKey:NSViewAnimationEffectKey];
fullScreenAnim2 = [[NSViewAnimation alloc] initWithViewAnimations:[NSArray arrayWithObjects:dict2, nil]];
[dict2 release];
[fullScreenAnim2 setAnimationBlockingMode: NSAnimationNonblocking];
[fullScreenAnim2 setDuration: 0.3];
[fullScreenAnim2 setFrameRate: 30];
[fullScreenAnim2 setDelegate: self];
dict1 = [[NSMutableDictionary alloc] initWithCapacity:3];
[dict1 setObject:fullScreenWindow forKey:NSViewAnimationTargetKey];
[dict1 setObject:[NSValue valueWithRect:[fullScreenWindow frame]] forKey:NSViewAnimationStartFrameKey];
[dict1 setObject:[NSValue valueWithRect:frame] forKey:NSViewAnimationEndFrameKey];
fullScreenAnim1 = [[NSViewAnimation alloc] initWithViewAnimations:[NSArray arrayWithObjects:dict1, nil]];
[dict1 release];
[fullScreenAnim1 setAnimationBlockingMode: NSAnimationNonblocking];
[fullScreenAnim1 setDuration: 0.2];
[fullScreenAnim1 setFrameRate: 30];
[fullScreenAnim2 startWhenAnimation: fullScreenAnim1 reachesProgress: 1.0];
/* Make sure o_fullScreen_window is the frontmost window */
[fullScreenWindow orderFront: self];
[fullScreenAnim1 startAnimation];
}
- (void)hasEndedFullScreen
{
/* This function is private and should be only triggered at the end of the fullScreen change animation */
/* Make sure we don't see the o_view disappearing of the screen during this operation */
DisableScreenUpdates();
[self retain];
/* Make sure we don't loose the layer */
CALayer * layer = [[self layer] retain];
id alayoutManager = layer.layoutManager;
[self removeFromSuperviewWithoutNeedingDisplay];
[[tempFullScreenView superview] replaceSubview:tempFullScreenView with:self];
[self release];
[self setWantsLayer:YES];
[self setLayer:layer];
layer.layoutManager = alayoutManager;
[self setFrame:[tempFullScreenView frame]];
[[self window] makeFirstResponder: self];
if ([[self window] isVisible])
[[self window] makeKeyAndOrderFront:self];
[fullScreenWindow orderOut: self];
EnableScreenUpdates();
[fullScreenWindow release];
fullScreenWindow = nil;
}
- (void)animationDidEnd:(NSAnimation*)animation
{
NSArray *viewAnimations;
if ([animation currentValue] < 1.0)
return;
/* FullScreen ended or started (we are a delegate only for leaveFullScreen's/enterFullscren's anim2) */
viewAnimations = [fullScreenAnim2 viewAnimations];
if ([viewAnimations count] >=1 &&
[[[viewAnimations objectAtIndex: 0] objectForKey: NSViewAnimationEffectKey] isEqualToString:NSViewAnimationFadeInEffect])
{
/* FullScreen ended */
[self hasEndedFullScreen];
}
else
{
/* FullScreen started */
[self hasBecomeFullScreen];
}
}
@end
/*****************************************************************************
* VLCFullScreenControllerWindow.m: class that allow media controlling in
* fullscreen (with the mouse)
*****************************************************************************
* Copyright (C) 2007 Pierre d'Herbemont
* Copyright (C) 2007 the VideoLAN team
* $Id: VLCBrowsableVideoView.h 24154 2008-01-06 20:27:55Z pdherbemont $
*
* Authors: Pierre d'Herbemont <pdherbemont # videolan.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#import <Cocoa/Cocoa.h>
#import <VLCKit/VLCKit.h>
#import "VLCAppAdditions.h"
#import "VLCMainWindow.h"
@interface VLCFullScreenControllerWindow : NSPanel
{
/* IBOutlets */
IBOutlet VLCImageCustomizedSlider * volumeSlider;
IBOutlet VLCImageCustomizedSlider * mediaPositionSlider;
IBOutlet NSButton * mediaPlayerForwardNextButton;
IBOutlet NSButton * mediaPlayerBackwardPrevButton;
IBOutlet NSButton * mediaPlayerPlayPauseStopButton;
IBOutlet id fillScreenButton;
IBOutlet id fullScreenButton;
IBOutlet NSTextField * mediaReadingProgressText;
IBOutlet NSTextField * mediaDescriptionText;
NSTimer * hideWindowTimer;
NSTrackingArea * videoViewTrackingArea;
BOOL active;
/* Owner */
IBOutlet VLCMainWindow * mainWindow;
/* Draging the window using its content */
NSPoint mouseClic;
}
@end
/*****************************************************************************
* VLCFullScreenControllerWindow.m: class that allow media controlling in
* fullscreen (with the mouse)
*****************************************************************************
* Copyright (C) 2007 Pierre d'Herbemont
* Copyright (C) 2007 the VideoLAN team
* $Id: VLCBrowsableVideoView.m 24179 2008-01-07 21:00:49Z pdherbemont $
*
* Authors: Jérôme Decoodt <djc at videolan dot org>
* Felix Kühne <fkuehne at videolan dot org>
* Pierre d'Herbemont <pdherbemont # videolan.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#import "VLCFullScreenControllerWindow.h"
@interface VLCFullScreenControllerWindow (Private)
- (void)hide;
- (void)show;
- (void)updateTrackingRect;
@end
/*****************************************************************************
* @implementation VLCFullScreenControllerWindow
*/
@implementation VLCFullScreenControllerWindow
/* We override this initializer so we can set the NSBorderlessWindowMask styleMask, and set a few other important settings */
- (id)initWithContentRect:(NSRect)contentRect
styleMask:(unsigned int)aStyle
backing:(NSBackingStoreType)bufferingType
defer:(BOOL)flag
{
if( self = [super initWithContentRect:contentRect styleMask:NSTexturedBackgroundWindowMask backing:bufferingType defer:flag] )
{
[self setOpaque:NO];
[self setHasShadow: NO];
[self setBackgroundColor:[NSColor clearColor]];
/* let the window sit on top of everything else and start out completely transparent */
[self setLevel:NSFloatingWindowLevel];
[self center];
}
return self;
}
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
[hideWindowTimer invalidate];
[hideWindowTimer release];
[videoViewTrackingArea release];
[super dealloc];
}
- (void)awakeFromNib
{
hideWindowTimer = nil;
videoViewTrackingArea = nil;
[self setMovableByWindowBackground:YES];
/* Make sure we'll detect when to close the window, see animationDidStop:finished: */
CAAnimation *alphaValueAnimation = [CABasicAnimation animation];
[alphaValueAnimation setDelegate:self];
[self setAnimations:[NSDictionary dictionaryWithObject:alphaValueAnimation forKey:@"alphaValue"]];
hideWindowTimer = nil;
/* WindowView setup */
[[mainWindow.videoView window] setAcceptsMouseMovedEvents:YES];
[[mainWindow.videoView window] makeFirstResponder:mainWindow.videoView];
[mainWindow.videoView setPostsBoundsChangedNotifications: YES];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(videoViewDidChangeBounds:) name:NSViewBoundsDidChangeNotification object:(id)mainWindow.videoView];
/* Make sure we can know when the mouse is inside us */
[[self contentView] addTrackingRect:[[self contentView] bounds] owner:self userData:nil assumeInside:NO];
/* Bindings connection */
/* Sound */
[volumeSlider setKnobImage:[NSImage imageNamed:@"fs_volume_slider_knob_highlight.png"]];
[volumeSlider setBackgroundImage:[NSImage imageNamed:@"fs_volume_slider_bar.png"]];
[volumeSlider setNeedsDisplay:YES];
[volumeSlider bind:@"value" toObject:[VLCLibrary sharedLibrary] withKeyPath:@"audio.volume" options: nil];
/* media position */
[mediaPositionSlider setKnobImage:[NSImage imageNamed:@"fs_time_slider_knob.png"]];
[mediaPositionSlider setBackgroundImage:[NSImage imageNamed:@"fs_time_slider.png"]];
[mediaPositionSlider setNeedsDisplay:YES];
[mediaPositionSlider bind:@"enabled" toObject:mainWindow.mediaPlayer withKeyPath:@"media" options: [NSDictionary dictionaryWithObject:@"NonNilAsBoolTransformer" forKey:NSValueTransformerNameBindingOption]];
[mediaPositionSlider bind:@"enabled2" toObject:mainWindow.mediaPlayer withKeyPath:@"seekable" options: nil];
[mediaPositionSlider bind:@"value" toObject:mainWindow.mediaPlayer withKeyPath:@"position" options:
[NSDictionary dictionaryWithObjectsAndKeys:@"Float10000FoldTransformer", NSValueTransformerNameBindingOption,
[NSNumber numberWithBool:NO], NSConditionallySetsEnabledBindingOption, nil ]];
[fillScreenButton bind:@"value" toObject:mainWindow.videoView withKeyPath:@"fillScreen" options: nil];
[fullScreenButton bind:@"value" toObject:mainWindow.videoView withKeyPath:@"fullScreen" options: nil];
[mediaReadingProgressText bind:@"value" toObject:mainWindow.mediaPlayer withKeyPath:@"time.stringValue" options: nil];
[mediaDescriptionText bind:@"value" toObject:mainWindow.mediaPlayer withKeyPath:@"description" options: nil];
/* mediaPlayer */
[mediaPlayerPlayPauseStopButton bind:@"enabled" toObject:mainWindow.mediaPlayer withKeyPath:@"media" options: [NSDictionary dictionaryWithObject:@"NonNilAsBoolTransformer" forKey:NSValueTransformerNameBindingOption]];
[mediaPlayerPlayPauseStopButton bind:@"state" toObject:mainWindow.mediaPlayer withKeyPath:@"playing" options: nil];
[mediaPlayerPlayPauseStopButton bind:@"alternateImage" toObject:mainWindow.mediaPlayer withKeyPath:@"stateAsFullScreenButtonAlternateImage" options: nil];
[mediaPlayerPlayPauseStopButton bind:@"image" toObject:mainWindow.mediaPlayer withKeyPath:@"stateAsFullScreenButtonImage" options: nil];
[mediaPlayerBackwardPrevButton bind:@"enabled" toObject:mainWindow.mediaPlayer withKeyPath:@"playing" options: nil];
[mediaPlayerForwardNextButton bind:@"enabled" toObject:mainWindow.mediaPlayer withKeyPath:@"playing" options: nil];
[mediaPlayerForwardNextButton setTarget:mainWindow.mediaPlayer];
[mediaPlayerForwardNextButton setAction:@selector(fastForward)];
[mediaPlayerBackwardPrevButton setTarget:mainWindow.mediaPlayer];
[mediaPlayerBackwardPrevButton setAction:@selector(rewind)];
[mediaPlayerPlayPauseStopButton setTarget:mainWindow.mediaPlayer];
[mediaPlayerPlayPauseStopButton setAction:@selector(pause)];
[self bind:@"fullScreen" toObject:mainWindow.videoView withKeyPath:@"fullScreen" options: nil];
active = NO;
}
- (BOOL)fullScreen
{
/* Only to comply to KVC */
return active;
}
- (void)setFullScreen:(BOOL)fullScreen
{
if(fullScreen)
{
active = YES;
[self show];
}
else
{
[self hide];
active = NO;
}
}
-(void)center
{
/* centre the panel in the lower third of the screen */
NSPoint theCoordinate;
NSRect theScreensFrame;
NSRect theWindowsFrame;
theScreensFrame = [[self screen] frame];
theWindowsFrame = [self frame];
theCoordinate.x = (theScreensFrame.size.width - theWindowsFrame.size.width) / 2 + theScreensFrame.origin.x;
theCoordinate.y = (theScreensFrame.size.height / 3) - theWindowsFrame.size.height + theScreensFrame.origin.y;
[self setFrameTopLeftPoint: theCoordinate];
}
@end
/*****************************************************************************
* @implementation VLCFullScreenControllerWindow (Private)
*/
@implementation VLCFullScreenControllerWindow (Private)
- (void)show
{
if(![self isVisible])
self.alphaValue = 0.0;
if( !NSPointInRect([NSEvent mouseLocation],[self frame]) )
{
[hideWindowTimer invalidate];
[hideWindowTimer release];
hideWindowTimer = [[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(hide) userInfo:nil repeats:NO] retain];
}
[self orderFront:self];
[self.animator setAlphaValue:1.0];
}
- (void)hide
{
[hideWindowTimer invalidate];
[hideWindowTimer release];
hideWindowTimer = nil;
if ([self isVisible])
{
[self.animator setAlphaValue:0.0];
[NSCursor setHiddenUntilMouseMoves:YES];
}
[self updateTrackingRect];
}
- (void)updateTrackingRect
{
VLCVideoView * videoView = mainWindow.videoView;
if( videoViewTrackingArea )
{
[videoView removeTrackingArea:videoViewTrackingArea];
[videoViewTrackingArea release];
}
videoViewTrackingArea = [[NSTrackingArea alloc] initWithRect:[videoView bounds] options:NSTrackingMouseMoved|NSTrackingActiveAlways|NSTrackingAssumeInside|NSTrackingEnabledDuringMouseDrag owner:self userInfo:nil];
[videoView addTrackingArea:videoViewTrackingArea];
}
@end
/*****************************************************************************
* @implementation VLCFullScreenControllerWindow (NSAnimationDelegate)
*/
@implementation VLCFullScreenControllerWindow (NSAnimationDelegate)
- (void)animationDidStop:(CAAnimation *)animation finished:(BOOL)flag
{
if( self.alphaValue == 0.0 )
[self orderOut:self];
}
@end
/*****************************************************************************
* @implementation VLCFullScreenControllerWindow (NSTrackingRectCallbacksInVideoView)
*/
@implementation VLCFullScreenControllerWindow (NSTrackingRectCallbacks)
- (void)mouseMoved:(NSEvent *)theEvent
{
if([theEvent window] != self)
{
if( active )
[self show];
}
}
- (void)mouseEntered:(NSEvent *)theEvent
{
if([theEvent window] == self)
{
[hideWindowTimer invalidate];
[hideWindowTimer release];
hideWindowTimer = nil;
}
}
- (void)mouseExited:(NSEvent *)theEvent
{
if([theEvent window] == self)
{
[hideWindowTimer invalidate];
[hideWindowTimer release];
hideWindowTimer = [[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(hide) userInfo:nil repeats:NO] retain];
}
else
{
if( active )
[self hide];
}
}
- (void)cursorUpdate:(NSEvent *)event
{
}
@end
/*****************************************************************************
* @implementation VLCFullScreenControllerWindow (VideoViewBoundsChanges)
*/
@implementation VLCFullScreenControllerWindow (VideoViewBoundsChanges)
- (void)videoViewDidChangeBounds:(NSNotification *)theNotification
{
[self updateTrackingRect];
}
@end
......@@ -64,7 +64,7 @@
IBOutlet NSView * toolbarMediaDescription;
IBOutlet NSView * toolbarMediaControl;
VLCMediaPlayer * mediaPlayer;
IBOutlet VLCMediaPlayer * mediaPlayer;
IBOutlet VLCController * controller; /* This is a VLCController binded to the File's Owner of the nib */
......@@ -77,4 +77,6 @@
}
@property BOOL navigatorViewVisible;
@property (readonly) VLCMediaPlayer * mediaPlayer;
@property (readonly) VLCBrowsableVideoView * videoView;
@end
......@@ -27,6 +27,7 @@
#import "VLCMediaArrayController.h"
#import "VLCBrowsableVideoView.h"
#import "VLCAppAdditions.h"
#import "VLCFullScreenControllerWindow.h"
@interface VLCMainWindow (NavigatorViewHidingShowing)
@property float contentHeight; /* animatable, keep the mainSplitView cursor at the same place, enabling playlist(navigator) togling */
......@@ -106,6 +107,10 @@
* VLCMainWindow
*/
@implementation VLCMainWindow
@synthesize mediaPlayer;
@synthesize videoView;
- (void)awakeFromNib;
{
NSTableColumn * tableColumn;
......@@ -117,7 +122,7 @@
/***********************************
* Init the media player
*/
mediaPlayer = [[VLCMediaPlayer alloc] initWithVideoView:videoView];
[mediaPlayer setVideoView:videoView];
/***********************************
* CategoriesList OutlineView content
......
......@@ -47,6 +47,7 @@
633BD4DA0D2A90C80012A314 /* dialog-error.png in Resources */ = {isa = PBXBuildFile; fileRef = 633BD4D80D2A90C80012A314 /* dialog-error.png */; };
633BD4DB0D2A90C80012A314 /* applications-internet.png in Resources */ = {isa = PBXBuildFile; fileRef = 633BD4D90D2A90C80012A314 /* applications-internet.png */; };
63874B190D25960600F738AD /* MainWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 63874B170D25960600F738AD /* MainWindow.xib */; };
638B823B0D35294500128F2B /* QuickTime.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 638B823A0D35294500128F2B /* QuickTime.framework */; };
638F47110D216C8F008E4912 /* type_playlist.png in Resources */ = {isa = PBXBuildFile; fileRef = 638F47100D216C8F008E4912 /* type_playlist.png */; };
63A742B30D2759C1002D41A0 /* ExceptionHandling.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63A742B20D2759C1002D41A0 /* ExceptionHandling.framework */; };
63E380AA0D1C65A600FD6958 /* volume_high.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E380A80D1C65A600FD6958 /* volume_high.png */; };
......@@ -58,6 +59,35 @@
63E380B60D1C65FC00FD6958 /* skip_previous_active.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E380B40D1C65FC00FD6958 /* skip_previous_active.png */; };
63E380B70D1C65FC00FD6958 /* skip_previous_blue.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E380B50D1C65FC00FD6958 /* skip_previous_blue.png */; };
63E380DF0D1C6FD800FD6958 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63E380DE0D1C6FD800FD6958 /* QuartzCore.framework */; };
63E768830D3503E200258089 /* VLCFullScreenControllerWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 63E768820D3503E200258089 /* VLCFullScreenControllerWindow.m */; };
63E768BF0D3507EF00258089 /* fs_volume_slider_knob.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768A40D3507EF00258089 /* fs_volume_slider_knob.png */; };
63E768C00D3507EF00258089 /* fs_background.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768A50D3507EF00258089 /* fs_background.png */; };
63E768C10D3507EF00258089 /* fs_exit_fullscreen_highlight.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768A60D3507EF00258089 /* fs_exit_fullscreen_highlight.png */; };
63E768C20D3507EF00258089 /* fs_exit_fullscreen.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768A70D3507EF00258089 /* fs_exit_fullscreen.png */; };
63E768C30D3507EF00258089 /* fs_forward_highlight.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768A80D3507EF00258089 /* fs_forward_highlight.png */; };
63E768C40D3507EF00258089 /* fs_forward.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768A90D3507EF00258089 /* fs_forward.png */; };
63E768C50D3507EF00258089 /* fs_pause_highlight.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768AA0D3507EF00258089 /* fs_pause_highlight.png */; };
63E768C60D3507EF00258089 /* fs_pause.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768AB0D3507EF00258089 /* fs_pause.png */; };
63E768C70D3507EF00258089 /* fs_play_highlight.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768AC0D3507EF00258089 /* fs_play_highlight.png */; };
63E768C80D3507EF00258089 /* fs_play.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768AD0D3507EF00258089 /* fs_play.png */; };
63E768C90D3507EF00258089 /* fs_rewind_highlight.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768AE0D3507EF00258089 /* fs_rewind_highlight.png */; };
63E768CA0D3507EF00258089 /* fs_rewind.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768AF0D3507EF00258089 /* fs_rewind.png */; };
63E768CB0D3507EF00258089 /* fs_skip_next_highlight.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768B00D3507EF00258089 /* fs_skip_next_highlight.png */; };
63E768CC0D3507EF00258089 /* fs_skip_next.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768B10D3507EF00258089 /* fs_skip_next.png */; };
63E768CD0D3507EF00258089 /* fs_skip_previous_highlight.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768B20D3507EF00258089 /* fs_skip_previous_highlight.png */; };
63E768CE0D3507EF00258089 /* fs_skip_previous.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768B30D3507EF00258089 /* fs_skip_previous.png */; };
63E768CF0D3507EF00258089 /* fs_stop_highlight.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768B40D3507EF00258089 /* fs_stop_highlight.png */; };
63E768D00D3507EF00258089 /* fs_stop.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768B50D3507EF00258089 /* fs_stop.png */; };
63E768D10D3507EF00258089 /* fs_time_slider_knob_highlight.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768B60D3507EF00258089 /* fs_time_slider_knob_highlight.png */; };
63E768D20D3507EF00258089 /* fs_time_slider_knob.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768B70D3507EF00258089 /* fs_time_slider_knob.png */; };
63E768D30D3507EF00258089 /* fs_time_slider.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768B80D3507EF00258089 /* fs_time_slider.png */; };
63E768D40D3507EF00258089 /* fs_volume_max_highlight.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768B90D3507EF00258089 /* fs_volume_max_highlight.png */; };
63E768D50D3507EF00258089 /* fs_volume_max.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768BA0D3507EF00258089 /* fs_volume_max.png */; };
63E768D60D3507EF00258089 /* fs_volume_mute_highlight.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768BB0D3507EF00258089 /* fs_volume_mute_highlight.png */; };
63E768D70D3507EF00258089 /* fs_volume_mute.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768BC0D3507EF00258089 /* fs_volume_mute.png */; };
63E768D80D3507EF00258089 /* fs_volume_slider_bar.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768BD0D3507EF00258089 /* fs_volume_slider_bar.png */; };
63E768D90D3507EF00258089 /* fs_volume_slider_knob_highlight.png in Resources */ = {isa = PBXBuildFile; fileRef = 63E768BE0D3507EF00258089 /* fs_volume_slider_knob_highlight.png */; };
63E76A530D35225700258089 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 63E76A520D35225700258089 /* Carbon.framework */; };
8D11072A0486CEB800E47090 /* MainMenu.nib in Resources */ = {isa = PBXBuildFile; fileRef = 29B97318FDCFA39411CA2CEA /* MainMenu.nib */; };
8D11072B0486CEB800E47090 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C165CFE840E0CC02AAC07 /* InfoPlist.strings */; };
8D11072D0486CEB800E47090 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 29B97316FDCFA39411CA2CEA /* main.m */; settings = {ATTRIBUTES = (); }; };
......@@ -127,6 +157,7 @@
633BD4D90D2A90C80012A314 /* applications-internet.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "applications-internet.png"; path = "Icons/applications-internet.png"; sourceTree = "<group>"; };
633BD69D0D2ACE520012A314 /* VLCKit.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = VLCKit.xcodeproj; path = ../Framework/VLCKit.xcodeproj; sourceTree = SOURCE_ROOT; };
63874B180D25960600F738AD /* English */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = English; path = English.lproj/MainWindow.xib; sourceTree = "<group>"; };
638B823A0D35294500128F2B /* QuickTime.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuickTime.framework; path = /System/Library/Frameworks/QuickTime.framework; sourceTree = "<absolute>"; };
638F47100D216C8F008E4912 /* type_playlist.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = type_playlist.png; path = ../../../modules/gui/qt4/pixmaps/type_playlist.png; sourceTree = SOURCE_ROOT; };
63A742B20D2759C1002D41A0 /* ExceptionHandling.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ExceptionHandling.framework; path = /System/Library/Frameworks/ExceptionHandling.framework; sourceTree = "<absolute>"; };
63E380A80D1C65A600FD6958 /* volume_high.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = volume_high.png; path = ../Resources/volume_high.png; sourceTree = SOURCE_ROOT; };
......@@ -138,6 +169,36 @@
63E380B40D1C65FC00FD6958 /* skip_previous_active.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = skip_previous_active.png; path = ../Resources/skip_previous_active.png; sourceTree = SOURCE_ROOT; };
63E380B50D1C65FC00FD6958 /* skip_previous_blue.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = skip_previous_blue.png; path = ../Resources/skip_previous_blue.png; sourceTree = SOURCE_ROOT; };
63E380DE0D1C6FD800FD6958 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = /System/Library/Frameworks/QuartzCore.framework; sourceTree = "<absolute>"; };
63E768810D3503E200258089 /* VLCFullScreenControllerWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCFullScreenControllerWindow.h; path = Sources/VLCFullScreenControllerWindow.h; sourceTree = "<group>"; };
63E768820D3503E200258089 /* VLCFullScreenControllerWindow.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCFullScreenControllerWindow.m; path = Sources/VLCFullScreenControllerWindow.m; sourceTree = "<group>"; };
63E768A40D3507EF00258089 /* fs_volume_slider_knob.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_volume_slider_knob.png; path = ../Resources/fs_volume_slider_knob.png; sourceTree = SOURCE_ROOT; };
63E768A50D3507EF00258089 /* fs_background.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_background.png; path = ../Resources/fs_background.png; sourceTree = SOURCE_ROOT; };
63E768A60D3507EF00258089 /* fs_exit_fullscreen_highlight.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_exit_fullscreen_highlight.png; path = ../Resources/fs_exit_fullscreen_highlight.png; sourceTree = SOURCE_ROOT; };
63E768A70D3507EF00258089 /* fs_exit_fullscreen.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_exit_fullscreen.png; path = ../Resources/fs_exit_fullscreen.png; sourceTree = SOURCE_ROOT; };
63E768A80D3507EF00258089 /* fs_forward_highlight.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_forward_highlight.png; path = ../Resources/fs_forward_highlight.png; sourceTree = SOURCE_ROOT; };
63E768A90D3507EF00258089 /* fs_forward.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_forward.png; path = ../Resources/fs_forward.png; sourceTree = SOURCE_ROOT; };
63E768AA0D3507EF00258089 /* fs_pause_highlight.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_pause_highlight.png; path = ../Resources/fs_pause_highlight.png; sourceTree = SOURCE_ROOT; };
63E768AB0D3507EF00258089 /* fs_pause.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_pause.png; path = ../Resources/fs_pause.png; sourceTree = SOURCE_ROOT; };
63E768AC0D3507EF00258089 /* fs_play_highlight.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_play_highlight.png; path = ../Resources/fs_play_highlight.png; sourceTree = SOURCE_ROOT; };
63E768AD0D3507EF00258089 /* fs_play.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_play.png; path = ../Resources/fs_play.png; sourceTree = SOURCE_ROOT; };
63E768AE0D3507EF00258089 /* fs_rewind_highlight.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_rewind_highlight.png; path = ../Resources/fs_rewind_highlight.png; sourceTree = SOURCE_ROOT; };
63E768AF0D3507EF00258089 /* fs_rewind.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_rewind.png; path = ../Resources/fs_rewind.png; sourceTree = SOURCE_ROOT; };
63E768B00D3507EF00258089 /* fs_skip_next_highlight.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_skip_next_highlight.png; path = ../Resources/fs_skip_next_highlight.png; sourceTree = SOURCE_ROOT; };
63E768B10D3507EF00258089 /* fs_skip_next.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_skip_next.png; path = ../Resources/fs_skip_next.png; sourceTree = SOURCE_ROOT; };
63E768B20D3507EF00258089 /* fs_skip_previous_highlight.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_skip_previous_highlight.png; path = ../Resources/fs_skip_previous_highlight.png; sourceTree = SOURCE_ROOT; };
63E768B30D3507EF00258089 /* fs_skip_previous.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_skip_previous.png; path = ../Resources/fs_skip_previous.png; sourceTree = SOURCE_ROOT; };
63E768B40D3507EF00258089 /* fs_stop_highlight.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_stop_highlight.png; path = ../Resources/fs_stop_highlight.png; sourceTree = SOURCE_ROOT; };
63E768B50D3507EF00258089 /* fs_stop.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_stop.png; path = ../Resources/fs_stop.png; sourceTree = SOURCE_ROOT; };
63E768B60D3507EF00258089 /* fs_time_slider_knob_highlight.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_time_slider_knob_highlight.png; path = ../Resources/fs_time_slider_knob_highlight.png; sourceTree = SOURCE_ROOT; };
63E768B70D3507EF00258089 /* fs_time_slider_knob.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_time_slider_knob.png; path = ../Resources/fs_time_slider_knob.png; sourceTree = SOURCE_ROOT; };
63E768B80D3507EF00258089 /* fs_time_slider.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_time_slider.png; path = ../Resources/fs_time_slider.png; sourceTree = SOURCE_ROOT; };
63E768B90D3507EF00258089 /* fs_volume_max_highlight.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_volume_max_highlight.png; path = ../Resources/fs_volume_max_highlight.png; sourceTree = SOURCE_ROOT; };
63E768BA0D3507EF00258089 /* fs_volume_max.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_volume_max.png; path = ../Resources/fs_volume_max.png; sourceTree = SOURCE_ROOT; };
63E768BB0D3507EF00258089 /* fs_volume_mute_highlight.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_volume_mute_highlight.png; path = ../Resources/fs_volume_mute_highlight.png; sourceTree = SOURCE_ROOT; };
63E768BC0D3507EF00258089 /* fs_volume_mute.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_volume_mute.png; path = ../Resources/fs_volume_mute.png; sourceTree = SOURCE_ROOT; };
63E768BD0D3507EF00258089 /* fs_volume_slider_bar.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_volume_slider_bar.png; path = ../Resources/fs_volume_slider_bar.png; sourceTree = SOURCE_ROOT; };
63E768BE0D3507EF00258089 /* fs_volume_slider_knob_highlight.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fs_volume_slider_knob_highlight.png; path = ../Resources/fs_volume_slider_knob_highlight.png; sourceTree = SOURCE_ROOT; };
63E76A520D35225700258089 /* Carbon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Carbon.framework; path = /System/Library/Frameworks/Carbon.framework; sourceTree = "<absolute>"; };
8D1107310486CEB800E47090 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
8D1107320486CEB800E47090 /* VLC.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = VLC.app; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */
......@@ -151,6 +212,8 @@
8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */,
63E380DF0D1C6FD800FD6958 /* QuartzCore.framework in Frameworks */,
63A742B30D2759C1002D41A0 /* ExceptionHandling.framework in Frameworks */,
63E76A530D35225700258089 /* Carbon.framework in Frameworks */,
638B823B0D35294500128F2B /* QuickTime.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
......@@ -160,6 +223,7 @@
1058C7A0FEA54F0111CA2CBB /* Linked Frameworks */ = {
isa = PBXGroup;
children = (
638B823A0D35294500128F2B /* QuickTime.framework */,
63A742B20D2759C1002D41A0 /* ExceptionHandling.framework */,
63E380DE0D1C6FD800FD6958 /* QuartzCore.framework */,
1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */,
......@@ -188,6 +252,7 @@
29B97314FDCFA39411CA2CEA /* VLC */ = {
isa = PBXGroup;
children = (
63E76A520D35225700258089 /* Carbon.framework */,
633BD6A40D2ACE5E0012A314 /* Dependencies */,
63874AF40D2591CE00F738AD /* Sources */,
29B97315FDCFA39411CA2CEA /* Other Sources */,
......@@ -272,6 +337,8 @@
children = (
633BD4B60D2A90470012A314 /* VLCBrowsableVideoView.h */,
633BD4B30D2A90470012A314 /* VLCBrowsableVideoView.m */,
63E768810D3503E200258089 /* VLCFullScreenControllerWindow.h */,
63E768820D3503E200258089 /* VLCFullScreenControllerWindow.m */,
);
name = Video;
sourceTree = "<group>";
......@@ -312,9 +379,16 @@
63C551960C7F6AD100B202D3 /* Images */ = {
isa = PBXGroup;
children = (
638F47100D216C8F008E4912 /* type_playlist.png */,
633BD4D80D2A90C80012A314 /* dialog-error.png */,
633BD4D90D2A90C80012A314 /* applications-internet.png */,
63E768860D35072F00258089 /* Categories Icons */,
63E768850D35072600258089 /* Toolbar Items */,
63E768DA0D3507F500258089 /* FullScreenControllerWindow */,
);
name = Images;
sourceTree = "<group>";
};
63E768850D35072600258089 /* Toolbar Items */ = {
isa = PBXGroup;
children = (
63E380A80D1C65A600FD6958 /* volume_high.png */,
63E380A90D1C65A600FD6958 /* volume_low.png */,
63E380AC0D1C65D100FD6958 /* play.png */,
......@@ -325,7 +399,51 @@
63E380B40D1C65FC00FD6958 /* skip_previous_active.png */,
63E380B50D1C65FC00FD6958 /* skip_previous_blue.png */,
);
name = Images;
name = "Toolbar Items";
sourceTree = "<group>";
};
63E768860D35072F00258089 /* Categories Icons */ = {
isa = PBXGroup;
children = (
638F47100D216C8F008E4912 /* type_playlist.png */,
633BD4D80D2A90C80012A314 /* dialog-error.png */,
633BD4D90D2A90C80012A314 /* applications-internet.png */,
);
name = "Categories Icons";
sourceTree = "<group>";
};
63E768DA0D3507F500258089 /* FullScreenControllerWindow */ = {
isa = PBXGroup;
children = (
63E768A40D3507EF00258089 /* fs_volume_slider_knob.png */,
63E768A50D3507EF00258089 /* fs_background.png */,
63E768A60D3507EF00258089 /* fs_exit_fullscreen_highlight.png */,
63E768A70D3507EF00258089 /* fs_exit_fullscreen.png */,
63E768A80D3507EF00258089 /* fs_forward_highlight.png */,
63E768A90D3507EF00258089 /* fs_forward.png */,
63E768AA0D3507EF00258089 /* fs_pause_highlight.png */,
63E768AB0D3507EF00258089 /* fs_pause.png */,
63E768AC0D3507EF00258089 /* fs_play_highlight.png */,
63E768AD0D3507EF00258089 /* fs_play.png */,
63E768AE0D3507EF00258089 /* fs_rewind_highlight.png */,
63E768AF0D3507EF00258089 /* fs_rewind.png */,
63E768B00D3507EF00258089 /* fs_skip_next_highlight.png */,
63E768B10D3507EF00258089 /* fs_skip_next.png */,
63E768B20D3507EF00258089 /* fs_skip_previous_highlight.png */,
63E768B30D3507EF00258089 /* fs_skip_previous.png */,
63E768B40D3507EF00258089 /* fs_stop_highlight.png */,
63E768B50D3507EF00258089 /* fs_stop.png */,
63E768B60D3507EF00258089 /* fs_time_slider_knob_highlight.png */,
63E768B70D3507EF00258089 /* fs_time_slider_knob.png */,
63E768B80D3507EF00258089 /* fs_time_slider.png */,
63E768B90D3507EF00258089 /* fs_volume_max_highlight.png */,
63E768BA0D3507EF00258089 /* fs_volume_max.png */,
63E768BB0D3507EF00258089 /* fs_volume_mute_highlight.png */,
63E768BC0D3507EF00258089 /* fs_volume_mute.png */,
63E768BD0D3507EF00258089 /* fs_volume_slider_bar.png */,
63E768BE0D3507EF00258089 /* fs_volume_slider_knob_highlight.png */,
);
name = FullScreenControllerWindow;
sourceTree = "<group>";
};
/* End PBXGroup section */
......@@ -405,6 +523,33 @@
633BD4DA0D2A90C80012A314 /* dialog-error.png in Resources */,
633BD4DB0D2A90C80012A314 /* applications-internet.png in Resources */,
632F3E260D326FF0003BBC56 /* pause.png in Resources */,
63E768BF0D3507EF00258089 /* fs_volume_slider_knob.png in Resources */,
63E768C00D3507EF00258089 /* fs_background.png in Resources */,
63E768C10D3507EF00258089 /* fs_exit_fullscreen_highlight.png in Resources */,
63E768C20D3507EF00258089 /* fs_exit_fullscreen.png in Resources */,
63E768C30D3507EF00258089 /* fs_forward_highlight.png in Resources */,
63E768C40D3507EF00258089 /* fs_forward.png in Resources */,
63E768C50D3507EF00258089 /* fs_pause_highlight.png in Resources */,
63E768C60D3507EF00258089 /* fs_pause.png in Resources */,
63E768C70D3507EF00258089 /* fs_play_highlight.png in Resources */,
63E768C80D3507EF00258089 /* fs_play.png in Resources */,
63E768C90D3507EF00258089 /* fs_rewind_highlight.png in Resources */,
63E768CA0D3507EF00258089 /* fs_rewind.png in Resources */,
63E768CB0D3507EF00258089 /* fs_skip_next_highlight.png in Resources */,
63E768CC0D3507EF00258089 /* fs_skip_next.png in Resources */,
63E768CD0D3507EF00258089 /* fs_skip_previous_highlight.png in Resources */,
63E768CE0D3507EF00258089 /* fs_skip_previous.png in Resources */,
63E768CF0D3507EF00258089 /* fs_stop_highlight.png in Resources */,
63E768D00D3507EF00258089 /* fs_stop.png in Resources */,
63E768D10D3507EF00258089 /* fs_time_slider_knob_highlight.png in Resources */,
63E768D20D3507EF00258089 /* fs_time_slider_knob.png in Resources */,
63E768D30D3507EF00258089 /* fs_time_slider.png in Resources */,
63E768D40D3507EF00258089 /* fs_volume_max_highlight.png in Resources */,
63E768D50D3507EF00258089 /* fs_volume_max.png in Resources */,
63E768D60D3507EF00258089 /* fs_volume_mute_highlight.png in Resources */,
63E768D70D3507EF00258089 /* fs_volume_mute.png in Resources */,
63E768D80D3507EF00258089 /* fs_volume_slider_bar.png in Resources */,
63E768D90D3507EF00258089 /* fs_volume_slider_knob_highlight.png in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
......@@ -443,6 +588,7 @@
633BD4C20D2A90470012A314 /* VLCAppBindings.m in Sources */,
633BD4C30D2A90470012A314 /* VLCAppAdditions.m in Sources */,
633BD4C40D2A90470012A314 /* ImageAndTextCell.m in Sources */,
63E768830D3503E200258089 /* VLCFullScreenControllerWindow.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment