Max 5 API Reference

ドラッグ・アンド・ドロップ

Max ファイルブラウザでは、パッチウィンドウやオブジェクト上にファイルをドラッグしてファイル操作を行なうことができます。

オブジェクトでは、ユーザがファイルをドラッグしてあなたのオブジェクト上でマウスボタンを放したときに送信されるメッセージに対応する処理、および受け入れるファイルタイプを指定することが可能です。ドラッグ・アンド・ドロップ操作に対しては、UIオブジェクトと非UIオブジェクトで同じインターフェイスを使用します。

UI オブジェクトの例として pictmeter~ があります。非UIオブジェクトの例はいずれ追加します。

Your object can specify the file types accepted as well as a message that will be sent when the user releases the mouse button with the file on top of the object. UI and non-UI objects use the same interface to drag'n'drop.

Example UI object: pictmeter~. Example non-UI: TBD.

サポートするメッセージ:

    acceptsdrag_locked (A_CANT)

ロックされていないパッチで、オブジェクト上にマウスがドラッグされている間にオブジェクトに送信されるメッセージ。

    acceptsdrag_unlocked (A_CANT)

ロックされたパッチで、 オブジェクト上にマウスがドラッグされているときにオブジェクトに送信されるメッセージ。

考察

2つの異なった関数があるのはなぜでしょうか?acceptsdrag_unlocked() は「編集」操作を考慮して考えられたものです。例えば、pictslider のようなオブジェクトでは、外観を変更するために新しいイメージファイルを受け取りますが、これは、パッチがロックされている状態で行なわれるのではなく、ロックされていない状態で行なわれます。対照的に、sfplay~ はパッチがロックされている状態でも、ロックされていない状態でもオーディオファイルを受け取り、再生することができます。その理由は、この処理が(パッチを変更するための編集操作ではなく)メッセージによって行なうことができる処理であるためです。

メッセージハンドラ(訳注:メッセージ処理関数)の定義:

    long myobject_acceptsdrag_unlocked(t_myobject *x, t_object *drag, t_object *view);
    long myobject_acceptsdrag_locked(t_myobject *x, t_object *drag, t_object *view);

このハンドラは、ドラッグされているファイルがオブジェクトによって利用可能なものである場合に真(true)を返します。ファイルタイプをテストするには、jdrag_matchdragrole() を使い、これにdrag オブジェクトとファイルタイプを表すシンボルを渡します。前もって定義されているファイルタイプのリストは次のようなものです。

また、すべてのファイルを受け取る場合には file を使用します。

jdrag_matchdragrole() が真(true)を返した場合、ドラッグの完了後にオブジェクトが受け取るメッセージを jdrag_object_add() を使って記述します。 このメッセージは望むだけ追加することができます。追加したいメッセージが1つだけの場合にはjdrag_object_add() を使います。 プロセス上でより多くの制御が必要な場合や、複数のメッセージを追加する必要がある場合には jdrag_add() を使うことができます。 複数のメッセージを追加した場合、ユーザが [Option] キーを使って、必要とする動作を選択することが可能です。デフォルトでは最初に追加したものが使用されます。2つの動作がある場合、[Option]キーによって第2の操作が選択されます。3つ以上の動作がある場合、動作の説明(jdrag_add() で渡されます)が書かれたポップアップメニューが表示され、選択された操作が実行されます。

例:

次のコードは、オブジェクトにドロップされたオーディオファイルに応答して read メッセージを送信する方法を示しています。

        if (jdrag_matchdragrole(drag, gensym("audiofile"), 0)) {
            jdrag_object_add(drag, (t_object *)x, gensym("read"));
            return true;
        }
        return false;

acceptdrag ハンドラでは、複数のファイルタイプをテストし、それぞれに異なったメッセージを追加することができます。

Copyright © 2008, Cycling '74