Commit d13b5122 authored by Felix Paul Kühne's avatar Felix Paul Kühne

macosx: add window to manage library folders

parent e72372d9
......@@ -126,6 +126,7 @@
7D903EAF224392B400917358 /* timespec_get.c in Sources */ = {isa = PBXBuildFile; fileRef = 7D903EAE224392B400917358 /* timespec_get.c */; };
7D903EB6224394BE00917358 /* specific.c in Sources */ = {isa = PBXBuildFile; fileRef = 7D903EB5224394BE00917358 /* specific.c */; };
7D903EB92243952100917358 /* threads.c in Sources */ = {isa = PBXBuildFile; fileRef = 7D903EB82243952100917358 /* threads.c */; };
7D94E28D2274D2140008057F /* VLCLibraryFolderManagementWindow.m in Sources */ = {isa = PBXBuildFile; fileRef = 7D94E28B2274D2140008057F /* VLCLibraryFolderManagementWindow.m */; };
7DB40D2A20CBCEB500F63173 /* VLCMainMenu.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DB40D2920CBCEB500F63173 /* VLCMainMenu.m */; };
7DB40D2D20CBCEC200F63173 /* VLCStatusBarIcon.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DB40D2B20CBCEC200F63173 /* VLCStatusBarIcon.m */; };
7DB7F1EC20CC036D00C2CAED /* AudioUnit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7DB7F1EB20CC036D00C2CAED /* AudioUnit.framework */; };
......@@ -478,6 +479,9 @@
7D903EAE224392B400917358 /* timespec_get.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = timespec_get.c; path = ../../../../compat/timespec_get.c; sourceTree = "<group>"; };
7D903EB5224394BE00917358 /* specific.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = specific.c; path = ../../../src/darwin/specific.c; sourceTree = "<group>"; };
7D903EB82243952100917358 /* threads.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = threads.c; path = ../../../../src/misc/threads.c; sourceTree = "<group>"; };
7D94E28A2274D2140008057F /* VLCLibraryFolderManagementWindow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VLCLibraryFolderManagementWindow.h; sourceTree = "<group>"; };
7D94E28B2274D2140008057F /* VLCLibraryFolderManagementWindow.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCLibraryFolderManagementWindow.m; sourceTree = "<group>"; };
7D94E28C2274D2140008057F /* VLCLibraryFolderManagementWindow.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = VLCLibraryFolderManagementWindow.xib; sourceTree = "<group>"; };
7DB40D2820CBCEB500F63173 /* VLCMainMenu.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VLCMainMenu.h; sourceTree = "<group>"; };
7DB40D2920CBCEB500F63173 /* VLCMainMenu.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCMainMenu.m; sourceTree = "<group>"; };
7DB40D2B20CBCEC200F63173 /* VLCStatusBarIcon.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCStatusBarIcon.m; sourceTree = "<group>"; };
......@@ -956,6 +960,8 @@
7DFBDCAD2269ED0C00B700A5 /* VLCLibraryDataSource.m */,
7DFBDCAF226A518400B700A5 /* VLCLibraryMenuController.h */,
7DFBDCB0226A518400B700A5 /* VLCLibraryMenuController.m */,
7D94E28A2274D2140008057F /* VLCLibraryFolderManagementWindow.h */,
7D94E28B2274D2140008057F /* VLCLibraryFolderManagementWindow.m */,
7DFBDCBF226DC16200B700A5 /* VLCInputItem.h */,
7DFBDCC0226DC16200B700A5 /* VLCInputItem.m */,
);
......@@ -1435,6 +1441,7 @@
children = (
6B8224091E4D2A9000833BE1 /* MainMenu.xib */,
7D713D332201BB130042BEB7 /* VLCLibraryWindow.xib */,
7D94E28C2274D2140008057F /* VLCLibraryFolderManagementWindow.xib */,
7D0F64002201F66D00FDB91F /* VLCPlaylistTableCellView.xib */,
7D445D8F220339D400263D34 /* VLCPlaylistMenu.xib */,
7D0F64052202047900FDB91F /* VLCLibraryCollectionViewItem.xib */,
......@@ -1576,6 +1583,7 @@
1CCC89012078A3D500E5626F /* Preferences.xib in Sources */,
7DC21A7422049A6600F98A02 /* VLCOpenInputMetadata.m in Sources */,
1CCC89022078A3D500E5626F /* ResumeDialog.xib in Sources */,
7D94E28D2274D2140008057F /* VLCLibraryFolderManagementWindow.m in Sources */,
1CCC89032078A3D500E5626F /* SimplePreferences.xib in Sources */,
1CCC89042078A3D500E5626F /* StreamOutput.xib in Sources */,
1CCC89052078A3D500E5626F /* TextfieldPanel.xib in Sources */,
......
......@@ -54,6 +54,8 @@ libmacosx_plugin_la_SOURCES = \
gui/macosx/library/VLCLibraryDataSource.m \
gui/macosx/library/VLCLibraryDataTypes.h \
gui/macosx/library/VLCLibraryDataTypes.m \
gui/macosx/library/VLCLibraryFolderManagementWindow.h \
gui/macosx/library/VLCLibraryFolderManagementWindow.m \
gui/macosx/library/VLCLibraryMenuController.h \
gui/macosx/library/VLCLibraryMenuController.m \
gui/macosx/library/VLCLibraryModel.h \
......@@ -240,6 +242,7 @@ libmacosx_plugin_la_XIB_SOURCES = \
gui/macosx/UI/LogMessageWindow.xib \
gui/macosx/UI/MainMenu.xib \
gui/macosx/UI/VLCLibraryWindow.xib \
gui/macosx/UI/VLCLibraryFolderManagementWindow.xib \
gui/macosx/UI/VLCPlaylistMenu.xib \
gui/macosx/UI/VLCPlaylistTableCellView.xib \
gui/macosx/UI/VLCLibraryCollectionViewItem.xib \
......
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="12121" systemVersion="17E139j" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="14490.70" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies>
<development version="7000" identifier="xcode"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="12121"/>
<deployment identifier="macosx"/>
<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="VLCMainMenu">
......@@ -115,6 +116,7 @@
<outlet property="screenMenu" destination="1015" id="l5t-0E-DfG"/>
<outlet property="select_all" destination="198" id="Is0-ct-CbR"/>
<outlet property="services" destination="1996" id="X3H-XI-xFK"/>
<outlet property="showLibraryFolders" destination="5413" id="Yfe-WM-WVa"/>
<outlet property="show_all" destination="150" id="XQ2-CW-0PI"/>
<outlet property="snapshot" destination="2249" id="6bO-HY-I3I"/>
<outlet property="stop" destination="5156" id="irh-Cr-vBT"/>
......@@ -146,7 +148,6 @@
<outlet property="toggleEffectsButton" destination="5537" id="Gg8-nl-gzx"/>
<outlet property="toggleJumpButtons" destination="5240" id="53V-UC-536"/>
<outlet property="togglePlaymodeButtons" destination="5242" id="9TB-F7-ttT"/>
<outlet property="toggleSidebar" destination="5413" id="cz7-Zr-1lC"/>
<outlet property="trackSynchronization" destination="4412" id="BHW-NJ-jbd"/>
<outlet property="videoMenu" destination="334" id="7Ri-Tc-yej"/>
<outlet property="videoeffects" destination="2390" id="fXe-JA-9GI"/>
......@@ -386,10 +387,10 @@
<action selector="toggleEffectsButton:" target="-2" id="QSm-2E-Nlo"/>
</connections>
</menuItem>
<menuItem title="Show Sidebar" id="5413">
<menuItem title="Show Library Folders..." id="5413">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="toggleSidebar:" target="-2" id="e7y-3l-ZUS"/>
<action selector="showLibraryFolders:" target="-2" id="7L9-pf-bP7"/>
</connections>
</menuItem>
<menuItem isSeparatorItem="YES" id="5250"/>
......
<?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="VLCLibraryFolderManagementWindow">
<connections>
<outlet property="window" destination="F0z-JX-Cv5" id="gIp-Ho-8D9"/>
</connections>
</customObject>
<customObject id="-1" userLabel="First Responder" customClass="FirstResponder"/>
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<window title="Window" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" animationBehavior="default" id="F0z-JX-Cv5" customClass="VLCLibraryFolderManagementWindow">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
<rect key="contentRect" x="196" y="240" width="638" height="375"/>
<rect key="screenRect" x="0.0" y="0.0" width="1920" height="1177"/>
<view key="contentView" id="se5-gp-TjO">
<rect key="frame" x="0.0" y="0.0" width="638" height="375"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<scrollView autohidesScrollers="YES" horizontalLineScroll="19" horizontalPageScroll="10" verticalLineScroll="19" verticalPageScroll="10" usesPredominantAxisScrolling="NO" translatesAutoresizingMaskIntoConstraints="NO" id="cN4-CV-0ZY">
<rect key="frame" x="0.0" y="40" width="638" height="335"/>
<clipView key="contentView" id="iBY-dM-gpy">
<rect key="frame" x="1" y="0.0" width="636" height="334"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" alternatingRowBackgroundColors="YES" columnSelection="YES" multipleSelection="NO" autosaveColumns="NO" headerView="qUX-xV-r50" id="yXW-Oh-c8y">
<rect key="frame" x="0.0" y="0.0" width="874" height="309"/>
<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 editable="NO" width="116" minWidth="40" maxWidth="1000" id="yeU-u1-CWG">
<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" alignment="left" id="i4B-9b-CSN">
<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"/>
</tableColumn>
<tableColumn editable="NO" width="116" minWidth="40" maxWidth="1000" id="Bs6-l7-T2R">
<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" alignment="left" title="Text Cell" id="s5u-MH-82l">
<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"/>
</tableColumn>
<tableColumn editable="NO" width="116" minWidth="40" maxWidth="1000" id="MyB-sf-7Zj">
<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" alignment="left" title="Text Cell" id="BTa-z6-tCC">
<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"/>
</tableColumn>
<tableColumn editable="NO" width="514" minWidth="40" maxWidth="1000" id="oY3-Hl-Pyi">
<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" alignment="left" id="rue-hK-UWM" customClass="NSPathComponentCell">
<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"/>
</tableColumn>
</tableColumns>
<connections>
<outlet property="dataSource" destination="F0z-JX-Cv5" id="8f8-Oz-6wF"/>
<outlet property="delegate" destination="F0z-JX-Cv5" id="p5g-fz-zBe"/>
</connections>
</tableView>
</subviews>
</clipView>
<scroller key="horizontalScroller" wantsLayer="YES" verticalHuggingPriority="750" horizontal="YES" id="AbQ-Qa-KFB">
<rect key="frame" x="1" y="318" width="636" height="16"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<scroller key="verticalScroller" hidden="YES" wantsLayer="YES" verticalHuggingPriority="750" doubleValue="1" horizontal="NO" id="wbF-0g-t3S">
<rect key="frame" x="224" y="17" width="15" height="102"/>
<autoresizingMask key="autoresizingMask"/>
</scroller>
<tableHeaderView key="headerView" id="qUX-xV-r50">
<rect key="frame" x="0.0" y="0.0" width="874" height="25"/>
<autoresizingMask key="autoresizingMask"/>
</tableHeaderView>
</scrollView>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="M6Q-FK-KFM">
<rect key="frame" x="4" y="3" width="117" height="32"/>
<buttonCell key="cell" type="push" title="Add Folder..." bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="dz7-Ho-opb">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="addFolder:" target="F0z-JX-Cv5" id="ESX-mj-rsH"/>
</connections>
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="TXg-4i-ifD">
<rect key="frame" x="121" y="3" width="131" height="32"/>
<buttonCell key="cell" type="push" title="Remove Folder" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="ntF-De-N3a">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="removeFolder:" target="F0z-JX-Cv5" id="0va-hY-kub"/>
</connections>
</button>
<button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="7YE-Q5-Ga6">
<rect key="frame" x="252" y="3" width="64" height="32"/>
<buttonCell key="cell" type="push" title="Ban" bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="aeQ-5m-txD">
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
<font key="font" metaFont="system"/>
</buttonCell>
<connections>
<action selector="banFolder:" target="F0z-JX-Cv5" id="hwx-lv-G4o"/>
</connections>
</button>
</subviews>
<constraints>
<constraint firstItem="TXg-4i-ifD" firstAttribute="leading" secondItem="M6Q-FK-KFM" secondAttribute="trailing" constant="12" id="3Aa-O9-FDM"/>
<constraint firstAttribute="trailing" secondItem="cN4-CV-0ZY" secondAttribute="trailing" id="9fQ-kS-fVl"/>
<constraint firstAttribute="bottom" secondItem="cN4-CV-0ZY" secondAttribute="bottom" constant="40" id="JcK-pt-MPl"/>
<constraint firstAttribute="bottom" secondItem="M6Q-FK-KFM" secondAttribute="bottom" constant="10" id="QBc-i9-VOn"/>
<constraint firstItem="TXg-4i-ifD" firstAttribute="centerY" secondItem="7YE-Q5-Ga6" secondAttribute="centerY" id="a1p-pU-qbP"/>
<constraint firstItem="M6Q-FK-KFM" firstAttribute="leading" secondItem="se5-gp-TjO" secondAttribute="leading" constant="10" id="aaN-ZG-9yy"/>
<constraint firstItem="7YE-Q5-Ga6" firstAttribute="leading" secondItem="TXg-4i-ifD" secondAttribute="trailing" constant="12" id="f4V-bp-uA6"/>
<constraint firstItem="cN4-CV-0ZY" firstAttribute="leading" secondItem="se5-gp-TjO" secondAttribute="leading" id="jtK-jp-ohZ"/>
<constraint firstItem="M6Q-FK-KFM" firstAttribute="centerY" secondItem="TXg-4i-ifD" secondAttribute="centerY" id="lIc-z2-MZT"/>
<constraint firstItem="cN4-CV-0ZY" firstAttribute="top" secondItem="se5-gp-TjO" secondAttribute="top" id="xqp-sF-QJZ"/>
</constraints>
</view>
<connections>
<outlet property="addFolderButton" destination="M6Q-FK-KFM" id="kjf-Yh-hL2"/>
<outlet property="banFolderButton" destination="7YE-Q5-Ga6" id="2Ef-2r-gFE"/>
<outlet property="bannedTableColumn" destination="MyB-sf-7Zj" id="ViU-oo-A7U"/>
<outlet property="delegate" destination="-2" id="0bl-1N-AYu"/>
<outlet property="libraryFolderTableView" destination="yXW-Oh-c8y" id="pKb-oj-bkV"/>
<outlet property="nameTableColumn" destination="yeU-u1-CWG" id="Dxp-QO-oXu"/>
<outlet property="pathTableColumn" destination="oY3-Hl-Pyi" id="fZs-RB-NLB"/>
<outlet property="presentTableColumn" destination="Bs6-l7-T2R" id="BLH-Ag-kYm"/>
<outlet property="removeFolderButton" destination="TXg-4i-ifD" id="h1S-AS-JhG"/>
</connections>
<point key="canvasLocation" x="60" y="199.5"/>
</window>
</objects>
</document>
......@@ -68,6 +68,9 @@ NSString *VLCLibraryCellIdentifier = @"VLCLibraryCellIdentifier";
- (void)mediaItemUpdated:(NSNotification *)aNotification
{
VLCMediaLibraryMediaItem *updatedMediaItem = aNotification.object;
if (updatedMediaItem == nil || _representedMediaItem == nil) {
return;
}
if (updatedMediaItem.libraryID == _representedMediaItem.libraryID) {
[self updateRepresentation];
}
......
......@@ -35,6 +35,11 @@ NS_ASSUME_NONNULL_BEGIN
- (void)showItemAtIndexPathInFinder:(NSIndexPath *)indexPath;
- (int)attemptToGenerateThumbnailForMediaItem:(VLCMediaLibraryMediaItem *)mediaItem;
- (int)addFolderWithFileURL:(NSURL *)fileURL;
- (int)banFolderWithFileURL:(NSURL *)fileURL;
- (int)unbanFolderWithFileURL:(NSURL *)fileURL;
- (int)removeFolderWithFileURL:(NSURL *)fileURL;
@end
NS_ASSUME_NONNULL_END
......@@ -126,4 +126,26 @@
return vlc_ml_media_generate_thumbnail(_p_libraryInstance, mediaItem.libraryID);
}
#pragma mark - folder management
- (int)addFolderWithFileURL:(NSURL *)fileURL
{
return vlc_ml_add_folder(_p_libraryInstance, [[fileURL absoluteString] UTF8String]);
}
- (int)banFolderWithFileURL:(NSURL *)fileURL
{
return vlc_ml_ban_folder(_p_libraryInstance, [[fileURL absoluteString] UTF8String]);
}
- (int)unbanFolderWithFileURL:(NSURL *)fileURL
{
return vlc_ml_unban_folder(_p_libraryInstance, [[fileURL absoluteString] UTF8String]);
}
- (int)removeFolderWithFileURL:(NSURL *)fileURL
{
return vlc_ml_remove_folder(_p_libraryInstance, [[fileURL absoluteString] UTF8String]);
}
@end
/*****************************************************************************
* VLCLibraryFolderManagementWindow.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
@interface VLCLibraryFolderManagementWindowController : NSWindowController
@end
@interface VLCLibraryFolderManagementWindow : NSWindow <NSTableViewDelegate, NSTableViewDataSource>
@property (readwrite, weak) IBOutlet NSTableView *libraryFolderTableView;
@property (readwrite, weak) IBOutlet NSTableColumn *nameTableColumn;
@property (readwrite, weak) IBOutlet NSTableColumn *pathTableColumn;
@property (readwrite, weak) IBOutlet NSTableColumn *presentTableColumn;
@property (readwrite, weak) IBOutlet NSTableColumn *bannedTableColumn;
@property (readwrite, weak) IBOutlet NSButton *addFolderButton;
@property (readwrite, weak) IBOutlet NSButton *removeFolderButton;
@property (readwrite, weak) IBOutlet NSButton *banFolderButton;
- (IBAction)addFolder:(id)sender;
- (IBAction)removeFolder:(id)sender;
- (IBAction)banFolder:(id)sender;
@end
NS_ASSUME_NONNULL_END
/*****************************************************************************
* VLCLibraryFolderManagementWindow.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 "VLCLibraryFolderManagementWindow.h"
#import "main/VLCMain.h"
#import "library/VLCLibraryController.h"
#import "library/VLCLibraryModel.h"
#import "library/VLCLibraryDataTypes.h"
#import "extensions/NSString+Helpers.h"
@implementation VLCLibraryFolderManagementWindowController
- (void)windowDidLoad {
[super windowDidLoad];
VLCLibraryFolderManagementWindow *window = (VLCLibraryFolderManagementWindow *)self.window;
[window setTitle:_NS("Media Library")];
[window.addFolderButton setTitle:_NS("Add Folder...")];
[window.banFolderButton setTitle:_NS("Ban Folder")];
[window.removeFolderButton setTitle:_NS("Remove Folder")];
[window.nameTableColumn setTitle:_NS("Name")];
[window.presentTableColumn setTitle:_NS("Present")];
[window.bannedTableColumn setTitle:_NS("Banned")];
[window.pathTableColumn setTitle:_NS("Location")];
}
@end
@interface VLCLibraryFolderManagementWindow ()
{
NSArray *_cachedFolderList;
VLCLibraryController *_libraryController;
}
@end
@implementation VLCLibraryFolderManagementWindow
- (instancetype)initWithContentRect:(NSRect)contentRect styleMask:(NSWindowStyleMask)style backing:(NSBackingStoreType)backingStoreType defer:(BOOL)flag
{
self = [super initWithContentRect:contentRect styleMask:style backing:backingStoreType defer:flag];
if (self) {
_libraryController = [[VLCMain sharedInstance] libraryController];
}
return self;
}
- (void)awakeFromNib
{
self.banFolderButton.enabled = self.removeFolderButton.enabled = NO;
}
- (void)makeKeyAndOrderFront:(id)sender
{
[super makeKeyAndOrderFront:sender];
[self.libraryFolderTableView reloadData];
}
- (IBAction)addFolder:(id)sender
{
NSOpenPanel *openPanel = [NSOpenPanel openPanel];
[openPanel setTitle:_NS("Add Folder")];
[openPanel setCanChooseFiles:NO];
[openPanel setCanChooseDirectories:YES];
[openPanel setAllowsMultipleSelection:YES];
NSModalResponse returnValue = [openPanel runModal];
if (returnValue == NSModalResponseOK) {
NSArray *URLs = [openPanel URLs];
NSUInteger count = [URLs count];
for (NSUInteger i = 0; i < count ; i++) {
NSURL *url = URLs[i];
[_libraryController addFolderWithFileURL:url];
}
[self.libraryFolderTableView reloadData];
}
}
- (IBAction)banFolder:(id)sender
{
VLCMediaLibraryEntryPoint *entryPoint = _cachedFolderList[self.libraryFolderTableView.selectedRow];
if (entryPoint.isBanned) {
[_libraryController unbanFolderWithFileURL:[NSURL URLWithString:entryPoint.MRL]];
} else {
[_libraryController banFolderWithFileURL:[NSURL URLWithString:entryPoint.MRL]];
}
[self.libraryFolderTableView reloadData];
}
- (IBAction)removeFolder:(id)sender
{
VLCMediaLibraryEntryPoint *entryPoint = _cachedFolderList[self.libraryFolderTableView.selectedRow];
[_libraryController removeFolderWithFileURL:[NSURL URLWithString:entryPoint.MRL]];
[self.libraryFolderTableView reloadData];
}
- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView
{
if (!_cachedFolderList) {
_cachedFolderList = [[_libraryController libraryModel] listOfMonitoredFolders];
}
return _cachedFolderList.count;
}
- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{
VLCMediaLibraryEntryPoint *entryPoint = _cachedFolderList[row];
if (tableColumn == self.nameTableColumn) {
return [entryPoint.MRL lastPathComponent];
} else if (tableColumn == self.presentTableColumn) {
return entryPoint.isPresent ? @"✔" : @"✘";
} else if (tableColumn == self.bannedTableColumn) {
return entryPoint.isBanned ? @"✔" : @"✘";
} else {
return entryPoint.MRL;
}
}
- (void)tableViewSelectionDidChange:(NSNotification *)notification
{
NSInteger selectedRow = self.libraryFolderTableView.selectedRow;
if (selectedRow == -1) {
self.banFolderButton.enabled = self.removeFolderButton.enabled = NO;
return;
}
self.banFolderButton.enabled = self.removeFolderButton.enabled = YES;
VLCMediaLibraryEntryPoint *entryPoint = _cachedFolderList[selectedRow];
[self.banFolderButton setTitle:entryPoint.isBanned ? _NS("Unban Folder") : _NS("Ban Folder")];
}
@end
......@@ -32,6 +32,7 @@ typedef NS_ENUM(NSInteger, VLCLibraryMode) {
};
@class VLCMediaLibraryMediaItem;
@class VLCMediaLibraryEntryPoint;
extern NSString *VLCLibraryModelAudioMediaListUpdated;
extern NSString *VLCLibraryModelVideoMediaListUpdated;
......@@ -51,6 +52,8 @@ extern NSString *VLCLibraryModelMediaItemUpdated;
- (nullable VLCMediaLibraryMediaItem *)mediaItemAtIndexPath:(NSIndexPath *)index;
@property (readonly) NSArray <VLCMediaLibraryEntryPoint *> *listOfMonitoredFolders;
@end
NS_ASSUME_NONNULL_END
......@@ -22,6 +22,7 @@
#import "VLCLibraryModel.h"
#import "main/VLCMain.h"
#import "library/VLCLibraryDataTypes.h"
NSString *VLCLibraryModelAudioMediaListUpdated = @"VLCLibraryModelAudioMediaListUpdated";
......@@ -190,4 +191,25 @@ static void libraryCallback(void *p_data, const vlc_ml_event_t *p_event)
return _cachedVideoMedia;
}
- (NSArray<VLCMediaLibraryEntryPoint *> *)listOfMonitoredFolders
{
vlc_ml_entry_point_list_t *pp_entrypoints;
int ret = vlc_ml_list_folder(_p_mediaLibrary, &pp_entrypoints);
if (ret != VLC_SUCCESS) {
msg_Err(getIntf(), "failed to retrieve list of monitored library folders (%i)", ret);
return @[];
}
NSMutableArray *mutableArray = [[NSMutableArray alloc] initWithCapacity:pp_entrypoints->i_nb_items];
for (size_t x = 0; x < pp_entrypoints->i_nb_items; x++) {
VLCMediaLibraryEntryPoint *entryPoint = [[VLCMediaLibraryEntryPoint alloc] initWithEntryPoint:&pp_entrypoints->p_items[x]];
if (entryPoint) {
[mutableArray addObject:entryPoint];
}
}
vlc_ml_entry_point_list_release(pp_entrypoints);
return [mutableArray copy];
}
@end
......@@ -66,7 +66,7 @@
@property (readwrite, weak) IBOutlet NSMenuItem *toggleJumpButtons;
@property (readwrite, weak) IBOutlet NSMenuItem *togglePlaymodeButtons;
@property (readwrite, weak) IBOutlet NSMenuItem *toggleEffectsButton;
@property (readwrite, weak) IBOutlet NSMenuItem *toggleSidebar;
@property (readwrite, weak) IBOutlet NSMenuItem *showLibraryFolders;
@property (readwrite, weak) IBOutlet NSMenu *playlistTableColumnsMenu;
@property (readwrite, weak) IBOutlet NSMenuItem *playlistTableColumns;
......@@ -212,7 +212,6 @@
- (void)releaseRepresentedObjects:(NSMenu *)the_menu;
- (void)setRateControlsEnabled:(BOOL)b_enabled;
- (void)updateSidebarMenuItem:(BOOL)show;
- (IBAction)openAddonManager:(id)sender;
......@@ -226,7 +225,7 @@
- (IBAction)toggleEffectsButton:(id)sender;
- (IBAction)toggleJumpButtons:(id)sender;
- (IBAction)togglePlaymodeButtons:(id)sender;
- (IBAction)toggleSidebar:(id)sender;
- (IBAction)showLibraryFolders:(id)sender;
- (IBAction)play:(id)sender;
- (IBAction)stop:(id)sender;
......
......@@ -27,6 +27,7 @@
#import "extensions/NSScreen+VLCAdditions.h"
#import "library/VLCLibraryWindow.h"
#import "library/VLCLibraryFolderManagementWindow.h"
#import "menus/renderers/VLCRendererMenuController.h"
......@@ -91,6 +92,7 @@ typedef NS_ENUM(NSInteger, VLCObjectType) {
VLCRendererMenuController *_rendererMenuController;
VLCPlaylistController *_playlistController;
VLCPlayerController *_playerController;
VLCLibraryFolderManagementWindowController *_libraryFoldersController;
NSTimer *_cancelRendererDiscoveryTimer;
NSMenu *_playlistTableColumnsContextMenu;
......@@ -366,7 +368,7 @@ typedef NS_ENUM(NSInteger, VLCObjectType) {
[_togglePlaymodeButtons setState: var_InheritBool(getIntf(), "macosx-show-playmode-buttons")];
[_toggleEffectsButton setTitle: _NS("Show Audio Effects Button")];
[_toggleEffectsButton setState: var_InheritBool(getIntf(), "macosx-show-effects-button")];
[_toggleSidebar setTitle: _NS("Show Sidebar")];
[_showLibraryFolders setTitle: _NS("Show Library Folders...")];
[_playlistTableColumns setTitle: _NS("Playlist Table Columns")];
[_controlsMenu setTitle: _NS("Playback")];
......@@ -760,14 +762,12 @@ typedef NS_ENUM(NSInteger, VLCObjectType) {
[_togglePlaymodeButtons setState: b_value];
}
- (IBAction)toggleSidebar:(id)sender
- (IBAction)showLibraryFolders:(id)sender
{
// FIXME: remove this method as it is no longer needed
}
- (void)updateSidebarMenuItem:(BOOL)show;
{
[_toggleSidebar setState:show];
if (!_libraryFoldersController) {
_libraryFoldersController = [[VLCLibraryFolderManagementWindowController alloc] initWithWindowNibName:@"VLCLibraryFolderManagementWindow"];
}
[_libraryFoldersController showWindow:sender];
}
#pragma mark - Playback
......
......@@ -472,6 +472,8 @@ modules/gui/macosx/library/VLCLibraryDataSource.h
modules/gui/macosx/library/VLCLibraryDataSource.m
modules/gui/macosx/library/VLCLibraryDataTypes.h
modules/gui/macosx/library/VLCLibraryDataTypes.m
modules/gui/macosx/library/VLCLibraryFolderManagementWindow.h
modules/gui/macosx/library/VLCLibraryFolderManagementWindow.m
modules/gui/macosx/library/VLCLibraryMenuController.h
modules/gui/macosx/library/VLCLibraryMenuController.m
modules/gui/macosx/library/VLCLibraryModel.h
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment