File size: 2,547 Bytes
448ed98 |
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 |
import streamlit as st
def paginator(items, session_state_key):
"""
Creates a reusable paginator component for a list of items.
Args:
items (list): The list of items to paginate through.
session_state_key (str): A unique key for storing the current index in
st.session_state.
Returns:
Any: The currently selected item from the list.
"""
list_length = len(items)
# Initialize the session state for the current index if it doesn't exist.
if session_state_key not in st.session_state:
st.session_state[session_state_key] = 0
def next_item():
"""Increments the index, wrapping around to the start if it reaches the end."""
if list_length > 0:
st.session_state[session_state_key] = (st.session_state[session_state_key] + 1) % list_length
def prev_item():
"""Decrements the index, wrapping around to the end if it goes below zero."""
if list_length > 0:
st.session_state[session_state_key] = (st.session_state[session_state_key] - 1 + list_length) % list_length
# Create the navigation columns.
col1, col2, col3 = st.columns([2, 3, 2])
with col1:
st.button("⬅️ Previous", on_click=prev_item, use_container_width=True, disabled=(list_length <= 1))
# Display the current position and the popover for jumping to a specific item.
with col2:
if list_length > 0:
current_num = st.session_state[session_state_key] + 1
popover = st.popover(f"Item {current_num} of {list_length}", use_container_width=True)
with popover:
st.markdown("Jump to a specific item:")
target_index_input = st.number_input(
"Item Number",
min_value=1,
max_value=list_length,
value=current_num,
step=1,
label_visibility="collapsed"
)
if st.button("Go"):
st.session_state[session_state_key] = target_index_input - 1
st.rerun()
else:
st.text("No items to display")
# "Next" button in the third column.
with col3:
st.button("Next ➡️", on_click=next_item, use_container_width=True, disabled=(list_length <= 1))
# Return the currently selected item.
if list_length > 0:
return st.session_state[session_state_key]
else:
return None |