Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/Saludame.activity/gui/widget.py
blob: fef0a8828a6f778c527335cf88a414987e25e8f8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
# -*- coding: utf-8 -*-

# Copyright (C) 2011 ceibalJAM! - ceibaljam.org
# This file is part of Saludame.
#
# Saludame is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Saludame is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with Saludame. If not, see <http://www.gnu.org/licenses/>.

import pygame

class Widget:
    
    """ A widget represents anything drawable on the screen """
    
    def __init__(self, container, rect_in_container, frame_rate, surface=None, tooltip=None):
        self.container = container # Rect, containing the widget
        self.set_rect_in_container(rect_in_container)
        self.frame_rate = frame_rate
        self.background = surface
        self.parent = None
        
        self.center_in_rect = False
        
        # Tooltip
        self.tooltip = tooltip
        self.super_tooltip = None
        self.showing_tooltip = False
        
        # Click Sound
        self.click_sound_path = None
        
        self.visible = True
        
        self.over = False
        
        # A widget it's dirty when it changes somehow, for example an animation will be dirty after every new sprite
        # A widget should change in the update method (before draw)
        self.dirty = True
        
        # When this flag it's on, the widget it's always dirty, unless the update method is overriden
        self.keep_dirty = False
    
    def update(self, frames):
        """ Abstract. This method is called before draw, the purpose is to override it to alter the widget and let
            know the application that the widget became dirty, for example when an animation changes its image or its position."""
        if self.keep_dirty:
            self.set_dirty()
    
    def draw(self, screen):
        self.dirty = False
        if self.visible:
            if self.background:
                if self.center_in_rect:
                    x, y = self.background.get_size()
                    x = self.rect_absolute.size[0] - x
                    y = self.rect_absolute.size[1] - y
                    coords = self.rect_absolute.left + x / 2, self.rect_absolute.top + y / 2
                    screen.blit(self.background, coords)
                    return self.rect_absolute
                else:
                    screen.blit(self.background, self.rect_absolute)
                    return self.rect_absolute
    
    def set_image(self, image):
        self.background = image
    
    def get_image(self):
        return self.background
    
    def set_rect_in_container(self, rect):
        # Rect del widget (relativo al container)
        self.rect_in_container = rect
        
        # Rect del widget (absoluto al screen)
        self.rect_absolute = pygame.Rect((self.container.left + self.rect_in_container.left, self.container.top + self.rect_in_container.top), (self.rect_in_container.size))
  
    def set_rect_size(self, size):
        # Rect del widget (relativo al container)
        self.rect_in_container.size = size
        
        # Rect del widget (absoluto al screen)
        self.rect_absolute.size = size
    
    def set_click_sound_path(self, path):
        self.click_sound_path = path
    
    def set_tooltip(self, text):
        self.tooltip = text
        
    def set_super_tooltip(self, text):
        self.super_tooltip = text
        
    def handle_mouse_down(self, (x, y)):
        self.on_mouse_click()
        
    def on_mouse_click(self):
        if self.click_sound_path:
            sound = pygame.mixer.Sound(self.click_sound_path)
            sound.play()
    
    def on_mouse_over(self):
        self.over = True
    
    def on_mouse_out(self):
        self.over = False
    
    def set_dirty(self):
        self.dirty = True
        if self.parent:
            self.parent.set_dirty()
            
    def get_background_and_owner(self):
        if self.background:
            return (self.background, self)
        elif self.parent:
            return self.parent.get_background_and_owner()
        else:
            return (None, None)

    def get_background(self):
        return self.get_background_and_owner()[0]
    
    def get_background_rect(self):
        background, owner = self.get_background_and_owner()
        if background:
            if self is owner:
                return background.copy()
            else:
                parents_relative_pos = self.rect_absolute.x - owner.rect.x, self.rect_absolute.y - owner.rect.y
                rect = pygame.Rect(parents_relative_pos, self.rect_absolute.size)
                return background.subsurface(rect)
        return pygame.Surface(self.rect_absolute.size)
    
    def contains_point(self, x, y):
        return self.rect_absolute.collidepoint(x, y)