summaryrefslogtreecommitdiff
path: root/src/python/ui/button.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/python/ui/button.py')
-rw-r--r--src/python/ui/button.py364
1 files changed, 0 insertions, 364 deletions
diff --git a/src/python/ui/button.py b/src/python/ui/button.py
deleted file mode 100644
index 43b902d..0000000
--- a/src/python/ui/button.py
+++ /dev/null
@@ -1,364 +0,0 @@
-# -*- coding: utf-8 -*-
-# libavg - Media Playback Engine.
-# Copyright (C) 2003-2011 Ulrich von Zadow
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Lesser General Public
-# License as published by the Free Software Foundation; either
-# version 2 of the License, or (at your option) any later version.
-#
-# This library 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
-# Lesser General Public License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this library; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-#
-# Current versions can be found at www.libavg.de
-#
-# Original author of this file is Henrik Thoms
-
-from libavg import avg, statemachine, utils
-import gesture
-from helper import *
-
-g_Player = avg.Player.get()
-
-class Button(avg.DivNode):
- STATE_DISABLED = 1
- STATE_UP = 2
- STATE_DOWN = 3
-
- def __init__(self, upNode = None, downNode = None, disabledNode = None,
- activeAreaNode = None, pressHandler = None, clickHandler = None,
- stateChangeHandler = None, **kwargs):
- avg.DivNode.__init__(self, **kwargs)
-
- self.__upNode = upNode
- self.__downNode = downNode
- self.__disabledNode = disabledNode
- self.__activeAreaNode = activeAreaNode
-
- self.__pressCallback = utils.methodref(pressHandler)
- self.__clickCallback = utils.methodref(clickHandler)
- self.__stateChangeCallback = utils.methodref(stateChangeHandler)
-
- self.__capturedCursorIds = set()
- self.__overCursorIds = set()
-
- self.__isCheckable = False
- self.__isToggled = False
-
- self.__isOver = False
- self.__state = Button.STATE_UP
-
- if self.__upNode and self.__downNode:
- self.__setupNodes()
-
- def delete(self):
- self.__pressCallback = None
- self.__clickCallback = None
- self.__stateChangeCallback = None
- self.__deactivateEventHandlers()
-
- def setEventHandler(self, type, source, func):
- raise RuntimeError("Setting event handlers for buttons is not supported")
-
- def getUpNode(self):
- return self.__upNode
-
- def getDownNode(self):
- return self.__downNode
-
- def getDisabledNode(self):
- return self.__disabledNode
-
- def setNodes(self, upNode, downNode, disabledNode = None, activeAreaNode = None):
- if self.__activeAreaNode and self.isEnabled():
- self.__deactivateEventHandlers()
- self.__upNode = upNode
- self.__downNode = downNode
- self.__disabledNode = disabledNode
- self.__activeAreaNode = activeAreaNode
- self.__setupNodes()
-
- def setPressHandler(self, handler):
- self.__pressCallback = utils.methodref(handler)
-
- def setClickHandler(self, handler):
- self.__clickCallback = utils.methodref(handler)
-
- def setCheckable(self, val):
- self.__isCheckable = val
-
- def isCheckable(self):
- return self.__isCheckable
-
- def setChecked(self, val):
- assert(self.__isCheckable)
- assert(self.isEnabled())
- self.__isToggled = val
- state = Button.STATE_DOWN if self.__isToggled else Button.STATE_UP
- self.__changeState(state)
-
- def isChecked(self):
- assert(self.__isCheckable)
- # XXX: Shouldn't this check self.__isToggled?
- return self.__state == Button.STATE_DOWN
-
- def setEnabled(self, isEnabled):
- if (isEnabled == self.isEnabled()):
- # No state change
- return
-
- state = Button.STATE_DISABLED if not(isEnabled) else Button.STATE_UP
- self.__changeState(state)
-
- if self.__state == Button.STATE_DISABLED:
- self.__deactivateEventHandlers()
- self.__overCursorIds = set()
- else:
- self.__activateEventHandlers()
-
- def isEnabled(self):
- return self.__state != Button.STATE_DISABLED
-
- def __setupNodes(self):
- while self.getNumChildren() > 0:
- self.removeChild(self.getChild(0))
-
- self.appendChild(self.__upNode)
- self.appendChild(self.__downNode)
-
- if self.__disabledNode:
- self.appendChild(self.__disabledNode)
-
- if self.__activeAreaNode == None:
- self.__activeAreaNode = avg.RectNode(opacity=0, size=self.__upNode.size)
- self.appendChild(self.__activeAreaNode)
-
- self.size = self.__activeAreaNode.size
- self.__updateNodesVisibility()
- if self.isEnabled():
- self.__activateEventHandlers()
-
- def __updateNodesVisibility(self):
- for element in (self.__upNode, self.__downNode, self.__disabledNode):
- if element:
- element.active = False
-
- if self.__state == Button.STATE_UP:
- activeNode = self.__upNode
- elif self.__state == Button.STATE_DOWN:
- activeNode = self.__downNode
- elif self.__state == Button.STATE_DISABLED:
- activeNode = self.__disabledNode
- else:
- # This state doesn't exist.
- assert(False)
-
- activeNode.active = True
-
- def __changeState(self, state):
- self.__state = state
- self.__updateNodesVisibility()
- utils.callWeakRef(self.__stateChangeCallback, state)
-
- def __captureCursor(self, id):
- self.__capturedCursorIds.add(id)
- self.__activeAreaNode.setEventCapture(id)
-
- def __releaseCapturedCursor(self, id):
- self.__capturedCursorIds.remove(id)
- self.releaseEventCapture(id)
-
- def __isCursorCaptured(self, id):
- return id in self.__capturedCursorIds
-
- def __getNumberOfCapturedCursors(self):
- return len(self.__capturedCursorIds)
-
- def __hasCapturedCursor(self):
- return len(self.__capturedCursorIds) != 0
-
- def __pressHandler(self, event):
- if not self.__isCursorCaptured(event.cursorid):
- self.__captureCursor(event.cursorid)
-
- if event.cursorid not in self.__overCursorIds:
- self.__overCursorIds.add(event.cursorid)
-
- if self.__getNumberOfCapturedCursors() <= 1:
- self.__changeState(Button.STATE_DOWN)
- utils.callWeakRef(self.__pressCallback, event)
-
- def __releaseHandler(self, event):
- numberOfCapturedCursors = self.__getNumberOfCapturedCursors()
- numberOfOverCursors = len(self.__overCursorIds)
-
- if self.__isCursorCaptured(event.cursorid):
- self.__releaseCapturedCursor(event.cursorid)
-
- if event.cursorid in self.__overCursorIds:
- self.__overCursorIds.remove(event.cursorid)
-
- if numberOfCapturedCursors == 1 and numberOfOverCursors == 1:
- newState = Button.STATE_UP
- if self.isCheckable():
- self.__isToggled = not self.__isToggled
- if self.__isToggled:
- newState = Button.STATE_DOWN
-
- self.__changeState(newState)
-
- utils.callWeakRef(self.__clickCallback, event)
-
- def __overHandler(self, event):
- if event.cursorid not in self.__overCursorIds:
- self.__overCursorIds.add(event.cursorid)
-
- if self.__hasCapturedCursor() and len(self.__overCursorIds):
- self.__changeState(Button.STATE_DOWN)
-
- self.__isOver = not(self.__isOver)
- return True
-
- def __outHandler(self, event):
- if event.cursorid in self.__overCursorIds:
- self.__overCursorIds.remove(event.cursorid)
-
- if self.__hasCapturedCursor() and not len(self.__overCursorIds):
- newState = Button.STATE_UP
- if self.isCheckable():
- if self.__isToggled:
- newState = Button.STATE_DOWN
- self.__changeState(newState)
-
- self.__isOver = not(self.__isOver)
- return True
-
- def __activateEventHandlers(self):
- def setOneHandler(type, handler):
- self.__activeAreaNode.connectEventHandler(type, avg.MOUSE | avg.TOUCH,
- self, handler)
-
- setOneHandler(avg.CURSORDOWN, self.__pressHandler)
- setOneHandler(avg.CURSORUP, self.__releaseHandler)
- setOneHandler(avg.CURSOROVER, self.__overHandler)
- setOneHandler(avg.CURSOROUT, self.__outHandler)
-
- def __deactivateEventHandlers(self):
- for id in self.__capturedCursorIds:
- self.releaseEventCapture(id)
- self.__capturedCursorIds = set()
- self.__activeAreaNode.disconnectEventHandler(self)
-
-
-class TouchButton(avg.DivNode):
-
- def __init__(self, upNode, downNode, disabledNode = None, activeAreaNode = None,
- fatFingerEnlarge=False, clickHandler = None, **kwargs):
- avg.DivNode.__init__(self, **kwargs)
-
- self.__upNode = upNode
- self.__downNode = downNode
- self.__disabledNode = disabledNode
- self.__activeAreaNode = activeAreaNode
-
- self.__clickHandler = utils.methodref(clickHandler)
-
- self.__isOver = False
- self.__stateMachine = statemachine.StateMachine("TouchButton", "UP")
- self.__stateMachine.addState("UP", ("DOWN", "DISABLED"),
- enterFunc=self.enterUp, leaveFunc=self.leaveUp)
- self.__stateMachine.addState("DOWN", ("UP", "DISABLED"),
- enterFunc=self.enterDown, leaveFunc=self.leaveDown)
- self.__stateMachine.addState("DISABLED", ("UP", "DOWN"),
- enterFunc=self.enterDisabled, leaveFunc=self.leaveDisabled)
-
- self.appendChild(self.__upNode)
- self.__upNode.active = True
- self.appendChild(self.__downNode)
- self.__downNode.active = False
-
- if self.__disabledNode:
- self.appendChild(self.__disabledNode)
- self.__disabledNode.active = False
-
- if fatFingerEnlarge:
- if self.__activeAreaNode != None:
- raise(RuntimeError(
- "TouchButton: Can't specify both fatFingerEnlarge and activeAreaNode"))
- size = upNode.size
- minSize = 20*g_Player.getPixelsPerMM()
- size = avg.Point2D(max(minSize, size.x), max(minSize, size.y))
- self.__activeAreaNode = avg.RectNode(size=size, opacity=0, parent=self)
- else:
- if self.__activeAreaNode == None:
- self.__activeAreaNode = self.__upNode
- else:
- self.appendChild(self.__activeAreaNode)
-
- self.__tapRecognizer = gesture.TapRecognizer(self.__activeAreaNode,
- possibleHandler=self.__onDown,
- detectedHandler=self.__onTap,
- failHandler=self.__onTapFail)
-
- @classmethod
- def fromSrc(cls, upSrc, downSrc, disabledSrc=None, **kwargs):
- upNode = avg.ImageNode(href=upSrc)
- downNode = avg.ImageNode(href=downSrc)
- if disabledSrc != None:
- disabledNode = avg.ImageNode(href=disabledSrc)
- else:
- disabledNode = None
- return TouchButton(upNode=upNode, downNode=downNode, disabledNode=disabledNode,
- **kwargs)
-
- def getEnabled(self):
- return self.__stateMachine.state != "DISABLED"
-
- def setEnabled(self, enabled):
- if enabled:
- if self.__stateMachine.state == "DISABLED":
- self.__stateMachine.changeState("UP")
- else:
- if self.__stateMachine.state != "DISABLED":
- self.__stateMachine.changeState("DISABLED")
-
- enabled = property(getEnabled, setEnabled)
-
- def __onDown(self, event):
- self.__stateMachine.changeState("DOWN")
-
- def __onTap(self, event):
- self.__stateMachine.changeState("UP")
- utils.callWeakRef(self.__clickHandler)
-
- def __onTapFail(self, event):
- self.__stateMachine.changeState("UP")
-
- def enterUp(self):
- self.__upNode.active = True
-
- def leaveUp(self):
- self.__upNode.active = False
-
- def enterDown(self):
- self.__downNode.active = True
-
- def leaveDown(self):
- self.__downNode.active = False
-
- def enterDisabled(self):
- if self.__disabledNode:
- self.__disabledNode.active = True
- self.__tapRecognizer.enable(False)
-
- def leaveDisabled(self):
- if self.__disabledNode:
- self.__disabledNode.active = False
- self.__tapRecognizer.enable(True)
-