diff --git a/extras/package/macosx/VLC.xcodeproj/project.pbxproj b/extras/package/macosx/VLC.xcodeproj/project.pbxproj index 7aac5fe4a841b730cdb615b58eab9699bd67c6c3..98fc9382542c636bfbf626c69e7b2a268a48227e 100644 --- a/extras/package/macosx/VLC.xcodeproj/project.pbxproj +++ b/extras/package/macosx/VLC.xcodeproj/project.pbxproj @@ -148,6 +148,7 @@ 7DC21A7422049A6600F98A02 /* VLCOpenInputMetadata.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DC21A7322049A6600F98A02 /* VLCOpenInputMetadata.m */; }; 7DD2F5C52081B73B007EE187 /* VLCRemoteControlService.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DD2F5C42081B73B007EE187 /* VLCRemoteControlService.m */; }; 7DE9C7DD220728420089108F /* VLCPlayerController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DE9C7DC220728420089108F /* VLCPlayerController.m */; }; + 7DF14FBD2270CB1C0008ABE4 /* VLCMediaSourceCollectionViewItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DF14FBB2270CB1C0008ABE4 /* VLCMediaSourceCollectionViewItem.m */; }; 7DFBDCA82269E77500B700A5 /* VLCLibraryController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DFBDCA72269E77500B700A5 /* VLCLibraryController.m */; }; 7DFBDCAB2269E77F00B700A5 /* VLCLibraryModel.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DFBDCAA2269E77F00B700A5 /* VLCLibraryModel.m */; }; 7DFBDCAE2269ED0C00B700A5 /* VLCLibraryDataSource.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DFBDCAD2269ED0C00B700A5 /* VLCLibraryDataSource.m */; }; @@ -509,6 +510,9 @@ 7DE9C7DC220728420089108F /* VLCPlayerController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCPlayerController.m; sourceTree = "<group>"; }; 7DF0435E1972E26A0022B534 /* VLCAddonListItem.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VLCAddonListItem.h; sourceTree = "<group>"; }; 7DF0435F1972E26A0022B534 /* VLCAddonListItem.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCAddonListItem.m; sourceTree = "<group>"; }; + 7DF14FBA2270CB1C0008ABE4 /* VLCMediaSourceCollectionViewItem.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VLCMediaSourceCollectionViewItem.h; sourceTree = "<group>"; }; + 7DF14FBB2270CB1C0008ABE4 /* VLCMediaSourceCollectionViewItem.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCMediaSourceCollectionViewItem.m; sourceTree = "<group>"; }; + 7DF14FBC2270CB1C0008ABE4 /* VLCMediaSourceCollectionViewItem.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = VLCMediaSourceCollectionViewItem.xib; sourceTree = "<group>"; }; 7DF812ED1B555A340052293C /* VLCPlaybackContinuityController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VLCPlaybackContinuityController.h; sourceTree = "<group>"; }; 7DF812EE1B555A340052293C /* VLCPlaybackContinuityController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCPlaybackContinuityController.m; sourceTree = "<group>"; }; 7DF812EF1B555C8E0052293C /* VLCKeyboardBacklightControl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VLCKeyboardBacklightControl.h; sourceTree = "<group>"; }; @@ -1323,6 +1327,8 @@ 7DFBDCBD226CED7200B700A5 /* VLCMediaSource.m */, 7DFBDCC2226E445500B700A5 /* VLCMediaSourceDataSource.h */, 7DFBDCC3226E445500B700A5 /* VLCMediaSourceDataSource.m */, + 7DF14FBA2270CB1C0008ABE4 /* VLCMediaSourceCollectionViewItem.h */, + 7DF14FBB2270CB1C0008ABE4 /* VLCMediaSourceCollectionViewItem.m */, ); path = "media-source"; sourceTree = "<group>"; @@ -1432,6 +1438,7 @@ 7D0F64002201F66D00FDB91F /* VLCPlaylistTableCellView.xib */, 7D445D8F220339D400263D34 /* VLCPlaylistMenu.xib */, 7D0F64052202047900FDB91F /* VLCLibraryCollectionViewItem.xib */, + 7DF14FBC2270CB1C0008ABE4 /* VLCMediaSourceCollectionViewItem.xib */, 6B82241A1E4D2A9000833BE1 /* VLCStatusBarIconMainMenu.xib */, 6B8224181E4D2A9000833BE1 /* VLCFullScreenPanel.xib */, 6B8223FE1E4D2A8F00833BE1 /* About.xib */, @@ -1633,6 +1640,7 @@ 1C3113C71E508C6900D4DD76 /* VLCOpenWindowController.m in Sources */, 7D0F64062202047900FDB91F /* VLCLibraryCollectionViewItem.m in Sources */, 7D713D322201AE350042BEB7 /* VLCLibraryWindow.m in Sources */, + 7DF14FBD2270CB1C0008ABE4 /* VLCMediaSourceCollectionViewItem.m in Sources */, 1C3113C91E508C6900D4DD76 /* VLCOutput.m in Sources */, 1C1C62011F8260A90052DD4F /* VLCWrappableTextField.m in Sources */, 6BBB05DA1EEFEA29003A1019 /* VLCHUDOutlineView.m in Sources */, diff --git a/modules/gui/macosx/Makefile.am b/modules/gui/macosx/Makefile.am index 5eca280481f72023327e5344233bfbccc4c694ec..78ac1c9233a5715ae38b5c5a17a50299f1ad80d5 100644 --- a/modules/gui/macosx/Makefile.am +++ b/modules/gui/macosx/Makefile.am @@ -71,6 +71,8 @@ libmacosx_plugin_la_SOURCES = \ gui/macosx/main/macosx.m \ gui/macosx/media-source/VLCMediaSource.h \ gui/macosx/media-source/VLCMediaSource.m \ + gui/macosx/media-source/VLCMediaSourceCollectionViewItem.h \ + gui/macosx/media-source/VLCMediaSourceCollectionViewItem.m \ gui/macosx/media-source/VLCMediaSourceDataSource.h \ gui/macosx/media-source/VLCMediaSourceDataSource.m \ gui/macosx/media-source/VLCMediaSourceProvider.h \ @@ -241,6 +243,7 @@ libmacosx_plugin_la_XIB_SOURCES = \ gui/macosx/UI/VLCPlaylistMenu.xib \ gui/macosx/UI/VLCPlaylistTableCellView.xib \ gui/macosx/UI/VLCLibraryCollectionViewItem.xib \ + gui/macosx/UI/VLCMediaSourceCollectionViewItem.xib \ gui/macosx/UI/MediaInfo.xib \ gui/macosx/UI/Open.xib \ gui/macosx/UI/PlaylistAccessoryView.xib \ diff --git a/modules/gui/macosx/UI/VLCLibraryWindow.xib b/modules/gui/macosx/UI/VLCLibraryWindow.xib index 4308834f0fc0e277ddf722ce7f8ca59c77f03ed0..857e20fc7ee0a34c2610781fa4786c6afd9db6f9 100644 --- a/modules/gui/macosx/UI/VLCLibraryWindow.xib +++ b/modules/gui/macosx/UI/VLCLibraryWindow.xib @@ -69,75 +69,41 @@ <autoresizingMask key="autoresizingMask"/> </scroller> </scrollView> - <scrollView borderType="groove" autohidesScrollers="YES" horizontalLineScroll="19" horizontalPageScroll="10" verticalLineScroll="19" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="StN-Jd-vFI"> + <scrollView wantsLayer="YES" borderType="none" autohidesScrollers="YES" horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="cFG-c9-cI9"> <rect key="frame" x="0.0" y="0.0" width="242" height="291"/> - <clipView key="contentView" id="bCd-C3-hHf"> - <rect key="frame" x="2" y="2" width="238" height="287"/> + <clipView key="contentView" id="tI4-x3-55j"> + <rect key="frame" x="0.0" y="0.0" width="242" height="291"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <subviews> - <tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" alternatingRowBackgroundColors="YES" columnSelection="YES" multipleSelection="NO" autosaveColumns="NO" rowSizeStyle="automatic" viewBased="YES" id="jpB-GR-lUa"> - <rect key="frame" x="0.0" y="0.0" width="238" height="287"/> - <autoresizingMask key="autoresizingMask"/> - <size key="intercellSpacing" width="3" height="2"/> - <color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/> - <color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/> - <tableColumns> - <tableColumn width="235" minWidth="40" maxWidth="1000" id="J5a-b7-jfY"> - <tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border"> - <font key="font" metaFont="smallSystem"/> - <color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/> - </tableHeaderCell> - <textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" title="Text Cell" id="ecA-vR-33j"> - <font key="font" metaFont="system"/> - <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/> - </textFieldCell> - <tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/> - <prototypeCellViews> - <tableCellView id="SJC-NO-4mY"> - <rect key="frame" x="1" y="1" width="235" height="17"/> - <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> - <subviews> - <textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="xoJ-y7-ayy"> - <rect key="frame" x="0.0" y="0.0" width="235" height="17"/> - <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/> - <textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="qc9-Zy-xBC"> - <font key="font" metaFont="system"/> - <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/> - <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/> - </textFieldCell> - </textField> - </subviews> - <connections> - <outlet property="textField" destination="xoJ-y7-ayy" id="Vbb-iK-ddd"/> - </connections> - </tableCellView> - </prototypeCellViews> - </tableColumn> - </tableColumns> - </tableView> + <collectionView id="r7v-GI-W1U"> + <rect key="frame" x="0.0" y="0.0" width="242" height="158"/> + <autoresizingMask key="autoresizingMask" widthSizable="YES"/> + <collectionViewFlowLayout key="collectionViewLayout" minimumInteritemSpacing="10" minimumLineSpacing="10" id="v0C-1b-7Ss"> + <size key="itemSize" width="210" height="150"/> + </collectionViewFlowLayout> + <color key="primaryBackgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/> + </collectionView> </subviews> </clipView> - <scroller key="horizontalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="iwL-84-2YW"> - <rect key="frame" x="2" y="117" width="236" height="16"/> + <scroller key="horizontalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="WUt-1y-tQd"> + <rect key="frame" x="1" y="143" width="240" height="16"/> <autoresizingMask key="autoresizingMask"/> </scroller> - <scroller key="verticalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" horizontal="NO" id="H17-SV-gee"> - <rect key="frame" x="224" y="17" width="15" height="102"/> + <scroller key="verticalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" doubleValue="1" horizontal="NO" id="247-FY-ZXk"> + <rect key="frame" x="234" y="1" width="15" height="143"/> <autoresizingMask key="autoresizingMask"/> </scroller> </scrollView> </subviews> <constraints> - <constraint firstAttribute="bottom" secondItem="StN-Jd-vFI" secondAttribute="bottom" id="EVe-lP-xOg"/> + <constraint firstAttribute="trailing" secondItem="cFG-c9-cI9" secondAttribute="trailing" id="0zl-H8-IAo"/> + <constraint firstItem="cFG-c9-cI9" firstAttribute="leading" secondItem="iSp-bV-w6B" secondAttribute="leading" id="8SS-VG-YAQ"/> <constraint firstItem="nXS-11-7iK" firstAttribute="leading" secondItem="iSp-bV-w6B" secondAttribute="leading" id="SPv-yC-58y"/> <constraint firstItem="nXS-11-7iK" firstAttribute="top" secondItem="iSp-bV-w6B" secondAttribute="top" id="Sje-VZ-Kcw"/> <constraint firstAttribute="trailing" secondItem="nXS-11-7iK" secondAttribute="trailing" id="Tuh-vj-qaU"/> - <constraint firstAttribute="trailing" secondItem="StN-Jd-vFI" secondAttribute="trailing" id="aBt-Lo-Cvu"/> - <constraint firstItem="StN-Jd-vFI" firstAttribute="leading" secondItem="iSp-bV-w6B" secondAttribute="leading" id="bGP-Wn-WoI"/> + <constraint firstAttribute="bottom" secondItem="cFG-c9-cI9" secondAttribute="bottom" id="oAJ-yE-oGZ"/> <constraint firstAttribute="bottom" secondItem="nXS-11-7iK" secondAttribute="bottom" id="piy-A4-FaO"/> - <constraint firstItem="StN-Jd-vFI" firstAttribute="top" secondItem="iSp-bV-w6B" secondAttribute="top" id="y5h-3Q-xb5"/> + <constraint firstItem="cFG-c9-cI9" firstAttribute="top" secondItem="iSp-bV-w6B" secondAttribute="top" id="wBq-BN-AMy"/> </constraints> </customView> <customView id="dus-WQ-AmE"> @@ -359,8 +325,8 @@ </view> <connections> <outlet property="libraryCollectionView" destination="B8x-e8-7zp" id="djF-Lw-nXT"/> - <outlet property="mediaSourceScrollView" destination="StN-Jd-vFI" id="i2e-GX-VfP"/> - <outlet property="mediaSourceTableView" destination="jpB-GR-lUa" id="NQ0-0c-wdU"/> + <outlet property="mediaSourceCollectionView" destination="r7v-GI-W1U" id="3JJ-GU-o5o"/> + <outlet property="mediaSourceScrollView" destination="cFG-c9-cI9" id="gRO-Y7-kdb"/> <outlet property="playlistTableView" destination="Fr1-af-8gb" id="yaB-Ab-jrx"/> <outlet property="segmentedTitleControl" destination="W1M-0o-qYG" id="Gw1-T6-78k"/> <outlet property="videoView" destination="12s-0J-Uvj" id="zTg-s0-qZ5"/> diff --git a/modules/gui/macosx/UI/VLCMediaSourceCollectionViewItem.xib b/modules/gui/macosx/UI/VLCMediaSourceCollectionViewItem.xib new file mode 100644 index 0000000000000000000000000000000000000000..d7dfe13eb452e7cf3911cb9cbc93e967f7524e3b --- /dev/null +++ b/modules/gui/macosx/UI/VLCMediaSourceCollectionViewItem.xib @@ -0,0 +1,45 @@ +<?xml version="1.0" encoding="UTF-8"?> +<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct"> + <dependencies> + <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14490.70"/> + <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> + </dependencies> + <objects> + <customObject id="-2" userLabel="File's Owner" customClass="VLCMediaSourceCollectionViewItem"> + <connections> + <outlet property="mediaImageView" destination="rko-Nc-j4c" id="4SM-TL-qbd"/> + <outlet property="titleTextField" destination="jJ3-BQ-y8F" id="YO5-1X-TIk"/> + <outlet property="view" destination="Hz6-mo-xeY" id="0bl-1N-x8E"/> + </connections> + </customObject> + <customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/> + <customObject id="-3" userLabel="Application" customClass="NSObject"/> + <customView id="Hz6-mo-xeY"> + <rect key="frame" x="0.0" y="0.0" width="480" height="272"/> + <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> + <subviews> + <customView translatesAutoresizingMaskIntoConstraints="NO" id="rko-Nc-j4c" customClass="VLCImageView"> + <rect key="frame" x="198" y="178" width="84" height="84"/> + <constraints> + <constraint firstAttribute="width" secondItem="rko-Nc-j4c" secondAttribute="height" multiplier="1:1" id="tGe-gB-9im"/> + <constraint firstAttribute="width" constant="84" id="wkF-ab-s15"/> + </constraints> + </customView> + <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="jJ3-BQ-y8F"> + <rect key="frame" x="223" y="150" width="35" height="16"/> + <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="Utm-F6-CKx"> + <font key="font" metaFont="controlContent"/> + <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/> + <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/> + </textFieldCell> + </textField> + </subviews> + <constraints> + <constraint firstItem="jJ3-BQ-y8F" firstAttribute="centerX" secondItem="Hz6-mo-xeY" secondAttribute="centerX" id="6rw-Fo-fZJ"/> + <constraint firstItem="jJ3-BQ-y8F" firstAttribute="top" secondItem="rko-Nc-j4c" secondAttribute="bottom" constant="12" id="86t-IA-OYg"/> + <constraint firstItem="rko-Nc-j4c" firstAttribute="top" secondItem="Hz6-mo-xeY" secondAttribute="top" constant="10" id="Va8-hk-LhR"/> + <constraint firstItem="rko-Nc-j4c" firstAttribute="centerX" secondItem="Hz6-mo-xeY" secondAttribute="centerX" id="y9r-R9-030"/> + </constraints> + </customView> + </objects> +</document> diff --git a/modules/gui/macosx/library/VLCLibraryModel.h b/modules/gui/macosx/library/VLCLibraryModel.h index 4dd09c8603ab25aab931883d115cfe81867dd5f2..555147a5784c844981ba44400ba207025e957c2d 100644 --- a/modules/gui/macosx/library/VLCLibraryModel.h +++ b/modules/gui/macosx/library/VLCLibraryModel.h @@ -29,7 +29,6 @@ NS_ASSUME_NONNULL_BEGIN typedef NS_ENUM(NSInteger, VLCLibraryMode) { VLCLibraryModeAudio, VLCLibraryModeVideo, - VLCLibraryModeNetwork, }; @class VLCMediaLibraryMediaItem; diff --git a/modules/gui/macosx/library/VLCLibraryWindow.h b/modules/gui/macosx/library/VLCLibraryWindow.h index 2f17befa2ac3874786837341ebae2c9e4a710048..26e2766ec029813c627d927f0d5b40b5b632a1d6 100644 --- a/modules/gui/macosx/library/VLCLibraryWindow.h +++ b/modules/gui/macosx/library/VLCLibraryWindow.h @@ -37,7 +37,7 @@ NS_ASSUME_NONNULL_BEGIN @property (readwrite, weak) IBOutlet NSSegmentedControl *segmentedTitleControl; @property (readwrite, weak) IBOutlet VLCLibraryCollectionView *libraryCollectionView; -@property (readwrite, weak) IBOutlet NSTableView *mediaSourceTableView; +@property (readwrite, weak) IBOutlet NSCollectionView *mediaSourceCollectionView; @property (readwrite, weak) IBOutlet NSScrollView *mediaSourceScrollView; @property (readwrite, weak) IBOutlet NSTableView *playlistTableView; diff --git a/modules/gui/macosx/library/VLCLibraryWindow.m b/modules/gui/macosx/library/VLCLibraryWindow.m index 97a86c63a5aaa777720a818992fb2894b907f300..a6c5b96ced8eea34fc8cbd498ecd19a9ebc63721 100644 --- a/modules/gui/macosx/library/VLCLibraryWindow.m +++ b/modules/gui/macosx/library/VLCLibraryWindow.m @@ -34,6 +34,7 @@ #import "library/VLCLibraryModel.h" #import "library/VLCLibraryMenuController.h" +#import "media-source/VLCMediaSourceCollectionViewItem.h" #import "media-source/VLCMediaSourceDataSource.h" #import "windows/mainwindow/VLCControlsBarCommon.h" @@ -77,12 +78,13 @@ static const float f_playlist_row_height = 72.; _fspanel = [[VLCFSPanelController alloc] init]; [_fspanel showWindow:self]; - _segmentedTitleControl.segmentCount = 3; + _segmentedTitleControl.segmentCount = 4; [_segmentedTitleControl setTarget:self]; [_segmentedTitleControl setAction:@selector(segmentedControlAction:)]; [_segmentedTitleControl setLabel:_NS("Music") forSegment:0]; [_segmentedTitleControl setLabel:_NS("Video") forSegment:1]; - [_segmentedTitleControl setLabel:_NS("Network") forSegment:2]; + [_segmentedTitleControl setLabel:_NS("Local Network") forSegment:2]; + [_segmentedTitleControl setLabel:_NS("Internet") forSegment:3]; [_segmentedTitleControl sizeToFit]; VLCMain *mainInstance = [VLCMain sharedInstance]; @@ -105,9 +107,9 @@ static const float f_playlist_row_height = 72.; [_libraryCollectionView registerClass:[VLCLibraryCollectionViewItem class] forItemWithIdentifier:VLCLibraryCellIdentifier]; _mediaSourceDataSource = [[VLCMediaSourceDataSource alloc] init]; - _mediaSourceTableView.dataSource = _mediaSourceDataSource; - _mediaSourceTableView.delegate = _mediaSourceDataSource; - _mediaSourceTableView.rowHeight = f_playlist_row_height; + _mediaSourceCollectionView.dataSource = _mediaSourceDataSource; + _mediaSourceCollectionView.delegate = _mediaSourceDataSource; + [_mediaSourceCollectionView registerClass:[VLCMediaSourceCollectionViewItem class] forItemWithIdentifier:VLCMediaSourceCellIdentifier]; [self segmentedControlAction:nil]; } @@ -135,10 +137,9 @@ static const float f_playlist_row_height = 72.; break; default: - _libraryDataSource.libraryModel.libraryMode = VLCLibraryModeNetwork; _mediaSourceScrollView.hidden = NO; _libraryCollectionView.hidden = YES; - [_mediaSourceTableView reloadData]; + [_mediaSourceCollectionView reloadData]; break; } } diff --git a/modules/gui/macosx/media-source/VLCMediaSource.m b/modules/gui/macosx/media-source/VLCMediaSource.m index a7a16154652c0aafcb2a74d0d47f40489bca9b11..7e099310023d92406986ed7f35433514986f2a70 100644 --- a/modules/gui/macosx/media-source/VLCMediaSource.m +++ b/modules/gui/macosx/media-source/VLCMediaSource.m @@ -108,6 +108,9 @@ static const struct vlc_media_tree_callbacks treeCallbacks = { - (void)preparseInputItemWithinTree:(VLCInputItem *)inputItem { + if (inputItem == nil) { + return; + } vlc_media_tree_Preparse(_p_mediaSource->tree, _p_libvlcInstance, inputItem.vlcInputItem); } diff --git a/modules/gui/macosx/media-source/VLCMediaSourceCollectionViewItem.h b/modules/gui/macosx/media-source/VLCMediaSourceCollectionViewItem.h new file mode 100644 index 0000000000000000000000000000000000000000..0ff425171238ec9401010c85e458bad719324308 --- /dev/null +++ b/modules/gui/macosx/media-source/VLCMediaSourceCollectionViewItem.h @@ -0,0 +1,38 @@ +/***************************************************************************** + * VLCMediaSourceCollectionViewItem.h: MacOS X interface module + ***************************************************************************** + * Copyright (C) 2019 VLC authors and VideoLAN + * + * Authors: Felix Paul Kühne <fkuehne # videolan -dot- org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#import <Cocoa/Cocoa.h> + +NS_ASSUME_NONNULL_BEGIN + +@class VLCImageView; + +extern NSString *VLCMediaSourceCellIdentifier; + +@interface VLCMediaSourceCollectionViewItem : NSCollectionViewItem + +@property (readwrite, assign) IBOutlet NSTextField *titleTextField; +@property (readwrite, assign) IBOutlet VLCImageView *mediaImageView; + +@end + +NS_ASSUME_NONNULL_END diff --git a/modules/gui/macosx/media-source/VLCMediaSourceCollectionViewItem.m b/modules/gui/macosx/media-source/VLCMediaSourceCollectionViewItem.m new file mode 100644 index 0000000000000000000000000000000000000000..29b7b9b71ad1be6259c22e20314434025fa9b464 --- /dev/null +++ b/modules/gui/macosx/media-source/VLCMediaSourceCollectionViewItem.m @@ -0,0 +1,40 @@ +/***************************************************************************** + * VLCMediaSourceCollectionViewItem.m: MacOS X interface module + ***************************************************************************** + * Copyright (C) 2019 VLC authors and VideoLAN + * + * Authors: Felix Paul Kühne <fkuehne # videolan -dot- org> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#import "VLCMediaSourceCollectionViewItem.h" +#import "views/VLCImageView.h" + +NSString *VLCMediaSourceCellIdentifier = @"VLCMediaSourceCellIdentifier"; + +@interface VLCMediaSourceCollectionViewItem () + +@end + +@implementation VLCMediaSourceCollectionViewItem + +- (void)viewDidLoad { + [super viewDidLoad]; + + [self.mediaImageView setImage:[NSImage imageNamed:@"NSApplicationIcon"]]; +} + +@end diff --git a/modules/gui/macosx/media-source/VLCMediaSourceDataSource.h b/modules/gui/macosx/media-source/VLCMediaSourceDataSource.h index d698fa749d1ddd5f13b6ff52c1073fd7c1125858..97bf80318293342be00871cb156c1b85f3ad1442 100644 --- a/modules/gui/macosx/media-source/VLCMediaSourceDataSource.h +++ b/modules/gui/macosx/media-source/VLCMediaSourceDataSource.h @@ -22,9 +22,16 @@ #import <Cocoa/Cocoa.h> +typedef NS_ENUM(NSInteger, VLCMediaSourceMode) { + VLCMediaSourceModeLAN, + VLCMediaSourceModeInternet, +}; + NS_ASSUME_NONNULL_BEGIN -@interface VLCMediaSourceDataSource : NSObject <NSTableViewDataSource, NSTableViewDelegate> +@interface VLCMediaSourceDataSource : NSObject <NSCollectionViewDataSource, NSCollectionViewDelegate> + +@property (readwrite) VLCMediaSourceMode mediaSourceMode; @end diff --git a/modules/gui/macosx/media-source/VLCMediaSourceDataSource.m b/modules/gui/macosx/media-source/VLCMediaSourceDataSource.m index fee40f05ac948a818d8c258c86d7353aa9e65515..e5b14c22f3c7d991a463c45dd68e7306fa0acf03 100644 --- a/modules/gui/macosx/media-source/VLCMediaSourceDataSource.m +++ b/modules/gui/macosx/media-source/VLCMediaSourceDataSource.m @@ -24,14 +24,12 @@ #import "media-source/VLCMediaSourceProvider.h" #import "media-source/VLCMediaSource.h" -#import "playlist/VLCPlaylistTableCellView.h" +#import "media-source/VLCMediaSourceCollectionViewItem.h" #import "main/VLCMain.h" #import "library/VLCInputItem.h" #import "extensions/NSString+Helpers.h" -static NSString *VLCMediaSourceCellIdentifier = @"VLCMediaSourceCellIdentifier"; - @interface VLCMediaSourceDataSource () { NSArray *_mediaDiscovery; @@ -53,94 +51,60 @@ static NSString *VLCMediaSourceCellIdentifier = @"VLCMediaSourceCellIdentifier"; - (void)lazyLoadMediaSources { - NSMutableArray *mutableArray = [[NSMutableArray alloc] init]; - NSArray *mediaDiscoveryForDevices = [VLCMediaSourceProvider listOfMediaSourcesForCategory:SD_CAT_DEVICES]; - if (mediaDiscoveryForDevices.count > 0) { - [mutableArray addObject:_NS("Devices")]; - [mutableArray addObjectsFromArray:mediaDiscoveryForDevices]; - } - NSArray *mediaDiscoveryForLAN = [VLCMediaSourceProvider listOfMediaSourcesForCategory:SD_CAT_LAN]; - if (mediaDiscoveryForLAN.count > 0) { - [mutableArray addObject:_NS("Local Network")]; - [mutableArray addObjectsFromArray:mediaDiscoveryForLAN]; - } - - NSArray *mediaDiscoveryForInternet = [VLCMediaSourceProvider listOfMediaSourcesForCategory:SD_CAT_INTERNET]; - if (mediaDiscoveryForInternet.count > 0) { - [mutableArray addObject:_NS("Internet")]; - [mutableArray addObjectsFromArray:mediaDiscoveryForInternet]; - } - - NSArray *mediaDiscoveryForMyComputer = [VLCMediaSourceProvider listOfMediaSourcesForCategory:SD_CAT_MYCOMPUTER]; - if (mediaDiscoveryForMyComputer.count > 0) { - [mutableArray addObject:_NS("My Computer")]; - [mutableArray addObjectsFromArray:mediaDiscoveryForMyComputer]; + NSUInteger count = mediaDiscoveryForLAN.count; + if (count > 0) { + for (NSUInteger x = 0; x < count; x++) { + VLCMediaSource *mediaSource = mediaDiscoveryForLAN[x]; + VLCInputNode *rootNode = [mediaSource rootNode]; + [mediaSource preparseInputItemWithinTree:rootNode.inputItem]; + } } - - _mediaDiscovery = [mutableArray copy]; + _mediaDiscovery = mediaDiscoveryForLAN; } -- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView +- (NSInteger)collectionView:(NSCollectionView *)collectionView + numberOfItemsInSection:(NSInteger)section { - return _mediaDiscovery.count; + switch (self.mediaSourceMode) { + case VLCMediaSourceModeLAN: + return _mediaDiscovery.count; + break; + + case VLCMediaSourceModeInternet: + default: + return 0; + break; + } } -- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row +- (NSCollectionViewItem *)collectionView:(NSCollectionView *)collectionView + itemForRepresentedObjectAtIndexPath:(NSIndexPath *)indexPath { - VLCPlaylistTableCellView *cellView = [tableView makeViewWithIdentifier:VLCMediaSourceCellIdentifier owner:self]; - - if (cellView == nil) { - /* the following code saves us an instance of NSViewController which we don't need */ - NSNib *nib = [[NSNib alloc] initWithNibNamed:@"VLCPlaylistTableCellView" bundle:nil]; - NSArray *topLevelObjects; - if (![nib instantiateWithOwner:self topLevelObjects:&topLevelObjects]) { - msg_Err(getIntf(), "Failed to load nib file to show playlist items"); - return nil; - } - - for (id topLevelObject in topLevelObjects) { - if ([topLevelObject isKindOfClass:[VLCPlaylistTableCellView class]]) { - cellView = topLevelObject; - break; - } - } - cellView.identifier = VLCMediaSourceCellIdentifier; + VLCMediaSourceCollectionViewItem *viewItem = [collectionView makeItemWithIdentifier:VLCMediaSourceCellIdentifier forIndexPath:indexPath]; + + NSArray *mediaArray; + switch (self.mediaSourceMode) { + case VLCMediaSourceModeLAN: + mediaArray = _mediaDiscovery; + break; + + case VLCMediaSourceModeInternet: + default: + NSAssert(1, @"no representation for selected media source mode %li", (long)self.mediaSourceMode); + mediaArray = @[]; + break; } - if ([self tableView:tableView isGroupRow:row]) { - NSString *labelString = _mediaDiscovery[row]; - cellView.mediaTitleTextField.hidden = NO; - cellView.secondaryMediaTitleTextField.hidden = YES; - cellView.artistTextField.hidden = YES; - cellView.mediaTitleTextField.stringValue = labelString; - cellView.durationTextField.stringValue = @""; - } else { - VLCMediaSource *mediaSource = _mediaDiscovery[row]; - - VLCInputItem *inputItem = mediaSource.rootNode.inputItem; - if (inputItem) { - cellView.mediaTitleTextField.hidden = YES; - cellView.secondaryMediaTitleTextField.hidden = NO; - cellView.artistTextField.hidden = NO; - cellView.secondaryMediaTitleTextField.stringValue = mediaSource.mediaSourceDescription; - cellView.artistTextField.stringValue = inputItem.name; - cellView.durationTextField.stringValue = [NSString stringWithTimeFromTicks:inputItem.duration]; - } else { - cellView.mediaTitleTextField.hidden = NO; - cellView.secondaryMediaTitleTextField.hidden = YES; - cellView.artistTextField.hidden = YES; - cellView.mediaTitleTextField.stringValue = mediaSource.mediaSourceDescription; - cellView.durationTextField.stringValue = @""; - } - } + VLCMediaSource *mediaSource = mediaArray[indexPath.item]; + viewItem.titleTextField.stringValue = mediaSource.mediaSourceDescription; - return cellView; + return viewItem; } -- (BOOL)tableView:(NSTableView *)tableView isGroupRow:(NSInteger)row +- (void)collectionView:(NSCollectionView *)collectionView didSelectItemsAtIndexPaths:(NSSet<NSIndexPath *> *)indexPaths { - return [_mediaDiscovery[row] isKindOfClass:[NSString class]]; + NSLog(@"media source selection changed: %@", indexPaths); } @end diff --git a/po/POTFILES.in b/po/POTFILES.in index 296db52688eb5b35a1d0457a28ab711fa892e6ef..596134165d5c28247e88710f61ac248a63e82f87 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -489,6 +489,8 @@ modules/gui/macosx/main/VLCMain.m modules/gui/macosx/main/macosx.m modules/gui/macosx/media-source/VLCMediaSource.h modules/gui/macosx/media-source/VLCMediaSource.m +modules/gui/macosx/media-source/VLCMediaSourceCollectionViewItem.h +modules/gui/macosx/media-source/VLCMediaSourceCollectionViewItem.m modules/gui/macosx/media-source/VLCMediaSourceDataSource.h modules/gui/macosx/media-source/VLCMediaSourceDataSource.m modules/gui/macosx/media-source/VLCMediaSourceProvider.h