refactor: replace path-based breadcrumb rendering with data-driven navigation and synchronization
This commit is contained in:
@@ -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]
|
||||
|
||||
Reference in New Issue
Block a user