コントロールとレイアウト
UIngは、テキストの表示、入力、値の選択、進捗表示、メニュー、表形式のデータなどに使う
ネイティブコントロールを提供します。最初によく使うものにはLabel、Button、Entry、
Checkbox、Combobox、Slider、ProgressBarがあります。
コンテナ
1つのウィンドウが持てる子は1つです。複数のコントロールを配置するときはコンテナを 使用します。
Boxは子を横方向または縦方向に並べます。Formはラベルと入力コントロールを揃えます。Gridはコントロールを行と列に配置します。Groupは1つの子をタイトル付きの枠内に配置します。Tabはコントロールを複数のページに整理します。
縦Boxにコントロールを並べる例です。
box = UIng::Box.new(:vertical, padded: true)
box.append(UIng::Label.new("Name"))
box.append(UIng::Entry.new)
box.append(UIng::Button.new("Save"))
window.child = box
エディタに残りの高さを使わせるにはbox.append(editor, stretchy: true)とします。
複雑な配置はコンテナを入れ子にし、最外のコンテナをWindowの子にします(Boxの実例、コントロールギャラリー)。
領域の配分と配置
「余った領域の配分」と「領域内での子の配置」は別の指定です。
| コンテナ | 領域の配分 | 領域内の配置 |
|---|---|---|
| Box | stretchyで並べる方向に配分 |
trueの子はその方向に領域を満たす |
| Form | stretchyで高さを配分 |
trueの入力欄は縦に伸び、横は常に入力列を満たす |
| Grid | hexpand・vexpandで列・行に配分 |
halign・valignで指定。:fillなら領域を満たす |
BoxとFormは配分と引き伸ばしをまとめて行い、個別のfill引数はありません。拡張と配置を分けるにはGridを使います。paddedは子同士の間隔、marginedは外周の余白で、伸縮とは独立です。
プラットフォーム差
図は配置領域を示し、内部の部品の見た目とは異なる場合があります。macOSのSpinboxは入力欄と矢印の自然な高さを保って中央配置し、Windowsは入力欄を配置領域の高さに合わせます。最小サイズ、文字の位置、標準間隔もOSにより異なります。
Widgetガイド
- ウィンドウ、メニュー、ダイアログ: Window、 Toolbar、Menu、ダイアログ
- 入力と選択: Button、Checkbox、 Entry、Combobox、 EditableCombobox、RadioButtons、 Slider、Spinbox
- 専用コントロール: ColorButton、 DateTimePicker、FontButton、 ImageView、Label、 MultilineEntry、ProgressBar、 Separator
- レイアウト: Box、Tab、Form、 Group、Grid
- データと描画: Table、Area