fix: add navigation generation counter to prevent stale list overwrite (I1)
Introduces self._nav_gen, incremented on every _navigate_to_item_data call. The counter is threaded through _fetch_list_contents_bg and checked in _finalize_list_loading: if the user navigated away while a fetch was in flight, the stale results are silently discarded instead of overwriting the active folder view and re-sorting its items. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -671,6 +671,7 @@ class SharePointApp(wx.Frame):
|
|||||||
self.current_items = [] # Gemmer graf-objekterne for rækkerne
|
self.current_items = [] # Gemmer graf-objekterne for rækkerne
|
||||||
self.tree_item_data = {} # Mappenoder -> {type, id, name, drive_id, path}
|
self.tree_item_data = {} # Mappenoder -> {type, id, name, drive_id, path}
|
||||||
self.current_path_data = [] # Gemmer data-objekterne for den nuværende sti (brødkrummer)
|
self.current_path_data = [] # Gemmer data-objekterne for den nuværende sti (brødkrummer)
|
||||||
|
self._nav_gen = 0 # Incremented on each navigation to discard stale fetch results
|
||||||
self.tree_root = None
|
self.tree_root = None
|
||||||
self.is_navigating_back = False
|
self.is_navigating_back = False
|
||||||
self.active_edits = {} # item_id -> { "name": name, "event": Event, "waiting": bool }
|
self.active_edits = {} # item_id -> { "name": name, "event": Event, "waiting": bool }
|
||||||
@@ -1887,11 +1888,13 @@ class SharePointApp(wx.Frame):
|
|||||||
self.current_items = []
|
self.current_items = []
|
||||||
self.set_status(self.get_txt("status_loading_content"))
|
self.set_status(self.get_txt("status_loading_content"))
|
||||||
|
|
||||||
threading.Thread(target=self._fetch_list_contents_bg, args=(data,), daemon=True).start()
|
self._nav_gen += 1
|
||||||
|
gen = self._nav_gen
|
||||||
|
threading.Thread(target=self._fetch_list_contents_bg, args=(data, gen), daemon=True).start()
|
||||||
except RuntimeError:
|
except RuntimeError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def _fetch_list_contents_bg(self, data):
|
def _fetch_list_contents_bg(self, data, nav_gen=0):
|
||||||
if not self.ensure_valid_token(): return
|
if not self.ensure_valid_token(): return
|
||||||
self.pulse_gauge(True)
|
self.pulse_gauge(True)
|
||||||
items_data = []
|
items_data = []
|
||||||
@@ -1950,7 +1953,7 @@ class SharePointApp(wx.Frame):
|
|||||||
url = res_data.get('@odata.nextLink')
|
url = res_data.get('@odata.nextLink')
|
||||||
|
|
||||||
# Finalize
|
# Finalize
|
||||||
wx.CallAfter(self._finalize_list_loading, items_data)
|
wx.CallAfter(self._finalize_list_loading, items_data, nav_gen)
|
||||||
self.pulse_gauge(False)
|
self.pulse_gauge(False)
|
||||||
|
|
||||||
def _append_list_items(self, items):
|
def _append_list_items(self, items):
|
||||||
@@ -1973,8 +1976,10 @@ class SharePointApp(wx.Frame):
|
|||||||
self.list_ctrl.SetItem(idx, 2, size_str)
|
self.list_ctrl.SetItem(idx, 2, size_str)
|
||||||
self.list_ctrl.SetItem(idx, 3, item['modified'])
|
self.list_ctrl.SetItem(idx, 3, item['modified'])
|
||||||
|
|
||||||
def _finalize_list_loading(self, items_data):
|
def _finalize_list_loading(self, items_data, nav_gen=0):
|
||||||
if not self: return
|
if not self: return
|
||||||
|
if nav_gen != self._nav_gen:
|
||||||
|
return # User navigated away; discard stale results
|
||||||
self.current_items = items_data
|
self.current_items = items_data
|
||||||
self.apply_sorting()
|
self.apply_sorting()
|
||||||
self.set_status(self.get_txt("status_ready"))
|
self.set_status(self.get_txt("status_ready"))
|
||||||
|
|||||||
Reference in New Issue
Block a user