|
|
|
@ -1,7 +1,7 @@ |
|
|
|
/***************************************************************************** |
|
|
|
* embeddedwindow.m: MacOS X interface module |
|
|
|
***************************************************************************** |
|
|
|
* Copyright (C) 2005-2009 the VideoLAN team |
|
|
|
* Copyright (C) 2005-2008 the VideoLAN team |
|
|
|
* $Id$ |
|
|
|
* |
|
|
|
* Authors: Benjamin Pracht <bigben at videolan dot org> |
|
|
|
@ -26,14 +26,26 @@ |
|
|
|
* Preamble |
|
|
|
*****************************************************************************/ |
|
|
|
|
|
|
|
/* DisableScreenUpdates, SetSystemUIMode, ... */ |
|
|
|
#import <QuickTime/QuickTime.h> |
|
|
|
|
|
|
|
#import "intf.h" |
|
|
|
#import "controls.h" |
|
|
|
#import "vout.h" |
|
|
|
#import "embeddedwindow.h" |
|
|
|
#import "fspanel.h" |
|
|
|
#import "playlist.h" |
|
|
|
|
|
|
|
/* SetSystemUIMode, ... */ |
|
|
|
#import <Carbon/Carbon.h> |
|
|
|
/***************************************************************************** |
|
|
|
* extension to NSWindow's interface to fix compilation warnings |
|
|
|
* and let us access this functions properly |
|
|
|
* this uses a private Apple-API, but works fine on all current OSX releases |
|
|
|
* keep checking for compatiblity with future releases though |
|
|
|
*****************************************************************************/ |
|
|
|
|
|
|
|
@interface NSWindow (UndocumentedWindowProperties) |
|
|
|
- (void)setBottomCornerRounded: (BOOL)value; |
|
|
|
@end |
|
|
|
|
|
|
|
/***************************************************************************** |
|
|
|
* VLCEmbeddedWindow Implementation |
|
|
|
@ -41,40 +53,48 @@ |
|
|
|
|
|
|
|
@implementation VLCEmbeddedWindow |
|
|
|
|
|
|
|
- (id)initWithContentRect:(NSRect)contentRect styleMask: (NSUInteger)windowStyle backing:(NSBackingStoreType)bufferingType defer:(BOOL)deferCreation |
|
|
|
{ |
|
|
|
BOOL b_useTextured = YES; |
|
|
|
if( [[NSWindow class] instancesRespondToSelector:@selector(setContentBorderThickness:forEdge:)] ) |
|
|
|
{ |
|
|
|
b_useTextured = NO; |
|
|
|
windowStyle ^= NSTexturedBackgroundWindowMask; |
|
|
|
} |
|
|
|
self = [super initWithContentRect:contentRect styleMask:windowStyle backing:bufferingType defer:deferCreation]; |
|
|
|
if(! b_useTextured ) |
|
|
|
{ |
|
|
|
[self setContentBorderThickness:28.0 forEdge:NSMinYEdge]; |
|
|
|
} |
|
|
|
return self; |
|
|
|
} |
|
|
|
|
|
|
|
- (void)awakeFromNib |
|
|
|
{ |
|
|
|
[self setDelegate: self]; |
|
|
|
[self setBottomCornerRounded:NO]; |
|
|
|
|
|
|
|
/* button strings */ |
|
|
|
[o_btn_backward setToolTip: _NS("Rewind")]; |
|
|
|
[o_btn_forward setToolTip: _NS("Fast Forward")]; |
|
|
|
[o_btn_fullscreen setToolTip: _NS("Fullscreen")]; |
|
|
|
[o_btn_play setToolTip: _NS("Play")]; |
|
|
|
[o_slider setToolTip: _NS("Position")]; |
|
|
|
|
|
|
|
o_img_play = [NSImage imageNamed: @"play_embedded"]; |
|
|
|
o_img_pause = [NSImage imageNamed: @"pause_embedded"]; |
|
|
|
[o_timeslider setToolTip: _NS("Position")]; |
|
|
|
[o_btn_prev setToolTip: _NS("Previous")]; |
|
|
|
[o_btn_stop setToolTip: _NS("Stop")]; |
|
|
|
[o_btn_next setToolTip: _NS("Next")]; |
|
|
|
[o_volumeslider setToolTip: _NS("Volume")]; |
|
|
|
[o_btn_playlist setToolTip: _NS("Playlist")]; |
|
|
|
[self setTitle: _NS("VLC media player")]; |
|
|
|
|
|
|
|
if(MACOS_VERSION < 10.5f) { |
|
|
|
o_img_play = [NSImage imageNamed: @"play"]; |
|
|
|
o_img_pause = [NSImage imageNamed: @"pause"]; |
|
|
|
[o_btn_play setImage: [NSImage imageNamed: @"play"]]; |
|
|
|
} |
|
|
|
else { |
|
|
|
o_img_play = [NSImage imageNamed: @"play_big"]; |
|
|
|
o_img_pause = [NSImage imageNamed: @"pause_big"]; |
|
|
|
} |
|
|
|
[self controlTintChanged]; |
|
|
|
[[NSNotificationCenter defaultCenter] addObserver: self |
|
|
|
selector: @selector( controlTintChanged ) |
|
|
|
name: NSControlTintDidChangeNotification |
|
|
|
object: nil]; |
|
|
|
|
|
|
|
/* Set color of sidebar to Leopard's "Sidebar Blue" */ |
|
|
|
[o_sidebar_list setBackgroundColor: [NSColor colorWithCalibratedRed:0.820 |
|
|
|
green:0.843 |
|
|
|
blue:0.886 |
|
|
|
alpha:1.0]]; |
|
|
|
|
|
|
|
[self setMinSize:NSMakeSize([o_sidebar_list convertRect:[o_sidebar_list bounds] |
|
|
|
toView: nil].size.width + 551., 114.)]; |
|
|
|
|
|
|
|
/* Useful to save o_view frame in fullscreen mode */ |
|
|
|
o_temp_view = [[NSView alloc] init]; |
|
|
|
[o_temp_view setAutoresizingMask:NSViewHeightSizable | NSViewWidthSizable]; |
|
|
|
@ -86,13 +106,9 @@ |
|
|
|
[o_btn_fullscreen setState: NO]; |
|
|
|
b_fullscreen = NO; |
|
|
|
|
|
|
|
[self setMovableByWindowBackground:YES]; |
|
|
|
|
|
|
|
[self setDelegate:self]; |
|
|
|
|
|
|
|
/* Make sure setVisible: returns NO */ |
|
|
|
[self orderOut:self]; |
|
|
|
b_window_is_invisible = YES; |
|
|
|
//b_window_is_invisible = YES; |
|
|
|
videoRatio = NSMakeSize( 0., 0. ); |
|
|
|
} |
|
|
|
|
|
|
|
@ -102,21 +118,29 @@ |
|
|
|
if( [o_btn_play alternateImage] == o_img_play_pressed ) |
|
|
|
b_playing = YES; |
|
|
|
|
|
|
|
if( [NSColor currentControlTint] == NSGraphiteControlTint ) |
|
|
|
{ |
|
|
|
o_img_play_pressed = [NSImage imageNamed: @"play_embedded_graphite"]; |
|
|
|
o_img_pause_pressed = [NSImage imageNamed: @"pause_embedded_graphite"]; |
|
|
|
[o_btn_backward setAlternateImage: [NSImage imageNamed: @"skip_previous_embedded_graphite"]]; |
|
|
|
[o_btn_forward setAlternateImage: [NSImage imageNamed: @"skip_forward_embedded_graphite"]]; |
|
|
|
[o_btn_fullscreen setAlternateImage: [NSImage imageNamed: @"fullscreen_graphite"]]; |
|
|
|
if (MACOS_VERSION < 10.5f) { |
|
|
|
/* System is running Tiger and should use aqua buttons */ |
|
|
|
[o_btn_backward setImage: [NSImage imageNamed: @"skip_previous_active"]]; |
|
|
|
[o_btn_forward setImage: [NSImage imageNamed: @"skip_forward_active"]]; |
|
|
|
if( [NSColor currentControlTint] == NSGraphiteControlTint ) |
|
|
|
{ |
|
|
|
o_img_play_pressed = [NSImage imageNamed: @"play_graphite"]; |
|
|
|
o_img_pause_pressed = [NSImage imageNamed: @"pause_graphite"]; |
|
|
|
[o_btn_backward setAlternateImage: [NSImage imageNamed: @"skip_previous_graphite"]]; |
|
|
|
[o_btn_forward setAlternateImage: [NSImage imageNamed: @"skip_forward_graphite"]]; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
o_img_play_pressed = [NSImage imageNamed: @"play_blue"]; |
|
|
|
o_img_pause_pressed = [NSImage imageNamed: @"pause_blue"]; |
|
|
|
[o_btn_backward setAlternateImage: [NSImage imageNamed: @"skip_previous_blue"]]; |
|
|
|
[o_btn_forward setAlternateImage: [NSImage imageNamed: @"skip_forward_blue"]]; |
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
o_img_play_pressed = [NSImage imageNamed: @"play_embedded_blue"]; |
|
|
|
o_img_pause_pressed = [NSImage imageNamed: @"pause_embedded_blue"]; |
|
|
|
[o_btn_backward setAlternateImage: [NSImage imageNamed: @"skip_previous_embedded_blue"]]; |
|
|
|
[o_btn_forward setAlternateImage: [NSImage imageNamed: @"skip_forward_embedded_blue"]]; |
|
|
|
[o_btn_fullscreen setAlternateImage: [NSImage imageNamed: @"fullscreen_blue"]]; |
|
|
|
else{ |
|
|
|
/* System is running Leopard or later and should use metal buttons */ |
|
|
|
o_img_play_pressed = [NSImage imageNamed: @"play_big_down"]; |
|
|
|
o_img_pause_pressed = [NSImage imageNamed: @"pause_big_down"]; |
|
|
|
} |
|
|
|
|
|
|
|
if( b_playing ) |
|
|
|
@ -139,7 +163,7 @@ |
|
|
|
- (void)setTime:(NSString *)o_arg_time position:(float)f_position |
|
|
|
{ |
|
|
|
[o_time setStringValue: o_arg_time]; |
|
|
|
[o_slider setFloatValue: f_position]; |
|
|
|
[o_timeslider setFloatValue: f_position]; |
|
|
|
} |
|
|
|
|
|
|
|
- (void)playStatusUpdated:(int)i_status |
|
|
|
@ -162,7 +186,45 @@ |
|
|
|
{ |
|
|
|
[o_btn_forward setEnabled: b_seekable]; |
|
|
|
[o_btn_backward setEnabled: b_seekable]; |
|
|
|
[o_slider setEnabled: b_seekable]; |
|
|
|
[o_timeslider setEnabled: b_seekable]; |
|
|
|
} |
|
|
|
|
|
|
|
- (void)setScrollString:(NSString *)o_string |
|
|
|
{ |
|
|
|
[o_scrollfield setStringValue: o_string]; |
|
|
|
} |
|
|
|
|
|
|
|
- (id)getPgbar |
|
|
|
{ |
|
|
|
if( o_main_pgbar ) |
|
|
|
return o_main_pgbar; |
|
|
|
|
|
|
|
return nil; |
|
|
|
} |
|
|
|
|
|
|
|
- (void)setStop:(BOOL)b_input |
|
|
|
{ |
|
|
|
[o_btn_stop setEnabled: b_input]; |
|
|
|
} |
|
|
|
|
|
|
|
- (void)setNext:(BOOL)b_input |
|
|
|
{ |
|
|
|
[o_btn_next setEnabled: b_input]; |
|
|
|
} |
|
|
|
|
|
|
|
- (void)setPrev:(BOOL)b_input |
|
|
|
{ |
|
|
|
[o_btn_prev setEnabled: b_input]; |
|
|
|
} |
|
|
|
|
|
|
|
- (void)setVolumeEnabled:(BOOL)b_input |
|
|
|
{ |
|
|
|
[o_volumeslider setEnabled: b_input]; |
|
|
|
} |
|
|
|
|
|
|
|
- (void)setVolumeSlider:(float)f_level |
|
|
|
{ |
|
|
|
[o_volumeslider setFloatValue: f_level]; |
|
|
|
} |
|
|
|
|
|
|
|
- (BOOL)windowShouldZoom:(NSWindow *)sender toFrame:(NSRect)newFrame |
|
|
|
@ -175,7 +237,9 @@ |
|
|
|
{ |
|
|
|
playlist_t * p_playlist = pl_Hold( VLCIntf ); |
|
|
|
|
|
|
|
playlist_Stop( p_playlist ); |
|
|
|
/* Only want to stop playback if video is playing */ |
|
|
|
if( videoRatio.height != 0. && videoRatio.width != 0. ) |
|
|
|
playlist_Stop( p_playlist ); |
|
|
|
pl_Release( VLCIntf ); |
|
|
|
return YES; |
|
|
|
} |
|
|
|
@ -195,6 +259,16 @@ |
|
|
|
|
|
|
|
- (NSSize)windowWillResize:(NSWindow *)window toSize:(NSSize)proposedFrameSize |
|
|
|
{ |
|
|
|
NSView *playlist_area = [[o_vertical_split subviews] objectAtIndex:1]; |
|
|
|
NSRect newList = [playlist_area frame]; |
|
|
|
if( newList.size.height < 50 && newList.size.height > 0 ) { |
|
|
|
[self togglePlaylist:self]; |
|
|
|
} |
|
|
|
|
|
|
|
/* With no video open or with the playlist open the behavior is odd */ |
|
|
|
if( newList.size.height > 50 ) |
|
|
|
return proposedFrameSize; |
|
|
|
|
|
|
|
if( videoRatio.height == 0. || videoRatio.width == 0. ) |
|
|
|
return proposedFrameSize; |
|
|
|
|
|
|
|
@ -202,11 +276,121 @@ |
|
|
|
NSRect contentRect = [self contentRectForFrameRect:[self frame]]; |
|
|
|
float marginy = viewRect.origin.y + [self frame].size.height - contentRect.size.height; |
|
|
|
float marginx = contentRect.size.width - viewRect.size.width; |
|
|
|
|
|
|
|
proposedFrameSize.height = (proposedFrameSize.width - marginx) * videoRatio.height / videoRatio.width + marginy; |
|
|
|
|
|
|
|
return proposedFrameSize; |
|
|
|
} |
|
|
|
|
|
|
|
- (void)becomeMainWindow |
|
|
|
{ |
|
|
|
[o_sidebar_list setBackgroundColor: [NSColor colorWithCalibratedRed:0.820 |
|
|
|
green:0.843 |
|
|
|
blue:0.886 |
|
|
|
alpha:1.0]]; |
|
|
|
[o_status becomeMainWindow]; |
|
|
|
[super becomeMainWindow]; |
|
|
|
} |
|
|
|
|
|
|
|
- (void)resignMainWindow |
|
|
|
{ |
|
|
|
[o_sidebar_list setBackgroundColor: [NSColor colorWithCalibratedWhite:0.91 alpha:1.0]]; |
|
|
|
[o_status resignMainWindow]; |
|
|
|
[super resignMainWindow]; |
|
|
|
} |
|
|
|
|
|
|
|
- (float)splitView:(NSSplitView *) splitView constrainSplitPosition:(float) proposedPosition ofSubviewAt:(int) index |
|
|
|
{ |
|
|
|
if([splitView isVertical]) |
|
|
|
return proposedPosition; |
|
|
|
else { |
|
|
|
float bottom = [splitView frame].size.height - [splitView dividerThickness]; |
|
|
|
if(proposedPosition > bottom - 50) { |
|
|
|
[o_btn_playlist setState: NSOffState]; |
|
|
|
[o_searchfield setHidden:YES]; |
|
|
|
[o_playlist_view setHidden:YES]; |
|
|
|
return bottom; |
|
|
|
} |
|
|
|
else { |
|
|
|
[o_btn_playlist setState: NSOnState]; |
|
|
|
[o_searchfield setHidden:NO]; |
|
|
|
[o_playlist_view setHidden:NO]; |
|
|
|
[o_playlist swapPlaylists: o_playlist_table]; |
|
|
|
[o_vlc_main togglePlaylist:self]; |
|
|
|
return proposedPosition; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
- (void)splitViewWillResizeSubviews:(NSNotification *) notification |
|
|
|
{ |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
- (float)splitView:(NSSplitView *) splitView constrainMinCoordinate:(float) proposedMin ofSubviewAt:(int) offset |
|
|
|
{ |
|
|
|
if([splitView isVertical]) |
|
|
|
return 125.; |
|
|
|
else |
|
|
|
return 0.; |
|
|
|
} |
|
|
|
|
|
|
|
- (float)splitView:(NSSplitView *) splitView constrainMaxCoordinate:(float) proposedMax ofSubviewAt:(int) offset |
|
|
|
{ |
|
|
|
if([splitView isVertical]) |
|
|
|
return MIN([self frame].size.width - 551, 300); |
|
|
|
else |
|
|
|
return [splitView frame].size.height; |
|
|
|
} |
|
|
|
|
|
|
|
- (BOOL)splitView:(NSSplitView *) splitView canCollapseSubview:(NSView *) subview |
|
|
|
{ |
|
|
|
if([splitView isVertical]) |
|
|
|
return NO; |
|
|
|
else |
|
|
|
return NO; |
|
|
|
} |
|
|
|
|
|
|
|
- (NSRect)splitView:(NSSplitView *)splitView effectiveRect:(NSRect)proposedEffectiveRect forDrawnRect:(NSRect)drawnRect |
|
|
|
ofDividerAtIndex:(NSInteger)dividerIndex |
|
|
|
{ |
|
|
|
if([splitView isVertical]) { |
|
|
|
drawnRect.origin.x -= 3; |
|
|
|
drawnRect.size.width += 5; |
|
|
|
return drawnRect; |
|
|
|
} |
|
|
|
else |
|
|
|
return drawnRect; |
|
|
|
} |
|
|
|
|
|
|
|
- (IBAction)togglePlaylist:(id)sender |
|
|
|
{ |
|
|
|
NSView *playback_area = [[o_vertical_split subviews] objectAtIndex:0]; |
|
|
|
NSView *playlist_area = [[o_vertical_split subviews] objectAtIndex:1]; |
|
|
|
NSRect newVid = [playback_area frame]; |
|
|
|
NSRect newList = [playlist_area frame]; |
|
|
|
if(newList.size.height < 50 && sender != self && sender != o_vlc_main) { |
|
|
|
newList.size.height = newVid.size.height/2; |
|
|
|
newVid.size.height = newVid.size.height/2; |
|
|
|
newVid.origin.y = newVid.origin.y + newList.size.height; |
|
|
|
[o_btn_playlist setState: NSOnState]; |
|
|
|
[o_searchfield setHidden:NO]; |
|
|
|
[o_playlist_view setHidden:NO]; |
|
|
|
[o_playlist swapPlaylists: o_playlist_table]; |
|
|
|
[o_vlc_main togglePlaylist:self]; |
|
|
|
} |
|
|
|
else { |
|
|
|
newVid.size.height = newVid.size.height + newList.size.height; |
|
|
|
newList.size.height = 0; |
|
|
|
newVid.origin.y = 0; |
|
|
|
[o_btn_playlist setState: NSOffState]; |
|
|
|
[o_searchfield setHidden:YES]; |
|
|
|
[o_playlist_view setHidden:YES]; |
|
|
|
} |
|
|
|
[playback_area setFrame: newVid]; |
|
|
|
[playlist_area setFrame: newList]; |
|
|
|
} |
|
|
|
|
|
|
|
/***************************************************************************** |
|
|
|
* Fullscreen support |
|
|
|
*/ |
|
|
|
@ -277,9 +461,10 @@ |
|
|
|
[o_fullscreen_window setBackgroundColor: [NSColor blackColor]]; |
|
|
|
[o_fullscreen_window setCanBecomeKeyWindow: YES]; |
|
|
|
|
|
|
|
if (![self isVisible] || [self alphaValue] == 0.0) |
|
|
|
if (![self isVisible] || [self alphaValue] == 0.0 || MACOS_VERSION < 10.4f) |
|
|
|
{ |
|
|
|
/* We don't animate if we are not visible, instead we |
|
|
|
/* 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; |
|
|
|
|
|
|
|
@ -293,6 +478,8 @@ |
|
|
|
[o_temp_view setFrame:[o_view frame]]; |
|
|
|
[o_fullscreen_window setContentView:o_view]; |
|
|
|
|
|
|
|
[o_fullscreen_window makeKeyAndOrderFront:self]; |
|
|
|
|
|
|
|
[o_fullscreen_window makeKeyAndOrderFront:self]; |
|
|
|
[o_fullscreen_window orderFront:self animate:YES]; |
|
|
|
|
|
|
|
@ -308,12 +495,20 @@ |
|
|
|
} |
|
|
|
|
|
|
|
/* Make sure we don't see the o_view disappearing of the screen during this operation */ |
|
|
|
NSDisableScreenUpdates(); |
|
|
|
[[self contentView] replaceSubview:o_view with:o_temp_view]; |
|
|
|
DisableScreenUpdates(); |
|
|
|
[[self contentView] replaceSubview:o_view with:o_temp_view]; |
|
|
|
[o_temp_view setFrame:[o_view frame]]; |
|
|
|
[o_fullscreen_window setContentView:o_view]; |
|
|
|
[o_fullscreen_window makeKeyAndOrderFront:self]; |
|
|
|
NSEnableScreenUpdates(); |
|
|
|
EnableScreenUpdates(); |
|
|
|
} |
|
|
|
|
|
|
|
if (MACOS_VERSION < 10.4f) |
|
|
|
{ |
|
|
|
/* We were already fullscreen nothing to do when NSAnimation |
|
|
|
* is not supported */ |
|
|
|
[self unlockFullscreenAnimation]; |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
/* We are in fullscreen (and no animation is running) */ |
|
|
|
@ -417,9 +612,10 @@ |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
if (fadeout) |
|
|
|
if (fadeout || MACOS_VERSION < 10.4f) |
|
|
|
{ |
|
|
|
/* We don't animate if we are not visible, instead we |
|
|
|
/* 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; |
|
|
|
|
|
|
|
@ -500,7 +696,7 @@ |
|
|
|
{ |
|
|
|
/* 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 */ |
|
|
|
NSDisableScreenUpdates(); |
|
|
|
DisableScreenUpdates(); |
|
|
|
[o_view retain]; |
|
|
|
[o_view removeFromSuperviewWithoutNeedingDisplay]; |
|
|
|
[[self contentView] replaceSubview:o_temp_view with:o_view]; |
|
|
|
@ -510,7 +706,7 @@ |
|
|
|
if ([self isVisible]) |
|
|
|
[super makeKeyAndOrderFront:self]; /* our version contains a workaround */ |
|
|
|
[o_fullscreen_window orderOut: self]; |
|
|
|
NSEnableScreenUpdates(); |
|
|
|
EnableScreenUpdates(); |
|
|
|
|
|
|
|
[o_fullscreen_window release]; |
|
|
|
o_fullscreen_window = nil; |
|
|
|
@ -626,3 +822,167 @@ |
|
|
|
|
|
|
|
} |
|
|
|
@end |
|
|
|
|
|
|
|
/***************************************************************************** |
|
|
|
* embeddedbackground |
|
|
|
*****************************************************************************/ |
|
|
|
|
|
|
|
|
|
|
|
@implementation embeddedbackground |
|
|
|
|
|
|
|
- (void)dealloc |
|
|
|
{ |
|
|
|
[self unregisterDraggedTypes]; |
|
|
|
[super dealloc]; |
|
|
|
} |
|
|
|
|
|
|
|
- (void)awakeFromNib |
|
|
|
{ |
|
|
|
[self registerForDraggedTypes:[NSArray arrayWithObjects:NSTIFFPboardType, |
|
|
|
NSFilenamesPboardType, nil]]; |
|
|
|
[self addSubview: o_timeslider]; |
|
|
|
[self addSubview: o_scrollfield]; |
|
|
|
[self addSubview: o_time]; |
|
|
|
[self addSubview: o_main_pgbar]; |
|
|
|
[self addSubview: o_btn_backward]; |
|
|
|
[self addSubview: o_btn_forward]; |
|
|
|
[self addSubview: o_btn_fullscreen]; |
|
|
|
[self addSubview: o_btn_equalizer]; |
|
|
|
[self addSubview: o_btn_playlist]; |
|
|
|
[self addSubview: o_btn_play]; |
|
|
|
[self addSubview: o_btn_prev]; |
|
|
|
[self addSubview: o_btn_stop]; |
|
|
|
[self addSubview: o_btn_next]; |
|
|
|
[self addSubview: o_btn_volume_down]; |
|
|
|
[self addSubview: o_volumeslider]; |
|
|
|
[self addSubview: o_btn_volume_up]; |
|
|
|
[self addSubview: o_searchfield]; |
|
|
|
} |
|
|
|
|
|
|
|
- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender |
|
|
|
{ |
|
|
|
if ((NSDragOperationGeneric & [sender draggingSourceOperationMask]) |
|
|
|
== NSDragOperationGeneric) |
|
|
|
{ |
|
|
|
return NSDragOperationGeneric; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
return NSDragOperationNone; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
- (BOOL)prepareForDragOperation:(id <NSDraggingInfo>)sender |
|
|
|
{ |
|
|
|
return YES; |
|
|
|
} |
|
|
|
|
|
|
|
- (BOOL)performDragOperation:(id <NSDraggingInfo>)sender |
|
|
|
{ |
|
|
|
NSPasteboard *o_paste = [sender draggingPasteboard]; |
|
|
|
NSArray *o_types = [NSArray arrayWithObjects: NSFilenamesPboardType, nil]; |
|
|
|
NSString *o_desired_type = [o_paste availableTypeFromArray:o_types]; |
|
|
|
NSData *o_carried_data = [o_paste dataForType:o_desired_type]; |
|
|
|
BOOL b_autoplay = config_GetInt( VLCIntf, "macosx-autoplay" ); |
|
|
|
|
|
|
|
if( o_carried_data ) |
|
|
|
{ |
|
|
|
if ([o_desired_type isEqualToString:NSFilenamesPboardType]) |
|
|
|
{ |
|
|
|
int i; |
|
|
|
NSArray *o_array = [NSArray array]; |
|
|
|
NSArray *o_values = [[o_paste propertyListForType: NSFilenamesPboardType] |
|
|
|
sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; |
|
|
|
|
|
|
|
for( i = 0; i < (int)[o_values count]; i++) |
|
|
|
{ |
|
|
|
NSDictionary *o_dic; |
|
|
|
o_dic = [NSDictionary dictionaryWithObject:[o_values objectAtIndex:i] forKey:@"ITEM_URL"]; |
|
|
|
o_array = [o_array arrayByAddingObject: o_dic]; |
|
|
|
} |
|
|
|
if( b_autoplay ) |
|
|
|
[[[VLCMain sharedInstance] playlist] appendArray: o_array atPos: -1 enqueue:NO]; |
|
|
|
else |
|
|
|
[[[VLCMain sharedInstance] playlist] appendArray: o_array atPos: -1 enqueue:YES]; |
|
|
|
return YES; |
|
|
|
} |
|
|
|
} |
|
|
|
[self setNeedsDisplay:YES]; |
|
|
|
return YES; |
|
|
|
} |
|
|
|
|
|
|
|
- (void)concludeDragOperation:(id <NSDraggingInfo>)sender |
|
|
|
{ |
|
|
|
[self setNeedsDisplay:YES]; |
|
|
|
} |
|
|
|
|
|
|
|
- (void)drawRect:(NSRect)rect |
|
|
|
{ |
|
|
|
NSImage *leftImage = [NSImage imageNamed:@"display_left"]; |
|
|
|
NSImage *middleImage = [NSImage imageNamed:@"display_middle"]; |
|
|
|
NSImage *rightImage = [NSImage imageNamed:@"display_right"]; |
|
|
|
[middleImage setSize:NSMakeSize(NSWidth( [self bounds] ) - 134 - [leftImage size].width - [rightImage size].width, [middleImage size].height)]; |
|
|
|
[middleImage setScalesWhenResized:YES]; |
|
|
|
[leftImage compositeToPoint:NSMakePoint( 122., 40. ) operation:NSCompositeSourceOver]; |
|
|
|
[middleImage compositeToPoint:NSMakePoint( 122. + [leftImage size].width, 40. ) operation:NSCompositeSourceOver]; |
|
|
|
[rightImage compositeToPoint:NSMakePoint( NSWidth( [self bounds] ) - 12 - [rightImage size].width, 40. ) operation:NSCompositeSourceOver]; |
|
|
|
} |
|
|
|
|
|
|
|
- (void)mouseDown:(NSEvent *)event |
|
|
|
{ |
|
|
|
dragStart = [self convertPoint:[event locationInWindow] fromView:nil]; |
|
|
|
} |
|
|
|
|
|
|
|
- (void)mouseDragged:(NSEvent *)event |
|
|
|
{ |
|
|
|
NSPoint dragLocation = [self convertPoint:[event locationInWindow] fromView:nil]; |
|
|
|
NSPoint winOrigin = [o_window frame].origin; |
|
|
|
|
|
|
|
NSPoint newOrigin = NSMakePoint(winOrigin.x + (dragLocation.x - dragStart.x), |
|
|
|
winOrigin.y + (dragLocation.y - dragStart.y)); |
|
|
|
[o_window setFrameOrigin: newOrigin]; |
|
|
|
} |
|
|
|
|
|
|
|
@end |
|
|
|
|
|
|
|
/***************************************************************************** |
|
|
|
* statusbar |
|
|
|
*****************************************************************************/ |
|
|
|
|
|
|
|
|
|
|
|
@implementation statusbar |
|
|
|
- (void)awakeFromNib |
|
|
|
{ |
|
|
|
[self addSubview: o_text]; |
|
|
|
mainwindow = YES; |
|
|
|
} |
|
|
|
|
|
|
|
- (void)resignMainWindow |
|
|
|
{ |
|
|
|
mainwindow = NO; |
|
|
|
[self needsDisplay]; |
|
|
|
} |
|
|
|
|
|
|
|
- (void)becomeMainWindow |
|
|
|
{ |
|
|
|
mainwindow = YES; |
|
|
|
[self needsDisplay]; |
|
|
|
} |
|
|
|
|
|
|
|
- (void)drawRect:(NSRect)rect |
|
|
|
{ |
|
|
|
if(mainwindow) |
|
|
|
[[NSColor colorWithCalibratedRed:0.820 |
|
|
|
green:0.843 |
|
|
|
blue:0.886 |
|
|
|
alpha:1.0] set]; |
|
|
|
else |
|
|
|
[[NSColor colorWithCalibratedWhite:0.91 alpha:1.0] set]; |
|
|
|
NSRectFill(rect); |
|
|
|
/*NSRect divider = rect; |
|
|
|
divider.origin.y += divider.size.height - 1; |
|
|
|
divider.size.height = 1; |
|
|
|
[[NSColor colorWithCalibratedWhite:0.65 alpha:1.] set]; |
|
|
|
NSRectFill(divider);*/ |
|
|
|
} |
|
|
|
@end |
|
|
|
|