画面レイアウトを変更する

概要

  • 主要なモーフの配置について」を理解した上で、スクラッチの画面のレイアウトを変更します。
  • 具体的にはスクラッチ2.0のように、ステージが左に、スクリプトが右になるように配置を変えます。


Scratch Source Code Licensed Codeの画面は以下のようになっています。

一方でScratch 2.0の画面は以下のようです。

Scratch 2.0のレイアウト上の大きな違いは、ステージが左に、スクリプトが右になっていることです。更に細かく言えば、カテゴリやブロックとスクリプトとが一体化していたり、コスチュームも右半分のエリアを使うようになっています。
全く同じようなレイアウト構成にするのは難しいので、ここでは単にステージやスクリプトのレイアウトをScratch 2.0風に置き換えるように改造しましょう。

改造の方針

スクラッチの画面は大きく5つのモーフ(topPane, viewerPane, scriptsPane, stageFrame, libraryPane)に分かれていました。

このうち、topPaneは移動させず、stageFrame とlibraryPane を左側に、scriptsPane を右側に、そしてviewePane を中央に配置しなおします。
最後にレイアウトを変えることで生じる不具合を調整します。

fixLayout メソッドの変更

スクラッチの画面全体のレイアウトは、ScratchFrameMorph クラスのfixLayout メソッドが調整しています。
メソッド内では、stageFrame, viewerPane, scriptsPane, libraryPane の順に設定を行っています。先に設定した情報を後で使う場合があるので、この順にレイアウトを変えていくことにします。

stageFrame の配置

stageFrame
  extent: stageExtent + (14@42);
  top: topPane bottom;
  right: self right.

まず、stageFrame は左側に配置したいので、上のコードを以下のように変更します。

stageFrame
  extent: stageExtent + (14@42);
  position: topPane bottomLeft.

top: と right: で設定されていた箇所を、viewePane の位置設定に使われていたposition: の設定に変えています。

viewerPane の配置

viewerPane position: topPane bottomLeft;
  width: w;
  height: self bottom - topPane bottom.

カテゴリとブロックを含むviewerPane は、stageFrame の右隣に配置するように変更します。

viewerPane position: stageFrame topRight;
  width: w;
  height: self bottom - topPane bottom.

scriptsPane の配置

scriptsPane
  position: viewerPane topRight;
  width: self width - (stageFrame width + viewerPane width);
  height: self bottom - topPane bottom;
  fixLayout.

scriptsPane は、viewerPane の右隣に配置されるようになっていますが、この関係は変わらないので特に変更する必要はありません。

libraryPane の配置

libraryPane position: stageFrame bottomLeft;
  width: (self right - scriptsPane right);
  height: self bottom - libraryPane top.

libraryPane の位置はstageFrame の下にあるので、上のままで良いのですが、幅の指定がScratchStageMorph の右端からscriptsPane の右端までの長さとなっているため、このままだと幅=0px となり表示されません。
そこで、width: で設定する値を以下のように変更します。これにより、幅が viewerPane の左端からScratchFrameMorph の左端までの長さとなります。

libraryPane position: stageFrame bottomLeft;
  width: (viewerPane left - self left);
  height: self bottom - libraryPane top.

ちょっとした微調整

表示モードを切り替えるviewModeButtonsPanel と、コピーや切り取りを行うtoolbarPanel は、いずれもstageFrame に合わせて配置されますが、stageFrame が左側に来たことでメニューなどと重なってしまいます。そこで、右の方に移動させます。

viewModeButtonsPanel
  right: stageFrame right - 8;
  top: self top + 7.

右端がstageFrame の右端に揃えられているので、scriptsPane の右端に揃えるようにします。

viewModeButtonsPanel
  right: scriptsPane right - 8;
  top: self top + 7.
toolbarPanel
  left: (stageFrame left - 4 max: menuPanel right);
  top: self top + ((topPane height - toolbarPanel height) // 2) + 3.

左端がstageFrame の左端(またはメニューの右端)になっているので、viewerPane の左端に移します。

toolbarPanel
  left: (viewerPane left - 4 max: menuPanel right);
  top: self top + ((topPane height - toolbarPanel height) // 2) + 3.

以上までの変更によってスクラッチの画面は下のようになります。

何だかおかしいですね。移動させたモーフの枠があっていません。これについては別の記事で対応することにします。