Steve Lhomme pushed to branch master at VideoLAN / VLC


Commits:
a739e705 by Claudio Cambra at 2024-05-27T09:50:50+00:00
macosx: Fix path control items by creating independent copies of folder image

Signed-off-by: Claudio Cambra <[email protected]>

- - - - -
b6d41084 by Claudio Cambra at 2024-05-27T09:50:50+00:00
macosx: Add convenience property to input node path control item for prefix 
sentence of accessibility description of image

Signed-off-by: Claudio Cambra <[email protected]>

- - - - -
4577ba3e by Claudio Cambra at 2024-05-27T09:50:50+00:00
macosx: Provide debug output when no matching input item found for clicked path 
item

Signed-off-by: Claudio Cambra <[email protected]>

- - - - -
cd699323 by Claudio Cambra at 2024-05-27T09:50:50+00:00
macosx: Set accessibility description for input node path control items

Signed-off-by: Claudio Cambra <[email protected]>

- - - - -
b02cb3c3 by Claudio Cambra at 2024-05-27T09:50:50+00:00
macosx: Use accessibility description for input node path control items as path 
control item identifiers

The input node path control items are readable strings but can be used
as identifiers thanks to the fact the contain the path for the given
input node. This is a big ugly hack but we have no other option to make
input node path control items identifiable, as we receive different
instances from the nspathcontrol that are not our subclass

Signed-off-by: Claudio Cambra <[email protected]>

- - - - -


4 changed files:

- modules/gui/macosx/library/VLCInputNodePathControl.m
- modules/gui/macosx/library/VLCInputNodePathControlItem.h
- modules/gui/macosx/library/VLCInputNodePathControlItem.m
- modules/gui/macosx/library/media-source/VLCMediaSourceBaseDataSource.m


Changes:

=====================================
modules/gui/macosx/library/VLCInputNodePathControl.m
=====================================
@@ -30,16 +30,16 @@
 {
     NSParameterAssert(inputNodePathControlItem != nil);
     NSParameterAssert(inputNodePathControlItem.image != nil);
-    NSParameterAssert(inputNodePathControlItem.image.name != nil);
-    NSParameterAssert(![inputNodePathControlItem.image.name 
isEqualToString:@""]);
+    NSParameterAssert(inputNodePathControlItem.image.accessibilityDescription 
!= nil);
+    
NSParameterAssert(![inputNodePathControlItem.image.accessibilityDescription 
isEqualToString:@""]);
 
-    if (_inputNodePathControlItems == nil) {
+    if (self.inputNodePathControlItems == nil) {
         _inputNodePathControlItems = [NSMutableDictionary dictionary];
     }
 
-    [_inputNodePathControlItems setObject:inputNodePathControlItem 
forKey:inputNodePathControlItem.image.name];
+    [self.inputNodePathControlItems setObject:inputNodePathControlItem 
forKey:inputNodePathControlItem.image.accessibilityDescription];
 
-    NSMutableArray *pathItems = [NSMutableArray arrayWithArray:self.pathItems];
+    NSMutableArray * const pathItems = [NSMutableArray 
arrayWithArray:self.pathItems];
     [pathItems addObject:inputNodePathControlItem];
     self.pathItems = pathItems;
 }
@@ -47,49 +47,49 @@
 - (void)removeLastInputNodePathControlItem
 {
     if (self.pathItems.count == 0) {
-        _inputNodePathControlItems = [NSMutableDictionary dictionary];
+        _inputNodePathControlItems = NSMutableDictionary.dictionary;
         return;
     }
 
-    NSMutableArray *pathItems = [NSMutableArray arrayWithArray:self.pathItems];
-    NSPathControlItem *lastItem = pathItems.lastObject;
+    NSMutableArray * const pathItems = [NSMutableArray 
arrayWithArray:self.pathItems];
+    NSPathControlItem * const lastItem = pathItems.lastObject;
 
     [pathItems removeLastObject];
     self.pathItems = pathItems;
-    [_inputNodePathControlItems removeObjectForKey:lastItem.image.name];
+    [self.inputNodePathControlItems 
removeObjectForKey:lastItem.image.accessibilityDescription];
 }
 
 - (void)clearInputNodePathControlItems
 {
-    _inputNodePathControlItems = [NSMutableDictionary dictionary];
+    _inputNodePathControlItems = NSMutableDictionary.dictionary;
     self.pathItems = @[];
 }
 
 - (void)clearPathControlItemsAheadOf:(NSPathControlItem *)item
 {
-    if ([item.image.name isEqualToString:@""]) {
+    if ([item.image.accessibilityDescription isEqualToString:@""]) {
         return;
     }
 
-    NSUInteger indexOfItem = [self.pathItems 
indexOfObjectPassingTest:^BOOL(NSPathControlItem *searchItem, NSUInteger idx, 
BOOL *stop) {
-        return [searchItem.image.name isEqualToString:item.image.name];
+    const NSUInteger indexOfItem = [self.pathItems 
indexOfObjectPassingTest:^BOOL(NSPathControlItem * const searchItem, const 
NSUInteger idx, BOOL * const stop) {
+        return [searchItem.image.accessibilityDescription 
isEqualToString:item.image.accessibilityDescription];
     }];
 
     if (indexOfItem == NSNotFound) {
         return;
     }
 
-    NSMutableArray<NSPathControlItem *> *pathItems = [NSMutableArray 
arrayWithArray:self.pathItems];
-    NSArray<NSPathControlItem *> *itemsToRemove = [pathItems 
subarrayWithRange:NSMakeRange(indexOfItem + 1, pathItems.count - indexOfItem - 
1)];
-    NSMutableArray<NSString *> *itemMrlsToRemove = [NSMutableArray 
arrayWithCapacity:itemsToRemove.count];
+    NSMutableArray<NSPathControlItem *> * const pathItems = [NSMutableArray 
arrayWithArray:self.pathItems];
+    NSArray<NSPathControlItem *> * const itemsToRemove = [pathItems 
subarrayWithRange:NSMakeRange(indexOfItem + 1, pathItems.count - indexOfItem - 
1)];
+    NSMutableArray<NSString *> * const itemIdsToRemove = [NSMutableArray 
arrayWithCapacity:itemsToRemove.count];
 
-    for (NSPathControlItem *searchItem in itemsToRemove) {
-        NSString *searchItemMrl = searchItem.image.name;
-        [itemMrlsToRemove addObject:searchItemMrl];
+    for (NSPathControlItem * const searchItem in itemsToRemove) {
+        NSString * const searchItemId = 
searchItem.image.accessibilityDescription;
+        [itemIdsToRemove addObject:searchItemId];
     };
 
     self.pathItems = [pathItems subarrayWithRange:NSMakeRange(0, indexOfItem + 
1)];
-    [_inputNodePathControlItems removeObjectsForKeys:itemMrlsToRemove];
+    [self.inputNodePathControlItems removeObjectsForKeys:itemIdsToRemove];
 }
 
 @end


=====================================
modules/gui/macosx/library/VLCInputNodePathControlItem.h
=====================================
@@ -28,6 +28,8 @@ NS_ASSUME_NONNULL_BEGIN
 
 @interface VLCInputNodePathControlItem : NSPathControlItem
 
+@property (class, readonly) NSString *accessibilityDescriptionPrefix;
+
 @property (readonly) VLCInputNode *inputNode;
 
 - (instancetype)initWithInputNode:(VLCInputNode *)inputNode;


=====================================
modules/gui/macosx/library/VLCInputNodePathControlItem.m
=====================================
@@ -25,8 +25,15 @@
 #import "VLCInputItem.h"
 #import "VLCLibraryImageCache.h"
 
+#import "extensions/NSString+Helpers.h"
+
 @implementation VLCInputNodePathControlItem
 
++ (NSString *)accessibilityDescriptionPrefix
+{
+    return _NS("Thumbnail for media location");
+}
+
 - (instancetype)initWithInputNode:(VLCInputNode *)inputNode
 {
     self = [super init];
@@ -36,14 +43,16 @@
         VLCInputItem * const inputItem = inputNode.inputItem;
         self.title = inputItem.name;
 
-        self.image = [NSImage imageNamed:NSImageNameFolder];
+        NSImage * const folderImage = [NSImage imageNamed:NSImageNameFolder];
+        self.image = folderImage.copy;
         // HACK: We have no way when we get the clicked item from the path 
control
         // of knowing specifically which input node this path item corresponds 
to,
         // as the path control returns a copy for clickedPathItem that is not 
of
-        // this class. As a very awkward workaround, lets set the name of the 
image
-        // used here as the MRL of the node's input item
-        self.image.name = inputItem.MRL;
-
+        // this class. As a very awkward workaround, lets set the accessibility
+        // description of the image and we will use this as an identifier.
+        self.image.accessibilityDescription = [NSString stringWithFormat:@"%@: 
%@", 
+                                               
VLCInputNodePathControlItem.accessibilityDescriptionPrefix, 
+                                               inputItem.path];
     } else if (inputNode == nil) {
         NSLog(@"WARNING: Received nil input node, cannot create 
VLCInputNodePathControlItem");
     } else if (inputNode.inputItem == nil) {


=====================================
modules/gui/macosx/library/media-source/VLCMediaSourceBaseDataSource.m
=====================================
@@ -503,17 +503,19 @@ referenceSizeForHeaderInSection:(NSInteger)section
 
 - (void)pathControlAction:(id)sender
 {
-    if (_pathControl.clickedPathItem == nil || _childDataSource == nil) {
+    if (self.pathControl.clickedPathItem == nil || self.childDataSource == 
nil) {
         return;
     }
 
-    NSPathControlItem * const selectedItem = _pathControl.clickedPathItem;
-    NSString * const itemNodeMrl = selectedItem.image.name;
+    NSPathControlItem * const selectedItem = self.pathControl.clickedPathItem;
+    NSString * const itemNodeMrl = selectedItem.image.accessibilityDescription;
 
-    VLCInputNodePathControlItem * const matchingItem = 
[_pathControl.inputNodePathControlItems objectForKey:itemNodeMrl];
+    VLCInputNodePathControlItem * const matchingItem = 
[self.pathControl.inputNodePathControlItems objectForKey:itemNodeMrl];
     if (matchingItem != nil) {
-        _childDataSource.nodeToDisplay = matchingItem.inputNode;
-        [_pathControl clearPathControlItemsAheadOf:selectedItem];
+        self.childDataSource.nodeToDisplay = matchingItem.inputNode;
+        [self.pathControl clearPathControlItemsAheadOf:selectedItem];
+    } else {
+        NSLog(@"Could not find matching item for clicked path item: %@", 
selectedItem);
     }
 }
 



View it on GitLab: 
https://code.videolan.org/videolan/vlc/-/compare/71d385aba8336aac24576e407869697c6297612e...b02cb3c302529974bae67b90a0867f74a276b331

-- 
This project does not include diff previews in email notifications.
View it on GitLab: 
https://code.videolan.org/videolan/vlc/-/compare/71d385aba8336aac24576e407869697c6297612e...b02cb3c302529974bae67b90a0867f74a276b331
You're receiving this email because of your account on code.videolan.org.


VideoLAN code repository instance
_______________________________________________
vlc-commits mailing list
[email protected]
https://mailman.videolan.org/listinfo/vlc-commits

Reply via email to