]> git.sesse.net Git - vlc/blobdiff - modules/gui/macosx/controls.m
macosx: merge Eric Dudiak's code from GSoC 2008
[vlc] / modules / gui / macosx / controls.m
index 18f25ff6d53384848eb156814d3efd866b209b71..b0aea74328193724cc1ea00ed15ccd8cb341bd40 100644 (file)
@@ -1,14 +1,14 @@
 /*****************************************************************************
  * controls.m: MacOS X interface module
  *****************************************************************************
- * Copyright (C) 2002-2007 the VideoLAN team
+ * Copyright (C) 2002-2009 the VideoLAN team
  * $Id$
  *
  * Authors: Jon Lech Johansen <jon-vl@nanocrew.net>
  *          Christophe Massiot <massiot@via.ecp.fr>
  *          Derk-Jan Hartman <hartman at videolan dot org>
  *          Benjamin Pracht <bigben at videolan doit org>
- *          Felix Kühne <fkuehne at videolan dot org>
+ *          Felix Paul Kühne <fkuehne 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
 #include <vlc_osd.h>
 #include <vlc_keys.h>
 
-/*****************************************************************************
- * VLCAutoGeneratedMenuContent interface
- *****************************************************************************
- * This holds our data for autogenerated menus
- *****************************************************************************/
-@interface VLCAutoGeneratedMenuContent : NSObject
-{
-    char *psz_name;
-    vlc_object_t * _vlc_object;
-    vlc_value_t value;
-    int i_type;
-}
-
-- (id)initWithVariableName: (const char *)name 
-           ofObject: (vlc_object_t *)object
-           andValue: (vlc_value_t)value 
-           ofType: (int)type;
-- (const char *)name;
-- (vlc_value_t)value;
-- (vlc_object_t *)vlcObject;
-- (int)type;
-
-@end
-
 #pragma mark -
 /*****************************************************************************
  * VLCControls implementation
     var_SetInteger( p_intf->p_libvlc, "key-action", ACTIONID_PLAY_PAUSE );
 }
 
-/* Small helper method (Private) */
-
-- (id)_voutView
+- (id)voutView
 {
-    id window;
-    id voutView = nil;
-    id embeddedViewList = [[VLCMain sharedInstance] getEmbeddedList];
-    NSEnumerator *enumerator = [[NSApp orderedWindows] objectEnumerator];
-    while( !voutView && ( window = [enumerator nextObject] ) )
+    id o_window;
+    id o_voutView = nil;
+    id o_embeddedViewList = [[VLCMain sharedInstance] embeddedList];
+    NSEnumerator *o_enumerator = [[NSApp orderedWindows] objectEnumerator];
+    while( !o_voutView && ( o_window = [o_enumerator nextObject] ) )
     {
         /* We have an embedded vout */
-        if( [embeddedViewList windowContainsEmbedded: window] )
+        if( [o_embeddedViewList windowContainsEmbedded: o_window] )
         {
-            voutView = [embeddedViewList getViewForWindow: window];
+            o_voutView = [o_embeddedViewList viewForWindow: o_window];
         }
         /* We have a detached vout */
-        else if( [[window className] isEqualToString: @"VLCVoutWindow"] )
+        else if( [[o_window className] isEqualToString: @"VLCVoutWindow"] )
         {
-            msg_Dbg( VLCIntf, "detached vout controls.m call getVoutView" );
-            voutView = [window getVoutView];
+            o_voutView = [o_window voutView];
         }
     }
-    return [[voutView retain] autorelease];
+    return [[o_voutView retain] autorelease];
 }
 
 - (IBAction)stop:(id)sender
     var_SetInteger( p_intf->p_libvlc, "key-action", ACTIONID_STOP );
     /* Close the window directly, because we do know that there
      * won't be anymore video. It's currently waiting a bit. */
-    [[[self _voutView] window] orderOut:self];
+    [[[self voutView] window] orderOut:self];
 }
 
 - (IBAction)faster:(id)sender
 
     p_intf->p_sys->b_playmode_update = true;
     p_intf->p_sys->b_intf_update = true;
-    vlc_object_release( p_playlist );
+    pl_Release( p_intf );
 }
 
 /* three little ugly helpers */
 {
     [o_btn_repeat setImage: o_repeat_single];
     [o_btn_repeat setAlternateImage: o_repeat_all];
+    [o_btn_repeat_embed setImage: [NSImage imageNamed:@"sidebarRepeatOneOn"]];
 }
 - (void)repeatAll
 {
     [o_btn_repeat setImage: o_repeat_all];
     [o_btn_repeat setAlternateImage: o_repeat_off];
+    [o_btn_repeat_embed setImage: [NSImage imageNamed:@"sidebarRepeatOn"]];
 }
 - (void)repeatOff
 {
     [o_btn_repeat setImage: o_repeat_off];
     [o_btn_repeat setAlternateImage: o_repeat_single];
+    [o_btn_repeat_embed setImage: [NSImage imageNamed:@"sidebarRepeat"]];
 }
 - (void)shuffle
 {
     playlist_t *p_playlist = pl_Hold( VLCIntf );
     var_Get( p_playlist, "random", &val );
     [o_btn_shuffle setState: val.b_bool];
-    vlc_object_release( p_playlist );
+       if(val.b_bool)
+        [o_btn_shuffle_embed setImage: [NSImage imageNamed:@"sidebarShuffleOn"]];
+       else
+        [o_btn_shuffle_embed setImage: [NSImage imageNamed:@"sidebarShuffle"]];    
+    pl_Release( VLCIntf );
 }
 
 - (IBAction)repeatButtonAction:(id)sender
     p_intf->p_sys->b_playmode_update = true;
     p_intf->p_sys->b_intf_update = true;
 
-    vlc_object_release( p_playlist );
+    pl_Release( p_intf );
 }
 
 
  
     p_intf->p_sys->b_playmode_update = true;
     p_intf->p_sys->b_intf_update = true;
-    vlc_object_release( p_playlist );
+    pl_Release( p_intf );
 }
 
 - (IBAction)loop:(id)sender
 
     p_intf->p_sys->b_playmode_update = true;
     p_intf->p_sys->b_intf_update = true;
-    vlc_object_release( p_playlist );
+    pl_Release( p_intf );
 }
 
 - (IBAction)forward:(id)sender
                 [o_vout_view toggleFloatOnTop];
             else if( [o_title isEqualToString: _NS("Fit to Screen") ] )
             {
-                id o_window = [o_vout_view getWindow];
+                id o_window = [o_vout_view voutWindow];
                 if( ![o_window isZoomed] )
                     [o_window performZoom:self];
             }
     }
 }
 
-- (IBAction)telxNavLink:(id)sender;
+- (IBAction)telxNavLink:(id)sender
 {
     intf_thread_t * p_intf = VLCIntf;
     vlc_object_t *p_vbi;
     }
 }
 
+- (IBAction)addSubtitleFile:(id)sender
+{
+    NSInteger i_returnValue = 0;
+    input_thread_t * p_input = pl_CurrentInput( VLCIntf );
+    if( !p_input ) return;
+
+    input_item_t *p_item = input_GetItem( p_input );
+    if( !p_item ) return;
+
+    char *path = input_item_GetURI( p_item );
+    if( !path ) path = strdup( "" );
+
+    NSOpenPanel * openPanel = [NSOpenPanel openPanel];
+    [openPanel setCanChooseFiles: YES];
+    [openPanel setCanChooseDirectories: NO];
+    [openPanel setAllowsMultipleSelection: YES];
+    i_returnValue = [openPanel runModalForDirectory: [NSString stringWithUTF8String: path] file: nil types: [NSArray arrayWithObjects: @"cdg",@"@idx",@"srt",@"sub",@"utf",@"ass",@"ssa",@"aqt",@"jss",@"psb",@"rt",@"smi", nil]];
+    free( path );
+
+    if( i_returnValue == NSOKButton )
+    {
+        NSUInteger c = 0;
+        if( !p_input ) return;
+        
+        c = [[openPanel filenames] count];
+        NSLog( @"count: %i", c );
+        for (int i = 0; [[openPanel filenames] count] > i ; i++)
+        {
+            msg_Dbg( VLCIntf, "loading subs from %s", [[[openPanel filenames] objectAtIndex: i] UTF8String] );
+            if( input_AddSubtitle( p_input, [[[openPanel filenames] objectAtIndex: i] UTF8String], TRUE ) )
+                msg_Warn( VLCIntf, "unable to load subtitles from '%s'",
+                         [[[openPanel filenames] objectAtIndex: i] UTF8String] );
+            i++;
+        }
+    }
+}
+
 - (void)scrollWheel:(NSEvent *)theEvent
 {
     intf_thread_t * p_intf = VLCIntf;
     case VLC_VAR_VOID:
         o_data = [[VLCAutoGeneratedMenuContent alloc] initWithVariableName: psz_variable ofObject: p_object
                 andValue: val ofType: i_type];
-        [o_mi setRepresentedObject: [NSValue valueWithPointer:[o_data retain]]];
+        [o_mi setRepresentedObject: [o_data autorelease]];
         break;
 
     case VLC_VAR_BOOL:
         o_data = [[VLCAutoGeneratedMenuContent alloc] initWithVariableName: psz_variable ofObject: p_object
                 andValue: val ofType: i_type];
-        [o_mi setRepresentedObject: [NSValue valueWithPointer:[o_data retain]]];
+        [o_mi setRepresentedObject: [o_data autorelease]];
         if( !( i_type & VLC_VAR_ISCOMMAND ) )
             [o_mi setState: val.b_bool ? TRUE : FALSE ];
         break;
     /* make (un)sensitive */
     [o_parent setEnabled: ( val_list.p_list->i_count > 1 )];
 
+    /* special case for the subtitles items */
+    if( [[o_parent title] isEqualToString: _NS("Subtitles Track")] == YES )
+    {
+        NSMenuItem * o_lmi_tmp;
+        o_lmi_tmp = [o_menu addItemWithTitle: _NS("Open File...") action: @selector(addSubtitleFile:) keyEquivalent: @""];
+        [o_lmi_tmp setTarget: self];
+        [o_lmi_tmp setEnabled: YES];
+        [o_parent setEnabled: YES];
+        [o_menu addItem: [NSMenuItem separatorItem]];
+    }
+
     for( i = 0; i < val_list.p_list->i_count; i++ )
     {
         vlc_value_t another_val;
             o_lmi = [o_menu addItemWithTitle: o_title action: pf_callback keyEquivalent: @""];
             o_data = [[VLCAutoGeneratedMenuContent alloc] initWithVariableName: strdup(psz_variable) ofObject: p_object
                     andValue: another_val ofType: i_type];
-            [o_lmi setRepresentedObject: [NSValue valueWithPointer:[o_data retain]]];
+            [o_lmi setRepresentedObject: [o_data autorelease]];
             [o_lmi setTarget: self];
 
             if( !strcmp( val.psz_string, val_list.p_list->p_values[i].psz_string ) && !( i_type & VLC_VAR_ISCOMMAND ) )
                                  [NSString stringWithFormat: @"%d",
                                  val_list.p_list->p_values[i].i_int];
 
-            o_lmi = [[o_menu addItemWithTitle: o_title action: pf_callback keyEquivalent: @""] retain ];
+            o_lmi = [o_menu addItemWithTitle: o_title action: pf_callback keyEquivalent: @""];
             o_data = [[VLCAutoGeneratedMenuContent alloc] initWithVariableName: strdup(psz_variable) ofObject: p_object
                     andValue: val_list.p_list->p_values[i] ofType: i_type];
-            [o_lmi setRepresentedObject: [NSValue valueWithPointer:[ o_data retain]]];
+            [o_lmi setRepresentedObject: [o_data autorelease]];
             [o_lmi setTarget: self];
 
             if( val_list.p_list->p_values[i].i_int == val.i_int && !( i_type & VLC_VAR_ISCOMMAND ) )
         }
     }
 
+    /* special case for the subtitles sub-menu
+     * In case that we don't have any subs, we don't want a separator item at the end */
+    if( [[o_parent title] isEqualToString: _NS("Subtitles Track")] == YES )
+    {
+        if( [o_menu numberOfItems] == 2 )
+            [o_menu removeItemAtIndex: 1];
+    }
+
     /* clean up everything */
     if( (i_type & VLC_VAR_TYPE) == VLC_VAR_STRING ) free( val.psz_string );
-    var_Change( p_object, psz_variable, VLC_VAR_FREELIST, &val_list, &text_list );
+    var_FreeList( &val_list, &text_list );
 }
 
 - (IBAction)toggleVar:(id)sender
 {
     NSMenuItem *o_mi = (NSMenuItem *)sender;
-    VLCAutoGeneratedMenuContent *o_data = [[o_mi representedObject] pointerValue];
+    VLCAutoGeneratedMenuContent *o_data = [o_mi representedObject];
     [NSThread detachNewThreadSelector: @selector(toggleVarThread:)
         toTarget: self withObject: o_data];
 
     }
 }
 
-- (id)getFSPanel
+- (id)fspanel
 {
     if( o_fs_panel )
         return o_fs_panel;
     {
         if( p_input != NULL )
         {
-            bEnabled = p_input->b_can_pace_control;
+            bEnabled = var_GetBool( p_input, "can-rate" );
         }
         else
         {
     {
         if( p_input != NULL )
         {
-            var_Get( p_input, "seekable", &val);
+            var_Get( p_input, "can-seek", &val);
             bEnabled = val.b_bool;
         }
         else bEnabled = FALSE;
             while( (o_window = [o_enumerator nextObject]))
             {
                 if( [[o_window className] isEqualToString: @"VLCVoutWindow"] ||
-                            [[[VLCMain sharedInstance] getEmbeddedList]
+                            [[[VLCMain sharedInstance] embeddedList]
                             windowContainsEmbedded: o_window])
                 {
                     bEnabled = TRUE;
     }
 
     /* Special case for telx menu */
-    if( [[o_mi title] isEqualToString: _NS("Normal Size")] );
+    if( [[o_mi title] isEqualToString: _NS("Normal Size")] )
     {
         NSMenuItem *item = [[o_mi menu] itemWithTitle:_NS("Teletext")];
-        bool b_telx = false;
-        if( p_input )
-        {
-            const int i_teletext_es = var_GetInteger( p_input, "teletext-es" );
-            const int i_spu_es = var_GetInteger( p_input, "spu-es" );
+               bool b_telx = p_input && var_GetInteger( p_input, "teletext-es" ) >= 0;
 
-            if( i_teletext_es >= 0 && i_teletext_es == i_spu_es )
-                b_telx = true;
-        }
         [[item submenu] setAutoenablesItems:NO];
         for( int k=0; k < [[item submenu] numberOfItems]; k++ )
         {
     }
 
     if( p_input ) vlc_object_release( p_input );
-    vlc_object_release( p_playlist );
+    pl_Release( p_intf );
 
     return( bEnabled );
 }
 - (void)mouseDown: (NSEvent *)ourEvent
 {
     if( [ourEvent clickCount] > 1 )
-        [[[VLCMain sharedInstance] getControls] goToSpecificTime: nil];
+        [[[VLCMain sharedInstance] controls] goToSpecificTime: nil];
+    else
+        [[VLCMain sharedInstance] timeFieldWasClicked: self];
 }
 @end