| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- from pathlib import Path
- import gradio as gr
- from modules.html_generator import get_image_cache
- from modules.chat import load_character
- from modules.shared import gradio, settings
- def generate_css():
- css = """
- .character-gallery > .gallery {
- margin: 1rem 0;
- display: grid !important;
- grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
- grid-column-gap: 0.4rem;
- grid-row-gap: 1.2rem;
- }
- .character-gallery > .label {
- display: none !important;
- }
- .character-gallery button.gallery-item {
- display: contents;
- }
- .character-container {
- cursor: pointer;
- text-align: center;
- position: relative;
- opacity: 0.85;
- }
- .character-container:hover {
- opacity: 1;
- }
- .character-container .placeholder, .character-container img {
- width: 150px;
- height: 200px;
- background-color: gray;
- object-fit: cover;
- margin: 0 auto;
- border-radius: 1rem;
- border: 3px solid white;
- box-shadow: 3px 3px 6px 0px rgb(0 0 0 / 50%);
- }
- .character-name {
- margin-top: 0.3rem;
- display: block;
- font-size: 1.2rem;
- font-weight: 600;
- overflow-wrap: anywhere;
- }
- """
- return css
- def generate_html():
- cards = []
- # Iterate through files in image folder
- for file in sorted(Path("characters").glob("*")):
- if file.name.endswith(".json"):
- character = file.name.replace(".json", "")
- container_html = f'<div class="character-container">'
- image_html = "<div class='placeholder'></div>"
- for i in [
- f"characters/{character}.png",
- f"characters/{character}.jpg",
- f"characters/{character}.jpeg",
- ]:
- path = Path(i)
- if path.exists():
- try:
- image_html = f'<img src="file/{get_image_cache(path)}">'
- break
- except:
- continue
- container_html += f'{image_html} <span class="character-name">{character}</span>'
- container_html += "</div>"
- cards.append([container_html, character])
- return cards
- def select_character(evt: gr.SelectData):
- return (evt.value[1])
- def ui():
- with gr.Accordion("Character gallery", open=False):
- update = gr.Button("Refresh")
- gr.HTML(value="<style>"+generate_css()+"</style>")
- gallery = gr.Dataset(components=[gr.HTML(visible=False)],
- label="",
- samples=generate_html(),
- elem_classes=["character-gallery"],
- samples_per_page=50
- )
- update.click(generate_html, [], gallery)
- gallery.select(select_character, None, gradio['character_menu'])
|