Compare commits
3 Commits
8f80611d32
...
784ca755d5
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
784ca755d5 | ||
|
|
fa6840de75 | ||
|
|
8e53f69e68 |
@@ -27,7 +27,10 @@ def load_settings():
|
|||||||
"client_id": "DIN_CLIENT_ID_HER",
|
"client_id": "DIN_CLIENT_ID_HER",
|
||||||
"tenant_id": "DIN_TENANT_ID_HER",
|
"tenant_id": "DIN_TENANT_ID_HER",
|
||||||
"temp_dir": "C:\\Temp_SP",
|
"temp_dir": "C:\\Temp_SP",
|
||||||
"language": "da" # da eller en
|
"language": "da", # da eller en
|
||||||
|
"favorites": [], # Liste over {id, name, type, drive_id, site_id, path}
|
||||||
|
"fav_visible": True,
|
||||||
|
"license_key": ""
|
||||||
}
|
}
|
||||||
if not os.path.exists(SETTINGS_FILE):
|
if not os.path.exists(SETTINGS_FILE):
|
||||||
with open(SETTINGS_FILE, 'w', encoding='utf-8') as f:
|
with open(SETTINGS_FILE, 'w', encoding='utf-8') as f:
|
||||||
@@ -56,15 +59,15 @@ CURRENT_LANG = settings.get("language", "da")
|
|||||||
STRINGS = {
|
STRINGS = {
|
||||||
"da": {
|
"da": {
|
||||||
"title": "SharePoint Explorer",
|
"title": "SharePoint Explorer",
|
||||||
"btn_back": "← Tilbage",
|
"btn_back": "Tilbage",
|
||||||
"btn_home": "🏠 Hjem",
|
"btn_home": "Hjem",
|
||||||
"btn_save_changes": "💾 Gem ændringer i SharePoint",
|
"btn_save_changes": "Gem ændringer i SharePoint",
|
||||||
"btn_login": "Log ind",
|
"btn_login": "Log ind",
|
||||||
"btn_logged_in": "Logget ind",
|
"btn_logged_in": "Logget ind",
|
||||||
"btn_refresh": "🔄 Opdater",
|
"btn_refresh": "Opdater",
|
||||||
"btn_upload_file": "📤 Upload Fil",
|
"btn_upload_file": "Upload Fil",
|
||||||
"btn_upload_folder": "📁 Upload Mappe",
|
"btn_upload_folder": "Upload Mappe",
|
||||||
"btn_new_folder": "➕ Ny Mappe",
|
"btn_new_folder": "Ny Mappe",
|
||||||
"col_name": "Navn",
|
"col_name": "Navn",
|
||||||
"col_type": "Type",
|
"col_type": "Type",
|
||||||
"col_size": "Størrelse",
|
"col_size": "Størrelse",
|
||||||
@@ -122,7 +125,7 @@ STRINGS = {
|
|||||||
"msg_update_failed_code": "Upload fejlede: {code}",
|
"msg_update_failed_code": "Upload fejlede: {code}",
|
||||||
"msg_unknown_error": "Ukendt fejl",
|
"msg_unknown_error": "Ukendt fejl",
|
||||||
"type_unknown": "Ukendt",
|
"type_unknown": "Ukendt",
|
||||||
"btn_settings": "⚙️ Indstillinger",
|
"btn_settings": "Indstillinger",
|
||||||
"settings_title": "Indstillinger",
|
"settings_title": "Indstillinger",
|
||||||
"settings_auth_group": "Authentication / API",
|
"settings_auth_group": "Authentication / API",
|
||||||
"settings_client_id": "App (Client) ID:",
|
"settings_client_id": "App (Client) ID:",
|
||||||
@@ -137,19 +140,26 @@ STRINGS = {
|
|||||||
"settings_cancel": "Annuller",
|
"settings_cancel": "Annuller",
|
||||||
"msg_settings_saved": "Indstillingerne er gemt.",
|
"msg_settings_saved": "Indstillingerne er gemt.",
|
||||||
"msg_restart_required": "Visse ændringer (f.eks. ID'er) træder først i kraft efter genstart.",
|
"msg_restart_required": "Visse ændringer (f.eks. ID'er) træder først i kraft efter genstart.",
|
||||||
"status_login_needed": "Session udløbet. Log ind igen."
|
"status_login_needed": "Session udløbet. Log ind igen.",
|
||||||
|
"btn_add_fav": "Tilføj til favoritter",
|
||||||
|
"btn_remove_fav": "Fjern fra favoritter",
|
||||||
|
"label_favorites": "Favoritter",
|
||||||
|
"msg_fav_exists": "'{name}' er allerede i favoritter.",
|
||||||
|
"settings_license_group": "Licens / Aktivering",
|
||||||
|
"settings_license_key": "Licensnøgle:",
|
||||||
|
"settings_license_status": "Status: Ikke aktiveret"
|
||||||
},
|
},
|
||||||
"en": {
|
"en": {
|
||||||
"title": "SharePoint Explorer",
|
"title": "SharePoint Explorer",
|
||||||
"btn_back": "← Back",
|
"btn_back": "Back",
|
||||||
"btn_home": "🏠 Home",
|
"btn_home": "Home",
|
||||||
"btn_save_changes": "💾 Save changes to SharePoint",
|
"btn_save_changes": "Save changes to SharePoint",
|
||||||
"btn_login": "Login",
|
"btn_login": "Login",
|
||||||
"btn_logged_in": "Logged in",
|
"btn_logged_in": "Logged in",
|
||||||
"btn_refresh": "🔄 Refresh",
|
"btn_refresh": "Refresh",
|
||||||
"btn_upload_file": "📤 Upload File",
|
"btn_upload_file": "Upload File",
|
||||||
"btn_upload_folder": "📁 Upload Folder",
|
"btn_upload_folder": "Upload Folder",
|
||||||
"btn_new_folder": "➕ New Folder",
|
"btn_new_folder": "New Folder",
|
||||||
"col_name": "Name",
|
"col_name": "Name",
|
||||||
"col_type": "Type",
|
"col_type": "Type",
|
||||||
"col_size": "Size",
|
"col_size": "Size",
|
||||||
@@ -207,7 +217,7 @@ STRINGS = {
|
|||||||
"msg_update_failed_code": "Upload failed: {code}",
|
"msg_update_failed_code": "Upload failed: {code}",
|
||||||
"msg_unknown_error": "Unknown error",
|
"msg_unknown_error": "Unknown error",
|
||||||
"type_unknown": "Unknown",
|
"type_unknown": "Unknown",
|
||||||
"btn_settings": "⚙️ Settings",
|
"btn_settings": "Settings",
|
||||||
"settings_title": "Settings",
|
"settings_title": "Settings",
|
||||||
"settings_auth_group": "Authentication / API",
|
"settings_auth_group": "Authentication / API",
|
||||||
"settings_client_id": "App (Client) ID:",
|
"settings_client_id": "App (Client) ID:",
|
||||||
@@ -222,7 +232,14 @@ STRINGS = {
|
|||||||
"settings_cancel": "Cancel",
|
"settings_cancel": "Cancel",
|
||||||
"msg_settings_saved": "Settings saved.",
|
"msg_settings_saved": "Settings saved.",
|
||||||
"msg_restart_required": "Some changes (e.g., IDs) only take effect after restart.",
|
"msg_restart_required": "Some changes (e.g., IDs) only take effect after restart.",
|
||||||
"status_login_needed": "Session expired. Please login again."
|
"status_login_needed": "Session expired. Please login again.",
|
||||||
|
"btn_add_fav": "Add to favorites",
|
||||||
|
"btn_remove_fav": "Remove from favorites",
|
||||||
|
"label_favorites": "Favorites",
|
||||||
|
"msg_fav_exists": "'{name}' is already in favorites.",
|
||||||
|
"settings_license_group": "License / Activation",
|
||||||
|
"settings_license_key": "License Key:",
|
||||||
|
"settings_license_status": "Status: Not activated"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -281,7 +298,7 @@ class SettingsDialog(wx.Dialog):
|
|||||||
def __init__(self, parent, current_settings):
|
def __init__(self, parent, current_settings):
|
||||||
lang = current_settings.get("language", "da")
|
lang = current_settings.get("language", "da")
|
||||||
title = STRINGS[lang].get("settings_title", "Settings")
|
title = STRINGS[lang].get("settings_title", "Settings")
|
||||||
super().__init__(parent, title=title, size=(520, 620))
|
super().__init__(parent, title=title, size=(520, 720))
|
||||||
|
|
||||||
self.settings = current_settings.copy()
|
self.settings = current_settings.copy()
|
||||||
self.lang = lang
|
self.lang = lang
|
||||||
@@ -335,6 +352,20 @@ class SettingsDialog(wx.Dialog):
|
|||||||
|
|
||||||
inner_vbox.Add(path_sizer, 0, wx.EXPAND | wx.ALL, 10)
|
inner_vbox.Add(path_sizer, 0, wx.EXPAND | wx.ALL, 10)
|
||||||
|
|
||||||
|
# --- Group: License ---
|
||||||
|
lic_box = wx.StaticBox(panel, label=self.get_txt("settings_license_group"))
|
||||||
|
lic_sizer = wx.StaticBoxSizer(lic_box, wx.VERTICAL)
|
||||||
|
|
||||||
|
lic_sizer.Add(wx.StaticText(panel, label=self.get_txt("settings_license_key")), 0, wx.BOTTOM, 5)
|
||||||
|
self.license_ctrl = wx.TextCtrl(panel, value=self.settings.get("license_key", ""))
|
||||||
|
lic_sizer.Add(self.license_ctrl, 0, wx.EXPAND | wx.BOTTOM, 5)
|
||||||
|
|
||||||
|
status_txt = wx.StaticText(panel, label=self.get_txt("settings_license_status"))
|
||||||
|
status_txt.SetForegroundColour(wx.RED)
|
||||||
|
lic_sizer.Add(status_txt, 0, wx.TOP, 5)
|
||||||
|
|
||||||
|
inner_vbox.Add(lic_sizer, 0, wx.EXPAND | wx.ALL, 10)
|
||||||
|
|
||||||
# --- Group: Language ---
|
# --- Group: Language ---
|
||||||
lang_box = wx.StaticBox(panel, label=self.get_txt("settings_lang_group"))
|
lang_box = wx.StaticBox(panel, label=self.get_txt("settings_lang_group"))
|
||||||
lang_sizer = wx.StaticBoxSizer(lang_box, wx.HORIZONTAL)
|
lang_sizer = wx.StaticBoxSizer(lang_box, wx.HORIZONTAL)
|
||||||
@@ -374,6 +405,7 @@ class SettingsDialog(wx.Dialog):
|
|||||||
self.settings["tenant_id"] = self.tenant_id_ctrl.GetValue().strip()
|
self.settings["tenant_id"] = self.tenant_id_ctrl.GetValue().strip()
|
||||||
self.settings["temp_dir"] = self.temp_dir_picker.GetPath()
|
self.settings["temp_dir"] = self.temp_dir_picker.GetPath()
|
||||||
self.settings["language"] = "da" if self.lang_choice.GetSelection() == 0 else "en"
|
self.settings["language"] = "da" if self.lang_choice.GetSelection() == 0 else "en"
|
||||||
|
self.settings["license_key"] = self.license_ctrl.GetValue().strip()
|
||||||
|
|
||||||
if not self.settings["client_id"] or not self.settings["tenant_id"]:
|
if not self.settings["client_id"] or not self.settings["tenant_id"]:
|
||||||
wx.MessageBox("Client ID og Tenant ID skal udfyldes.", "Fejl", wx.OK | wx.ICON_ERROR)
|
wx.MessageBox("Client ID og Tenant ID skal udfyldes.", "Fejl", wx.OK | wx.ICON_ERROR)
|
||||||
@@ -402,13 +434,16 @@ class SharePointApp(wx.Frame):
|
|||||||
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 }
|
||||||
|
self.favorites = settings.get("favorites", [])
|
||||||
|
self.fav_visible = settings.get("fav_visible", True)
|
||||||
|
|
||||||
# System Ikoner (ArtProvider - mest basale for kompatibilitet)
|
# System Ikoner (Brug ART_CMN_DIALOG eller ART_TOOLBAR for mere farve på Windows)
|
||||||
self.image_list = wx.ImageList(16, 16)
|
self.image_list = wx.ImageList(16, 16)
|
||||||
self.idx_site = self.image_list.Add(wx.ArtProvider.GetBitmap(wx.ART_GO_HOME, wx.ART_OTHER, (16, 16))) # Site (Hus ikon)
|
self.idx_site = self.image_list.Add(wx.ArtProvider.GetBitmap(wx.ART_GO_HOME, wx.ART_CMN_DIALOG, (16, 16))) # Site
|
||||||
self.idx_drive = self.image_list.Add(wx.ArtProvider.GetBitmap(wx.ART_HARDDISK, wx.ART_OTHER, (16, 16))) # Drive
|
self.idx_drive = self.image_list.Add(wx.ArtProvider.GetBitmap(wx.ART_HARDDISK, wx.ART_CMN_DIALOG, (16, 16))) # Drive
|
||||||
self.idx_folder = self.image_list.Add(wx.ArtProvider.GetBitmap(wx.ART_FOLDER, wx.ART_OTHER, (16, 16))) # Folder
|
self.idx_folder = self.image_list.Add(wx.ArtProvider.GetBitmap(wx.ART_FOLDER, wx.ART_CMN_DIALOG, (16, 16))) # Folder
|
||||||
self.idx_file = self.image_list.Add(wx.ArtProvider.GetBitmap(wx.ART_NORMAL_FILE, wx.ART_OTHER, (16, 16))) # File
|
self.idx_file = self.image_list.Add(wx.ArtProvider.GetBitmap(wx.ART_NORMAL_FILE, wx.ART_CMN_DIALOG, (16, 16))) # File
|
||||||
|
self.idx_star = self.image_list.Add(wx.ArtProvider.GetBitmap(wx.ART_ADD_BOOKMARK, wx.ART_CMN_DIALOG, (16, 16))) # Favorit stjerne
|
||||||
|
|
||||||
# Threading/Sync til filredigering
|
# Threading/Sync til filredigering
|
||||||
|
|
||||||
@@ -457,55 +492,73 @@ class SharePointApp(wx.Frame):
|
|||||||
nav_panel = wx.Panel(panel)
|
nav_panel = wx.Panel(panel)
|
||||||
nav_hbox = wx.BoxSizer(wx.HORIZONTAL)
|
nav_hbox = wx.BoxSizer(wx.HORIZONTAL)
|
||||||
|
|
||||||
self.back_btn = wx.Button(nav_panel, label=self.get_txt("btn_back"), size=(100, 30))
|
self.back_btn = wx.Button(nav_panel, label=self.get_txt("btn_back"), size=(110, 30))
|
||||||
|
self.back_btn.SetBitmap(wx.ArtProvider.GetBitmap(wx.ART_GO_BACK, wx.ART_BUTTON, (16, 16)))
|
||||||
|
self.back_btn.SetBitmapMargins((12, 0))
|
||||||
self.back_btn.Disable()
|
self.back_btn.Disable()
|
||||||
self.back_btn.Bind(wx.EVT_BUTTON, self.go_back)
|
self.back_btn.Bind(wx.EVT_BUTTON, self.go_back)
|
||||||
nav_hbox.Add(self.back_btn, 0, wx.LEFT | wx.ALIGN_CENTER_VERTICAL, 10)
|
nav_hbox.Add(self.back_btn, 0, wx.LEFT | wx.ALIGN_CENTER_VERTICAL, 10)
|
||||||
|
|
||||||
self.home_btn = wx.Button(nav_panel, label=self.get_txt("btn_home"), size=(100, 30))
|
self.home_btn = wx.Button(nav_panel, label=self.get_txt("btn_home"), size=(110, 30))
|
||||||
|
self.home_btn.SetBitmap(wx.ArtProvider.GetBitmap(wx.ART_GO_HOME, wx.ART_BUTTON, (16, 16)))
|
||||||
|
self.home_btn.SetBitmapMargins((12, 0))
|
||||||
self.home_btn.Disable()
|
self.home_btn.Disable()
|
||||||
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)
|
||||||
|
|
||||||
self.refresh_btn = wx.Button(nav_panel, label=self.get_txt("btn_refresh"), size=(100, 30))
|
self.refresh_btn = wx.Button(nav_panel, label=self.get_txt("btn_refresh"), size=(110, 30))
|
||||||
|
self.refresh_btn.SetBitmap(wx.ArtProvider.GetBitmap(wx.ART_REDO, wx.ART_BUTTON, (16, 16)))
|
||||||
|
self.refresh_btn.SetBitmapMargins((12, 0))
|
||||||
self.refresh_btn.Disable()
|
self.refresh_btn.Disable()
|
||||||
self.refresh_btn.Bind(wx.EVT_BUTTON, self.on_refresh)
|
self.refresh_btn.Bind(wx.EVT_BUTTON, self.on_refresh)
|
||||||
nav_hbox.Add(self.refresh_btn, 0, wx.LEFT | wx.ALIGN_CENTER_VERTICAL, 5)
|
nav_hbox.Add(self.refresh_btn, 0, wx.LEFT | wx.ALIGN_CENTER_VERTICAL, 5)
|
||||||
|
|
||||||
# NY KNAP: Gem ændringer (Vises kun ved redigering)
|
# NY KNAP: Gem ændringer (Vises kun ved redigering)
|
||||||
self.done_btn = wx.Button(nav_panel, label=self.get_txt("btn_save_changes"), size=(200, 30))
|
self.done_btn = wx.Button(nav_panel, label=self.get_txt("btn_save_changes"), size=(250, 30))
|
||||||
self.done_btn.SetBackgroundColour(wx.Colour(255, 69, 0)) # OrangeRed
|
self.done_btn.SetBackgroundColour(wx.Colour(255, 69, 0)) # OrangeRed
|
||||||
self.done_btn.SetForegroundColour(wx.WHITE)
|
self.done_btn.SetForegroundColour(wx.WHITE)
|
||||||
|
self.done_btn.SetBitmap(wx.ArtProvider.GetBitmap(wx.ART_FILE_SAVE, wx.ART_BUTTON, (16, 16)))
|
||||||
|
self.done_btn.SetBitmapMargins((12, 0))
|
||||||
self.done_btn.Hide()
|
self.done_btn.Hide()
|
||||||
self.done_btn.Bind(wx.EVT_BUTTON, self.on_done_editing_clicked)
|
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.Add(self.done_btn, 0, wx.LEFT | wx.ALIGN_CENTER_VERTICAL, 10)
|
||||||
|
|
||||||
# NYE KNAPPER: Upload og Ny Mappe (Vises kun når man er inde i et drev/mappe)
|
# NYE KNAPPER: Upload og Ny Mappe (Vises kun når man er inde i et drev/mappe)
|
||||||
self.upload_btn = wx.Button(nav_panel, label=self.get_txt("btn_upload_file"), size=(120, 30))
|
self.upload_btn = wx.Button(nav_panel, label=self.get_txt("btn_upload_file"), size=(130, 30))
|
||||||
|
self.upload_btn.SetBitmap(wx.ArtProvider.GetBitmap(wx.ART_FILE_OPEN, wx.ART_BUTTON, (16, 16)))
|
||||||
|
self.upload_btn.SetBitmapMargins((12, 0))
|
||||||
self.upload_btn.Hide()
|
self.upload_btn.Hide()
|
||||||
self.upload_btn.Bind(wx.EVT_BUTTON, self.on_upload_clicked)
|
self.upload_btn.Bind(wx.EVT_BUTTON, self.on_upload_clicked)
|
||||||
nav_hbox.Add(self.upload_btn, 0, wx.LEFT | wx.ALIGN_CENTER_VERTICAL, 5)
|
nav_hbox.Add(self.upload_btn, 0, wx.LEFT | wx.ALIGN_CENTER_VERTICAL, 5)
|
||||||
|
|
||||||
self.upload_folder_btn = wx.Button(nav_panel, label=self.get_txt("btn_upload_folder"), size=(120, 30))
|
self.upload_folder_btn = wx.Button(nav_panel, label=self.get_txt("btn_upload_folder"), size=(130, 30))
|
||||||
|
self.upload_folder_btn.SetBitmap(wx.ArtProvider.GetBitmap(wx.ART_FOLDER_OPEN, wx.ART_BUTTON, (16, 16)))
|
||||||
|
self.upload_folder_btn.SetBitmapMargins((12, 0))
|
||||||
self.upload_folder_btn.Hide()
|
self.upload_folder_btn.Hide()
|
||||||
self.upload_folder_btn.Bind(wx.EVT_BUTTON, self.on_upload_folder_clicked)
|
self.upload_folder_btn.Bind(wx.EVT_BUTTON, self.on_upload_folder_clicked)
|
||||||
nav_hbox.Add(self.upload_folder_btn, 0, wx.LEFT | wx.ALIGN_CENTER_VERTICAL, 5)
|
nav_hbox.Add(self.upload_folder_btn, 0, wx.LEFT | wx.ALIGN_CENTER_VERTICAL, 5)
|
||||||
|
|
||||||
self.new_folder_btn = wx.Button(nav_panel, label=self.get_txt("btn_new_folder"), size=(100, 30))
|
self.new_folder_btn = wx.Button(nav_panel, label=self.get_txt("btn_new_folder"), size=(120, 30))
|
||||||
|
self.new_folder_btn.SetBitmap(wx.ArtProvider.GetBitmap(wx.ART_NEW_DIR, wx.ART_BUTTON, (16, 16)))
|
||||||
|
self.new_folder_btn.SetBitmapMargins((12, 0))
|
||||||
self.new_folder_btn.Hide()
|
self.new_folder_btn.Hide()
|
||||||
self.new_folder_btn.Bind(wx.EVT_BUTTON, self.on_new_folder_clicked)
|
self.new_folder_btn.Bind(wx.EVT_BUTTON, self.on_new_folder_clicked)
|
||||||
nav_hbox.Add(self.new_folder_btn, 0, wx.LEFT | wx.ALIGN_CENTER_VERTICAL, 5)
|
nav_hbox.Add(self.new_folder_btn, 0, wx.LEFT | wx.ALIGN_CENTER_VERTICAL, 5)
|
||||||
|
|
||||||
nav_hbox.AddStretchSpacer(1)
|
nav_hbox.AddStretchSpacer(1)
|
||||||
|
|
||||||
self.login_btn = wx.Button(nav_panel, label=self.get_txt("btn_login"), size=(120, 30))
|
self.login_btn = wx.Button(nav_panel, label=self.get_txt("btn_login"), size=(130, 30))
|
||||||
self.login_btn.SetBackgroundColour(wx.Colour(40, 167, 69)) # Grøn
|
self.login_btn.SetBackgroundColour(wx.Colour(40, 167, 69)) # Grøn
|
||||||
self.login_btn.SetForegroundColour(wx.WHITE)
|
self.login_btn.SetForegroundColour(wx.WHITE)
|
||||||
|
self.login_btn.SetBitmap(wx.ArtProvider.GetBitmap(wx.ART_GO_FORWARD, wx.ART_TOOLBAR, (16, 16)))
|
||||||
|
self.login_btn.SetBitmapMargins((12, 0))
|
||||||
self.login_btn.Bind(wx.EVT_BUTTON, self.login)
|
self.login_btn.Bind(wx.EVT_BUTTON, self.login)
|
||||||
nav_hbox.Add(self.login_btn, 0, wx.RIGHT | wx.ALIGN_CENTER_VERTICAL, 10)
|
nav_hbox.Add(self.login_btn, 0, wx.RIGHT | wx.ALIGN_CENTER_VERTICAL, 10)
|
||||||
|
|
||||||
# INDSTILLINGER KNAP
|
# INDSTILLINGER KNAP
|
||||||
self.settings_btn = wx.Button(nav_panel, label=self.get_txt("btn_settings"), size=(120, 30))
|
self.settings_btn = wx.Button(nav_panel, label=self.get_txt("btn_settings"), size=(130, 30))
|
||||||
|
self.settings_btn.SetBitmap(wx.ArtProvider.GetBitmap(wx.ART_REPORT_VIEW, wx.ART_TOOLBAR, (16, 16)))
|
||||||
|
self.settings_btn.SetBitmapMargins((12, 0))
|
||||||
self.settings_btn.Bind(wx.EVT_BUTTON, self.on_settings_clicked)
|
self.settings_btn.Bind(wx.EVT_BUTTON, self.on_settings_clicked)
|
||||||
nav_hbox.Add(self.settings_btn, 0, wx.RIGHT | wx.ALIGN_CENTER_VERTICAL, 10)
|
nav_hbox.Add(self.settings_btn, 0, wx.RIGHT | wx.ALIGN_CENTER_VERTICAL, 10)
|
||||||
|
|
||||||
@@ -523,12 +576,58 @@ class SharePointApp(wx.Frame):
|
|||||||
# 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)
|
||||||
|
|
||||||
# Left side: Tree
|
# Left side: Tree and Favorites Container
|
||||||
self.tree_ctrl = wx.TreeCtrl(self.splitter, style=wx.TR_DEFAULT_STYLE | wx.TR_HIDE_ROOT | wx.BORDER_SUNKEN)
|
self.left_container = wx.Panel(self.splitter)
|
||||||
|
self.left_vbox = wx.BoxSizer(wx.VERTICAL)
|
||||||
|
self.left_container.SetSizer(self.left_vbox)
|
||||||
|
|
||||||
|
# LEFT SIDE - TOP: Tree
|
||||||
|
self.tree_ctrl = wx.TreeCtrl(self.left_container, style=wx.TR_DEFAULT_STYLE | wx.TR_HIDE_ROOT | wx.BORDER_SUNKEN)
|
||||||
self.tree_ctrl.AssignImageList(self.image_list)
|
self.tree_ctrl.AssignImageList(self.image_list)
|
||||||
self.tree_ctrl.Bind(wx.EVT_TREE_ITEM_EXPANDING, self.on_tree_expanding)
|
self.tree_ctrl.Bind(wx.EVT_TREE_ITEM_EXPANDING, self.on_tree_expanding)
|
||||||
self.tree_ctrl.Bind(wx.EVT_TREE_SEL_CHANGED, self.on_tree_selected)
|
self.tree_ctrl.Bind(wx.EVT_TREE_SEL_CHANGED, self.on_tree_selected)
|
||||||
self.tree_ctrl.Bind(wx.EVT_TREE_ITEM_MENU, self.on_tree_right_click)
|
self.tree_ctrl.Bind(wx.EVT_TREE_ITEM_MENU, self.on_tree_right_click)
|
||||||
|
self.left_vbox.Add(self.tree_ctrl, 1, wx.EXPAND)
|
||||||
|
|
||||||
|
# LEFT SIDE - BOTTOM: Favorites
|
||||||
|
self.fav_section = wx.Panel(self.left_container)
|
||||||
|
self.fav_vbox = wx.BoxSizer(wx.VERTICAL)
|
||||||
|
self.fav_section.SetSizer(self.fav_vbox)
|
||||||
|
|
||||||
|
# Fav Header (Toggle)
|
||||||
|
self.fav_header = wx.Panel(self.fav_section)
|
||||||
|
self.fav_header.SetBackgroundColour(wx.Colour(240, 240, 240))
|
||||||
|
h_hbox = wx.BoxSizer(wx.HORIZONTAL)
|
||||||
|
|
||||||
|
# Star Icon
|
||||||
|
star_bmp = wx.ArtProvider.GetBitmap(wx.ART_ADD_BOOKMARK, wx.ART_MENU, (16, 16))
|
||||||
|
self.fav_icon = wx.StaticBitmap(self.fav_header, bitmap=star_bmp)
|
||||||
|
h_hbox.Add(self.fav_icon, 0, wx.ALIGN_CENTER_VERTICAL | wx.LEFT, 5)
|
||||||
|
|
||||||
|
self.fav_label = wx.StaticText(self.fav_header, label=self.get_txt("label_favorites"))
|
||||||
|
self.fav_label.SetFont(wx.Font(9, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD))
|
||||||
|
h_hbox.Add(self.fav_label, 1, wx.ALIGN_CENTER_VERTICAL | wx.LEFT, 5)
|
||||||
|
|
||||||
|
self.fav_toggle_btn = wx.Button(self.fav_header, label="▼" if self.fav_visible else "▲", size=(25, 25), style=wx.BU_EXACTFIT)
|
||||||
|
self.fav_toggle_btn.Bind(wx.EVT_BUTTON, self.toggle_favorites)
|
||||||
|
h_hbox.Add(self.fav_toggle_btn, 0, wx.ALL, 2)
|
||||||
|
|
||||||
|
self.fav_header.SetSizer(h_hbox)
|
||||||
|
self.fav_vbox.Add(self.fav_header, 0, wx.EXPAND)
|
||||||
|
|
||||||
|
# Fav List
|
||||||
|
self.fav_list = wx.ListCtrl(self.fav_section, style=wx.LC_REPORT | wx.LC_NO_HEADER | wx.BORDER_SUNKEN)
|
||||||
|
self.fav_list.AssignImageList(self.image_list, wx.IMAGE_LIST_SMALL)
|
||||||
|
self.fav_list.InsertColumn(0, "Name", width=250)
|
||||||
|
self.fav_list.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.on_favorite_activated)
|
||||||
|
self.fav_list.Bind(wx.EVT_CONTEXT_MENU, self.on_favorite_right_click)
|
||||||
|
self.fav_vbox.Add(self.fav_list, 1, wx.EXPAND)
|
||||||
|
|
||||||
|
self.left_vbox.Add(self.fav_section, 0, wx.EXPAND)
|
||||||
|
if not self.fav_visible:
|
||||||
|
self.fav_list.Hide()
|
||||||
|
else:
|
||||||
|
self.left_vbox.SetItemMinSize(self.fav_section, -1, 200)
|
||||||
|
|
||||||
# Right side: File Area - ListCtrl
|
# Right side: File Area - ListCtrl
|
||||||
self.list_ctrl = wx.ListCtrl(self.splitter, style=wx.LC_REPORT | wx.BORDER_SUNKEN)
|
self.list_ctrl = wx.ListCtrl(self.splitter, style=wx.LC_REPORT | wx.BORDER_SUNKEN)
|
||||||
@@ -544,11 +643,14 @@ class SharePointApp(wx.Frame):
|
|||||||
# AKTIVER DRAG & DROP
|
# AKTIVER DRAG & DROP
|
||||||
self.list_ctrl.SetDropTarget(UploadDropTarget(self.list_ctrl, self))
|
self.list_ctrl.SetDropTarget(UploadDropTarget(self.list_ctrl, self))
|
||||||
|
|
||||||
self.splitter.SplitVertically(self.tree_ctrl, self.list_ctrl, 250)
|
self.splitter.SplitVertically(self.left_container, self.list_ctrl, 250)
|
||||||
self.splitter.SetMinimumPaneSize(100)
|
self.splitter.SetMinimumPaneSize(100)
|
||||||
|
|
||||||
vbox.Add(self.splitter, 1, wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM, 10)
|
vbox.Add(self.splitter, 1, wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM, 10)
|
||||||
|
|
||||||
|
# Load initial favorites
|
||||||
|
self.refresh_fav_list()
|
||||||
|
|
||||||
# 4. STATUS BAR
|
# 4. STATUS BAR
|
||||||
self.status_bar = self.CreateStatusBar()
|
self.status_bar = self.CreateStatusBar()
|
||||||
self.status_bar.SetStatusText(self.get_txt("status_ready"))
|
self.status_bar.SetStatusText(self.get_txt("status_ready"))
|
||||||
@@ -572,39 +674,43 @@ class SharePointApp(wx.Frame):
|
|||||||
if len(selected_indices) == 1:
|
if len(selected_indices) == 1:
|
||||||
item = selected_items[0]
|
item = selected_items[0]
|
||||||
|
|
||||||
if item.get("web_url"):
|
if item['type'] in ["FOLDER", "DRIVE", "SITE"]:
|
||||||
browser_item = menu.Append(wx.ID_ANY, self.get_txt("msg_open_browser"))
|
fav_item = menu.Append(wx.ID_ANY, self.get_txt("btn_add_fav"))
|
||||||
self.Bind(wx.EVT_MENU, lambda e: webbrowser.open(item["web_url"]), browser_item)
|
fav_item.SetBitmap(wx.ArtProvider.GetBitmap(wx.ART_ADD_BOOKMARK, wx.ART_MENU, (16, 16)))
|
||||||
|
self.Bind(wx.EVT_MENU, lambda e, i=item: self.add_favorite(i), fav_item)
|
||||||
download_item = menu.Append(wx.ID_ANY, self.get_txt("msg_download"))
|
menu.AppendSeparator()
|
||||||
self.Bind(wx.EVT_MENU, lambda e: self.on_download_clicked(item), download_item)
|
|
||||||
|
|
||||||
menu.AppendSeparator()
|
|
||||||
|
|
||||||
if item['type'] == "FILE":
|
if item['type'] == "FILE":
|
||||||
edit_item = menu.Append(wx.ID_ANY, self.get_txt("msg_edit_file"))
|
edit_item = menu.Append(wx.ID_ANY, self.get_txt("msg_edit_file"))
|
||||||
|
edit_item.SetBitmap(wx.ArtProvider.GetBitmap(wx.ART_EDIT, wx.ART_MENU, (16, 16)))
|
||||||
self.Bind(wx.EVT_MENU, lambda e, i=item: self.open_file(i), edit_item)
|
self.Bind(wx.EVT_MENU, lambda e, i=item: self.open_file(i), edit_item)
|
||||||
|
|
||||||
if item['type'] in ["FILE", "FOLDER"]:
|
if item['type'] in ["FILE", "FOLDER"]:
|
||||||
rename_item = menu.Append(wx.ID_ANY, f"{self.get_txt('msg_rename')} '{item['name']}'")
|
rename_item = menu.Append(wx.ID_ANY, f"{self.get_txt('msg_rename')} '{item['name']}'")
|
||||||
|
rename_item.SetBitmap(wx.ArtProvider.GetBitmap(wx.ART_REPORT_VIEW, wx.ART_MENU, (16, 16)))
|
||||||
self.Bind(wx.EVT_MENU, lambda e: self.on_rename_clicked(item), rename_item)
|
self.Bind(wx.EVT_MENU, lambda e: self.on_rename_clicked(item), rename_item)
|
||||||
|
|
||||||
delete_item = menu.Append(wx.ID_ANY, f"{self.get_txt('msg_delete')} '{item['name']}'")
|
delete_item = menu.Append(wx.ID_ANY, f"{self.get_txt('msg_delete')} '{item['name']}'")
|
||||||
|
delete_item.SetBitmap(wx.ArtProvider.GetBitmap(wx.ART_DELETE, wx.ART_MENU, (16, 16)))
|
||||||
self.Bind(wx.EVT_MENU, lambda e: self.on_delete_items_clicked(selected_items), delete_item)
|
self.Bind(wx.EVT_MENU, lambda e: self.on_delete_items_clicked(selected_items), delete_item)
|
||||||
else:
|
else:
|
||||||
# Flere emner valgt
|
# Flere emner valgt
|
||||||
delete_items = menu.Append(wx.ID_ANY, f"{self.get_txt('msg_delete')} {len(selected_indices)} " + ("emner" if self.lang == "da" else "items"))
|
delete_items = menu.Append(wx.ID_ANY, f"{self.get_txt('msg_delete')} {len(selected_indices)} " + ("emner" if self.lang == "da" else "items"))
|
||||||
|
delete_items.SetBitmap(wx.ArtProvider.GetBitmap(wx.ART_DELETE, wx.ART_MENU, (16, 16)))
|
||||||
self.Bind(wx.EVT_MENU, lambda e: self.on_delete_items_clicked(selected_items), delete_items)
|
self.Bind(wx.EVT_MENU, lambda e: self.on_delete_items_clicked(selected_items), delete_items)
|
||||||
else:
|
else:
|
||||||
# Menu for selve mappen (hvis man trykker på det tomme felt)
|
# Menu for selve mappen (hvis man trykker på det tomme felt)
|
||||||
if self.current_drive_id:
|
if self.current_drive_id:
|
||||||
upload_item = menu.Append(wx.ID_ANY, self.get_txt("msg_upload_here"))
|
upload_item = menu.Append(wx.ID_ANY, self.get_txt("msg_upload_here"))
|
||||||
|
upload_item.SetBitmap(wx.ArtProvider.GetBitmap(wx.ART_FILE_OPEN, wx.ART_MENU, (16, 16)))
|
||||||
self.Bind(wx.EVT_MENU, self.on_upload_clicked, upload_item)
|
self.Bind(wx.EVT_MENU, self.on_upload_clicked, upload_item)
|
||||||
|
|
||||||
upload_dir_item = menu.Append(wx.ID_ANY, self.get_txt("msg_upload_folder_here"))
|
upload_dir_item = menu.Append(wx.ID_ANY, self.get_txt("msg_upload_folder_here"))
|
||||||
|
upload_dir_item.SetBitmap(wx.ArtProvider.GetBitmap(wx.ART_FOLDER_OPEN, wx.ART_MENU, (16, 16)))
|
||||||
self.Bind(wx.EVT_MENU, self.on_upload_folder_clicked, upload_dir_item)
|
self.Bind(wx.EVT_MENU, self.on_upload_folder_clicked, upload_dir_item)
|
||||||
|
|
||||||
new_folder_item = menu.Append(wx.ID_ANY, self.get_txt("msg_new_folder_here"))
|
new_folder_item = menu.Append(wx.ID_ANY, self.get_txt("msg_new_folder_here"))
|
||||||
|
new_folder_item.SetBitmap(wx.ArtProvider.GetBitmap(wx.ART_NEW_DIR, wx.ART_MENU, (16, 16)))
|
||||||
self.Bind(wx.EVT_MENU, self.on_new_folder_clicked, new_folder_item)
|
self.Bind(wx.EVT_MENU, self.on_new_folder_clicked, new_folder_item)
|
||||||
|
|
||||||
# Tilføj altid opdater punkt til sidst
|
# Tilføj altid opdater punkt til sidst
|
||||||
@@ -612,6 +718,7 @@ class SharePointApp(wx.Frame):
|
|||||||
menu.AppendSeparator()
|
menu.AppendSeparator()
|
||||||
|
|
||||||
refresh_item = menu.Append(wx.ID_ANY, self.get_txt("btn_refresh"))
|
refresh_item = menu.Append(wx.ID_ANY, self.get_txt("btn_refresh"))
|
||||||
|
refresh_item.SetBitmap(wx.ArtProvider.GetBitmap(wx.ART_REDO, wx.ART_MENU, (16, 16)))
|
||||||
self.Bind(wx.EVT_MENU, self.on_refresh, refresh_item)
|
self.Bind(wx.EVT_MENU, self.on_refresh, refresh_item)
|
||||||
|
|
||||||
self.PopupMenu(menu)
|
self.PopupMenu(menu)
|
||||||
@@ -622,12 +729,113 @@ class SharePointApp(wx.Frame):
|
|||||||
if not item.IsOk() or item == self.tree_root: return
|
if not item.IsOk() or item == self.tree_root: return
|
||||||
|
|
||||||
self.tree_ctrl.SelectItem(item)
|
self.tree_ctrl.SelectItem(item)
|
||||||
|
data = self.tree_item_data.get(item)
|
||||||
|
|
||||||
menu = wx.Menu()
|
menu = wx.Menu()
|
||||||
|
if data:
|
||||||
|
fav_item = menu.Append(wx.ID_ANY, self.get_txt("btn_add_fav"))
|
||||||
|
fav_item.SetBitmap(wx.ArtProvider.GetBitmap(wx.ART_ADD_BOOKMARK, wx.ART_MENU, (16, 16)))
|
||||||
|
self.Bind(wx.EVT_MENU, lambda e, d=data: self.add_favorite(d), fav_item)
|
||||||
|
menu.AppendSeparator()
|
||||||
|
|
||||||
refresh_item = menu.Append(wx.ID_ANY, self.get_txt("btn_refresh"))
|
refresh_item = menu.Append(wx.ID_ANY, self.get_txt("btn_refresh"))
|
||||||
|
refresh_item.SetBitmap(wx.ArtProvider.GetBitmap(wx.ART_REDO, wx.ART_MENU, (16, 16)))
|
||||||
self.Bind(wx.EVT_MENU, self.on_refresh, refresh_item)
|
self.Bind(wx.EVT_MENU, self.on_refresh, refresh_item)
|
||||||
self.PopupMenu(menu)
|
self.PopupMenu(menu)
|
||||||
menu.Destroy()
|
menu.Destroy()
|
||||||
|
|
||||||
|
# --- FAVORITES LOGIC ---
|
||||||
|
def add_favorite(self, item):
|
||||||
|
# Check if exists
|
||||||
|
for fav in self.favorites:
|
||||||
|
if fav['id'] == item['id']:
|
||||||
|
self.show_info(self.get_txt("msg_fav_exists", name=item['name']), wx.ICON_INFORMATION)
|
||||||
|
return
|
||||||
|
|
||||||
|
new_fav = {
|
||||||
|
"id": item['id'],
|
||||||
|
"name": item['name'],
|
||||||
|
"type": item['type'],
|
||||||
|
"drive_id": item.get('drive_id'),
|
||||||
|
"site_id": item.get('id') if item['type'] == "SITE" else self.current_site_id,
|
||||||
|
"path": self.current_path + [item['name']]
|
||||||
|
}
|
||||||
|
self.favorites.append(new_fav)
|
||||||
|
self.save_favorites()
|
||||||
|
self.refresh_fav_list()
|
||||||
|
self.show_info(self.get_txt("msg_success"))
|
||||||
|
|
||||||
|
def remove_favorite(self, id):
|
||||||
|
self.favorites = [f for f in self.favorites if f['id'] != id]
|
||||||
|
self.save_favorites()
|
||||||
|
self.refresh_fav_list()
|
||||||
|
|
||||||
|
def save_favorites(self):
|
||||||
|
settings["favorites"] = self.favorites
|
||||||
|
save_settings(settings)
|
||||||
|
|
||||||
|
def refresh_fav_list(self):
|
||||||
|
self.fav_list.DeleteAllItems()
|
||||||
|
for i, fav in enumerate(self.favorites):
|
||||||
|
img_idx = self.idx_star
|
||||||
|
if fav['type'] == "DRIVE": img_idx = self.idx_drive
|
||||||
|
elif fav['type'] == "SITE": img_idx = self.idx_site
|
||||||
|
elif fav['type'] == "FOLDER": img_idx = self.idx_folder
|
||||||
|
|
||||||
|
self.fav_list.InsertItem(i, fav['name'], img_idx)
|
||||||
|
self.fav_list.SetItemData(i, i) # Store index
|
||||||
|
|
||||||
|
def on_favorite_activated(self, event):
|
||||||
|
idx = event.GetIndex()
|
||||||
|
if idx < 0 or idx >= len(self.favorites): return
|
||||||
|
fav = self.favorites[idx]
|
||||||
|
|
||||||
|
self.current_path = fav['path']
|
||||||
|
self.update_path_display()
|
||||||
|
|
||||||
|
# Navigate to contents
|
||||||
|
data = {
|
||||||
|
"type": fav['type'],
|
||||||
|
"id": fav['id'],
|
||||||
|
"drive_id": fav['drive_id'],
|
||||||
|
"path": fav['path']
|
||||||
|
}
|
||||||
|
|
||||||
|
if fav['type'] == "SITE": self.current_site_id = fav['id']
|
||||||
|
elif fav['drive_id']: self.current_drive_id = fav['drive_id']
|
||||||
|
|
||||||
|
self.list_ctrl.DeleteAllItems()
|
||||||
|
self.current_items = []
|
||||||
|
self.set_status(self.get_txt("status_loading_content"))
|
||||||
|
threading.Thread(target=self._fetch_list_contents_bg, args=(data,), daemon=True).start()
|
||||||
|
|
||||||
|
def on_favorite_right_click(self, event):
|
||||||
|
idx = self.fav_list.GetFirstSelected()
|
||||||
|
if idx < 0: return
|
||||||
|
fav = self.favorites[idx]
|
||||||
|
|
||||||
|
menu = wx.Menu()
|
||||||
|
remove_item = menu.Append(wx.ID_ANY, self.get_txt("btn_remove_fav"))
|
||||||
|
remove_item.SetBitmap(wx.ArtProvider.GetBitmap(wx.ART_DEL_BOOKMARK, wx.ART_MENU, (16, 16)))
|
||||||
|
self.Bind(wx.EVT_MENU, lambda e: self.remove_favorite(fav['id']), remove_item)
|
||||||
|
self.PopupMenu(menu)
|
||||||
|
menu.Destroy()
|
||||||
|
|
||||||
|
def toggle_favorites(self, event=None):
|
||||||
|
self.fav_visible = not self.fav_visible
|
||||||
|
self.fav_toggle_btn.SetLabel("▼" if self.fav_visible else "▲")
|
||||||
|
|
||||||
|
if self.fav_visible:
|
||||||
|
self.fav_list.Show()
|
||||||
|
self.left_vbox.SetItemMinSize(self.fav_section, -1, 200)
|
||||||
|
else:
|
||||||
|
self.fav_list.Hide()
|
||||||
|
self.left_vbox.SetItemMinSize(self.fav_section, -1, 30)
|
||||||
|
|
||||||
|
settings["fav_visible"] = self.fav_visible
|
||||||
|
save_settings(settings)
|
||||||
|
self.left_container.Layout()
|
||||||
|
|
||||||
# --- FILHÅNDTERING (Upload, Slet, Ny Mappe) ---
|
# --- FILHÅNDTERING (Upload, Slet, Ny Mappe) ---
|
||||||
def on_delete_items_clicked(self, items):
|
def on_delete_items_clicked(self, items):
|
||||||
if not items: return
|
if not items: return
|
||||||
@@ -994,36 +1202,37 @@ class SharePointApp(wx.Frame):
|
|||||||
self.update_path_display()
|
self.update_path_display()
|
||||||
|
|
||||||
def update_path_display(self):
|
def update_path_display(self):
|
||||||
if not self:
|
if not self: return
|
||||||
return
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
self.path_sizer.Clear(True)
|
self.path_sizer.Clear(True)
|
||||||
|
|
||||||
# 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("📍 " + self.get_txt("title"), "ROOT")
|
self._add_path_segment("📍 " + self.get_txt("title"), "ROOT")
|
||||||
|
|
||||||
for node in nodes:
|
# 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:
|
||||||
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)
|
||||||
|
|
||||||
name = self.tree_ctrl.GetItemText(node)
|
found_node = None
|
||||||
self._add_path_segment(name, node)
|
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()
|
||||||
self.Layout() # Tving rammen til at opdatere, så stien kommer frem
|
self.Layout()
|
||||||
except RuntimeError:
|
except RuntimeError:
|
||||||
# Sker oftest ved lukning hvor objekter er slettet
|
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def _add_path_segment(self, label, node):
|
def _add_path_segment(self, label, node):
|
||||||
|
|||||||
Reference in New Issue
Block a user