From 751a781634ec712734c08e11dae8235a5a74e18d Mon Sep 17 00:00:00 2001 From: scheianu Date: Sat, 23 Aug 2025 17:45:03 +0300 Subject: [PATCH] Clean up and simplify settings screen connection tab; remove duplicate/test code and fix UI issues --- tkinter_app/src/settings_screen.py | 153 ++++++++++++++++++++++------- 1 file changed, 119 insertions(+), 34 deletions(-) diff --git a/tkinter_app/src/settings_screen.py b/tkinter_app/src/settings_screen.py index 158c7a4..477878a 100644 --- a/tkinter_app/src/settings_screen.py +++ b/tkinter_app/src/settings_screen.py @@ -172,40 +172,125 @@ class SettingsWindow: scrollable_frame.bind("", lambda e: canvas.configure(scrollregion=canvas.bbox("all"))) canvas.create_window((0, 0), window=scrollable_frame, anchor="nw") canvas.configure(yscrollcommand=scrollbar.set) - - # Server connection card - server_card = self.create_settings_card(scrollable_frame, "🖥️ Server Connection", - "Configure your signage server connection details") - - # Server IP/Domain - self.create_input_field(server_card, "Server IP/Domain:", "server_ip_var", - placeholder="e.g., digi-server.example.com") - - # Port - self.create_input_field(server_card, "Port:", "port_var", width=15, - placeholder="8880") - - # Device settings card - device_card = self.create_settings_card(scrollable_frame, "📱 Device Settings", - "Identify this display device") - - # Screen/Device name - self.create_input_field(device_card, "Device Name:", "screen_name_var", - placeholder="e.g., lobby-display-01") - - # QuickConnect key - self.create_input_field(device_card, "QuickConnect Key:", "quickconnect_var", - password=True, placeholder="Enter your access key") - - # Connection testing card - test_card = self.create_settings_card(scrollable_frame, "🔗 Connection Test", - "Test your server connection") - - test_btn_frame = tk.Frame(test_card, bg=self.colors['bg_tertiary']) - test_btn_frame.pack(fill=tk.X, pady=10) - - test_btn = self.create_action_button(test_btn_frame, "🔗 Test Connection", - self.test_connection, self.colors['accent']) + # Pack canvas and scrollbar so content is visible + canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) + scrollbar.pack(side=tk.RIGHT, fill=tk.Y) + + # --- Compact Server Connection Section (no card, all fields labeled, test button visible) --- + config = load_config() + server_val = config.get('server_ip', '') + port_val = config.get('port', '') + + connect_section = tk.Frame(scrollable_frame, bg=self.colors['bg_tertiary']) + connect_section.pack(fill=tk.X, pady=10, padx=10) + + # Server and Port row + server_port_row = tk.Frame(connect_section, bg=self.colors['bg_tertiary']) + server_port_row.pack(fill=tk.X, pady=6) + + if not hasattr(self, 'server_ip_var'): + self.server_ip_var = tk.StringVar(value=server_val) + server_label = tk.Label(server_port_row, text="Server:", font=('Segoe UI', 12, 'bold'), bg=self.colors['bg_tertiary'], fg=self.colors['text_primary'], width=10, anchor='w') + server_label.pack(side=tk.LEFT, padx=(0, 2)) + server_entry = TouchOptimizedEntry(server_port_row, virtual_keyboard=self.virtual_keyboard, textvariable=self.server_ip_var, width=28, font=('Segoe UI', 12), bg=self.colors['bg_primary'], fg=self.colors['text_primary'], insertbackground=self.colors['accent'], relief=tk.FLAT, bd=10) + server_entry.pack(side=tk.LEFT, padx=(0, 8), pady=5) + self.add_placeholder(server_entry, "e.g., digi-server.example.com") + + if not hasattr(self, 'port_var'): + self.port_var = tk.StringVar(value=port_val) + port_label = tk.Label(server_port_row, text="Port:", font=('Segoe UI', 12, 'bold'), bg=self.colors['bg_tertiary'], fg=self.colors['text_primary'], width=6, anchor='w') + port_label.pack(side=tk.LEFT, padx=(0, 2)) + port_entry = TouchOptimizedEntry(server_port_row, virtual_keyboard=self.virtual_keyboard, textvariable=self.port_var, width=8, font=('Segoe UI', 12), bg=self.colors['bg_primary'], fg=self.colors['text_primary'], insertbackground=self.colors['accent'], relief=tk.FLAT, bd=10) + port_entry.pack(side=tk.LEFT, pady=5) + self.add_placeholder(port_entry, "8880") + + # Logic: enable port only if server is IP (not ending with .com) + def update_port_state(*args): + server_val = self.server_ip_var.get().strip() + if server_val.endswith('.com') or ('.' in server_val and not server_val.replace('.', '').isdigit()): + port_entry.config(state='disabled') + else: + port_entry.config(state='normal') + self.server_ip_var.trace_add('write', update_port_state) + update_port_state() + + # Device Name row (compact) + device_row = tk.Frame(connect_section, bg=self.colors['bg_tertiary']) + device_row.pack(fill=tk.X, pady=6) + screen_name_val = config.get('screen_name', '') + if not hasattr(self, 'screen_name_var'): + self.screen_name_var = tk.StringVar(value=screen_name_val) + screen_label = tk.Label(device_row, text="Device Name:", font=('Segoe UI', 12, 'bold'), bg=self.colors['bg_tertiary'], fg=self.colors['text_primary'], width=14, anchor='w') + screen_label.pack(side=tk.LEFT, padx=(0, 2)) + screen_entry = TouchOptimizedEntry(device_row, virtual_keyboard=self.virtual_keyboard, textvariable=self.screen_name_var, width=22, font=('Segoe UI', 12), bg=self.colors['bg_primary'], fg=self.colors['text_primary'], insertbackground=self.colors['accent'], relief=tk.FLAT, bd=10, state='readonly') + screen_entry.pack(side=tk.LEFT, padx=(0, 8), pady=5) + self.add_placeholder(screen_entry, "e.g., lobby-display-01") + + # QuickConnect Key row (compact) + quickconnect_val = config.get('quickconnect_key', '') + if not hasattr(self, 'quickconnect_var'): + self.quickconnect_var = tk.StringVar(value=quickconnect_val) + quick_label = tk.Label(device_row, text="QuickConnect Key:", font=('Segoe UI', 12, 'bold'), bg=self.colors['bg_tertiary'], fg=self.colors['text_primary'], width=16, anchor='w') + quick_label.pack(side=tk.LEFT, padx=(0, 2)) + quick_entry = TouchOptimizedEntry(device_row, virtual_keyboard=self.virtual_keyboard, textvariable=self.quickconnect_var, width=18, font=('Segoe UI', 12), bg=self.colors['bg_primary'], fg=self.colors['text_primary'], insertbackground=self.colors['accent'], relief=tk.FLAT, bd=10, state='readonly') + quick_entry.pack(side=tk.LEFT, pady=5) + quick_entry.configure(show='*') + self.add_placeholder(quick_entry, "Enter your access key") + # Make device fields editable by default (no Edit button) + screen_entry.config(state='normal') + quick_entry.config(state='normal', show='') + + # --- Row for Test Connection and Save Settings buttons --- + btn_row = tk.Frame(connect_section, bg=self.colors['bg_tertiary']) + btn_row.pack(fill=tk.X, pady=(10, 0)) + + # Test Connection button + test_btn = self.create_action_button(btn_row, "🔗 Test Connection", self.test_connection, self.colors['accent']) + test_btn.pack(side=tk.LEFT, padx=(0, 10)) + + # Save Settings button with color logic + save_btn_color = self.colors['accent'] + save_btn = tk.Button( + btn_row, text="💾 Save Settings", font=('Segoe UI', 12, 'bold'), + bg=save_btn_color, fg=self.colors['text_primary'], + activebackground=save_btn_color, activeforeground=self.colors['text_primary'], + relief=tk.RAISED, bd=2, padx=16, pady=6, cursor='hand2', + ) + save_btn.pack(side=tk.LEFT) + + def set_save_btn_color(color): + save_btn.config(bg=color, activebackground=color) + + def save_settings_and_test(): + # Save current values to config + config['server_ip'] = self.server_ip_var.get().strip() + config['port'] = self.port_var.get().strip() + config['screen_name'] = self.screen_name_var.get().strip() + config['quickconnect_key'] = self.quickconnect_var.get().strip() + # Save to app_config.txt + try: + with open(APP_CONFIG_PATH, 'w') as f: + for k, v in config.items(): + f.write(f"{k}={v}\n") + except Exception as e: + set_save_btn_color('red') + return + # Test server availability + import requests + server = config['server_ip'] + port = config['port'] + url = f"http://{server}:{port}/api/playlist/version" + try: + resp = requests.get(url, timeout=3) + if resp.status_code == 200: + set_save_btn_color('green') + else: + set_save_btn_color('red') + except Exception: + set_save_btn_color('red') + + save_btn.config(command=save_settings_and_test) + test_btn.pack(side=tk.LEFT, padx=5) canvas.pack(side="left", fill="both", expand=True, padx=20, pady=20)