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_folder_id = "root"
|
||||||
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.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 }
|
||||||
@@ -1562,27 +1563,13 @@ class SharePointApp(wx.Frame):
|
|||||||
self.path_sizer.Clear(True)
|
self.path_sizer.Clear(True)
|
||||||
self._add_path_segment(self.get_txt("title"), "ROOT")
|
self._add_path_segment(self.get_txt("title"), "ROOT")
|
||||||
|
|
||||||
# Vis stien fra self.current_path
|
# Vis stien fra self.current_path_data
|
||||||
path_segments = self.current_path[1:] if self.current_path and self.current_path[0] == "SharePoint" else self.current_path
|
for data in self.current_path_data:
|
||||||
|
|
||||||
# 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:
|
|
||||||
arrow = wx.StaticText(self.path_panel, label=" > ")
|
arrow = wx.StaticText(self.path_panel, label=" > ")
|
||||||
arrow.SetForegroundColour(wx.Colour(150, 150, 150))
|
arrow.SetForegroundColour(wx.Colour(150, 150, 150))
|
||||||
self.path_sizer.Add(arrow, 0, wx.ALIGN_CENTER_VERTICAL)
|
self.path_sizer.Add(arrow, 0, wx.ALIGN_CENTER_VERTICAL)
|
||||||
|
|
||||||
found_node = None
|
self._add_path_segment(data['name'], data)
|
||||||
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.path_panel.Layout()
|
self.path_panel.Layout()
|
||||||
self.path_panel.Refresh()
|
self.path_panel.Refresh()
|
||||||
@@ -1590,17 +1577,22 @@ class SharePointApp(wx.Frame):
|
|||||||
except RuntimeError:
|
except RuntimeError:
|
||||||
pass
|
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 = wx.Button(self.path_panel, label=label, style=wx.BU_EXACTFIT | wx.BORDER_NONE)
|
||||||
btn.SetBackgroundColour(wx.WHITE)
|
btn.SetBackgroundColour(wx.WHITE)
|
||||||
btn.SetFont(wx.Font(9, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL))
|
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.SetBitmap(wx.ArtProvider.GetBitmap(wx.ART_GO_HOME, wx.ART_CMN_DIALOG, (16, 16)))
|
||||||
btn.SetBitmapMargins((4, 0))
|
btn.SetBitmapMargins((4, 0))
|
||||||
btn.Bind(wx.EVT_BUTTON, self.load_sites)
|
btn.Bind(wx.EVT_BUTTON, self.load_sites)
|
||||||
elif node:
|
elif data:
|
||||||
btn.Bind(wx.EVT_BUTTON, lambda e: self.tree_ctrl.SelectItem(node))
|
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)
|
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.tree_root = self.tree_ctrl.AddRoot("HiddenRoot")
|
||||||
self.current_path = ["SharePoint"]
|
self.current_path = ["SharePoint"]
|
||||||
|
self.current_path_data = []
|
||||||
self.history = []
|
self.history = []
|
||||||
self.update_path_display()
|
self.update_path_display()
|
||||||
|
|
||||||
@@ -1875,9 +1868,25 @@ class SharePointApp(wx.Frame):
|
|||||||
|
|
||||||
self._navigate_to_item_data(data, tree_item=item)
|
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:
|
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"]
|
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()
|
self.update_path_display()
|
||||||
|
|
||||||
if tree_item and not self.is_navigating_back:
|
if tree_item and not self.is_navigating_back:
|
||||||
@@ -2104,6 +2113,31 @@ class SharePointApp(wx.Frame):
|
|||||||
except RuntimeError:
|
except RuntimeError:
|
||||||
pass
|
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):
|
def on_item_activated(self, event):
|
||||||
item_idx = event.GetIndex()
|
item_idx = event.GetIndex()
|
||||||
item = self.current_items[item_idx]
|
item = self.current_items[item_idx]
|
||||||
|
|||||||
Reference in New Issue
Block a user