#lang scribble/manual @(require (for-label racket)) @title{DragSink} A simple drag-and-drop receiver.@section{categories} GUI>Views @section{related} Classes/DragBoth, Classes/DragSource @section{description} link::Classes/DragSource::, link::Classes/DragSink:: and link::Classes/DragBoth:: are a set of view classes intended as simple-to-use drag-and-drop sources and destinations. They are graphically represented as a simple rectangle, and their specialty is that they emphasis::do not require the Cmd/Ctrl key to be held down to initiate dragging::. Akin to link::Classes/StaticText:: they can store arbitrary content in the link::Classes/StaticText#-object#-object:: variable, and display it using link::Classes/Object#-asString::. You can set the displayed text separately using link::Classes/StaticText#-string#-string::, and keep it independent of the content if you set link::Classes/StaticText#-setBoth#-setBoth:: to @racketblock[false::. strong::DragSink::, specifically, strong::accepts any:: dropped data and stores it into the strong::-object:: variable, but allows strong::no dragging::. See: link::Classes/View#Drag and drop:: for a general description of the drag and drop mechanism. ] @section{CLASSMETHODS} @section{PRIVATE} key @section{INSTANCEMETHODS} @section{METHOD} defaultCanReceiveDrag @section{RETURNS} Always True. @section{METHOD} defaultReceiveDrag Sets the link::Classes/StaticText#-object#-object:: to the current drag data. @section{EXAMPLES} @racketblock[ ( s.waitForBoot({ // only needed if you are using sound w = Window.new.front; // store various kinds of objects in the drag source // a string source a = DragSource(w, Rect(10, 10, 150, 20)).align_(\center); a.object = "I am a string source"; // a Float source b = DragSource(w, Rect(10, 40, 150, 20)).align_(\center); b.object = 2.234; // a Point source c = DragSource(w, Rect(10, 70, 150, 20)).align_(\center); c.object = Point(20, 30); // A sound function source // dragLabel_() is used for the label while dragging d = DragSource(w, Rect(10, 100, 150, 20)).align_(\center); d.object = { Synth(\default) }; d.dragLabel = " I am a sound function.\n My dragLabel_() is set \n to inform you about that "; // A sound function source // here the string label is independent of the content type (Function) // dragLabel_() is used for the label while dragging f = DragSource(w, Rect(10, 130, 150, 20)).align_(\center).setBoth_(false); f.object = { { SinOsc.ar(440,0,0.4) }.play }; f.string = "My label is independent"; f.dragLabel = " My dragLabel_() says \n I am dragging a sound function "; // receive anything g = DragSink(w, Rect(170, 10, 200, 20)).align_(\center); g.string = "receive anything, do nothing"; // receive only floats g = DragSink(w, Rect(170, 40, 200, 20)).align_(\center); g.string = "I only like floats"; g.canReceiveDragHandler = { View.currentDrag.isFloat }; // receive only numbers and points, and convert them to rects h = DragSink(w, Rect(170, 70, 200, 20)).align_(\center); h.string = "I convert to Rect"; h.canReceiveDragHandler = { View.currentDrag.isKindOf(Number) || View.currentDrag.isKindOf(Point) }; h.receiveDragHandler = { arg v; h.object = View.currentDrag.asRect }; // receive only functions, and try to play them i = DragSink(w, Rect(170, 100, 200, 20)).align_(\center); i.string = "I evaluate a (sound) function"; i.canReceiveDragHandler = { View.currentDrag.isKindOf(Function) }; i.receiveDragHandler = { arg v; i.object = View.currentDrag.value; i.string = "click here for silence"; i.background_(Color.red) }; i.mouseDownAction_({ i.object.free; i.string = "I evaluate a (sound) function"; i.background_(Color.clear) }); StaticText(w, Rect(10, 200, 380, 50)) .stringColor_(Color.white) .string_("Try dragging any item on the left -----> to any item on the right"); }); ) :: ]