Beispiel #1
0
    def __init__(self, name):
        PandaNode.__init__(self, name)
        DirectObject.__init__(self)

        self.fsm = ClassicFSM(name, [
            State('off', self.enterOff, self.exitOff),
            State('rollover', self.enterRollover, self.exitRollover),
            State('ready', self.enterReady, self.exitReady),
            State('depressed', self.enterDepressed, self.exitDepressed),
            State('inactive', self.enterInactive, self.exitInactive)], 'off', 'off')
        self.fsm.enterInitialState()

        self.active = True
        self.lastClickState = PGButton.SReady
        self.clickState = PGButton.SReady
        self.__hovering = False
        self.clickEvent = ''
        self.clickExtraArgs = []
        self.contents = NodePath.anyPath(self).attachNewNode('contents')

        # Create a MouseWatcherRegion:
        self.regionName = self.getUniqueName() + '-region'
        self.region = MouseWatcherRegion(self.regionName, 0, 0, 0, 0)
        base.mouseWatcherNode.addRegion(self.region)

        # Accept the mouse events:
        enterPattern = base.mouseWatcherNode.getEnterPattern()
        leavePattern = base.mouseWatcherNode.getLeavePattern()
        buttonDownPattern = base.mouseWatcherNode.getButtonDownPattern()
        buttonUpPattern = base.mouseWatcherNode.getButtonUpPattern()
        self.accept(enterPattern.replace('%r', self.regionName), self.__handleMouseEnter)
        self.accept(leavePattern.replace('%r', self.regionName), self.__handleMouseLeave)
        self.accept(buttonDownPattern.replace('%r', self.regionName), self.__handleMouseDown)
        self.accept(buttonUpPattern.replace('%r', self.regionName), self.__handleMouseUp)
Beispiel #2
0
    def __init__(self, name):
        FSM.__init__(self, name)
        PandaNode.__init__(self, name)
        DirectObject.__init__(self)

        self.active = True

        self.lastClickState = PGButton.SReady
        self.clickState = PGButton.SReady

        self.__hovering = False

        self.clickEvent = ''
        self.clickExtraArgs = []

        self.contents = NodePath.anyPath(self).attachNewNode('contents')

        # Create a MouseWatcherRegion:
        self.regionName = self.getUniqueName() + '-region'
        self.region = MouseWatcherRegion(self.regionName, 0, 0, 0, 0)
        base.mouseWatcherNode.addRegion(self.region)

        # Accept the mouse events:
        enterPattern = base.mouseWatcherNode.getEnterPattern()
        leavePattern = base.mouseWatcherNode.getLeavePattern()
        buttonDownPattern = base.mouseWatcherNode.getButtonDownPattern()
        buttonUpPattern = base.mouseWatcherNode.getButtonUpPattern()
        self.accept(enterPattern.replace('%r', self.regionName),
                    self.__handleMouseEnter)
        self.accept(leavePattern.replace('%r', self.regionName),
                    self.__handleMouseLeave)
        self.accept(buttonDownPattern.replace('%r', self.regionName),
                    self.__handleMouseDown)
        self.accept(buttonUpPattern.replace('%r', self.regionName),
                    self.__handleMouseUp)
Beispiel #3
0
def test_mousewatcher_region_add():
    region1 = MouseWatcherRegion("1", 0, 1, 0, 1)
    region2 = MouseWatcherRegion("2", 0, 1, 0, 1)

    mw = MouseWatcher()
    assert len(mw.regions) == 0

    mw.add_region(region1)
    assert len(mw.regions) == 1

    mw.add_region(region2)
    assert len(mw.regions) == 2

    mw.add_region(region1)
    assert len(mw.regions) == 2
Beispiel #4
0
    def __init__(self, name):
        FSM.__init__(self, name)
        PandaNode.__init__(self, name)
        DirectObject.__init__(self)

        self.active = True

        self.lastClickState = PGButton.SReady
        self.clickState = PGButton.SReady

        self.__hovering = False

        self.clickEvent = ''
        self.clickExtraArgs = []

        self.contents = NodePath.anyPath(self).attachNewNode('contents')

        # Create a MouseWatcherRegion:
        self.regionName = self.getUniqueName() + '-region'
        self.region = MouseWatcherRegion(self.regionName, 0, 0, 0, 0)
        base.mouseWatcherNode.addRegion(self.region)

        # Accept the mouse events:
        enterPattern = base.mouseWatcherNode.getEnterPattern()
        leavePattern = base.mouseWatcherNode.getLeavePattern()
        buttonDownPattern = base.mouseWatcherNode.getButtonDownPattern()
        buttonUpPattern = base.mouseWatcherNode.getButtonUpPattern()
        self.accept(enterPattern.replace('%r', self.regionName), self.__handleMouseEnter)
        self.accept(leavePattern.replace('%r', self.regionName), self.__handleMouseLeave)
        self.accept(buttonDownPattern.replace('%r', self.regionName), self.__handleMouseDown)
        self.accept(buttonUpPattern.replace('%r', self.regionName), self.__handleMouseUp)
class Clickable(PandaNode, DirectObject):
    def __init__(self, name, nametag=None):
        PandaNode.__init__(self, name)
        DirectObject.__init__(self)

        self.fsm = ClassicFSM(name, [
            State('off', self.enterOff, self.exitOff),
            State('rollover', self.enterRollover, self.exitRollover),
            State('ready', self.enterReady, self.exitReady),
            State('depressed', self.enterDepressed, self.exitDepressed),
            State('inactive', self.enterInactive, self.exitInactive)
        ], 'off', 'off')
        self.fsm.enterInitialState()

        self.nametag = nametag
        self.avatar = None
        self.active = True
        self.lastClickState = PGButton.SReady
        self.clickState = PGButton.SReady
        self.__hovering = False
        self.clickEvent = ''
        self.clickExtraArgs = []
        self.contents = NodePath.anyPath(self).attachNewNode('contents')

        # Create a MouseWatcherRegion:
        self.regionName = self.getUniqueName() + '-region'
        self.region = MouseWatcherRegion(self.regionName, 0, 0, 0, 0)
        base.mouseWatcherNode.addRegion(self.region)

        # Accept the mouse events:
        enterPattern = base.mouseWatcherNode.getEnterPattern()
        leavePattern = base.mouseWatcherNode.getLeavePattern()
        buttonDownPattern = base.mouseWatcherNode.getButtonDownPattern()
        buttonUpPattern = base.mouseWatcherNode.getButtonUpPattern()
        self.accept(enterPattern.replace('%r', self.regionName),
                    self.__handleMouseEnter)
        self.accept(leavePattern.replace('%r', self.regionName),
                    self.__handleMouseLeave)
        self.accept(buttonDownPattern.replace('%r', self.regionName),
                    self.__handleMouseDown)
        self.accept(buttonUpPattern.replace('%r', self.regionName),
                    self.__handleMouseUp)

    def destroy(self):
        self.ignoreAll()

        if self.region is not None:
            base.mouseWatcherNode.removeRegion(self.region)
            self.region = None

        if self.contents is not None:
            self.contents.removeNode()
            self.contents = None

    def getUniqueName(self):
        return 'Clickable-%s' % id(self)

    def setAvatar(self, avatar):
        self.avatar = avatar

    def getAvatar(self):
        return self.avatar

    def setActive(self, active):
        self.active = active

    def getActive(self):
        return self.active

    def isClickable(self):
        return self.active

    def isHovering(self):
        return self.__hovering

    def setClickState(self, clickState):
        self.lastClickState = self.clickState
        self.clickState = clickState

        if self.clickState == PGButton.SReady:
            self.fsm.request('ready')
        elif self.clickState == PGButton.SDepressed:
            self.fsm.request('depressed')
        elif self.clickState == PGButton.SRollover:
            self.fsm.request('rollover')
        elif self.clickState == PGButton.SInactive:
            self.fsm.request('inactive')

    def getClickState(self):
        return self.clickState

    def enterOff(self):
        pass

    def exitOff(self):
        pass

    def enterReady(self):
        pass

    def exitReady(self):
        pass

    def enterDepressed(self):
        pass

    def exitDepressed(self):
        if self.isClickable():
            messenger.send(self.clickEvent, self.clickExtraArgs)

    def enterRollover(self):
        pass

    def exitRollover(self):
        pass

    def enterInactive(self):
        pass

    def exitInactive(self):
        pass

    def setClickEvent(self, event, extraArgs=[]):
        self.clickEvent = event
        self.clickExtraArgs = extraArgs

    def setClickRegionFrame(self, left, right, bottom, top):
        self.region.setFrame(left, right, bottom, top)

    def __handleMouseEnter(self, region, button):
        self.__hovering = True
        self.setClickState(PGButton.SRollover)

    def __handleMouseLeave(self, region, button):
        self.__hovering = False
        if self.clickState != PGButton.SDepressed:
            self.setClickState(PGButton.SReady)

    def __handleMouseDown(self, region, button):
        if button == 'mouse1':
            self.setClickState(PGButton.SDepressed)

    def __handleMouseUp(self, region, button):
        if button == 'mouse1':
            if self.__hovering:
                self.setClickState(PGButton.SRollover)
            else:
                self.setClickState(PGButton.SReady)
Beispiel #6
0
class Clickable(FSM, PandaNode, DirectObject):
    def __init__(self, name):
        FSM.__init__(self, name)
        PandaNode.__init__(self, name)
        DirectObject.__init__(self)

        self.active = True

        self.lastClickState = PGButton.SReady
        self.clickState = PGButton.SReady

        self.__hovering = False

        self.clickEvent = ''
        self.clickExtraArgs = []

        self.contents = NodePath.anyPath(self).attachNewNode('contents')

        # Create a MouseWatcherRegion:
        self.regionName = self.getUniqueName() + '-region'
        self.region = MouseWatcherRegion(self.regionName, 0, 0, 0, 0)
        base.mouseWatcherNode.addRegion(self.region)

        # Accept the mouse events:
        enterPattern = base.mouseWatcherNode.getEnterPattern()
        leavePattern = base.mouseWatcherNode.getLeavePattern()
        buttonDownPattern = base.mouseWatcherNode.getButtonDownPattern()
        buttonUpPattern = base.mouseWatcherNode.getButtonUpPattern()
        self.accept(enterPattern.replace('%r', self.regionName), self.__handleMouseEnter)
        self.accept(leavePattern.replace('%r', self.regionName), self.__handleMouseLeave)
        self.accept(buttonDownPattern.replace('%r', self.regionName), self.__handleMouseDown)
        self.accept(buttonUpPattern.replace('%r', self.regionName), self.__handleMouseUp)

    def destroy(self):
        self.ignoreAll()

        if self.region is not None:
            base.mouseWatcherNode.removeRegion(self.region)
            self.region = None

        if self.contents is not None:
            self.contents.removeNode()
            self.contents = None

    def getUniqueName(self):
        return 'Clickable-' + str(id(self))

    def setActive(self, active):
        self.active = active

    def getActive(self):
        return self.active

    def isClickable(self):
        return self.active

    def isHovering(self):
        return self.__hovering

    def setClickState(self, clickState):
        self.lastClickState = self.clickState
        self.clickState = clickState

        if self.clickState == PGButton.SReady:
            self.request('Ready')
        elif self.clickState == PGButton.SDepressed:
            self.request('Depressed')
        elif self.clickState == PGButton.SRollover:
            self.request('Rollover')
        elif self.clickState == PGButton.SInactive:
            self.request('Inactive')

    def getClickState(self):
        return self.clickState

    def enterReady(self):
        pass

    def enterDepressed(self):
        pass

    def exitDepressed(self):
        if self.isClickable():
            messenger.send(self.clickEvent, self.clickExtraArgs)

    def enterRollover(self):
        pass

    def enterInactive(self):
        pass

    def setClickEvent(self, event, extraArgs=[]):
        self.clickEvent = event
        self.clickExtraArgs = extraArgs

    def setClickRegionFrame(self, left, right, bottom, top):
        self.region.setFrame(left, right, bottom, top)

    def __handleMouseEnter(self, region, button):
        self.__hovering = True
        self.setClickState(PGButton.SRollover)

    def __handleMouseLeave(self, region, button):
        self.__hovering = False
        if self.clickState != PGButton.SDepressed:
            self.setClickState(PGButton.SReady)

    def __handleMouseDown(self, region, button):
        self.setClickState(PGButton.SDepressed)

    def __handleMouseUp(self, region, button):
        if self.__hovering:
            self.setClickState(PGButton.SRollover)
        else:
            self.setClickState(PGButton.SReady)
Beispiel #7
0
class Clickable(FSM, PandaNode, DirectObject):
    def __init__(self, name):
        FSM.state = '_Off'  # Hacky bug fix for Panda3D 1.11.
        FSM.__init__(self, name)
        PandaNode.__init__(self, name)
        DirectObject.__init__(self)

        self.active = True

        self.lastClickState = PGButton.SReady
        self.clickState = PGButton.SReady

        self.__hovering = False

        self.clickEvent = ''
        self.clickExtraArgs = []

        self.contents = NodePath.anyPath(self).attachNewNode('contents')

        # Create a MouseWatcherRegion:
        self.regionName = self.getUniqueName() + '-region'
        self.region = MouseWatcherRegion(self.regionName, 0, 0, 0, 0)
        base.mouseWatcherNode.addRegion(self.region)

        # Accept the mouse events:
        enterPattern = base.mouseWatcherNode.getEnterPattern()
        leavePattern = base.mouseWatcherNode.getLeavePattern()
        buttonDownPattern = base.mouseWatcherNode.getButtonDownPattern()
        buttonUpPattern = base.mouseWatcherNode.getButtonUpPattern()
        self.accept(enterPattern.replace('%r', self.regionName),
                    self.__handleMouseEnter)
        self.accept(leavePattern.replace('%r', self.regionName),
                    self.__handleMouseLeave)
        self.accept(buttonDownPattern.replace('%r', self.regionName),
                    self.__handleMouseDown)
        self.accept(buttonUpPattern.replace('%r', self.regionName),
                    self.__handleMouseUp)

    def destroy(self):
        self.ignoreAll()

        if self.region is not None:
            base.mouseWatcherNode.removeRegion(self.region)
            self.region = None

        if self.contents is not None:
            self.contents.removeNode()
            self.contents = None

    def getUniqueName(self):
        return 'Clickable-' + str(id(self))

    def setActive(self, active):
        self.active = active

    def getActive(self):
        return self.active

    def isClickable(self):
        return self.active

    def isHovering(self):
        return self.__hovering

    def setClickState(self, clickState):
        self.lastClickState = self.clickState
        self.clickState = clickState

        if self.clickState == PGButton.SReady:
            self.request('Ready')
        elif self.clickState == PGButton.SDepressed:
            self.request('Depressed')
        elif self.clickState == PGButton.SRollover:
            self.request('Rollover')
        elif self.clickState == PGButton.SInactive:
            self.request('Inactive')

    def getClickState(self):
        return self.clickState

    def enterReady(self):
        pass

    def enterDepressed(self):
        pass

    def exitDepressed(self):
        if self.isClickable():
            messenger.send(self.clickEvent, self.clickExtraArgs)

    def enterRollover(self):
        pass

    def enterInactive(self):
        pass

    def setClickEvent(self, event, extraArgs=[]):
        self.clickEvent = event
        self.clickExtraArgs = extraArgs

    def setClickRegionFrame(self, left, right, bottom, top):
        self.region.setFrame(left, right, bottom, top)

    def __handleMouseEnter(self, region, button):
        self.__hovering = True
        self.setClickState(PGButton.SRollover)

    def __handleMouseLeave(self, region, button):
        self.__hovering = False
        if self.clickState != PGButton.SDepressed:
            self.setClickState(PGButton.SReady)

    def __handleMouseDown(self, region, button):
        self.setClickState(PGButton.SDepressed)

    def __handleMouseUp(self, region, button):
        if self.__hovering:
            self.setClickState(PGButton.SRollover)
        else:
            self.setClickState(PGButton.SReady)