Spaces:
Running
Running
| """ | |
| ⚡ Code Studio - The Main IDE Interface | |
| """ | |
| import streamlit as st | |
| import os | |
| from components.style import apply_custom_css | |
| from components.file_explorer import render_file_tree | |
| from components.code_viewer import render_code_viewer_simple | |
| from components.panels import render_chat_panel, render_search_panel, render_generate_panel | |
| st.set_page_config( | |
| page_title="Code Studio", | |
| page_icon="⚡", | |
| layout="wide", | |
| initial_sidebar_state="expanded" | |
| ) | |
| apply_custom_css() | |
| # --- State Management --- | |
| if "processed_files" not in st.session_state or not st.session_state.processed_files: | |
| st.warning("⚠️ Please index a codebase first.") | |
| if st.button("Go Home"): | |
| st.switch_page("app.py") | |
| st.stop() | |
| # --- Sidebar: Navigation & Explorer --- | |
| with st.sidebar: | |
| # 1. View Settings | |
| st.header("⚙️ View") | |
| layout_mode = st.radio("Layout Mode", ["Tabs (Full Width)", "Split View"], horizontal=True) | |
| st.divider() | |
| # 2. File Explorer | |
| render_file_tree( | |
| st.session_state.get("indexed_files", []), | |
| st.session_state.get("workspace_root", "") | |
| ) | |
| st.divider() | |
| # 3. Actions | |
| if st.button("🏠 New Codebase", use_container_width=True): | |
| st.session_state.processed_files = False | |
| st.session_state.chat_engine = None | |
| st.session_state.indexed_files = None | |
| st.session_state.workspace_root = None | |
| st.session_state.selected_file = None | |
| st.switch_page("app.py") | |
| # --- Main Workspace --- | |
| if layout_mode == "Tabs (Full Width)": | |
| # TABBED LAYOUT (Default) | |
| # Renamed "Agent" to "Refactor" for clarity | |
| tab_chat, tab_code, tab_refactor, tab_search = st.tabs(["💬 Chat", "📝 Code Editor", "✨ Refactor", "🔍 Search"]) | |
| with tab_chat: | |
| chat_engine = st.session_state.get("chat_engine") | |
| if chat_engine: | |
| render_chat_panel(chat_engine) | |
| else: | |
| st.error("Chat engine unavailable.") | |
| with tab_code: | |
| selected_file = st.session_state.get("selected_file") | |
| if selected_file: | |
| filename = os.path.basename(selected_file) | |
| st.caption(f"Editing: {filename}") | |
| render_code_viewer_simple(selected_file) | |
| else: | |
| st.info("👈 Select a file from the sidebar to view code.") | |
| with tab_refactor: | |
| chat_engine = st.session_state.get("chat_engine") | |
| if chat_engine: | |
| render_generate_panel(chat_engine, st.session_state.get("indexed_files", [])) | |
| with tab_search: | |
| render_search_panel(st.session_state.get("indexed_files", [])) | |
| else: | |
| # SPLIT VIEW (Legacy) | |
| split_ratio = st.slider("Panel Width (%)", 20, 80, 40, step=5) | |
| panel_width = split_ratio / 100.0 | |
| editor_width = 1.0 - panel_width | |
| col_panel, col_editor = st.columns([panel_width, editor_width]) | |
| with col_panel: | |
| tab_sub_chat, tab_sub_search, tab_sub_agent = st.tabs(["💬 Chat", "🔍 Search", "✨ Agent"]) | |
| with tab_sub_chat: | |
| chat_engine = st.session_state.get("chat_engine") | |
| if chat_engine: | |
| render_chat_panel(chat_engine) | |
| with tab_sub_search: | |
| render_search_panel(st.session_state.get("indexed_files", [])) | |
| with tab_sub_agent: | |
| chat_engine = st.session_state.get("chat_engine") | |
| if chat_engine: | |
| render_generate_panel(chat_engine, st.session_state.get("indexed_files", [])) | |
| with col_editor: | |
| selected_file = st.session_state.get("selected_file") | |
| if selected_file: | |
| st.caption(f"Editing: {os.path.basename(selected_file)}") | |
| render_code_viewer_simple(selected_file) | |
| else: | |
| st.info("👈 Select a file from the sidebar.") | |