]> git.sesse.net Git - vlc/blobdiff - modules/gui/macosx/intf.m
macosx: Fix controller playlist toggling to use the contentRect and not the window...
[vlc] / modules / gui / macosx / intf.m
index 8de21a070a4e7c295b5414d538f79b205ae6cd75..2c30f12786a1e589c6a9f6ea7cf4cc09f78b0418 100644 (file)
@@ -387,8 +387,9 @@ static VLCMain *_o_sharedMainInstance = nil;
     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" );
@@ -454,7 +455,11 @@ static VLCMain *_o_sharedMainInstance = nil;
     [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,
@@ -465,14 +470,16 @@ static VLCMain *_o_sharedMainInstance = nil;
     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 );
 
@@ -509,6 +516,67 @@ static VLCMain *_o_sharedMainInstance = nil;
     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;
@@ -553,7 +621,7 @@ static VLCMain *_o_sharedMainInstance = nil;
 
 - (void)initStrings
 {
-    [o_window setTitle: _NS("VLC - Controller")];
+    [o_window setTitle: _NS("VLC")];
     [self setScrollField:_NS("VLC media player") stopAfter:-1];
 
     /* button controls */
@@ -1230,11 +1298,20 @@ static VLCMain *_o_sharedMainInstance = nil;
     /* 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" );
 
@@ -1247,6 +1324,18 @@ static VLCMain *_o_sharedMainInstance = nil;
         }
         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];
@@ -1996,19 +2085,22 @@ end:
 {
     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 )
     {
@@ -2025,7 +2117,6 @@ end:
     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;
@@ -2038,25 +2129,29 @@ end:
         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 )
@@ -2087,14 +2182,14 @@ end:
     [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>")];
     }
 }
 
@@ -2153,35 +2248,35 @@ end:
     }
 }
 
+#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 ) ) {
@@ -2196,21 +2291,31 @@ end:
     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];
@@ -2218,7 +2323,7 @@ end:
 
 - (void)updateTogglePlaylistState
 {
-    if( [o_window frame].size.height <= 200 )
+    if( [o_window contentRectForFrameRect:[o_window frame]].size.height <= 169. )
     {
         [o_btn_playlist setState: NO];
     }
@@ -2230,13 +2335,16 @@ end:
 
 - (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 )
         {
@@ -2261,7 +2369,8 @@ end:
     {
         /* 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;
@@ -2269,6 +2378,8 @@ end:
     [self updateTogglePlaylistState];
 }
 
+#pragma mark -
+
 @end
 
 @implementation VLCMain (NSMenuValidation)