From 2cdac6e8154c2d47eb0cca8843f99adf47bea98e Mon Sep 17 00:00:00 2001 From: yumoqing Date: Mon, 29 Dec 2025 13:35:39 +0800 Subject: [PATCH] bugfix --- bricks/menu.js | 95 +++++++++++++++++++++++++++++++++++--------------- 1 file changed, 67 insertions(+), 28 deletions(-) diff --git a/bricks/menu.js b/bricks/menu.js index 2a654f5..582d59d 100644 --- a/bricks/menu.js +++ b/bricks/menu.js @@ -15,6 +15,7 @@ bricks.Menu = class extends bricks.VScrollPanel { this.build_title(); this.build_description(); this.create_children(this, this.opts.items); + this.user_data = opts; this.bind('item_click', this.menu_clicked.bind(this)); } create_submenu_container(){ @@ -41,21 +42,42 @@ bricks.Menu = class extends bricks.VScrollPanel { bricks.extend(popts, popup_options || {}); t = new bricks.Popup(popts); } else { - t = bricks.getWidgetById(target); + t = bricks.getWidgetById(target, this); } if (t){ - var desc = { - "widgettype":"urlwidget", - "options":{ - "url":opts.url + if (opts.url){ + var desc = { + "widgettype":"urlwidget", + "options":{ + "url":opts.url + } } - } - var w = await bricks.widgetBuild(desc, this); - if (w && ! w.parent){ - t.clear_widgets(); - t.add_widget(w); - } else { - console.log('menu_clicked():widgetBuild() failed', desc); + var w = await bricks.widgetBuild(desc, this); + if (w && ! w.parent){ + t.clear_widgets(); + t.add_widget(w); + } else { + 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 { console.log('menu_clicked():', this.target, 'not found') @@ -66,25 +88,21 @@ bricks.Menu = class extends bricks.VScrollPanel { for (let i=0;i{ + 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){ w.toggle_hide();