This commit is contained in:
yumoqing 2025-12-29 13:35:39 +08:00
parent 96310d5378
commit 2cdac6e815

View File

@ -15,6 +15,7 @@ bricks.Menu = class extends bricks.VScrollPanel {
this.build_title(); this.build_title();
this.build_description(); this.build_description();
this.create_children(this, this.opts.items); this.create_children(this, this.opts.items);
this.user_data = opts;
this.bind('item_click', this.menu_clicked.bind(this)); this.bind('item_click', this.menu_clicked.bind(this));
} }
create_submenu_container(){ create_submenu_container(){
@ -41,21 +42,42 @@ bricks.Menu = class extends bricks.VScrollPanel {
bricks.extend(popts, popup_options || {}); bricks.extend(popts, popup_options || {});
t = new bricks.Popup(popts); t = new bricks.Popup(popts);
} else { } else {
t = bricks.getWidgetById(target); t = bricks.getWidgetById(target, this);
} }
if (t){ if (t){
var desc = { if (opts.url){
"widgettype":"urlwidget", var desc = {
"options":{ "widgettype":"urlwidget",
"url":opts.url "options":{
"url":opts.url
}
} }
} var w = await bricks.widgetBuild(desc, this);
var w = await bricks.widgetBuild(desc, this); if (w && ! w.parent){
if (w && ! w.parent){ t.clear_widgets();
t.clear_widgets(); t.add_widget(w);
t.add_widget(w); } else {
} else { console.log('menu_clicked():widgetBuild() failed', desc);
console.log('menu_clicked():widgetBuild() failed', desc); }
} else if (opts.script){
var AsyncFunction = Object.getPrototypeOf(async function(){}).constructor;
var f = new AsyncFunction('menu', 'event', opts.script);
if (!f){
console.log('menu item define error', opts);
}
f.bind(t, this)(event);
} else if (opts.method){
var f = target[opts.method];
if (!f){
console.log('menu item define error', opts);
}
f.bind(t, this)(evnet);
} else if (opts.rfname){
var f = bricks.RF.get(opts.rfname);
if (!f){
console.log('menu item define error', opts);
}
f.bind(t, this)(event);
} }
} else { } else {
console.log('menu_clicked():', this.target, 'not found') console.log('menu_clicked():', this.target, 'not found')
@ -66,25 +88,21 @@ bricks.Menu = class extends bricks.VScrollPanel {
for (let i=0;i<items.length;i++){ for (let i=0;i<items.length;i++){
let item = items[i]; let item = items[i];
let subw = this.create_menuitem(item); let subw = this.create_menuitem(item);
if (item.submenu){
item.items = await this.get_submenu_items(item.submenu);
}
if (item.hasOwnProperty('items')){ if (item.hasOwnProperty('items')){
var itw = new bricks.VBox({}); var itw = new bricks.VBox({});
itw.user_data = item;
let w1 = this.create_submenu_container(); let w1 = this.create_submenu_container();
itw.add_widget(subw); itw.add_widget(subw);
itw.add_widget(w1); itw.add_widget(w1);
this.create_children(w1, item.items); this.create_children(w1, item.items);
subw.bind('click', this.items_toggle_hide.bind(this, w1)); subw.bind('click', this.items_toggle_hide.bind(this, w1));
w.add_widget(itw); w.add_widget(itw);
} else if(item.submenu){
var itw = new bricks.VBox({});
let w1 = this.create_submenu_container();
w1.submenu_loaded = false;
w1.submenu_url = item.submenu;
itw.add_widget(subw);
itw.add_widget(w1);
w.add_widget(itw);
subw.bind('click', this.load_submenu.bind(this, w1));
} else { } else {
subw.bind('click', this.regen_menuitem_event.bind(this, item)) subw.bind('click', this.regen_menuitem_event.bind(this, item))
subw.user_data = item;
w.add_widget(subw); w.add_widget(subw);
} }
} }
@ -94,14 +112,35 @@ bricks.Menu = class extends bricks.VScrollPanel {
var d = await jc.get(url); var d = await jc.get(url);
return d.options.items; return d.options.items;
} }
async load_submenu(container, event){ get_container(w, mpath){
event.stopPropagation(); var x = mpath.split('/');
if (! container.submenu_loaded){ var name = x.shift()
var items = await this.get_submenu_items(container.submenu_url); var container = w.children[w.children.length - 1];
this.create_children(container, items); var fc;
container.submenu_loaded = true; containers.children.forEach(c=>{
if (c.user_data){
if (c.user_data.name == name) fc = c;
} else {
throw 'menu data error';
}
});
if (! fc) return null;
if (x.length == 0){
return fc;
} }
container.toggle_hide(); mpath = x.join('/')
return this.get_container(fc, mpath);
}
hide_item(menu_path, event){
var w = this.get_container(this, mpath);
w.hide();
event.stopPropagation();
}
show_item(menu_path, event){
var w = this.get_container(this, mpath);
w.show();
event.stopPropagation();
} }
items_toggle_hide(w, event){ items_toggle_hide(w, event){
w.toggle_hide(); w.toggle_hide();