Untitled
unknown
plain_text
a year ago
6.9 kB
5
Indexable
class SettingsMenu(ctk.CTkFrame):
def __init__(self, parent, dark_mode):
# Calculate window dimensions
window_width = parent.winfo_width()
window_height = parent.winfo_height()
menu_width = max(window_width // 4, 256) # 1/4 of window width or minimum 256px
# Initialize with required dimensions
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
# Place the frame initially off-screen
self.place(relx=1, rely=0, x=menu_width, y=0, anchor='ne')
# Add placeholder content
self.create_menu_content()
# Create settings button
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.04, 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')
# Create overlay frame with a compatible semi-transparent color
overlay_color = '#000000' if dark_mode else '#000000'
self.overlay = ctk.CTkFrame(
self.parent,
fg_color=overlay_color,
corner_radius=0,
width=window_width,
height=window_height
)
# Bind click event on the overlay to close the menu
self.overlay.bind("<Button-1>", self.close_menu)
def create_menu_content(self):
"""Create the content of the settings menu"""
# Title
title = ctk.CTkLabel(
self,
text="Settings",
font=("Dongle", 24, "bold"),
text_color='white' if self.dark_mode else 'black'
)
title.pack(pady=(20, 10), padx=20, anchor='w')
# Create a frame for the placeholder content
content_frame = ctk.CTkFrame(
self,
fg_color="transparent",
)
content_frame.pack(fill='both', expand=True, padx=20, pady=10)
# Add placeholder sections with separators
placeholders = [
"General Settings",
"User Preferences",
"System Configuration",
"Display Options",
"Language Settings",
"Security Settings",
"About"
]
for i, text in enumerate(placeholders):
# Add separator before text (except for first item)
if i > 0:
separator = ctk.CTkFrame(
content_frame,
height=2,
fg_color='#2c2c2e' if self.dark_mode else '#e5e5e7'
)
separator.pack(fill='x', pady=(15, 15))
# Add placeholder text
label = ctk.CTkLabel(
content_frame,
text=text,
font=("Dongle", 18),
text_color='white' if self.dark_mode else 'black'
)
label.pack(anchor='w', pady=5)
def toggle_menu(self):
"""Toggle the settings menu open or closed"""
if not self.animation_running:
if self.is_open:
self.close_menu()
else:
self.open_menu()
def open_menu(self, event=None):
"""Open the settings menu"""
if not self.is_open and not self.animation_running:
self.is_open = True
self.animation_running = True
# Show overlay
self.overlay.place(x=0, y=0)
self.lift() # Bring menu to front
self.animate_open()
# Deactivate all main window buttons
self.disable_main_buttons()
def close_menu(self, event=None):
"""Close the settings menu"""
if self.is_open and not self.animation_running:
self.is_open = False
self.animation_running = True
self.overlay.place_forget()
self.animate_closed()
# Reactivate all main window buttons
self.enable_main_buttons()
def animate_open(self):
"""Animate the opening of the settings menu"""
if self.current_width < self.target_width:
self.current_width += 40
x_pos = self.target_width - self.current_width
self.place(relx=1, rely=0, x=x_pos, y=0, anchor='ne')
self.after(16, self.animate_open)
else:
self.current_width = self.target_width
self.animation_running = False
def animate_closed(self):
"""Animate the closing of the settings menu"""
if self.current_width > 0:
self.current_width -= 40
x_pos = self.target_width - self.current_width
self.place(relx=1, rely=0, x=x_pos, y=0, anchor='ne')
self.after(16, self.animate_closed)
else:
self.current_width = 0
self.animation_running = False
self.place(relx=1, rely=0, x=self.target_width, y=0, anchor='ne')
def disable_main_buttons(self):
"""Disable all buttons in the main window"""
for widget in self.parent.winfo_children():
if isinstance(widget, ctk.CTkButton):
widget.configure(state="disabled")
def enable_main_buttons(self):
"""Enable all buttons in the main window"""
for widget in self.parent.winfo_children():
if isinstance(widget, ctk.CTkButton):
widget.configure(state="normal")
Editor is loading...
Leave a Comment