Red/View(または単にView)コンポーネントはプログラミング言語Redのグラフィックシステムです。そのデザインゴールは以下の通りです。
-
データ指向のミニマルなAPI
-
プログラミングインターフェイスとしての仮想的なオブジェクトツリー
-
仮想ツリーとディスプレイシステムの間のリアルタイムまたは遅延型の同期
-
双方向バインディングのサポートを用意にする
-
プラットフォームを横断して異なるバックエンドを提供する
-
OS、サードパーティ、カスタムのウィジェットセットをサポート
-
パフォーマンスのオーバーヘッドが少ない
仮想ツリーはフェイスオブジェクトを使って構築されます。各フェイスオブジェクトは双方向バインディングでディスプレイ上のグラフィックコンポーネントにマップされます。
フェイスオブジェクトは face! テンプレートオブジェクトのクローンです。フェイスオブジェクトのフィールドは ファセット(facet) と呼ばれます。
使用可能なファセットのリスト:
| ファセット | データ型 | 必須 | 適用対象 | 説明 |
|---|---|---|---|---|
type |
word! |
はい |
全て |
グラフィックコンポーネントのタイプ (以下も参照) |
offset |
pair! |
はい |
全て |
親の左上オリジンのオフセット位置 |
size |
pair! |
はい |
全て |
フェイスのサイズ |
text |
string! |
いいえ |
全て |
フェイスに表示されるラベルテキスト |
image |
image! |
いいえ |
一部 |
フェイスのバックグラウンドに表示されるイメージ |
color |
tuple! |
いいえ |
一部 |
R.G.BまたはR.G.B.Aフォーマットのフェイスのバックグラウンドカラー |
menu |
block! |
いいえ |
全て |
メニューバーまたはコンテキストメニュー |
data |
any-type! |
いいえ |
全て |
フェイスのコンテンツデータ |
enable? |
logic! |
はい |
全て |
フェイスの入力イベントの有効/無効 |
visible? |
logic! |
はい |
全て |
フェイスの表示/ 非表示 |
selected |
integer! |
いいえ |
一部 |
リストタイプにおける選択要素のインデックス |
flags |
block!, word! |
いいえ |
一部 |
フェイスの表示や振る舞いを変更するための特別なキーワードのリスト |
options |
block! |
いいえ |
一部 |
[name: value]の形式で指定する追加のフェイスプロパティ |
parent |
object! |
いいえ |
全て |
親のフェイス(存在する場合)へのバックリファレンス |
pane |
block! |
いいえ |
一部 |
フェイスの中に表示されている子フェイスのリスト |
state |
block |
いいえ |
全て |
フェイスの内部的な状態 (ビューエンジンによってのみ使用されます) |
rate |
integer!, time! |
いいえ |
全て |
フェイスのタイマー。integer値をセットすると頻度、time値をセットすると遅延時間になり、noneを指定すると停止します |
edge |
object! |
いいえ |
全て |
(将来のために予約されています) |
para |
object! |
いいえ |
全て |
テキストの位置のためのParaオブジェクトの参照 |
font |
object! |
いいえ |
全て |
テキストファセットのフォントプロパティをセットするためのフォントオブジェクトの参照 |
actors |
object! |
いいえ |
全て |
ユーザーが提供したイベントハンドラ |
extra |
any-type! |
いいえ |
全て |
フェイスに関連付けされた任意のユーザーデータ(ユーザーが自由に使うことができます) |
draw |
block! |
いいえ |
全て |
フェイスに描画されるDrawコマンドのリスト |
flags ファセットに使用できるフラグのリスト:
| フラグ | 説明 |
|---|---|
all-over |
全ての |
その他のフェイスの種類ごとのフラグはそれぞれのセクションに記載されています。
Notes:
-
必須ではないファセットには
noneをセットできます。 -
offsetとsizeはスクリーンのピクセルで指定します。 -
offsetとsizeは表示される前に時々noneになることがあります。(タブパネルの中のパネルのような場合) 値はビューエンジンによって設定されます。 -
表示順は後ろから前の順で color、image、text、draw です。
新しいフェイスの生成はface!オブジェクトのクローンによって行われ、 少なくとも 有効な type 名を与える必要があります。
button: make face! [type: 'button]
一度フェイスが生成されると、 type フィールドは変更できません。
フォントオブジェクトは font! テンプレートオブジェクトのクローンです。1つのフォントオブジェクトは1つ以上のフェイスから参照されることが可能です。これにより、複数のフェイスのフォントプロパティを一ヶ所でコントロールすることが可能になります。
| フィールド | データ型 | 必須 | 説明 |
|---|---|---|---|
name |
string! |
いいえ |
OSにインストールされた有効なフォント名 |
size |
integer! |
いいえ |
フォントサイズ(ポイント単位) |
style |
word!, block! |
いいえ |
スタイリングモードまたはスタイリングモードのブロック |
angle |
integer! |
はい |
Tテキスト描画の角度(デフォルトは「0」) |
color |
tuple! |
はい |
R.G.BまたはR.G.B.Aフォーマットのフェイスのバックグラウンドカラー |
anti-alias? |
logic!, word! |
いいえ |
アンチエイリアスモード(有効/無効または特別なモード) |
shadow |
(reserved) |
いいえ |
(将来のために予約されています) |
state |
block! |
いいえ |
フェイスの内部的な状態 (ビューエンジンによってのみ使用されます) |
parent |
block! |
いいえ |
親のフェイスへの内部的なバックリファレンス (ビューエンジンによってのみ使用されます) |
Notes:
-
必須でないファセットには
noneをセットできます。 -
angleフィールドは現在のところ正しく動きません。 -
全てのフィールドの値は将来的にはオプショナルになる予定です。
利用可能なフォントスタイル:
-
bold -
italic -
underline -
strike
利用可能なアンチエイリアスモード:
-
有効/無効 (
anti-alias?: yes/no) -
クリアタイプモード (
anti-alias?: 'ClearType)
Paraオブジェクトは para! テンプレートオブジェクトのクローンです。1つのparaオブジェクトは1つ以上のフェイスから参照されることが可能です。これにより複数のフェイスのparaプロパティを一ヶ所でコントロールすることが可能になります。
| フィールド | データ型 | 説明 |
|---|---|---|
origin |
(予約) |
(将来のために予約されています) |
padding |
(予約) |
(将来のために予約されています) |
scroll |
(予約) |
(将来のために予約されています) |
align |
word! |
水平方向のテキストアラインメントをコントロールします: |
v-align |
(予約) |
垂直方向のテキストアラインメントをコントロールします: |
wrap? |
logic! |
フェイスのワードラップの有効/無効 |
parent |
block! |
親のフェイスへの内部的なバックリファレンス (ビューエンジンによってのみ使用されます) |
Notes:
-
いずれのparaフィールドも
noneをセットすることができます。
フェイスはディスプレイ上の階層状のグラフィックコンポーネントにマップされたツリー構造で構成されます。ツリーの関係は以下の物で定義されます。
-
paneファセット: ブロック内の1つ以上の子フェイスのリスト -
parentファセット: 親のフェイスへの参照
pane 内のフェイスオブジェクトの順番は重要です。グラフィックオブジェクトのZオーダーは順番どおりにマップされます。つまり、 pane の先頭のフェイスは他の全てのフェイスの後ろに表示され、末尾のフェイスは最前面に表示されます。
フェイスツリーのルートは screen フェイスです。 screen フェイスは自身の pane ブロック内の window フェイスのみ表示できます。
スクリーン上に全てのフェイスを表示するために、各フェイスは 直接的(windowフェイスの場合)または間接的(他の種類のフェイスの場合)に screen フェイスに接続される必要があります。
base 型は最もベーシックなフェイスのタイプであり、最も多目的なものでもあります。デフォルトでは、 base の背景色は基本的には 128.128.128 になります。
| Facet | 説明 |
|---|---|
|
|
|
image!の値を指定できます。アルファチャンネルがサポートされます。 |
|
背景色を指定します。アルファチャンネルがサポートされます。 |
|
フェイスの中に表示されるオプションのテキスト |
|
Drawプリミティブは透過処理を完全にサポートします。 |
Notes:
-
以下のファセットの全ての組み合わせがサポートされ、次の順番でレンダリングされます:
color、image、text、draw -
color、image、text、drawにおける透明度の指定は、色を示すtuple値:R.G.B.Aのアルファチャンネルコンポーネントで指定します。A = 0では完全な不透明になり、A = 255は完全な透明になります。
このフェイスタイプは全てのカスタムグラフィックコンポーネントの実装で使用されるべきです。
text 型はスタティックなラベルを表示します。
| ファセット | 説明 |
|---|---|
|
|
|
ラベルのテキスト |
|
テキストとして表示される値 |
|
サポートされるフィールド: |
data ファセットは以下の変換ルールに従って text フィールドとリアルタイムに同期します。
-
textが変更されると、dataはloadされたtextの値、noneまたは `options/defaultで指定された値のいずれかになります。 -
dataが変更されるとtextはdataをformした値になります。
options ファセットには以下のプロパティをセットできます。
-
default: 任意の値をセットできます。セットされた値はtextがnoneを返す場合のdataの値として使われます。これはtextがロードできない値だった時などです。
シンプルなボタンを表現します。
| ファセット | 説明 |
|---|---|
|
|
|
ボタンのラベルテキスト |
|
ボタンに表示されるイメージ。テキストと一緒に表示できます。 |
| イベントタイプ | ハンドラ | 説明 |
|---|---|---|
|
|
ユーザーがボタンをクリックした時に発生します。 |
チェックボックスを表現します。オプションで左側か右側にラベルを表示できます。
| ファセット | 説明 |
|---|---|
|
|
|
ラベルのテキスト |
|
|
|
|
| イベントタイプ | ハンドラ | 説明 |
|---|---|---|
|
|
ユーザー操作によりチェック状態が変更された時に発生します。 |
このタイプはラジオボタンを表現します。オプションでラベルテキストを左右のどちらかに表示できます。1つのペイン上のラジオボタンは1つだけがチェック状態になれます。
| Facet | 説明 |
|---|---|
|
|
|
ラベルのテキスト |
|
|
|
|
| イベントタイプ | ハンドラ | 説明 |
|---|---|---|
|
|
ラジオボタンのチェック状態がユーザー操作により変更された場合に発生します。 |
このタイプは1行の入力フィールドを表現します。
| ファセット | 説明 |
|---|---|
|
|
|
入力テキスト。読み書きする値です。 |
|
表示するテキストの値 |
|
サポートされるフィールド: |
|
いくつかの特別なフィールドの機能をオン/オフします(block!) |
サポートされるフラグ:
-
no-border: 依存するGUIフレームワークによるエッジデコレーションを除去します。
data ファセットは以下の変換ルールに従って text フィールドとリアルタイムに同期します。
-
textが変更されると、dataはloadされたtextの値、noneまたは `options/defaultで指定された値のいずれかになります。 -
dataが変更されるとtextはdataをformした値になります。
options ファセットには以下のプロパティをセットできます。
-
default: 任意の値をセットできます。セットされた値はtextがnoneを返す場合のdataの値として使われます。これはtextがロードできない値だった時などです。
NOTE:
-
selectedが入力テキストの一部をハイライトするために将来使用される予定です。
| イベントタイプ | ハンドラ | 説明 |
|---|---|---|
|
|
Enterキーがフィールド内で押されるたびに発生します。 |
|
|
フィールド内で入力が行われるたびに発生します。 |
|
|
フィールド内でキーが押されるたびに発生します。 |
このタイプは複数行の入力フィールドを表現します。
| Facet | 説明 |
|---|---|
|
|
|
入力テキスト。読み書きする値 |
|
いくつかの特別なareaの機能をオン/オフします(block!) |
サポートされるフラグ:
-
no-border: 依存するGUIフレームワークによるエッジデコレーションを除去します。
Notes:
-
selectedが入力テキストの一部をハイライトするために将来使用される予定です。 -
A vertical scroll-bar can appear if all lines of text cannot be visible in the area (might be controlled by a
flagsoption in the future). -
area内の全てのテキストが表示できない場合、垂直方向のスクロールバーが自動的に表示されます(将来的には
flagオプションでコントロール可能になる予定です)
| イベントタイプ | ハンドラ | 説明 |
|---|---|---|
|
|
フィールド内で入力が行われるたびに発生します。 |
|
|
フィールド内でキーが押されるたびに発生します。 |
このタイプは固定フレームのテキスト文字列の垂直方向のリストを表現します。コンテンツがフレームにフィットしない場合、垂直方向のスクロールバーが自動的に表示されます。
| Facet | 説明 |
|---|---|
|
|
|
表示する文字列のリスト(block! hash!) |
|
選択された文字列のインデックス。選択値がない場合はnoneになります。読み取り、書き込み可能です |
| イベントタイプ | ハンドラ | 説明 |
|---|---|---|
|
|
リスト内のエントリが選択された時に発生します。 |
|
|
|
Notes:
-
表示されるアイテムの数は現在ユーザーによって指定することができません。
垂直方向のテキスト文字列のリストを表現します。折りたたみ可能なフレームで表示されます。コンテンツがフレームにフィットしない場合、垂直方向のスクロールバーが自動的に表示されます。
| Facet | 説明 |
|---|---|
|
|
|
表示する文字列のリスト(block! hash!) |
|
選択された文字列のインデックス。選択値がない場合はnoneになります。読み取り書き込みが可能です。 |
data ファセットは任意の値を受け取りますが、文字列値だけがリストに追加され表示されます。文字列以外の型の追加の値は文字列をキーとして関連付けされた配列を作ることで使うことができます。 selected ファセットは1始まりの整数のインデックスで、(data ファセット内ではなく)リスト内の選択された文字列の位置を示します。
| イベントタイプ | ハンドラ | 説明 |
|---|---|---|
|
|
リスト内のエントリが選択された時に発生します。 |
|
|
|
Notes:
-
表示されるアイテムの数は現在のところユーザーが指定することはできません。
折りたたみ可能なフレーム内のテキスト文字列の垂直方向のリストのエディットを表現します。フレームにコンテンツがフィットしない場合、垂直方向のスクロールバーが自動的に表示されます。
| Facet | 説明 |
|---|---|
|
|
|
表示する文字列のリスト(block! hash!) |
|
選択された文字列のインデックス。選択値がない場合はnoneになります。読み取り書き込みが可能です。 |
data ファセットは任意の値を受け取りますが、文字列値だけがリストに追加され表示されます。文字列以外の型の追加の値は文字列をキーとして関連付けされた配列を作ることで使うことができます。 selected ファセットは1始まりの整数のインデックスで、(data ファセット内ではなく)リスト内の選択された文字列の位置を示します。
| イベントタイプ | ハンドラ | 説明 |
|---|---|---|
|
|
リスト内のエントリが選択された時に発生します。 |
|
|
|
Notes:
-
表示されるアイテムの数は現在のところユーザーが指定することはできません。
水平方向または垂直方向のプログレスバーを表現します。
| Facet | 説明 |
|---|---|
|
|
|
進捗を表す値(percent!またはfloat!の値) |
Notes:
-
float値が
dataとして使われた場合、値は0.0から1.0の間である必要があります。
水平または垂直方向のスライダーを表現します。
| Facet | 説明 |
|---|---|
|
|
|
カーソル位置を示す値(percent!またはfloat!値) |
Notes:
-
float値が
dataとして使われた場合、値は0.0から1.0の間である必要があります。
ビデオカメラフィードを表示するために使われます。
| Facet | 説明 |
|---|---|
|
|
|
文字列のブロックによるカメラの名前のリスト |
|
|
Notes:
-
dataファセットは最初はnoneが指定されています。カメラのリストはカメラフェイスのshowが初めて呼ばれた時に取得されます。 -
カメラフェイスに対して
to-imageを使用することで、カメラのコンテンツを取得することができます。
パネルは他のフェイスのコンテナです。
| Facet | 説明 |
|---|---|
|
|
|
子フェイスのブロック。ブロック内の順番は表示されるZオーダーとなります。 |
Notes:
-
子フェイスの
offsetの座標は親パネルの左上のコーナーからの相対位置になります。 -
子フェイスはパネルのフレームに合わせてクリッピングされます。
タブパネルは常にいずれか一枚だけが表示されるパネルのリストです。パネルの名前のリストはタブ名として使われ、選択パネルを変更するために使われます。
| Facet | 説明 |
|---|---|
|
|
|
タブ名のブロック(文字列の値) |
|
タブのリストに対応するパネルのリスト(block!) |
|
選択されているパネルのインデックスまたはnone。読み取り、書き込みが可能です(integer!) |
| イベントタイプ | ハンドラ | 説明 |
|---|---|---|
|
on-change |
ユーザーが新しいタブを選択した時に発生します。 |
Notes:
-
タブパネルを適切に表示するため、
dataとpaneファセットの両方が正しい順番で要素を持っている必要があります。 -
もし
paneが指定されたタブよりも多くのパネルを持っていた場合、多い文は無視されます。 -
タブを追加/削除する場合、対応するパネルも
paneリストから削除される必要があります。
OSのデスクトップに表示されるウィンドウを表現します。
| Facet | 説明 |
|---|---|
|
|
|
ウィンドウタイトル(string!) |
|
デスクトップスクリーン上の左上のコーナーからのオフセット。ウィンドウの外枠のデコレーションは含みません。(pair!) |
|
ウィンドウサイズ。ウィンドウの外枠のデコレーションは含みません。(pair!) |
|
ウィンドウ独自の機能のオン/オフを行います(block!) |
|
ウィンドウのメニューバーを表示します。(block!) |
|
ウィンドウ内に表示するフェイスのリスト(block!) |
|
フォーカスがセットされるフェイスを選択します(object!) |
サポートされるフラグ:
-
modal: ウィンドウをモーダルにし、前に開かれたウィンドウを無効化します。 -
resize: ウィンドウのリサイズを可能にします(デフォルトは固定サイズで、リサイズできません) -
no-title: ウィンドウのタイトルテキストを非表示にします -
no-border: ウィンドウの外枠の修飾を無効化します -
no-min: ウィンドウのドラッグバー上の最小化ボタンを非表示にします -
no-max: ウィンドウのドラッグバー上の最大化ボタンを非表示にします -
no-buttons: ウィンドウのドラッグバー上の全てのボタンを非表示にします -
popup: 外枠の修飾を小さいものに変更します(Windowsのみ対応)
Notes:
-
popupキーワードをメニューのスペックブロックで使った場合、デフォルトのメニューバーではなく、ウィンドウ内のコンテキストメニューに強制的に変更になります。
コンピュータに接続されたグラフィックディスプレイユニット(通常はモニタ)を表現します
| Facet | 説明 |
|---|---|
|
|
|
ピクセル単位のスクリーンサイズ。起動時にビューエンジンによってセットされます(pair!) |
|
スクリーンに表示されるウィンドウのリスト(block!) |
全ての表示されているウィンドウフェイスはスクリーンフェイスの子どもである必要があります。
-
face!のプロトタイプからフェイスオブジェクトが生成されます -
スクリーンフェイスに接続されているフェイスツリー内にフェイスオブジェクトを挿入します。
-
showが使用されると、スクリーン上にフェイスオブジェクトがレンダリングされます。-
このタイミングでシステムリソースが確保されます。
-
face/stateブロックがセットされます。
-
-
ディスプレイから取り除くためにペインからフェイスを削除します。
-
ガベージコレクタが参照されなくなったフェイスが保持しているシステムリソースの解放を行います。
Notes:
-
リソースを多く使うアプリケーションのため、システムリソースを手動で開放する
free関数が提供される予定です。
show <face> <face>: face!オブジェクトのクローンまたはフェイスオブジェクトか名前(word!の値を使います)のブロック
説明
この関数はスクリーン上のフェイスやフェイスのリストを更新するために使われます。スクリーンフェイスに接続されたフェイスツリー内で参照されているフェイスだけが適切にレンダリングされます。初回呼び出し時にはシステムリソースが確保され、 state ファセットがセットされグラフィックコンポーネントがスクリーン上に表示されます。以降の呼び出しではフェイスオブジェクトに対する変更がスクリーンに反映されます。 pane ファセットが定義されていた場合、 show は子フェイスにも再帰的に適用されます。
stateファセット
以下の情報は参考のために記載されていますが、通常は state ファセットはユーザーによって使用されるべきではありません。しかしOSのAPIがユーザーによって直接的に呼び出しされたり、ビューエンジンの振る舞いが変更される必要がある場合はアクセスすることもあり得ます。
| Position/Field | 説明 |
|---|---|
1 (handle) |
グラフィックオブジェクトに対するOS固有のハンドル(integer!) |
2 (changes) |
最後の |
3 (deferred) |
リアルタイムアップデートがオフにされている場合に、最後の |
4 (drag-offset) |
フェイスドラッギングモードに入った場合のマウスカーソルの開始オフセット位置を保持しています。(pair! none!) |
Notes:
-
showを呼び出しした後、changesフィールドは0にリセットされdeferredフィールドはクリアされます。 -
将来のバージョンではOSハンドルには`handle!` 型が使用されます。
ビューエンジンはフェイスツリーに変更が行われた場合に、表示をアップデートするモードを2つ持っています。
-
リアルタイムアップデート:フェイスに対するあらゆる変更は即座にスクリーンに反映します
-
遅延アップデート:フェイスに対するいかなる変更も、フェイスまたは親フェイスの
showが呼び出しされるまでスクリーンには反映しません。
この2つのモードの切り替えは system/view/auto-sync? wordによってコントロールされます。 yes がセットされている場合、リアルタイムアップデートモードになります(デフォルトのモードです)。 no がセットされている場合、ビューエンジンは全ての更新を遅延します。
リアルタイムアップデートがデフォルトであるのは以下の理由からです。
-
フェイスの変更のたびに
showを呼び出す必要性をなくし、ソースコードをシンプル、簡潔にするため -
初心者の学習のオーバーヘッドを減らすため
-
シンプルなアプリケーションやプロトタイプアプリケーションにはリアルタイムアップデートで十分なため
-
コンソールからの試行錯誤を簡単にするため
遅延モードは何らかの問題を避けるためや、ベストパフォーマンスの追求がゴールとなる場合のため、スクリーン上に多くの変更を同時に行います。
Notes:
-
これは遅延モードしかサポートしていないRebol/Viewエンジンとの大きな違いになります。
フェイスオブジェクトはファセットの中で使われているseriesとオブジェクトをバインドするRedのオーナーシップシステムに依拠しています。ファセットの変更(ネストしたファセットの変更であっても)はフェイスオブジェクトに検知され、現在の同期モード(リアルタイムまたは遅延)に従って処理されます。
一方で、レンダリングされたグラフィックオブジェクトへの変更は、対応するファセットに即座に反映されます。たとえば、 field フェイス内で入力を行うと、text ファセットの値にライブモードで反映されます。
この双方向バインディングにより、グラフィックオブジェクトとプログラマのやり取りには特別なAPIを使う必要がなく、シンプルになります。seriesアクションを使ってファセットを更新するだけで十分です。
例:
view [
list: text-list data ["John" "Bob" "Alice"]
button "Add" [append list/data "Sue"]
button "Change" [lowercase pick list/data list/selected]
]
| 名前 | 入力タイプ | 発生要因 |
|---|---|---|
down |
マウス |
マウスの左ボタンが押された |
up |
マウス |
マウスの左ボタンが離された |
mid-down |
マウス |
マウスの真ん中のボタンが押された |
mid-up |
マウス |
マウスの真ん中のボタンが離された |
alt-down |
マウス |
マウスの右ボタンが押された |
alt-up |
マウス |
マウスの右ボタンが離された |
aux-down |
マウス |
マウスの補助ボタンが押された |
aux-up |
マウス |
マウスの補助ボタンが離された |
drag-start |
マウス |
フェイスのドラッギングが始まった |
drag |
マウス |
フェイスがドラッグされている |
drop |
マウス |
フェイスのドラッグがドロップされた |
click |
マウス |
マウスの左ボタンによるクリック(ボタンウィジェットのみ) |
dbl-click |
マウス |
マウスの左ボタンによるダブルクリック |
over |
マウス |
マウスカーソルがフェイス上を通過した。このイベントはマウスがフェイス上に入った場合と、出ていった場合の2回発生します。もし |
move |
マウス |
ウィンドウが移動された |
resize |
マウス |
ウィンドウがリサイズされた |
moving |
マウス |
ウィンドウが移動している |
resizing |
マウス |
ウィンドウがリサイズされている |
wheel |
マウス |
マウスホイールが移動している |
zoom |
タッチ |
ズームジェスチャ(ピンチ)が認識された |
pan |
タッチ |
パンジェスチャ(スイープ)が認識された |
rotate |
タッチ |
回転ジェスチャが認識された |
two-tap |
タッチ |
ダブルタップジェスチャが認識された |
press-tap |
タッチ |
プレス&タップジェスチャが認識された |
key-down |
キーボード |
キーが押された |
key |
キーボード |
文字が入力されたまたは特別なキーが押された(control、shift、munuキーを除く) |
key-up |
キーボード |
押されたキーが離された |
enter |
キーボード |
Enterキーが押された |
focus |
全て |
フェイスがフォーカスを取得した |
unfocus |
全て |
フェイスがフォーカスを失った |
select |
全て |
複数選択式のフェイスで選択が行われた |
change |
全て |
ユーザーインプットによってフェイスの変更が起きた(テキスト入力またはリストの選択) |
menu |
全て |
メニューエントリが選択された |
close |
全て |
ウィンドウが閉じようとしている |
time |
タイマー |
フェイスにセットされた |
Notes:
-
タッチイベントはWindows XPでは発生しません。
-
1つ以上の
movingイベントが常にmoveの前に発生します。 -
1つ以上の
resizingイベントがresizeの前に発生します。
イベントの値は発生したイベントに対する全ての情報を保持する不明瞭なオブジェクトです。パス表記によりイベントのフィールドにアクセスすることができます。
| フィールド | 返り値 |
|---|---|
|
イベントタイプ (word!) |
|
イベントが起きたフェイスオブジェクト(object!) |
|
イベントが起きたウィンドウフェイス(object!) |
|
イベントが起きた時のフェイスオブジェクトとのマウスの相対位置のオフセット(pair!) ジェスチャイベントの場合、中心座標になります。 |
|
押されたキー(char! word!) |
|
フェイス内で新しく選択されたアイテム(integer! percent!)。「wheel」イベントの場合、回転ステップの数になります。正の数値の場合、マウスホイールが前方向(ユーザーから離れる方向)に回転したことを示し、負の数値の場合、マウスホイールが後ろ方向(ユーザーに近づく方向)に回転したことを示します。「menu」イベントの場合、対応するメニューID(word!)を返します。ズームジェスチャの場合、相対的な増減を表すパーセント値を返します。他のジェスチャでは、現在のところ値はシステムに依存します。(Windowsの場合: GESTUREINFO の「ullArguments」フィールドの内容になります。 |
|
1つ以上のフラグのリストを返します(以下のリストも参照してください)(block!) |
|
マウスカーソルがフェイスの境界外にある場合は |
|
マウスの左ボタンが押されている場合に |
|
マウスのミドルボタンが押されている場合に |
|
マウスの右ボタンが押されている場合に |
|
CTRLキーが押されている場合に |
|
SHIFTキーが押されている場合に |
event/flags のあり得るフラグのリスト:
-
away -
down -
mid-down -
alt-down -
aux-down -
control -
shift
Notes:
-
type以外の全てのフィールドは読み取り専用です。typeのセットはビューエンジンの内部でのみ行われます。
event/key によってwordとして返される特別なキーのリスト:
-
page-up -
page-down -
end -
home -
left -
up -
right -
down -
insert -
delete -
F1 -
F2 -
F3 -
F4 -
F5 -
F6 -
F7 -
F8 -
F9 -
F10 -
F11 -
F12
key-down と key-up のメッセージの場合のみ、以下の追加キー名が event/key によって返されます。
-
left-control -
right-control -
left-shift -
right-shift -
left-menu -
right-menu
アクターはビューのイベントのためのハンドラ関数です。actors ファセットによって参照されるフリーフォームオブジェクト(プロトタイプのないオブジェクト)によって定義されます。全てのアクターのは同じスペックブロックを持ちます。
on-<event>: func [face [object!] event [event!]] <event> : 何らかの有効なイベント名(上記の表に記載のもの) face : イベントを受け取るフェイスオブジェクト event : イベントの値
GUIイベントに加え、フェイスが初めて表示される時に、システムリソースが確保される直前に呼ばれる、 on-create アクターを定義することも可能です。他のアクターと異なり、 on-create アクターの引数は1つだけで face を受け取ります。
'stop : イベントループを終了します。 'done : 次のフェイスにイベントが流れることを停止させます。
他の返り値には有意な効果はありません。
イベントは通常スクリーン上の特定の位置で発生し、最も近い前面のフェイスに割り当てされます。しかし、イベントはそのフェイスから親フェイスへと階層的に移動していくこととなり、この時一般的に以下の2種類の方向性があります。
-
イベントキャプチャリング : イベントはウィンドウフェイスから イベントが元々発生した前面のフェイスへと降りていきます。対応するハンドラが設定されている場合、各フェイスで
検知(detect)イベントが発生します。 -
イベントバブリング : イベントは前面のフェイスから親のウィンドウフェイスへ移動します。ローカルのイベントハンドラが呼ばれます。
典型的なイベントのフローパスは以下のようなものです:
-
ボタンのクリックイベントが発生します。グローバルハンドラが処理されます(詳細は次のセクションを見てください)
-
イベントキャプチャリングステージが開始します:
-
最初にウィンドウがイベントを取得し、ウィンドウの
on-dectectハンドラが呼ばれます。 -
次にパネルがイベントを取得します。パネルの
on-detectハンドラが呼ばれます。 -
最後にボタンがイベントを取得します。ボタンの
on-detectハンドラが呼ばれます。
-
-
イベントバブリングステージが開始します:
-
最初にボタンがイベントを取得し、ボタンの
on-clickハンドラが呼ばれます。 -
次にパネルがイベントを取得します。パネルの`on-click` ハンドラが呼ばれます
-
最後にウィンドウがイベントを取得します。ウィンドウの
on-clickハンドラが呼ばれます。
-
Notes:
-
イベントのキャンセルはいずれかのイベントハンドラが
'donewordが返されることで行われます。 -
イベントキャプチャリングはパフォーマンス上の理由からデフォルトでは無効になっています。有効にしたい場合、
system/view/capturing?: yesをセットしてください。
イベントフローパスに入る前に、いわゆる「グローバルイベントハンドラ」を用いた所定の前処理を行うことができます。以下のAPIでハンドラの追加と削除ができます。
insert-event-func <handler> <handler> : ハンドラ関数または前処理イベントで実行するコードブロック ハンドラ関数のスペックは次のようになります: func [face [object!] event [event!]]
新しく追加されたハンドラ関数(function!)
説明
グローバルハンドラ関数をインストールし、フェイスのハンドラにイベントが到達する前に処理されるようにします。全てのグローバルイベントハンドラはイベントごとに呼び出されるため、ハンドラのボディコードは処理速度とメモリの使用について適切にしておく必要があります。もしブロックが引数として与えられた場合、ブロックは function コンストラクタを使って関数に変換されます。
ハンドラ関数の返り値は以下のいずれかです。
-
none: イベントは他のハンドラによって処理されることになります(none!) -
'done: 他のグローバルハンドラはスキップされ、イベントは子フェイスへと移動します(word!) -
'stop: イベントループを終了します(word!)
ハンドラ関数への参照は後で削除する必要がある場合、保持しておく必要があります。
| Word | 説明 |
|---|---|
|
接続されたディスプレイを表すスクリーンフェイスのリスト |
|
将来のために予約されています |
|
将来のために予約されています |
|
ビューエンジンのローレベルなプラットフォームコード(バックエンドコードも含みます) |
|
VIDとして処理しているコード |
|
グローバルイベントハンドラのリスト |
|
リアクティブフェイスと対応するアクションブロックの内部的な関連付けテーブル |
|
イベントとアクター名を変換する内部的なテーブル |
|
ビューエンジンを初期化する関数。必要であればユーザーが呼び出すこともできます。 |
|
メインのハイレベルイベントへのエントリポイント関数 |
|
|
|
|
|
|
|
|
Viewコンポーネントは コンパイル時には デフォルトでは含まれません。含めるためには、メインのRedスクリプトでヘッダーで Needs フィールドを使用し、依存関係を宣言する必要があります。
Red [
Needs: 'View
]
NOTE:
red バイナリで自動生成されたコンソールを使う場合、プラットフォーム上のViewコンポーネントが使用可能であれば、スクリプトに Needs ヘッダーフィールドがなくても動作できます。
| Function | 説明 |
|---|---|
view |
フェイスツリーまたはVIDコードブロックからウィンドウをスクリーン上にレンダリングします。 |
unview |
1つ以上のウィンドウを破棄します。 |
layout |
VIDコードブロックをフェイスツリーに変換します |
center-face |
フェイスを親の中心に配置します |
dump-face |
フェイスツリーのコンパクトな説明を出力します(デバッグ用) |
do-actor |
フェイスのアクターを手動で評価します。 |
do-events |
イベントループを開始します(必要に応じて保留中のイベントを処理してリターンします) |
draw |
Drawダイアレクトブロックをimageにレンダリングします |
to-image |
任意のレンダリング済みのフェイスをimageに変換します |
size-text |
フェイスのテキストのピクセルサイズを測ります(選択されているフォントも計算に入れます) |
追加される予定のもの:
-
メニューファセットの仕様
-
image!データ型の説明

