GRINEditのアイデアをつれづれと
GRINEditでFreeMindみたいにInsやEnterでさくさく頂点追加出来るようにするためには、キーイベントのリスナもプラグインから登録できないといけない。 プラグインから登録されるリスナはフラットではなく、チェインであるべきかな。あと実行時に動的に変化できるべき。特定のモードを選んでいるときだけアクティブなリスナ。リスナの中で条件分岐で反応するかどうかを決める設計の方がいいのかも知れない。
頂点にフォーカスがあたっているときのキー入力イベントのデフォルトは頂点のラベル編集?
TouchGraphの三角形の辺は実装が簡単だし、今直線の辺だけで選択肢がないのでちょうどいいからとさくっと実装してみました。
新しい辺クラスTriangleEdgeを実装する際に自分がやったことの記録。 LinearEdgeをコピーする→renderメソッドの中身を望みの物に変更 →必要なフィールドを作成、不要なフィールドを削除 →setXXXを作る(引数はObject1個) →getParamsを直す
本当は既存のをコピーするんじゃなくて、新しい頂点や辺を作る時用のテンプレートとかを用意した方がいいのかも知れないけど、現状では頂点にしても辺にしても十分小さいクラスなのでさほど実害がない。まぁ、でも用意するのも別に難しくはないし、つくっといた方がいいかもなー。
で、TouchGraphはネット接続を使いそうだったので、代わりにPythonの構文木をXML-RPCで可視化するスクリプトを作成。構文木を調べるコードが21行で、それを可視化するコードが25行。簡単。ただ、構文木は子の順番に意味があるのに、何も考えずに可視化するとシャッフルされてしまうから、ツリーであることが明確なデータに関してはツリーを可視化する用の物理法則とか、初期配置とかにした方がいいのかも。
それから帰りの電車で川北さんと話が盛り上がっていくつかアイデアを貰いました。
まずsodaplay。このクリーチャーデータの再生自体はプラグインで「周期的に伸縮する辺」を入れればいいだけなので簡単なのだけど、soda constructorのほうを実現するためには、位相と振幅を指定するためのサイドパネルが必要。当然GRINEditに決めうちでサイドパネルを入れても意味がないので、プラグインからサイドパネルを出す必要があります。一応、プラグインはただのJarだからウィンドウを開いたりも出来るとは思うのですが、クラスローダが本体とは異なるからswt.jarやswt.dllなんかが別途必要になってしまうかも知れないですね。試してみる必要があるでしょう。
でもそれが実現できれば「拡張性の高いアプリです」という主張の説得力が増しますね。
次に、頂点の入れ子。ある頂点をつかんで別の頂点の中に入れることが出来る機能。ネットワーク状の情報を整理するときにはこの機能があると便利そうです。ただ、現状では頂点をつかんで他の頂点に近づけると反発力で逃げてしまいますね。「物を入れられる頂点(以下、箱)」を作るだけで解決できるとうれしいのですけど、それがうまく行かないと「箱」と「箱にはいることの出来る頂点」の両方を作らないと行けないのかも。もちろん実際に実装するなら「箱は箱に入ることが出来る」という設計にすると思いますけど、どちらにせよ今の頂点クラスを使えなくなるわけです。うーん。よく考える必要がありそう。別に今の頂点クラスは単にデフォルトのグラフ可視化用に使われているだけであって、入れ子に出来るNestableVertexクラスを作ってそれで構成されたネットワークを作ること自体は別に設計上の問題にはならないのかな…。
部分的に重力をかけると面白い、というアイデアもありました。これはGUIにないだけでXML-RPCやJythonではすでに出来ます。GUIでやるときの問題点は「どちら方向にどの程度の力をかけるか」をどうやって指定するかですね。あー、「範囲を選択してメニューから選ぶ」というのを考えていたけども、そうじゃなくて新しいマウスアクションを追加して「頂点をつかんでぽいっとやると、投げた方向に飛んでいく」でいいのかも。それがいいな。
あとこれは僕のアイデアですが、音声認識して形態素解析して頻出するキーワードを頂点として追加するプログラムがあると面白いですね。時間的な近接関係で辺が張られ、頻出キーワードはタグクラウドみたいに大きく表示されるといい。可視化部分は現状のシステムで問題なく実現できるはずなので、後は音声認識をして形態素解析をしてそれをXML-RPCで投げるプログラムがあればいいわけです。
__ 今、一つ前のアイデアメモで「XML-RPCハンドラもプラグインから追加」と書いてあるのを見て「GUIもプラグインから作成したらなんでもかんでもプラグインだなぁ」とか思ったんですが、もう一歩踏み込んで本当に何でもかんでもプラグインにしてしまえばクラスローダの違いによる問題は起きないのではないかと気づきました。つまりデフォルトのGUI自体がプラグインという設計。本体は本当に最小限にしてしまうということ。
フィードバック
"頂点の入れ子"は面白そうですね. Compositeなモノって結構世の中に在りますからね.