tortoise5c / app_utils /filepicker.py
djkesu's picture
added model
3bbf2c7
# taken from https://gist.github.com/benlansdell/44000c264d1b373c77497c0ea73f0ef2
# slightly modified
"""FilePicker for streamlit.
Still doesn't seem to be a good solution for a way to select files to process from the server Streamlit is running on.
Here's a pretty functional solution.
Usage:
```
import streamlit as st
from filepicker import st_file_selector
tif_file = st_file_selector(st, key = 'tif', label = 'Choose tif file')
```
"""
import os
import streamlit as st
def update_dir(key):
global i_will_regret_this, i_will_regret_this2
choice = st.session_state[key]
if os.path.isdir(os.path.join(st.session_state[key + "curr_dir"], choice)):
st.session_state[key + "index"] = 0
st.session_state[key + "curr_dir"] = os.path.normpath(
os.path.join(st.session_state[key + "curr_dir"], choice)
)
files = sorted(os.listdir(st.session_state[key + "curr_dir"]))
files.insert(0, "..")
files.insert(0, ".")
st.session_state[key + "files"] = files
def st_file_selector(
st_placeholder, path=".", label="Select a file/folder", key="selected"
):
if key + "curr_dir" not in st.session_state:
base_path = "." if path is None or path == "" else path
base_path = (
base_path if os.path.isdir(base_path) else os.path.dirname(base_path)
)
base_path = "." if base_path is None or base_path == "" else base_path
files = sorted(os.listdir(base_path))
files.insert(0, "..")
files.insert(0, ".")
st.session_state[key + "files"] = files
st.session_state[key + "curr_dir"] = base_path
st.session_state[key + "index"] = (
st.session_state[key + "files"].index(os.path.basename(path))
if os.path.isfile(path) and path[-4:] == '.pth'
else 0
)
else:
base_path = st.session_state[key + "curr_dir"]
selected_file = st_placeholder.selectbox(
label=label,
options=st.session_state[key + "files"],
index=st.session_state[key + "index"],
key=key,
on_change=lambda: update_dir(key),
)
selected_path = os.path.normpath(os.path.join(base_path, selected_file))
st_placeholder.write(os.path.abspath(selected_path))
return selected_path