@@ -32,13 +32,27 @@ extension TextView: NSDraggingSource {
3232 }
3333 }
3434
35+ /// Adds a gesture for recognizing selection dragging gestures to the text view.
36+ /// See ``TextView/DragSelectionGesture`` for details.
3537 func setUpDragGesture( ) {
3638 let dragGesture = DragSelectionGesture ( target: self , action: #selector( dragGestureHandler ( _: ) ) )
3739 dragGesture. minimumPressDuration = NSEvent . doubleClickInterval / 3
3840 dragGesture. isEnabled = isSelectable
3941 addGestureRecognizer ( dragGesture)
4042 }
41-
43+
44+ /// Handles state change on the drag and drop gesture recognizer.
45+ ///
46+ /// This will ignore any gesture state besides `.began`, and will end by setting the state to `.ended`. The gesture
47+ /// is only meant to handle *recognizing* the drag, but the system drag interaction handles the rest.
48+ ///
49+ /// This will create a ``DraggingTextRenderer`` with the contents of the visible text selection. That is converted
50+ /// into an image and given to a new dragging session on the text view
51+ ///
52+ /// The rest of the drag interaction is handled by ``performDragOperation(_:)``, ``draggingUpdated(_:)``,
53+ /// ``draggingSession(_:willBeginAt:)`` and family.
54+ ///
55+ /// - Parameter sender: The gesture that's sending the state change.
4256 @objc private func dragGestureHandler( _ sender: DragSelectionGesture ) {
4357 guard sender. state == . began else { return }
4458 defer {
@@ -180,6 +194,18 @@ extension TextView: NSDraggingSource {
180194 return . move
181195 }
182196
197+ // MARK: - Perform Drag
198+
199+ /// Performs the final drop operation.
200+ ///
201+ /// This method accepts a number of items from the dragging info's pasteboard, and cuts them into the
202+ /// destination determined by the ``TextView/draggingCursorView``.
203+ ///
204+ /// If the app's current event has the `option` key pressed, this will only paste the text from the pasteboard,
205+ /// and not remove the original dragged text.
206+ ///
207+ /// - Parameter sender: The dragging info to use.
208+ /// - Returns: `true`, if the drag was accepted.
183209 override public func performDragOperation( _ sender: any NSDraggingInfo ) -> Bool {
184210 guard let objects = sender. draggingPasteboard. readObjects ( forClasses: pasteboardObjects) ?
185211 . compactMap ( { anyObject in
@@ -221,9 +247,10 @@ extension TextView: NSDraggingSource {
221247 insertText ( " " ) // Replace the selected ranges with nothing
222248 }
223249
224- replaceCharacters ( in: [ NSRange ( location: insertionOffset, length: 0 ) ] , with: insertionString)
225250 undoManager? . endUndoGrouping ( )
226251
252+ replaceCharacters ( in: [ NSRange ( location: insertionOffset, length: 0 ) ] , with: insertionString)
253+
227254 selectionManager. setSelectedRange (
228255 NSRange ( location: insertionOffset, length: NSString ( string: insertionString) . length)
229256 )
0 commit comments