diff --git a/SharedSources/MediaEditCell.xib b/SharedSources/MediaEditCell.xib deleted file mode 100644 index 571785d73804acaba092f360cee9a675b8c475bd..0000000000000000000000000000000000000000 --- a/SharedSources/MediaEditCell.xib +++ /dev/null @@ -1,100 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14868" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES"> - <device id="retina4_7" orientation="portrait" appearance="light"/> - <dependencies> - <deployment identifier="iOS"/> - <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14824"/> - <capability name="Safe area layout guides" minToolsVersion="9.0"/> - <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> - </dependencies> - <objects> - <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/> - <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/> - <collectionReusableView opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" id="U0b-qz-VRr" customClass="MediaEditCell" customModule="VLC" customModuleProvider="target"> - <rect key="frame" x="0.0" y="0.0" width="375" height="86"/> - <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> - <subviews> - <stackView opaque="NO" contentMode="scaleToFill" alignment="center" spacing="20" translatesAutoresizingMaskIntoConstraints="NO" id="QHO-Op-40P"> - <rect key="frame" x="12" y="12" width="351" height="62"/> - <subviews> - <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="checkboxEmpty" translatesAutoresizingMaskIntoConstraints="NO" id="RHG-II-xmF"> - <rect key="frame" x="0.0" y="21" width="20" height="20"/> - <constraints> - <constraint firstAttribute="width" constant="20" id="KHh-bO-FPO"/> - <constraint firstAttribute="width" secondItem="RHG-II-xmF" secondAttribute="height" id="p2u-hc-SRe"/> - </constraints> - </imageView> - <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="W4f-6Y-az7"> - <rect key="frame" x="40" y="0.0" width="62" height="62"/> - <color key="backgroundColor" white="0.66666666669999997" alpha="1" colorSpace="calibratedWhite"/> - <constraints> - <constraint firstAttribute="width" secondItem="W4f-6Y-az7" secondAttribute="height" multiplier="1:1" id="0S0-Dm-pFV" userLabel="AudioAspect = 1:1"/> - <constraint firstAttribute="height" relation="greaterThanOrEqual" constant="52" id="N5E-7I-evU"/> - <constraint firstAttribute="width" secondItem="W4f-6Y-az7" secondAttribute="height" multiplier="16:10" id="o2R-2I-WPK" userLabel="VideoAspectRatio"/> - </constraints> - <variation key="default"> - <mask key="constraints"> - <exclude reference="o2R-2I-WPK"/> - </mask> - </variation> - </imageView> - <stackView opaque="NO" contentMode="scaleToFill" axis="vertical" alignment="top" spacing="5" translatesAutoresizingMaskIntoConstraints="NO" id="ZiN-xT-sWh"> - <rect key="frame" x="122" y="11.5" width="229" height="39"/> - <subviews> - <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="22f-7o-NGo"> - <rect key="frame" x="0.0" y="0.0" width="42" height="20.5"/> - <fontDescription key="fontDescription" type="system" pointSize="17"/> - <nil key="textColor"/> - <nil key="highlightedColor"/> - </label> - <stackView opaque="NO" contentMode="scaleToFill" spacing="8" translatesAutoresizingMaskIntoConstraints="NO" id="Gg7-zE-SB8"> - <rect key="frame" x="0.0" y="25.5" width="68" height="13.5"/> - <subviews> - <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="eSL-7g-tbd" userLabel="duration"> - <rect key="frame" x="0.0" y="0.0" width="30" height="13.5"/> - <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="11"/> - <nil key="textColor"/> - <nil key="highlightedColor"/> - </label> - <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ZKc-bz-v5I" userLabel="Size"> - <rect key="frame" x="38" y="0.0" width="30" height="13.5"/> - <fontDescription key="fontDescription" type="system" weight="semibold" pointSize="11"/> - <nil key="textColor"/> - <nil key="highlightedColor"/> - </label> - </subviews> - </stackView> - </subviews> - </stackView> - <imageView hidden="YES" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="list" translatesAutoresizingMaskIntoConstraints="NO" id="dR4-mi-lDQ"> - <rect key="frame" x="351" y="19" width="0.0" height="24"/> - <color key="tintColor" systemColor="secondaryLabelColor" red="0.23529411759999999" green="0.23529411759999999" blue="0.26274509800000001" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="sRGB"/> - </imageView> - </subviews> - </stackView> - </subviews> - <constraints> - <constraint firstItem="QHO-Op-40P" firstAttribute="top" secondItem="Lgw-oV-ncW" secondAttribute="top" constant="12" id="W5v-NW-IE1"/> - <constraint firstItem="QHO-Op-40P" firstAttribute="leading" secondItem="Lgw-oV-ncW" secondAttribute="leading" constant="12" id="caY-MD-M4Q"/> - <constraint firstItem="QHO-Op-40P" firstAttribute="bottom" secondItem="Lgw-oV-ncW" secondAttribute="bottom" constant="-12" id="wd3-UE-Kr9"/> - <constraint firstItem="Lgw-oV-ncW" firstAttribute="trailing" secondItem="QHO-Op-40P" secondAttribute="trailing" constant="12" id="y6V-5A-beP"/> - </constraints> - <viewLayoutGuide key="safeArea" id="Lgw-oV-ncW"/> - <connections> - <outlet property="AudioAspectRatio" destination="0S0-Dm-pFV" id="fup-hh-pq5"/> - <outlet property="VideoAspectRatio" destination="o2R-2I-WPK" id="hQw-An-wIt"/> - <outlet property="checkboxImageView" destination="RHG-II-xmF" id="F6Y-7m-fPb"/> - <outlet property="dragImage" destination="dR4-mi-lDQ" id="562-Hu-qy4"/> - <outlet property="sizeLabel" destination="ZKc-bz-v5I" id="wmF-9r-Gew"/> - <outlet property="thumbnailImageView" destination="W4f-6Y-az7" id="qx7-8D-QJK"/> - <outlet property="timeLabel" destination="eSL-7g-tbd" id="qOK-gw-8qT"/> - <outlet property="titleLabel" destination="22f-7o-NGo" id="tOe-hv-WU6"/> - </connections> - <point key="canvasLocation" x="113.5" y="-207.5"/> - </collectionReusableView> - </objects> - <resources> - <image name="checkboxEmpty" width="22" height="22"/> - <image name="list" width="24" height="24"/> - </resources> -</document> diff --git a/SharedSources/MediaLibraryModel/AlbumModel.swift b/SharedSources/MediaLibraryModel/AlbumModel.swift index d355a3dfd1998795902737410f59890a07f15c6f..75ed3b29e1a50b301eb3a5b64a18241c3a42f303 100644 --- a/SharedSources/MediaLibraryModel/AlbumModel.swift +++ b/SharedSources/MediaLibraryModel/AlbumModel.swift @@ -45,13 +45,6 @@ extension AlbumModel { } } -// MARK: - Edit -extension AlbumModel: EditableMLModel { - func editCellType() -> BaseCollectionViewCell.Type { - return MediaEditCell.self - } -} - // MARK: - Search extension VLCMLAlbum: SearchableMLModel { func contains(_ searchString: String) -> Bool { diff --git a/SharedSources/MediaLibraryModel/ArtistModel.swift b/SharedSources/MediaLibraryModel/ArtistModel.swift index 695132ffd55514484c3f1af9fd3391b97e5f32a9..e985d03af32f5af887805760793d02345896fb6f 100644 --- a/SharedSources/MediaLibraryModel/ArtistModel.swift +++ b/SharedSources/MediaLibraryModel/ArtistModel.swift @@ -45,13 +45,6 @@ extension ArtistModel { } } -// MARK: - Edit -extension ArtistModel: EditableMLModel { - func editCellType() -> BaseCollectionViewCell.Type { - return MediaEditCell.self - } -} - // MARK: - Search extension VLCMLArtist: SearchableMLModel { func contains(_ searchString: String) -> Bool { diff --git a/SharedSources/MediaLibraryModel/CollectionModel.swift b/SharedSources/MediaLibraryModel/CollectionModel.swift index 5bbbaf0996a067989004e69b24e0c23668bee487..438a24fedbaaa1be0f0032c40ca0f26975932245 100644 --- a/SharedSources/MediaLibraryModel/CollectionModel.swift +++ b/SharedSources/MediaLibraryModel/CollectionModel.swift @@ -73,13 +73,6 @@ class CollectionModel: MLBaseModel { } } -// MARK: - Edit -extension CollectionModel: EditableMLModel { - func editCellType() -> BaseCollectionViewCell.Type { - return MediaEditCell.self - } -} - // MARK: - MediaLibraryObserver extension CollectionModel: MediaLibraryObserver { func medialibrary(_ medialibrary: MediaLibraryService, diff --git a/SharedSources/MediaLibraryModel/GenreModel.swift b/SharedSources/MediaLibraryModel/GenreModel.swift index 2618947f535754ddad3736b0c27f90cd4ddc0798..c2350e7fa9069a1ed7d0f3afcce2ff93e23c8c29 100644 --- a/SharedSources/MediaLibraryModel/GenreModel.swift +++ b/SharedSources/MediaLibraryModel/GenreModel.swift @@ -76,12 +76,6 @@ extension GenreModel { updateView?() } } -// MARK: - Edit -extension GenreModel: EditableMLModel { - func editCellType() -> BaseCollectionViewCell.Type { - return MediaEditCell.self - } -} // MARK: - Search extension VLCMLGenre: SearchableMLModel { diff --git a/SharedSources/MediaLibraryModel/MediaLibraryBaseModel.swift b/SharedSources/MediaLibraryModel/MediaLibraryBaseModel.swift index cb353fcd76548b74fe99910d574eb8f79498092f..7b3024c392cab3c81c62c72e4ea1ca3a26e759c5 100644 --- a/SharedSources/MediaLibraryModel/MediaLibraryBaseModel.swift +++ b/SharedSources/MediaLibraryModel/MediaLibraryBaseModel.swift @@ -64,10 +64,6 @@ extension MLBaseModel { } } -protocol EditableMLModel { - func editCellType() -> BaseCollectionViewCell.Type -} - protocol SearchableMLModel { func contains(_ searchString: String) -> Bool } diff --git a/SharedSources/MediaLibraryModel/PlaylistModel.swift b/SharedSources/MediaLibraryModel/PlaylistModel.swift index ecddd64af40a7dabaca3744f72087407e3841533..a06378837bd6b4b81d2d6f8f3efae60256dd8293 100644 --- a/SharedSources/MediaLibraryModel/PlaylistModel.swift +++ b/SharedSources/MediaLibraryModel/PlaylistModel.swift @@ -68,13 +68,6 @@ extension PlaylistModel { } } -// MARK: - Edit -extension PlaylistModel: EditableMLModel { - func editCellType() -> BaseCollectionViewCell.Type { - return MediaEditCell.self - } -} - // MARK: - Search extension VLCMLPlaylist: SearchableMLModel { func contains(_ searchString: String) -> Bool { diff --git a/SharedSources/MediaLibraryModel/TrackModel.swift b/SharedSources/MediaLibraryModel/TrackModel.swift index 13da53b2c272e47f0593a5f56ccd28b5dbd0d1b3..4d875923494a6cb9fdf026b2096e16d532d06c25 100644 --- a/SharedSources/MediaLibraryModel/TrackModel.swift +++ b/SharedSources/MediaLibraryModel/TrackModel.swift @@ -45,13 +45,6 @@ extension TrackModel { } } -// MARK: - Edit - -extension TrackModel: EditableMLModel { - func editCellType() -> BaseCollectionViewCell.Type { - return MediaEditCell.self - } -} // MARK: - MediaLibraryObserver extension TrackModel: MediaLibraryObserver { diff --git a/SharedSources/MediaLibraryModel/VideoGroupViewModel.swift b/SharedSources/MediaLibraryModel/VideoGroupViewModel.swift index 3f78b22a189603ed718ed06c150c812e57580c9a..9a53cc620b0a191f2e427097e1b9ece5de881e14 100644 --- a/SharedSources/MediaLibraryModel/VideoGroupViewModel.swift +++ b/SharedSources/MediaLibraryModel/VideoGroupViewModel.swift @@ -77,14 +77,6 @@ private extension VideoGroupViewModel { } } -// MARK: - Edit - -extension VideoGroupViewModel: EditableMLModel { - func editCellType() -> BaseCollectionViewCell.Type { - return MediaEditCell.self - } -} - // MARK: - VLCMLVideoGroup - Search extension VLCMLVideoGroup: SearchableMLModel { diff --git a/SharedSources/MediaLibraryModel/VideoModel.swift b/SharedSources/MediaLibraryModel/VideoModel.swift index cae789334fa9c1ffbd2e37d08f0dbdc3dd35de9d..7574e7c80927c2af9bd105f23a144d666fcb05a3 100644 --- a/SharedSources/MediaLibraryModel/VideoModel.swift +++ b/SharedSources/MediaLibraryModel/VideoModel.swift @@ -31,14 +31,6 @@ class VideoModel: MediaModel { } } -// MARK: - Edit - -extension VideoModel: EditableMLModel { - func editCellType() -> BaseCollectionViewCell.Type { - return MediaEditCell.self - } -} - // MARK: - Sort extension VideoModel { diff --git a/Sources/EditController.swift b/Sources/EditController.swift index e12b2946dbd0c019fcaf68a3e2b02019fa0319ad..5e7624b1d421930f455871d229e462fcd079ef4c 100644 --- a/Sources/EditController.swift +++ b/Sources/EditController.swift @@ -10,7 +10,7 @@ *****************************************************************************/ protocol EditControllerDelegate: class { - func editController(editController: EditController, cellforItemAt indexPath: IndexPath) -> MediaEditCell? + func editController(editController: EditController, cellforItemAt indexPath: IndexPath) -> BaseCollectionViewCell? func editController(editController: EditController, present viewController: UIViewController) } @@ -309,10 +309,17 @@ extension EditController: EditToolbarDelegate { extension EditController: UICollectionViewDelegate { func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { selectedCellIndexPaths.insert(indexPath) + // Isolate selectionViewOverlay changes inside EditController + if let cell = collectionView.cellForItem(at: indexPath) as? BaseCollectionViewCell { + cell.selectionViewOverlay?.isHidden = false + } } func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) { selectedCellIndexPaths.remove(indexPath) + if let cell = collectionView.cellForItem(at: indexPath) as? BaseCollectionViewCell { + cell.selectionViewOverlay?.isHidden = true + } } } @@ -324,17 +331,20 @@ extension EditController: UICollectionViewDataSource { } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { - guard let editCell = (model as? EditableMLModel)?.editCellType() else { - assertionFailure("The category either doesn't implement EditableMLModel or doesn't have a editcellType defined") - return UICollectionViewCell() - } - if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: editCell.defaultReuseIdentifier, - for: indexPath) as? MediaEditCell { + if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: model.cellType.defaultReuseIdentifier, + for: indexPath) as? BaseCollectionViewCell { cell.media = model.anyfiles[indexPath.row] cell.isSelected = selectedCellIndexPaths.contains(indexPath) cell.isAccessibilityElement = true - if let collectionModel = model as? CollectionModel, collectionModel.mediaCollection is VLCMLPlaylist { - cell.dragImage.isHidden = false + cell.checkImageView?.isHidden = false + + if let cell = cell as? MediaCollectionViewCell, + let collectionModel = model as? CollectionModel, collectionModel.mediaCollection is VLCMLPlaylist { + cell.dragIndicatorImageView.isHidden = false + } + + if cell.isSelected { + cell.selectionViewOverlay?.isHidden = false } return cell } else { @@ -362,15 +372,36 @@ extension EditController: UICollectionViewDataSource { // MARK: - UICollectionViewDelegateFlowLayout extension EditController: UICollectionViewDelegateFlowLayout { - func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { - let contentInset = collectionView.contentInset - // FIXME: 5 should be cell padding, but not usable maybe static? - let insetToRemove = contentInset.left + contentInset.right + (5 * 2) - var width = collectionView.frame.width + func collectionView(_ collectionView: UICollectionView, + layout collectionViewLayout: UICollectionViewLayout, + sizeForItemAt indexPath: IndexPath) -> CGSize { + var toWidth = collectionView.frame.size.width if #available(iOS 11.0, *) { - width = collectionView.safeAreaLayoutGuide.layoutFrame.width + toWidth = collectionView.safeAreaLayoutGuide.layoutFrame.width } - return MediaEditCell.cellSizeForWidth(width - insetToRemove) + + return model.cellType.cellSizeForWidth(toWidth) + } + + func collectionView(_ collectionView: UICollectionView, + layout collectionViewLayout: UICollectionViewLayout, + insetForSectionAt section: Int) -> UIEdgeInsets { + return UIEdgeInsets(top: model.cellType.edgePadding, + left: model.cellType.edgePadding, + bottom: model.cellType.edgePadding, + right: model.cellType.edgePadding) + } + + func collectionView(_ collectionView: UICollectionView, + layout collectionViewLayout: UICollectionViewLayout, + minimumLineSpacingForSectionAt section: Int) -> CGFloat { + return model.cellType.edgePadding + } + + func collectionView(_ collectionView: UICollectionView, + layout collectionViewLayout: UICollectionViewLayout, + minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { + return model.cellType.interItemPadding } } diff --git a/Sources/MediaCategories/MediaCategoryViewController.swift b/Sources/MediaCategories/MediaCategoryViewController.swift index d107b4eeb3813e8dd18b1d337b766d8ee01bdda8..4239ae702907ee15ea533fc5f4c35b5865874520 100644 --- a/Sources/MediaCategories/MediaCategoryViewController.swift +++ b/Sources/MediaCategories/MediaCategoryViewController.swift @@ -92,13 +92,6 @@ class MediaCategoryViewController: UICollectionViewController, UISearchBarDelega return emptyView }() - let editCollectionViewLayout: UICollectionViewFlowLayout = { - let editCollectionViewLayout = UICollectionViewFlowLayout() - editCollectionViewLayout.minimumLineSpacing = 1 - editCollectionViewLayout.minimumInteritemSpacing = 0 - return editCollectionViewLayout - }() - @available(*, unavailable) init() { fatalError() @@ -301,16 +294,8 @@ class MediaCategoryViewController: UICollectionViewController, UISearchBarDelega PlaybackService.sharedInstance().setPlayerHidden(editing) - let layoutToBe = editing ? editCollectionViewLayout : UICollectionViewFlowLayout() - collectionView?.setCollectionViewLayout(layoutToBe, animated: false, completion: { - [unowned self] finished in - guard finished else { - assertionFailure("VLCMediaSubcategoryViewController: Edit layout transition failed.") - return - } - self.searchBarConstraint?.constant = -self.searchBarSize - self.reloadData() - }) + searchBarConstraint?.constant = -self.searchBarSize + reloadData() } private func displayEditToolbar() { @@ -583,8 +568,8 @@ extension MediaCategoryViewController: ActionSheetSortSectionHeaderDelegate { // MARK: - EditControllerDelegate extension MediaCategoryViewController: EditControllerDelegate { - func editController(editController: EditController, cellforItemAt indexPath: IndexPath) -> MediaEditCell? { - return collectionView.cellForItem(at: indexPath) as? MediaEditCell + func editController(editController: EditController, cellforItemAt indexPath: IndexPath) -> BaseCollectionViewCell? { + return collectionView.cellForItem(at: indexPath) as? BaseCollectionViewCell } func editController(editController: EditController, @@ -598,10 +583,6 @@ private extension MediaCategoryViewController { func setupCollectionView() { let cellNib = UINib(nibName: model.cellType.nibName, bundle: nil) collectionView?.register(cellNib, forCellWithReuseIdentifier: model.cellType.defaultReuseIdentifier) - if let editCell = (model as? EditableMLModel)?.editCellType() { - let editCellNib = UINib(nibName: editCell.nibName, bundle: nil) - collectionView?.register(editCellNib, forCellWithReuseIdentifier: editCell.defaultReuseIdentifier) - } collectionView.allowsMultipleSelection = true collectionView?.backgroundColor = PresentationTheme.current.colors.background collectionView?.alwaysBounceVertical = true diff --git a/Sources/MediaCategoryCells/BaseCollectionViewCell.swift b/Sources/MediaCategoryCells/BaseCollectionViewCell.swift index bd8b324e7069415c9ef467dddd57e44bb7f4a4ee..1059a9dfcf22d650299bcd3f81dabbf17fba2fc3 100644 --- a/Sources/MediaCategoryCells/BaseCollectionViewCell.swift +++ b/Sources/MediaCategoryCells/BaseCollectionViewCell.swift @@ -24,6 +24,9 @@ class BaseCollectionViewCell: UICollectionViewCell { var media: VLCMLObject? + private(set) var checkImageView: UIImageView? + private(set) var selectionViewOverlay: UIView? + class func numberOfColumns(for width: CGFloat) -> CGFloat { return CGFloat.zero } diff --git a/Sources/MediaCategoryCells/MediaCollectionViewCell.swift b/Sources/MediaCategoryCells/MediaCollectionViewCell.swift index b319355774426afd3c325c0536f3de50d0c956c0..1f4e7fde15d0d9d6644fd1b083bca4f0de6c372c 100644 --- a/Sources/MediaCategoryCells/MediaCollectionViewCell.swift +++ b/Sources/MediaCategoryCells/MediaCollectionViewCell.swift @@ -20,6 +20,10 @@ class MediaCollectionViewCell: BaseCollectionViewCell { @IBOutlet private weak var newLabel: UILabel! @IBOutlet private weak var thumbnailWidth: NSLayoutConstraint! + @IBOutlet weak var checkboxImageView: UIImageView! + @IBOutlet weak var selectionOverlay: UIView! + @IBOutlet weak var dragIndicatorImageView: UIImageView! + override var media: VLCMLObject? { didSet { if let media = media as? VLCMLMedia { @@ -42,6 +46,21 @@ class MediaCollectionViewCell: BaseCollectionViewCell { } } + override var checkImageView: UIImageView? { + return checkboxImageView + } + + override var selectionViewOverlay: UIView? { + return selectionOverlay + } + + override var isSelected: Bool { + didSet { + checkboxImageView.image = isSelected ? UIImage(named: "checkboxSelected") + : UIImage(named: "checkboxEmpty") + } + } + override func awakeFromNib() { super.awakeFromNib() if #available(iOS 11.0, *) { @@ -59,6 +78,7 @@ class MediaCollectionViewCell: BaseCollectionViewCell { backgroundColor = PresentationTheme.current.colors.background titleLabel?.textColor = PresentationTheme.current.colors.cellTextColor descriptionLabel?.textColor = PresentationTheme.current.colors.cellDetailTextColor + dragIndicatorImageView.tintColor = PresentationTheme.current.colors.cellDetailTextColor } func update(audiotrack: VLCMLMedia) { @@ -151,5 +171,8 @@ class MediaCollectionViewCell: BaseCollectionViewCell { descriptionLabel.text = "" thumbnailView.image = nil newLabel.isHidden = true + checkboxImageView.isHidden = true + selectionOverlay.isHidden = true + dragIndicatorImageView.isHidden = true } } diff --git a/Sources/MediaCategoryCells/MediaCollectionViewCell.xib b/Sources/MediaCategoryCells/MediaCollectionViewCell.xib index efeff20f89e319d37465b067ccd51ff7c043a3fa..e41795fd532ac30700a61dcaf549cc88b2672d21 100644 --- a/Sources/MediaCategoryCells/MediaCollectionViewCell.xib +++ b/Sources/MediaCategoryCells/MediaCollectionViewCell.xib @@ -1,11 +1,9 @@ <?xml version="1.0" encoding="UTF-8"?> -<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES"> - <device id="retina4_7" orientation="portrait"> - <adaptation id="fullscreen"/> - </device> +<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="14868" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES"> + <device id="retina4_7" orientation="portrait" appearance="light"/> <dependencies> <deployment identifier="iOS"/> - <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14490.49"/> + <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14824"/> <capability name="Safe area layout guides" minToolsVersion="9.0"/> <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> </dependencies> @@ -56,15 +54,36 @@ </label> </subviews> </stackView> + <imageView hidden="YES" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="list" translatesAutoresizingMaskIntoConstraints="NO" id="f9J-sb-sdM"> + <rect key="frame" x="480" y="28" width="24" height="24"/> + <color key="tintColor" systemColor="secondaryLabelColor" red="0.23529411759999999" green="0.23529411759999999" blue="0.26274509800000001" alpha="0.59999999999999998" colorSpace="custom" customColorSpace="sRGB"/> + <constraints> + <constraint firstAttribute="width" constant="24" id="Cdn-hR-SHJ"/> + <constraint firstAttribute="height" constant="24" id="EaV-Ae-GP2"/> + </constraints> + </imageView> </subviews> </stackView> + <view hidden="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="vQV-tE-gv0"> + <rect key="frame" x="0.0" y="0.0" width="480" height="80"/> + <color key="backgroundColor" red="0.94509803920000002" green="0.49019607840000001" blue="0.0" alpha="0.40000000000000002" colorSpace="custom" customColorSpace="sRGB"/> + </view> + <imageView hidden="YES" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="checkboxEmpty" translatesAutoresizingMaskIntoConstraints="NO" id="Uhx-qs-Aow"> + <rect key="frame" x="16" y="28" width="24" height="24"/> + </imageView> </subviews> <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/> <constraints> + <constraint firstItem="vQV-tE-gv0" firstAttribute="width" secondItem="bhw-Aa-3Q7" secondAttribute="width" id="Dqf-E3-sXZ"/> + <constraint firstItem="Uhx-qs-Aow" firstAttribute="centerY" secondItem="DpW-xo-rll" secondAttribute="centerY" id="Nii-BJ-jmJ"/> + <constraint firstItem="Uhx-qs-Aow" firstAttribute="centerX" secondItem="DpW-xo-rll" secondAttribute="centerX" id="Pid-97-YyF"/> <constraint firstItem="jwA-4O-tgL" firstAttribute="leading" secondItem="bhw-Aa-3Q7" secondAttribute="leading" id="YQR-FC-YG0"/> <constraint firstAttribute="bottom" secondItem="jwA-4O-tgL" secondAttribute="bottom" id="cPv-gK-orc"/> <constraint firstItem="jwA-4O-tgL" firstAttribute="top" secondItem="bhw-Aa-3Q7" secondAttribute="top" id="gXu-Td-kve"/> + <constraint firstItem="vQV-tE-gv0" firstAttribute="height" secondItem="bhw-Aa-3Q7" secondAttribute="height" id="m5l-X4-Pqt"/> <constraint firstAttribute="trailing" secondItem="jwA-4O-tgL" secondAttribute="trailing" id="mtd-yR-U0o"/> + <constraint firstItem="vQV-tE-gv0" firstAttribute="centerY" secondItem="bhw-Aa-3Q7" secondAttribute="centerY" id="pcz-sz-DBh"/> + <constraint firstItem="vQV-tE-gv0" firstAttribute="centerX" secondItem="bhw-Aa-3Q7" secondAttribute="centerX" id="xBV-Z6-LrT"/> </constraints> </view> </subviews> @@ -78,8 +97,11 @@ <viewLayoutGuide key="safeArea" id="L0K-f1-QjV"/> <size key="customSize" width="480" height="213"/> <connections> + <outlet property="checkboxImageView" destination="Uhx-qs-Aow" id="VCh-49-ONi"/> <outlet property="descriptionLabel" destination="5N8-js-t0W" id="8YA-5P-R6q"/> + <outlet property="dragIndicatorImageView" destination="f9J-sb-sdM" id="t3G-VX-68j"/> <outlet property="newLabel" destination="Klo-Bq-5nI" id="8jr-y0-SoR"/> + <outlet property="selectionOverlay" destination="vQV-tE-gv0" id="xIe-R7-AjG"/> <outlet property="thumbnailView" destination="DpW-xo-rll" id="U2i-pe-qCM"/> <outlet property="thumbnailWidth" destination="vgz-Bg-lit" id="ZZf-xz-EIV"/> <outlet property="titleLabel" destination="Zkn-vN-SN4" id="H77-N8-sRM"/> @@ -87,4 +109,8 @@ <point key="canvasLocation" x="110" y="-53.5"/> </collectionViewCell> </objects> + <resources> + <image name="checkboxEmpty" width="24" height="24"/> + <image name="list" width="24" height="24"/> + </resources> </document> diff --git a/Sources/MediaCategoryCells/MovieCollectionViewCell.swift b/Sources/MediaCategoryCells/MovieCollectionViewCell.swift index 2f3de7480e2539a0da2236a5e48ec58c939f007f..37e91fa54494f738c325f667b510c620ef4bd1d6 100644 --- a/Sources/MediaCategoryCells/MovieCollectionViewCell.swift +++ b/Sources/MediaCategoryCells/MovieCollectionViewCell.swift @@ -13,6 +13,7 @@ import Foundation class MovieCollectionViewCell: BaseCollectionViewCell { + @IBOutlet weak var checkboxImageView: UIImageView! @IBOutlet weak var thumbnailView: UIImageView! @IBOutlet weak var titleLabel: UILabel! @@ -21,6 +22,9 @@ class MovieCollectionViewCell: BaseCollectionViewCell { @IBOutlet weak var progressView: UIProgressView! @IBOutlet weak var collectionOverlay: UIView! @IBOutlet weak var numberOfTracks: UILabel! + + @IBOutlet weak var selectionOverlay: UIView! + override class var edgePadding: CGFloat { return 12.5 } @@ -28,6 +32,21 @@ class MovieCollectionViewCell: BaseCollectionViewCell { return 7.5 } + override var isSelected: Bool { + didSet { + checkboxImageView.image = isSelected ? UIImage(named: "checkboxSelected") + : UIImage(named: "checkboxEmpty") + } + } + + override var checkImageView: UIImageView? { + return checkboxImageView + } + + override var selectionViewOverlay: UIView? { + return selectionOverlay + } + override var media: VLCMLObject? { didSet { if let movie = media as? VLCMLMedia { @@ -134,5 +153,7 @@ class MovieCollectionViewCell: BaseCollectionViewCell { newLabel.isHidden = true collectionOverlay.isHidden = true numberOfTracks.text = "" + checkboxImageView.isHidden = true + selectionOverlay.isHidden = true } } diff --git a/Sources/MediaCategoryCells/MovieCollectionViewCell.xib b/Sources/MediaCategoryCells/MovieCollectionViewCell.xib index 2b80a2f5bf6cfc27e988417a4826ab8f4954fc25..634098aa55ec07c336003c9cb4141b69b754ac8b 100644 --- a/Sources/MediaCategoryCells/MovieCollectionViewCell.xib +++ b/Sources/MediaCategoryCells/MovieCollectionViewCell.xib @@ -78,36 +78,58 @@ </constraints> <viewLayoutGuide key="safeArea" id="HVo-IJ-YFl"/> </view> + <view hidden="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="UTe-u3-NWI"> + <rect key="frame" x="0.0" y="0.0" width="309" height="193"/> + <color key="backgroundColor" red="0.94509803920000002" green="0.49019607840000001" blue="0.0" alpha="0.39982421875000002" colorSpace="custom" customColorSpace="sRGB"/> + </view> + <imageView hidden="YES" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="checkboxEmpty" translatesAutoresizingMaskIntoConstraints="NO" id="hBS-N5-2jA"> + <rect key="frame" x="275" y="159" width="24" height="24"/> + <constraints> + <constraint firstAttribute="height" constant="24" id="XDD-Ik-eSa"/> + <constraint firstAttribute="width" constant="24" id="hmt-6D-9QW"/> + </constraints> + </imageView> </subviews> </view> <constraints> <constraint firstItem="iWM-y0-SUe" firstAttribute="bottom" relation="lessThanOrEqual" secondItem="YyZ-zI-cD7" secondAttribute="bottom" id="3VI-xW-KQ4"/> <constraint firstItem="iWM-y0-SUe" firstAttribute="leading" secondItem="YyZ-zI-cD7" secondAttribute="leading" id="43e-Na-uN0"/> + <constraint firstItem="UTe-u3-NWI" firstAttribute="leading" secondItem="jmi-G0-XOo" secondAttribute="leading" id="8WQ-jt-pW6"/> <constraint firstItem="WKB-IM-zLb" firstAttribute="centerY" secondItem="jmi-G0-XOo" secondAttribute="centerY" id="9h3-zd-Ied"/> <constraint firstItem="WKB-IM-zLb" firstAttribute="width" secondItem="jmi-G0-XOo" secondAttribute="width" multiplier="0.5" id="AyM-ua-RM1"/> <constraint firstItem="4zQ-Mf-dw7" firstAttribute="leading" secondItem="BvH-0B-sVS" secondAttribute="leading" id="Ijd-61-ouV"/> <constraint firstItem="WKB-IM-zLb" firstAttribute="leading" secondItem="jmi-G0-XOo" secondAttribute="centerX" id="Klj-oS-Zn0"/> + <constraint firstItem="hBS-N5-2jA" firstAttribute="bottom" secondItem="UTe-u3-NWI" secondAttribute="bottom" constant="-10" id="OvE-CT-KCf"/> <constraint firstAttribute="trailing" secondItem="iWM-y0-SUe" secondAttribute="trailing" id="PrI-Yq-B9j"/> <constraint firstItem="iWM-y0-SUe" firstAttribute="leading" secondItem="X8l-k0-1oc" secondAttribute="leading" id="Rq2-SS-aA2"/> + <constraint firstItem="UTe-u3-NWI" firstAttribute="trailing" secondItem="jmi-G0-XOo" secondAttribute="trailing" id="SJY-g5-oV0"/> <constraint firstItem="X8l-k0-1oc" firstAttribute="leading" secondItem="jmi-G0-XOo" secondAttribute="leading" id="WvI-Ra-xlu"/> <constraint firstItem="iWM-y0-SUe" firstAttribute="top" secondItem="YyZ-zI-cD7" secondAttribute="top" id="Y4b-8y-MOG"/> <constraint firstItem="X8l-k0-1oc" firstAttribute="trailing" secondItem="jmi-G0-XOo" secondAttribute="trailing" id="d8L-w5-ba5"/> <constraint firstItem="X8l-k0-1oc" firstAttribute="bottom" secondItem="jmi-G0-XOo" secondAttribute="bottom" id="dWh-bB-nfd"/> + <constraint firstItem="UTe-u3-NWI" firstAttribute="bottom" secondItem="jmi-G0-XOo" secondAttribute="bottom" id="dp1-hW-Twu"/> + <constraint firstItem="hBS-N5-2jA" firstAttribute="trailing" secondItem="UTe-u3-NWI" secondAttribute="trailing" constant="-10" id="gNo-ax-rg5"/> + <constraint firstItem="UTe-u3-NWI" firstAttribute="top" secondItem="jmi-G0-XOo" secondAttribute="top" id="jBL-cf-d2I"/> <constraint firstItem="WKB-IM-zLb" firstAttribute="height" secondItem="jmi-G0-XOo" secondAttribute="height" id="rlj-bJ-yVp"/> <constraint firstItem="jmi-G0-XOo" firstAttribute="width" secondItem="YyZ-zI-cD7" secondAttribute="width" id="t8h-GJ-GvI"/> </constraints> <viewLayoutGuide key="safeArea" id="BvH-0B-sVS"/> <size key="customSize" width="309" height="230"/> <connections> + <outlet property="checkboxImageView" destination="hBS-N5-2jA" id="pCm-ST-YdN"/> <outlet property="collectionOverlay" destination="WKB-IM-zLb" id="uPK-1i-9Jc"/> <outlet property="descriptionLabel" destination="oac-dS-Qcd" id="1iJ-b6-gC6"/> <outlet property="newLabel" destination="Aby-eq-q1j" id="4rD-oo-gdq"/> <outlet property="numberOfTracks" destination="DBg-2t-TeB" id="0QT-uN-5fZ"/> <outlet property="progressView" destination="X8l-k0-1oc" id="mf9-zf-3ya"/> + <outlet property="selectionOverlay" destination="UTe-u3-NWI" id="h7a-Ck-88y"/> <outlet property="thumbnailView" destination="jmi-G0-XOo" id="gMW-XK-9MV"/> <outlet property="titleLabel" destination="4zQ-Mf-dw7" id="iGP-8x-anz"/> </connections> <point key="canvasLocation" x="-99.5" y="136"/> </collectionViewCell> </objects> + <resources> + <image name="checkboxEmpty" width="24" height="24"/> + </resources> </document> diff --git a/Sources/MediaEditCell.swift b/Sources/MediaEditCell.swift deleted file mode 100644 index f599386a633baa0298d550c33661aed2d99d122f..0000000000000000000000000000000000000000 --- a/Sources/MediaEditCell.swift +++ /dev/null @@ -1,178 +0,0 @@ -/***************************************************************************** - * VLCMediaViewEditCell.swift - * - * Copyright © 2018 VLC authors and VideoLAN - * Copyright © 2018 Videolabs - * - * Authors: Soomin Lee <bubu@mikan.io> - * Carola Nitz <nitz.carola@googlemail.com> - * - * Refer to the COPYING file of the official project for license. - *****************************************************************************/ - -class MediaEditCell: BaseCollectionViewCell { - - static let height: CGFloat = 88 - - @IBOutlet weak var checkboxImageView: UIImageView! - @IBOutlet weak var thumbnailImageView: UIImageView! - @IBOutlet weak var titleLabel: UILabel! - @IBOutlet weak var timeLabel: UILabel! - @IBOutlet weak var sizeLabel: UILabel! - @IBOutlet weak var dragImage: UIImageView! - @IBOutlet weak var VideoAspectRatio: NSLayoutConstraint! - @IBOutlet weak var AudioAspectRatio: NSLayoutConstraint! - - override var media: VLCMLObject? { - didSet { - if let media = media as? VLCMLMedia { - if media.type() == .audio { - updateForAudio(audio: media) - } else { - updateForMovie(movie: media) - } - } else if let artist = media as? VLCMLArtist { - updateForArtist(artist: artist) - } else if let album = media as? VLCMLAlbum { - updateForAlbum(album: album) - } else if let genre = media as? VLCMLGenre { - updateForGenre(genre: genre) - } else if let playlist = media as? VLCMLPlaylist { - updateForPlaylist(playlist: playlist) - } else if let videoGroup = media as? VLCMLVideoGroup { - update(videoGroup: videoGroup) - } else { - assertionFailure("MediaEditCell: media: Needs to be of a supported Type.") - } - } - } - - override func awakeFromNib() { - super.awakeFromNib() - if #available(iOS 11.0, *) { - thumbnailImageView.accessibilityIgnoresInvertColors = true - } - thumbnailImageView.clipsToBounds = true - NotificationCenter.default.addObserver(self, selector: #selector(themeDidChange), name: .VLCThemeDidChangeNotification, object: nil) - themeDidChange() - } - - @objc fileprivate func themeDidChange() { - backgroundColor = PresentationTheme.current.colors.background - titleLabel.textColor = PresentationTheme.current.colors.cellTextColor - timeLabel.textColor = PresentationTheme.current.colors.cellDetailTextColor - sizeLabel.textColor = PresentationTheme.current.colors.cellTextColor - dragImage.tintColor = PresentationTheme.current.colors.cellDetailTextColor - } - - func updateForMovie(movie: VLCMLMedia) { - thumbnailImageView.layer.cornerRadius = 3 - AudioAspectRatio.isActive = false - VideoAspectRatio.isActive = true - titleLabel.text = movie.title - accessibilityLabel = movie.accessibilityText(editing: true) - timeLabel.text = movie.mediaDuration() - sizeLabel.text = movie.formatSize() - thumbnailImageView.image = movie.thumbnailImage() - } - - func updateForAudio(audio: VLCMLMedia) { - titleLabel.text = audio.title - accessibilityLabel = audio.accessibilityText(editing: true) - timeLabel.text = audio.mediaDuration() - sizeLabel.text = audio.formatSize() - thumbnailImageView.image = audio.thumbnailImage() - thumbnailImageView.layer.masksToBounds = true - thumbnailImageView.layer.cornerRadius = thumbnailImageView.frame.size.height / 2 - } - - func updateForArtist(artist: VLCMLArtist) { - titleLabel.text = artist.artistName() - accessibilityLabel = artist.accessibilityText() - timeLabel.text = artist.numberOfTracksString() - thumbnailImageView.layer.masksToBounds = true - thumbnailImageView.layer.cornerRadius = thumbnailImageView.frame.size.height / 2 - thumbnailImageView.image = artist.thumbnail() - } - - func updateForAlbum(album: VLCMLAlbum) { - titleLabel.text = album.albumName() - accessibilityLabel = album.accessibilityText(editing: true) - timeLabel.text = album.albumArtistName() - sizeLabel.text = album.numberOfTracksString() - thumbnailImageView.image = album.thumbnail() - } - - func updateForGenre(genre: VLCMLGenre) { - titleLabel.text = genre.name - accessibilityLabel = genre.accessibilityText() - timeLabel.text = genre.numberOfTracksString() - thumbnailImageView.layer.masksToBounds = true - thumbnailImageView.layer.cornerRadius = thumbnailImageView.frame.size.height / 2 - thumbnailImageView.image = genre.thumbnail() - } - - func updateForPlaylist(playlist: VLCMLPlaylist) { - thumbnailImageView.layer.cornerRadius = 3 - AudioAspectRatio.isActive = false - VideoAspectRatio.isActive = true - titleLabel.text = playlist.name - accessibilityLabel = playlist.accessibilityText() - timeLabel.text = playlist.numberOfTracksString() - thumbnailImageView.image = playlist.thumbnail() - } - - func update(videoGroup: VLCMLVideoGroup) { - thumbnailImageView.layer.cornerRadius = 3 - AudioAspectRatio.isActive = false - VideoAspectRatio.isActive = true - titleLabel.text = videoGroup.name() - accessibilityLabel = videoGroup.accessibilityText() - timeLabel.text = videoGroup.numberOfTracksString() - thumbnailImageView.image = videoGroup.thumbnail() - } - - override var isSelected: Bool { - didSet { - checkboxImageView.image = isSelected ? UIImage(named: "checkboxSelected") - : UIImage(named: "checkboxEmpty") - } - } - - override class func numberOfColumns(for width: CGFloat) -> CGFloat { - if width <= DeviceWidth.iPhonePortrait.rawValue { - return 1 - } else if width <= DeviceWidth.iPhoneLandscape.rawValue { - return 2 - } else { - return 3 - } - } - - override class func cellSizeForWidth(_ width: CGFloat) -> CGSize { - let numberOfCells: CGFloat = numberOfColumns(for: width) - - // We have the number of cells and we always have numberofCells + 1 interItemPadding spaces. - // - // edgePadding-interItemPadding-[Cell]-interItemPadding-[Cell]-interItemPadding-edgePadding - // - - let overallWidth = width - (2 * edgePadding) - let overallCellWidthWithoutPadding = overallWidth - (numberOfCells + 1) * interItemPadding - let cellWidth = floor(overallCellWidthWithoutPadding / numberOfCells) - - return CGSize(width: cellWidth, height: height) - } - override func prepareForReuse() { - super.prepareForReuse() - titleLabel.text = "" - timeLabel.text = "" - sizeLabel.text = "" - accessibilityLabel = "" - thumbnailImageView.image = nil - isSelected = false - thumbnailImageView.layer.cornerRadius = 0 - AudioAspectRatio.isActive = true - VideoAspectRatio.isActive = false - } -} diff --git a/VLC.xcodeproj/project.pbxproj b/VLC.xcodeproj/project.pbxproj index 736f686775e32fc042b17d22bbd42c23d7155fce..e6e84aa6ff0da508b6e6a78425bed28cfe46277c 100644 --- a/VLC.xcodeproj/project.pbxproj +++ b/VLC.xcodeproj/project.pbxproj @@ -62,7 +62,6 @@ 419A2C681F37A4B70069D224 /* VLCStringsForLocalization.m in Sources */ = {isa = PBXBuildFile; fileRef = 419A2C651F37A4B70069D224 /* VLCStringsForLocalization.m */; }; 419D7F051F54176900AF69A2 /* VLCTimeNavigationTitleView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 419D7F041F54176900AF69A2 /* VLCTimeNavigationTitleView.xib */; }; 41A780E52241EBCD0034BA74 /* CollectionModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4120863922323E87006A6630 /* CollectionModel.swift */; }; - 41B4DA3E21400E8E000BA27D /* MediaEditCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 41B4DA3D21400E8E000BA27D /* MediaEditCell.xib */; }; 41B93C011A53833B00102E8B /* VLCProgressView.m in Sources */ = {isa = PBXBuildFile; fileRef = 41B93C001A53833B00102E8B /* VLCProgressView.m */; }; 41B93C051A53835300102E8B /* VLCCloudServiceCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 41B93C031A53835300102E8B /* VLCCloudServiceCell.m */; }; 41B93C081A53853B00102E8B /* VLCCloudServiceCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 41B93C071A53853B00102E8B /* VLCCloudServiceCell.xib */; }; @@ -245,7 +244,6 @@ 81334053F6D89AB90E14A1C3 /* libPods-VLC-iOSTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 91CCB170FBC97B6B93B99E0A /* libPods-VLC-iOSTests.a */; }; 8D144D6322298E8E00984C46 /* AudioMiniPlayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D144D6222298E8E00984C46 /* AudioMiniPlayer.swift */; }; 8D15A1ED22A9603300CFA758 /* ActionSheetSortSectionHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D15A1EC22A9603300CFA758 /* ActionSheetSortSectionHeader.swift */; }; - 8D222DC220F779F1009C0D34 /* MediaEditCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D222DC120F779F1009C0D34 /* MediaEditCell.swift */; }; 8D2AD4D822786F4000393833 /* AddToPlaylistViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D2AD4D722786F4000393833 /* AddToPlaylistViewController.swift */; }; 8D2AD4DA227AEE8E00393833 /* AddToPlaylistView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8D2AD4D9227AEE8E00393833 /* AddToPlaylistView.xib */; }; 8D3B4C0E2226E49A00B9F652 /* AudioMiniPlayer.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8D3B4C0D2226E49A00B9F652 /* AudioMiniPlayer.xib */; }; @@ -536,7 +534,6 @@ 419D7F041F54176900AF69A2 /* VLCTimeNavigationTitleView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = VLCTimeNavigationTitleView.xib; path = Resources/VLCTimeNavigationTitleView.xib; sourceTree = SOURCE_ROOT; }; 41B0BC861F73ED7D0063BA26 /* VLC-iOSUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "VLC-iOSUITests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 41B0BC8A1F73ED7D0063BA26 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; - 41B4DA3D21400E8E000BA27D /* MediaEditCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = MediaEditCell.xib; path = SharedSources/MediaEditCell.xib; sourceTree = "<group>"; }; 41B93BFF1A53833B00102E8B /* VLCProgressView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCProgressView.h; path = Sources/VLCProgressView.h; sourceTree = SOURCE_ROOT; }; 41B93C001A53833B00102E8B /* VLCProgressView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = VLCProgressView.m; path = Sources/VLCProgressView.m; sourceTree = SOURCE_ROOT; }; 41B93C021A53835300102E8B /* VLCCloudServiceCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = VLCCloudServiceCell.h; path = Sources/VLCCloudServiceCell.h; sourceTree = SOURCE_ROOT; }; @@ -825,7 +822,6 @@ 7FC9CCF39DD8843873A42D34 /* Pods-VLC-iOSTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-VLC-iOSTests.release.xcconfig"; path = "Pods/Target Support Files/Pods-VLC-iOSTests/Pods-VLC-iOSTests.release.xcconfig"; sourceTree = "<group>"; }; 8D144D6222298E8E00984C46 /* AudioMiniPlayer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AudioMiniPlayer.swift; sourceTree = "<group>"; }; 8D15A1EC22A9603300CFA758 /* ActionSheetSortSectionHeader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActionSheetSortSectionHeader.swift; sourceTree = "<group>"; }; - 8D222DC120F779F1009C0D34 /* MediaEditCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = MediaEditCell.swift; path = Sources/MediaEditCell.swift; sourceTree = "<group>"; }; 8D2AD4D722786F4000393833 /* AddToPlaylistViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = AddToPlaylistViewController.swift; path = Sources/AddToPlaylistViewController.swift; sourceTree = "<group>"; }; 8D2AD4D9227AEE8E00393833 /* AddToPlaylistView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = AddToPlaylistView.xib; sourceTree = "<group>"; }; 8D3B4C0D2226E49A00B9F652 /* AudioMiniPlayer.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = AudioMiniPlayer.xib; sourceTree = "<group>"; }; @@ -1314,10 +1310,8 @@ 8DD651B0208F62B70052EE68 /* ActionSheet */, 4144156920ECD2620078EC37 /* VLCSectionTableHeaderView.swift */, 4144156B20ECE6330078EC37 /* FileServerView.swift */, - 8D222DC120F779F1009C0D34 /* MediaEditCell.swift */, 8DF9669C2113317100D0FCD6 /* EditToolbar.swift */, 8DF966B021188BDB00D0FCD6 /* EditController.swift */, - 41B4DA3D21400E8E000BA27D /* MediaEditCell.xib */, 8D2AD4D722786F4000393833 /* AddToPlaylistViewController.swift */, E03DECA522BEE27E00F44A05 /* MediaNavigationBar.swift */, ); @@ -2628,7 +2622,6 @@ 7DDFF4251BDFD23300913BD1 /* VLCCone512x512.png in Resources */, 7DF04F4F1961F2B8004A5429 /* web-open-fixed.png in Resources */, 7DBBF19A183AB4300009A339 /* VLCCloudStorageTableViewCell~ipad.xib in Resources */, - 41B4DA3E21400E8E000BA27D /* MediaEditCell.xib in Resources */, 7D9870641A3E03D5009CF27D /* papasscode_background.png in Resources */, 411453B9219C48DA002D94E1 /* Launch Screen.storyboard in Resources */, 4181087A2142894A0046A931 /* PlayingExternallyView.xib in Resources */, @@ -2964,7 +2957,6 @@ 413EC98B201B4F2C00BF412F /* PresentationTheme.swift in Sources */, DD1CB0321BB9E005006EDDE6 /* VLCMovieViewControlPanelView.m in Sources */, DDF908D01CF4CCAA00108B70 /* VLCNetworkLoginViewButtonCell.m in Sources */, - 8D222DC220F779F1009C0D34 /* MediaEditCell.swift in Sources */, DD3EFF3D1BDEBCE500B68579 /* VLCLocalNetworkServiceBrowserHTTP.m in Sources */, DDEAECBE1BDEBF6700756C83 /* VLCNetworkServerLoginInformation.m in Sources */, 418DFE9F211C93C6005D3652 /* CustomDialogRendererHandler.swift in Sources */,