[vlc-commits] macosx: video effects: improve compatibility with old settings

David Fuhrmann git at videolan.org
Sun Dec 10 23:26:34 CET 2017


vlc | branch: master | David Fuhrmann <dfuhrmann at videolan.org> | Sun Dec 10 22:50:46 2017 +0100| [42115489853231f77f1221791294616c716e80fb] | committer: David Fuhrmann

macosx: video effects: improve compatibility with old settings

This implements the following migration behaviour with older
VLC version:
- Index 0 in settings used to be the Default profile, and is now
  ignored (not read from and not written to anymore)
- The default settings still include the default profile in index
  0, to maintain backwards compatibility if older VLC are started.
- In profile selector, index 0 is still the Default profile,
  if the "apply at next startup" is selected, a new Custom profile
  is created at exit.
- By default after updating, no profile will be deployed at launch,
  so the "Default profile is selected.

refs #19260

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=42115489853231f77f1221791294616c716e80fb
---

 .../gui/macosx/VLCVideoEffectsWindowController.m   | 125 +++++++++++++--------
 1 file changed, 77 insertions(+), 48 deletions(-)

diff --git a/modules/gui/macosx/VLCVideoEffectsWindowController.m b/modules/gui/macosx/VLCVideoEffectsWindowController.m
index 98ded961f1..a007069f75 100644
--- a/modules/gui/macosx/VLCVideoEffectsWindowController.m
+++ b/modules/gui/macosx/VLCVideoEffectsWindowController.m
@@ -34,11 +34,6 @@
 #define getWidgetFloatValue(w)  ((vlc_value_t){ .f_float = [w floatValue] })
 #define getWidgetStringValue(w) ((vlc_value_t){ .psz_string = (char *)[[w stringValue] UTF8String] })
 
- at interface VLCVideoEffectsWindowController()
-{
-    NSInteger i_old_profile_index;
-}
- at end
 
 #pragma mark -
 #pragma mark Initialization
@@ -47,6 +42,13 @@
 
 + (void)initialize
 {
+    /*
+     * Video effects profiles starting with 3.0:
+     * - Index 0 is assumed to be the default profile from previous versions
+     * - Index 0 from settings is never read or written anymore starting with 3.0, as the Default profile
+     *   is not persisted anymore.
+     */
+
     NSDictionary *appDefaults = [NSDictionary dictionaryWithObjectsAndKeys:
                                  [NSArray arrayWithObject:[VLCVideoEffectsWindowController defaultProfileString]], @"VideoEffectProfiles",
                                  [NSArray arrayWithObject:_NS("Default")], @"VideoEffectProfileNames",
@@ -63,35 +65,40 @@
 {
     self = [super initWithWindowNibName:@"VideoEffects"];
     if (self) {
-        i_old_profile_index = -1;
-
         self.popupPanel = [[VLCPopupPanelController alloc] init];
         self.textfieldPanel = [[VLCTextfieldPanelController alloc] init];
-    }
 
-    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
-    if ([defaults boolForKey:@"VideoEffectApplyProfileOnStartup"]) {
-        // This does not reset the UI (which does not exist yet), but it initalizes needed playlist vars
-        [self resetValues];
+        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
+        if ([defaults boolForKey:@"VideoEffectApplyProfileOnStartup"]) {
+            // This does not reset the UI (which does not exist yet), but it initalizes needed playlist vars
+            [self resetValues];
+
+            [self loadProfile];
+        } else {
+            [self saveCurrentProfileIndex:0];
+        }
 
-        [self loadProfile];
     }
-    else
-        [defaults setInteger:0 forKey:@"VideoEffectSelectedProfile"];
 
     return self;
 }
 
+/// Loads values from profile into variables
 - (void)loadProfile
 {
     intf_thread_t *p_intf = getIntf();
     playlist_t *p_playlist = pl_Get(p_intf);
     VLCCoreInteraction *vci_si = [VLCCoreInteraction sharedInstance];
     NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
-    NSUInteger profile = [defaults integerForKey:@"VideoEffectSelectedProfile"];
+    NSInteger profileIndex = [self currentProfileIndex];
 
-    /* fetch preset */
-    NSArray *items = [[[defaults objectForKey:@"VideoEffectProfiles"] objectAtIndex:profile] componentsSeparatedByString:@";"];
+    NSString *profileString;
+    if (profileIndex == 0)
+        profileString = [VLCVideoEffectsWindowController defaultProfileString];
+    else
+        profileString = [[defaults objectForKey:@"VideoEffectProfiles"] objectAtIndex:profileIndex];
+
+    NSArray *items = [profileString componentsSeparatedByString:@";"];
 
     // version 1 of profile string has 32 entries
     if ([items count] < 32) {
@@ -174,9 +181,6 @@
         hueValue.f_float -= 180;
     }
     [vci_si setVideoFilterProperty: "hue" forFilter: "adjust" withValue: hueValue];
-
-    [defaults setInteger:profile forKey:@"VideoEffectSelectedProfile"];
-    [defaults synchronize];
 }
 
 - (void)windowDidLoad
@@ -347,6 +351,16 @@
 #pragma mark -
 #pragma mark internal functions
 
+- (void)saveCurrentProfileIndex:(NSInteger)index
+{
+    [[NSUserDefaults standardUserDefaults] setInteger:index forKey:@"VideoEffectSelectedProfile"];
+}
+
+- (NSInteger)currentProfileIndex
+{
+    return [[NSUserDefaults standardUserDefaults] integerForKey:@"VideoEffectSelectedProfile"];
+}
+
 -(void)inputChangedEvent:(NSNotification *)o_notification
 {
     // reset crop values when input changed
@@ -361,7 +375,11 @@
     NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
     [_profilePopup removeAllItems];
 
-    NSArray *profileNames = [defaults objectForKey:@"VideoEffectProfileNames"];
+    // Ignore "Default" index 0 from settings
+    [_profilePopup addItemWithTitle:_NS("Default")];
+
+    NSMutableArray *profileNames = [[defaults stringArrayForKey:@"VideoEffectProfileNames"] mutableCopy];
+    [profileNames removeObjectAtIndex:0];
     [_profilePopup addItemsWithTitles:profileNames];
 
     [[_profilePopup menu] addItem:[NSMenuItem separatorItem]];
@@ -375,8 +393,9 @@
         [[_profilePopup lastItem] setAction: @selector(removeProfile:)];
     }
 
-    [_profilePopup selectItemAtIndex:[defaults integerForKey:@"VideoEffectSelectedProfile"]];
-    if (i_old_profile_index || [defaults integerForKey:@"VideoEffectSelectedProfile"])
+    [_profilePopup selectItemAtIndex: [self currentProfileIndex]];
+    // Loading only non-default profiles ensures that vlcrc or command line settings are not overwritten
+    if ([self currentProfileIndex] > 0)
         [self profileSelectorAction:self];
 }
 
@@ -398,9 +417,11 @@
         msg_Err(p_intf, "%s variable is of an unsupported type (%d)", psz_option, i_type);
         return;
     }
+
     if (var_Create(p_playlist, psz_option, i_type | VLC_VAR_DOINHERIT) ||
-        var_GetChecked(p_playlist, psz_option, i_type, &val))
+        var_GetChecked(p_playlist, psz_option, i_type, &val)) {
         return;
+    }
 
     if (i_type == VLC_VAR_BOOL || i_type == VLC_VAR_INTEGER)
     {
@@ -446,6 +467,7 @@
     [widget setEnabled: b_state];
 }
 
+/// Sets widget values based on variables
 - (void)resetValues
 {
     intf_thread_t *p_intf = getIntf();
@@ -668,37 +690,43 @@
 
 - (void)saveCurrentProfile
 {
-    if (!i_old_profile_index || i_old_profile_index == -1)
+    NSInteger currentProfileIndex = [self currentProfileIndex];
+
+    // Do not save default profile
+    if (currentProfileIndex == 0) {
         return;
+    }
 
-    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
     /* fetch all the current settings in a uniform string */
     NSString *newProfile = [self generateProfileString];
 
+    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
     NSMutableArray *workArray = [[NSMutableArray alloc] initWithArray:[defaults objectForKey:@"VideoEffectProfiles"]];
-    if (i_old_profile_index >= [workArray count])
+    if (currentProfileIndex >= [workArray count])
         return;
 
-    [workArray replaceObjectAtIndex:i_old_profile_index withObject:newProfile];
+    [workArray replaceObjectAtIndex:currentProfileIndex withObject:newProfile];
     [defaults setObject:[NSArray arrayWithArray:workArray] forKey:@"VideoEffectProfiles"];
     [defaults synchronize];
 }
 
 - (void)saveCurrentProfileAtTerminate
 {
-    if (i_old_profile_index)
-        return [self saveCurrentProfile];
+    if ([self currentProfileIndex] > 0) {
+        [self saveCurrentProfile];
+        return;
+    }
 
     // A new "Custom profile" is only created if the user wants to load this as new profile at startup ...
     if (_applyProfileCheckbox.state == NSOffState)
         return;
 
     // ... and some settings are changed
-    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
     NSString *newProfile = [self generateProfileString];
-    if ([newProfile compare:[[defaults objectForKey:@"VideoEffectProfiles"] firstObject]] == NSOrderedSame)
+    if ([newProfile compare:[VLCVideoEffectsWindowController defaultProfileString]] == NSOrderedSame)
         return;
 
+    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
     NSMutableArray *workArray = [[NSMutableArray alloc] initWithArray:[defaults objectForKey:@"VideoEffectProfiles"]];
     [workArray addObject:newProfile];
     [defaults setObject:[NSArray arrayWithArray:workArray] forKey:@"VideoEffectProfiles"];
@@ -715,7 +743,7 @@
     [workArray addObject:newProfileName];
     [defaults setObject:[NSArray arrayWithArray:workArray] forKey:@"VideoEffectProfileNames"];
 
-    [defaults setInteger:([workArray count] - 1) forKey:@"VideoEffectSelectedProfile"];
+    [self saveCurrentProfileIndex:([workArray count] - 1)];
 
     [defaults synchronize];
 }
@@ -733,8 +761,9 @@
 - (IBAction)profileSelectorAction:(id)sender
 {
     [self saveCurrentProfile];
-    i_old_profile_index = [_profilePopup indexOfSelectedItem];
-    [[NSUserDefaults standardUserDefaults] setInteger:i_old_profile_index forKey:@"VideoEffectSelectedProfile"];
+
+    [self saveCurrentProfileIndex:[_profilePopup indexOfSelectedItem]];
+
     [self loadProfile];
     [self resetValues];
 }
@@ -759,18 +788,17 @@
     __unsafe_unretained typeof(self) _self = self;
     [_textfieldPanel runModalForWindow:self.window completionHandler:^(NSInteger returnCode, NSString *resultingText) {
 
-        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
-
         if (returnCode != NSOKButton) {
-            [_profilePopup selectItemAtIndex:[defaults integerForKey:@"VideoEffectSelectedProfile"]];
+            [_profilePopup selectItemAtIndex:[self currentProfileIndex]];
             return;
         }
 
+        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
         NSArray *profileNames = [defaults objectForKey:@"VideoEffectProfileNames"];
 
         // duplicate names are not allowed in the popup control
         if ([resultingText length] == 0 || [profileNames containsObject:resultingText]) {
-            [_profilePopup selectItemAtIndex:[defaults integerForKey:@"VideoEffectSelectedProfile"]];
+            [_profilePopup selectItemAtIndex:[self currentProfileIndex]];
 
             NSAlert *alert = [[NSAlert alloc] init];
             [alert setAlertStyle:NSCriticalAlertStyle];
@@ -792,7 +820,8 @@
         NSMutableArray *workArray = [[NSMutableArray alloc] initWithArray:[defaults objectForKey:@"VideoEffectProfiles"]];
         [workArray addObject:newProfile];
         [defaults setObject:[NSArray arrayWithArray:workArray] forKey:@"VideoEffectProfiles"];
-        [defaults setInteger:[workArray count] - 1 forKey:@"VideoEffectSelectedProfile"];
+
+        [self saveCurrentProfileIndex:([workArray count] - 1)];
 
         workArray = [[NSMutableArray alloc] initWithArray:[defaults objectForKey:@"VideoEffectProfileNames"]];
         [workArray addObject:resultingText];
@@ -827,18 +856,20 @@
     __unsafe_unretained typeof(self) _self = self;
     [_popupPanel runModalForWindow:self.window completionHandler:^(NSInteger returnCode, NSInteger selectedIndex) {
 
-        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
+
+        NSInteger activeProfileIndex = [_self currentProfileIndex];
 
         if (returnCode != NSOKButton) {
-            [_profilePopup selectItemAtIndex:[defaults integerForKey:@"VideoEffectSelectedProfile"]];
+            [_profilePopup selectItemAtIndex:activeProfileIndex];
             return;
         }
 
         if (!selectedIndex) { // TODO: add popup to notify user
-            [_profilePopup selectItemAtIndex:[defaults integerForKey:@"VideoEffectSelectedProfile"]];
+            [_profilePopup selectItemAtIndex:activeProfileIndex];
             return;
         }
 
+        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
         /* remove selected profile from settings */
         NSMutableArray *workArray = [[NSMutableArray alloc] initWithArray: [defaults objectForKey:@"VideoEffectProfiles"]];
         [workArray removeObjectAtIndex:selectedIndex];
@@ -848,14 +879,12 @@
         [workArray removeObjectAtIndex:selectedIndex];
         [defaults setObject:[NSArray arrayWithArray:workArray] forKey:@"VideoEffectProfileNames"];
 
-        if (i_old_profile_index >= selectedIndex)
-            [defaults setInteger:i_old_profile_index - 1 forKey:@"VideoEffectSelectedProfile"];
+        if (activeProfileIndex >= selectedIndex)
+            [self saveCurrentProfileIndex:(activeProfileIndex - 1)];
 
         /* save defaults */
         [defaults synchronize];
 
-        /* do not save deleted profile */
-        i_old_profile_index = -1;
         /* refresh UI */
         [_self resetProfileSelector];
     }];



More information about the vlc-commits mailing list