SuperCollider CLASSES


A simple drag-and-drop source.
Subclasses: QDragSource


DragSource, DragSink and 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 do not require the Cmd/Ctrl key to be held down to initiate dragging.

Akin to StaticText they can store arbitrary content in the -object variable, and display it using Object: -asString. You can set the displayed text separately using -string, and keep it independent of the content if you set -setBoth to false.

DragSource, specifically, gives the -object variable as the data for dragging, but accepts no drop.

See: View: Drag%20and%20drop for a general description of the drag and drop mechanism.

Class Methods

Inherited class methods

Instance Methods



The -object.

Inherited instance methods


s.waitForBoot({    // only needed if you are using sound
    w =;

    // 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 = { {,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.string = "I evaluate a (sound) function";
        i.background_(Color.clear) });

    StaticText(w, Rect(10, 200, 380, 50))
        .string_("Try dragging any item on the left -----> to any item on the right");