Jean-Baptiste Kempf pushed to branch master at VideoLAN / VLC


Commits:
f9057380 by Claudio Cambra at 2022-07-23T07:50:29+00:00
macosx: Make search field in toolbar functional for library

Signed-off-by: Claudio Cambra <claudio.cam...@gmail.com>

- - - - -


7 changed files:

- modules/gui/macosx/UI/VLCLibraryWindow.xib
- modules/gui/macosx/library/VLCLibraryController.h
- modules/gui/macosx/library/VLCLibraryController.m
- modules/gui/macosx/library/VLCLibraryModel.h
- modules/gui/macosx/library/VLCLibraryModel.m
- modules/gui/macosx/library/VLCLibraryWindow.h
- modules/gui/macosx/library/VLCLibraryWindow.m


Changes:

=====================================
modules/gui/macosx/UI/VLCLibraryWindow.xib
=====================================
@@ -2,6 +2,7 @@
 <document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" 
toolsVersion="20037" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" 
useAutolayout="YES">
     <dependencies>
         <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" 
version="20037"/>
+        <capability name="Search Toolbar Item" minToolsVersion="12.0" 
minSystemVersion="11.0"/>
         <capability name="System colors introduced in macOS 10.14" 
minToolsVersion="10.0"/>
         <capability name="documents saved in the Xcode 8 format" 
minToolsVersion="8.0"/>
     </dependencies>
@@ -596,22 +597,6 @@
                             </segmentedCell>
                         </segmentedControl>
                     </toolbarItem>
-                    <toolbarItem 
implicitItemIdentifier="9B15C9C0-73AC-4190-803C-5AF14952E903" label="Custom 
View" paletteLabel="Search Field" sizingBehavior="auto" id="hnO-hn-Ad3">
-                        <nil key="toolTip"/>
-                        <searchField key="view" wantsLayer="YES" 
verticalHuggingPriority="751" allowsCharacterPickerTouchBarItem="YES" 
textCompletion="NO" id="Uje-gs-XyH">
-                            <rect key="frame" x="0.0" y="14" width="96" 
height="22"/>
-                            <autoresizingMask key="autoresizingMask"/>
-                            <constraints>
-                                <constraint firstAttribute="height" 
constant="22" id="bdi-0E-ZYl"/>
-                                <constraint firstAttribute="width" 
constant="96" id="pdg-70-JyS"/>
-                            </constraints>
-                            <searchFieldCell key="cell" scrollable="YES" 
lineBreakMode="clipping" selectable="YES" editable="YES" borderStyle="bezel" 
usesSingleLineMode="YES" bezelStyle="round" id="hOD-ST-dRA">
-                                <font key="font" metaFont="message"/>
-                                <color key="textColor" name="controlTextColor" 
catalog="System" colorSpace="catalog"/>
-                                <color key="backgroundColor" 
name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
-                            </searchFieldCell>
-                        </searchField>
-                    </toolbarItem>
                     <toolbarItem 
implicitItemIdentifier="NSToolbarFlexibleSpaceItem" id="89f-AL-zuU"/>
                     <toolbarItem implicitItemIdentifier="NSToolbarSpaceItem" 
id="hs0-cc-34q"/>
                     <toolbarItem 
implicitItemIdentifier="FCCB897D-45D4-411A-91BF-302620882C8C" label="smallCone" 
paletteLabel="Toolbar Cone" tag="-1" image="VLC" navigational="YES" 
id="L28-Xw-ydE">
@@ -632,6 +617,21 @@
                             </segmentedCell>
                         </segmentedControl>
                     </toolbarItem>
+                    <searchToolbarItem 
implicitItemIdentifier="A132890F-6B3D-4523-A71B-B00F095057C4" label="Search" 
paletteLabel="Search" visibilityPriority="1001" id="dv4-Il-y8X">
+                        <nil key="toolTip"/>
+                        <searchField key="view" verticalHuggingPriority="750" 
textCompletion="NO" id="ab6-kR-8Io">
+                            <rect key="frame" x="0.0" y="0.0" width="100" 
height="21"/>
+                            <autoresizingMask key="autoresizingMask"/>
+                            <searchFieldCell key="cell" scrollable="YES" 
lineBreakMode="clipping" selectable="YES" editable="YES" 
refusesFirstResponder="YES" sendsActionOnEndEditing="YES" borderStyle="bezel" 
usesSingleLineMode="YES" bezelStyle="round" sendsSearchStringImmediately="YES" 
id="MW6-rQ-Qtr">
+                                <font key="font" metaFont="system"/>
+                                <color key="textColor" name="controlTextColor" 
catalog="System" colorSpace="catalog"/>
+                                <color key="backgroundColor" 
name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
+                            </searchFieldCell>
+                            <connections>
+                                <action selector="filterLibrary:" 
target="QvC-M9-y7g" id="VoD-A4-uwu"/>
+                            </connections>
+                        </searchField>
+                    </searchToolbarItem>
                 </allowedToolbarItems>
                 <defaultToolbarItems>
                     <toolbarItem reference="L28-Xw-ydE"/>
@@ -641,8 +641,8 @@
                     <toolbarItem reference="89f-AL-zuU"/>
                     <toolbarItem reference="KnW-Lr-R1d"/>
                     <toolbarItem reference="89f-AL-zuU"/>
+                    <searchToolbarItem reference="dv4-Il-y8X"/>
                     <toolbarItem reference="Lf2-ec-tHh"/>
-                    <toolbarItem reference="hnO-hn-Ad3"/>
                 </defaultToolbarItems>
             </toolbar>
             <connections>
@@ -659,6 +659,8 @@
                 <outlet property="dragDropImageBackgroundBox" 
destination="AXk-h7-dZ0" id="h3h-Wh-0op"/>
                 <outlet property="emptyLibraryView" destination="YJf-1r-vaC" 
id="AJB-eN-4u6"/>
                 <outlet property="gridVsListSegmentedControl" 
destination="lIg-5J-C5F" id="u6B-Zx-4mX"/>
+                <outlet property="librarySearchField" destination="ab6-kR-8Io" 
id="Qf7-UM-lol"/>
+                <outlet property="librarySearchToolbarItem" 
destination="dv4-Il-y8X" id="Um3-s4-Ax4"/>
                 <outlet property="librarySortButton" destination="Rja-6g-wNZ" 
id="FQ7-MU-hsk"/>
                 <outlet property="libraryTargetView" destination="iSp-bV-w6B" 
id="a94-ux-wUc"/>
                 <outlet property="mainSplitView" destination="u8g-jy-S4e" 
id="lI5-wR-kef"/>


=====================================
modules/gui/macosx/library/VLCLibraryController.h
=====================================
@@ -51,6 +51,12 @@ NS_ASSUME_NONNULL_BEGIN
  */
 - (void)sortByCriteria:(enum vlc_ml_sorting_criteria_t)sortCriteria 
andDescending:(bool)descending;
 
+/**
+ * @brief Filter the entire library representation based on:
+ * @param filterString the string that will be used to filter items
+ */
+- (void)filterByString:(NSString*)filterString;
+
 /**
  * Initially, the library is unsorted until the user decides to do so
  * Until then, the unsorted state is retained.


=====================================
modules/gui/macosx/library/VLCLibraryController.m
=====================================
@@ -195,4 +195,9 @@
     [_libraryModel sortByCriteria:sortCriteria andDescending:descending];
 }
 
+- (void)filterByString:(NSString*)filterString
+{
+    [_libraryModel filterByString:filterString];
+}
+
 @end


=====================================
modules/gui/macosx/library/VLCLibraryModel.h
=====================================
@@ -69,6 +69,7 @@ extern NSString *VLCLibraryModelMediaItemUpdated;
 - (nullable NSArray <VLCMediaLibraryAlbum *>*)listAlbumsOfParentType:(enum 
vlc_ml_parent_type)parentType forID:(int64_t)ID;
 
 - (void)sortByCriteria:(enum vlc_ml_sorting_criteria_t)sortCriteria 
andDescending:(bool)descending;
+- (void)filterByString:(NSString*)filterString;
 
 @end
 


=====================================
modules/gui/macosx/library/VLCLibraryModel.m
=====================================
@@ -49,6 +49,7 @@ NSString *VLCLibraryModelMediaItemUpdated = 
@"VLCLibraryModelMediaItemUpdated";
 
     enum vlc_ml_sorting_criteria_t _sortCriteria;
     bool _sortDescending;
+    NSString *_filterString;
     
     size_t _initialVideoCount;
     size_t _initialAudioCount;
@@ -133,6 +134,7 @@ static void libraryCallback(void *p_data, const 
vlc_ml_event_t *p_event)
     if (self) {
         _sortCriteria = VLC_ML_SORTING_DEFAULT;
         _sortDescending = NO;
+        _filterString = @"";
         _p_mediaLibrary = library;
         _p_eventCallback = vlc_ml_event_register_callback(_p_mediaLibrary, 
libraryCallback, (__bridge void *)self);
         _defaultNotificationCenter = [NSNotificationCenter defaultCenter];
@@ -187,10 +189,18 @@ static void libraryCallback(void *p_data, const 
vlc_ml_event_t *p_event)
     return _cachedAudioMedia.count;
 }
 
+- (vlc_ml_query_params_t)queryParams
+{
+    const vlc_ml_query_params_t queryParams = { .psz_pattern = 
self->_filterString.length > 0 ? [self->_filterString UTF8String] : NULL, 
+                                                .i_sort = self->_sortCriteria, 
+                                                .b_desc = 
self->_sortDescending };
+    return queryParams;
+}
+
 - (void)updateCachedListOfAudioMedia
 {
     dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0), ^{
-        const vlc_ml_query_params_t queryParams = { .i_sort = 
self->_sortCriteria, .b_desc = self->_sortDescending };
+        const vlc_ml_query_params_t queryParams = [self queryParams];
         vlc_ml_media_list_t *p_media_list = 
vlc_ml_list_audio_media(self->_p_mediaLibrary, &queryParams);
         if (!p_media_list) {
             return;
@@ -230,7 +240,7 @@ static void libraryCallback(void *p_data, const 
vlc_ml_event_t *p_event)
 - (void)updateCachedListOfArtists
 {
     dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0), ^{
-        const vlc_ml_query_params_t queryParams = { .i_sort = 
self->_sortCriteria, .b_desc = self->_sortDescending };
+        const vlc_ml_query_params_t queryParams = { .psz_pattern = 
[self->_filterString UTF8String], .i_sort = self->_sortCriteria, .b_desc = 
self->_sortDescending };
         vlc_ml_artist_list_t *p_artist_list = 
vlc_ml_list_artists(self->_p_mediaLibrary, &queryParams, NO);
         NSMutableArray *mutableArray = [[NSMutableArray alloc] 
initWithCapacity:p_artist_list->i_nb_items];
         for (size_t x = 0; x < p_artist_list->i_nb_items; x++) {
@@ -266,7 +276,7 @@ static void libraryCallback(void *p_data, const 
vlc_ml_event_t *p_event)
 - (void)updateCachedListOfAlbums
 {
     dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0), ^{
-        const vlc_ml_query_params_t queryParams = { .i_sort = 
self->_sortCriteria, .b_desc = self->_sortDescending };
+        const vlc_ml_query_params_t queryParams = [self queryParams];
         vlc_ml_album_list_t *p_album_list = 
vlc_ml_list_albums(self->_p_mediaLibrary, &queryParams);
         NSMutableArray *mutableArray = [[NSMutableArray alloc] 
initWithCapacity:p_album_list->i_nb_items];
         for (size_t x = 0; x < p_album_list->i_nb_items; x++) {
@@ -300,7 +310,7 @@ static void libraryCallback(void *p_data, const 
vlc_ml_event_t *p_event)
 - (void)updateCachedListOfGenres
 {
     dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0), ^{
-        const vlc_ml_query_params_t queryParams = { .i_sort = 
self->_sortCriteria, .b_desc = self->_sortDescending };
+        const vlc_ml_query_params_t queryParams = [self queryParams];
         vlc_ml_genre_list_t *p_genre_list = 
vlc_ml_list_genres(self->_p_mediaLibrary, &queryParams);
         NSMutableArray *mutableArray = [[NSMutableArray alloc] 
initWithCapacity:p_genre_list->i_nb_items];
         for (size_t x = 0; x < p_genre_list->i_nb_items; x++) {
@@ -339,11 +349,7 @@ static void libraryCallback(void *p_data, const 
vlc_ml_event_t *p_event)
 - (void)updateCachedListOfVideoMedia
 {
     dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0), ^{
-        const vlc_ml_query_params_t queryParameters = {
-            .i_nbResults = 0,
-            .i_sort = self->_sortCriteria,
-            .b_desc = self->_sortDescending
-        };
+        const vlc_ml_query_params_t queryParameters = [self queryParams];
         vlc_ml_media_list_t *p_media_list = 
vlc_ml_list_video_media(self->_p_mediaLibrary, &queryParameters);
         if (p_media_list == NULL) {
             return;
@@ -440,7 +446,7 @@ static void libraryCallback(void *p_data, const 
vlc_ml_event_t *p_event)
 
 - (nullable NSArray <VLCMediaLibraryAlbum *>*)listAlbumsOfParentType:(enum 
vlc_ml_parent_type)parentType forID:(int64_t)ID;
 {
-    const vlc_ml_query_params_t queryParams = { .i_sort = self->_sortCriteria, 
.b_desc = self->_sortDescending };
+    const vlc_ml_query_params_t queryParams = [self queryParams];
     vlc_ml_album_list_t *p_albumList = vlc_ml_list_albums_of(_p_mediaLibrary, 
&queryParams, parentType, ID);
     if (p_albumList == NULL) {
         return nil;
@@ -461,6 +467,16 @@ static void libraryCallback(void *p_data, const 
vlc_ml_event_t *p_event)
     [self dropCaches];
 }
 
+- (void)filterByString:(NSString*)filterString
+{
+    if([filterString isEqualToString:_filterString]) {
+        return;
+    }
+
+    _filterString = filterString;
+    [self dropCaches];
+}
+
 - (void)dropCaches
 {
     _cachedVideoMedia = nil;


=====================================
modules/gui/macosx/library/VLCLibraryWindow.h
=====================================
@@ -72,6 +72,8 @@ NS_ASSUME_NONNULL_BEGIN
 @property (readwrite, weak) IBOutlet NSButton *shufflePlaylistButton;
 @property (readwrite, weak) IBOutlet VLCRoundedCornerTextField 
*playlistCounterTextField;
 @property (readwrite, weak) IBOutlet NSButton *librarySortButton;
+@property (readwrite, weak) IBOutlet NSSearchField *librarySearchField;
+@property (readwrite, weak) IBOutlet NSToolbarItem *librarySearchToolbarItem;
 @property (readwrite, weak) IBOutlet NSButton *playQueueToggle;
 
 @property (readonly) BOOL nativeFullscreenMode;
@@ -87,6 +89,7 @@ NS_ASSUME_NONNULL_BEGIN
 - (IBAction)clearPlaylist:(id)sender;
 - (IBAction)sortPlaylist:(id)sender;
 - (IBAction)sortLibrary:(id)sender;
+- (IBAction)filterLibrary:(id)sender;
 - (IBAction)openMedia:(id)sender;
 - (IBAction)showAndHidePlaylist:(id)sender;
 


=====================================
modules/gui/macosx/library/VLCLibraryWindow.m
=====================================
@@ -190,6 +190,8 @@ static void addShadow(NSImageView *__unsafe_unretained 
imageView)
 
     [self.gridVsListSegmentedControl setHidden:NO];
     [self.librarySortButton setHidden:NO];
+    [self.librarySearchField setEnabled:YES];
+
     self.videoView.translatesAutoresizingMaskIntoConstraints = NO;
     [self.contentView addSubview:self.videoView];
     [self.contentView addConstraint:[NSLayoutConstraint 
constraintWithItem:self.videoView attribute:NSLayoutAttributeWidth 
relatedBy:NSLayoutRelationEqual toItem:self.mainSplitView 
attribute:NSLayoutAttributeWidth multiplier:1. constant:1.]];
@@ -559,6 +561,7 @@ static void addShadow(NSImageView *__unsafe_unretained 
imageView)
     }
     
     _librarySortButton.hidden = NO;
+    _librarySearchField.enabled = YES;
     _optionBarView.hidden = YES;
     _audioSegmentedControl.hidden = YES;
 
@@ -610,6 +613,7 @@ static void addShadow(NSImageView *__unsafe_unretained 
imageView)
     }
     
     _librarySortButton.hidden = NO;
+    _librarySearchField.enabled = YES;
     _optionBarView.hidden = NO;
     _audioSegmentedControl.hidden = NO;
     
@@ -637,6 +641,8 @@ static void addShadow(NSImageView *__unsafe_unretained 
imageView)
     }
     _mediaSourceDataSource.mediaSourceMode = 
_segmentedTitleControl.selectedSegment == 2 ? VLCMediaSourceModeLAN : 
VLCMediaSourceModeInternet;
     _librarySortButton.hidden = YES;
+    _librarySearchField.enabled = NO;
+    [self clearLibraryFilterString];
     _optionBarView.hidden = YES;
     _audioSegmentedControl.hidden = YES;
     [_mediaSourceDataSource reloadViews];
@@ -672,6 +678,17 @@ static void addShadow(NSImageView *__unsafe_unretained 
imageView)
     [NSMenu popUpContextMenu:_librarySortingMenuController.librarySortingMenu 
withEvent:[NSApp currentEvent] forView:sender];
 }
 
+- (IBAction)filterLibrary:(id)sender
+{
+    [[[VLCMain sharedInstance] libraryController] 
filterByString:_librarySearchField.stringValue];
+}
+
+- (void)clearLibraryFilterString
+{
+    _librarySearchField.stringValue = @"";
+    [self filterLibrary:self];
+}
+
 - (IBAction)openMedia:(id)sender
 {
     [[[VLCMain sharedInstance] open] openFileGeneric];
@@ -794,6 +811,9 @@ static void addShadow(NSImageView *__unsafe_unretained 
imageView)
     [self.videoView setHidden:NO];
     [self.gridVsListSegmentedControl setHidden:YES];
     [self.librarySortButton setHidden:YES];
+    [self.librarySearchField setEnabled:NO];
+    [self clearLibraryFilterString];
+
     if (self.nativeFullscreenMode) {
         if ([self hasActiveVideo] && [self fullscreen]) {
             [self hideControlsBar];
@@ -830,6 +850,7 @@ static void addShadow(NSImageView *__unsafe_unretained 
imageView)
     [self.videoView setHidden:YES];
     [self.gridVsListSegmentedControl setHidden:NO];
     [self.librarySortButton setHidden:NO];
+    [self.librarySearchField setEnabled:YES];
 
     [self segmentedControlAction:nil];
 



View it on GitLab: 
https://code.videolan.org/videolan/vlc/-/commit/f9057380231f39d362c59d4cb3c82063014e3182

-- 
View it on GitLab: 
https://code.videolan.org/videolan/vlc/-/commit/f9057380231f39d362c59d4cb3c82063014e3182
You're receiving this email because of your account on code.videolan.org.


VideoLAN code repository instance
_______________________________________________
vlc-commits mailing list
vlc-commits@videolan.org
https://mailman.videolan.org/listinfo/vlc-commits

Reply via email to