import streamlit as st from pathlib import Path from backend.managers.file_manager import FileManager fm = FileManager() def render_filetree(tree, parent_path=Path()): for name, content in sorted(tree.items()): full_path = parent_path / name if isinstance(content, dict): # Directory with st.sidebar.expander(f"📁 {name}", expanded=False): render_filetree(content, full_path) else: # File cols= st.sidebar.columns([3, 1]) with cols[0]: if st.sidebar.button(f"📄 {name}", key=str(full_path)): abs_path = fm.base_path / full_path if str(abs_path) not in st.session_state.open_files: st.session_state.open_files.append(str(abs_path)) st.session_state.active_file = str(abs_path) with cols[1]: show_options_key = f"show_options_{full_path}" if st.button("...", key=show_options_key): st.session_state[show_options_key] = not st.session_state.get(show_options_key, False) if st.session_state.get(show_options_key, False): action = st.selectbox("", ["", "Rename", "Delete"], key=f"action_{full_path}", index=0) if action == "Delete": st.warning("Are you sure you want to delete this file?") if st.button("Yes, delete file", key=f"confirm_delete_{full_path}"): try: (fm.base_path / full_path).unlink() st.experimental_rerun() except Exception as e: st.error(f"Error deleting file: {e}") elif action == "Rename": new_name = st.text_input("New Name", key=f"rename_{full_path}") if "/" in new_name or "\\" in new_name: st.warning("Do not include slashes in names!") elif new_name: new_path = (fm.base_path / full_path.parent / new_name) try: (fm.base_path / full_path).rename(new_path) st.experimental_rerun() except Exception as e: st.error(f"Error renaming file: {e}") def render_sidebar(): st.sidebar.title("Navigation") navigation_section = st.sidebar.container() file_explorer_section = st.sidebar.container() with navigation_section: options = ["Code Editor", "Chat with AI Assistant"] choice = [] for option in options: if st.sidebar.checkbox(option): choice.append(option) with file_explorer_section: st.sidebar.subheader("File Explorer") tree = fm.get_file_tree() if not tree: st.sidebar.info("Workspace is empty.") else: render_filetree(tree) st.sidebar.markdown("---") st.sidebar.write("Manage Files & Folders") # Create Folder new_folder_name = st.sidebar.text_input("New Folder Name", key="new_folder_name") if "/" in new_folder_name or "\\" in new_folder_name: st.warning("Do not include slashes in names!") elif st.sidebar.button("Create Folder", key="create_folder") and new_folder_name: new_folder_path = fm.base_path / new_folder_name new_folder_path.mkdir(exist_ok=True) st.success(f"Folder '{new_folder_name}' created successfully!") st.experimental_rerun() # Create File new_file_name = st.sidebar.text_input("New File Name", key="new_file_name") if "/" in new_file_name or "\\" in new_file_name: st.warning("Do not include slashes in names!") elif st.sidebar.button("Create File", key="create_file") and new_file_name: new_file_path = fm.base_path / new_file_name new_file_path.touch(exist_ok=True) st.success(f"File '{new_file_name}' created successfully!") st.experimental_rerun() return choice if __name__ == "__main__": render_sidebar()