]> git.sesse.net Git - vlc/blobdiff - modules/gui/macosx/MainMenu.m
macosx: dynamically create context and main sub menu for playlist table header select...
[vlc] / modules / gui / macosx / MainMenu.m
index 5baf6dd5c9f6e5721ad9d4acafea49f34167f8ab..f5ad19f4f743e523de1db9eb0a74a393eacb13b4 100644 (file)
@@ -65,6 +65,22 @@ static VLCMainMenu *_o_sharedInstance = nil;
     else
     {
         _o_sharedInstance = [super init];
+
+        o_ptc_translation_dict = [NSDictionary dictionaryWithObjectsAndKeys:
+                      _NS("Track Number"),  TRACKNUM_COLUMN,
+                      _NS("Title"),         TITLE_COLUMN,
+                      _NS("Artist"),        ARTIST_COLUMN,
+                      _NS("Duration"),      DURATION_COLUMN,
+                      _NS("Genre"),         GENRE_COLUMN,
+                      _NS("Album"),         ALBUM_COLUMN,
+                      _NS("Description"),   DESCRIPTION_COLUMN,
+                      _NS("Date"),          DATE_COLUMN,
+                      _NS("Language"),      LANGUAGE_COLUMN,
+                      _NS("URI"),           URI_COLUMN,
+                      nil];
+        // this array also assigns tags (index) to type of menu item
+        o_ptc_menuorder = [NSArray arrayWithObjects:TRACKNUM_COLUMN, TITLE_COLUMN, ARTIST_COLUMN, DURATION_COLUMN,
+                       GENRE_COLUMN, ALBUM_COLUMN, DESCRIPTION_COLUMN, DATE_COLUMN, LANGUAGE_COLUMN, URI_COLUMN, nil];
     }
 
     return _o_sharedInstance;
@@ -91,6 +107,9 @@ static VLCMainMenu *_o_sharedInstance = nil;
 
     [o_extMgr release];
 
+    if( o_mu_playlistTableColumnsContextMenu )
+        [o_mu_playlistTableColumnsContextMenu release];
+
     [super dealloc];
 }
 
@@ -292,16 +311,6 @@ static VLCMainMenu *_o_sharedInstance = nil;
     [o_mi_togglePlaymodeButtons setTitle: _NS("Show Shuffle & Repeat Buttons")];
     [o_mi_togglePlaymodeButtons setState: config_GetInt( VLCIntf, "macosx-show-playmode-buttons")];
     [o_mu_playlistTableColumns setTitle: _NS("Playlist Table Columns")];
-    [o_mi_ptc_tracknum setTitle: _NS("Track Number")];
-    [o_mi_ptc_title setTitle: _NS("Title")];
-    [o_mi_ptc_artist setTitle: _NS("Artist")];
-    [o_mi_ptc_duration setTitle: _NS("Duration")];
-    [o_mi_ptc_genre setTitle: _NS("Genre")];
-    [o_mi_ptc_album setTitle: _NS("Album")];
-    [o_mi_ptc_description setTitle: _NS("Description")];
-    [o_mi_ptc_date setTitle: _NS("Date")];
-    [o_mi_ptc_language setTitle: _NS("Language")];
-    [o_mi_ptc_uri setTitle: _NS("URI")];
 
     [o_mi_program setTitle: _NS("Program")];
     [o_mu_program setTitle: _NS("Program")];
@@ -399,6 +408,31 @@ static VLCMainMenu *_o_sharedInstance = nil;
     [o_vmi_snapshot setTitle: _NS("Snapshot")];
 }
 
+- (NSMenu *)setupPlaylistTableColumnsMenu
+{
+    NSMenu *o_context_menu = [[NSMenu alloc] init];
+
+    NSMenuItem *o_mi_tmp;
+    for( NSUInteger i = 0; i < [o_ptc_menuorder count]; i++ )
+    {
+        NSString *o_title = [o_ptc_translation_dict objectForKey:[o_ptc_menuorder objectAtIndex:i]];
+        o_mi_tmp = [o_mu_playlistTableColumns addItemWithTitle:o_title
+                                                        action:@selector(togglePlaylistColumnTable:)
+                                                 keyEquivalent:@""];
+        [o_mi_tmp setTarget:self];
+        [o_mi_tmp setTag:i];
+
+        o_mi_tmp = [o_context_menu addItemWithTitle:o_title
+                                             action:@selector(togglePlaylistColumnTable:)
+                                      keyEquivalent:@""];
+        [o_mi_tmp setTarget:self];
+        [o_mi_tmp setTag:i];
+    }
+    if( !o_mu_playlistTableColumnsContextMenu )
+        o_mu_playlistTableColumnsContextMenu = [o_context_menu retain];
+    return [o_context_menu autorelease];
+}
+
 #pragma mark -
 #pragma mark Termination
 
@@ -489,14 +523,11 @@ static VLCMainMenu *_o_sharedInstance = nil;
             vlc_object_release( p_vout );
 
             [self refreshVoutDeviceMenu:nil];
-            [self setSubmenusEnabled: YES];
         }
         vlc_object_release( p_input );
     }
     else
-    {
         [o_mi_record setEnabled: NO];
-    }
 }
 
 - (void)refreshVoutDeviceMenu:(NSNotification *)o_notification
@@ -504,20 +535,12 @@ static VLCMainMenu *_o_sharedInstance = nil;
     NSUInteger count = [o_mu_screen numberOfItems];
     NSMenu * o_submenu = o_mu_screen;
     if (count > 0)
-    {
-        if (OSX_LEOPARD)
-        {
-            NSUInteger count = [o_submenu numberOfItems];
-            for( NSUInteger i = 0; i < count; i++ )
-                [o_submenu removeItemAtIndex: 0];
-        }
-        else
-            [o_submenu removeAllItems];
-    }
+        [o_submenu removeAllItems];
 
     NSArray * o_screens = [NSScreen screens];
     NSMenuItem * o_mitem;
     count = [o_screens count];
+    [o_mi_screen setEnabled: YES];
     [o_submenu addItemWithTitle: _NS("Default") action:@selector(toggleFullscreenDevice:) keyEquivalent:@""];
     o_mitem = [o_submenu itemAtIndex: 0];
     [o_mitem setTag: 0];
@@ -534,7 +557,7 @@ static VLCMainMenu *_o_sharedInstance = nil;
         [o_mitem setEnabled: YES];
         [o_mitem setTarget: self];
     }
-    [[o_submenu itemWithTag: config_GetInt( VLCIntf, "macosx-vdev" )] setState: NSOnState];
+    [[o_submenu itemWithTag: var_InheritInteger( VLCIntf, "macosx-vdev" )] setState: NSOnState];
 }
 
 - (void)setSubmenusEnabled:(BOOL)b_enabled
@@ -598,6 +621,7 @@ static VLCMainMenu *_o_sharedInstance = nil;
 
     /* Let the ExtensionsManager itself build the menu */
     [o_extMgr buildMenu:o_mu_extensions];
+    [o_mi_extensions setEnabled: ( [o_mu_extensions numberOfItems] > 0 )];
 }
 
 #pragma mark -
@@ -646,56 +670,20 @@ static VLCMainMenu *_o_sharedInstance = nil;
 
 - (IBAction)togglePlaylistColumnTable:(id)sender
 {
-    [sender setState: ![sender state]];
-
-    NSString * o_column;
-
-    if (sender == o_mi_ptc_tracknum)
-        o_column = TRACKNUM_COLUMN;
-    else if (sender == o_mi_ptc_title)
-        o_column = TITLE_COLUMN;
-    else if (sender == o_mi_ptc_artist)
-        o_column = ARTIST_COLUMN;
-    else if (sender == o_mi_ptc_duration)
-        o_column = DURATION_COLUMN;
-    else if (sender == o_mi_ptc_genre)
-        o_column = GENRE_COLUMN;
-    else if (sender == o_mi_ptc_album)
-        o_column = ALBUM_COLUMN;
-    else if (sender == o_mi_ptc_description)
-        o_column = DESCRIPTION_COLUMN;
-    else if (sender == o_mi_ptc_date)
-        o_column = DATE_COLUMN;
-    else if (sender == o_mi_ptc_language)
-        o_column = LANGUAGE_COLUMN;
-    else if (sender == o_mi_ptc_uri)
-        o_column = URI_COLUMN;
-
-    [[[VLCMain sharedInstance] playlist] setColumn: o_column state: [sender state]];
+    NSInteger i_new_state = ![sender state];
+    NSInteger i_tag = [sender tag];
+    [[o_mu_playlistTableColumns            itemWithTag: i_tag] setState: i_new_state];
+    [[o_mu_playlistTableColumnsContextMenu itemWithTag: i_tag] setState: i_new_state];
+
+    NSString *o_column = [o_ptc_menuorder objectAtIndex: i_tag];
+    [[[VLCMain sharedInstance] playlist] setColumn: o_column state: i_new_state];
 }
 
 - (void)setPlaylistColumnTableState:(NSInteger)i_state forColumn:(NSString *)o_column
 {
-    if ([o_column isEqualToString: TRACKNUM_COLUMN])
-        [o_mi_ptc_tracknum setState: i_state];
-    else if ([o_column isEqualToString: TITLE_COLUMN])
-        [o_mi_ptc_title setState: i_state];
-    else if ([o_column isEqualToString: ARTIST_COLUMN])
-        [o_mi_ptc_artist setState: i_state];
-    else if ([o_column isEqualToString: DURATION_COLUMN])
-        [o_mi_ptc_duration setState: i_state];
-    else if ([o_column isEqualToString: GENRE_COLUMN])
-        [o_mi_ptc_genre setState: i_state];
-    else if ([o_column isEqualToString: ALBUM_COLUMN])
-        [o_mi_ptc_album setState: i_state];
-    else if ([o_column isEqualToString: DESCRIPTION_COLUMN])
-        [o_mi_ptc_description setState: i_state];
-    else if ([o_column isEqualToString: DATE_COLUMN])
-        [o_mi_ptc_date setState: i_state];
-    else if ([o_column isEqualToString: LANGUAGE_COLUMN])
-        [o_mi_ptc_language setState: i_state];
-    else if ([o_column isEqualToString: URI_COLUMN])
-        [o_mi_ptc_uri setState: i_state];
+    NSInteger i_tag = [o_ptc_menuorder indexOfObject: o_column];
+    [[o_mu_playlistTableColumns            itemWithTag: i_tag] setState: i_state];
+    [[o_mu_playlistTableColumnsContextMenu itemWithTag: i_tag] setState: i_state];
 }
 
 #pragma mark -
@@ -1007,17 +995,6 @@ static VLCMainMenu *_o_sharedInstance = nil;
             return;
     }
 
-    /* Make sure we want to display the variable
-     * special case for spu-es, which we want to display in any case */
-    if( i_type & VLC_VAR_HASCHOICE && strcmp( psz_variable, "spu-es" ) )
-    {
-        var_Change( p_object, psz_variable, VLC_VAR_CHOICESCOUNT, &val, NULL );
-        if( val.i_int == 0 )
-            return;
-        if( (i_type & VLC_VAR_TYPE) != VLC_VAR_VARIABLE && val.i_int == 1 )
-            return;
-    }
-
     /* Get the descriptive name of the variable */
     var_Change( p_object, psz_variable, VLC_VAR_GETTEXT, &text, NULL );
     [o_mi setTitle: _NS( text.psz_string ? text.psz_string : psz_variable )];
@@ -1074,18 +1051,10 @@ static VLCMainMenu *_o_sharedInstance = nil;
     int i_type, i;
 
     /* remove previous items */
-    if (OSX_LEOPARD)
-    {
-        int i_nb_items;
-        i_nb_items = [o_menu numberOfItems];
-        for( i = 0; i < i_nb_items; i++ )
-            [o_menu removeItemAtIndex: 0];
-    }
-    else
-    {
-        /* this is more efficient then the legacy code, but 10.6+ only */
-        [o_menu removeAllItems];
-    }
+    [o_menu removeAllItems];
+
+    /* we disable everything here, and enable it again when needed, below */
+    [o_parent setEnabled:NO];
 
     /* Aspect Ratio */
     if( [[o_parent title] isEqualToString: _NS("Aspect-ratio")] == YES )
@@ -1116,7 +1085,8 @@ static VLCMainMenu *_o_sharedInstance = nil;
     if( i_type & VLC_VAR_HASCHOICE )
     {
         var_Change( p_object, psz_variable, VLC_VAR_CHOICESCOUNT, &val, NULL );
-        if( val.i_int == 0 ) return;
+        if( val.i_int == 0 )
+            return;
         if( (i_type & VLC_VAR_TYPE) != VLC_VAR_VARIABLE && val.i_int == 1 )
             return;
     }