diff --git a/main.py b/main.py index f425b99c..a019c558 100644 --- a/main.py +++ b/main.py @@ -132,8 +132,10 @@ def main(): visible = True if match_group(plugin['Group'], DEFAULT_FN_GROUPS) else False variant = plugins[k]["Color"] if "Color" in plugin else "secondary" info = plugins[k].get("Info", k) + btn_elem_id = str(hash(k)) plugin['Button'] = plugins[k]['Button'] = gr.Button(k, variant=variant, - visible=visible, info_str=f'函数插件区: {info}').style(size="sm") + visible=visible, info_str=f'函数插件区: {info}', elem_id=btn_elem_id).style(size="sm") + plugin['ButtonElemId'] = btn_elem_id with gr.Row(): with gr.Accordion("更多函数插件", open=True): dropdown_fn_list = [] @@ -239,23 +241,13 @@ def main(): if not plugins[k].get("AsButton", True): continue if plugins[k].get("Class", None) is None: assert plugins[k].get("Function", None) is not None - click_handle = plugins[k]["Button"].click(ArgsGeneralWrapper(plugins[k]["Function"]), [*input_combo], output_combo) - click_handle.then(on_report_generated, [cookies, file_upload, chatbot], [cookies, file_upload, chatbot]).then(None, [plugins[k]["Button"]], None, _js=r"(fn)=>on_plugin_exe_complete(fn)") - cancel_handles.append(click_handle) + click_handle = plugins[k]["Button"].click(None, inputs=[], outputs=None, _js=f"""()=>run_classic_plugin_via_id("{plugins[k]["ButtonElemId"]}")""") + # click_handle = plugins[k]["Button"].click(ArgsGeneralWrapper(plugins[k]["Function"]), [*input_combo], output_combo) + # click_handle.then(on_report_generated, [cookies, file_upload, chatbot], [cookies, file_upload, chatbot]).then(None, [plugins[k]["Button"]], None, _js=r"(fn)=>on_plugin_exe_complete(fn)") + # cancel_handles.append(click_handle) else: click_handle = plugins[k]["Button"].click(None, inputs=[], outputs=None, _js=f"""()=>run_advanced_plugin_launch_code("{k}")""") - # 函数插件-下拉菜单与随变按钮的互动(旧版) - # def on_dropdown_changed(k): - # variant = plugins[k]["Color"] if "Color" in plugins[k] else "secondary" # 选择颜色 - # info = plugins[k].get("Info", k) # 获取info - # ret = {switchy_bt: gr.update(value=k, variant=variant, info_str=f'函数插件区: {info}')} - # if plugins[k].get("AdvancedArgs", False): # 是否唤起高级插件参数区 - # ret.update({plugin_advanced_arg: gr.update(visible=True, label=f"插件[{k}]的高级参数说明:" + plugins[k].get("ArgsReminder", [f"没有提供高级参数功能说明"]))}) - # else: - # ret.update({plugin_advanced_arg: gr.update(visible=False, label=f"插件[{k}]不需要高级参数。")}) - # return ret - # dropdown.select(on_dropdown_changed, [dropdown], [switchy_bt, plugin_advanced_arg] ) # 函数插件-下拉菜单与随变按钮的互动(新版-更流畅) dropdown.select(None, [dropdown], None, _js=f"""(dropdown)=>run_dropdown_shift(dropdown)""") @@ -272,13 +264,7 @@ def main(): return css_part2 + css_part1 theme_handle = theme_dropdown.select(on_theme_dropdown_changed, [theme_dropdown, secret_css], [secret_css]) - theme_handle.then( - None, - [secret_css], - None, - _js=js_code_for_css_changing - ) - + theme_handle.then(None, [secret_css], None, _js=js_code_for_css_changing) switchy_bt.click(None, [switchy_bt], None, _js="(switchy_bt)=>on_flex_button_click(switchy_bt)") # 随变按钮的回调函数注册 @@ -293,9 +279,10 @@ def main(): click_handle_ng.then(on_report_generated, [cookies, file_upload, chatbot], [cookies, file_upload, chatbot]).then(None, [switchy_bt], None, _js=r"(fn)=>on_plugin_exe_complete(fn)") cancel_handles.append(click_handle_ng) # 新一代插件的高级参数区确认按钮(隐藏) - click_handle_ng = new_plugin_callback.click(route_switchy_bt_with_arg, [ - gr.State(["new_plugin_callback", "usr_confirmed_arg"] + input_combo_order), - new_plugin_callback, usr_confirmed_arg, *input_combo + click_handle_ng = new_plugin_callback.click(route_switchy_bt_with_arg, + [ + gr.State(["new_plugin_callback", "usr_confirmed_arg"] + input_combo_order), # 第一个参数: 指定了后续参数的名称 + new_plugin_callback, usr_confirmed_arg, *input_combo # 后续参数: 真正的参数 ], output_combo) click_handle_ng.then(on_report_generated, [cookies, file_upload, chatbot], [cookies, file_upload, chatbot]).then(None, [switchy_bt], None, _js=r"(fn)=>on_plugin_exe_complete(fn)") cancel_handles.append(click_handle_ng) diff --git a/themes/common.js b/themes/common.js index 11d5909a..b735bf07 100644 --- a/themes/common.js +++ b/themes/common.js @@ -1706,6 +1706,7 @@ function register_plugin_init(key, base64String){ } plugin_init_info_lib[key].info = guiJsonData.Info; plugin_init_info_lib[key].color = guiJsonData.Color; + plugin_init_info_lib[key].elem_id = guiJsonData.ButtonElemId; plugin_init_info_lib[key].label = guiJsonData.Label plugin_init_info_lib[key].enable_advanced_arg = guiJsonData.AdvancedArgs; plugin_init_info_lib[key].arg_reminder = guiJsonData.ArgsReminder; @@ -1753,4 +1754,36 @@ async function run_dropdown_shift(dropdown){ __type__: 'update' }, "advance_arg_input_legacy", "obj"); } -} \ No newline at end of file +} + +async function run_classic_plugin_via_id(plugin_elem_id){ + // find elementid + for (key in plugin_init_info_lib){ + if (plugin_init_info_lib[key].elem_id == plugin_elem_id){ + let current_btn_name = await get_data_from_gradio_component(plugin_elem_id); + console.log(current_btn_name); + + gui_args = {} + // 关闭菜单 (如果处于开启状态) + push_data_to_gradio_component({ + visible: false, + __type__: 'update' + }, "plugin_arg_menu", "obj"); + hide_all_elem(); + // 为了与旧插件兼容,生成菜单时,自动加载旧高级参数输入区的值 + let advance_arg_input_legacy = await get_data_from_gradio_component('advance_arg_input_legacy'); + if (advance_arg_input_legacy.length != 0){ + gui_args = { + "advanced_arg": advance_arg_input_legacy + } + } + // execute the plugin + push_data_to_gradio_component(JSON.stringify(gui_args), "invisible_current_pop_up_plugin_arg_final", "string"); + push_data_to_gradio_component(current_btn_name, "invisible_callback_btn_for_plugin_exe", "string"); + document.getElementById("invisible_callback_btn_for_plugin_exe").click(); + return; + } + } + // console.log('unable to find function'); + return; +} diff --git a/themes/gui_advanced_plugin_class.py b/themes/gui_advanced_plugin_class.py index 65332e10..48951874 100644 --- a/themes/gui_advanced_plugin_class.py +++ b/themes/gui_advanced_plugin_class.py @@ -31,18 +31,27 @@ def define_gui_advanced_plugin_class(plugins): invisible_callback_btn_for_plugin_exe = gr.Button(r"未选定任何插件", variant="secondary", visible=False, elem_id="invisible_callback_btn_for_plugin_exe").style(size="sm") # 随变按钮的回调函数注册 def route_switchy_bt_with_arg(request: gr.Request, input_order, *arg): - arguments = {k:v for k,v in zip(input_order, arg)} - which_plugin = arguments.pop('new_plugin_callback') + arguments = {k:v for k,v in zip(input_order, arg)} # 重新梳理输入参数,转化为kwargs字典 + which_plugin = arguments.pop('new_plugin_callback') # 获取需要执行的插件名称 if which_plugin in [r"未选定任何插件"]: return - usr_confirmed_arg = arguments.pop('usr_confirmed_arg') + usr_confirmed_arg = arguments.pop('usr_confirmed_arg') # 获取插件参数 arg_confirm: dict = {} - usr_confirmed_arg_dict = json.loads(usr_confirmed_arg) + usr_confirmed_arg_dict = json.loads(usr_confirmed_arg) # 读取插件参数 for arg_name in usr_confirmed_arg_dict: arg_confirm.update({arg_name: str(usr_confirmed_arg_dict[arg_name]['user_confirmed_value'])}) - plugin_obj = plugins[which_plugin]["Class"] - arguments['plugin_advanced_arg'] = arg_confirm - if arg_confirm.get('main_input', None) is not None: + + if plugins[which_plugin].get("Class", None) is not None: # 获取插件执行函数 + plugin_obj = plugins[which_plugin]["Class"] + plugin_exe = plugin_obj.execute + else: + plugin_exe = plugins[which_plugin]["Function"] + + arguments['plugin_advanced_arg'] = arg_confirm # 更新高级参数输入区的参数 + if arg_confirm.get('main_input', None) is not None: # 更新主输入区的参数 arguments['txt'] = arg_confirm['main_input'] - yield from ArgsGeneralWrapper(plugin_obj.execute)(request, *arguments.values()) + + # 万事俱备,开始执行 + yield from ArgsGeneralWrapper(plugin_exe)(request, *arguments.values()) + return invisible_callback_btn_for_plugin_exe, route_switchy_bt_with_arg, usr_confirmed_arg