Untitled

 avatar
unknown
plain_text
a month ago
4.4 kB
3
Indexable
def draw(self):
        """Modified draw method to incorporate pulse and press animations"""
        self.delete('all')
        
        # Calculate combined scale from both press and pulse animations
        combined_scale = self.press_scale * self.pulse_scale
        scaled_size = self.size * combined_scale
        
        # Get colors from bin configuration
        circle_color = self.bin_config['color_dark'] if self.dark_mode else self.bin_config['color']
        ring_color = self.get_ring_color()
        progress_color = self.get_progress_color()
        bg_color = '#1c1c1e' if self.dark_mode else '#f5f5f7'
        
        # Configure canvas background
        self.configure(bg=bg_color)
        
        # Create new image for drawing
        self.im = Image.new('RGBA', (1000, 1000), bg_color)
        draw = ImageDraw.Draw(self.im)
        
        # Calculate dimensions for ring
        outer_padding = 40
        ring_width = 40
        circle_padding = 15
        
        # For light mode, draw a white circle behind everything
        if not self.dark_mode:
            draw.ellipse(
                (outer_padding-ring_width, outer_padding-ring_width, 
                 1000-outer_padding+ring_width, 1000-outer_padding+ring_width), 
                fill='white'
            )
        
        # Draw ring (trough)
        draw.arc(
            (outer_padding-ring_width, outer_padding-ring_width, 
             1000-outer_padding+ring_width, 1000-outer_padding+ring_width), 
            -90, 270, ring_color, ring_width
        )
        
        # Draw progress arc
        if self.fill_level > 0:
            angle = int(self.fill_level * 360 / 100)
            draw.arc(
                (outer_padding-ring_width, outer_padding-ring_width, 
                 1000-outer_padding+ring_width, 1000-outer_padding+ring_width), 
                -90, -90 + angle, progress_color, ring_width
            )
        
        # Draw base circle with outline
        if not self.dark_mode:
            # White outline
            draw.ellipse(
                (outer_padding + circle_padding - 1, 
                 outer_padding + circle_padding - 1, 
                 1000-outer_padding - circle_padding + 1, 
                 1000-outer_padding - circle_padding + 1), 
                fill='white'
            )
        
        # Draw colored circle
        draw.ellipse(
            (outer_padding + circle_padding, 
             outer_padding + circle_padding, 
             1000-outer_padding - circle_padding, 
             1000-outer_padding - circle_padding), 
            fill=circle_color
        )
        
        # Resize image with combined scaling
        resized = self.im.resize(
            (int(scaled_size), int(scaled_size)), 
            Image.Resampling.LANCZOS
        )
        self.arc = ImageTk.PhotoImage(resized)
        
        # Calculate centered position accounting for scaling
        x_pos = (self.size - scaled_size) / 2
        y_pos = (self.size - scaled_size) / 2
        
        # Display the image centered
        self.create_image(
            self.size/2,
            self.size/2,
            image=self.arc,
            anchor='center'
        )
        
        # Get text color based on circle color
        def get_text_color(background_color):
            color = background_color.lstrip('#')
            rgb = tuple(int(color[i:i+2], 16) for i in (0, 2, 4))
            luminance = (0.299 * rgb[0] + 0.587 * rgb[1] + 0.114 * rgb[2]) / 255
            return '#000000' if luminance > 0.5 else '#ffffff'
        
        text_color = get_text_color(circle_color)
        
        # Get translated name
        root = self.winfo_toplevel()
        current_language = getattr(root, 'LANGUAGE', 'EN')
        displayed_name = self._bin_config.get_bin_name(
            self.bin_config, 
            getattr(self, 'language', current_language)
        )
        
        # Draw text with combined scaling
        font_size = int(18 * combined_scale)
        self.create_text(
            self.size/2,
            self.size/2,
            text=displayed_name,
            font=('Dongle', font_size, 'normal'),
            fill=text_color,
            justify='center',
            width=self.size-20
        )
Leave a Comment