state_manager.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. """
  2. 状态管理(撤销/重做)
  3. """
  4. import streamlit as st
  5. import copy
  6. def init_undo_stack():
  7. """初始化撤销/重做栈"""
  8. if 'undo_stack' not in st.session_state:
  9. st.session_state.undo_stack = []
  10. if 'redo_stack' not in st.session_state:
  11. st.session_state.redo_stack = []
  12. def save_state_for_undo(structure):
  13. """
  14. 保存当前状态到撤销栈
  15. Args:
  16. structure: 当前表格结构
  17. """
  18. # 深拷贝当前结构
  19. state = copy.deepcopy(structure)
  20. st.session_state.undo_stack.append(state)
  21. # 清空重做栈
  22. st.session_state.redo_stack = []
  23. # 限制栈深度(最多保存20个历史状态)
  24. if len(st.session_state.undo_stack) > 20:
  25. st.session_state.undo_stack.pop(0)
  26. def undo_last_action():
  27. """
  28. 撤销上一个操作
  29. Returns:
  30. 是否成功撤销
  31. """
  32. if st.session_state.undo_stack:
  33. # 保存当前状态到重做栈
  34. current_state = copy.deepcopy(st.session_state.structure)
  35. st.session_state.redo_stack.append(current_state)
  36. # 恢复上一个状态
  37. st.session_state.structure = st.session_state.undo_stack.pop()
  38. return True
  39. return False
  40. def redo_last_action():
  41. """
  42. 重做上一个操作
  43. Returns:
  44. 是否成功重做
  45. """
  46. if st.session_state.redo_stack:
  47. # 保存当前状态到撤销栈
  48. current_state = copy.deepcopy(st.session_state.structure)
  49. st.session_state.undo_stack.append(current_state)
  50. # 恢复重做的状态
  51. st.session_state.structure = st.session_state.redo_stack.pop()
  52. return True
  53. return False