Skip to content

Instantly share code, notes, and snippets.

@jin1016
Created April 7, 2016 08:01
Show Gist options
  • Save jin1016/22f886c2a702605650863ee3429a3d37 to your computer and use it in GitHub Desktop.
Save jin1016/22f886c2a702605650863ee3429a3d37 to your computer and use it in GitHub Desktop.
吉里吉里Zのmenu.dllの代わりにスクリプトで描画以外実装したもの
/*/
* 吉里吉里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