Fix profile loading to not modify settings.json, preserve patterns
This commit is contained in:
54
src/main.py
54
src/main.py
@@ -113,9 +113,9 @@ class App:
|
|||||||
tab_management_frame = tk.Frame(self.root, bg=bg_color)
|
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))
|
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 = 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(
|
add_tab_btn = tk.Button(
|
||||||
tab_management_frame,
|
tab_management_frame,
|
||||||
@@ -233,19 +233,31 @@ class App:
|
|||||||
with open(profile_path, 'r') as file:
|
with open(profile_path, 'r') as file:
|
||||||
profile_data = json.load(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)
|
# Remove current_profile from profile data if it exists (shouldn't be in profiles)
|
||||||
profile_data.pop("current_profile", None)
|
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.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
|
# Ensure tab_order exists in profile
|
||||||
if "tab_order" not in self.settings:
|
if "tab_order" not in self.settings:
|
||||||
if "lights" in self.settings:
|
if "lights" in self.settings:
|
||||||
self.settings["tab_order"] = list(self.settings["lights"].keys())
|
self.settings["tab_order"] = list(self.settings["lights"].keys())
|
||||||
else:
|
else:
|
||||||
self.settings["tab_order"] = []
|
self.settings["tab_order"] = []
|
||||||
self.settings.save()
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Error loading current profile '{current_profile}': {e}")
|
print(f"Error loading current profile '{current_profile}': {e}")
|
||||||
|
|
||||||
@@ -388,19 +400,31 @@ class App:
|
|||||||
with open(profile_path, 'r') as file:
|
with open(profile_path, 'r') as file:
|
||||||
profile_data = json.load(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)
|
# Remove current_profile from profile data if it exists (shouldn't be in profiles)
|
||||||
profile_data.pop("current_profile", None)
|
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.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
|
# Ensure tab_order exists in profile
|
||||||
if "tab_order" not in self.settings:
|
if "tab_order" not in self.settings:
|
||||||
if "lights" in self.settings:
|
if "lights" in self.settings:
|
||||||
self.settings["tab_order"] = list(self.settings["lights"].keys())
|
self.settings["tab_order"] = list(self.settings["lights"].keys())
|
||||||
else:
|
else:
|
||||||
self.settings["tab_order"] = []
|
self.settings["tab_order"] = []
|
||||||
self.settings.save()
|
|
||||||
|
|
||||||
# Recreate tabs with new settings
|
# Recreate tabs with new settings
|
||||||
self.create_tabs()
|
self.create_tabs()
|
||||||
@@ -929,7 +953,7 @@ class App:
|
|||||||
|
|
||||||
# Right panel for IDs, Patterns, and NEW Color Palette
|
# Right panel for IDs, Patterns, and NEW Color Palette
|
||||||
right_panel_frame = tk.Frame(main_tab_frame, bg=bg_color)
|
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 section - MODIFIED TO BE SIDE-BY-SIDE
|
||||||
ids_frame = tk.Frame(right_panel_frame, bg=bg_color)
|
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 ---
|
# --- 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 = 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 section
|
||||||
patterns_frame = tk.Frame(patterns_and_palette_frame, bg=bg_color, bd=2, relief=tk.GROOVE)
|
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))
|
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 = {}
|
tab.pattern_buttons = {}
|
||||||
@@ -968,14 +992,14 @@ class App:
|
|||||||
pady=self.scale_size(5),
|
pady=self.scale_size(5),
|
||||||
relief=tk.FLAT,
|
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
|
tab.pattern_buttons[pattern_name] = button
|
||||||
|
|
||||||
self.highlight_pattern_button(tab, initial_pattern)
|
self.highlight_pattern_button(tab, initial_pattern)
|
||||||
|
|
||||||
# --- Color Palette Editor Section ---
|
# --- 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 = 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
|
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(
|
tk.Label(color_palette_editor_frame, text="Color Palette:", font=("Arial", self.scale_font(20)), bg=bg_color, fg=fg_color).pack(
|
||||||
|
|||||||
@@ -10,7 +10,11 @@ class Settings(dict):
|
|||||||
def save(self):
|
def save(self):
|
||||||
try:
|
try:
|
||||||
# Create a copy without lights and tab_order (these belong in profiles, not settings.json)
|
# 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"]}
|
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)
|
j = json.dumps(settings_to_save, indent=4)
|
||||||
with open(self.SETTINGS_FILE, 'w') as file:
|
with open(self.SETTINGS_FILE, 'w') as file:
|
||||||
file.write(j)
|
file.write(j)
|
||||||
@@ -23,6 +27,40 @@ class Settings(dict):
|
|||||||
with open(self.SETTINGS_FILE, 'r') as file:
|
with open(self.SETTINGS_FILE, 'r') as file:
|
||||||
loaded_settings = json.load(file)
|
loaded_settings = json.load(file)
|
||||||
self.update(loaded_settings)
|
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.")
|
print("Settings loaded successfully.")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Error loading settings {e}")
|
print(f"Error loading settings {e}")
|
||||||
|
|||||||
Reference in New Issue
Block a user