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