feat: implement responsive UI with compact mode for navigation buttons on window resize
This commit is contained in:
@@ -441,8 +441,9 @@ class SharePointApp(wx.Frame):
|
||||
self.active_edits = {} # item_id -> { "name": name, "event": Event, "waiting": bool }
|
||||
self.favorites = settings.get("favorites", [])
|
||||
self.fav_visible = settings.get("fav_visible", True)
|
||||
self.sort_col = 0 # Default Name
|
||||
self.sort_col = 0 # Default (Navn)
|
||||
self.sort_asc = True
|
||||
self.compact_mode = False
|
||||
|
||||
# System Ikoner
|
||||
self.image_list = wx.ImageList(16, 16)
|
||||
@@ -580,6 +581,8 @@ class SharePointApp(wx.Frame):
|
||||
|
||||
nav_panel.SetSizer(nav_hbox)
|
||||
vbox.Add(nav_panel, 0, wx.EXPAND | wx.ALL, 5)
|
||||
self.nav_hbox = nav_hbox # Gem til resize
|
||||
self.nav_panel = nav_panel
|
||||
|
||||
# 2. PATH BREADCRUMBS (Adresselinje-stil)
|
||||
self.path_panel = wx.Panel(panel, style=wx.BORDER_SIMPLE)
|
||||
@@ -673,6 +676,7 @@ class SharePointApp(wx.Frame):
|
||||
self.status_bar.SetStatusText(self.get_txt("status_ready"))
|
||||
|
||||
panel.SetSizer(vbox)
|
||||
self.Bind(wx.EVT_SIZE, self.on_resize)
|
||||
self.Layout()
|
||||
|
||||
def on_right_click(self, event):
|
||||
@@ -1140,19 +1144,17 @@ class SharePointApp(wx.Frame):
|
||||
def refresh_ui_texts(self):
|
||||
# Update UI texts for main frame and buttons
|
||||
self.SetTitle(self.get_txt("title"))
|
||||
self.back_btn.SetLabel(self.get_txt("btn_back"))
|
||||
self.home_btn.SetLabel(self.get_txt("btn_home"))
|
||||
self.done_btn.SetLabel(self.get_txt("btn_save_changes"))
|
||||
self.upload_btn.SetLabel(self.get_txt("btn_upload_file"))
|
||||
self.upload_folder_btn.SetLabel(self.get_txt("btn_upload_folder"))
|
||||
self.new_folder_btn.SetLabel(self.get_txt("btn_new_folder"))
|
||||
self.refresh_btn.SetLabel(self.get_txt("btn_refresh"))
|
||||
self.settings_btn.SetLabel(self.get_txt("btn_settings"))
|
||||
|
||||
# Hvis vi er i compact mode, skal vi ikke sætte labels på knapperne nu
|
||||
if not self.compact_mode:
|
||||
self._update_button_labels(full=True)
|
||||
|
||||
self.settings_btn.SetLabel(self.get_txt("btn_settings") if not self.compact_mode else "")
|
||||
|
||||
if self.access_token:
|
||||
self.login_btn.SetLabel(self.get_txt("btn_logged_in"))
|
||||
self.login_btn.SetLabel(self.get_txt("btn_logged_in") if not self.compact_mode else "")
|
||||
else:
|
||||
self.login_btn.SetLabel(self.get_txt("btn_login"))
|
||||
self.login_btn.SetLabel(self.get_txt("btn_login") if not self.compact_mode else "")
|
||||
|
||||
# Re-set headers for ListCtrl
|
||||
cols = [self.get_txt("col_name"), self.get_txt("col_type"), self.get_txt("col_size"), self.get_txt("col_modified")]
|
||||
@@ -1218,6 +1220,72 @@ class SharePointApp(wx.Frame):
|
||||
self.current_items = []
|
||||
self.update_path_display()
|
||||
|
||||
def on_resize(self, event):
|
||||
width = self.GetSize().width
|
||||
threshold = 1100
|
||||
|
||||
if width < threshold and not self.compact_mode:
|
||||
self.compact_mode = True
|
||||
self._update_button_labels(full=False)
|
||||
elif width >= threshold and self.compact_mode:
|
||||
self.compact_mode = False
|
||||
self._update_button_labels(full=True)
|
||||
|
||||
event.Skip()
|
||||
|
||||
def _update_button_labels(self, full=True):
|
||||
if not self: return
|
||||
try:
|
||||
# Liste over knapper og deres tilhørende oversættelses-nøgle
|
||||
btns = [
|
||||
(self.back_btn, "btn_back", 40, 110),
|
||||
(self.home_btn, "btn_home", 40, 110),
|
||||
(self.refresh_btn, "btn_refresh", 40, 110),
|
||||
(self.upload_btn, "btn_upload_file", 40, 130),
|
||||
(self.upload_folder_btn, "btn_upload_folder", 40, 130),
|
||||
(self.new_folder_btn, "btn_new_folder", 40, 120),
|
||||
(self.settings_btn, "btn_settings", 40, 130)
|
||||
]
|
||||
|
||||
for btn, key, compact_w, full_w in btns:
|
||||
txt = self.get_txt(key)
|
||||
btn.SetLabel(txt if full else "")
|
||||
btn.SetToolTip(txt)
|
||||
btn.SetMinSize((compact_w if not full else full_w, 30))
|
||||
btn.SetSize((compact_w if not full else full_w, 30))
|
||||
btn.SetBitmapMargins((12 if full else 10, 0))
|
||||
|
||||
# Special cases for Login and Done buttons
|
||||
if full:
|
||||
login_txt = self.get_txt("btn_logged_in") if self.access_token else self.get_txt("btn_login")
|
||||
self.login_btn.SetLabel(login_txt)
|
||||
self.login_btn.SetToolTip(login_txt)
|
||||
self.login_btn.SetMinSize((130, 30))
|
||||
self.login_btn.SetBitmapMargins((12, 0))
|
||||
|
||||
done_txt = self.get_txt("btn_save_changes")
|
||||
self.done_btn.SetLabel(done_txt)
|
||||
self.done_btn.SetToolTip(done_txt)
|
||||
self.done_btn.SetMinSize((250, 30))
|
||||
self.done_btn.SetBitmapMargins((12, 0))
|
||||
else:
|
||||
login_txt = self.get_txt("btn_logged_in") if self.access_token else self.get_txt("btn_login")
|
||||
self.login_btn.SetLabel("")
|
||||
self.login_btn.SetToolTip(login_txt)
|
||||
self.login_btn.SetMinSize((40, 30))
|
||||
self.login_btn.SetBitmapMargins((10, 0))
|
||||
|
||||
done_txt = self.get_txt("btn_save_changes")
|
||||
self.done_btn.SetLabel("")
|
||||
self.done_btn.SetToolTip(done_txt)
|
||||
self.done_btn.SetMinSize((40, 30))
|
||||
self.done_btn.SetBitmapMargins((10, 0))
|
||||
|
||||
self.nav_panel.Layout()
|
||||
self.Layout()
|
||||
except RuntimeError:
|
||||
pass
|
||||
|
||||
def update_path_display(self):
|
||||
if not self: return
|
||||
try:
|
||||
|
||||
Reference in New Issue
Block a user