import os import gradio as gr import datetime from . import util from . import setting from . import ishortcut from . import classification from . import sc_browser_page def on_ui(): with gr.Column(scale=setting.shortcut_browser_screen_split_ratio): classification_list = gr.Dropdown(label='Classification List', multiselect=None, choices=[setting.NEWCLASSIFICATION] + classification.get_list(), value=setting.NEWCLASSIFICATION ,interactive=True) with gr.Tabs(): with gr.TabItem("Classification Info"): classification_name = gr.Textbox(label="Name", value="",interactive=True, lines=1) classification_info = gr.Textbox(label="Description", value="",interactive=True, lines=3) classification_create_btn = gr.Button(value="Create", variant="primary") classification_update_btn = gr.Button(value="Update", variant="primary", visible=False) with gr.Accordion("Delete Classification", open=False): classification_delete_btn = gr.Button(value="Delete") with gr.TabItem("Shortcut Items"): sc_gallery, refresh_sc_browser, refresh_sc_gallery = sc_browser_page.on_ui() with gr.Column(scale=(setting.shortcut_browser_screen_split_ratio_max-setting.shortcut_browser_screen_split_ratio)): with gr.Accordion(label=setting.PLACEHOLDER, open=True) as classification_title_name: classification_save_shortcut_btn = gr.Button(value="Save Classification Shortcuts", variant="primary") with gr.Row(): classification_clear_shortcut_btn = gr.Button(value="Clear") classification_reload_shortcut_btn = gr.Button(value="Reload") classification_gallery = gr.Gallery(elem_id="classification_gallery", show_label=False).style(grid=[setting.classification_gallery_column], height="full", object_fit=setting.gallery_thumbnail_image_style, preview=False) with gr.Row(visible=False): classification_shortcuts = gr.State() refresh_gallery = gr.Textbox() refresh_classification = gr.Textbox() refresh_classification.change( fn=on_refresh_classification_change, inputs=classification_list, outputs=[ classification_name, classification_info, refresh_sc_browser, classification_title_name, refresh_gallery, classification_list ], show_progress=False ) refresh_gallery.change( fn=on_classification_gallery_loading, inputs=[ classification_shortcuts, ], outputs=[ classification_gallery ], show_progress=False ) sc_gallery.select( fn=on_sc_gallery_select, inputs=[ classification_list, classification_shortcuts ], outputs=[ classification_shortcuts, refresh_gallery, sc_gallery, refresh_sc_gallery ], show_progress=False ) classification_gallery.select( fn=on_classification_gallery_select, inputs=[ classification_shortcuts ], outputs=[ classification_shortcuts, refresh_gallery, classification_gallery, ], show_progress=False ) classification_create_btn.click( fn=on_classification_create_btn_click, inputs=[ classification_name, classification_info, classification_shortcuts, ], outputs=[ classification_list, classification_shortcuts, refresh_gallery, refresh_sc_browser, classification_title_name, classification_create_btn, classification_update_btn ] ) classification_update_btn.click( fn=on_classification_update_btn_click, inputs=[ classification_list, classification_name, classification_info, ], outputs=[ classification_list, refresh_sc_browser, classification_title_name ] ) classification_delete_btn.click( fn=on_classification_delete_btn_click, inputs=[ classification_list, ], outputs=[ classification_list, classification_shortcuts, refresh_gallery, refresh_sc_browser, classification_title_name, classification_create_btn, classification_update_btn ] ) classification_save_shortcut_btn.click( fn=on_classification_save_shortcut_btn_click, inputs=[ classification_list, classification_shortcuts ], outputs=[ refresh_gallery ] ) classification_clear_shortcut_btn.click( fn=on_classification_clear_shortcut_btn_click, inputs=[], outputs=[ classification_shortcuts, refresh_gallery ] ) classification_reload_shortcut_btn.click( fn=on_classification_reload_shortcut_btn_click, inputs=classification_list, outputs=[ classification_shortcuts, refresh_gallery ] ) classification_list.select( fn=on_classification_list_select, inputs=None, outputs=[ classification_name, classification_info, classification_shortcuts, refresh_gallery, classification_title_name, classification_create_btn, classification_update_btn ] ) return refresh_classification def on_classification_reload_shortcut_btn_click(select_name): if select_name != setting.PLACEHOLDER: shortcuts = classification.get_classification_shortcuts(select_name) current_time = datetime.datetime.now() return shortcuts, current_time return None, gr.update(visible=False) def on_refresh_classification_change(select_name): current_time = datetime.datetime.now() if select_name != setting.NEWCLASSIFICATION: info = classification.get_classification_info(select_name) return gr.update(value=select_name), gr.update(value=info), current_time, gr.update(label=select_name), current_time, gr.update(choices=[setting.NEWCLASSIFICATION] + classification.get_list()) return gr.update(value=""), gr.update(value=""), current_time, gr.update(label=setting.NEWCLASSIFICATION), gr.update(visible=True), gr.update(choices=[setting.NEWCLASSIFICATION] + classification.get_list()) def on_sc_gallery_select(evt: gr.SelectData, Classification_name , shortcuts): sc_reload = setting.classification_preview_mode_disable clf = None current_time = datetime.datetime.now() if not Classification_name: return None, None, None if sc_reload else gr.update(show_label=False), current_time if sc_reload else gr.update(visible=False) if Classification_name == setting.NEWCLASSIFICATION: return None, None, None if sc_reload else gr.update(show_label=False), current_time if sc_reload else gr.update(visible=False) if Classification_name != setting.NEWCLASSIFICATION: clf = classification.get_classification(Classification_name) if not clf: return None, None, None if sc_reload else gr.update(show_label=False), current_time if sc_reload else gr.update(visible=False) if evt.value: shortcut = evt.value sc_model_id = setting.get_modelid_from_shortcutname(shortcut) if not shortcuts: shortcuts = list() if sc_model_id not in shortcuts: shortcuts.append(sc_model_id) return shortcuts, current_time, None if sc_reload else gr.update(show_label=False), current_time if sc_reload else gr.update(visible=False) return shortcuts, None, None if sc_reload else gr.update(show_label=False), current_time if sc_reload else gr.update(visible=False) def on_classification_gallery_loading(shortcuts): ISC = ishortcut.load() if not ISC: return None shotcutlist = list() if shortcuts: result_list = list() for mid in shortcuts: mid = str(mid) if mid in ISC: result_list.append(ISC[mid]) for v in result_list: if v: if ishortcut.is_sc_image(v['id']): shotcutlist.append((os.path.join(setting.shortcut_thumbnail_folder,f"{v['id']}{setting.preview_image_ext}"),setting.set_shortcutname(v['name'],v['id']))) else: shotcutlist.append((setting.no_card_preview_image,setting.set_shortcutname(v['name'],v['id']))) return shotcutlist def on_classification_gallery_select(evt: gr.SelectData, shortcuts): classification_reload = setting.classification_preview_mode_disable if evt.value: shortcut = evt.value sc_model_id = setting.get_modelid_from_shortcutname(shortcut) current_time = datetime.datetime.now() if not shortcuts: shortcuts = list() if sc_model_id in shortcuts: shortcuts.remove(sc_model_id) return shortcuts, current_time , None if classification_reload else gr.update(show_label=False) return shortcuts, None, None if classification_reload else gr.update(show_label=False) def on_classification_save_shortcut_btn_click(select_name, new_shortcuts): if select_name and select_name != setting.NEWCLASSIFICATION: classification.update_classification_shortcut(select_name,new_shortcuts) current_time = datetime.datetime.now() return current_time def on_classification_clear_shortcut_btn_click(): current_time = datetime.datetime.now() return None, current_time def on_classification_create_btn_click(new_name,new_info,classification_shortcuts): current_time = datetime.datetime.now() if classification.create_classification(new_name,new_info): return gr.update(choices=[setting.NEWCLASSIFICATION] + classification.get_list(), value=new_name), None, current_time, current_time,gr.update(label=new_name),\ gr.update(visible=False), gr.update(visible=True) return gr.update(choices=[setting.NEWCLASSIFICATION] + classification.get_list()), classification_shortcuts, current_time, current_time,gr.update(visible=True),\ gr.update(visible=True), gr.update(visible=False) def on_classification_update_btn_click(select_name, new_name, new_info): chg_name = setting.NEWCLASSIFICATION if select_name and select_name != setting.NEWCLASSIFICATION: # classification.update_classification_shortcut(select_name,new_shortcuts) if classification.update_classification(select_name,new_name,new_info): chg_name = new_name current_time = datetime.datetime.now() return gr.update(choices=[setting.NEWCLASSIFICATION] + classification.get_list(), value=chg_name),current_time, gr.update(label=chg_name) def on_classification_delete_btn_click(select_name): if select_name and select_name != setting.NEWCLASSIFICATION: classification.delete_classification(select_name) current_time = datetime.datetime.now() return gr.update(choices=[setting.NEWCLASSIFICATION] + classification.get_list(), value=setting.NEWCLASSIFICATION), None, current_time, current_time,gr.update(label=setting.NEWCLASSIFICATION),\ gr.update(visible=True), gr.update(visible=False) def on_classification_list_select(evt: gr.SelectData): if evt.value != setting.NEWCLASSIFICATION: select_name = evt.value info = classification.get_classification_info(select_name) shortcuts = classification.get_classification_shortcuts(select_name) current_time = datetime.datetime.now() return gr.update(value=select_name), gr.update(value=info), shortcuts, current_time, gr.update(label=select_name),\ gr.update(visible=False),gr.update(visible=True) return gr.update(value=""), gr.update(value=""), None, None, gr.update(label=setting.NEWCLASSIFICATION),\ gr.update(visible=True), gr.update(visible=False)