2012年7月8日日曜日

[ドリトル] GUIをつける

GUI部品も用意されているようなので使ってみよう。
ボタン(Button)、ラベル(Label)、フィールド(TextField)、選択メニュー(SelectMenu)、スライダー(Slider)が用意されている。

t1 = Turtle!create.
Label ! "Depth" create.
field1 = TextField ! 1 create 50 45 size.
btnRun = Button ! "Run" create 80 45 size.
btnClear = Button ! "Clear" create.
lblStatus = Label ! "" create.

t1:koch = [
  | level width ; newWidth |
  [level <= 0 ] ! then [
     self ! (width) forward.
    ] else [
     newWidth = width / 3.
     self ! (level - 1) (newWidth) koch.
     self ! 60 leftturn (level - 1) (newWidth) koch.
     self ! 120 rightturn (level - 1) (newWidth) koch.
     self ! 60 leftturn (level - 1) (width - 2 * newWidth) koch.
   ] execute. 
].
btnRun : action = [ 
  lblStatus ! "drawing..." set.
  t1 ! penup movetocenter 250 back 90 rightturn 100 forward 90 leftturn pendown.
  t1 ! (field1!get) 500 koch.
  lblStatus ! "done." set.
].
btnClear : action = [
  | ; shape1 |
  lblStatus ! "clearing..." set.
  shape1 = t1 ! makeFigure.
  shape1 ! hide.
  lblStatus ! "done." set.
].
ボタンやラベル、フィールドへの値の設定/取得はset/get命令(読む/書く命令)で実行する。プロパティへのアクセスではなく命令になっている。特に取得系は値を返す命令になっているので少し戸惑うところ。
ちなみに、フィールドから値を読んでラベルに書く、というのを一行で書くにはどうしたらいいのかがわからない。

setで文字列を設定すると大きさが自動調整される。あらかじめ size命令 で大きさを決めておいても大きさが新たな文字列に応じて調整されるので隣のGUI部品と重なってしまったりする。

action実行中でもGUI更新は受け付ける。線が描画されるのはもちろんのこと、ステータス表示用のラベルへの値更新も即時に反映されていることがわかる。

問題は画面の初期化。どうやるのかわからない。とりあえず、t1 から描画した分を図形として切り離して hide しているのだが、hide されているだけでオブジェクトとしては残っているのではないか。
ちなみに、makeFigure 命令は結構時間がかかるようで、 Depth=6 くらいのKoch曲線でも図形化にはそれなりに時間がかかる。

0 件のコメント:

コメントを投稿