diff --git a/src/main.py b/src/main.py index 1816c9a..d5f8a8e 100644 --- a/src/main.py +++ b/src/main.py @@ -113,9 +113,9 @@ class App: tab_management_frame = tk.Frame(self.root, bg=bg_color) tab_management_frame.pack(side=tk.BOTTOM, fill=tk.X, padx=self.scale_size(10), pady=self.scale_size(5)) - # Create Notebook for tabs (packed after buttons so it takes remaining space) + # Create Notebook for tabs (packed before buttons so it takes remaining space) self.notebook = ttk.Notebook(self.root) - self.notebook.pack(expand=1, fill="both", before=tab_management_frame) + self.notebook.pack(expand=True, fill="both", before=tab_management_frame) add_tab_btn = tk.Button( tab_management_frame, @@ -233,19 +233,31 @@ class App: with open(profile_path, 'r') as file: profile_data = json.load(file) - # Update settings with profile data + # Load profile data into settings for use in the app # Remove current_profile from profile data if it exists (shouldn't be in profiles) profile_data.pop("current_profile", None) - self.settings.clear() + # Preserve patterns and other settings.json-only data + patterns_backup = self.settings.get("patterns", {}) + tab_password_backup = self.settings.get("tab_password", "") + # Update with profile data (lights, tab_order, tab_password from profile) self.settings.update(profile_data) - self.settings["current_profile"] = current_profile # Store in settings.json, not profile + # Restore settings.json-only data + self.settings["patterns"] = patterns_backup + self.settings["current_profile"] = current_profile + # Only save current_profile to settings.json, not profile data + settings_to_save = { + "tab_password": tab_password_backup, + "current_profile": current_profile, + "patterns": patterns_backup + } + with open("settings.json", 'w') as f: + json.dump(settings_to_save, f, indent=4) # Ensure tab_order exists in profile if "tab_order" not in self.settings: if "lights" in self.settings: self.settings["tab_order"] = list(self.settings["lights"].keys()) else: self.settings["tab_order"] = [] - self.settings.save() except Exception as e: print(f"Error loading current profile '{current_profile}': {e}") @@ -388,19 +400,31 @@ class App: with open(profile_path, 'r') as file: profile_data = json.load(file) - # Update settings with profile data + # Load profile data into settings for use in the app # Remove current_profile from profile data if it exists (shouldn't be in profiles) profile_data.pop("current_profile", None) - self.settings.clear() + # Preserve patterns and other settings.json-only data + patterns_backup = self.settings.get("patterns", {}) + tab_password_backup = self.settings.get("tab_password", "") + # Update with profile data (lights, tab_order, tab_password from profile) self.settings.update(profile_data) - self.settings["current_profile"] = profile_name # Store in settings.json, not profile + # Restore settings.json-only data + self.settings["patterns"] = patterns_backup + self.settings["current_profile"] = profile_name + # Only save current_profile to settings.json, not profile data + settings_to_save = { + "tab_password": tab_password_backup, + "current_profile": profile_name, + "patterns": patterns_backup + } + with open("settings.json", 'w') as f: + json.dump(settings_to_save, f, indent=4) # Ensure tab_order exists in profile if "tab_order" not in self.settings: if "lights" in self.settings: self.settings["tab_order"] = list(self.settings["lights"].keys()) else: self.settings["tab_order"] = [] - self.settings.save() # Recreate tabs with new settings self.create_tabs() @@ -929,7 +953,7 @@ class App: # Right panel for IDs, Patterns, and NEW Color Palette right_panel_frame = tk.Frame(main_tab_frame, bg=bg_color) - right_panel_frame.pack(side=tk.LEFT, padx=20, pady=10, anchor="n", expand=True, fill="both") + right_panel_frame.pack(side=tk.LEFT, padx=self.scale_size(20), pady=self.scale_size(10), anchor="n", expand=True, fill="both") # IDs section - MODIFIED TO BE SIDE-BY-SIDE ids_frame = tk.Frame(right_panel_frame, bg=bg_color) @@ -947,11 +971,11 @@ class App: # --- New Frame to hold Patterns and Color Palette side-by-side --- patterns_and_palette_frame = tk.Frame(right_panel_frame, bg=bg_color) - patterns_and_palette_frame.pack(pady=20, fill=tk.BOTH, expand=True) + patterns_and_palette_frame.pack(pady=self.scale_size(20), fill=tk.BOTH, expand=True) # Patterns section patterns_frame = tk.Frame(patterns_and_palette_frame, bg=bg_color, bd=2, relief=tk.GROOVE) - patterns_frame.pack(side=tk.LEFT, padx=10, pady=5, fill=tk.BOTH, expand=True) # Pack to the left + patterns_frame.pack(side=tk.LEFT, padx=self.scale_size(10), pady=self.scale_size(5), fill=tk.BOTH, expand=True) # Pack to the left tk.Label(patterns_frame, text="Patterns:", font=("Arial", self.scale_font(20)), bg=bg_color, fg=fg_color).pack(pady=self.scale_size(10)) tab.pattern_buttons = {} @@ -968,14 +992,14 @@ class App: pady=self.scale_size(5), relief=tk.FLAT, ) - button.pack(pady=5, fill=tk.X) + button.pack(pady=self.scale_size(5), fill=tk.X) tab.pattern_buttons[pattern_name] = button self.highlight_pattern_button(tab, initial_pattern) # --- Color Palette Editor Section --- color_palette_editor_frame = tk.Frame(patterns_and_palette_frame, bg=bg_color, bd=2, relief=tk.GROOVE) - color_palette_editor_frame.pack(side=tk.LEFT, padx=10, pady=5, fill=tk.BOTH, expand=True) # Pack to the left + color_palette_editor_frame.pack(side=tk.LEFT, padx=self.scale_size(10), pady=self.scale_size(5), fill=tk.BOTH, expand=True) # Pack to the left tab.color_palette_editor_frame = color_palette_editor_frame # Store reference for update_ui_for_pattern tk.Label(color_palette_editor_frame, text="Color Palette:", font=("Arial", self.scale_font(20)), bg=bg_color, fg=fg_color).pack( diff --git a/src/settings.py b/src/settings.py index 89c167e..58b4ae7 100644 --- a/src/settings.py +++ b/src/settings.py @@ -10,7 +10,11 @@ class Settings(dict): def save(self): try: # Create a copy without lights and tab_order (these belong in profiles, not settings.json) + # But keep patterns, tab_password, and current_profile settings_to_save = {k: v for k, v in self.items() if k not in ["lights", "tab_order"]} + # Ensure patterns are always included if they exist + if "patterns" in self: + settings_to_save["patterns"] = self["patterns"] j = json.dumps(settings_to_save, indent=4) with open(self.SETTINGS_FILE, 'w') as file: file.write(j) @@ -23,6 +27,40 @@ class Settings(dict): with open(self.SETTINGS_FILE, 'r') as file: loaded_settings = json.load(file) self.update(loaded_settings) + # Ensure patterns exist (they should always be in settings.json) + if "patterns" not in self: + # Initialize with default patterns if missing + self["patterns"] = { + "on": {"min_delay": 10, "max_delay": 10000}, + "off": {"min_delay": 10, "max_delay": 10000}, + "rainbow": {"Step Rate": "n1", "min_delay": 10, "max_delay": 10000}, + "transition": {"min_delay": 10, "max_delay": 10000}, + "chase": { + "Colour 1 Length": "n1", + "Colour 2 Length": "n2", + "Step 1": "n3", + "Step 2": "n4", + "min_delay": 10, + "max_delay": 10000 + }, + "pulse": { + "Attack": "n1", + "Hold": "n2", + "Decay": "n3", + "min_delay": 10, + "max_delay": 10000 + }, + "circle": { + "Head Rate": "n1", + "Max Length": "n2", + "Tail Rate": "n3", + "Min Length": "n4", + "min_delay": 10, + "max_delay": 10000 + }, + "blink": {"min_delay": 10, "max_delay": 10000} + } + self.save() # Save to persist the default patterns print("Settings loaded successfully.") except Exception as e: print(f"Error loading settings {e}")