refactor: replace path-based breadcrumb rendering with data-driven navigation and synchronization

This commit is contained in:
Martin Tranberg
2026-04-01 10:38:41 +02:00
parent f11f487ba3
commit 2dfe1a41be

View File

@@ -651,6 +651,7 @@ class SharePointApp(wx.Frame):
self.current_folder_id = "root"
self.current_items = [] # Gemmer graf-objekterne for rækkerne
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.tree_root = None
self.is_navigating_back = False
self.active_edits = {} # item_id -> { "name": name, "event": Event, "waiting": bool }
@@ -1562,27 +1563,13 @@ class SharePointApp(wx.Frame):
self.path_sizer.Clear(True)
self._add_path_segment(self.get_txt("title"), "ROOT")
# Vis stien fra self.current_path
path_segments = self.current_path[1:] if self.current_path and self.current_path[0] == "SharePoint" else self.current_path
# Prøv at finde matchende noder i træet for at gøre brødkrummerne klikbare
curr_node = self.tree_root
for name in path_segments:
# Vis stien fra self.current_path_data
for data in self.current_path_data:
arrow = wx.StaticText(self.path_panel, label=" > ")
arrow.SetForegroundColour(wx.Colour(150, 150, 150))
self.path_sizer.Add(arrow, 0, wx.ALIGN_CENTER_VERTICAL)
found_node = None
if curr_node:
child, cookie = self.tree_ctrl.GetFirstChild(curr_node)
while child.IsOk():
if self.tree_ctrl.GetItemText(child) == name:
found_node = child
break
child, cookie = self.tree_ctrl.GetNextChild(curr_node, cookie)
self._add_path_segment(name, found_node)
curr_node = found_node # Fortsæt ned i træet hvis muligt
self._add_path_segment(data['name'], data)
self.path_panel.Layout()
self.path_panel.Refresh()
@@ -1590,17 +1577,22 @@ class SharePointApp(wx.Frame):
except RuntimeError:
pass
def _add_path_segment(self, label, node):
def _add_path_segment(self, label, data):
btn = wx.Button(self.path_panel, label=label, style=wx.BU_EXACTFIT | wx.BORDER_NONE)
btn.SetBackgroundColour(wx.WHITE)
btn.SetFont(wx.Font(9, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL))
if node == "ROOT":
if data == "ROOT":
btn.SetBitmap(wx.ArtProvider.GetBitmap(wx.ART_GO_HOME, wx.ART_CMN_DIALOG, (16, 16)))
btn.SetBitmapMargins((4, 0))
btn.Bind(wx.EVT_BUTTON, self.load_sites)
elif node:
btn.Bind(wx.EVT_BUTTON, lambda e: self.tree_ctrl.SelectItem(node))
elif data:
def on_click(e, d=data):
self._navigate_to_item_data(d, is_breadcrumb=True)
# Efter navigation, prøv at finde og vælge den i træet
wx.CallAfter(self._sync_tree_selection_by_path, d["path"])
btn.Bind(wx.EVT_BUTTON, on_click)
self.path_sizer.Add(btn, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 2)
@@ -1657,6 +1649,7 @@ class SharePointApp(wx.Frame):
self.tree_root = self.tree_ctrl.AddRoot("HiddenRoot")
self.current_path = ["SharePoint"]
self.current_path_data = []
self.history = []
self.update_path_display()
@@ -1875,9 +1868,25 @@ class SharePointApp(wx.Frame):
self._navigate_to_item_data(data, tree_item=item)
def _navigate_to_item_data(self, data, tree_item=None):
def _navigate_to_item_data(self, data, tree_item=None, is_breadcrumb=False):
try:
# Race-condition beskyttelse: Hvis vi allerede er der, så stop (undtagen ved brødkrumme-klik)
if not is_breadcrumb and getattr(self, 'current_path', None) == data.get("path"):
return
self.current_path = data["path"]
# Opdater brødkrumme-data (vi gemmer segmenter EFTER SharePoint)
new_len = len(self.current_path)
if new_len > 1:
# Trunker listen så den passer til den nye dybde (behold forældre)
# Hvis stien er [S, A, D], skal data-stien være [A, D] (længde 2).
# Før append skal vi have 1 element tilbage (indeks 0).
self.current_path_data = self.current_path_data[:new_len-2]
self.current_path_data.append(data)
else:
self.current_path_data = []
self.update_path_display()
if tree_item and not self.is_navigating_back:
@@ -2104,6 +2113,31 @@ class SharePointApp(wx.Frame):
except RuntimeError:
pass
def _sync_tree_selection_by_path(self, path):
"""Forsøg at finde og vælge en node i træet baseret på en sti af navne."""
if not path or path[0] != "SharePoint":
return
segments = path[1:]
curr_node = self.tree_root
for name in segments:
found = False
child, cookie = self.tree_ctrl.GetFirstChild(curr_node)
while child.IsOk():
if self.tree_ctrl.GetItemText(child) == name:
curr_node = child
found = True
break
child, cookie = self.tree_ctrl.GetNextChild(curr_node, cookie)
if not found:
return # Stop hvis stien ikke findes/er indlæst i træet
# Hvis vi nåede hertil, har vi fundet den korrekte node
self.tree_ctrl.SelectItem(curr_node)
self.tree_ctrl.EnsureVisible(curr_node)
def on_item_activated(self, event):
item_idx = event.GetIndex()
item = self.current_items[item_idx]