This drop-callback simply appends the dropped string at the end of the list:
(defun list-drop-callback (pane drop-object stage)
(format t "list drop callback ~S ~S ~S" pane drop-object stage)
(case stage
(:formats
(set-drop-object-supported-formats drop-object
(list :string)))
(:drag
(when (and (drop-object-provides-format drop-object
:string)
(drop-object-allows-drop-effect-p drop-object
:copy))
(setf (drop-object-drop-effect drop-object) :copy)))
(:drop
(when (and (drop-object-provides-format drop-object
:string)
(drop-object-allows-drop-effect-p drop-object
:copy))
(setf (drop-object-drop-effect drop-object) :copy)
(add-list-item pane drop-object)))))
(defun add-list-item (pane drop-object)
(append-items
pane
(list (string-capitalize
(drop-object-get-object drop-object
pane :string)))))
(contain
(make-instance 'list-panel
:title "Shopping list"
:items (list "Tea" "Bread")
:drop-callback 'list-drop-callback))
Try dragging an item from the
tree-view
created in Example: dragging from a tree.
Below is a more sophisticated version of add-list-item which inserts the item at the expected position within the list. This position is obtained using
drop-object-collection-index
:
(defun add-list-item (pane drop-object)
(multiple-value-bind (index placement)
(drop-object-collection-index drop-object)
(list-panel-add-item pane
(string-capitalize
(drop-object-get-object
drop-object pane :string))
index placement))))))
(defun list-panel-add-item (pane item index placement)
(let ((item-count (count-collection-items pane)))
(let ((adjusted-index (if (eq placement :above)
index
(1+ index)))
(current-items (collection-items pane)))
(setf (collection-items pane)
(concatenate 'simple-vector
(subseq current-items 0 adjusted-index)
(vector item)
(subseq current-items adjusted-index
item-count))))))
CAPI User Guide (Macintosh version) - 30 Aug 2011