pygameui.MetaWidget.MetaWidget.setTagAttr()   A
last analyzed

Complexity

Conditions 3

Size

Total Lines 4
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 4
nop 4
dl 0
loc 4
rs 10
c 0
b 0
f 0
1
#
2
#  Copyright 2001 - 2016 Ludek Smid [http://www.ospace.net/]
3
#
4
#  This file is part of Pygame.UI.
5
#
6
#  Pygame.UI is free software; you can redistribute it and/or modify
7
#  it under the terms of the Lesser GNU General Public License as published by
8
#  the Free Software Foundation; either version 2.1 of the License, or
9
#  (at your option) any later version.
10
#
11
#  Pygame.UI is distributed in the hope that it will be useful,
12
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
13
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
#  Lesser GNU General Public License for more details.
15
#
16
#  You should have received a copy of the Lesser GNU General Public License
17
#  along with Pygame.UI; if not, write to the Free Software
18
#  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
19
#
20
21
import pygame.event
22
import Const
23
from Widget import Widget
24
25
class MetaWidget(Widget):
26
27
    def __init__(self, parent, **kwargs):
28
        Widget.__init__(self, parent)
29
        self.__dict__['metaType'] = Const.TYPE_METAWIDGET
30
        self.__dict__['_widgetArea'] = None
31
        self.__dict__['_widgetSurface'] = None
32
        self.__dict__['redrawMyself'] = 1
33
        self.__dict__['redrawWidgets'] = {}
34
        self.__dict__['_oldWidgetArea'] = pygame.Rect(0, 0, 0, 0)
35
        self.__dict__['widgets'] = []
36
        self.__dict__['widgetMap'] = {}
37
        self.__dict__['layoutManager'] = None
38
        self.__dict__['statusBar'] = None
39
        self.__dict__['statusBarText'] = None
40
        self.processKWArguments(kwargs)
41
42
    def registerWidget(self, widget):
43
        if widget not in self.widgets:
44
            self.widgets.append(widget)
45
        if widget.id:
46
            self.widgetMap[widget.id] = widget
47
48
    def setTagAttr(self, tagName, attrName, value):
49
        for widget in self.widgets:
50
            if tagName in widget.tags:
51
                setattr(widget, attrName, value)
52
53
    def getWidgetsByTag(self, tagName):
54
        result = []
55
        for widget in self.widgets:
56
            if tagName in widget.tags:
57
                result.append(widget)
58
        return result
59
60
    def setStatus(self, text):
61
        self.statusBarText = text
62
        if self.statusBar:
63
            self.statusBar.text = text
64
            self.app.update()
65
        else:
66
            self.parent.setStatus(text)
67
68
    def setTempStatus(self, text):
69
        if self.statusBar:
70
            if text:
71
                self.statusBar.text = text
72
            else:
73
                self.statusBar.text = self.statusBarText
74
        else:
75
            self.parent.setTempStatus(text)
76
77
    def __getattr__(self, name):
78
        # no __*__ methods
79
        if name[:2] == '__':
80
            raise AttributeError(name)
81
        # access widgets
82
        value = self.__dict__['widgetMap'].get(name, Const.NoValue)
83
        if value != Const.NoValue:
84
            return value
85
        else:
86
            raise AttributeError(name)
87
88
    def layoutWidgets(self):
89
        if self.layoutManager:
90
            self.layoutManager.metaWidget = self
91
            self.layoutManager.layoutWidgets()
92
93
    def redraw(self, widget, redrawParent = 0):
94
        if widget.visible:
95
            self.redrawWidgets[widget] = None
96
        elif self.redrawWidgets.has_key(widget):
97
            del self.redrawWidgets[widget]
98
        if not self._changeReported:
99
            self.parent.redraw(self)
100
            self.__dict__['_changeReported'] = 1
101
        if redrawParent:
102
            self.__dict__['redrawMyself'] = 1
103
104
    def drawMetaWidget(self, surface):
105
        return pygame.Rect(self.rect)
106
107
    def draw(self, surface):
108
        changed = None
109
        if self.visible and self.redrawMyself or not self._widgetArea:
110
            self._widgetArea = self.drawMetaWidget(surface)
111
            self._widgetArea = self._widgetArea.clip((0,0), surface.get_size())
112
            if self._widgetArea.width == 0:
113
                # area is invisible
114
                return
115
            self._widgetSurface = pygame.Surface(self._widgetArea.size)
116
            self._widgetSurface.blit(surface, (0,0), self._widgetArea)
117
            # force to redraw all widgets
118
            #@print self.__class__, 'FORCE REDRAW'
119
            for widget in self.widgets:
120
                if widget.visible:
121
                    self.redrawWidgets[widget] = None
122
                    if widget.metaType == Const.TYPE_METAWIDGET:
123
                        widget.__dict__['redrawMyself'] = 1
124
            self.__dict__['redrawMyself'] = 0
125
            changed = pygame.Rect(self._widgetSurface.get_rect())
126
        if self._widgetArea and self._widgetArea.size != self._oldWidgetArea.size:
127
            #@print self.__class__, 'LAYING OUT WIDGETS'
128
            self.layoutWidgets()
129
            self._oldWidgetArea = pygame.Rect(self._widgetArea)
130
        if self._widgetSurface and self.visible and self.redrawWidgets:
131
            for widget in self.redrawWidgets:
132
                assert widget.visible == 1
133
                #@print 'Draw', widget,
134
                rect = widget.draw(self._widgetSurface)
135
                #@print "X", rect
136
                if changed and rect: changed.union_ip(rect)
137
                elif rect : changed = pygame.Rect(rect)
138
                widget.__dict__['_changeReported'] = 0
139
            self.__dict__['redrawWidgets'] = {}
140
            if changed:
141
                surface.blit(self._widgetSurface, changed.move(self._widgetArea.topleft), changed)
142
                changed.move_ip(self._widgetArea.topleft)
143
            #@print "Changed", changed
144
            return changed
145
146
    def transpose(self, pos):
147
        if not self._widgetArea:
148
            # TODO fix this, should be assert self._widgetArea
149
            return (-1, -1)
150
        return (pos[0] - self._widgetArea.left,
151
                pos[1] - self._widgetArea.top)
152
153
    def processMB1Down(self, evt):
154
        evt = pygame.event.Event(pygame.MOUSEBUTTONDOWN, pos = self.transpose(evt.pos), button = evt.button)
155
        for widget in self.widgets:
156
            if widget.rect.collidepoint(evt.pos) and widget.enabled and widget.visible:
157
                if widget.metaType == Const.TYPE_WIDGET:
158
                    self.app.setFocus(widget)
159
                return widget.processMB1Down(evt)
160
        self.app.setFocus(None)
161
        return Const.NoEvent
162
163
    def processMB1Up(self, evt):
164
        evt = pygame.event.Event(pygame.MOUSEBUTTONUP, pos = self.transpose(evt.pos), button = evt.button)
165
        widget = self.app.focusedWidget
166
        if widget and widget.enabled and widget.visible:
167
            widget.processMB1UpMissed(evt)
168
        for widget in self.widgets:
169
            if widget.rect.collidepoint(evt.pos) and widget.enabled and widget.visible:
170
                return widget.processMB1Up(evt)
171
        return Const.NoEvent
172
173
    def processMB3Down(self, evt):
174
        evt = pygame.event.Event(pygame.MOUSEBUTTONDOWN, pos = self.transpose(evt.pos), button = evt.button)
175
        for widget in self.widgets:
176
            if widget.rect.collidepoint(evt.pos) and widget.enabled and widget.visible:
177
                if widget.metaType == Const.TYPE_WIDGET:
178
                    self.app.setFocus(widget)
179
                return widget.processMB3Down(evt)
180
        self.app.setFocus(None)
181
        return Const.NoEvent
182
183
    def processMB3Up(self, evt):
184
        evt = pygame.event.Event(pygame.MOUSEBUTTONUP, pos = self.transpose(evt.pos), button = evt.button)
185
        widget = self.app.focusedWidget
186
        if widget and widget.enabled and widget.visible:
187
            widget.processMB3UpMissed(evt)
188
        for widget in self.widgets:
189
            if widget.rect.collidepoint(evt.pos) and widget.enabled and widget.visible:
190
                return widget.processMB3Up(evt)
191
        return Const.NoEvent
192
193
    def processMMotion(self, evt):
194
        evt = pygame.event.Event(pygame.MOUSEMOTION, pos = self.transpose(evt.pos), rel = evt.rel, buttons = evt.buttons)
195
        for widget in self.widgets:
196
            if widget.rect.collidepoint(evt.pos) and widget.enabled and widget.visible:
197
                if widget.metaType == Const.TYPE_WIDGET:
198
                    self.app.setMouseOver(widget)
199
                return widget.processMMotion(evt)
200
        self.app.setMouseOver(None)
201
        return Const.NoEvent
202
203
    def processMWUp(self, evt):
204
        evt = pygame.event.Event(pygame.MOUSEBUTTONDOWN, pos = self.transpose(evt.pos), button = evt.button)
205
        for widget in self.widgets:
206
            if widget.rect.collidepoint(evt.pos) and widget.enabled and widget.visible:
207
                return widget.processMWUp(evt)
208
        self.app.setFocus(None)
209
        return Const.NoEvent
210
211
    def processMWDown(self, evt):
212
        evt = pygame.event.Event(pygame.MOUSEBUTTONDOWN, pos = self.transpose(evt.pos), button = evt.button)
213
        for widget in self.widgets:
214
            if widget.rect.collidepoint(evt.pos) and widget.enabled and widget.visible:
215
                return widget.processMWDown(evt)
216
        self.app.setFocus(None)
217
        return Const.NoEvent
218
219
    def onMouseOver(self):
220
        pass
221
222
    def onMouseOut(self):
223
        pass
224
225 View Code Duplication
    def __setattr__(self, name, value):
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
226
        #@name = intern(name)
227
        dict = self.__dict__
228
        if value == dict.get(name, Const.NoValue):
229
            return
230
        dict[name] = value
231
        if name == 'visible' and self.parent:
232
            #@print 'set', self, name , value
233
            self.parent.redraw(self, 1)
234
            dict['_changeReported'] = 1
235
        elif name[0] != '_':
236
            #@print 'set', self, name , value
237
            self.__dict__['redrawMyself'] = 1
238
            if self.parent and not self._changeReported:
239
                self.parent.redraw(self)
240
                dict['_changeReported'] = 1
241