言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

Tweak 画面のしくみ

長くなりそうなのでこっちに書きます。

id:korakurider:20050520:p4 より。ProjectBuilder→Project→Player

ちなみに、私の PlayerNavigator よりちょっと便利な WorldNavigator と言うので見ると構造が良く分かります。http://source.impara.de/Stuff/Tweak-WorldNavigator-jl.16.mcz

CProjectBuilder (この上に CWorld と言うのがある事はある)
  - CWindow
  - float された CPlayer
  - CProject
    - その他の CPlayer

World として使うべきなのは Project のはずなのですが、アンドレアスの仕事が完成するまであまり Project に関係する事をして欲しくないそうなので、触りにくい事になっています。

id:korakurider:20050520:p5 より。ウィジェット

Tweak の (今までの Squeak も基本的に同じです)の面白い所として、画面上のどんなツールもバラバラに出来ると言う事があります。時計を分解するようにどんな部品で出来ているのか調べる事が出来る。時計と違うのは、ばらした後でもつかえると言う事です。例えばスクリプト開始の時計アイコンを引っ張ってきて開始ボタンとして別の所に貼り付ける事が出来る。

なんでこうなっているのかと言うと、それぞれの GUI 部品が自分で自分の役割を覚えていて、クリックしたらどうするかなんて事を判断できるからです(他の言語、例えば IE + Javascript 等でも同じ事が出来ます。ただ、Squeak は何故かわざわざ簡単にバラしやすくなっているだけです)。

さて、ばらして動く奴と動かない奴が何故あるかという話ですが、イベント処理をどこでやってるかによって異なります。例えばリストをクリックしたとき、その処理をリスト全体でやるか要素でやるかという違いがあるわけですが、リスト全体でやっていると、要素を外に出した後でその要素だけをクリックしても動きません。要素でやっていると外に出しても動きます。

要素にイベントを設定したほうがデバッグしやすいですが、全体に設定したほうが既存の GUI 部品に機能を追加したい時など管理が楽です。

define:as: は何だか存在意義が僕も良く分からないのですが、画面上の構造に関わらず子->親関係の参照に使うみたいです。name くらいにしか使ってないんじゃないですかね。