親と子

UI 要素と ELF コマンドに関連して、「親」と「子」という用語が使用されます。この場合は、親はほかの UI 要素を含む UI 要素で、子は親に含まれる要素です。ある親の子が、別の子の親であることもあります。

ウィンドウは階層の最上位の親です。階層には他にも、レイアウト、コントロール、メニュー、メニュー項目などの要素があります。レイアウトは他のレイアウトを、メニュー項目はサブメニューを含むことがあるので、階層は任意の深さにすることができます。

既定のペアレント

ウィンドウの作成を簡略化し、スクリプトを簡潔にするために、ELF コマンドは既定のペアレントの概念を認識するようになっています。これは、作成された要素それぞれについて、親を明示的に指定する必要がないことを意味します。ウィンドウが作成されると、そのウィンドウは後で作成されるメニューやコントロールの既定のペアレントになります。setParent コマンドで既定のペアレントを明示的に変更するか別のウィンドウを作成するまで、新しい UI 要素はこのウィンドウの内に表示されます。

レイアウトやメニューには異なる既定のペアレントがあります。ウィンドウはコントロールに対する最初の既定のペアレントで、メニュー バーのあるウィンドウを作成した場合、このウィンドウはメニューの既定のペアレントにもなります。作成されたレイアウトは、レイアウトやコントロールの新しい既定のペアレントになります。メニュー バー レイアウトが作成されると、このレイアウトはメニューの新しい既定のペアレントになります。メニューが作成されると、このメニューがメニュー項目の既定のペアレントになります。

既定のペアレントは、新しい親を作成することにより暗黙的に変更することもできますし、「setParent」コマンドを使用して明示的に変更することもできます。メニューの既定のペアレントを変更するには、「-m/menu」フラグを使用します。親をウィンドウまたはメニュー バー レイアウトに設定すると、メニューとレイアウト両方の既定のペアレントが設定されます。次の短いサンプル コードでは、レイアウトの既定のペアレントの使用法を表しています。

スクリプト 1. 既定のペアレント レイアウトの例

window ExampleWindow1;
 columnLayout;
 button -label "Button 1";
 button -label "Button 2";
 rowColumnLayout -numberOfColumns 2;
 text -label "Name:";
 textField;
 text -label "City:";
 textField;
 setParent ..;
 checkBox -label "Lights ";
 checkBox -label "Camera ";
 checkBox -label "Action ";
showWindow ExampleWindow1;

「text」要素と「textField」要素は rowColumnLayout の子です。rowColumnLayout によってこれらは 2 列になるように配置されています。「setParent ..」コマンドが使用されていなければ、既定のペアレントは rowColumnLayout のままで、チェック ボックスは 2 列にレイアウトされます。これをわかりやすく表すための次の例は、前の例と同じですが、「setParent」コマンドがコメントになっています。

スクリプト 2. 既定のペアレント レイアウトでの setParent コマンドの効果

window ExampleWindow2;
 columnLayout;
 button -label "Button 1";
 button -label "Button 2";
 rowColumnLayout -numberOfColumns 2;
 text -label "Name:";
 textField;
 text -label "City:";
 textField;
 //setParent ..;
 checkBox -label "Lights ";
 checkBox -label "Camera ";
 checkBox -label "Action ";
showWindow ExampleWindow2;

「setParent」コマンドはフラグとして「-up」や「-top」を受け取り、1 レベル上の階層や一番上の階層に移動したりすることができます。また、たとえば「setParent <windowOrLayoutName>;」のように、新しい既定のペアレントを明示的に指定することもできます。「setParent」コマンドを「setParent -query」のように使用すると、現在の親を照会することも可能です。

次の短いサンプル コードでは、メニューにおける既定のペアレントの使用法を表しています。

スクリプト 3. 既定のペアレント メニューの例

window -menuBar true ExampleWindow3;
 menu -label "File" TestFileMenu;
 menuItem -label "Open" menuItem1;
 menuItem -label "Close" menuItem2;
 menuItem -label "Quit" menuItem3;
 menu -label "Edit" TestEditMenu;
 menuItem -label "Cut" menuItem1;
 menuItem -label "Copy" menuItem2;
 menuItem -label "Paste" menuItem3;
 menu -label "Options" TestOptionsMenu;
 menuItem -label "Color" -subMenu true menuItem1;
 menuItem -label "Red";
 menuItem -label "Green";
 menuItem -label "Blue";
 setParent -menu ..;
 menuItem -label "Size" -subMenu true menuItem2;
 menuItem -label "Small";
 menuItem -label "Medium";
 menuItem -label "Large";
 setParent -menu ..;
showWindow ExampleWindow3;

UI 要素を作成するコマンドはすべて、要素の親を明示的に指定する「-p/parent parentName」フラグを受け付けます。このフラグは常に、既定のペアレントに優先されます。

コレクションはまた別の扱いをされます。コレクションでは、現在のレイアウトが既定のペアレントとして使用されます。また、明示的に親を指定するための「-p/parent」フラグを使用することもできます。しかし、コレクションには、ウィンドウをスパンする機能があり、「-g/global」フラグでこの動作を選択できます。「-g/global」フラグを使用した場合、コレクションは親を持ちません。コレクションが親を持つのは、コレクションを削除しやすくする場合だけです。親が削除されると、コレクションも同時に削除されます。グローバル コレクションは、明示的に削除する必要があります。