]> git.sesse.net Git - vlc/blobdiff - modules/gui/macosx/AddonManager.m
macosx: fix resume playback guards, do not resume for folder urls
[vlc] / modules / gui / macosx / AddonManager.m
index ca1e7fe3aeeb23e2d47a1f047c9231071d00c07b..e7a7998c866dfec1f46513d9e64f683453b39447 100644 (file)
@@ -25,6 +25,7 @@
 
 #import "AddonManager.h"
 #import "intf.h"
+#import "MainWindow.h"
 #import "AddonListDataSource.h"
 
 @interface VLCAddonManager ()
     addons_manager_t *_manager;
     NSMutableArray *_addons;
     NSArray *_displayedAddons;
+    BOOL _shouldRefreshSideBarOnAddonChange;
 }
 
-- (void)addAddon:(addon_entry_t *)data;
+- (void)addAddon:(NSValue *)o_value;
 - (void)discoveryEnded;
-- (void)addonChanged:(addon_entry_t *)data;
+- (void)addonChanged:(NSValue *)o_value;
 @end
 
 static void addonsEventsCallback( const vlc_event_t *event, void *data )
 {
-    if (event->type == vlc_AddonFound)
-        [[VLCAddonManager sharedInstance] addAddon:event->u.addon_generic_event.p_entry];
-    else if (event->type == vlc_AddonsDiscoveryEnded)
-        [[VLCAddonManager sharedInstance] discoveryEnded];
-    else if (event->type == vlc_AddonChanged)
-        [[VLCAddonManager sharedInstance] addonChanged:event->u.addon_generic_event.p_entry];
+    @autoreleasepool {
+        if (event->type == vlc_AddonFound)
+            [[VLCAddonManager sharedInstance] performSelectorOnMainThread:@selector(addAddon:) withObject:[NSValue valueWithPointer:event->u.addon_generic_event.p_entry] waitUntilDone:NO];
+        else if (event->type == vlc_AddonsDiscoveryEnded)
+            [[VLCAddonManager sharedInstance] performSelectorOnMainThread:@selector(discoveryEnded) withObject:nil waitUntilDone:NO];
+        else if (event->type == vlc_AddonChanged)
+            [[VLCAddonManager sharedInstance] performSelectorOnMainThread:@selector(addonChanged:) withObject:[NSValue valueWithPointer:event->u.addon_generic_event.p_entry] waitUntilDone:NO];
+    }
 }
 
 @implementation VLCAddonManager
@@ -95,13 +99,21 @@ static VLCAddonManager *_o_sharedInstance = nil;
     [[_typeSwitcher lastItem] setTag:ADDON_PLAYLIST_PARSER];
     [_typeSwitcher addItemWithTitle:_NS("Service Discovery")];
     [[_typeSwitcher lastItem] setTag:ADDON_SERVICE_DISCOVERY];
+    [_typeSwitcher addItemWithTitle:_NS("Interfaces")];
+    [[_typeSwitcher lastItem] setTag:ADDON_INTERFACE];
+    [_typeSwitcher addItemWithTitle:_NS("Art and meta fetchers")];
+    [[_typeSwitcher lastItem] setTag:ADDON_META];
     [_typeSwitcher addItemWithTitle:_NS("Extensions")];
     [[_typeSwitcher lastItem] setTag:ADDON_EXTENSION];
 
     [_localAddonsOnlyCheckbox setTitle:_NS("Show Installed Only")];
     [_localAddonsOnlyCheckbox setState:NSOffState];
+    [_downloadCatalogButton setTitle:_NS("Find more addons online")];
     [_spinner setUsesThreadedAnimation:YES];
 
+    [self updateInstallButton:NO];
+    [_installButton setHidden:YES];
+
     [_name setStringValue:@""];
     [_author setStringValue:@""];
     [_version setStringValue:@""];
@@ -122,13 +134,12 @@ static VLCAddonManager *_o_sharedInstance = nil;
     vlc_event_attach(p_em, vlc_AddonFound, addonsEventsCallback, self);
     vlc_event_attach(p_em, vlc_AddonsDiscoveryEnded, addonsEventsCallback, self);
     vlc_event_attach(p_em, vlc_AddonChanged, addonsEventsCallback, self);
+
+    [self _findInstalled];
 }
 
 - (void)showWindow
 {
-    [self _findInstalled];
-
-    [self _findNewAddons];
     [_window makeKeyAndOrderFront:nil];
 }
 
@@ -142,6 +153,13 @@ static VLCAddonManager *_o_sharedInstance = nil;
     [self _refactorDataModel];
 }
 
+- (IBAction)downloadCatalog:(id)sender
+{
+    [self _findNewAddons];
+    [_downloadCatalogButton setHidden:YES];
+    [_localAddonsOnlyCheckbox setHidden:NO];
+}
+
 - (IBAction)installSelection:(id)sender
 {
     NSInteger selectedRow = [_addonsTable selectedRow];
@@ -149,7 +167,9 @@ static VLCAddonManager *_o_sharedInstance = nil;
         return;
 
     VLCAddon *currentAddon = [_displayedAddons objectAtIndex:selectedRow];
-    [self _installAddonWithID:[currentAddon uuid]];
+    [self _installAddonWithID:[currentAddon uuid] type:[currentAddon type]];
+
+    [_installButton setEnabled:NO];
 }
 
 - (IBAction)uninstallSelection:(id)sender
@@ -159,12 +179,23 @@ static VLCAddonManager *_o_sharedInstance = nil;
         return;
 
     VLCAddon *currentAddon = [_displayedAddons objectAtIndex:selectedRow];
-    [self _removeAddonWithID:[currentAddon uuid]];
+    [self _removeAddonWithID:[currentAddon uuid] type:[currentAddon type]];
+
+    [_installButton setEnabled:NO];
 }
 
-- (IBAction)refresh:(id)sender
+- (void)updateInstallButton:(BOOL)b_is_installed
 {
-    [self _findNewAddons];
+    [_installButton setHidden:NO];
+    [_installButton setEnabled:YES];
+
+    if (b_is_installed) {
+        [_installButton setTitle:_NS("Uninstall")];
+        [_installButton setAction:@selector(uninstallSelection:)];
+    } else {
+        [_installButton setTitle:_NS("Install")];
+        [_installButton setAction:@selector(installSelection:)];
+    }
 }
 
 - (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView
@@ -180,6 +211,7 @@ static VLCAddonManager *_o_sharedInstance = nil;
         [_author setStringValue:@""];
         [_version setStringValue:@""];
         [_description setString:@""];
+        [_installButton setHidden:YES];
         return;
     }
 
@@ -188,6 +220,8 @@ static VLCAddonManager *_o_sharedInstance = nil;
     [_author setStringValue:[currentItem author]];
     [_version setStringValue:[currentItem version]];
     [_description setString:[currentItem description]];
+
+    [self updateInstallButton:[currentItem isInstalled]];
 }
 
 - (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex
@@ -203,14 +237,12 @@ static VLCAddonManager *_o_sharedInstance = nil;
 
 #pragma mark - data handling
 
-- (void)addAddon:(addon_entry_t *)p_entry
+- (void)addAddon:(NSValue *)o_value
 {
-    @autoreleasepool {
-
-        /* no skin support on OS X so far */
-        if (p_entry->e_type != ADDON_SKIN2)
-            [_addons addObject:[[[VLCAddon alloc] initWithAddon:p_entry] autorelease]];
-    }
+    addon_entry_t *p_entry = [o_value pointerValue];
+    /* no skin support on OS X so far */
+    if (p_entry->e_type != ADDON_SKIN2)
+        [_addons addObject:[[[VLCAddon alloc] initWithAddon:p_entry] autorelease]];
 }
 
 - (void)discoveryEnded
@@ -219,9 +251,13 @@ static VLCAddonManager *_o_sharedInstance = nil;
     [_spinner stopAnimation:nil];
 }
 
-- (void)addonChanged:(addon_entry_t *)data
+- (void)addonChanged:(NSValue *)o_value
 {
     [self _refactorDataModel];
+    if (_shouldRefreshSideBarOnAddonChange) {
+        [[VLCMainWindow sharedInstance] performSelector:@selector(reloadSidebar) withObject:nil afterDelay:0.5];
+        _shouldRefreshSideBarOnAddonChange = NO;
+    }
 }
 
 #pragma mark - helpers
@@ -257,7 +293,10 @@ static VLCAddonManager *_o_sharedInstance = nil;
     _displayedAddons = [NSArray arrayWithArray:filteredItems];
     [_displayedAddons retain];
     [filteredItems release];
+
+    // update ui
     [_addonsTable reloadData];
+    [self tableViewSelectionDidChange:nil];
 }
 
 - (void)_findNewAddons
@@ -275,21 +314,30 @@ static VLCAddonManager *_o_sharedInstance = nil;
 - (void)_findInstalled
 {
     addons_manager_LoadCatalog(_manager);
+
+    // enqueue, to process the addons first
+    [self performSelectorOnMainThread:@selector(_refactorDataModel) withObject:nil waitUntilDone:NO];
 }
 
-- (void)_installAddonWithID:(NSData *)o_data
+- (void)_installAddonWithID:(NSData *)o_data type:(addon_type_t)type
 {
     addon_uuid_t uuid;
     [o_data getBytes:uuid length:sizeof(uuid)];
 
+    if (type == ADDON_SERVICE_DISCOVERY)
+        _shouldRefreshSideBarOnAddonChange = YES;
+
     addons_manager_Install(_manager, uuid);
 }
 
-- (void)_removeAddonWithID:(NSData *)o_data
+- (void)_removeAddonWithID:(NSData *)o_data type:(addon_type_t)type
 {
     addon_uuid_t uuid;
     [o_data getBytes:uuid length:sizeof(uuid)];
 
+    if (type == ADDON_SERVICE_DISCOVERY)
+        _shouldRefreshSideBarOnAddonChange = YES;
+
     addons_manager_Remove(_manager, uuid);
 }