|
上にも書いたように、この図でメインに見えている左のウインドウはサブスタックです。ほとんど前回 015.rev のメインスタックと同じですから、015.rev を016.revのサブスタックとして取り込むことにしました。まず New mainstack で 016 というウインドウ名(メインスタック)のファイルを作ったら、メニューの File > Open Stack...から、015.rev をオープンします。この段階ではメインスタックがふたつあることになります。ここで 006 のサブスタックをクリエイトすると同じ方法で、
set the mainstack of stack "simplePainter" to "016"
と、メッセージボックからスクリプトを実行すると、simplePainter は 016 のサブスタックになります。混乱を避けるために、このスタックでは simplePainter2 というウインドウ名に変えました。もうひとつドロワーのためのサブスタックが必要ですから、tDrawer というサブスタックをメニューから作ります。

これで上図のように、アプリケーション ブラウザーに三っつのスタックが見えるようになります。006 でも書いたように、Revolution ではメインスタックそのものは保存できませんから、描いた絵を途中でスタック内で保存するには、サブスタックにしなくてはいけません。
ここでは メインスタック 016 には、変更の必要がないトレイス用の下図をテンプレイトとして扱って、 メインスタック 016 のカード1に置いています。

上図の drawing 1,2,3,whitePaper が、それぞれ下図の元絵となるテンプレイトです。このメインスタック 016 は、下図のためだけの収納スタックですから、スタックがオープンされた時に見えないよう、 メインスタック 016 のスクリプトエディターに措置を施しています。
on preOpenStack
set the vis of me to false
end preOpenStack
on openStack
open stack "SimplePainter2"
end openStack
preOpenStack で、このスタックを見えない状態にしてから、スタック "simplePainter2" を開きます。このあと close me としてスタック016 を閉じてもかまいません。これはひとつの方法ですが、不可視にはしないでウインドウサイズを小さく(100 x 100 とか)して、グローバルのマイナスポジション(たとえば -200,-200)に、アンカーとして置いたりする事もあります。メインスタックの内容が確認しやすいように、ここでは不可視にしてプラスポジションに置いています。このようにメインスタックをアンカーにしておくと、見えている全部のウインドウ(スタック)がユーザーによって閉じられても、アプリケーションを終了させたくない時などに使えます。注:実際には再びウインドウを開けたり、終了させるメニューが必要です。
スタック simplepainter2(ペアレントスタック)から、ドロワーを右側に引き出すスクリプトは
drawer stack "tDrawer" at right
ペアレントスタック から左側に引き出すのは
drawer stack "tDrawer" at left
ですから、スタック"tDrawer" が開かれているかいないかの判断をして、スタック simplePainter2 がスクリーンの中央より左側にあれば右側に開け、スクリーンの中央より右側にあれば左側に開けます。
on mouseUp
if "tDrawer" is not among the lines of the openStacks then
if item 1 of the loc of this stack <= item 1 of screenLoc() then
drawer stack "tDrawer" at right
else
drawer stack "tDrawer" at left
end if
if platform() is "MacOS" then set the label of me to the cCloseMe of me
else set the label of me to the cCloseWin of me
else
close stack "tDrawer"
if platform() is "MacOS" then set the label of me to the cOpenMe of me
else set the label of me to the cOpenWin of me
end if
end mouseUp
is among the lines of the openStacks で、現在開かれているすべてのウインドウ(スタック)のリストを得ることができるので、スタック tDrawer が開かれているかの判断ができます。the openStacks を開発環境で実行すると rev と付いた様々なスタック名が現れます。
016.rev では、ドロワーが開かれたらボタンレイベルを「ドロワーを閉じる」、ドロワーが閉じられていたらボタンレイベルを「ドロワーを開ける」となるように、ボタンのカスタムプロパティに日本語を置いて切り替えていますが、macintosh とwindows ではユニコードの扱いに違いが出るので、 platForm() でその切り替えをしています。(まだ Revolution日本語は未確定な部分も多いので、詳しい説明はしません)カードが開けられた時に、このボタンにmouseUp を送ってドロワーが開かれるようにしてありますから、開発環境でポインターツールを選んだままカードを開くと、mouseUpが行われないので、上に書いたスクリプトが働かないで、ボタンは文字化けになります。
Revolution ではイメージオブジェクトを半透明にすることができるので、the blendLevel of imagename を使ってトレイス機能にします。ボタン「ペーパーを半透明に」のスクリプトは以下、
on mouseUp
if hilite of me then
enable sb "tBlend"
set the blendLevel of image "myPainting" to thumbPos of sb "tBlend"
else
set the blendLevel of image "myPainting" to 0
disable sb "tBlend"
end if
end mouseUp
sb "tBlend" はスクロールバー です。ブレンドのレベルが 0 だとイメージを完全な不透明、100 の場合はまったくの透明です。
スクロールバー(スケール)にあるスクリプトは
on mouseUp
if the hilite of btn "blendOn" is true then
set the blendLevel of image "myPainting" to thumbPos of me
end if
end mouseUp
次にドロワー内にある部品の説明です。
前回の 015.rev はメインウインドウだけのお絵描きスタックでしたが、016.rev ではドロワーを付けたので、ペイントツール類はドロワーに移しました。015 でも少し触れたように、パレットかドロワーのウインドウツール類のあるスタック上(ウインドウ)だったら、マウスをペイントツールにしてもクリックが有効となります。つまり send in を使ったツールの切り替えの必要がありません。今回はそのsend in で使ったスクリプトを外しています。またクリックがはっきりわかるように、マウスダウンでアイコン(イメージオブジェクト) のボーダーを太くしています。
スタック内のイメージ(imagename1)を、スタック内にある他のイメージオブジェクト(imagename2)に移すのは、
put image imagename1 into image imagename2
で簡単にできますから、ドロワーの「トレイス」ボタンが選ばれていれば、スタック016 のイメージを、ドロワーにあるドローイングのアイコンクリックで、スタック simplePainter2 の下図 image "myPainting" に移します。また、ドロワーの「ぬり絵」ボタンが選ばれていれば、上にあるペーパー部分image "baseImage"に移します。
ドローイングのアイコンの下に 新規ペーパー(WhitePaper)として、ペーパー(キャンバス)の書きかえがあります。場合によって、上のペーパー(キャンバス)だけと、下図の白地に書き換えができるように、
if the optionKey is down then
put image tName of cd 1 of stack "016" \
into image "baseImage" of cd 1 of stack "simplePainter2"
end if
をグループのスクリプトに入れていますから、オプションキーを押しながら新規ペーパー(WhitePaper)をクリックすると、下図と上のペーパー(キャンバス) が共に白地になります。
スタックを保存する
何度か書いているように、Revolution ではメインスタックの変更は保存できませんから、サブスタックを保存するということになります。この仕様は始め少し戸惑うのですが、ほとんどの現代的なアプリケーションでは単独のウインドウ(スタック) という事はないので、始めの計画次第で問題なくすぐになれるかと思います。また創造という観点からは、マイナス面はプラスに切り替わることも多いので、いつでも多面的な思考が必要です。
016.rev ではスタック simplePainter2 が閉じられる時に、以下のスクリプトが働くようにして保存をします。
on closeStack
save stack "simplePainter2"
close stack "tDrawer"
end closeStack
これでスタック simplePainter2 は保存されますが、スタンドアロンにする時にもうひとつ大事なことがあります。これをしないと保存されません。

Standalone Application Setting のStacks にある「Move substacks into individual stackfiles」にマークを付けて、その下の「create folder for stackfiles:」にもマークをしてテキストボックスにフォルダー名をタイプします(図では data としました)。細かく言ったら「create folder for stackfiles:」にはマークしなくても良いのですが、この方がサブスタックがひとつのフォルダーに整理がされるので、使いやすくなるかと思います。
Mac OSX とWindows、Mac Classic とではスタンドアロンの作りに違いが出てきます。Mac OSX でスタンドアロンとして出来上がるファイルはアイコンひとつだけですが(この例ではファイル名 016)、Windows と Mac Classic ではサブスタック(この例では simplePainter2 と tDrawer) はフォルダー data の中に入った状態で作られます。
MacOSX では、サブスタックをアプリケーション 016 の中に取り込まれて、ひとつのファイルのように見えているのですが、OSX のDevelopper>Application>Utilities の Property List Editor のOpen からアプリケーション 016 を見てみると、中にサブスタックが入っているのがわかります。
これは004の「スタックが保存してあるフォルダーまでのパス」で、MacOSX の例外を作ったこととも関連あることなので、構造がわかれば 004のファンクション theFolderPath で the filename に ".app/Contents/MacOS/" が含まれるかを確認する理由もわかるります。

図:OSX の Property List Editor のOpen から見たアプリケーションのファイル構成
|