Untitled

 avatar
unknown
plain_text
4 months ago
4.8 kB
3
Indexable
class ResetFillLevelsScreen(ctk.CTkToplevel):
    def __init__(self, parent, dark_mode: bool, language='EN'):
        super().__init__(parent)
        
        # Make it fullscreen and disable all close operations
        self.overrideredirect(True)
        self.geometry(f"{self.winfo_screenwidth()}x{self.winfo_screenheight()}+0+0")
        self.protocol("WM_DELETE_WINDOW", lambda: None)
        self.attributes('-topmost', True)

        # Set colors based on dark mode
        self.dark_mode = dark_mode
        self.language = language
        self.bg_color = '#1c1c1e' if dark_mode else '#f5f5f7'
        self.configure(fg_color=self.bg_color)
        
        # Create title
        title_label = ctk.CTkLabel(
            self,
            text=TRANSLATIONS[language].get('reset_bins', 'Reset Bins'),
            font=("Dongle", 42, "bold"),
            text_color='white' if dark_mode else 'black'
        )
        title_label.pack(pady=(20, 40))
        
        # Create circles frame
        self.circles_frame = ctk.CTkFrame(self, fg_color=self.bg_color)
        self.circles_frame.place(relx=0.5, rely=0.5, anchor='center')
        
        # Add padding frame
        self.padding_frame = ctk.CTkFrame(self.circles_frame, fg_color=self.bg_color)
        self.padding_frame.pack(padx=50)
        
        # Load bin configuration and fill levels
        self.bin_config = load_bin_config()
        self.levels = load_fill_levels()

        # Create list to track circle widgets
        self.circle_widgets = []

        for bin_data in self.bin_config:
            container = ctk.CTkFrame(self.padding_frame, fg_color=self.bg_color)
            container.pack(side='left', padx=15)
            
            # Create a darkened version of the bin config for reset screen
            reset_config = {
                "id": bin_data["id"],
                "name": bin_data["name"],
                "colors": {
                    "light": self._darken_color(bin_data["colors"]["light"]),
                    "dark": self._darken_color(bin_data["colors"]["dark"])
                }
            }
            
            circle = CircularProgress(
                container,
                size=220,
                bin_config=reset_config,
                dark_mode=dark_mode
            )
            circle.pack()
            
            # Set current fill level
            if bin_data["id"] in self.levels:
                circle.set_fill_level(self.levels[bin_data["id"]])
            
            # Bind click event
            circle.bind('<Button-1>', lambda e, bin_id=bin_data["id"]: self._reset_fill_level(bin_id))
            
            # Store widget reference
            self.circle_widgets.append(circle)

        # Bind click event to the main window for closing
        self.bind('<Button-1>', self.check_click_location)
        
        # Create close button
        self.close_button = ctk.CTkButton(
            self,
            text="×",
            width=40,
            height=40,
            command=self.destroy,
            fg_color='#ff3b30',
            hover_color='#ff453a',
            text_color='white',
            font=("Arial", 24, "bold"),
            corner_radius=20
        )
        self.close_button.place(relx=0.98, rely=0.02, anchor="ne")

    def _darken_color(self, hex_color):
        """Darken a hex color by 20%"""
        hex_color = hex_color.lstrip('#')
        rgb = tuple(int(hex_color[i:i+2], 16) for i in (0, 2, 4))
        darkened = tuple(int(c * 0.8) for c in rgb)
        return '#{:02x}{:02x}{:02x}'.format(*darkened)

    def check_click_location(self, event):
        """Check if click is outside the circles"""
        clicked_widget = event.widget.winfo_containing(event.x_root, event.y_root)
        
        # Check if clicked widget is one of our circles or their containers
        for circle in self.circle_widgets:
            if clicked_widget is circle or clicked_widget in circle.winfo_children():
                return
            
        # If click is on close button, let it handle the event
        if clicked_widget == self.close_button:
            return
                
        # If we get here, the click was outside the circles and not on close button
        self.destroy()

    def _reset_fill_level(self, bin_id):
        """Reset fill level for the specified bin"""
        print(f"Bin {bin_id} emptied")
        
        # Update JSON file
        self.levels[bin_id] = 0
        save_fill_levels(self.levels)
        
        # Update main window circles
        CircularProgress.update_all_instances()
        
        # Close the reset screen after a short delay
        self.after(200, self.destroy)
Editor is loading...
Leave a Comment