Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
@@ -187,7 +187,7 @@ def prompt_generator_app(data_manager):
|
|
187 |
# Add a refresh tags button
|
188 |
refresh_tags_button = gr.Button("Refresh Tags")
|
189 |
|
190 |
-
|
191 |
tag_displays = {}
|
192 |
for category_name, var_name in categories:
|
193 |
tags_list = data_manager.get_category_tags(var_name)
|
@@ -201,7 +201,7 @@ def prompt_generator_app(data_manager):
|
|
201 |
gr.Markdown(f"### {category_name}")
|
202 |
tag_display = gr.Markdown(f"**Tags:** {tags_string}")
|
203 |
tag_num = gr.Slider(minimum=0, maximum=max_tags, step=1, value=default_value, label=f"Number of {category_name} Tags to Select")
|
204 |
-
|
205 |
tag_displays[var_name] = (tag_display, tag_num)
|
206 |
|
207 |
# For Character Selection
|
@@ -222,11 +222,10 @@ def prompt_generator_app(data_manager):
|
|
222 |
|
223 |
refresh_characters_button = gr.Button("Refresh Character List")
|
224 |
|
225 |
-
|
226 |
-
|
227 |
-
|
228 |
-
|
229 |
-
refresh_characters_button.click(refresh_characters, outputs=character_select)
|
230 |
|
231 |
random_characters = gr.Checkbox(label="Select Random Characters")
|
232 |
num_characters = gr.Slider(minimum=1, maximum=10, step=1, value=1, label="Number of Characters (if random)")
|
@@ -323,7 +322,7 @@ def prompt_generator_app(data_manager):
|
|
323 |
# Prepare the list of inputs for the generate_prompt function
|
324 |
inputs_list = []
|
325 |
for category_name, var_name in categories:
|
326 |
-
inputs_list.append(
|
327 |
# Add character_select directly to inputs
|
328 |
inputs_list.extend([character_select, random_characters, num_characters])
|
329 |
|
@@ -364,158 +363,54 @@ def character_creation_app(data_manager):
|
|
364 |
save_button = gr.Button("Save Character")
|
365 |
output = gr.Textbox(label="Status", interactive=False)
|
366 |
|
367 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
368 |
if not name.strip() or not traits.strip() or not gender:
|
369 |
-
return "Please enter all fields."
|
|
|
370 |
# Check for duplicate names
|
371 |
existing_names = [char['name'] for char in data_manager.get_characters()]
|
372 |
if name in existing_names:
|
373 |
-
return f"Character with name '{name}' already exists. Please choose a different name."
|
374 |
|
375 |
character = {'name': name, 'traits': traits, 'gender': gender, 'image': image_path}
|
376 |
-
|
377 |
data_manager.add_character(character)
|
378 |
-
|
379 |
-
return f"Character '{name}' saved successfully."
|
380 |
|
381 |
save_button.click(
|
382 |
-
save_character,
|
383 |
-
inputs=[name_input, traits_input, image_input, gender_input
|
384 |
-
outputs=
|
385 |
)
|
386 |
|
387 |
-
# Divider
|
388 |
-
gr.Markdown("---")
|
389 |
-
|
390 |
# Display Existing Characters
|
391 |
-
gr.
|
392 |
-
|
393 |
-
|
394 |
-
|
|
|
|
|
395 |
|
396 |
-
|
397 |
-
|
398 |
-
if not characters:
|
399 |
-
return gr.Markdown("No characters created yet.")
|
400 |
-
|
401 |
-
components = []
|
402 |
-
for char in characters:
|
403 |
-
with gr.Accordion(label=char['name'], open=False):
|
404 |
-
with gr.Row():
|
405 |
-
if char['image']:
|
406 |
-
img_display = gr.Image(value=char['image'], label="Character Image", type="filepath", interactive=False)
|
407 |
-
else:
|
408 |
-
img_display = gr.Markdown("**No Image Provided**")
|
409 |
-
with gr.Column():
|
410 |
-
gr.Markdown(f"**Name:** {char['name']}").render()
|
411 |
-
gr.Markdown(f"**Gender:** {char['gender']}").render()
|
412 |
-
gr.Markdown(f"**Traits:** {', '.join(char['traits'])}").render()
|
413 |
-
with gr.Row():
|
414 |
-
edit_btn = gr.Button("Edit", variant="primary")
|
415 |
-
delete_btn = gr.Button("Delete", variant="secondary")
|
416 |
-
edit_output = gr.Textbox(label="", interactive=False, visible=False)
|
417 |
-
delete_output = gr.Textbox(label="", interactive=False, visible=False)
|
418 |
-
|
419 |
-
# Edit Interface (initially hidden)
|
420 |
-
edit_interface = gr.Column(visible=False)
|
421 |
-
with edit_interface:
|
422 |
-
with gr.Row():
|
423 |
-
edit_name = gr.Textbox(label="Character Name", value=char['name'], placeholder="Enter new name")
|
424 |
-
edit_traits = gr.Textbox(label="Traits/Appearance Tags (comma separated)", value=', '.join(char['traits']), placeholder="e.g., red hair, blue eyes")
|
425 |
-
edit_image = gr.Image(label="Upload New Character Image", type="filepath")
|
426 |
-
edit_gender = gr.Radio(choices=["Boy", "Girl"], label="Gender", value=char['gender'])
|
427 |
-
save_edit_btn = gr.Button("Save Changes")
|
428 |
-
save_edit_output = gr.Textbox(label="Edit Status", interactive=False)
|
429 |
-
|
430 |
-
def save_edit(original_name, new_name, new_traits, new_image_path, new_gender):
|
431 |
-
if not new_name.strip() or not new_traits.strip() or not new_gender:
|
432 |
-
return "Please enter all fields.", None
|
433 |
-
# If the name has changed, check for duplicates
|
434 |
-
if new_name != original_name:
|
435 |
-
existing_names = [c['name'] for c in data_manager.get_characters()]
|
436 |
-
if new_name in existing_names:
|
437 |
-
return f"Character with name '{new_name}' already exists. Please choose a different name.", None
|
438 |
-
updated_char = {
|
439 |
-
'name': new_name,
|
440 |
-
'traits': new_traits,
|
441 |
-
'gender': new_gender,
|
442 |
-
'image': new_image_path if new_image_path else data_manager.characters[[c['name'] for c in data_manager.get_characters()].index(original_name)]['image']
|
443 |
-
}
|
444 |
-
success = data_manager.update_character(original_name, updated_char)
|
445 |
-
if success:
|
446 |
-
return f"Character '{new_name}' updated successfully.", list_characters(data_manager)
|
447 |
-
else:
|
448 |
-
return "Failed to update character.", None
|
449 |
-
|
450 |
-
save_edit_btn.click(
|
451 |
-
save_edit,
|
452 |
-
inputs=[gr.State(char['name']), edit_name, edit_traits, edit_image, edit_gender],
|
453 |
-
outputs=[save_edit_output, "characters_renderer"]
|
454 |
-
)
|
455 |
-
|
456 |
-
# Define edit functionality
|
457 |
-
def toggle_edit_visibility():
|
458 |
-
return gr.update(visible=True)
|
459 |
-
|
460 |
-
edit_btn.click(
|
461 |
-
lambda: True,
|
462 |
-
inputs=None,
|
463 |
-
outputs=edit_interface
|
464 |
-
)
|
465 |
-
|
466 |
-
# Define delete functionality
|
467 |
-
def confirm_delete(char_name):
|
468 |
-
return f"Are you sure you want to delete '{char_name}'?", True
|
469 |
-
|
470 |
-
def perform_delete(char_name, confirm):
|
471 |
-
if confirm:
|
472 |
-
success = data_manager.delete_character(char_name)
|
473 |
-
if success:
|
474 |
-
return f"Character '{char_name}' deleted successfully.", list_characters(data_manager)
|
475 |
-
else:
|
476 |
-
return f"Failed to delete character '{char_name}'.", None
|
477 |
-
return "Deletion cancelled.", None
|
478 |
-
|
479 |
-
delete_btn.click(
|
480 |
-
confirm_delete,
|
481 |
-
inputs=[char['name']],
|
482 |
-
outputs=[delete_output, delete_output]
|
483 |
-
)
|
484 |
-
|
485 |
-
delete_confirm = gr.Button("Confirm Delete", visible=False)
|
486 |
-
delete_cancel = gr.Button("Cancel Delete", visible=False)
|
487 |
-
|
488 |
-
# Show confirmation buttons when delete is clicked
|
489 |
-
def show_delete_buttons(message):
|
490 |
-
if "Are you sure" in message:
|
491 |
-
return gr.update(visible=True), gr.update(visible=True)
|
492 |
-
return gr.update(visible=False), gr.update(visible=False)
|
493 |
-
|
494 |
-
delete_btn.click(
|
495 |
-
show_delete_buttons,
|
496 |
-
inputs=[delete_output],
|
497 |
-
outputs=[delete_confirm, delete_cancel]
|
498 |
-
)
|
499 |
-
|
500 |
-
# Handle delete confirmation
|
501 |
-
delete_confirm.click(
|
502 |
-
perform_delete,
|
503 |
-
inputs=[char['name'], gr.Checkbox(label="", value=True)],
|
504 |
-
outputs=[delete_output, "characters_renderer"]
|
505 |
-
)
|
506 |
-
|
507 |
-
# Handle delete cancellation
|
508 |
-
delete_cancel.click(
|
509 |
-
lambda: ("Deletion cancelled.", None),
|
510 |
-
inputs=None,
|
511 |
-
outputs=[delete_output, "characters_renderer"]
|
512 |
-
)
|
513 |
-
return components
|
514 |
-
|
515 |
-
def list_characters_render():
|
516 |
-
return list_characters(data_manager)
|
517 |
-
|
518 |
-
characters_renderer.render(list_characters(data_manager))
|
519 |
|
520 |
def tags_app(data_manager):
|
521 |
with gr.Tab("Tags"):
|
@@ -546,12 +441,12 @@ def tags_app(data_manager):
|
|
546 |
save_persistent_tags_button = gr.Button("Save Persistent Tags")
|
547 |
persistent_status_output = gr.Textbox(label="", interactive=False)
|
548 |
|
549 |
-
def
|
550 |
tags_list = [t.strip() for t in tags_string.split(',') if t.strip()]
|
551 |
data_manager.set_persistent_tags(tags_list)
|
552 |
return "Persistent tags saved successfully."
|
553 |
|
554 |
-
save_persistent_tags_button.click(
|
555 |
|
556 |
def main():
|
557 |
data_manager = DataManager(base_dir='/data')
|
|
|
187 |
# Add a refresh tags button
|
188 |
refresh_tags_button = gr.Button("Refresh Tags")
|
189 |
|
190 |
+
inputs_sliders = {}
|
191 |
tag_displays = {}
|
192 |
for category_name, var_name in categories:
|
193 |
tags_list = data_manager.get_category_tags(var_name)
|
|
|
201 |
gr.Markdown(f"### {category_name}")
|
202 |
tag_display = gr.Markdown(f"**Tags:** {tags_string}")
|
203 |
tag_num = gr.Slider(minimum=0, maximum=max_tags, step=1, value=default_value, label=f"Number of {category_name} Tags to Select")
|
204 |
+
inputs_sliders[var_name + '_num'] = tag_num
|
205 |
tag_displays[var_name] = (tag_display, tag_num)
|
206 |
|
207 |
# For Character Selection
|
|
|
222 |
|
223 |
refresh_characters_button = gr.Button("Refresh Character List")
|
224 |
|
225 |
+
refresh_characters_button.click(
|
226 |
+
lambda: get_character_options(),
|
227 |
+
outputs=character_select
|
228 |
+
)
|
|
|
229 |
|
230 |
random_characters = gr.Checkbox(label="Select Random Characters")
|
231 |
num_characters = gr.Slider(minimum=1, maximum=10, step=1, value=1, label="Number of Characters (if random)")
|
|
|
322 |
# Prepare the list of inputs for the generate_prompt function
|
323 |
inputs_list = []
|
324 |
for category_name, var_name in categories:
|
325 |
+
inputs_list.append(inputs_sliders[f"{var_name}_num"])
|
326 |
# Add character_select directly to inputs
|
327 |
inputs_list.extend([character_select, random_characters, num_characters])
|
328 |
|
|
|
363 |
save_button = gr.Button("Save Character")
|
364 |
output = gr.Textbox(label="Status", interactive=False)
|
365 |
|
366 |
+
characters_renderer = gr.HTML(label="Existing Characters")
|
367 |
+
|
368 |
+
def list_characters():
|
369 |
+
characters = data_manager.get_characters()
|
370 |
+
if not characters:
|
371 |
+
return "<p>No characters created yet.</p>"
|
372 |
+
|
373 |
+
html_content = ""
|
374 |
+
for char in characters:
|
375 |
+
html_content += f"""
|
376 |
+
<div style="border:1px solid #ccc; padding:10px; margin-bottom:10px;">
|
377 |
+
<h3>{char['name']}</h3>
|
378 |
+
<p><strong>Gender:</strong> {char['gender']}</p>
|
379 |
+
<p><strong>Traits:</strong> {', '.join(char['traits'])}</p>
|
380 |
+
</div>
|
381 |
+
"""
|
382 |
+
return html_content
|
383 |
+
|
384 |
+
def save_character(name, traits, image_path, gender):
|
385 |
if not name.strip() or not traits.strip() or not gender:
|
386 |
+
return "Please enter all fields."
|
387 |
+
|
388 |
# Check for duplicate names
|
389 |
existing_names = [char['name'] for char in data_manager.get_characters()]
|
390 |
if name in existing_names:
|
391 |
+
return f"Character with name '{name}' already exists. Please choose a different name."
|
392 |
|
393 |
character = {'name': name, 'traits': traits, 'gender': gender, 'image': image_path}
|
|
|
394 |
data_manager.add_character(character)
|
395 |
+
|
396 |
+
return f"Character '{name}' saved successfully."
|
397 |
|
398 |
save_button.click(
|
399 |
+
save_character,
|
400 |
+
inputs=[name_input, traits_input, image_input, gender_input],
|
401 |
+
outputs=output
|
402 |
)
|
403 |
|
|
|
|
|
|
|
404 |
# Display Existing Characters
|
405 |
+
refresh_characters_button = gr.Button("Refresh Characters")
|
406 |
+
refresh_characters_button.click(
|
407 |
+
lambda: list_characters(),
|
408 |
+
inputs=None,
|
409 |
+
outputs=characters_renderer
|
410 |
+
)
|
411 |
|
412 |
+
# Initial load of characters
|
413 |
+
characters_renderer.render(list_characters())
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
414 |
|
415 |
def tags_app(data_manager):
|
416 |
with gr.Tab("Tags"):
|
|
|
441 |
save_persistent_tags_button = gr.Button("Save Persistent Tags")
|
442 |
persistent_status_output = gr.Textbox(label="", interactive=False)
|
443 |
|
444 |
+
def save_persistent_tags(tags_string):
|
445 |
tags_list = [t.strip() for t in tags_string.split(',') if t.strip()]
|
446 |
data_manager.set_persistent_tags(tags_list)
|
447 |
return "Persistent tags saved successfully."
|
448 |
|
449 |
+
save_persistent_tags_button.click(save_persistent_tags, inputs=persistent_tags_input, outputs=persistent_status_output)
|
450 |
|
451 |
def main():
|
452 |
data_manager = DataManager(base_dir='/data')
|