civitai-shortcut/scripts/civitai_manager_libs/classification_action.py

323 lines
13 KiB
Python

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)