Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
@@ -5,6 +5,7 @@ import random
|
|
5 |
from PIL import Image
|
6 |
import base64
|
7 |
import io
|
|
|
8 |
|
9 |
# Define categories at the top so they are accessible throughout the code
|
10 |
categories = [
|
@@ -107,7 +108,7 @@ class DataManager:
|
|
107 |
image_path = os.path.join(self.images_folder, image_filename)
|
108 |
|
109 |
# Save the image if provided
|
110 |
-
if
|
111 |
try:
|
112 |
# Open and save the uploaded image to the images folder
|
113 |
image = Image.open(image_data)
|
@@ -134,7 +135,7 @@ class DataManager:
|
|
134 |
for idx, char in enumerate(self.characters):
|
135 |
if char['name'] == original_name:
|
136 |
# Handle image update
|
137 |
-
if updated_character['image']:
|
138 |
image_data = updated_character['image'] # File path
|
139 |
safe_name = "".join(c for c in updated_character['name'] if c.isalnum() or c in (' ', '_', '-')).rstrip()
|
140 |
image_filename = f"{safe_name}.png"
|
@@ -200,7 +201,13 @@ def prompt_generator_app(data_manager):
|
|
200 |
with gr.Group():
|
201 |
gr.Markdown(f"### {category_name}")
|
202 |
tag_display = gr.Markdown(f"**Tags:** {tags_string}")
|
203 |
-
tag_num = gr.Slider(
|
|
|
|
|
|
|
|
|
|
|
|
|
204 |
inputs_sliders[var_name + '_num'] = tag_num
|
205 |
tag_displays[var_name] = (tag_display, tag_num)
|
206 |
|
@@ -218,17 +225,31 @@ def prompt_generator_app(data_manager):
|
|
218 |
return character_options
|
219 |
|
220 |
character_options = get_character_options()
|
221 |
-
character_select = gr.CheckboxGroup(
|
|
|
|
|
|
|
|
|
222 |
|
223 |
refresh_characters_button = gr.Button("Refresh Character List")
|
224 |
|
|
|
|
|
|
|
|
|
225 |
refresh_characters_button.click(
|
226 |
-
|
227 |
outputs=character_select
|
228 |
)
|
229 |
|
230 |
random_characters = gr.Checkbox(label="Select Random Characters")
|
231 |
-
num_characters = gr.Slider(
|
|
|
|
|
|
|
|
|
|
|
|
|
232 |
|
233 |
generate_button = gr.Button("Generate Prompt")
|
234 |
prompt_output = gr.Textbox(label="Generated Prompt", lines=5)
|
@@ -342,8 +363,8 @@ def prompt_generator_app(data_manager):
|
|
342 |
slider_value = min(1, max_tags)
|
343 |
# Update the tag display and slider
|
344 |
tag_display, tag_num = tag_displays[var_name]
|
345 |
-
updates.append(
|
346 |
-
updates.append(
|
347 |
return updates
|
348 |
|
349 |
# Prepare the outputs list
|
@@ -355,10 +376,17 @@ def prompt_generator_app(data_manager):
|
|
355 |
def character_creation_app(data_manager):
|
356 |
with gr.Tab("Character Creation"):
|
357 |
gr.Markdown("## Create and Manage Characters")
|
|
|
358 |
# **Section 1: Create a New Character**
|
359 |
with gr.Row():
|
360 |
-
name_input = gr.Textbox(
|
361 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
362 |
image_input = gr.Image(label="Upload Character Image", type="filepath")
|
363 |
gender_input = gr.Radio(choices=["Boy", "Girl"], label="Gender")
|
364 |
save_button = gr.Button("Save Character")
|
@@ -371,7 +399,11 @@ def character_creation_app(data_manager):
|
|
371 |
# Dropdown to select a character for editing or deleting
|
372 |
characters = data_manager.get_characters()
|
373 |
character_names = [char['name'] for char in characters]
|
374 |
-
selected_character = gr.Dropdown(
|
|
|
|
|
|
|
|
|
375 |
|
376 |
# Buttons for Edit and Delete
|
377 |
edit_button = gr.Button("Edit Selected Character")
|
@@ -379,17 +411,31 @@ def character_creation_app(data_manager):
|
|
379 |
action_output = gr.Textbox(label="Action Status", interactive=False)
|
380 |
|
381 |
# **Section 3: Edit Character**
|
382 |
-
edit_section = gr.
|
383 |
with edit_section:
|
384 |
-
|
385 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
386 |
edit_image = gr.Image(label="Upload New Character Image", type="filepath")
|
387 |
-
edit_gender = gr.Radio(
|
|
|
|
|
|
|
388 |
update_button = gr.Button("Update Character")
|
389 |
update_output = gr.Textbox(label="Update Status", interactive=False)
|
390 |
|
391 |
# **Section 4: Delete Confirmation**
|
392 |
-
delete_confirmation = gr.Textbox(
|
|
|
|
|
|
|
|
|
393 |
confirm_delete_button = gr.Button("Confirm Delete", visible=False)
|
394 |
cancel_delete_button = gr.Button("Cancel Delete", visible=False)
|
395 |
|
@@ -416,7 +462,15 @@ def character_creation_app(data_manager):
|
|
416 |
def show_edit(selected_name):
|
417 |
if not selected_name:
|
418 |
return "Please select a character to edit.", gr.update(visible=False)
|
419 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
420 |
|
421 |
edit_button.click(
|
422 |
show_edit,
|
@@ -437,7 +491,8 @@ def character_creation_app(data_manager):
|
|
437 |
'name': new_name,
|
438 |
'traits': new_traits,
|
439 |
'gender': new_gender,
|
440 |
-
'image': new_image_path if new_image_path else
|
|
|
441 |
}
|
442 |
success = data_manager.update_character(original_name, updated_char)
|
443 |
if success:
|
@@ -465,7 +520,7 @@ def character_creation_app(data_manager):
|
|
465 |
|
466 |
# **Function to Perform Deletion**
|
467 |
def perform_deletion(selected_name, confirmation):
|
468 |
-
if confirmation != "YES":
|
469 |
return "Deletion cancelled.", gr.update(visible=False), gr.update(visible=False)
|
470 |
success = data_manager.delete_character(selected_name)
|
471 |
if success:
|
@@ -497,7 +552,10 @@ def tags_app(data_manager):
|
|
497 |
gr.Markdown(f"### {category_name} Tags")
|
498 |
tags_list = data_manager.get_category_tags(var_name)
|
499 |
tags_string = ', '.join(tags_list)
|
500 |
-
tag_input = gr.Textbox(
|
|
|
|
|
|
|
501 |
save_button = gr.Button(f"Save {category_name} Tags")
|
502 |
status_output = gr.Textbox(label="", interactive=False)
|
503 |
|
@@ -514,7 +572,10 @@ def tags_app(data_manager):
|
|
514 |
# Persistent Tags
|
515 |
gr.Markdown(f"### Persistent Tags")
|
516 |
persistent_tags_string = ', '.join(data_manager.get_persistent_tags())
|
517 |
-
persistent_tags_input = gr.Textbox(
|
|
|
|
|
|
|
518 |
save_persistent_tags_button = gr.Button("Save Persistent Tags")
|
519 |
persistent_status_output = gr.Textbox(label="", interactive=False)
|
520 |
|
@@ -523,7 +584,11 @@ def tags_app(data_manager):
|
|
523 |
data_manager.set_persistent_tags(tags_list)
|
524 |
return "Persistent tags saved successfully."
|
525 |
|
526 |
-
save_persistent_tags_button.click(
|
|
|
|
|
|
|
|
|
527 |
|
528 |
def main():
|
529 |
data_manager = DataManager(base_dir='/data')
|
|
|
5 |
from PIL import Image
|
6 |
import base64
|
7 |
import io
|
8 |
+
from functools import partial
|
9 |
|
10 |
# Define categories at the top so they are accessible throughout the code
|
11 |
categories = [
|
|
|
108 |
image_path = os.path.join(self.images_folder, image_filename)
|
109 |
|
110 |
# Save the image if provided
|
111 |
+
if image_data and os.path.exists(image_data):
|
112 |
try:
|
113 |
# Open and save the uploaded image to the images folder
|
114 |
image = Image.open(image_data)
|
|
|
135 |
for idx, char in enumerate(self.characters):
|
136 |
if char['name'] == original_name:
|
137 |
# Handle image update
|
138 |
+
if updated_character['image'] and os.path.exists(updated_character['image']):
|
139 |
image_data = updated_character['image'] # File path
|
140 |
safe_name = "".join(c for c in updated_character['name'] if c.isalnum() or c in (' ', '_', '-')).rstrip()
|
141 |
image_filename = f"{safe_name}.png"
|
|
|
201 |
with gr.Group():
|
202 |
gr.Markdown(f"### {category_name}")
|
203 |
tag_display = gr.Markdown(f"**Tags:** {tags_string}")
|
204 |
+
tag_num = gr.Slider(
|
205 |
+
minimum=0,
|
206 |
+
maximum=max_tags,
|
207 |
+
step=1,
|
208 |
+
value=default_value,
|
209 |
+
label=f"Number of {category_name} Tags to Select"
|
210 |
+
)
|
211 |
inputs_sliders[var_name + '_num'] = tag_num
|
212 |
tag_displays[var_name] = (tag_display, tag_num)
|
213 |
|
|
|
225 |
return character_options
|
226 |
|
227 |
character_options = get_character_options()
|
228 |
+
character_select = gr.CheckboxGroup(
|
229 |
+
choices=character_options,
|
230 |
+
label="Select Characters",
|
231 |
+
interactive=True
|
232 |
+
)
|
233 |
|
234 |
refresh_characters_button = gr.Button("Refresh Character List")
|
235 |
|
236 |
+
def refresh_character_selection():
|
237 |
+
new_options = get_character_options()
|
238 |
+
return gr.CheckboxGroup.update(choices=new_options)
|
239 |
+
|
240 |
refresh_characters_button.click(
|
241 |
+
refresh_character_selection,
|
242 |
outputs=character_select
|
243 |
)
|
244 |
|
245 |
random_characters = gr.Checkbox(label="Select Random Characters")
|
246 |
+
num_characters = gr.Slider(
|
247 |
+
minimum=1,
|
248 |
+
maximum=10,
|
249 |
+
step=1,
|
250 |
+
value=1,
|
251 |
+
label="Number of Characters (if random)"
|
252 |
+
)
|
253 |
|
254 |
generate_button = gr.Button("Generate Prompt")
|
255 |
prompt_output = gr.Textbox(label="Generated Prompt", lines=5)
|
|
|
363 |
slider_value = min(1, max_tags)
|
364 |
# Update the tag display and slider
|
365 |
tag_display, tag_num = tag_displays[var_name]
|
366 |
+
updates.append(tag_display.update(value=f"**Tags:** {tags_string}"))
|
367 |
+
updates.append(tag_num.update(maximum=max_tags, value=slider_value))
|
368 |
return updates
|
369 |
|
370 |
# Prepare the outputs list
|
|
|
376 |
def character_creation_app(data_manager):
|
377 |
with gr.Tab("Character Creation"):
|
378 |
gr.Markdown("## Create and Manage Characters")
|
379 |
+
|
380 |
# **Section 1: Create a New Character**
|
381 |
with gr.Row():
|
382 |
+
name_input = gr.Textbox(
|
383 |
+
label="Character Name",
|
384 |
+
placeholder="Enter unique character name"
|
385 |
+
)
|
386 |
+
traits_input = gr.Textbox(
|
387 |
+
label="Traits/Appearance Tags (comma separated)",
|
388 |
+
placeholder="e.g., blue hair, green eyes, tall"
|
389 |
+
)
|
390 |
image_input = gr.Image(label="Upload Character Image", type="filepath")
|
391 |
gender_input = gr.Radio(choices=["Boy", "Girl"], label="Gender")
|
392 |
save_button = gr.Button("Save Character")
|
|
|
399 |
# Dropdown to select a character for editing or deleting
|
400 |
characters = data_manager.get_characters()
|
401 |
character_names = [char['name'] for char in characters]
|
402 |
+
selected_character = gr.Dropdown(
|
403 |
+
choices=character_names,
|
404 |
+
label="Select a Character to Edit/Delete",
|
405 |
+
interactive=True
|
406 |
+
)
|
407 |
|
408 |
# Buttons for Edit and Delete
|
409 |
edit_button = gr.Button("Edit Selected Character")
|
|
|
411 |
action_output = gr.Textbox(label="Action Status", interactive=False)
|
412 |
|
413 |
# **Section 3: Edit Character**
|
414 |
+
edit_section = gr.Column(visible=False)
|
415 |
with edit_section:
|
416 |
+
with gr.Row():
|
417 |
+
edit_name = gr.Textbox(
|
418 |
+
label="New Character Name",
|
419 |
+
placeholder="Enter new character name"
|
420 |
+
)
|
421 |
+
edit_traits = gr.Textbox(
|
422 |
+
label="New Traits/Appearance Tags (comma separated)",
|
423 |
+
placeholder="e.g., red hair, blue eyes"
|
424 |
+
)
|
425 |
edit_image = gr.Image(label="Upload New Character Image", type="filepath")
|
426 |
+
edit_gender = gr.Radio(
|
427 |
+
choices=["Boy", "Girl"],
|
428 |
+
label="Gender"
|
429 |
+
)
|
430 |
update_button = gr.Button("Update Character")
|
431 |
update_output = gr.Textbox(label="Update Status", interactive=False)
|
432 |
|
433 |
# **Section 4: Delete Confirmation**
|
434 |
+
delete_confirmation = gr.Textbox(
|
435 |
+
label="Are you sure you want to delete this character? Type 'YES' to confirm.",
|
436 |
+
interactive=True,
|
437 |
+
visible=False
|
438 |
+
)
|
439 |
confirm_delete_button = gr.Button("Confirm Delete", visible=False)
|
440 |
cancel_delete_button = gr.Button("Cancel Delete", visible=False)
|
441 |
|
|
|
462 |
def show_edit(selected_name):
|
463 |
if not selected_name:
|
464 |
return "Please select a character to edit.", gr.update(visible=False)
|
465 |
+
# Fetch character details
|
466 |
+
character = next((char for char in data_manager.get_characters() if char['name'] == selected_name), None)
|
467 |
+
if character:
|
468 |
+
edit_name_value = character['name']
|
469 |
+
edit_traits_value = ', '.join(character['traits'])
|
470 |
+
edit_gender_value = character['gender']
|
471 |
+
return "", gr.update(visible=True)
|
472 |
+
else:
|
473 |
+
return f"Character '{selected_name}' not found.", gr.update(visible=False)
|
474 |
|
475 |
edit_button.click(
|
476 |
show_edit,
|
|
|
491 |
'name': new_name,
|
492 |
'traits': new_traits,
|
493 |
'gender': new_gender,
|
494 |
+
'image': new_image_path if new_image_path else \
|
495 |
+
next((char['image'] for char in data_manager.get_characters() if char['name'] == original_name), None)
|
496 |
}
|
497 |
success = data_manager.update_character(original_name, updated_char)
|
498 |
if success:
|
|
|
520 |
|
521 |
# **Function to Perform Deletion**
|
522 |
def perform_deletion(selected_name, confirmation):
|
523 |
+
if confirmation.strip().upper() != "YES":
|
524 |
return "Deletion cancelled.", gr.update(visible=False), gr.update(visible=False)
|
525 |
success = data_manager.delete_character(selected_name)
|
526 |
if success:
|
|
|
552 |
gr.Markdown(f"### {category_name} Tags")
|
553 |
tags_list = data_manager.get_category_tags(var_name)
|
554 |
tags_string = ', '.join(tags_list)
|
555 |
+
tag_input = gr.Textbox(
|
556 |
+
label=f"{category_name} Tags (comma separated)",
|
557 |
+
value=tags_string
|
558 |
+
)
|
559 |
save_button = gr.Button(f"Save {category_name} Tags")
|
560 |
status_output = gr.Textbox(label="", interactive=False)
|
561 |
|
|
|
572 |
# Persistent Tags
|
573 |
gr.Markdown(f"### Persistent Tags")
|
574 |
persistent_tags_string = ', '.join(data_manager.get_persistent_tags())
|
575 |
+
persistent_tags_input = gr.Textbox(
|
576 |
+
label="Persistent Tags (comma separated)",
|
577 |
+
value=persistent_tags_string
|
578 |
+
)
|
579 |
save_persistent_tags_button = gr.Button("Save Persistent Tags")
|
580 |
persistent_status_output = gr.Textbox(label="", interactive=False)
|
581 |
|
|
|
584 |
data_manager.set_persistent_tags(tags_list)
|
585 |
return "Persistent tags saved successfully."
|
586 |
|
587 |
+
save_persistent_tags_button.click(
|
588 |
+
save_persistent_tags_fn,
|
589 |
+
inputs=persistent_tags_input,
|
590 |
+
outputs=persistent_status_output
|
591 |
+
)
|
592 |
|
593 |
def main():
|
594 |
data_manager = DataManager(base_dir='/data')
|