[vlc-commits] macosx: implement playlist reordering (closes #22757)

Felix Paul Kühne git at videolan.org
Mon Oct 21 10:46:44 CEST 2019


vlc | branch: master | Felix Paul Kühne <felix at feepk.net> | Mon Oct 21 10:45:52 2019 +0200| [66180178cafcd09561ba4a202a921e7d3d6d4b2b] | committer: Felix Paul Kühne

macosx: implement playlist reordering (closes #22757)

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=66180178cafcd09561ba4a202a921e7d3d6d4b2b
---

 modules/gui/macosx/UI/VLCLibraryWindow.xib         | 104 ++++++++++-----------
 .../gui/macosx/playlist/VLCPlaylistController.h    |   8 ++
 .../gui/macosx/playlist/VLCPlaylistController.m    |  35 ++++++-
 .../gui/macosx/playlist/VLCPlaylistDataSource.m    |  21 ++++-
 modules/gui/macosx/playlist/VLCPlaylistItem.h      |   3 +
 modules/gui/macosx/playlist/VLCPlaylistItem.m      |   7 ++
 modules/gui/macosx/playlist/VLCPlaylistModel.h     |   1 +
 modules/gui/macosx/playlist/VLCPlaylistModel.m     |   7 ++
 8 files changed, 132 insertions(+), 54 deletions(-)

diff --git a/modules/gui/macosx/UI/VLCLibraryWindow.xib b/modules/gui/macosx/UI/VLCLibraryWindow.xib
index 202c305c39..19092e7cb8 100644
--- a/modules/gui/macosx/UI/VLCLibraryWindow.xib
+++ b/modules/gui/macosx/UI/VLCLibraryWindow.xib
@@ -1,8 +1,8 @@
 <?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">
+<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="15400" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
     <dependencies>
         <deployment identifier="macosx"/>
-        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="14490.70"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="15400"/>
         <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
     </dependencies>
     <objects>
@@ -17,7 +17,7 @@
             <windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES" fullSizeContentView="YES"/>
             <windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
             <rect key="contentRect" x="196" y="240" width="480" height="363"/>
-            <rect key="screenRect" x="0.0" y="0.0" width="1920" height="1177"/>
+            <rect key="screenRect" x="0.0" y="0.0" width="1680" height="1027"/>
             <view key="contentView" wantsLayer="YES" id="EiT-Mj-1SZ">
                 <rect key="frame" x="0.0" y="0.0" width="480" height="363"/>
                 <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
@@ -25,7 +25,7 @@
                     <segmentedControl verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="W1M-0o-qYG">
                         <rect key="frame" x="212.5" y="333" width="56" height="23"/>
                         <segmentedCell key="cell" borderStyle="border" alignment="left" style="texturedRounded" trackingMode="selectOne" id="Twg-gp-8ng">
-                            <font key="font" metaFont="system"/>
+                            <font key="font" metaFont="message"/>
                             <segments>
                                 <segment/>
                                 <segment selected="YES" tag="1"/>
@@ -45,17 +45,17 @@
                                 <autoresizingMask key="autoresizingMask"/>
                                 <subviews>
                                     <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="TET-5r-zHx">
-                                        <rect key="frame" x="18" y="230" width="37" height="17"/>
+                                        <rect key="frame" x="18" y="230" width="37" height="16"/>
                                         <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="fo5-R8-TeO">
-                                            <font key="font" metaFont="system"/>
+                                            <font key="font" metaFont="message"/>
                                             <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
                                             <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
                                         </textFieldCell>
                                     </textField>
                                     <textField horizontalHuggingPriority="251" verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="mbV-My-cm7" customClass="VLCRoundedCornerTextField">
-                                        <rect key="frame" x="182" y="230" width="37" height="17"/>
+                                        <rect key="frame" x="182" y="230" width="37" height="16"/>
                                         <textFieldCell key="cell" lineBreakMode="clipping" title="Label" id="4hq-fU-NXW">
-                                            <font key="font" metaFont="system"/>
+                                            <font key="font" metaFont="message"/>
                                             <color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
                                             <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
                                         </textFieldCell>
@@ -69,21 +69,21 @@
                                             <rect key="frame" x="0.0" y="0.0" width="237" height="151"/>
                                             <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                                             <subviews>
-                                                <tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" autosaveColumns="NO" rowSizeStyle="automatic" viewBased="YES" id="Fr1-af-8gb" customClass="VLCPlaylistTableView">
+                                                <tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" multipleSelection="NO" autosaveColumns="NO" rowSizeStyle="automatic" viewBased="YES" id="Fr1-af-8gb" customClass="VLCPlaylistTableView">
                                                     <rect key="frame" x="0.0" y="0.0" width="237" height="151"/>
-                                                    <autoresizingMask key="autoresizingMask"/>
+                                                    <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                                                     <size key="intercellSpacing" width="3" height="2"/>
                                                     <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
                                                     <color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
                                                     <tableColumns>
                                                         <tableColumn width="234" minWidth="40" maxWidth="1000" id="gkH-E7-Nn4">
                                                             <tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border">
-                                                                <font key="font" metaFont="smallSystem"/>
+                                                                <font key="font" metaFont="message" size="11"/>
                                                                 <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="IQu-Aw-5Gr">
-                                                                <font key="font" metaFont="system"/>
+                                                                <font key="font" metaFont="message"/>
                                                                 <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
                                                                 <color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
                                                             </textFieldCell>
@@ -97,7 +97,7 @@
                                                                             <rect key="frame" x="0.0" y="0.0" width="234" height="17"/>
                                                                             <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
                                                                             <textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="vlq-wz-y8v">
-                                                                                <font key="font" metaFont="system"/>
+                                                                                <font key="font" metaFont="message"/>
                                                                                 <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
                                                                                 <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
                                                                             </textFieldCell>
@@ -134,7 +134,7 @@
                                         <rect key="frame" x="20" y="15" width="24" height="24"/>
                                         <buttonCell key="cell" type="square" bezelStyle="shadowlessSquare" image="shuffleOn" imagePosition="only" alignment="center" imageScaling="proportionallyDown" inset="2" id="J31-h3-U4s">
                                             <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
-                                            <font key="font" metaFont="system"/>
+                                            <font key="font" metaFont="message"/>
                                         </buttonCell>
                                         <connections>
                                             <action selector="shuffleAction:" target="QvC-M9-y7g" id="IPl-lr-hFA"/>
@@ -144,7 +144,7 @@
                                         <rect key="frame" x="64" y="15" width="24" height="24"/>
                                         <buttonCell key="cell" type="square" bezelStyle="shadowlessSquare" image="repeatOff" imagePosition="only" alignment="center" imageScaling="proportionallyDown" inset="2" id="ol2-xi-TEm">
                                             <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
-                                            <font key="font" metaFont="system"/>
+                                            <font key="font" metaFont="message"/>
                                         </buttonCell>
                                         <connections>
                                             <action selector="repeatAction:" target="QvC-M9-y7g" id="zpd-jv-1v1"/>
@@ -154,7 +154,7 @@
                                         <rect key="frame" x="202" y="15" width="15" height="30"/>
                                         <buttonCell key="cell" type="square" bezelStyle="shadowlessSquare" image="NSTouchBarDeleteTemplate" imagePosition="only" alignment="center" imageScaling="proportionallyDown" inset="2" id="OjM-W9-IrQ">
                                             <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
-                                            <font key="font" metaFont="system"/>
+                                            <font key="font" metaFont="message"/>
                                         </buttonCell>
                                         <connections>
                                             <action selector="clearPlaylist:" target="QvC-M9-y7g" id="tzd-mR-sDu"/>
@@ -175,7 +175,7 @@
                                                 <rect key="frame" x="56" y="-10" width="125" height="32"/>
                                                 <buttonCell key="cell" type="push" title="Open media..." bezelStyle="rounded" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="UUH-HF-Iqc">
                                                     <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
-                                                    <font key="font" metaFont="system"/>
+                                                    <font key="font" metaFont="message"/>
                                                 </buttonCell>
                                                 <connections>
                                                     <action selector="openMedia:" target="QvC-M9-y7g" id="Px5-M7-DSb"/>
@@ -193,7 +193,7 @@
                                         <rect key="frame" x="171" y="23" width="21" height="14"/>
                                         <buttonCell key="cell" type="square" bezelStyle="shadowlessSquare" image="NSTextRulerLineHeightIncrease" imagePosition="only" alignment="center" imageScaling="proportionallyDown" inset="2" id="qDZ-84-3uy">
                                             <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
-                                            <font key="font" metaFont="system"/>
+                                            <font key="font" metaFont="message"/>
                                         </buttonCell>
                                         <connections>
                                             <action selector="sortPlaylist:" target="QvC-M9-y7g" id="sBc-0X-g5C"/>
@@ -249,7 +249,7 @@
                                                 <rect key="frame" x="0.0" y="0.0" width="29" height="23"/>
                                                 <buttonCell key="cell" type="bevel" bezelStyle="regularSquare" image="backward-3btns" imagePosition="only" alignment="center" alternateImage="backward-3btns-pressed" continuous="YES" enabled="NO" id="tnS-iP-qgi">
                                                     <behavior key="behavior" lightByContents="YES"/>
-                                                    <font key="font" metaFont="label"/>
+                                                    <font key="font" metaFont="system" size="10"/>
                                                 </buttonCell>
                                                 <connections>
                                                     <action selector="bwd:" target="Uzf-Tf-H8x" id="oqX-44-Xe8"/>
@@ -269,7 +269,7 @@
                                                 <rect key="frame" x="56" y="0.0" width="29" height="23"/>
                                                 <buttonCell key="cell" type="bevel" bezelStyle="regularSquare" image="forward-3btns" imagePosition="only" alignment="center" alternateImage="forward-3btns-pressed" continuous="YES" enabled="NO" id="5ig-mn-y7F">
                                                     <behavior key="behavior" lightByContents="YES"/>
-                                                    <font key="font" metaFont="label"/>
+                                                    <font key="font" metaFont="system" size="10"/>
                                                 </buttonCell>
                                                 <connections>
                                                     <action selector="fwd:" target="Uzf-Tf-H8x" id="jMH-cC-gq9"/>
@@ -296,7 +296,7 @@
                                             <constraint firstAttribute="height" constant="14" id="4YR-vo-ZfK"/>
                                         </constraints>
                                         <sliderCell key="cell" controlSize="small" continuous="YES" state="on" alignment="left" maxValue="1" doubleValue="0.32600000000000001" tickMarkPosition="above" sliderType="linear" id="YMg-uo-8nX" customClass="VLCSliderCell">
-                                            <font key="font" size="12" name="Helvetica"/>
+                                            <font key="font" metaFont="user"/>
                                         </sliderCell>
                                         <connections>
                                             <action selector="timeSliderAction:" target="Uzf-Tf-H8x" id="eDh-39-Ej1"/>
@@ -309,7 +309,7 @@
                                             <constraint firstAttribute="width" relation="greaterThanOrEqual" constant="52" id="aOU-Hc-ufI"/>
                                         </constraints>
                                         <textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" state="on" alignment="center" title="00:00" id="adD-oG-KsD">
-                                            <font key="font" metaFont="label"/>
+                                            <font key="font" metaFont="system" size="10"/>
                                             <color key="textColor" white="0.25" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/>
                                             <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
                                         </textFieldCell>
@@ -322,7 +322,7 @@
                                         </constraints>
                                         <buttonCell key="cell" type="bevel" bezelStyle="regularSquare" image="fullscreen-one-button" imagePosition="only" alignment="center" alternateImage="fullscreen-one-button-pressed" id="fMb-sg-sZ1">
                                             <behavior key="behavior" pushIn="YES" changeContents="YES" lightByContents="YES"/>
-                                            <font key="font" metaFont="label"/>
+                                            <font key="font" metaFont="system" size="10"/>
                                         </buttonCell>
                                         <connections>
                                             <action selector="fullscreen:" target="Uzf-Tf-H8x" id="ayV-qE-Nmy"/>
@@ -335,7 +335,7 @@
                                         </constraints>
                                         <buttonCell key="cell" type="bevel" bezelStyle="regularSquare" image="volume-low" imagePosition="only" alignment="center" id="qTN-dX-Oj5">
                                             <behavior key="behavior" lightByContents="YES"/>
-                                            <font key="font" metaFont="label"/>
+                                            <font key="font" metaFont="system" size="10"/>
                                         </buttonCell>
                                         <connections>
                                             <action selector="volumeAction:" target="Uzf-Tf-H8x" id="ugn-Py-dV8"/>
@@ -358,7 +358,7 @@
                                         </constraints>
                                         <buttonCell key="cell" type="bevel" bezelStyle="regularSquare" image="volume-high" imagePosition="only" alignment="center" id="a9Z-7I-lXJ">
                                             <behavior key="behavior" lightByContents="YES"/>
-                                            <font key="font" metaFont="label"/>
+                                            <font key="font" metaFont="system" size="10"/>
                                         </buttonCell>
                                         <connections>
                                             <action selector="volumeAction:" target="Uzf-Tf-H8x" id="8aL-jE-MXa"/>
@@ -371,7 +371,7 @@
                                         </constraints>
                                         <buttonCell key="cell" type="bevel" bezelStyle="regularSquare" image="stop" imagePosition="only" alignment="center" alternateImage="stop-pressed" enabled="NO" id="NEI-Es-D2A">
                                             <behavior key="behavior" lightByContents="YES"/>
-                                            <font key="font" metaFont="label"/>
+                                            <font key="font" metaFont="system" size="10"/>
                                         </buttonCell>
                                         <connections>
                                             <action selector="stop:" target="Uzf-Tf-H8x" id="kMO-P8-eOG"/>
@@ -414,7 +414,7 @@
                             <constraint firstAttribute="width" constant="96" id="pdg-70-JyS"/>
                         </constraints>
                         <searchFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" selectable="YES" editable="YES" borderStyle="bezel" usesSingleLineMode="YES" bezelStyle="round" id="hOD-ST-dRA">
-                            <font key="font" metaFont="system"/>
+                            <font key="font" metaFont="message"/>
                             <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
                             <color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
                         </searchFieldCell>
@@ -426,7 +426,7 @@
                         </constraints>
                         <buttonCell key="cell" type="bevel" bezelStyle="regularSquare" image="NSPrivateChaptersTemplate" imagePosition="only" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="qZO-fT-bFY">
                             <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
-                            <font key="font" metaFont="system"/>
+                            <font key="font" metaFont="message"/>
                         </buttonCell>
                         <connections>
                             <action selector="showAndHidePlaylist:" target="QvC-M9-y7g" id="hRz-bm-JJi"/>
@@ -435,7 +435,7 @@
                     <segmentedControl verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="8iI-b7-Eag">
                         <rect key="frame" x="212" y="301" width="56" height="24"/>
                         <segmentedCell key="cell" borderStyle="border" alignment="left" style="rounded" trackingMode="selectOne" id="j8T-nk-7Ny">
-                            <font key="font" metaFont="system"/>
+                            <font key="font" metaFont="message"/>
                             <segments>
                                 <segment/>
                                 <segment selected="YES" tag="1"/>
@@ -448,7 +448,7 @@
                     <segmentedControl verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="7K7-4r-Swk">
                         <rect key="frame" x="177" y="301" width="67" height="24"/>
                         <segmentedCell key="cell" borderStyle="border" alignment="left" style="rounded" trackingMode="selectOne" id="Txm-sT-UX4">
-                            <font key="font" metaFont="system"/>
+                            <font key="font" metaFont="message"/>
                             <segments>
                                 <segment image="NSIconViewTemplate"/>
                                 <segment image="NSListViewTemplate" selected="YES" tag="1"/>
@@ -459,7 +459,7 @@
                         <rect key="frame" x="4" y="296" width="57" height="32"/>
                         <buttonCell key="cell" type="push" bezelStyle="rounded" image="NSTextRulerLineHeightIncrease" imagePosition="only" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="PIW-C4-naY">
                             <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
-                            <font key="font" metaFont="system"/>
+                            <font key="font" metaFont="message"/>
                         </buttonCell>
                         <connections>
                             <action selector="sortLibrary:" target="QvC-M9-y7g" id="VJd-p4-owD"/>
@@ -469,14 +469,14 @@
                         <rect key="frame" x="56" y="328" width="45" height="32"/>
                         <buttonCell key="cell" type="push" bezelStyle="rounded" image="NSLeftFacingTriangleTemplate" imagePosition="only" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="iCT-DX-7zt">
                             <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
-                            <font key="font" metaFont="system"/>
+                            <font key="font" metaFont="message"/>
                         </buttonCell>
                     </button>
                     <button verticalHuggingPriority="750" translatesAutoresizingMaskIntoConstraints="NO" id="ehX-wB-NgX">
                         <rect key="frame" x="89" y="328" width="45" height="32"/>
                         <buttonCell key="cell" type="push" bezelStyle="rounded" image="NSRightFacingTriangleTemplate" imagePosition="only" alignment="center" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="2fB-Bb-72z">
                             <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
-                            <font key="font" metaFont="system"/>
+                            <font key="font" metaFont="message"/>
                         </buttonCell>
                     </button>
                 </subviews>
@@ -651,23 +651,23 @@
                     <rect key="frame" x="0.0" y="0.0" width="528" height="267"/>
                     <clipView key="contentView" id="5co-vI-cEn">
                         <rect key="frame" x="0.0" y="0.0" width="528" height="267"/>
-                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <autoresizingMask key="autoresizingMask"/>
                         <subviews>
                             <tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" columnReordering="NO" columnSelection="YES" multipleSelection="NO" autosaveColumns="NO" viewBased="YES" id="vpJ-Oz-Ebz">
                                 <rect key="frame" x="0.0" y="0.0" width="528" height="267"/>
-                                <autoresizingMask key="autoresizingMask"/>
+                                <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                                 <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="525" minWidth="40" maxWidth="1000" id="89Q-Wg-BdA">
                                         <tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border">
-                                            <font key="font" metaFont="smallSystem"/>
+                                            <font key="font" metaFont="message" size="11"/>
                                             <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="v9H-KJ-Zhv">
-                                            <font key="font" metaFont="system"/>
+                                            <font key="font" metaFont="message"/>
                                             <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
                                             <color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
                                         </textFieldCell>
@@ -681,7 +681,7 @@
                                                         <rect key="frame" x="0.0" y="-17" width="525" height="17"/>
                                                         <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
                                                         <textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="LYl-7r-eAr">
-                                                            <font key="font" metaFont="system"/>
+                                                            <font key="font" metaFont="message"/>
                                                             <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
                                                             <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
                                                         </textFieldCell>
@@ -710,7 +710,7 @@
                     <rect key="frame" x="0.0" y="0.0" width="528" height="267"/>
                     <clipView key="contentView" id="tI4-x3-55j">
                         <rect key="frame" x="0.0" y="0.0" width="528" height="267"/>
-                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <autoresizingMask key="autoresizingMask"/>
                         <subviews>
                             <collectionView selectable="YES" id="r7v-GI-W1U">
                                 <rect key="frame" x="0.0" y="0.0" width="528" height="267"/>
@@ -734,7 +734,7 @@
                 <pathControl verticalHuggingPriority="750" allowsExpansionToolTips="YES" translatesAutoresizingMaskIntoConstraints="NO" id="Rjk-Q6-FYy">
                     <rect key="frame" x="46" y="277" width="472" height="20"/>
                     <pathCell key="cell" controlSize="small" selectable="YES" editable="YES" alignment="left" id="kIb-Jz-eus">
-                        <font key="font" metaFont="smallSystem"/>
+                        <font key="font" metaFont="message" size="11"/>
                         <url key="url" string="file://localhost/Applications/"/>
                     </pathCell>
                 </pathControl>
@@ -745,7 +745,7 @@
                     </constraints>
                     <buttonCell key="cell" type="push" bezelStyle="rounded" image="NSHomeTemplate" imagePosition="only" alignment="center" controlSize="small" borderStyle="border" imageScaling="proportionallyDown" inset="2" id="OHf-j4-3In">
                         <behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
-                        <font key="font" metaFont="smallSystem"/>
+                        <font key="font" metaFont="message" size="11"/>
                     </buttonCell>
                 </button>
             </subviews>
@@ -778,23 +778,23 @@
                             <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                             <clipView key="contentView" id="qva-RZ-DvL">
                                 <rect key="frame" x="0.0" y="0.0" width="312" height="390"/>
-                                <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                                <autoresizingMask key="autoresizingMask"/>
                                 <subviews>
                                     <tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" columnReordering="NO" columnSelection="YES" multipleSelection="NO" autosaveColumns="NO" viewBased="YES" id="LNt-ot-2wU">
                                         <rect key="frame" x="0.0" y="0.0" width="312" height="390"/>
-                                        <autoresizingMask key="autoresizingMask"/>
+                                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                                         <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="309" minWidth="40" maxWidth="1000" id="z5o-3O-6vc">
                                                 <tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border">
-                                                    <font key="font" metaFont="smallSystem"/>
+                                                    <font key="font" metaFont="message" size="11"/>
                                                     <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="eXM-oB-xvr">
-                                                    <font key="font" metaFont="system"/>
+                                                    <font key="font" metaFont="message"/>
                                                     <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
                                                     <color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
                                                 </textFieldCell>
@@ -808,7 +808,7 @@
                                                                 <rect key="frame" x="0.0" y="0.0" width="309" height="17"/>
                                                                 <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
                                                                 <textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="zRF-hR-42C">
-                                                                    <font key="font" metaFont="system"/>
+                                                                    <font key="font" metaFont="message"/>
                                                                     <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
                                                                     <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
                                                                 </textFieldCell>
@@ -838,23 +838,23 @@
                             <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
                             <clipView key="contentView" id="xCC-h9-931">
                                 <rect key="frame" x="0.0" y="0.0" width="401" height="390"/>
-                                <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                                <autoresizingMask key="autoresizingMask"/>
                                 <subviews>
                                     <tableView verticalHuggingPriority="750" allowsExpansionToolTips="YES" columnAutoresizingStyle="lastColumnOnly" columnReordering="NO" multipleSelection="NO" autosaveColumns="NO" rowSizeStyle="automatic" viewBased="YES" id="4ll-T2-J16">
                                         <rect key="frame" x="0.0" y="0.0" width="401" height="390"/>
-                                        <autoresizingMask key="autoresizingMask"/>
+                                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                                         <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="398" minWidth="40" maxWidth="1000" id="WLd-Pi-bR4">
                                                 <tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border">
-                                                    <font key="font" metaFont="smallSystem"/>
+                                                    <font key="font" metaFont="message" size="11"/>
                                                     <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="Ecs-pW-kyf">
-                                                    <font key="font" metaFont="system"/>
+                                                    <font key="font" metaFont="message"/>
                                                     <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
                                                     <color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
                                                 </textFieldCell>
@@ -868,7 +868,7 @@
                                                                 <rect key="frame" x="0.0" y="0.0" width="398" height="17"/>
                                                                 <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
                                                                 <textFieldCell key="cell" lineBreakMode="truncatingTail" sendsActionOnEndEditing="YES" title="Table View Cell" id="dbf-tg-Ss3">
-                                                                    <font key="font" metaFont="system"/>
+                                                                    <font key="font" metaFont="message"/>
                                                                     <color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
                                                                     <color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
                                                                 </textFieldCell>
@@ -903,7 +903,7 @@
                     <rect key="frame" x="0.0" y="0.0" width="714" height="390"/>
                     <clipView key="contentView" id="2oa-WL-dxA">
                         <rect key="frame" x="0.0" y="0.0" width="714" height="390"/>
-                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <autoresizingMask key="autoresizingMask"/>
                         <subviews>
                             <collectionView id="QAt-jP-zE7">
                                 <rect key="frame" x="0.0" y="0.0" width="714" height="390"/>
diff --git a/modules/gui/macosx/playlist/VLCPlaylistController.h b/modules/gui/macosx/playlist/VLCPlaylistController.h
index bec3b8a1f1..fcdecdf822 100644
--- a/modules/gui/macosx/playlist/VLCPlaylistController.h
+++ b/modules/gui/macosx/playlist/VLCPlaylistController.h
@@ -132,6 +132,14 @@ extern NSString *VLCPlaylistItemsRemoved;
          atPosition:(size_t)insertionIndex
       startPlayback:(BOOL)startPlayback;
 
+/**
+ * Move an item with a given unique ID to a new position
+ * @param uniqueID the ID of the playlist item to move
+ * @param target the target index of where to move the item
+ * @return returns VLC_SUCCESS or an error
+ */
+- (int)moveItemWithID:(int64_t)uniqueID toPosition:(size_t)target;
+
 /**
  * Remove all items at the given index set
  * @param indexes Set of indexes to remove
diff --git a/modules/gui/macosx/playlist/VLCPlaylistController.m b/modules/gui/macosx/playlist/VLCPlaylistController.m
index 13bfa3ae87..415d6cf60e 100644
--- a/modules/gui/macosx/playlist/VLCPlaylistController.m
+++ b/modules/gui/macosx/playlist/VLCPlaylistController.m
@@ -52,6 +52,7 @@ NSString *VLCPlaylistItemsRemoved = @"VLCPlaylistItemsRemoved";
 
 - (void)playlistResetWithItems:(NSArray *)items;
 - (void)playlistAdded:(NSArray *)items atIndex:(size_t)insertionIndex count:(size_t)numberOfItems;
+- (void)playlistMovedIndex:(size_t)index toTarget:(size_t)target numberOfItems:(size_t)count;
 - (void)playlistRemovedItemsAtIndex:(size_t)index count:(size_t)numberOfItems;
 - (void)playlistUpdatedForIndex:(size_t)firstUpdatedIndex items:(vlc_playlist_item_t *const *)items count:(size_t)numberOfItems;
 - (void)playlistPlaybackRepeatUpdated:(enum vlc_playlist_playback_repeat)currentRepeatMode;
@@ -100,6 +101,19 @@ cb_playlist_items_added(vlc_playlist_t *playlist,
     });
 }
 
+static void
+cb_playlist_items_moved(vlc_playlist_t *playlist,
+                        size_t index,
+                        size_t numberOfMovedItems,
+                        size_t target,
+                        void *p_data)
+{
+    dispatch_async(dispatch_get_main_queue(), ^{
+        VLCPlaylistController *playlistController = (__bridge VLCPlaylistController *)p_data;
+        [playlistController playlistMovedIndex:index toTarget:target numberOfItems:numberOfMovedItems];
+    });
+}
+
 static void
 cb_playlist_items_removed(vlc_playlist_t *playlist,
                           size_t index,
@@ -183,7 +197,7 @@ cb_playlist_has_next_changed(vlc_playlist_t *playlist,
 static const struct vlc_playlist_callbacks playlist_callbacks = {
     cb_playlist_items_reset,
     cb_playlist_items_added,
-    NULL,
+    cb_playlist_items_moved,
     cb_playlist_items_removed,
     cb_playlist_items_updated,
     cb_playlist_playback_repeat_changed,
@@ -288,6 +302,12 @@ static const struct vlc_playlist_callbacks playlist_callbacks = {
     [_defaultNotificationCenter postNotificationName:VLCPlaylistItemsAdded object:self];
 }
 
+- (void)playlistMovedIndex:(size_t)index toTarget:(size_t)target numberOfItems:(size_t)count
+{
+    [_playlistModel moveItemAtIndex:index toTarget:target];
+    [_playlistDataSource playlistUpdated];
+}
+
 - (void)playlistRemovedItemsAtIndex:(size_t)index count:(size_t)numberOfItems
 {
     NSRange range = NSMakeRange(index, numberOfItems);
@@ -423,6 +443,19 @@ static const struct vlc_playlist_callbacks playlist_callbacks = {
     return ret;
 }
 
+- (int)moveItemWithID:(int64_t)uniqueID toPosition:(size_t)target
+{
+    vlc_playlist_item_t **items = calloc(1, sizeof(vlc_playlist_item_t *));
+    vlc_playlist_Lock(_p_playlist);
+    ssize_t itemIndex = vlc_playlist_IndexOfId(_p_playlist, uniqueID);
+    vlc_playlist_item_t *p_item = vlc_playlist_Get(_p_playlist, itemIndex);
+    items[0] = p_item;
+    int ret = vlc_playlist_RequestMove(_p_playlist, items, 1, target, itemIndex);
+    vlc_playlist_Unlock(_p_playlist);
+    free(items);
+    return ret;
+}
+
 - (void)removeItemsAtIndexes:(NSIndexSet *)indexes
 {
     if (indexes.count == 0)
diff --git a/modules/gui/macosx/playlist/VLCPlaylistDataSource.m b/modules/gui/macosx/playlist/VLCPlaylistDataSource.m
index 61a8b39391..a6502be7a4 100644
--- a/modules/gui/macosx/playlist/VLCPlaylistDataSource.m
+++ b/modules/gui/macosx/playlist/VLCPlaylistDataSource.m
@@ -50,7 +50,7 @@ static NSString *VLCPlaylistCellIdentifier = @"VLCPlaylistCellIdentifier";
 
 - (void)prepareForUse
 {
-    [_tableView registerForDraggedTypes:@[VLCMediaLibraryMediaItemPasteboardType, NSFilenamesPboardType]];
+    [_tableView registerForDraggedTypes:@[VLCMediaLibraryMediaItemPasteboardType, VLCPlaylistItemPasteboardType, NSFilenamesPboardType]];
 }
 
 - (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView
@@ -102,6 +102,14 @@ static NSString *VLCPlaylistCellIdentifier = @"VLCPlaylistCellIdentifier";
     [_tableView reloadData];
 }
 
+- (id<NSPasteboardWriting>)tableView:(NSTableView *)tableView pasteboardWriterForRow:(NSInteger)row
+{
+    NSPasteboardItem *pboardItem = [[NSPasteboardItem alloc] init];
+    VLCPlaylistItem *playlistItem = [_playlistModel playlistItemAtIndex:row];
+    [pboardItem setString:[@(playlistItem.uniqueID) stringValue] forType:VLCPlaylistItemPasteboardType];
+    return pboardItem;
+}
+
 - (NSDragOperation)tableView:(NSTableView *)tableView
                 validateDrop:(id<NSDraggingInfo>)info
                  proposedRow:(NSInteger)row
@@ -115,8 +123,17 @@ static NSString *VLCPlaylistCellIdentifier = @"VLCPlaylistCellIdentifier";
               row:(NSInteger)row
     dropOperation:(NSTableViewDropOperation)dropOperation
 {
+    NSString *encodedIDtoMove = [info.draggingPasteboard stringForType:VLCPlaylistItemPasteboardType];
+    if (encodedIDtoMove != nil) {
+        int64_t uniqueID = [encodedIDtoMove integerValue];
+        [_playlistController moveItemWithID:uniqueID toPosition:row];
+        return YES;
+    }
+
+    /* check whether the receive data is a library item from the left-hand side */
     NSData *data = [info.draggingPasteboard dataForType:VLCMediaLibraryMediaItemPasteboardType];
     if (!data) {
+        /* it's not, so check if it is a file handle from the Finder */
         id propertyList = [info.draggingPasteboard propertyListForType:NSFilenamesPboardType];
         if (propertyList == nil) {
             return NO;
@@ -142,6 +159,8 @@ static NSString *VLCPlaylistCellIdentifier = @"VLCPlaylistCellIdentifier";
         }
         return NO;
     }
+
+    /* it is a media library item, so unarchive it and add it to the playlist */
     NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithData:data];
     if (!data) {
         return NO;
diff --git a/modules/gui/macosx/playlist/VLCPlaylistItem.h b/modules/gui/macosx/playlist/VLCPlaylistItem.h
index a8841f1acc..96ff2efb75 100644
--- a/modules/gui/macosx/playlist/VLCPlaylistItem.h
+++ b/modules/gui/macosx/playlist/VLCPlaylistItem.h
@@ -28,9 +28,12 @@ NS_ASSUME_NONNULL_BEGIN
 @class VLCInputItem;
 @class VLCMediaLibraryMediaItem;
 
+extern NSString *VLCPlaylistItemPasteboardType;
+
 @interface VLCPlaylistItem : NSObject
 
 @property (readonly) vlc_playlist_item_t *playlistItem;
+ at property (readonly) uint64_t uniqueID;
 @property (readwrite, retain) NSString *title;
 @property (readonly, copy, nullable) NSURL *url;
 @property (readonly, copy, nullable) NSString *path;
diff --git a/modules/gui/macosx/playlist/VLCPlaylistItem.m b/modules/gui/macosx/playlist/VLCPlaylistItem.m
index f6792903ef..cf13dca131 100644
--- a/modules/gui/macosx/playlist/VLCPlaylistItem.m
+++ b/modules/gui/macosx/playlist/VLCPlaylistItem.m
@@ -29,6 +29,8 @@
 #import "library/VLCInputItem.h"
 #import "library/VLCLibraryDataTypes.h"
 
+NSString *VLCPlaylistItemPasteboardType = @"org.videolan.vlc.playlistitemtype";
+
 @implementation VLCPlaylistItem
 
 - (instancetype)initWithPlaylistItem:(vlc_playlist_item_t *)p_item
@@ -52,6 +54,11 @@
     return [NSString stringWithFormat:@"item %p, title: %@ duration %lli", &_playlistItem, _title, _duration];
 }
 
+- (uint64_t)uniqueID
+{
+    return vlc_playlist_item_GetId(_playlistItem);
+}
+
 - (VLCInputItem *)inputItem
 {
     if (!_playlistItem) {
diff --git a/modules/gui/macosx/playlist/VLCPlaylistModel.h b/modules/gui/macosx/playlist/VLCPlaylistModel.h
index ea570580fe..10b7bb014f 100644
--- a/modules/gui/macosx/playlist/VLCPlaylistModel.h
+++ b/modules/gui/macosx/playlist/VLCPlaylistModel.h
@@ -37,6 +37,7 @@ NS_ASSUME_NONNULL_BEGIN
 - (VLCPlaylistItem *)playlistItemAtIndex:(NSInteger)index;
 - (void)addItems:(NSArray *)array;
 - (void)addItems:(NSArray *)array atIndex:(size_t)index count:(size_t)count;
+- (void)moveItemAtIndex:(size_t)index toTarget:(size_t)target;
 - (void)removeItemsInRange:(NSRange)range;
 - (void)updateItemAtIndex:(size_t)index;
 
diff --git a/modules/gui/macosx/playlist/VLCPlaylistModel.m b/modules/gui/macosx/playlist/VLCPlaylistModel.m
index 7b10022490..dd07fd1bf2 100644
--- a/modules/gui/macosx/playlist/VLCPlaylistModel.m
+++ b/modules/gui/macosx/playlist/VLCPlaylistModel.m
@@ -69,6 +69,13 @@
     [_playlistArray insertObjects:array atIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(index, count)]];
 }
 
+- (void)moveItemAtIndex:(size_t)index toTarget:(size_t)target
+{
+    VLCPlaylistItem *item = [_playlistArray objectAtIndex:index];
+    [_playlistArray removeObjectAtIndex:index];
+    [_playlistArray insertObject:item atIndex:target];
+}
+
 - (void)removeItemsInRange:(NSRange)range
 {
     [_playlistArray removeObjectsInRange:range];



More information about the vlc-commits mailing list