if( nib_main_loaded ) return;
[self initStrings];
- [o_window setExcludedFromWindowsMenu: TRUE];
- [o_msgs_panel setExcludedFromWindowsMenu: TRUE];
+
+ [o_window setExcludedFromWindowsMenu: YES];
+ [o_msgs_panel setExcludedFromWindowsMenu: YES];
[o_msgs_panel setDelegate: self];
i_key = config_GetInt( p_intf, "key-quit" );
[o_window setDelegate: self];
b_restore_size = false;
- if( [o_window frame].size.height <= 200 )
+
+ // Set that here as IB seems to be buggy
+ [o_window setContentMinSize:NSMakeSize(338., 30.)];
+
+ if( [o_window contentRectForFrameRect:[o_window frame]].size.height <= 169. )
{
b_small_window = YES;
[o_window setFrame: NSMakeRect( [o_window frame].origin.x,
else
{
b_small_window = NO;
- [o_playlist_view setFrame: NSMakeRect( 0, 0, [o_window frame].size.width, [o_window frame].size.height - 95 )];
+ NSRect contentRect = [o_window contentRectForFrameRect:[o_window frame]];
+ [o_playlist_view setFrame: NSMakeRect( 0, 0, contentRect.size.width, contentRect.size.height - [o_window contentMinSize].height )];
[o_playlist_view setNeedsDisplay:YES];
[o_playlist_view setAutoresizesSubviews: YES];
[[o_window contentView] addSubview: o_playlist_view];
}
+
[self updateTogglePlaylistState];
- o_size_with_playlist = [o_window frame].size;
+ o_size_with_playlist = [o_window contentRectForFrameRect:[o_window frame]].size;
p_playlist = pl_Yield( p_intf );
nib_main_loaded = TRUE;
}
+#pragma mark Toolbar delegate
+/* Our item identifiers */
+static NSString * VLCToolbarMediaControl = @"VLCToolbarMediaControl";
+
+- (NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar *)toolbar
+{
+ return [NSArray arrayWithObjects:
+// NSToolbarCustomizeToolbarItemIdentifier,
+// NSToolbarFlexibleSpaceItemIdentifier,
+// NSToolbarSpaceItemIdentifier,
+// NSToolbarSeparatorItemIdentifier,
+ VLCToolbarMediaControl,
+ nil ];
+}
+
+- (NSArray *) toolbarDefaultItemIdentifiers: (NSToolbar *) toolbar
+{
+ return [NSArray arrayWithObjects:
+ VLCToolbarMediaControl,
+ nil ];
+}
+
+- (NSToolbarItem *) toolbar:(NSToolbar *)toolbar itemForItemIdentifier:(NSString *)itemIdentifier willBeInsertedIntoToolbar:(BOOL)flag
+{
+ NSToolbarItem *toolbarItem = [[[NSToolbarItem alloc] initWithItemIdentifier: itemIdentifier] autorelease];
+
+
+ if( [itemIdentifier isEqual: VLCToolbarMediaControl] )
+ {
+ [toolbarItem setLabel:@"Media Controls"];
+ [toolbarItem setPaletteLabel:@"Media Controls"];
+
+ NSSize size = toolbarMediaControl.frame.size;
+ [toolbarItem setView:toolbarMediaControl];
+ [toolbarItem setMinSize:size];
+ size.width += 1000.;
+ [toolbarItem setMaxSize:size];
+
+ // Hack: For some reason we need to make sure
+ // that the those element are on top
+ // Add them again will put them frontmost
+ [toolbarMediaControl addSubview:o_scrollfield];
+ [toolbarMediaControl addSubview:o_timeslider];
+ [toolbarMediaControl addSubview:o_timefield];
+ [toolbarMediaControl addSubview:o_main_pgbar];
+
+ /* TODO: setup a menu */
+ }
+ else
+ {
+ /* itemIdentifier referred to a toolbar item that is not
+ * provided or supported by us or Cocoa
+ * Returning nil will inform the toolbar
+ * that this kind of item is not supported */
+ toolbarItem = nil;
+ }
+ return toolbarItem;
+}
+
+#pragma mark -
+
- (void)controlTintChanged
{
BOOL b_playing = NO;
- (void)initStrings
{
- [o_window setTitle: _NS("VLC - Controller")];
+ [o_window setTitle: _NS("VLC")];
[self setScrollField:_NS("VLC media player") stopAfter:-1];
/* button controls */
/* TODO: fix i_size use */
b_plmul = p_playlist->items.i_size > 1;
- p_input = vlc_object_find( p_playlist, VLC_OBJECT_INPUT,
- FIND_CHILD );
-
+ p_input = playlist_CurrentInput( p_playlist );
+ bool b_buffering = NO;
+
if( ( b_input = ( p_input != NULL ) ) )
{
+ /* seekable streams */
+ int state = input_GetState( p_input );
+ if ( state == INIT_S ||
+ state == OPENING_S ||
+ state == BUFFERING_S )
+ {
+ b_buffering = YES;
+ }
+
/* seekable streams */
b_seekable = var_GetBool( p_input, "seekable" );
}
pl_Release( p_intf );
+ if( b_buffering )
+ {
+ [o_main_pgbar startAnimation:self];
+ [o_main_pgbar setIndeterminate:YES];
+ [o_main_pgbar setHidden:NO];
+ }
+ else
+ {
+ [o_main_pgbar stopAnimation:self];
+ [o_main_pgbar setHidden:YES];
+ }
+
[o_btn_stop setEnabled: b_input];
[o_btn_ff setEnabled: b_seekable];
[o_btn_rewind setEnabled: b_seekable];
{
static char mail[] =
"From: vlcuser <vlcuser@videolan.org>\n"
- "To: videolan <apple-bugreport@videolan.org>\n"
- "Subject: Crash Report (Type Ctrl-shift-D and hit send)\n"
+ "To: VideoLAN Crash Report <apple-bugreport@videolan.org>\n"
+ "Subject: %@\n"
"Content-Type: text/plain; charset=ISO-8859-1; format=flowed\n"
"Content-Transfer-Encoding: 7bit\n"
"\n"
- "(Type Ctrl-shift-D and hit send)\n\n"
+ "%@\n\n"
"User Comment:\n%@\n--------------\n"
"\n"
"Crash log:\n%@\n--------------\n"
"\n"
"\n";
NSString * mailPath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"vlc_crash_mail.eml"];
- NSString * mailContent = [NSString stringWithFormat:[NSString stringWithUTF8String:mail], userComment, crashLog];
+ NSString * mailContent = [NSString stringWithFormat:[NSString stringWithUTF8String:mail],
+ _NS("Crash Report (Type Command-shift-D and hit send)"),
+ _NS("Type Command-shift-D (or in Menu \"Message\">\"Send Again\") and hit the \"Send Mail\" button."),
+ userComment, crashLog];
BOOL ret = [mailContent writeToFile:mailPath atomically:YES encoding:NSUTF8StringEncoding error:nil];
if( !ret )
{
NSString * crashReporter = [@"~/Library/Logs/CrashReporter" stringByExpandingTildeInPath];
NSDirectoryEnumerator *direnum = [[NSFileManager defaultManager] enumeratorAtPath:crashReporter];
NSString *fname;
- BOOL found = NO;
NSString * latestLog = nil;
NSInteger year = !previouslySeen ? [[NSUserDefaults standardUserDefaults] integerForKey:@"LatestCrashReportYear"] : 0;
NSInteger month = !previouslySeen ? [[NSUserDefaults standardUserDefaults] integerForKey:@"LatestCrashReportMonth"]: 0;
if([fname hasPrefix:@"VLC"] && [fname hasSuffix:@"crash"])
{
NSArray * compo = [fname componentsSeparatedByString:@"_"];
- if( [compo count] < 3 ) { found = NO; break; }
+ if( [compo count] < 3 ) continue;
compo = [[compo objectAtIndex:1] componentsSeparatedByString:@"-"];
- if( [compo count] < 4 ) { found = NO; break; }
- if( year < [[compo objectAtIndex:0] intValue] &&
- month < [[compo objectAtIndex:1] intValue] &&
- day < [[compo objectAtIndex:2] intValue] &&
- hours < [[compo objectAtIndex:3] intValue] )
+ if( [compo count] < 4 ) continue;
+
+ // Dooh. ugly.
+ if( year < [[compo objectAtIndex:0] intValue] ||
+ (year ==[[compo objectAtIndex:0] intValue] &&
+ (month < [[compo objectAtIndex:1] intValue] ||
+ (month ==[[compo objectAtIndex:1] intValue] &&
+ (day < [[compo objectAtIndex:2] intValue] ||
+ (day ==[[compo objectAtIndex:2] intValue] &&
+ hours < [[compo objectAtIndex:3] intValue] ))))))
{
year = [[compo objectAtIndex:0] intValue];
month = [[compo objectAtIndex:1] intValue];
day = [[compo objectAtIndex:2] intValue];
hours = [[compo objectAtIndex:3] intValue];
latestLog = [crashReporter stringByAppendingPathComponent:fname];
- found = YES;
}
}
}
- if(!(found && [[NSFileManager defaultManager] fileExistsAtPath: latestLog]))
+ if(!(latestLog && [[NSFileManager defaultManager] fileExistsAtPath:latestLog]))
return nil;
if( !previouslySeen )
[pool release];
}
-- (void)notifyCrashLogToUser:(NSString *)crashLog
+- (void)notifyCrashLogToUser:(NSString *)crashLogPath
{
int ret = NSRunInformationalAlertPanel(_NS("VLC has previously crashed"),
_NS("VLC has previously crashed, do you want to send an email with the crash to VLC's team?"),
_NS("Send"), _NS("Don't Send"), nil, nil);
if( ret == NSAlertDefaultReturn )
{
- [self mailCrashLog:crashLog withUserComment:@"<Explain here what you were doing when VLC crashed>"];
+ [self mailCrashLog:[NSString stringWithContentsOfFile:crashLogPath] withUserComment:_NS("<Explain here what you were doing when VLC crashed, with possibly a link to the failing video>")];
}
}
}
}
+#pragma mark Playlist toggling
+
- (IBAction)togglePlaylist:(id)sender
{
- NSRect o_rect = [o_window frame];
+ NSRect contentRect = [o_window contentRectForFrameRect:[o_window frame]];
+ NSRect o_rect = [o_window contentRectForFrameRect:[o_window frame]];
/*First, check if the playlist is visible*/
- if( o_rect.size.height <= 200 )
+ if( contentRect.size.height <= 169. )
{
- o_restore_rect = o_rect;
+ o_restore_rect = contentRect;
b_restore_size = true;
b_small_window = YES; /* we know we are small, make sure this is actually set (see case below) */
+
/* make large */
- if( o_size_with_playlist.height > 200 )
- {
+ if( o_size_with_playlist.height > 169. )
o_rect.size.height = o_size_with_playlist.height;
- } else {
- o_rect.size.height = 500;
- }
+ else
+ o_rect.size.height = 500.;
- if( o_size_with_playlist.width > [o_window minSize].width )
- {
+ if( o_size_with_playlist.width >= [o_window contentMinSize].width )
o_rect.size.width = o_size_with_playlist.width;
- } else {
- o_rect.size.width = 500;
- }
-
- o_rect.size.height = (o_size_with_playlist.height > 200) ?
- o_size_with_playlist.height : 500;
- o_rect.origin.x = [o_window frame].origin.x;
- o_rect.origin.y = [o_window frame].origin.y - o_rect.size.height +
- [o_window minSize].height;
+ else
+ o_rect.size.width = [o_window contentMinSize].width;
+
+ o_rect.origin.x = contentRect.origin.x;
+ o_rect.origin.y = contentRect.origin.y - o_rect.size.height +
+ [o_window contentMinSize].height;
+
+ o_rect = [o_window frameRectForContentRect:o_rect];
NSRect screenRect = [[o_window screen] visibleFrame];
if( !NSContainsRect( screenRect, o_rect ) ) {
else
{
NSSize curSize = o_rect.size;
- /* make small */
- o_rect.size.height = [o_window minSize].height;
- o_rect.size.width = [o_window minSize].width;
- o_rect.origin.x = [o_window frame].origin.x;
- /* Calculate the position of the lower right corner after resize */
- o_rect.origin.y = [o_window frame].origin.y +
- [o_window frame].size.height - [o_window minSize].height;
-
if( b_restore_size )
+ {
o_rect = o_restore_rect;
+ if( o_rect.size.height < [o_window contentMinSize].height )
+ o_rect.size.height = [o_window contentMinSize].height;
+ if( o_rect.size.width < [o_window contentMinSize].width )
+ o_rect.size.width = [o_window contentMinSize].width;
+ }
+ else
+ {
+ NSRect contentRect = [o_window contentRectForFrameRect:[o_window frame]];
+ /* make small */
+ o_rect.size.height = [o_window contentMinSize].height;
+ o_rect.size.width = [o_window contentMinSize].width;
+ o_rect.origin.x = contentRect.origin.x;
+ /* Calculate the position of the lower right corner after resize */
+ o_rect.origin.y = contentRect.origin.y +
+ contentRect.size.height - [o_window contentMinSize].height;
+ }
[o_playlist_view setAutoresizesSubviews: NO];
[o_playlist_view removeFromSuperview];
[o_btn_playlist setState: NO];
b_small_window = NO; /* we aren't small here just yet. we are doing an animated resize after this */
+ o_rect = [o_window frameRectForContentRect:o_rect];
}
[o_window setFrame: o_rect display:YES animate: YES];
- (void)updateTogglePlaylistState
{
- if( [o_window frame].size.height <= 200 )
+ if( [o_window contentRectForFrameRect:[o_window frame]].size.height <= 169. )
{
[o_btn_playlist setState: NO];
}
- (NSSize)windowWillResize:(NSWindow *)sender toSize:(NSSize)proposedFrameSize
{
+
/* Not triggered on a window resize or maxification of the window. only by window mouse dragging resize */
/*Stores the size the controller one resize, to be able to restore it when
toggling the playlist*/
o_size_with_playlist = proposedFrameSize;
- if( proposedFrameSize.height <= 200 )
+ NSRect rect;
+ rect.size = proposedFrameSize;
+ if( [o_window contentRectForFrameRect:rect].size.height <= 169. )
{
if( b_small_window == NO )
{
{
/* If large and coming from small then show */
[o_playlist_view setAutoresizesSubviews: YES];
- [o_playlist_view setFrame: NSMakeRect( 0, 0, [o_window frame].size.width, [o_window frame].size.height - [o_window minSize].height )];
+ NSRect contentRect = [o_window contentRectForFrameRect:[o_window frame]];
+ [o_playlist_view setFrame: NSMakeRect( 0, 0, contentRect.size.width, contentRect.size.height - [o_window contentMinSize].height )];
[o_playlist_view setNeedsDisplay:YES];
[[o_window contentView] addSubview: o_playlist_view];
b_small_window = NO;
[self updateTogglePlaylistState];
}
+#pragma mark -
+
@end
@implementation VLCMain (NSMenuValidation)