Instantly share code, notes, and snippets.
Created
April 7, 2016 08:01
-
Star
(0)
0
You must be signed in to star a gist -
Fork
(0)
0
You must be signed in to fork a gist
-
Save jin1016/22f886c2a702605650863ee3429a3d37 to your computer and use it in GitHub Desktop.
吉里吉里Zのmenu.dllの代わりにスクリプトで描画以外実装したもの
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/*/ | |
* 吉里吉里2のメニュー/吉里吉里Zのmenu.dllと同等のインターフェイスを持っているが、ツリーと情報の管理のみで描画などは行わないスクリプト。 | |
* Window 生成後に this.menu = new MenuItem(this,"root"); などとして追加すれば、描画はしないが同じように機能する。 | |
* MenuListener を継承もしくは、同等のメソッドを持たせたクラスをメニュー生成時に渡しておき、更新が呼ばれた時に描画更新すれば自前メニューを作れる。 | |
* もしくは、MenuItem を継承して描画などを行うようにする。 | |
*/ | |
class MenuListener { | |
/** | |
* アイテムが更新された時に呼び出される | |
*/ | |
function updateMenuItem( item:MenuItem ) {} | |
/** | |
* 子アイテムが更新された時に呼び出される | |
*/ | |
function updateMenuList( parent:MenuItem ) {} | |
/** | |
* メニューアイテムが選択された時に呼び出される | |
*/ | |
function selectMenuItem( item:MenuItem ) {} | |
}; | |
class MenuItem { | |
var children_:Array; | |
var window_:Window; | |
var caption_:string; | |
var parent_:MenuItem; | |
var checked_:bool; | |
var enabled_:bool; | |
var group_:int; | |
var radio_:bool; | |
var visible_:bool; | |
var listener_:MenuListener; | |
/** | |
* MenuItem オブジェクトの構築 | |
* @param window このメニュー項目を作成するウィンドウを指定します。 | |
* @param caption メニュー項目のキャプション (表示する文字列) を指定します。 | |
* MenuItem.caption プロパティで設定/取得できます。 | |
* @description MenuItem クラスのオブジェクトを構築します。 | |
* 作成したメニュー項目を親メニュー項目に追加するには、親メニュー項目の MenuItem.add メソッドを使います。 | |
*/ | |
function MenuItem( window:Window, caption:string="", listener:MenuListener=null ) { | |
children_ = new Array(); | |
window_ = window; | |
caption_ = caption; | |
parent_ = null; | |
checked_ = false; | |
enabled_ = true; | |
group_ = 0; | |
visible_ = true; | |
listener_ = listener; | |
} | |
function finalize(){ | |
} | |
function updateItem() { | |
if( listener_ != null ) { | |
listener_.updateMenuItem( this ); | |
} | |
} | |
function updateList() { | |
if( listener_ != null ) { | |
listener_.updateMenuList( this ); | |
} | |
} | |
function selectItem() { | |
if( listener_ != null ) { | |
listener_.selectMenuItem( this ); | |
} | |
} | |
/** | |
* 子メニュー項目の追加 | |
* @param item 追加する子メニュー項目を指定します。 | |
* 子メニュー項目は、すでに子となっているメニュー項目の最後に追加されます。 | |
* @description 子メニュー項目を追加します。 | |
* メニュー項目が他のメニュー項目の子になると、 親メニュー項目が無効化されるときに自動的に子メニュー項目も無効化されるようになります。 | |
* また、メニュー階層においても親子の関係を持つようになります。 | |
*/ | |
function add(item:MenuItem) { | |
children_.add(item); | |
item.parent_ = this; | |
updateList(); | |
} | |
/** | |
* 子メニュー項目の挿入 | |
* @param item 挿入する子メニュー項目を指定します。 | |
* @param index 挿入する位置を指定します。0 を指定すると先頭に挿入されます。 | |
* @description 子メニュー項目を指定位置に挿入します。 | |
*/ | |
function insert(item:MenuItem,index:int) { | |
children_.remove(item); | |
children_.insert( index, item ); | |
item.parent_ = this; | |
updateList(); | |
} | |
/** | |
* 子メニュー項目の削除 | |
* @param item 削除する子メニュー項目を指定します。 | |
* @description 指定された子メニュー項目をリストから削除します。 | |
*/ | |
function remove(item:MenuItem) { | |
children_.remove(item); | |
item.parent_ = null; | |
updateList(); | |
} | |
/** | |
* キャプション | |
* @description キャプション ( 表示する文字列 ) を表します。値を設定することもできます。 | |
* '-' ( ハイフン ) を指定すると区切り線を表示するようになります。 | |
*/ | |
property caption { | |
setter(c) { | |
caption_ = c; | |
updateItem(); | |
} | |
getter { | |
return caption_; | |
} | |
} | |
/** | |
* チェックマークを表示するかどうか | |
* @description メニュー項目の横にチェックマークを表示するかどうかを表します。値を設定することもできます。 | |
* 真を指定するとチェックマークが表示されます。 | |
* MenuItem.radio プロパティが真の場合は、チェックマークではなく、黒い丸が表示されます。 | |
* MenuItem.group にて同じグループ番号を持ち、かつ同じ親を持ち、さらに MenuItem.radio プロパティが真のメニュー項目は、 このプロパティを同時に二つ以上を 真にすることはできません。他のメニュー項目のこのプロパティが真になった場合、 他に真になっているメニュー項目があれば、自動的にそのメニュー項目のこのプロパティは偽に 設定されます。 | |
*/ | |
property checked { | |
setter(c) { | |
checked_ = c; | |
if( parent_ != null ) parent_.updateList(); | |
} | |
getter { | |
return checked_; | |
} | |
} | |
/** | |
* 子メニュー項目 | |
* @description 子メニュー項目がリストされた配列オブジェクトを表します。 | |
* ここで得られた配列に値を書き込んだり、項目の削除や追加などをしても実際のメニュー項目の状態には反映されません。 | |
* 読み取りのみが行えると考えてください。 | |
*/ | |
property children { getter{ return children_; } } | |
/** | |
* 選択可能かどうか | |
* @description メニュー項目を選択可能かどうかを表します。値を設定することもできます。 | |
* 真の場合はメニュー項目が選択可能、偽の場合は選択不可能になります。 | |
*/ | |
property enabled { | |
setter(c) { | |
enabled_ = c; | |
updateItem(); | |
} | |
getter { | |
return enabled_; | |
} | |
} | |
/** | |
* グループ番号 | |
* @description グループ番号を表します。値を設定することもできます。 | |
* 同じグループ番号を持ち、かつ同じ親を持ち、MenuItem.radio プロパティが 真のメニュー項目は、MenuItem.checked プロパティを同時に二つ以上を 真にすることはできません。 | |
*/ | |
property group { | |
setter(c) { | |
group_ = c; | |
if( parent_ != null ) parent_.updateList(); | |
} | |
getter { | |
return group_; | |
} | |
} | |
/** | |
* 順番 | |
* @description 同じ親を持つメニュー項目間における順番を表す、0または正の整数です。 | |
* 0が先頭を表します。 | |
* 現在位置を取得したり、位置を変更するときに便利です。 | |
* 値を設定すると、その位置にメニュー項目が移動します。 | |
*/ | |
property index { | |
setter(c) { | |
if( parent_ != null ) { | |
parent_.insert( c, this ); | |
} | |
} | |
getter { | |
if( parent_ != null ) { | |
return parent_.children_.find( this ); | |
} | |
return -1; | |
} | |
} | |
/** | |
* 親メニュー項目 | |
* @description 親メニュー項目を表します。 | |
*/ | |
property parent { getter{ return parent_; } } | |
/** | |
* ラジオ項目かどうか | |
* @description ラジオ項目かどうかを指定します。値を設定することもできます。 | |
* この項目が真の場合の動作については MenuItem.checked プロパティを 参照してください。 | |
*/ | |
property radio { | |
setter(c) { | |
radio_ = c; | |
if( parent_ != null ) parent_.updateList(); | |
} | |
getter { | |
return radio_; | |
} | |
} | |
/** | |
* ルートメニュー項目 | |
* @description ルート(大本)のメニュー項目(MenuItemクラスのインスタンス)を表します。 | |
*/ | |
property root { | |
getter { | |
var r = this; | |
while( r.parent_ != null ) { | |
r = r.parent_; | |
} | |
return r; | |
} | |
} | |
/** | |
* 可視かどうか | |
* @description メニュー項目が可視かどうかを表します。値を設定することもできます。 | |
* 真ならば表示され、偽ならば非表示です。 | |
*/ | |
property visible { | |
setter(c) { | |
visible_ = c; | |
if( parent_ != null ) parent_.updateList(); | |
} | |
getter { | |
return visible_; | |
} | |
} | |
/** | |
* オーナーウィンドウ | |
* @description このメニューアイテムを保持するオーナーウィンドウ(Windowクラスのオブジェクト)を表します。 | |
*/ | |
property window { getter{ return window_; } } | |
/** | |
* リスナ | |
* @description このメニューアイテムが更新された時に通知するリスナを表します。 | |
*/ | |
property listener { | |
setter(l) { | |
listener_ = l; | |
} | |
getter { | |
return listener_; | |
} | |
} | |
/** | |
* メニュー項目が選択された | |
* @description メニュー項目が選択された ( クリックされたり Enter キーが押された ) 時に発生します。 | |
*/ | |
function onClick() { | |
selectItem(); | |
} | |
/** | |
* メニュー構造をコンソールに吐き出す | |
* @description メニュー内容を確認すためにこのクラス以下のメニュー構造をコンソールに吐き出す | |
*/ | |
function dump() { | |
var mes:string = ""; | |
var par:MenuItem = parent_; | |
while( par != null ) { | |
mes += " "; | |
par = par.parent_; | |
} | |
if( caption_ == "-" ) { | |
mes += "-------------------------------"; | |
} else { | |
mes += caption_; | |
} | |
Debug.message( mes ); | |
var count:int = children_.count; | |
for( var i:int = 0; i < count; i++ ) { | |
children_[i].dump(); | |
} | |
} | |
}; | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment