File size: 4,832 Bytes
b026171
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# image_column.py
import streamlit as st
import utils  # Import utils to use the generation function
import time  # Import time for unique keys if needed


def render_image_column(st, image_client):
    """Renders the image prompt editing and generation column."""

    st.header("🖼️ Image Generation")

    if not image_client:
        st.warning(
            "Together API Key not configured. Cannot generate images.", icon="⚠️")
        # Keep the text area visible even if client is missing

    # --- Editable Text Area for Image Prompt ---
    # This part remains mostly the same
    prompt_for_image_area = st.text_area(
        "Editable Image Prompt:",
        value=st.session_state.get(
            "current_image_prompt_text", ""),  # Use .get for safety
        height=150,  # Adjusted height slightly
        key="image_prompt_input_area",  # Key is crucial for statefulness
        help="Edit or enter the prompt for image generation."
    )
    # Update session state based on text area input (Streamlit does this automatically via key)
    # Make sure this state is explicitly updated IF the text area content changes
    # Streamlit handles this via the key, but we read it directly when needed.
    st.session_state.current_image_prompt_text = prompt_for_image_area

    # --- Generate Button ---
    is_disabled = (not image_client) or (
        len(st.session_state.current_image_prompt_text.strip()) == 0)

    if st.button("Generate Image ✨", key="generate_image_main_col", use_container_width=True,
                 disabled=is_disabled):
        prompt_to_use = st.session_state.current_image_prompt_text
        if len(prompt_to_use.strip()) > 0:  # Double check prompt isn't empty
            with st.spinner("Generating image via Together API..."):
                image_bytes = utils.generate_image_from_prompt(
                    image_client, prompt_to_use)

            if image_bytes:
                # --- MODIFICATION START ---
                # Create a dictionary holding the prompt and image bytes
                new_image_data = {
                    "prompt": prompt_to_use,
                    "image": image_bytes
                }
                # Prepend the new image data to the list (newest first)
                st.session_state.generated_images_list.insert(
                    0, new_image_data)
                # --- MODIFICATION END ---
                # No need to set latest_generated_image anymore
                # Show success message immediately
                st.success("Image generated!")
                # Rerun to update the display list below
                st.rerun()
            else:
                st.error("Image generation failed.")
                # No need to clear latest_generated_image
        else:
            st.warning(
                "Please enter a prompt in the text area above before generating.", icon="⚠️")

    # --- Display Generated Images (Below Button) ---
    st.markdown("---")  # Add a visual separator

    if not st.session_state.generated_images_list:
        if image_client and len(st.session_state.current_image_prompt_text.strip()) > 0:
            st.markdown(
                "Click the 'Generate Image' button above to create an image.")
        elif image_client:
            st.markdown("Enter a prompt above and click 'Generate Image'.")
        # If no client, the warning at the top handles it.

    else:
        st.subheader("Generated Images")
        # Iterate through the list and display each image with its prompt
        for index, image_data in enumerate(st.session_state.generated_images_list):
            st.image(
                image_data["image"],
                use_container_width=True
            )
            # Display the prompt used for this specific image
            st.caption(f"Prompt: {image_data['prompt']}")
            st.download_button(
                label="Download Image 💾",
                data=image_data["image"],
                # More unique filename
                file_name=f"generated_image_{index}_{int(time.time())}.png",
                mime="image/png",
                # Ensure unique key for each button
                key=f"dl_img_{index}_{int(time.time())}",
                use_container_width=True
            )
            st.divider()  # Add space between images

    # --- Old Display Logic (Commented out / Removed) ---
    # if st.session_state.get("latest_generated_image"):
    #     st.success("Image generated!")
    #     st.image(st.session_state.latest_generated_image,
    #              caption="Latest Generated Image",
    #              use_container_width=True)
    #     st.download_button(...)
    # elif not is_disabled:
    #     st.markdown(...)
    # elif len(...) == 0 and image_client:
    #      st.markdown(...)