Add multiselect dropdown and Select All/Deselect All for bulk node deletion
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -45,6 +45,33 @@ def render_timeline_tab(data, file_path):
|
|||||||
all_nodes = list(htree.nodes.values())
|
all_nodes = list(htree.nodes.values())
|
||||||
all_nodes.sort(key=lambda x: x["timestamp"], reverse=True)
|
all_nodes.sort(key=lambda x: x["timestamp"], reverse=True)
|
||||||
|
|
||||||
|
# --- MULTISELECT PICKER (shown when selection mode is on) ---
|
||||||
|
if selection_mode:
|
||||||
|
def _fmt_node_option(nid):
|
||||||
|
n = htree.nodes[nid]
|
||||||
|
ts = time.strftime('%b %d %H:%M', time.localtime(n['timestamp']))
|
||||||
|
note = n.get('note', 'Step')
|
||||||
|
head = " (HEAD)" if nid == htree.head_id else ""
|
||||||
|
return f"{note} • {ts} ({nid[:6]}){head}"
|
||||||
|
|
||||||
|
all_ids = [n["id"] for n in all_nodes]
|
||||||
|
current_selection = [nid for nid in all_ids if nid in st.session_state.timeline_selected_nodes]
|
||||||
|
picked = st.multiselect(
|
||||||
|
"Select nodes to delete:",
|
||||||
|
options=all_ids,
|
||||||
|
default=current_selection,
|
||||||
|
format_func=_fmt_node_option,
|
||||||
|
)
|
||||||
|
st.session_state.timeline_selected_nodes = set(picked)
|
||||||
|
|
||||||
|
c_all, c_none, _ = st.columns([1, 1, 4])
|
||||||
|
if c_all.button("Select All", use_container_width=True):
|
||||||
|
st.session_state.timeline_selected_nodes = set(all_ids)
|
||||||
|
st.rerun()
|
||||||
|
if c_none.button("Deselect All", use_container_width=True):
|
||||||
|
st.session_state.timeline_selected_nodes = set()
|
||||||
|
st.rerun()
|
||||||
|
|
||||||
# --- RENDER GRAPH VIEWS ---
|
# --- RENDER GRAPH VIEWS ---
|
||||||
if view_mode in ["🌳 Horizontal", "🌲 Vertical"]:
|
if view_mode in ["🌳 Horizontal", "🌲 Vertical"]:
|
||||||
direction = "LR" if view_mode == "🌳 Horizontal" else "TB"
|
direction = "LR" if view_mode == "🌳 Horizontal" else "TB"
|
||||||
|
|||||||
Reference in New Issue
Block a user