3535 send_to_sources ,
3636 broadcast ,
3737 escape_eid ,
38+ push_deleted ,
39+ pop_deleted ,
40+ clear_deleted ,
41+ broadcast_undo_state ,
3842)
3943from visdom .server .defaults import MAX_SOCKET_WAIT
4044
@@ -101,17 +105,45 @@ def on_message(self, message):
101105 elif cmd == "close" :
102106 if "data" in msg and "eid" in msg :
103107 logging .info (f"closing window { msg ['data' ]} " )
108+ eid = escape_eid (msg ["eid" ])
109+ if eid not in self .state :
110+ return
111+ p_data = self .state [eid ]["jsons" ].pop (msg ["data" ], None )
112+ if p_data is not None :
113+ push_deleted (self .env_path , eid , msg ["data" ], p_data )
104114 env = self .state .get (msg ["eid" ])
105115 if env is None :
106116 return
107117 p_data = env ["jsons" ].pop (msg ["data" ], None )
108118 event = {
109119 "event_type" : "close" ,
110120 "target" : msg ["data" ],
111- "eid" : msg [ " eid" ] ,
121+ "eid" : eid ,
112122 "pane_data" : p_data ,
113123 }
114124 send_to_sources (self , event )
125+ broadcast_undo_state (self , eid , self .env_path )
126+
127+ elif cmd == "undo" :
128+ if "eid" in msg :
129+ eid = escape_eid (msg ["eid" ])
130+ if eid not in self .state :
131+ return
132+ popped = pop_deleted (self .env_path , eid )
133+ if popped :
134+ win_id , p_data = popped
135+ env = self .state [eid ]["jsons" ]
136+ max_i = max ((p .get ("i" , - 1 ) for p in env .values ()), default = - 1 )
137+ p_data ["i" ] = max_i + 1
138+ env [win_id ] = p_data
139+ broadcast_msg = dict (p_data )
140+ broadcast_msg ["eid" ] = eid
141+ broadcast (
142+ self ,
143+ json .dumps (broadcast_msg , cls = NanSafeEncoder ),
144+ eid ,
145+ )
146+ broadcast_undo_state (self , eid , self .env_path )
115147
116148 elif cmd == "save" :
117149 # save localStorage window metadata
@@ -137,6 +169,7 @@ def on_message(self, message):
137169 return
138170 logging .info (f"closing environment { eid } " )
139171 self .state .pop (eid , None )
172+ clear_deleted (self .env_path , eid )
140173 if self .env_path is not None :
141174 p = os .path .join (self .env_path , "{0}.json" .format (eid ))
142175 if os .path .exists (p ):
0 commit comments