Package libavg :: Module button

Source Code for Module libavg.button

  1  # libavg - Media Playback Engine. 
  2  # Copyright (C) 2003-2008 Ulrich von Zadow 
  3  # 
  4  # This library is free software; you can redistribute it and/or 
  5  # modify it under the terms of the GNU Lesser General Public 
  6  # License as published by the Free Software Foundation; either 
  7  # version 2 of the License, or (at your option) any later version. 
  8  # 
  9  # This library is distributed in the hope that it will be useful, 
 10  # but WITHOUT ANY WARRANTY; without even the implied warranty of 
 11  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
 12  # Lesser General Public License for more details. 
 13  # 
 14  # You should have received a copy of the GNU Lesser General Public 
 15  # License along with this library; if not, write to the Free Software 
 16  # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
 17  # 
 18  # Current versions can be found at www.libavg.de 
 19  # 
 20   
 21  avg = None 
 22  g_Player = None 
 23   
 24  try: 
 25      from . import avg 
 26  except ValueError: 
 27      pass 
 28   
29 -class Button:
30 - def __init__(self, node, clickCallback, id=None):
31 global g_Player 32 g_Player = avg.Player.get() 33 self.__node = node 34 self.__clickCallback = clickCallback 35 self.__isDisabled = False 36 self.__id = id 37 upNode = node.getChild(0) 38 node.width = upNode.width 39 node.height = upNode.height 40 if self.__isMouseOver(): 41 self.__setMode(2) 42 else: 43 self.__setMode(0) 44 self.__isClicking = False 45 self.__node.setEventHandler(avg.CURSORDOWN, avg.MOUSE, self.__onDown) 46 self.__node.setEventHandler(avg.CURSOROUT, avg.MOUSE, self.__onOut) 47 self.__node.setEventHandler(avg.CURSOROVER, avg.MOUSE, self.__onOver) 48 self.__node.setEventHandler(avg.CURSORDOWN, avg.TOUCH, self.__onDown) 49 self.__node.setEventHandler(avg.CURSOROUT, avg.TRACK, self.__onOut) 50 self.__node.setEventHandler(avg.CURSOROVER, avg.TRACK, self.__onOver)
51
52 - def delete(self):
53 self.__node.setEventHandler(avg.CURSORDOWN, avg.MOUSE, None) 54 self.__node.setEventHandler(avg.CURSOROUT, avg.MOUSE, None) 55 self.__node.setEventHandler(avg.CURSOROVER, avg.MOUSE, None) 56 self.__node.setEventHandler(avg.CURSORUP, avg.MOUSE, None)
57
58 - def __isMouseOver(self):
59 Event = g_Player.getMouseState() 60 relPos = self.__node.getRelPos((Event.x, Event.y)) 61 return (relPos[0] > 0 and relPos[0] < self.__node.width and 62 relPos[1] > 0 and relPos[1] < self.__node.height)
63
64 - def __onDown(self, event):
65 if self.__isDisabled or self.__isClicking: 66 return 67 self.__node.setEventCapture(event.cursorid) 68 if event.source == avg.MOUSE: 69 self.__node.setEventHandler(avg.CURSORUP, avg.MOUSE, self.__onUp) 70 else: 71 self.__node.setEventHandler(avg.CURSORUP, avg.TOUCH, self.__onUp) 72 self.__isClicking = True 73 self.__setMode(1)
74
75 - def __onUp(self, event):
76 if self.__isDisabled or not(self.__isClicking): 77 return 78 self.__node.setEventHandler(avg.CURSORUP, avg.MOUSE, None) 79 self.__node.setEventHandler(avg.CURSORUP, avg.TOUCH, None) 80 try: 81 self.__node.releaseEventCapture(event.cursorid) 82 except RuntimeError: 83 # Ignore 'releaseEventCapture called, but cursor not captured' errors. 84 pass 85 if self.__mode == 1: 86 self.__setMode(2) 87 self.__clickCallback(self) 88 self.__isClicking = False
89
90 - def __onOver(self, event):
91 if self.__isDisabled: 92 return 93 if self.__isClicking: 94 self.__setMode(1) 95 else: 96 self.__setMode(2)
97
98 - def __onOut(self, event):
99 if self.__isDisabled: 100 return 101 self.__setMode(0)
102
103 - def __setMode(self, newMode):
104 self.__mode = newMode 105 for i in range(4): 106 childNode = self.__node.getChild(i) 107 if i == newMode: 108 childNode.opacity = 1 109 else: 110 childNode.opacity = 0
111 112 # TODO: if setDisabled(False) and mouse is over the button it remains disabled
113 - def setDisabled(self, disabled):
114 self.__isDisabled = disabled 115 if disabled: 116 try: 117 self.__node.releaseEventCapture() 118 except: 119 pass 120 self.__setMode(3) 121 else: 122 self.__setMode(0)
123
124 - def getID(self):
125 return self.__id
126 127
128 -class Checkbox(Button):
129 - def __init__(self, node, clickCallback=None, id=None):
130 self.__node = node 131 self.__setChecked(False) 132 self.__clickCallback = clickCallback 133 Button.__init__(self, node, self.__onClick, id)
134
135 - def getState(self):
136 return self.__isChecked
137
138 - def setState(self, checked):
139 self.__setChecked(checked)
140
141 - def __setChecked(self, checked):
142 self.__isChecked = checked 143 if checked: 144 self.__node.getChild(4).opacity = 1 145 else: 146 self.__node.getChild(4).opacity = 0
147
148 - def __onClick(self, Event):
149 self.__setChecked(not(self.__isChecked)) 150 if self.__clickCallback != None: 151 self.__clickCallback(self)
152 153
154 -class Radio(Checkbox):
155 - def __init__(self, node, clickCallback=None, id=None):
156 self.__node = node 157 self.__setChecked(False) 158 self.__clickCallback = clickCallback 159 Button.__init__(self, node, self.__onClick, id)
160
161 - def getState(self):
162 return self.__isChecked
163
164 - def setState(self, checked):
165 self.__setChecked(checked)
166
167 - def __setChecked(self, checked):
168 self.__isChecked = checked 169 if checked: 170 self.__node.getChild(4).opacity = 1 171 else: 172 self.__node.getChild(4).opacity = 0
173
174 - def __onClick(self, Event):
175 self.__setChecked(True) 176 if self.__clickCallback != None: 177 self.__clickCallback(self)
178 179
180 -def init(g_avg):
181 global avg 182 avg = g_avg
183