Untitled

 avatar
unknown
plain_text
5 months ago
5.0 kB
4
Indexable
class SettingsButton(ctk.CTkButton):
    def __init__(self, parent, dark_mode=False, command=None):
        super().__init__(
            parent,
            text="",
            width=40,
            height=40,
            fg_color="transparent",
            hover_color="#2c2c2e" if dark_mode else "#e5e5e7",
            command=command
        )
        self.dark_mode = dark_mode
        self.load_icon()
        
    def load_icon(self):
        try:
            icon_suffix = "-w" if self.dark_mode else "-b"
            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=(24, 24)
            )
            self.configure(image=icon_image)
        except Exception as e:
            print(f"Error loading settings icon: {e}")
            self.configure(text="⚙️")
            
    def set_dark_mode(self, is_dark):
        self.dark_mode = is_dark
        self.load_icon()
        self.configure(hover_color="#2c2c2e" if is_dark else "#e5e5e7")

class SettingsOverlay(ctk.CTkFrame):
    def __init__(self, parent, dark_mode=False, language='EN'):
        super().__init__(parent)
        self.parent = parent
        self.dark_mode = dark_mode
        self.language = language
        
        # Configure the frame
        self.configure(
            fg_color='#1c1c1e' if dark_mode else '#f5f5f7',
            corner_radius=0
        )
        
        # Initialize with position outside the screen
        self.place(relx=1.0, rely=0, relwidth=0.8, relheight=1.0)
        
        self.setup_ui()
        self.animate_in()
        
    def setup_ui(self):
        # Title
        self.title = ctk.CTkLabel(
            self,
            text=TRANSLATIONS[self.language]['settings'],
            font=('Dongle', 32, 'bold'),
            text_color='white' if self.dark_mode else 'black'
        )
        self.title.place(relx=0.05, rely=0.05)
        
        # Settings sections
        self.create_settings_section()
        
    def create_settings_section(self):
        # Appearance section
        y_pos = 0.15
        spacing = 0.08
        
        # Language switcher
        self.create_setting_label(TRANSLATIONS[self.language]['language'], y_pos)
        self.language_switch = ctk.CTkSegmentedButton(
            self,
            values=['EN', 'DE'],
            command=self.on_language_change,
            selected_color='#007AFF',
            unselected_color='#3a3a3c' if self.dark_mode else '#e5e5e7',
            selected_hover_color='#0051FF'
        )
        self.language_switch.place(relx=0.05, rely=y_pos + 0.04, relwidth=0.3)
        self.language_switch.set(self.language)
        
        # Dark mode toggle
        y_pos += spacing
        self.create_setting_label(TRANSLATIONS[self.language]['dark_mode'], y_pos)
        self.dark_mode_switch = ctk.CTkSwitch(
            self,
            text="",
            command=self.on_dark_mode_change,
            button_color='#007AFF',
            button_hover_color='#0051FF',
            progress_color='#34c759' if not self.dark_mode else '#30d158'
        )
        self.dark_mode_switch.place(relx=0.05, rely=y_pos + 0.04)
        self.dark_mode_switch.select() if self.dark_mode else self.dark_mode_switch.deselect()
        
    def create_setting_label(self, text, y_pos):
        label = ctk.CTkLabel(
            self,
            text=text,
            font=('Dongle', 20),
            text_color='white' if self.dark_mode else 'black'
        )
        label.place(relx=0.05, rely=y_pos)
        
    def on_language_change(self, value):
        self.language = value
        self.parent.LANGUAGE = value
        # Trigger UI update
        self.parent.update_language(value)
        
    def on_dark_mode_change(self):
        is_dark = self.dark_mode_switch.get()
        self.parent.update_dark_mode(is_dark)
        
    def animate_in(self):
        self.animate(1.0, 0.2)
        
    def animate_out(self):
        self.animate(1.0, 1.0, True)
        
    def animate(self, start_x, end_x, closing=False):
        duration = 300  # Animation duration in milliseconds
        steps = 30  # Number of animation steps
        step_time = duration / steps
        distance = end_x - start_x
        step_distance = distance / steps
        
        def animation_step(step):
            if step < steps:
                current_x = start_x + (step_distance * step)
                self.place(relx=current_x, rely=0, relwidth=0.8, relheight=1.0)
                self.after(int(step_time), lambda: animation_step(step + 1))
            elif closing:
                self.destroy()
                
        animation_step(0)
        
    def close(self):
        self.animate_out()
Editor is loading...
Leave a Comment