diff --git a/sharepoint_browser.py b/sharepoint_browser.py index 1113f72..9735318 100644 --- a/sharepoint_browser.py +++ b/sharepoint_browser.py @@ -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]