Untitled

 avatar
unknown
plain_text
5 months ago
7.7 kB
4
Indexable
class SettingsMenu(ctk.CTkFrame):
    def __init__(self, parent, dark_mode):
        # Fixed dimensions
        menu_width = 280  # Fixed width
        window_height = parent.winfo_height()
        
        super().__init__(
            parent, 
            fg_color='#1c1c1e' if dark_mode else '#f5f5f7',
            width=menu_width,
            height=window_height
        )
        
        self.parent = parent
        self.dark_mode = dark_mode
        self.is_open = False
        self.animation_running = False
        self.current_width = 0
        self.target_width = menu_width
        
        # Config file path
        self.config_file = "settings.json"
        
        # Add border color based on dark mode
        self.border_color = '#2c2c2e' if dark_mode else '#e5e5e7'
        self.configure(border_width=2, border_color=self.border_color)
        
        # Place the frame initially off-screen
        self.place(relx=1, rely=0, x=menu_width, y=0, anchor='ne', height=window_height)
        
        # Load saved settings
        self.load_settings()
        
        # Create settings content
        self.create_menu_content()
        
        # Create settings button (rest of the button code remains the same)
        try:
            is_light_bg = not dark_mode
            icon_suffix = "-b" if is_light_bg else "-w"
            
            icon_image = ctk.CTkImage(
                light_image=Image.open(f"icons/settings{icon_suffix}.png"),
                dark_image=Image.open(f"icons/settings{icon_suffix}.png"),
                size=(30, 30)
            )
            self.settings_button = ctk.CTkButton(
                self.parent,
                image=icon_image,
                text="",
                width=30,
                height=30,
                fg_color="transparent",
                hover_color='#2c2c2e' if dark_mode else '#e5e5e7',
                command=self.toggle_menu
            )
            self.settings_button.place(relx=0.97, rely=0.05, anchor='center')
        except Exception as e:
            print(f"Error loading settings icon: {e}")
            self.settings_button = ctk.CTkButton(
                self.parent,
                text="⚙",
                width=30,
                height=30,
                fg_color="transparent",
                hover_color='#2c2c2e' if dark_mode else '#e5e5e7',
                command=self.toggle_menu
            )
            self.settings_button.place(relx=0.97, rely=0.04, anchor='center')
        
        # Bind click event to parent window
        self.parent.bind("<Button-1>", self.check_click_location)

    def load_settings(self):
        try:
            with open(self.config_file, 'r') as f:
                settings = json.load(f)
                self.dark_mode = settings.get('DARK_MODE', False)
                self.language = settings.get('LANGUAGE', 'EN')
        except FileNotFoundError:
            self.dark_mode = False
            self.language = 'EN'
            self.save_settings()

    def save_settings(self):
        settings = {
            'DARK_MODE': self.dark_mode,
            'LANGUAGE': self.language
        }
        with open(self.config_file, 'w') as f:
            json.dump(settings, f)

    def create_menu_content(self):
        """Create the content of the settings menu"""
        text_color = 'white' if self.dark_mode else 'black'
        
        # Title
        title_text = "Einstellungen" if self.language == 'DE' else "Settings"
        title = ctk.CTkLabel(
            self,
            text=title_text,
            font=("Dongle", 24, "bold"),
            text_color=text_color
        )
        title.pack(pady=(20, 30), padx=20, anchor='w')
        
        # Settings container
        settings_frame = ctk.CTkFrame(
            self,
            fg_color="transparent",
        )
        settings_frame.pack(fill='x', padx=20)
        
        # Dark Mode Switch
        dark_mode_text = "Dunkler Modus" if self.language == 'DE' else "Dark Mode"
        dark_mode_switch = ctk.CTkSwitch(
            settings_frame,
            text=dark_mode_text,
            command=self.toggle_dark_mode,
            font=("Dongle", 18),
            text_color=text_color,
        )
        dark_mode_switch.pack(pady=(0, 20), anchor='w')
        dark_mode_switch.select() if self.dark_mode else dark_mode_switch.deselect()
        
        # Language Selection
        language_text = "Sprache" if self.language == 'DE' else "Language"
        language_label = ctk.CTkLabel(
            settings_frame,
            text=language_text,
            font=("Dongle", 18),
            text_color=text_color
        )
        language_label.pack(anchor='w')
        
        language_var = ctk.StringVar(value=self.language)
        language_frame = ctk.CTkFrame(settings_frame, fg_color="transparent")
        language_frame.pack(fill='x', pady=(5, 20))
        
        # Radio buttons for language selection
        de_radio = ctk.CTkRadioButton(
            language_frame,
            text="Deutsch",
            variable=language_var,
            value="DE",
            command=lambda: self.change_language("DE"),
            font=("Dongle", 16),
            text_color=text_color
        )
        de_radio.pack(side='left', padx=(0, 20))
        
        en_radio = ctk.CTkRadioButton(
            language_frame,
            text="English",
            variable=language_var,
            value="EN",
            command=lambda: self.change_language("EN"),
            font=("Dongle", 16),
            text_color=text_color
        )
        en_radio.pack(side='left')

    def toggle_dark_mode(self):
        self.dark_mode = not self.dark_mode
        self.parent.configure(fg_color='#1c1c1e' if self.dark_mode else '#f5f5f7')
        self.configure(fg_color='#1c1c1e' if self.dark_mode else '#f5f5f7')
        self.border_color = '#2c2c2e' if self.dark_mode else '#e5e5e7'
        self.configure(border_color=self.border_color)
        
        # Update appearance mode
        ctk.set_appearance_mode("dark" if self.dark_mode else "light")
        
        # Update circles
        for circle in self.parent.winfo_children():
            if isinstance(circle, CircularProgress):
                circle.set_dark_mode(self.dark_mode)
        
        # Save settings
        self.save_settings()
        
        # Recreate menu content to update colors
        for widget in self.winfo_children():
            widget.destroy()
        self.create_menu_content()

    def change_language(self, new_language):
        self.language = new_language
        self.parent.LANGUAGE = new_language  # Update root's language
        
        # Update circle labels
        for circle in self.parent.winfo_children():
            if isinstance(circle, CircularProgress):
                waste_type = circle.label
                # Find the corresponding translation
                for de_key, en_value in TRANSLATIONS['EN'].items():
                    if (en_value == waste_type and new_language == 'DE') or \
                       (de_key == waste_type and new_language == 'EN'):
                        circle.label = TRANSLATIONS[new_language][de_key]
                        circle.draw()
                        break
        
        # Save settings
        self.save_settings()
        
        # Recreate menu content to update text
        for widget in self.winfo_children():
            widget.destroy()
        self.create_menu_content()
Editor is loading...
Leave a Comment