Compare commits

...

2 Commits

View File

@@ -62,7 +62,10 @@ class SharePointApp(wx.Frame):
self.tree_item_data = {} # Mappenoder -> {type, id, name, drive_id, path} self.tree_item_data = {} # Mappenoder -> {type, id, name, drive_id, path}
self.tree_root = None self.tree_root = None
self.is_navigating_back = False self.is_navigating_back = False
# Threading/Sync til filredigering
self.edit_wait_event = threading.Event()
self.InitUI() self.InitUI()
self.Centre() self.Centre()
self.Show() self.Show()
@@ -74,6 +77,14 @@ class SharePointApp(wx.Frame):
main_sizer.Add(panel, 1, wx.EXPAND) main_sizer.Add(panel, 1, wx.EXPAND)
vbox = wx.BoxSizer(wx.VERTICAL) vbox = wx.BoxSizer(wx.VERTICAL)
# 0. INFO BAR (Beskeder der ikke blokerer)
self.info_bar = wx.InfoBar(panel)
vbox.Add(self.info_bar, 0, wx.EXPAND)
# Timer til at skjule info bar
self.info_timer = wx.Timer(self)
self.Bind(wx.EVT_TIMER, lambda e: self.info_bar.Dismiss(), self.info_timer)
# 1. TOP NAVIGATION BAR # 1. TOP NAVIGATION BAR
nav_panel = wx.Panel(panel) nav_panel = wx.Panel(panel)
@@ -89,6 +100,14 @@ class SharePointApp(wx.Frame):
self.home_btn.Bind(wx.EVT_BUTTON, self.load_sites) self.home_btn.Bind(wx.EVT_BUTTON, self.load_sites)
nav_hbox.Add(self.home_btn, 0, wx.LEFT | wx.ALIGN_CENTER_VERTICAL, 5) nav_hbox.Add(self.home_btn, 0, wx.LEFT | wx.ALIGN_CENTER_VERTICAL, 5)
# NY KNAP: Gem ændringer (Vises kun ved redigering)
self.done_btn = wx.Button(nav_panel, label="💾 Gem ændringer i SharePoint", size=(200, 30))
self.done_btn.SetBackgroundColour(wx.Colour(255, 69, 0)) # OrangeRed
self.done_btn.SetForegroundColour(wx.WHITE)
self.done_btn.Hide()
self.done_btn.Bind(wx.EVT_BUTTON, self.on_done_editing_clicked)
nav_hbox.Add(self.done_btn, 0, wx.LEFT | wx.ALIGN_CENTER_VERTICAL, 10)
nav_hbox.AddStretchSpacer(1) nav_hbox.AddStretchSpacer(1)
self.login_btn = wx.Button(nav_panel, label="Log ind", size=(120, 30)) self.login_btn = wx.Button(nav_panel, label="Log ind", size=(120, 30))
@@ -100,10 +119,13 @@ class SharePointApp(wx.Frame):
nav_panel.SetSizer(nav_hbox) nav_panel.SetSizer(nav_hbox)
vbox.Add(nav_panel, 0, wx.EXPAND | wx.ALL, 5) vbox.Add(nav_panel, 0, wx.EXPAND | wx.ALL, 5)
# 2. PATH LABEL # 2. PATH BREADCRUMBS (Adresselinje-stil)
self.path_label = wx.StaticText(panel, label="📍 SharePoint") self.path_panel = wx.Panel(panel, style=wx.BORDER_SIMPLE)
self.path_label.SetFont(wx.Font(10, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD)) self.path_panel.SetBackgroundColour(wx.WHITE)
vbox.Add(self.path_label, 0, wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM, 10) self.path_panel.SetMinSize((-1, 38)) # Sikrer synbarhed
self.path_sizer = wx.BoxSizer(wx.HORIZONTAL)
self.path_panel.SetSizer(self.path_sizer)
vbox.Add(self.path_panel, 0, wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM, 10)
# 3. SPLITTER FOR TREE AND LIST # 3. SPLITTER FOR TREE AND LIST
self.splitter = wx.SplitterWindow(panel, style=wx.SP_LIVE_UPDATE | wx.SP_3DSASH) self.splitter = wx.SplitterWindow(panel, style=wx.SP_LIVE_UPDATE | wx.SP_3DSASH)
@@ -148,14 +170,64 @@ class SharePointApp(wx.Frame):
def set_status(self, text): def set_status(self, text):
wx.CallAfter(self.status_bar.SetStatusText, text) wx.CallAfter(self.status_bar.SetStatusText, text)
def show_info(self, text, type=wx.ICON_INFORMATION, auto_hide=True):
def _do():
self.info_bar.Dismiss()
self.info_bar.ShowMessage(text, type)
if auto_hide:
self.info_timer.Start(4000, oneShot=True)
else:
self.info_timer.Stop()
wx.CallAfter(_do)
def on_done_editing_clicked(self, event):
print("[DEBUG] 'Jeg er færdig'-knap klikket.")
self.set_status("Knap trykket - Uploader nu...")
self.edit_wait_event.set()
self.info_bar.Dismiss()
def clear_main(self): def clear_main(self):
self.list_ctrl.DeleteAllItems() self.list_ctrl.DeleteAllItems()
self.current_items = [] self.current_items = []
self.update_path_display() self.update_path_display()
def update_path_display(self): def update_path_display(self):
path_str = " > ".join(self.current_path) self.path_sizer.Clear(True)
wx.CallAfter(self.path_label.SetLabel, f"📍 {path_str}")
# Find alle noder fra rod til nuværende selektion
nodes = []
curr = self.tree_ctrl.GetSelection()
while curr.IsOk() and curr != self.tree_root:
nodes.insert(0, curr)
curr = self.tree_ctrl.GetItemParent(curr)
# Start ikon/label
self._add_path_segment("📍 SharePoint", "ROOT")
for node in nodes:
arrow = wx.StaticText(self.path_panel, label=" > ")
arrow.SetForegroundColour(wx.Colour(150, 150, 150))
self.path_sizer.Add(arrow, 0, wx.ALIGN_CENTER_VERTICAL)
name = self.tree_ctrl.GetItemText(node)
self._add_path_segment(name, node)
self.path_panel.Layout()
self.path_panel.Refresh()
self.Layout() # Tving rammen til at opdatere, så stien kommer frem
def _add_path_segment(self, label, node):
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":
btn.Bind(wx.EVT_BUTTON, self.load_sites)
elif node:
btn.Bind(wx.EVT_BUTTON, lambda e: self.tree_ctrl.SelectItem(node))
self.path_sizer.Add(btn, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 2)
def login(self, event): def login(self, event):
self.set_status("Logger ind...") self.set_status("Logger ind...")
@@ -459,7 +531,14 @@ class SharePointApp(wx.Frame):
pass pass
else: else:
self.set_status("Fillås ikke detekteret.") self.set_status("Fillås ikke detekteret.")
wx.CallAfter(wx.MessageBox, f"Vi kunne ikke detektere om '{file_name}' blev låst.\n\nTryk OK når du har gemt og LUKKET filen.", "Info", wx.OK | wx.ICON_INFORMATION) self.edit_wait_event.clear()
wx.CallAfter(self.done_btn.Show)
wx.CallAfter(self.Layout)
self.show_info(f"Vi kan ikke se om du har gemt '{file_name}'. Klik på den orange knap øverst når du er færdig.", wx.ICON_WARNING, auto_hide=False)
# Vent på event (fra done_btn knap)
self.edit_wait_event.wait()
wx.CallAfter(self.done_btn.Hide)
wx.CallAfter(self.Layout)
# 4. Upload # 4. Upload
self.set_status(f"Uploader ændringer...") self.set_status(f"Uploader ændringer...")
@@ -474,11 +553,12 @@ class SharePointApp(wx.Frame):
os.remove(local_path) os.remove(local_path)
self.set_status(f"Succes! '{file_name}' er opdateret.") self.set_status(f"Succes! '{file_name}' er opdateret.")
wx.CallAfter(wx.MessageBox, f"Filen '{file_name}' er gemt og tjekket ind korrekt.", "Færdig", wx.OK | wx.ICON_INFORMATION) self.show_info(f"Filen '{file_name}' er gemt og tjekket ind korrekt.", wx.ICON_INFORMATION)
except Exception as e: except Exception as e:
self.set_status(f"Fejl: {str(e)}") self.set_status(f"Fejl: {str(e)}")
wx.CallAfter(wx.MessageBox, f"Der skete en fejl:\n{e}", "Fejl", wx.OK | wx.ICON_ERROR) self.show_info(f"Der skete en fejl: {e}", wx.ICON_ERROR)
if __name__ == "__main__": if __name__ == "__main__":