import os import math import gradio as gr import datetime from . import util from . import setting from . import ishortcut from . import classification from . import classification_browser_page def on_ui(shortcut_input): with gr.Row(visible=False): selected_classification_name = gr.Textbox() classification_shortcuts = gr.State() # classification_shortcuts_page = gr.State() refresh_gallery = gr.Textbox() refresh_classification = gr.Textbox() with gr.Column(scale=setting.shortcut_browser_screen_split_ratio): classification_new_btn = gr.Button(value="New Classification", variant="primary") with gr.Tabs(): with gr.TabItem("Classification List"): classification_list = gr.Dropdown(label='Classification List', multiselect=None, choices=classification.get_list(), value="" ,interactive=True) with gr.TabItem("Additional Shortcut Models"): sc_gallery, refresh_sc_browser, refresh_sc_gallery = classification_browser_page.on_ui(classification_shortcuts,False) 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: with gr.Row(): with gr.Column(): # with gr.Column(scale=4): classification_name = gr.Textbox(label="Name", value="",interactive=True, lines=1) with gr.Tabs() as classification_information_tabs: with gr.TabItem("Classification Shortcuts", id="Classification_Shortcuts"): with gr.Row(): with gr.Column(scale=4): classification_gallery_page = gr.Slider(minimum=1, maximum=1, value=1, step=1, label=f"Total {1} Pages", interactive=True, visible=True if setting.classification_gallery_rows_per_page > 0 else False) classification_shortcut_delete = gr.Checkbox(label="Delete from classification when selecting a thumbnail.", value=False) classification_gallery = gr.Gallery(elem_id="classification_gallery", show_label=False, columns=setting.classification_gallery_column, height="auto", object_fit=setting.gallery_thumbnail_image_style, preview=False, allow_preview=False) with gr.Accordion("#", open=True, visible=False) as shortcut_model_information: shortcut_modelid = gr.Textbox(visible=False) shortcut_modeltype = gr.Textbox(label="Model Type", interactive=False, lines=1) shortcut_versions = gr.Dropdown(label="Model Version",interactive=True) shortcut_filenames = gr.Dropdown(label="Version filename", interactive=True) shortcut_triger = gr.Textbox(label="Triger", interactive=True, lines=1) goto_model_info_btn = gr.Button(value="Information", variant="primary") delete_shortcut_model_btn = gr.Button(value="Delete", variant="primary") close_shortcut_model_information_btn = gr.Button(value="Close", variant="primary") with gr.Row(): classification_clear_shortcut_btn = gr.Button(value="Clear") classification_reload_shortcut_btn = gr.Button(value="Reload") with gr.TabItem("Classification Info"): classification_info = gr.Textbox(label="Description", value="",interactive=True, lines=7) with gr.Row(): 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") classification_gallery_page.release( fn = on_classification_gallery_page, inputs = [ classification_gallery_page ], outputs=[ refresh_gallery ] ) classification_new_btn.click( fn=on_classification_new_btn_click, inputs=None, outputs=[ selected_classification_name, classification_name, classification_info, classification_shortcuts, classification_gallery_page, shortcut_modelid, refresh_gallery, refresh_sc_browser, classification_title_name, classification_create_btn, classification_update_btn ] ) refresh_classification.change( fn=on_refresh_classification_change, inputs=[ selected_classification_name ], 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, classification_gallery_page ], outputs=[ classification_gallery, classification_gallery_page, refresh_sc_browser ], show_progress=False ) sc_gallery.select( fn=on_sc_gallery_select, inputs=[ classification_shortcuts, classification_gallery_page ], outputs=[ classification_shortcuts, classification_gallery_page, refresh_gallery, # sc_gallery, # refresh_sc_gallery, classification_information_tabs ], show_progress=False ) classification_gallery.select( fn=on_classification_gallery_select, inputs=[ classification_shortcuts, classification_shortcut_delete ], outputs=[ classification_shortcuts, refresh_gallery, classification_gallery, # 이거는 None으로 할 필요는 gallery를 미선택으로 만드는 방법을 몰라서 일단 이렇게 해보자 shortcut_modelid ], show_progress=False ) classification_create_btn.click( fn=on_classification_create_btn_click, inputs=[ classification_name, classification_info, classification_shortcuts, ], outputs=[ selected_classification_name, classification_list, refresh_sc_browser, classification_title_name, classification_create_btn, classification_update_btn ] ) classification_update_btn.click( fn=on_classification_update_btn_click, inputs=[ selected_classification_name, classification_name, classification_info, classification_shortcuts ], outputs=[ selected_classification_name, classification_list, refresh_sc_browser, classification_title_name ] ) classification_delete_btn.click( fn=on_classification_delete_btn_click, inputs=[ selected_classification_name ], outputs=[ selected_classification_name, classification_list, # classification_shortcuts, # refresh_gallery, refresh_sc_browser, classification_title_name, classification_create_btn, classification_update_btn ] ) classification_clear_shortcut_btn.click( fn=on_classification_clear_shortcut_btn_click, inputs=None, outputs=[ classification_shortcuts, classification_gallery_page, shortcut_modelid, refresh_gallery ] ) classification_reload_shortcut_btn.click( fn=on_classification_reload_shortcut_btn_click, inputs=[ selected_classification_name ], outputs=[ classification_shortcuts, classification_gallery_page, refresh_gallery ] ) classification_list.select( fn=on_classification_list_select, inputs=None, outputs=[ selected_classification_name, classification_name, classification_info, classification_shortcuts, classification_gallery_page, shortcut_modelid, refresh_gallery, refresh_sc_browser, classification_title_name, classification_create_btn, classification_update_btn ] ) shortcut_modelid.change( fn=on_shortcut_modelid_change, inputs=[ shortcut_modelid, ], outputs=[ shortcut_modeltype, shortcut_versions, shortcut_filenames, shortcut_triger, shortcut_model_information ], show_progress=False ) shortcut_versions.select( fn=on_shortcut_versions_select, inputs=[ shortcut_modelid, ], outputs=[ shortcut_modeltype, shortcut_versions, shortcut_filenames, shortcut_triger, shortcut_model_information ], show_progress=False ) goto_model_info_btn.click(lambda x:x,shortcut_modelid,shortcut_input) delete_shortcut_model_btn.click( fn=on_delete_shortcut_model_btn_click, inputs=[ shortcut_modelid, classification_shortcuts, ], outputs=[ classification_shortcuts, refresh_gallery, classification_gallery, shortcut_modelid ], show_progress=False ) close_shortcut_model_information_btn.click( fn=on_close_shortcut_model_information_btn_click, inputs=[ classification_shortcuts, ], outputs=[ classification_shortcuts, refresh_gallery, classification_gallery, shortcut_modelid ], show_progress=False ) return refresh_classification def load_model_information(modelid=None, ver_index=None): if modelid: model_info,version_info,versionid,version_name,model_type,model_basemodels,versions_list, dhtml, triger, files = ishortcut.get_model_information(modelid,None,ver_index) if model_info: flist = list() for file in files: flist.append(file['name']) file_name = '' if len(flist) > 0: file_name = flist[0] title_name = f"# {model_info['name']} : {version_name}" return gr.update(value=setting.get_ui_typename(model_type)), gr.update(choices=versions_list,value=version_name), gr.update(choices=flist,value=file_name), gr.update(value=triger), gr.update(label=title_name,visible=True) return None, None, None, gr.update(value=None), gr.update(label="#",visible=False) def on_shortcut_modelid_change(modelid=None): return load_model_information(modelid, None) def on_shortcut_versions_select(evt: gr.SelectData, modelid:str): return load_model_information(modelid, evt.index) def on_delete_shortcut_model_btn_click(sc_model_id:str, shortcuts): if sc_model_id: 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, None return shortcuts, gr.update(visible=False), gr.update(visible=True), gr.update(visible=False) def on_close_shortcut_model_information_btn_click(shortcuts): current_time = datetime.datetime.now() return shortcuts, current_time, None, None def get_shortcut_by_modelid(ISC, modelid): if ISC and modelid: try: return ISC[str(modelid)] except: pass return None def on_classification_gallery_page(page = 0): current_time = datetime.datetime.now() return current_time # shortcuts_list 에서 페이지 부분만 잘라서 리턴한다. def paging_classification_shortcuts_list(shortcuts_list, page = 0): total = 0 max_page = 1 shortlist = None result = None # shortcuts_list = classification.get_classification_shortcuts(select_name) if not shortcuts_list: return None, total, max_page if shortcuts_list: total = len(shortcuts_list) shortlist = shortcuts_list if total > 0: # page 즉 페이징이 아닌 전체가 필요할때도 총페이지 수를 구할때도 있으므로.. # page == 0 은 전체 리스트를 반환한다 shortcut_count_per_page = setting.classification_gallery_column * setting.classification_gallery_rows_per_page if shortcut_count_per_page > 0: max_page = math.ceil(total / shortcut_count_per_page) if page > max_page: page = max_page if page > 0 and shortcut_count_per_page > 0: item_start = shortcut_count_per_page * (page - 1) item_end = (shortcut_count_per_page * page) if total < item_end: item_end = total shortlist = shortcuts_list[item_start:item_end] result = shortlist return result, total, max_page, page def on_classification_new_btn_click(): current_time = datetime.datetime.now() return gr.update(value=""), gr.update(value=""), gr.update(value=""), None, gr.update(value=1, minimum=1, maximum=1, step=1, label=f"Total {1} Pages"), None, \ current_time, current_time, gr.update(label=setting.NEWCLASSIFICATION),gr.update(visible=True), gr.update(visible=False) def on_classification_reload_shortcut_btn_click(select_name): if select_name: shortcuts = classification.get_classification_shortcuts(select_name) current_time = datetime.datetime.now() return shortcuts, gr.update(value=1), current_time return None, gr.update(value=1, minimum=1, maximum=1, step=1, label=f"Total {1} Pages"), gr.update(visible=False) def on_refresh_classification_change(select_name): current_time = datetime.datetime.now() if select_name: 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=classification.get_list()) return gr.update(value=""), gr.update(value=""), current_time, gr.update(label=setting.NEWCLASSIFICATION), gr.update(visible=True), gr.update(choices=classification.get_list()) def on_sc_gallery_select(evt: gr.SelectData, shortcuts, page): current_time = datetime.datetime.now() 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) total = len(shortcuts) shortcut_count_per_page = setting.classification_gallery_column * setting.classification_gallery_rows_per_page if shortcut_count_per_page > 0: page = math.ceil(total / shortcut_count_per_page) return shortcuts, gr.update(value=page, maximum=page), current_time, gr.update(selected="Classification_Shortcuts") return shortcuts, gr.update(value=page), None, gr.update(selected="Classification_Shortcuts") def on_classification_gallery_loading(shortcuts, page=0): totals = 0 max_page = 1 cur_page = 1 ISC = ishortcut.load() if not ISC: return None, gr.update(minimum=1),gr.update(visible=False) result_list = None if shortcuts: # 현재 표시될 페이지 양만 잘라준다. shortcuts, totals, max_page, cur_page = paging_classification_shortcuts_list(shortcuts, page) result_list = list() for mid in shortcuts: if str(mid) in ISC.keys(): v = ISC[str(mid)] if ishortcut.is_sc_image(v['id']): if 'nsfw' in v.keys() and bool(v['nsfw']) and setting.NSFW_filtering_enable: result_list.append((setting.nsfw_disable_image,setting.set_shortcutname(v['name'],v['id']))) else: result_list.append((os.path.join(setting.shortcut_thumbnail_folder,f"{v['id']}{setting.preview_image_ext}"),setting.set_shortcutname(v['name'],v['id']))) else: result_list.append((setting.no_card_preview_image,setting.set_shortcutname(v['name'],v['id']))) else: result_list.append((setting.no_card_preview_image,setting.set_shortcutname("delete",mid))) current_time = datetime.datetime.now() return gr.update(value=result_list), gr.update(minimum=1, value=cur_page, maximum=max_page, step=1, label=f"Total {max_page} Pages"), current_time def on_classification_gallery_select(evt: gr.SelectData, shortcuts, delete_opt=True): 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 delete_opt and sc_model_id in shortcuts: shortcuts.remove(sc_model_id) return shortcuts, current_time, None, None return shortcuts, gr.update(visible=False), gr.update(visible=True), sc_model_id return shortcuts, gr.update(visible=False), gr.update(visible=True), None def on_classification_clear_shortcut_btn_click(): current_time = datetime.datetime.now() return None, gr.update(value=1, minimum=1, maximum=1, step=1, label=f"Total {1} Pages"), 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): classification.update_classification_shortcut(new_name, classification_shortcuts) return gr.update(value=new_name),\ gr.update(choices=classification.get_list(), value=new_name), current_time, gr.update(label=new_name),\ gr.update(visible=False), gr.update(visible=True) return gr.update(value=""),\ gr.update(choices=classification.get_list()), 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, classification_shortcuts): chg_name = setting.NEWCLASSIFICATION if select_name: # classification.update_classification_shortcut(select_name,new_shortcuts) if classification.update_classification(select_name,new_name,new_info): classification.update_classification_shortcut(new_name, classification_shortcuts) chg_name = new_name current_time = datetime.datetime.now() return gr.update(value=chg_name), gr.update(choices=classification.get_list(), value=chg_name),current_time, gr.update(label=chg_name) def on_classification_delete_btn_click(select_name): if select_name: classification.delete_classification(select_name) current_time = datetime.datetime.now() return gr.update(value=""), gr.update(choices=classification.get_list(), value=""), current_time,gr.update(label=setting.NEWCLASSIFICATION), gr.update(visible=True), gr.update(visible=False) def on_classification_list_select(evt: gr.SelectData): 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=select_name), gr.update(value=info), shortcuts, gr.update(value=1, minimum=1, maximum=1, step=1, label=f"Total {1} Pages"), None, current_time, current_time, gr.update(label=select_name),\ gr.update(visible=False),gr.update(visible=True)