import streamlit as st import streamlit_ace as st_ace from pathlib import Path from backend.managers.file_manager import FileManager def render_editor(): LANG_MAP = { ".py": "python", ".tex": "latex", ".js": "javascript", ".html": "html", ".css": "css", ".sh": "bash", ".json": "json", ".yaml": "yaml", ".yml": "yaml" } st.subheader("Code Editor") if not st.session_state.open_files: st.info("Please select a file to edit.") return fm = FileManager() tab_names = [Path(f).name for f in st.session_state.open_files] tabs = st.tabs(tab_names) for idx, file_path in enumerate(st.session_state.open_files): with tabs[idx]: st.session_state.active_file = file_path if file_path not in st.session_state.files_content: st.session_state.files_content[file_path] = fm.read_file(file_path) file_language = LANG_MAP.get(file_path.suffix, "text") code = st_ace( value=st.session_state.files_content[file_path], language=file_language, theme="monokai", key=f"code_editor_{file_path}" ) st.session_state.files_content[file_path] = code col1, col2 = st.columns([1, 1]) with col1: if st.button("Save Changes", key=f"save_{file_path}"): fm.save_file(file_path, st.session_state.files_content[file_path]) st.success("File saved successfully!") with col2: if st.button("Close File", key=f"close_{file_path}"): st.session_state.open_files.remove(file_path) del st.session_state.files_content[file_path] st.success("File closed successfully!") if st.session_state.active_file == file_path: st.session_state.active_file = ( st.session_state.open_files[0] if st.session_state.open_files else None ) st.rerun() # Refresh the page to update the UI if __name__ == "__main__": render_editor()