mako-ver/data/system/zmenu.tjs
2023-11-23 19:40:13 -06:00

256 lines
11 KiB
Text

//
//吉里吉里Z用MenuItemクラス
//kag.menuを封印するための差し替え用クラス
//
class ZMenuItem
{
var f_window,f_caption;
var f_checked;
var f_children = [];
var f_enabled;
var f_group;
var f_parent;
var f_radio;
var f_root;
// var f_shortcut;
var f_visible;
var onPopup = void;
var onClickZ = void; //引数にsender
property HMENU{getter(){return 0;}}
property caption{setter(v){f_caption=v;}getter(){return f_caption;}}
property checked{
setter(v)
{
f_checked=v;
if(v && f_radio>0){
for(var i=0 ; i<parent.children.count ; i++){
if(f_radio==parent.children[i].f_radio) parent.children[i].f_checked=false;
}
}
}
getter()
{
return f_checked;
}
}
property children{getter(){return f_children;}}
property enabled{setter(v){f_enabled=v;}getter(){return f_enabled;}}
property group{setter(v){f_group=v;}getter(){return f_group;}}
property index
{
setter(v)
{
if(f_parent.children.find(this)>=0) f_parent.children.remove(this,true);
f_parent.children.insert(v,this);
}
getter()
{
return f_parent.children.find(this);
}
}
property parent{setter(v){f_parent=v;}getter(){return f_parent;}}
property radio{setter(v){f_radio=v;}getter(){return f_radio;}}
property root{getter(){return f_root;}}
property shortcut
{
setter(v){
f_window.shortcuts.add(this,v);
}
getter(){
return f_window.shortcuts.getShortcut(this);
}
}
property visible{setter(v){f_visible=v;}getter(){return f_visible;}}
property window{setter(v){f_window=v;}getter(){return f_window;}}
function ZMenuItem(_window,_caption)
{
f_window = _window;
f_caption = _caption;
f_checked = false;
f_enabled = true;
f_group = 0;
f_parent = void;
f_radio = 0;
f_root = this;
// f_shortcut = "";
f_visible = true;
}
function add(item)
{
item.f_root = f_root;
item.f_parent = this;
children.add(item);
}
function insert(item,index)
{
item.f_root = f_root;
item.f_parent = this;
children.insert(index,item);
}
function popup(flags,x,y)
{
/*要るか分からんけどflagsの指定
水平方向
TPM_CENTERALIGN ショートカットメニューの中心を、x パラメータが指定する座標に合わせます
TPM_LEFTALIGN ショートカットメニューの左端を、x パラメータが指定する座標に合わせます
TPM_RIGHTALIGN ショートカットメニューの右端を、x パラメータが指定する座標に合わせます
垂直方向
TPM_BOTTOMALIGN ショートカットメニューの下端を、y パラメータが指定する座標に合わせます
TPM_TOPALIGN ショートカットメニューの上端を、y パラメータが指定する座標に合わせます
TPM_VCENTERALIGN ショートカットメニューの中心を、y パラメータが指定する座標に合わせます
親ウィンドウが無い場合
TPM_NONOTIFY ユーザーがメニュー項目をクリックしたとき、通知メッセージを送りません
TPM_RETURNCMD 関数の戻り値として、ユーザーが選択したメニュー項目の ID を返します
マウスボタン処理
TPM_LEFTBUTTON マウスの左ボタンでポップアップ メニューからの選択が行えるようにします
TPM_RIGHTBUTTON マウスの右ボタンでポップアップ メニューからの選択が行えるようにします
*/
if(onPopup) onPopup(flags,x,y);
}
function remove(item)
{
children.remove(item,true);
}
function onClick()
{
if(onClickZ) onClickZ(this);
}
//test----------------------------------------
function getinfo(prefix=' ')
{
dm('%s\'%s\',visible:%d,checked:%d,radio:%d,shortcut:%s'.sprintf(prefix,caption,visible,checked,radio,shortcut));
for(var i=0 ; i<children.count ; i++){
children[i].getinfo(prefix+prefix);
}
}
}
//----------------------------------------
class ZMenuItemShortcut
{
var shortcut;
var item;
var key;
var shift;
var ctrl;
property enabled{
getter(){
if(item===void) return false;
return item.enabled;
}
setter(v){
if(item===void) return;
item.enabled = v;
}
}
function ZMenuItemShortcut(_item,_shortcut)
{
item = _item;
shortcut = _shortcut;
shift=false;
ctrl=false;
var a = shortcut.toLowerCase().split(' +\t',,true);
for( var i=0 ; i<a.count ; i++ )
{
if( a[i].length > 0 )
{
switch(a[i])
{
case 'shift':shift=true;break;
case 'ctrl':ctrl=true;break;
default:key=str2key(a[i]);
}
}
}
}
function str2key(str)
{
switch(str) //欲しいのは適当に追加して
{
case 'backspace':case 'bs':case 'back':return 0x08;
case 'tab':return 0x09;
case 'enter':return 0x0d;
case 'esc':case 'escape':return 0x1b;
case '変換':return 0x1c;
case '無変換':return 0x1d;
case 'space':return 0x20;
case 'f1':return 0x70;
case 'f2':return 0x71;
case 'f3':return 0x72;
case 'f4':return 0x73;
case 'f5':return 0x74;
case 'f6':return 0x75;
case 'f7':return 0x76;
case 'f8':return 0x77;
case 'f9':return 0x78;
case 'f10':return 0x79;
case 'f11':return 0x7a;
case 'f12':return 0x7b;
case 'f13':return 0x7c;
case 'f14':return 0x7d;
case 'f15':return 0x7e;
case 'f16':return 0x7f;
case 'f17':return 0x80;
case 'f18':return 0x81;
case 'f19':return 0x82;
case 'f20':return 0x83;
case 'f21':return 0x84;
case 'f22':return 0x85;
case 'f23':return 0x86;
case 'f24':return 0x87;
default:
if(#str[0]>=#'a' && #str[0]<=#'z'){
return 0x41 + (#str[0]-#'a');
}
}
}
function processKeys(_key,_shift) //入力されたキーと設定されてるショートカットが一致しているかチェック
{
if(shift!=_shift) return; //シフトが一致しなかったらダメ
if(key == _key)
{
item.onClick();
}
}
function getstr()
{
return (shift)? 'shift':'' + (ctrl)? 'ctrl':'' + $key;
}
}
class ZMenuItemShortcutManager
{
var list = [];
function ZMenuItemShortcutManager(){}
function add(item,shortcut)
{
list.add(new ZMenuItemShortcut(item,shortcut));
}
function getShortcut(item)
{
for(var i=0 ; i<list.count ; i++ ){
if(list[i].item == item){
return list[i].shortcut;
}
}
return void;
}
function processKeys(key, shift)
{
for(var i=0 ; i<list.count ; i++ ){
if(list[i].enabled){
list[i].processKeys(key,shift);
}
// else{
// if(debugmode) dm('ZMenuItemShortcutManager:'+list[i].getstr());
// }
}
}
}
//メニューのenabledとの連携どうしよ