Top | 戻る
線で繋ぐGUI
部品と部品を線で繋ぐGUIです。
部品、接続線、一時描画を扱うために それぞれ専用のレイヤーを用意して同一コンポーネント(Workspace)上に重ねます。
レイヤー構成
主な機能は下記のようなものです。
ドラッグ&ドロップ操作は、FlexのAPIを利用すると簡単に実現できます。
入力端と出力端は、部品から半分はみ出るレイアウトになっていますが、
Flashの描画オブジェクトは親オブジェクトからはみ出ていても描画、イベント受信ができます。
- ゴミ箱(Trash)からワークスペースへドロップすると、部品(Part)追加
- ゴミ箱へドロップすると、部品削除
- 入力端(InputNode)から出力端(OutputNode)、またはその逆へドラッグすると接続
- 入力端クリックすると切断
- 1つの入力端に対して複数の出力端を接続可能。
各部名称
DiagramSamplePart.as は、部品の実装例です。
ドラッグ操作や部品追加操作のために、clone()メソッドで複製を作れるようにします。
また、ノード数をタグで指定できるようにノードの実体を初期化イベントで作成します。
DiagramSamplePart.as
package {
import com.d_project.diagram.Node;
import com.d_project.diagram.Part;
import mx.events.FlexEvent;
public class DiagramSamplePart extends Part {
public var numInputs : int;
public var numOutputs : int;
public function DiagramSamplePart() {
addEventListener(FlexEvent.INITIALIZE, onInitialize);
}
public override function clone() : Part {
var newPart : DiagramSamplePart = new DiagramSamplePart();
copyProperties(newPart);
return newPart;
}
protected override function copyProperties(newPart : Object) : void {
super.copyProperties(newPart);
newPart.numInputs = numInputs;
newPart.numOutputs = numOutputs;
}
private function onInitialize(e : FlexEvent) : void {
var i : int;
var inputs : Array = new Array();
for (i = 0; i < numInputs; i++) {
inputs.push(new Node() );
}
this.inputs = inputs;
var outputs : Array = new Array();
for (i = 0; i < numOutputs; i++) {
outputs.push(new Node() );
}
this.outputs = outputs;
}
}
}
作った部品を mxml に配置すれば、完成です。
DiagramDemo.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
xmlns:diagram="com.d_project.diagram.*" xmlns:local="*"
layout="vertical" backgroundColor="#cccccc" paddingLeft="4" paddingRight="4" paddingTop="4" paddingBottom="4">
<mx:HDividedBox width="100%" height="100%">
<mx:Canvas width="100" height="100%" horizontalScrollPolicy="off">
<diagram:Trash width="100%" height="100%">
<local:DiagramSamplePart toolTip="2in" numInputs="2" backgroundColor="#ccccff"/>
<local:DiagramSamplePart toolTip="2out" numOutputs="2" backgroundColor="#ccffcc"/>
<local:DiagramSamplePart toolTip="2in 2out" numInputs="2" numOutputs="2" backgroundColor="#ffcccc"/>
</diagram:Trash>
</mx:Canvas>
<diagram:Workspace width="100%" height="100%" backgroundColor="#ffffff"/>
</mx:HDividedBox>
</mx:Application>
実行結果
Contents Copyright © Kazuhiko Arase