Ejemplo n.º 1
0
def windowMaker(base, label):
    # find an open slot, if none, return false
    windict = dict()
    grid = None
    for i in range(grid_size[0]):
        for j in range(grid_size[1]):
            if occupied[i][j] == False:
                grid = (i, j)
                occupied[i][j] = True
                break
        else:
            continue
        break
    if not grid: return False
    windict['grid'] = grid
    position = grid_to_screen_pos(*grid)

    #open window
    newwin = base.openWindow(name=label)
    newwin.setWindowEvent(label + "-event")
    listener.accept(newwin.getWindowEvent(), windowEvent)
    windict['win'] = newwin

    #format window
    wp = WindowProperties()
    wp.setOrigin(*position)
    wp.setSize(*ws)
    newwin.requestProperties(wp)

    #make 3d-mousewatcher display region
    displayRegion = newwin.getDisplayRegion(0)
    displayRegion.setDimensions(.3, 1, 0, 1)
    mkNode = MouseAndKeyboard(newwin, 0, label + "_keyboard_mouse")
    mk = base.dataRoot.attachNewNode(mkNode)
    windict['mk'] = mk
    mwNode = MouseWatcher(label)
    mwNode.setDisplayRegion(displayRegion)
    mw = mk.attachNewNode(mwNode)
    windict['mw'] = mw
    bt = ButtonThrower(label + "_button_thrower")
    windict['bt'] = bt
    bt.setPrefix(label + "_")
    mw.attachNewNode(bt)
    #listen for default button events
    for button in buttons:
        listener.accept(bt.prefix + button, buttons[button])

    #format render display region
    render_dr = newwin.getDisplayRegion(1)
    windict['render_dr'] = render_dr
    render_dr.setDimensions(.3, 1, 0, 1)

    #create a display region for Gui Elements
    gui_dr = newwin.makeDisplayRegion(0, .3, .3, 1)
    # gui_dr.setSort(20)
    mwNodegui = MouseWatcher(label + "gui")
    mwNodegui.setDisplayRegion(gui_dr)
    mwgui = mk.attachNewNode(mwNodegui)

    #create a 2d render/aspect for gui
    rendergui = NodePath('render2d')
    rendergui.setDepthWrite(0)
    rendergui.setMaterialOff(1)
    rendergui.setTwoSided(1)
    #set up aspect2d
    aspectgui = rendergui.attachNewNode(PGTop('aspectgui'))
    aspectgui.node().setMouseWatcher(mwgui.node())
    #set up camera
    camNodegui = Camera("camNode2d")
    cameragui = rendergui.attachNewNode(camNodegui)
    cameragui.setPos(0, 0, 0)
    cameragui.setDepthTest(False)
    cameragui.setDepthWrite(False)
    lens = OrthographicLens()
    lens.setFilmSize(2, 2)
    lens.setNearFar(-1000, 1000)
    cameragui.node().setLens(lens)
    gui_dr.setCamera(cameragui)
    #make frame for gui
    frame = DirectFrame(frameSize=(-1, 1, -1, 1),
                        frameColor=(.5, .5, .5, 1),
                        relief='ridge')
    frame.reparentTo(aspectgui)
    frame.setTransparency(0)
    windict['gui_frame'] = frame

    #create Gui elements
    guibuttons = dict()
    # guibuttons['Create'] = label+"_mode_create"
    guibuttons['Preview'] = label + "_preview"
    # createButton(base, frame, .7, "Create", label+"_mode_create")
    createButton(base, frame, .7, "Preview", label + "_preview")
    windict['guibuttons'] = guibuttons

    #create a display region for math data preview
    preview_dr = newwin.makeDisplayRegion(0, .3, 0, .3)
    windict['preview_dr'] = preview_dr
    # preview_label = label+"_preview"
    # preview_mwNode = MouseWatcher(preview_label)
    # preview_mwNode.setDisplayRegion(preview_dr)
    # preview_mw = mk.attachNewNode(preview_mwNode)
    # preview_bt = ButtonThrower(preview_label+"_button_thrower")
    # preview_bt.setPrefix(preview_label+"_")
    # preview_mw.attachNewNode(preview_bt)
    # preview_dr.setSort(30)

    win_to_windict[newwin] = windict

    return windict
Ejemplo n.º 2
0
    def _show_headhunting_reward(self):
        """Show a reward GUI.

        When getting into a city, player gains money as a reward
        for destroying enemies. Money amount depends on what
        enemies were destroyed.
        """
        heads_cost = {
            "MotoShooter": 5,
            "BrakeThrower": 5,
            "StunBombThrower": 10,
            "DodgeShooter": 25,
            "Kamikaze": 15,
        }
        if not base.heads:  # noqa: F821
            return

        self._reward_fr = DirectFrame(
            frameSize=(-0.3, 0.3, -0.45, 0.45),
            frameTexture="gui/tex/paper1.png",
            state=DGG.NORMAL,
            pos=(0.9, 0, -0.15),
        )
        self._reward_fr.setDepthTest(False)
        self._reward_fr.setTransparency(TransparencyAttrib.MAlpha)

        heads_list = ""
        costs_list = ""
        total = 0
        for head, num in base.heads.items():  # noqa: F821
            heads_list += head + " x" + str(num) + "\n"
            costs_list += str(num * heads_cost[head]) + "$\n"
            total += num * heads_cost[head]

        reward_desc = DirectLabel(
            parent=self._reward_fr,
            frameColor=(0, 0, 0, 0),
            frameSize=(-0.3, 0.3, -0.1, 0.1),
            text=base.labels.CITY[16]  # noqa: F821
            + "\n" * 13 + base.labels.CITY[17]  # noqa: F821
            + str(total) + "$",
            text_font=base.main_font,  # noqa: F821
            text_scale=0.03,
            pos=(0, 0, 0.35),
        )
        heads_list = DirectLabel(
            parent=self._reward_fr,
            frameColor=(0, 0, 0, 0),
            frameSize=(-0.3, 0.3, -0.1, 0.1),
            text=heads_list,
            text_scale=0.03,
            text_align=TextNode.ALeft,
            pos=(-0.21, 0, 0.08),
        )
        costs_list = DirectLabel(
            parent=self._reward_fr,
            frameColor=(0, 0, 0, 0),
            frameSize=(-0.3, 0.3, -0.1, 0.1),
            text=costs_list,
            text_scale=0.03,
            text_align=TextNode.ALeft,
            pos=(0.16, 0, 0.08),
        )
        DirectButton(
            parent=self._reward_fr,
            pos=(0, 0, -0.38),
            text="Acquire",
            text_fg=RUST_COL,
            text_shadow=(0, 0, 0, 1),
            frameColor=(0, 0, 0, 0),
            command=self._acquire_reward,
            extraArgs=[total, reward_desc, heads_list, costs_list],
            scale=(0.04, 0, 0.04),
        )
Ejemplo n.º 3
0
    def __init__(self, doneEvent):
        self.doneEvent = doneEvent
        DirectFrame.__init__(self)
        self.reparentTo(aspect2d)
        self.setPos(0.0, 0.0, 0.16)
        self.stash()
        # load the public party gui and extract the sub-chunk of the model that
        # we will use as the background for this gui
        publicPartyGui = loader.loadModel(
            "phase_4/models/parties/publicPartyGUI")
        # create a top level DirectFrame to hold everything else
        self.frame = DirectFrame(
            parent=self,
            geom=publicPartyGui.find("**/activities_background"),
            geom_pos=(-0.8, 0.0, 0.2),
            geom_scale=2.0,
            relief=None,
        )

        # counter for beans won in the activity
        self.earnedLabel = DirectLabel(
            parent=self,
            relief=None,
            text=str(0),
            text_align=TextNode.ACenter,
            text_pos=(0.0, -0.07),
            text_scale=0.2,
            text_fg=(0.95, 0.95, 0.0, 1.0),
            text_font=ToontownGlobals.getSignFont(),
            textMayChange=True,
            image=DirectGuiGlobals.getDefaultDialogGeom(),
            image_scale=(0.33, 1.0, 0.33),
            pos=(-0.3, 0.0, 0.2),
            scale=0.9,
        )

        # counter with jellybean jar in the background for beans in the
        # "pocketbook" (the beans you carry around with you that are not in your
        # home bank)
        purchaseModels = loader.loadModel("phase_4/models/gui/purchase_gui")
        jarImage = purchaseModels.find("**/Jar")
        self.jarLabel = DirectLabel(
            parent=self,
            relief=None,
            text=str(0),
            text_align=TextNode.ACenter,
            text_pos=(0.0, -0.07),
            text_scale=0.2,
            text_fg=JellybeanRewardGui.JarLabelTextColor,
            text_font=ToontownGlobals.getSignFont(),
            textMayChange=True,
            image=jarImage,
            scale=0.7,
            pos=(0.3, 0.0, 0.17),
        )
        purchaseModels.removeNode()
        del purchaseModels
        jarImage.removeNode()
        del jarImage

        # message text
        self.messageLabel = DirectLabel(
            parent=self,
            relief=None,
            text="",
            text_align=TextNode.ALeft,
            text_wordwrap=16.0,
            text_scale=0.07,
            pos=(-0.52, 0.0, -0.1),
            textMayChange=True,
        )

        self.doubledJellybeanLabel = DirectLabel(
            parent=self,
            relief=None,
            text=TTLocalizer.PartyRewardDoubledJellybean,
            text_align=TextNode.ACenter,
            text_wordwrap=12.0,
            text_scale=0.09,
            text_fg=(1.0, 0.125, 0.125, 1.0),
            pos=(0.0, 0.0, -0.465),
            textMayChange=False,
        )
        self.doubledJellybeanLabel.hide()

        # button to close the gui when the player is done reading it
        self.closeButton = DirectButton(
            parent=self,
            relief=None,
            text=TTLocalizer.PartyJellybeanRewardOK,
            text_align=TextNode.ACenter,
            text_scale=0.065,
            text_pos=(0.0, -0.625),
            geom=(
                publicPartyGui.find("**/startButton_up"),
                publicPartyGui.find("**/startButton_down"),
                publicPartyGui.find("**/startButton_rollover"),
                publicPartyGui.find("**/startButton_inactive"),
            ),
            geom_pos=(-0.39, 0.0,
                      0.125),  # place the geom to line up with the text
            command=self._close,
        )

        publicPartyGui.removeNode()
        del publicPartyGui

        self.countSound = base.loader.loadSfx(
            "phase_13/audio/sfx/tick_counter_short.mp3")
        self.overMaxSound = base.loader.loadSfx(
            "phase_13/audio/sfx/tick_counter_overflow.mp3")
Ejemplo n.º 4
0
    def _choose_tactics(self):
        """Choose initial tactics before new game start."""
        if self.tactics_wids:
            return

        clear_wids(self.save_wids)
        clear_wids(self.conf_wids)
        clear_wids(self.cred_wids)

        self.tactics_wids.append(
            DirectLabel(  # Choose your crew
                parent=self._main_fr,
                text=base.labels.MAIN_MENU[5],  # noqa: F821
                text_fg=RUST_COL,
                text_scale=0.04,
                text_font=base.main_font,  # noqa: F821
                frameColor=(0, 0, 0, 0),
                pos=(0.7, 0, 0.75),
            ))
        # an image with a crew representer
        self._crew_preview = DirectFrame(
            parent=self._main_fr,
            frameSize=(-0.61, 0.61, -0.35, 0.35),
            pos=(0.7, 0, 0.3),
        )
        self._crew_preview.setTransparency(TransparencyAttrib.MAlpha)
        self.tactics_wids.append(self._crew_preview)

        but_params = {
            "parent": self._main_fr,
            "text_scale": 0.035,
            "text_fg": RUST_COL,
            "text_font": base.main_font,  # noqa: F821
            "relief": None,
            "clickSound": self.click_snd,
            "command": self._show_crew,
        }
        self._crew_buts = {
            "soldiers":
            DirectButton(
                text=base.labels.MAIN_MENU[6],  # noqa: F821
                extraArgs=["soldiers"],
                pos=(0.5, 0, -0.15),
                **but_params,
            ),
            "raiders":
            DirectButton(
                text=base.labels.MAIN_MENU[7],  # noqa: F821
                extraArgs=["raiders"],
                pos=(0.7, 0, -0.15),
                **but_params,
            ),
            "anarchists":
            DirectButton(
                text=base.labels.MAIN_MENU[8],  # noqa: F821
                extraArgs=["anarchists"],
                pos=(0.925, 0, -0.15),
                **but_params,
            ),
        }
        self.tactics_wids += self._crew_buts.values()

        for but in self._crew_buts.values():
            self.bind_button(but)

        self._team_description = DirectLabel(  # Crew description
            parent=self._main_fr,
            text=base.labels.MAIN_MENU[9],  # noqa: F821
            text_fg=SILVER_COL,
            text_scale=0.03,
            text_font=base.main_font,  # noqa: F821
            frameColor=(0, 0, 0, 0),
            pos=(0.7, 0, -0.26),
        )
        self.tactics_wids.append(self._team_description)

        start_but = DirectButton(  # Start
            parent=self._main_fr,
            text_scale=0.045,
            text_fg=RUST_COL,
            text=base.labels.MAIN_MENU[10],  # noqa: F821
            text_font=base.main_font,  # noqa: F821
            relief=None,
            command=self._start_new_game,
            pos=(0.7, 0, -0.5),
            clickSound=self.click_snd,
        )
        self.bind_button(start_but)
        self.tactics_wids.append(start_but)

        self._show_crew("soldiers")
Ejemplo n.º 5
0
    def __init__(self, showbase):
        self.showbase = showbase

        self.status = OnscreenText(text="",
                                   pos=Vec3(0, -0.35, 0),
                                   scale=0.05,
                                   fg=(1, 0, 0, 1),
                                   align=TextNode.ACenter,
                                   mayChange=True)

        self.background = DirectFrame(
            frameSize=(-1, 1, -1, 1),
            frameTexture='media/gui/mainmenu/menu.png',
            parent=self.showbase.render2d,
        )

        self.title = OnscreenText(text='Main Menu',
                                  fg=(1, 1, 1, 1),
                                  parent=self.background,
                                  pos=(-0.6, 0.1),
                                  scale=0.06)

        self.ip = '127.0.0.1'  # Should make this write to file... so that the user can save ip's...
        # yep thats a good idea, there will be a few things i guess that need to be done like this
        # like settings and keys and whatnot

        # Buttons
        self.buttons = []
        serverButtons = Vec3(-0.60, 0, -0.79)
        # Host
        self.params = ['3', '8']
        p = serverButtons + Vec3(-0.25, 0, 0)
        self.hostButton = DirectButton(text='Host',
                                       pos=p,
                                       scale=0.048,
                                       relief=DGG.GROOVE,
                                       command=self.showbase.hostGame,
                                       extraArgs=[self.params])
        self.buttons.append(self.hostButton)
        # Join
        p = serverButtons + Vec3(0.0, 0.0, 0.0)
        self.joinButton = DirectButton(text='Join',
                                       pos=p,
                                       scale=0.048,
                                       relief=DGG.GROOVE,
                                       command=self.joinServer)
        self.buttons.append(self.joinButton)
        # Refresh
        if self.showbase.online:
            p = serverButtons + Vec3(0.25, 0, 0)
            self.refreshButton = DirectButton(text="Refresh",
                                              pos=p,
                                              scale=0.048,
                                              relief=DGG.GROOVE,
                                              command=self.refreshStart)
            self.buttons.append(self.refreshButton)
            self.refreshStart()

            chatFrameCenter = (0.0, 0.325)
            chatFrameSize = (2.5, 1.2)
            self.chat = DirectFrame(
                frameColor=(0, 0, 0, 1),
                frameSize=(chatFrameSize[0] / 2, -chatFrameSize[0] / 2,
                           chatFrameSize[1] / 2, -chatFrameSize[1] / 2),
                pos=(chatFrameCenter[0], 0, chatFrameCenter[1]))

            channelFrameSize = (chatFrameSize[0] / 4, chatFrameSize[1])
            channelFrameCenter = (-chatFrameSize[0] / 2 +
                                  channelFrameSize[0] / 2, 0)
            numItemsVisible = 8
            itemHeight = channelFrameSize[1] / (numItemsVisible + 1)
            self.channels = DirectScrolledList(
                parent=self.chat,
                pos=(channelFrameCenter[0], 0, channelFrameCenter[1]),
                frameSize=(-channelFrameSize[0] / 2, channelFrameSize[0] / 2,
                           channelFrameSize[1] / 2, -channelFrameSize[1] / 2),
                frameColor=(1, 0, 0, 0.5),
                numItemsVisible=numItemsVisible,
                forceHeight=itemHeight,

                #itemFrame_frameSize = (-channelFrameSize[0] / 2.1, channelFrameSize[0] / 2.1, itemHeight, -channelFrameSize[1] + itemHeight),
                itemFrame_pos=(0, 0, channelFrameSize[1] / 2 - itemHeight),
                decButton_pos=(-0.2, 0, channelFrameCenter[1] -
                               channelFrameSize[1] / 2 + itemHeight / 4),
                decButton_text='Prev',
                decButton_text_scale=0.05,
                decButton_borderWidth=(0.005, 0.005),
                incButton_pos=(0.2, 0, channelFrameCenter[1] -
                               channelFrameSize[1] / 2 + itemHeight / 4),
                incButton_text='Next',
                incButton_text_scale=0.05,
                incButton_borderWidth=(0.005, 0.005),
            )

            b1 = DirectButton(text=("Button1", "click!", "roll", "disabled"),
                              text_scale=0.1,
                              borderWidth=(0.01, 0.01),
                              relief=2)

            b2 = DirectButton(text=("Button2", "click!", "roll", "disabled"),
                              text_scale=0.1,
                              borderWidth=(0.01, 0.01),
                              relief=2)

            l1 = DirectLabel(text="Test1", text_scale=0.1)
            l2 = DirectLabel(text="Test2", text_scale=0.1)
            l3 = DirectLabel(text="Test3", text_scale=0.1)

            self.channels.addItem(b1)
            self.channels.addItem(b2)
            self.channels.addItem(l1)
            self.channels.addItem(l2)
            self.channels.addItem(l3)

            for fruit in [
                    'apple', 'pear', 'banana', 'orange', 'cake', 'chocolate'
            ]:
                l = DirectLabel(text=fruit, text_scale=0.1)
                self.channels.addItem(l)
            # need to add the chat stuff
            # i guess have like a chat manager which will hold an array of 'chat_instances'
            # and the chat manager can sort out which is displayed and which channel the text is sent from/received to
            # a bit more thinking needs to be done i guess
            # can discuss sometime (not really that important now :P)

            # also i guess the layout and shit will need to be sorted (for whoever is doing the designing)

            # current games list (need to implement this)
            # it should send a query to the master server to get the current list (just ip's atmo i guess)

            # options shit aswell needs to be sorted
            # maybe just an overlay or something

            # functionality for the host button (popup an overlay that will be able to set options and then 'start_game' button
            # then should auto connect and go to lobby (will be same as for all clients, except have a couple of different buttons i guess)
            # close game instead of disconnect, start game instead of ready (greyed until all others are ready), kick button i suppose

            # once the options are set the 'server_inst' should be started on the local computer (which will broadcast to master server, once host can successfully connect)
            # then game client will move to pregame state (connect to the server, and wait for others and ready)
        else:
            self.entry = DirectEntry(
                focusInCommand=self.clearText,
                frameSize=(-3, 3, -.5, 1),
                initialText=self.ip,
                parent=self.buttons[0],
                pos=(0, -0.6, -1.5),
                text_align=TextNode.ACenter,
            )
        self.hide()
Ejemplo n.º 6
0
 def load(self):
     gui = loader.loadModel('phase_3/models/gui/laff_o_meter')
     if self.isToon:
         hType = self.style.getType()
         if hType == 'dog':
             headModel = gui.find('**/doghead')
         elif hType == 'cat':
             headModel = gui.find('**/cathead')
         elif hType == 'mouse':
             headModel = gui.find('**/mousehead')
         elif hType == 'horse':
             headModel = gui.find('**/horsehead')
         elif hType == 'rabbit':
             headModel = gui.find('**/bunnyhead')
         elif hType == 'duck':
             headModel = gui.find('**/duckhead')
         elif hType == 'monkey':
             headModel = gui.find('**/monkeyhead')
         elif hType == 'bear':
             headModel = gui.find('**/bearhead')
         elif hType == 'pig':
             headModel = gui.find('**/pighead')
         else:
             raise Exception('unknown toon species: ', hType)
         self.color = self.style.getHeadColor()
         self.container['image'] = headModel
         self.container['image_color'] = self.color
         self.resetFrameSize()
         self.setScale(0.1)
         self.frown = DirectFrame(parent=self.container,
                                  relief=None,
                                  image=gui.find('**/frown'))
         self.smile = DirectFrame(parent=self.container,
                                  relief=None,
                                  image=gui.find('**/smile'))
         self.eyes = DirectFrame(parent=self.container,
                                 relief=None,
                                 image=gui.find('**/eyes'))
         self.openSmile = DirectFrame(parent=self.container,
                                      relief=None,
                                      image=gui.find('**/open_smile'))
         self.tooth1 = DirectFrame(parent=self.openSmile,
                                   relief=None,
                                   image=gui.find('**/tooth_1'))
         self.tooth2 = DirectFrame(parent=self.openSmile,
                                   relief=None,
                                   image=gui.find('**/tooth_2'))
         self.tooth3 = DirectFrame(parent=self.openSmile,
                                   relief=None,
                                   image=gui.find('**/tooth_3'))
         self.tooth4 = DirectFrame(parent=self.openSmile,
                                   relief=None,
                                   image=gui.find('**/tooth_4'))
         self.tooth5 = DirectFrame(parent=self.openSmile,
                                   relief=None,
                                   image=gui.find('**/tooth_5'))
         self.tooth6 = DirectFrame(parent=self.openSmile,
                                   relief=None,
                                   image=gui.find('**/tooth_6'))
         self.maxLabel = DirectLabel(
             parent=self.eyes,
             relief=None,
             pos=(0.442, 0, 0.051),
             text='120',
             text_scale=0.4,
             text_font=ToontownGlobals.getInterfaceFont())
         self.hpLabel = DirectLabel(
             parent=self.eyes,
             relief=None,
             pos=(-0.398, 0, 0.051),
             text='120',
             text_scale=0.4,
             text_font=ToontownGlobals.getInterfaceFont())
         self.teeth = [
             self.tooth6, self.tooth5, self.tooth4, self.tooth3,
             self.tooth2, self.tooth1
         ]
         self.fractions = [0.0, 0.166666, 0.333333, 0.5, 0.666666, 0.833333]
     gui.removeNode()
     return
 def loadBackground(self):
     self.backFrame = DirectFrame(parent=self,
                                  frameColor=(1, 1, 1, 1),
                                  frameSize=self.FrameDimensions,
                                  pos=(0, 0, 0),
                                  relief=None)
Ejemplo n.º 8
0
    def __init__(self, numPlayers, avIdList, votes, directions, namesList,
                 disconnectedList, directionToGo, directionReason,
                 directionTotals, *args, **kwargs):
        opts = {
            'relief': None,
            'geom': DGG.getDefaultDialogGeom(),
            'geom_color': ToontownGlobals.GlobalDialogColor[:3] + (0.8, ),
            'geom_scale': (1.75, 1, 0.75),
            'pos': (0, 0, 0.525)
        }
        opts.update(kwargs)
        DirectFrame.__init__(self, *args, **opts)
        self.initialiseoptions(VoteResultsPanel)
        listMultiplier = 1
        if TravelGameGlobals.SpoofFour:
            listMultiplier = 4
        self.avIdList = avIdList * listMultiplier
        self.numPlayers = numPlayers * listMultiplier
        self.votes = votes * listMultiplier
        self.directions = directions * listMultiplier
        self.namesList = namesList * listMultiplier
        self.disconnectedList = disconnectedList * listMultiplier
        self.directionToGo = directionToGo
        self.directionReason = directionReason
        self.directionTotals = directionTotals
        self.entryList = []
        self.rowFrame = []
        self.upDownFrame = DirectFrame(parent=self,
                                       relief=None,
                                       pos=self.getRowPos(-1))
        self.upLabel = DirectLabel(parent=self.upDownFrame,
                                   relief=None,
                                   pos=(1.2, 0, 0.0),
                                   text=TTLocalizer.TravelGameDirections[0],
                                   text_fg=(0.0, 0.0, 1.0, 1.0),
                                   text_scale=0.05,
                                   text_align=TextNode.ARight)
        self.downLabel = DirectLabel(parent=self.upDownFrame,
                                     relief=None,
                                     pos=(1.43, 0, 0.0),
                                     text=TTLocalizer.TravelGameDirections[1],
                                     text_fg=(1.0, 0.0, 0.0, 1.0),
                                     text_scale=0.05,
                                     text_align=TextNode.ARight)
        self.totalFrame = DirectFrame(parent=self,
                                      relief=None,
                                      pos=self.getRowPos(self.numPlayers))
        self.totalText = DirectLabel(parent=self.totalFrame,
                                     relief=None,
                                     pos=(1.0, 0, 0.0),
                                     text='Total',
                                     text_fg=(0.0, 0.0, 0.0, 1.0),
                                     text_scale=0.05,
                                     text_align=TextNode.ARight)
        self.totalVotesUpLabel = DirectLabel(parent=self.totalFrame,
                                             relief=None,
                                             pos=(1.2, 0, 0.0),
                                             text='',
                                             text_fg=(0.0, 0.0, 1.0, 1.0),
                                             text_scale=0.05,
                                             text_align=TextNode.ARight)
        self.totalVotesDownLabel = DirectLabel(parent=self.totalFrame,
                                               relief=None,
                                               pos=(1.43, 0, 0.0),
                                               text='',
                                               text_fg=(1.0, 0.0, 0.0, 1.0),
                                               text_scale=0.05,
                                               text_align=TextNode.ARight)
        self.totalVotesLabels = [
            self.totalVotesUpLabel, self.totalVotesDownLabel
        ]
        self.resultFrame = DirectFrame(parent=self,
                                       relief=None,
                                       pos=self.getRowPos(5))
        self.resultLabel = DirectLabel(parent=self.resultFrame,
                                       text='',
                                       text_scale=0.06,
                                       pos=(0.7, 0, 0.0),
                                       text_align=TextNode.ACenter)
        self.setupResultLabel()
        for index in xrange(self.numPlayers):
            frame = DirectFrame(parent=self,
                                relief=None,
                                pos=self.getRowPos(index))
            self.rowFrame.append(frame)
            nameLabel = DirectFrame(parent=frame,
                                    relief=None,
                                    pos=(0.46, 0.0, 0.0),
                                    text=self.namesList[index],
                                    text_fg=(0.0, 0.0, 0.0, 1.0),
                                    text_scale=0.05,
                                    text_align=TextNode.ACenter,
                                    text_font=DGG.getDefaultFont())
            votesUpLabel = DirectLabel(parent=frame,
                                       relief=None,
                                       pos=(1.2, 0.0, 0.0),
                                       text='',
                                       text_fg=(0, 0, 1, 1),
                                       text_scale=0.05,
                                       text_align=TextNode.ARight,
                                       text_font=DGG.getDefaultFont())
            votesDownLabel = DirectLabel(parent=frame,
                                         relief=None,
                                         pos=(1.43, 0.0, 0.0),
                                         text='',
                                         text_fg=(1, 0, 0, 1),
                                         text_scale=0.05,
                                         text_align=TextNode.ARight,
                                         text_font=DGG.getDefaultFont())
            nameLabel.hide()
            self.entryList.append((nameLabel, votesUpLabel, votesDownLabel))

        return
Ejemplo n.º 9
0
    def __init__(self, numPlayers, avIdList, votes, directions, namesList,
                 disconnectedList, directionToGo, directionReason,
                 directionTotals, *args, **kwargs):
        opts = {
            'relief': None,
            'geom': DGG.getDefaultDialogGeom(),
            'geom_color': ToontownGlobals.GlobalDialogColor[:3] + (0.8, ),
            'geom_scale': (1.75, 1, 0.25),
            'pos': (0, 0, 0.825)
        }
        opts.update(kwargs)
        DirectFrame.__init__(self, *args, **opts)
        self.initialiseoptions(VoteResultsTrolleyPanel)
        listMultiplier = 1
        if TravelGameGlobals.SpoofFour:
            listMultiplier = 4
        self.avIdList = avIdList * listMultiplier
        self.numPlayers = numPlayers * listMultiplier
        self.votes = votes * listMultiplier
        self.directions = directions * listMultiplier
        self.namesList = namesList * listMultiplier
        self.disconnectedList = disconnectedList * listMultiplier
        self.directionToGo = directionToGo
        self.directionReason = directionReason
        self.directionTotals = directionTotals
        self.entryList = []
        self.rowFrame = []
        self.upDownFrame = DirectFrame(parent=self,
                                       relief=None,
                                       pos=self.getRowPos(-1))
        self.upLabel = DirectLabel(parent=self,
                                   relief=None,
                                   pos=(-0.5, 0, 0.06),
                                   text=TTLocalizer.TravelGameDirections[0] +
                                   ':',
                                   text_fg=(0.0, 0.0, 1.0, 1.0),
                                   text_scale=0.05,
                                   text_align=TextNode.ARight)
        self.downLabel = DirectLabel(parent=self,
                                     relief=None,
                                     pos=(0.5, 0, 0.06),
                                     text=TTLocalizer.TravelGameDirections[1] +
                                     ':',
                                     text_fg=(1.0, 0.0, 0.0, 1.0),
                                     text_scale=0.05,
                                     text_align=TextNode.ARight)
        self.totalVotesUpLabel = DirectLabel(parent=self.upLabel,
                                             relief=None,
                                             pos=(0.2, 0, 0.0),
                                             text='0',
                                             text_fg=(0.0, 0.0, 1.0, 1.0),
                                             text_scale=0.05,
                                             text_align=TextNode.ARight)
        self.totalVotesDownLabel = DirectLabel(parent=self.downLabel,
                                               relief=None,
                                               pos=(0.2, 0, 0.0),
                                               text='0',
                                               text_fg=(1.0, 0.0, 0.0, 1.0),
                                               text_scale=0.05,
                                               text_align=TextNode.ARight)
        self.totalFrame = DirectFrame(parent=self,
                                      relief=None,
                                      pos=self.getRowPos(self.numPlayers))
        self.totalVotesLabels = [
            self.totalVotesUpLabel, self.totalVotesDownLabel
        ]
        self.resultFrame = DirectFrame(parent=self,
                                       relief=None,
                                       pos=self.getRowPos(0.5))
        self.resultLabel = DirectLabel(parent=self.resultFrame,
                                       text='',
                                       text_scale=0.06,
                                       pos=(0.7, 0, 0.0),
                                       text_align=TextNode.ACenter)
        self.setupResultLabel()
        for index in xrange(self.numPlayers):
            frame = DirectFrame(parent=self,
                                relief=None,
                                pos=self.getRowPos(index))
            self.rowFrame.append(frame)
            nameLabel = DirectFrame(parent=frame,
                                    relief=None,
                                    pos=(0.46, 0.0, 0.0),
                                    text=self.namesList[index],
                                    text_fg=(0.0, 0.0, 0.0, 1.0),
                                    text_scale=0.05,
                                    text_align=TextNode.ACenter,
                                    text_font=DGG.getDefaultFont())
            votesUpLabel = DirectLabel(parent=frame,
                                       relief=None,
                                       pos=(1.2, 0.0, 0.0),
                                       text='',
                                       text_fg=(0, 0, 1, 1),
                                       text_scale=0.05,
                                       text_align=TextNode.ARight,
                                       text_font=DGG.getDefaultFont())
            votesDownLabel = DirectLabel(parent=frame,
                                         relief=None,
                                         pos=(1.43, 0.0, 0.0),
                                         text='',
                                         text_fg=(1, 0, 0, 1),
                                         text_scale=0.05,
                                         text_align=TextNode.ARight,
                                         text_font=DGG.getDefaultFont())
            nameLabel.hide()
            self.entryList.append((nameLabel, votesUpLabel, votesDownLabel))

        self.avVotesLabel = {}
        self.avArrows = {}
        matchingGameGui = loader.loadModel(
            'phase_3.5/models/gui/matching_game_gui')
        minnieArrow = matchingGameGui.find('**/minnieArrow')
        from toontown.minigame.DistributedTravelGame import map3dToAspect2d
        for index in xrange(self.numPlayers):
            avId = self.avIdList[index]
            av = base.cr.doId2do.get(avId)
            if av:
                height = av.getHeight()
                avPos = av.getPos(render)
                avPos.setZ(av.getZ() + 5)
                labelPos = map3dToAspect2d(render, avPos)
                if not labelPos:
                    continue
                labelPos.setZ(labelPos.getZ() + 0.3)
                arrow = None
                if self.votes[index] > 0:
                    arrow = aspect2d.attachNewNode('avArrow')
                    minnieArrow.copyTo(arrow)
                    arrow.setScale(1.1, 1, 1.15)
                    arrow.setPos(labelPos)
                    if self.directions[index] == 0:
                        arrow.setR(-90)
                        arrow.setColorScale(0, 0, 1, 1)
                    else:
                        arrow.setR(90)
                        arrow.setColorScale(1, 0, 0, 1)
                    arrow.wrtReparentTo(self.resultFrame)
                    arrow.hide()
                    self.avArrows[index] = arrow
                fgColor = Vec4(0, 0, 0, 1)
                if self.votes[index] > 0:
                    if self.directions[index] == 0:
                        fgColor = Vec4(0, 0, 1, 1)
                    else:
                        fgColor = Vec4(1, 0, 0, 1)
                if self.votes[index] > 0:
                    newLabel = DirectLabel(
                        parent=aspect2d,
                        relief=None,
                        pos=labelPos,
                        text='test',
                        text_fg=(1, 1, 1, 1),
                        text_scale=0.1,
                        text_align=TextNode.ACenter,
                        text_font=ToontownGlobals.getSignFont(),
                        text_pos=(0, -0.01, 0))
                else:
                    newLabel = DirectLabel(
                        parent=aspect2d,
                        geom=DGG.getDefaultDialogGeom(),
                        geom_scale=(0.2, 1, 0.2),
                        relief=None,
                        pos=labelPos,
                        text='test',
                        text_fg=(0.5, 0.5, 0.5, 1),
                        text_scale=0.1,
                        text_align=TextNode.ACenter,
                        text_font=ToontownGlobals.getSignFont(),
                        text_pos=(0, -0.035, 0))
                newLabel.wrtReparentTo(self.resultFrame)
                newLabel.hide()
                self.avVotesLabel[index] = newLabel

        matchingGameGui.removeNode()
        self.curArrowSfxIndex = 0
        self.upArrowSfx = []
        self.downArrowSfx = []
        for i in xrange(5):
            self.upArrowSfx.append(
                base.loadSfx(
                    'phase_4/audio/sfx/MG_sfx_travel_game_blue_arrow.ogg'))
            self.downArrowSfx.append(
                base.loadSfx(
                    'phase_4/audio/sfx/MG_sfx_travel_game_red_arrow.ogg'))

        self.winVoteSfx = base.loadSfx(
            'phase_4/audio/sfx/MG_sfx_travel_game_win_vote.ogg')
        self.noVoteSfx = base.loadSfx(
            'phase_4/audio/sfx/MG_sfx_travel_game_square_no_vote_1.ogg')
        self.loseVoteSfx = base.loadSfx(
            'phase_4/audio/sfx/MG_sfx_travel_game_lose_vote.ogg')
        self.localAvatarWon = False
        self.localAvatarLost = False
        localIndex = self.avIdList.index(base.localAvatar.doId)
        localDirection = self.directions[localIndex]
        localVotes = self.votes[localIndex]
        if localVotes:
            if localDirection == self.directionToGo:
                if not TravelGameGlobals.ReverseWin:
                    self.localAvatarWon = True
                else:
                    self.localAvatarLost = True
            elif not TravelGameGlobals.ReverseWin:
                self.localAvatarLost = True
            else:
                self.localAvatarWon = True
        return
 def load(self):
     gui = loader.loadModel('phase_3/models/gui/laff_o_meter')
     if self.isToon:
         hType = self.style.getType()
         if hType == 'dog':
             headModel = gui.find('**/doghead')
         elif hType == 'cat':
             headModel = gui.find('**/cathead')
         elif hType == 'mouse':
             headModel = gui.find('**/mousehead')
         elif hType == 'horse':
             headModel = gui.find('**/horsehead')
         elif hType == 'rabbit':
             headModel = gui.find('**/bunnyhead')
         elif hType == 'duck':
             headModel = gui.find('**/duckhead')
         elif hType == 'monkey':
             headModel = gui.find('**/monkeyhead')
         elif hType == 'bear':
             headModel = gui.find('**/bearhead')
         elif hType == 'pig':
             headModel = gui.find('**/pighead')
         elif hType == 'deer':
             headModel = gui.find('**/deerhead')
         elif hType == 'beaver':
             headModel = gui.find('**/beaverhead')
         elif hType == 'alligator':
             headModel = gui.find('**/gatorhead')
         elif hType == 'fox':
             headModel = gui.find('**/foxhead')
         elif hType == 'bat':
             headModel = gui.find('**/bathead')
         elif hType == 'raccoon':
             headModel = gui.find('**/raccoonhead')
         else:
             raise StandardError('unknown toon species: ', hType)
         self.color = self.style.getHeadColor()
         self.container['image'] = headModel
         self.container['image_color'] = self.color
         self.resetFrameSize()
         self.setScale(0.1)
         self.frown = DirectFrame(parent=self.container, relief=None, image=gui.find('**/frown'))
         self.frown.setY(-0.1)
         self.smile = DirectFrame(parent=self.container, relief=None, image=gui.find('**/smile'))
         self.smile.setY(-0.1)
         self.eyes = DirectFrame(parent=self.container, relief=None, image=gui.find('**/eyes'))
         self.eyes.setY(-0.1)
         self.openSmile = DirectFrame(parent=self.container, relief=None, image=gui.find('**/open_smile'))
         self.tooth1 = DirectFrame(parent=self.openSmile, relief=None, image=gui.find('**/tooth_1'))
         self.tooth2 = DirectFrame(parent=self.openSmile, relief=None, image=gui.find('**/tooth_2'))
         self.tooth3 = DirectFrame(parent=self.openSmile, relief=None, image=gui.find('**/tooth_3'))
         self.tooth4 = DirectFrame(parent=self.openSmile, relief=None, image=gui.find('**/tooth_4'))
         self.tooth5 = DirectFrame(parent=self.openSmile, relief=None, image=gui.find('**/tooth_5'))
         self.tooth6 = DirectFrame(parent=self.openSmile, relief=None, image=gui.find('**/tooth_6'))
         self.maxLabel = DirectLabel(parent=self.eyes, relief=None, pos=(0.442, 0, 0.051), text='120', text_scale=0.4, text_font=ToontownGlobals.getInterfaceFont())
         self.maxLabel.setY(-0.1)
         self.hpLabel = DirectLabel(parent=self.eyes, relief=None, pos=(-0.398, 0, 0.051), text='120', text_scale=0.4, text_font=ToontownGlobals.getInterfaceFont())
         self.hpLabel.setY(-0.1)
         self.teeth = [self.tooth6,
          self.tooth5,
          self.tooth4,
          self.tooth3,
          self.tooth2,
          self.tooth1]
         for tooth in self.teeth:
             tooth.setY(-0.1)
         self.fractions = [0.0,
          0.166666,
          0.333333,
          0.5,
          0.666666,
          0.833333]
         if self.isLocalHealth: # Embed a little invisible button to show gags when clicking on the laff
             self.showDetailsButton = DirectButton(relief = None, parent = self.container, image = 'phase_3/maps/android/tui_move_l.png', scale = (1), command = self.showDetailsPopup)
             self.showDetailsButton.setTransparency(1)
             self.showDetailsButton.setColorScale(1, 1, 1, 0) # Make it invisible - it still recognizes clicks
     gui.removeNode()
Ejemplo n.º 11
0
 def load(self):
     if self.isLoaded():
         return
     else:
         guiNode = loader.loadModel('phase_13/models/parties/jukeboxGUI')
         self._timerGui = PartyUtils.getNewToontownTimer()
         self._windowFrame = DirectFrame(
             image=guiNode.find('**/background'),
             relief=None,
             pos=(0, 0, 0),
             scale=0.7)
         self._songFrame = DirectFrame(
             image=guiNode.find('**/songTitle_background'),
             parent=self._windowFrame,
             relief=None)
         self._currentlyPlayingLabel = self.__createLabel(
             guiNode,
             'currentlyPlaying',
             parent=self._windowFrame,
             text=TTLocalizer.JukeboxCurrentlyPlayingNothing,
             scale=TTLocalizer.JGcurrentlyPlayingLabel)
         self._songNameLabel = self.__createLabel(
             guiNode,
             'songName',
             parent=self._windowFrame,
             text=TTLocalizer.JukeboxCurrentSongNothing,
             scale=TTLocalizer.JGsongNameLabel)
         self._queueList, self._queueLabel = self.__createLabeledScrolledList(
             guiNode,
             'queue',
             label=TTLocalizer.JukeboxQueueLabel,
             parent=self._windowFrame)
         self._songsList, self._songsLabel = self.__createLabeledScrolledList(
             guiNode,
             'songs',
             label=TTLocalizer.JukeboxSongsLabel,
             parent=self._windowFrame)
         pos = guiNode.find('**/addButton_text_locator').getPos()
         self._addSongButton = self.__createButton(
             guiNode,
             'addSongButton',
             parent=self._windowFrame,
             command=self.__handleAddSongButtonClick,
             image3_color=Vec4(0.6, 0.6, 0.6, 0.6),
             text=TTLocalizer.JukeboxAddSong,
             text_align=TextNode.ACenter,
             text_pos=(pos[0], pos[2]),
             text_scale=TTLocalizer.JGaddSongButton)
         self._closeButton = self.__createButton(
             guiNode,
             'can_cancelButton',
             parent=self._windowFrame,
             command=self.__handleCloseButtonClick)
         pos = guiNode.find('**/close_text_locator').getPos()
         self._closeButton = self.__createButton(
             guiNode,
             'close',
             parent=self._windowFrame,
             command=self.__handleCloseButtonClick,
             text=TTLocalizer.JukeboxClose,
             text_align=TextNode.ACenter,
             text_pos=(pos[0], pos[2]),
             text_scale=0.08)
         self._moveToTopButton = self.__createButton(
             guiNode,
             'moveToTop',
             command=self.__handleMoveToTopButtonClick)
         guiNode.removeNode()
         self._loaded = True
         return
Ejemplo n.º 12
0
   def __init__(self, parent=None, frameSize=(.8,1.2), buttonTextColor=(1,1,1,1),
                font=None, itemScale=.045, itemTextScale=0.85, itemTextZ=0,
                command=None, contextMenu=None, autoFocus=0,
                colorChange=1, colorChangeDuration=1, newItemColor=globals.colors['guiblue1'],
                rolloverColor=globals.colors['guiyellow'],
                suppressMouseWheel=1, modifier='control'):
       self.mode = None
       self.focusButton=None
       self.command=command
       self.contextMenu=contextMenu
       self.autoFocus=autoFocus
       self.colorChange=colorChange
       self.colorChangeDuration=colorChangeDuration*.5
       self.newItemColor=newItemColor
       self.rolloverColor=rolloverColor
       self.rightClickTextColors=(Vec4(0,1,0,1),Vec4(0,35,100,1))
       self.font=font
       if font:
          self.fontHeight=font.getLineHeight()
       else:
          self.fontHeight=TextNode.getDefaultFont().getLineHeight()
       self.fontHeight*=1.2 # let's enlarge font height a little
       self.xtraSideSpace=.2*self.fontHeight
       self.itemTextScale=itemTextScale
       self.itemTextZ=itemTextZ
       self.buttonTextColor=buttonTextColor
       self.suppressMouseWheel=suppressMouseWheel
       self.modifier=modifier
       self.buttonsList=[]
       self.numItems=0
       self.__eventReceivers={}
       # DirectScrolledFrame to hold items
       self.itemScale=itemScale
       self.itemVertSpacing=self.fontHeight*self.itemScale
       self.frameWidth,self.frameHeight=frameSize
       # I set canvas' Z size smaller than the frame to avoid the auto-generated vertical slider bar
       self.childrenFrame = DirectScrolledFrame(
                    parent=parent,pos=(-self.frameWidth*.5,0,.5*self.frameHeight), relief=DGG.GROOVE,
                    state=DGG.NORMAL, # to create a mouse watcher region
                    frameSize=(0, self.frameWidth, -self.frameHeight, 0), frameColor=(0,0,0,.7),
                    canvasSize=(0, 0, -self.frameHeight*.5, 0), borderWidth=(0.01,0.01),
                    manageScrollBars=0, enableEdit=0, suppressMouse=0, sortOrder=1000 )
       # the real canvas is "self.childrenFrame.getCanvas()",
       # but if the frame is hidden since the beginning,
       # no matter how I set the canvas Z pos, the transform would be resistant,
       # so just create a new node under the canvas to be my canvas
       self.canvas=self.childrenFrame.getCanvas().attachNewNode('myCanvas')
       # slider background
       SliderBG=DirectFrame( parent=self.childrenFrame,frameSize=(-.025,.025,-self.frameHeight,0),
                    frameColor=(0,0,0,.7), pos=(-.03,0,0),enableEdit=0, suppressMouse=0)
       # slider thumb track
       sliderTrack = DirectFrame( parent=SliderBG, relief=DGG.FLAT, #state=DGG.NORMAL,
                    frameColor=(1,1,1,.2), frameSize=(-.015,.015,-self.frameHeight+.01,-.01),
                    enableEdit=0, suppressMouse=0)
       # page up
       self.pageUpRegion=DirectFrame( parent=SliderBG, relief=DGG.FLAT, state=DGG.NORMAL,
                    frameColor=(1,.8,.2,.1), frameSize=(-.015,.015,0,0),
                    enableEdit=0, suppressMouse=0)
       self.pageUpRegion.setAlphaScale(0)
       self.pageUpRegion.bind(DGG.B1PRESS,self.__startScrollPage,[-1])
       self.pageUpRegion.bind(DGG.WITHIN,self.__continueScrollUp)
       self.pageUpRegion.bind(DGG.WITHOUT,self.__suspendScrollUp)
       # page down
       self.pageDnRegion=DirectFrame( parent=SliderBG, relief=DGG.FLAT, state=DGG.NORMAL,
                    frameColor=(1,.8,.2,.1), frameSize=(-.015,.015,0,0),
                    enableEdit=0, suppressMouse=0)
       self.pageDnRegion.setAlphaScale(0)
       self.pageDnRegion.bind(DGG.B1PRESS,self.__startScrollPage,[1])
       self.pageDnRegion.bind(DGG.WITHIN,self.__continueScrollDn)
       self.pageDnRegion.bind(DGG.WITHOUT,self.__suspendScrollDn)
       self.pageUpDnSuspended=[0,0]
       # slider thumb
       self.vertSliderThumb=DirectButton(parent=SliderBG, relief=DGG.FLAT,
                    frameColor=(1,1,1,.6), frameSize=(-.015,.015,0,0),
                    enableEdit=0, suppressMouse=0, rolloverSound=None, clickSound=None)
       self.vertSliderThumb.bind(DGG.B1PRESS,self.__startdragSliderThumb)
       self.vertSliderThumb.bind(DGG.WITHIN,self.__enteringThumb)
       self.vertSliderThumb.bind(DGG.WITHOUT,self.__exitingThumb)
       self.oldPrefix=base.buttonThrowers[0].node().getPrefix()
       self.sliderThumbDragPrefix='draggingSliderThumb-'
       # GOD & I DAMN IT !!!
       # These things below don't work well if the canvas has a lot of buttons.
       # So I end up checking the mouse region every frame by myself using a continuous task.
 #       self.accept(DGG.WITHIN+self.childrenFrame.guiId,self.__enteringFrame)
 #       self.accept(DGG.WITHOUT+self.childrenFrame.guiId,self.__exitingFrame)
       self.isMouseInRegion=False
       self.mouseOutInRegionCommand=(self.__exitingFrame,self.__enteringFrame)
       taskMgr.doMethodLater(.2,self.__getFrameRegion,'getFrameRegion')
Ejemplo n.º 13
0
    def __init__(self,
                 items,
                 parent=None,
                 sidePad=.0,
                 edgePos=PTop,
                 align=ALeft,
                 effect=ENone,
                 buttonThrower=None,
                 font=None,
                 baselineOffset=.0,
                 scale=.05,
                 itemHeight=1.,
                 leftPad=.0,
                 separatorHeight=.5,
                 underscoreThickness=1,
                 BGColor=(0, 0, 0, .7),
                 BGBorderColor=(1, .85, .4, 1),
                 separatorColor=(1, 1, 1, 1),
                 frameColorHover=(1, .85, .4, 1),
                 frameColorPress=(0, 1, 0, 1),
                 textColorReady=(1, 1, 1, 1),
                 textColorHover=(0, 0, 0, 1),
                 textColorPress=(0, 0, 0, 1),
                 textColorDisabled=(.5, .5, .5, 1),
                 draggable=False,
                 onMove=None):
        '''
      sidePad : additional space on the left and right of the text item
      edgePos : menu bar position on the screen,
                  use DropDownMenu.PLeft, PRight, PBottom, or PTop
      align   : menu items alignment on menu bar,
                  use DropDownMenu.ALeft, ACenter, or ARight
      effect  : the drop down appearance effect,
                  use DropDownMenu.ENone, EFade, ESlide, or EStretch
      draggable : menu bar's draggability status
      onMove : a function which will be called after changing edge position

      Read the remaining options documentation in PopupMenu class.
      '''
        self.parent = parent if parent else getattr(
            base, DropDownMenu.parents[edgePos][align])
        self.BT = buttonThrower if buttonThrower else base.buttonThrowers[
            0].node()
        self.menu = self.parent.attachNewNode('dropdownmenu-%s' % id(self))
        self.font = font if font else TextNode.getDefaultFont()
        self.baselineOffset = baselineOffset
        self.scale = scale
        self.itemHeight = itemHeight
        self.sidePad = sidePad
        self.edgePos = edgePos
        self.alignment = align
        self.effect = effect
        self.leftPad = leftPad
        self.underscoreThickness = underscoreThickness
        self.separatorHeight = separatorHeight
        self.BGColor = BGColor
        self.BGBorderColor = BGBorderColor
        self.separatorColor = separatorColor
        self.frameColorHover = frameColorHover
        self.frameColorPress = frameColorPress
        self.textColorReady = textColorReady
        self.textColorHover = textColorHover
        self.textColorPress = textColorPress
        self.textColorDisabled = textColorDisabled
        self.draggable = draggable
        self.onMove = onMove
        self.dropDownMenu = self.whoseDropDownMenu = None

        self.gapFromEdge = gapFromEdge = .008
        texMargin = self.font.getTextureMargin() * self.scale * .25
        b = DirectButton(parent=NodePath(''),
                         text='^|g_',
                         text_font=self.font,
                         scale=self.scale)
        fr = b.node().getFrame()
        b.getParent().removeNode()
        baselineToCenter = (fr[2] + fr[3]) * self.scale
        LH = (fr[3] - fr[2]) * self.itemHeight * self.scale
        baselineToTop = (fr[3] * self.itemHeight * self.scale /
                         LH) / (1. + self.baselineOffset)
        baselineToBot = LH / self.scale - baselineToTop
        self.height = LH + .01
        l, r, b, t = 0, 5, -self.height, 0
        self.menuBG = DirectFrame(parent=self.menu,
                                  frameColor=BGColor,
                                  frameSize=(l, r, b, t),
                                  state=DGG.NORMAL,
                                  suppressMouse=1)
        if self.draggable:
            self.setDraggable(1)
        LSborder = LineSegs()
        LSborder.setThickness(2)
        LSborder.setColor(0, 0, 0, 1)
        LSborder.moveTo(l, 0, b)
        LSborder.drawTo(r, 0, b)
        self.menuBG.attachNewNode(LSborder.create())
        self.itemsParent = self.menu.attachNewNode('menu items parent')

        x = sidePad * self.scale + gapFromEdge
        for t, menuItemsGenerator in items:
            underlinePos = t.find('_')
            t = t.replace('_', '')
            b = DirectButton(
                parent=self.itemsParent,
                text=t,
                text_font=self.font,
                pad=(sidePad, 0),
                scale=self.scale,
                pos=(x, 0, -baselineToTop * self.scale - gapFromEdge),
                text_fg=textColorReady,
                # text color when mouse over
                text2_fg=textColorHover,
                # text color when pressed
                text1_fg=textColorPress,
                # framecolor when pressed
                frameColor=frameColorPress,
                command=self.__createMenu,
                extraArgs=[True, menuItemsGenerator],
                text_align=TextNode.ALeft,
                relief=DGG.FLAT,
                rolloverSound=0,
                clickSound=0)
            b['extraArgs'] += [b.getName()]
            b.stateNodePath[2].setColor(
                *frameColorHover)  # framecolor when mouse over
            b.stateNodePath[0].setColor(0, 0, 0, 0)  # framecolor when ready
            fr = b.node().getFrame()
            b['frameSize'] = (fr[0], fr[1], -baselineToBot, baselineToTop)
            self.accept(DGG.ENTER + b.guiId, self.__createMenu,
                        [False, menuItemsGenerator,
                         b.getName()])
            if underlinePos > -1:
                tn = TextNode('')
                tn.setFont(self.font)
                tn.setText(t[:underlinePos + 1])
                tnp = NodePath(tn.getInternalGeom())
                underlineXend = tnp.getTightBounds()[1][0]
                tnp.removeNode()
                tn.setText(t[underlinePos])
                tnp = NodePath(tn.getInternalGeom())
                b3 = tnp.getTightBounds()
                underlineXstart = underlineXend - (b3[1] - b3[0])[0]
                tnp.removeNode()
                LSunder = LineSegs()
                LSunder.setThickness(underscoreThickness)
                LSunder.moveTo(underlineXstart + texMargin, 0,
                               -.7 * baselineToBot)
                LSunder.drawTo(underlineXend - texMargin, 0,
                               -.7 * baselineToBot)
                underline = b.stateNodePath[0].attachNewNode(LSunder.create())
                underline.setColor(Vec4(*textColorReady), 1)
                underline.copyTo(b.stateNodePath[1],
                                 10).setColor(Vec4(*textColorPress), 1)
                underline.copyTo(b.stateNodePath[2],
                                 10).setColor(Vec4(*textColorHover), 1)
                self.accept('alt-' + t[underlinePos].lower(),
                            self.__createMenu,
                            [True, menuItemsGenerator,
                             b.getName()])
            x += (fr[1] - fr[0]) * self.scale
        self.width = x - 2 * gapFromEdge
        self.align(align)
        self.setEdgePos(edgePos)
        self.minZ = base.a2dBottom + self.height if edgePos == DropDownMenu.PBottom else None
        viewPlaneNode = PlaneNode('cut menu')
        viewPlaneNode.setPlane(Plane(Vec3(0, 0, -1), Point3(0, 0, -LH)))
        self.clipPlane = self.menuBG.attachNewNode(viewPlaneNode)
Ejemplo n.º 14
0
    def __init__(self,
                 items,
                 parent=None,
                 buttonThrower=None,
                 onDestroy=None,
                 font=None,
                 baselineOffset=.0,
                 scale=.05,
                 itemHeight=1.,
                 leftPad=.0,
                 separatorHeight=.5,
                 underscoreThickness=1,
                 BGColor=(0, 0, 0, .7),
                 BGBorderColor=(1, .85, .4, 1),
                 separatorColor=(1, 1, 1, 1),
                 frameColorHover=(1, .85, .4, 1),
                 frameColorPress=(0, 1, 0, 1),
                 textColorReady=(1, 1, 1, 1),
                 textColorHover=(0, 0, 0, 1),
                 textColorPress=(0, 0, 0, 1),
                 textColorDisabled=(.5, .5, .5, 1),
                 minZ=None,
                 useMouseZ=True):
        '''
      items : a collection of menu items
         Item format :
            ( 'Item text', 'path/to/image', command )
                        OR
            ( 'Item text', 'path/to/image', command, arg1,arg2,.... )
         If you don't want to use an image, pass 0.

         To create disabled item, pass 0 for the command :
            ( 'Item text', 'path/to/image', 0 )
         so, you can easily switch between enabled or disabled :
            ( 'Item text', 'path/to/image', command if commandEnabled else 0 )
                        OR
            ( 'Item text', 'path/to/image', (0,command)[commandEnabled] )

         To create submenu, pass a sequence of submenu items for the command.
         To create disabled submenu, pass an empty sequence for the command.

         To enable hotkey, insert an underscore before the character,
         e.g. hotkey of 'Item te_xt' is 'x' key.

         To add shortcut key text at the right side of the item, append it at the end of
         the item text, separated by "more than" sign, e.g. 'Item text>Ctrl-T'.

         To insert separator line, pass 0 for the whole item.


      parent : where to attach the menu, defaults to aspect2d

      buttonThrower : button thrower whose thrown events are blocked temporarily
                      when the menu is displayed. If not given, the default
                      button thrower is used

      onDestroy : user function which will be called after the menu is fully destroyed

      font           : text font
      baselineOffset : text's baseline Z offset

      scale       : text scale
      itemHeight  : spacing between items, defaults to 1
      leftPad     : blank space width before text
      separatorHeight : separator line height, relative to itemHeight

      underscoreThickness : underscore line thickness

      BGColor, BGBorderColor, separatorColor, frameColorHover, frameColorPress,
      textColorReady, textColorHover, textColorPress, textColorDisabled
      are some of the menu components' color

      minZ : minimum Z position to restrain menu's bottom from going offscreen (-1..1).
             If it's None, it will be set a little above the screen's bottom.
      '''
        self.parent = parent if parent else aspect2d
        self.onDestroy = onDestroy
        self.BT = buttonThrower if buttonThrower else base.buttonThrowers[
            0].node()
        self.menu = NodePath('menu-%s' % id(self))
        self.parentMenu = None
        self.submenu = None
        self.BTprefix = self.menu.getName() + '>'
        self.submenuCreationTaskName = 'createSubMenu-' + self.BTprefix
        self.submenuRemovalTaskName = 'removeSubMenu-' + self.BTprefix
        self.font = font if font else TextNode.getDefaultFont()
        self.baselineOffset = baselineOffset
        self.scale = scale
        self.itemHeight = itemHeight
        self.leftPad = leftPad
        self.separatorHeight = separatorHeight
        self.underscoreThickness = underscoreThickness
        self.BGColor = BGColor
        self.BGBorderColor = BGBorderColor
        self.separatorColor = separatorColor
        self.frameColorHover = frameColorHover
        self.frameColorPress = frameColorPress
        self.textColorReady = textColorReady
        self.textColorHover = textColorHover
        self.textColorPress = textColorPress
        self.textColorDisabled = textColorDisabled
        self.minZ = minZ
        self.mpos = Point2(base.mouseWatcherNode.getMouse())

        self.itemCommand = []
        self.hotkeys = {}
        self.numItems = 0
        self.sel = -1
        self.selByKey = False

        bgPad = self.bgPad = .0125
        texMargin = self.font.getTextureMargin() * self.scale * .25
        b = DirectButton(parent=NodePath(''),
                         text='^|g_',
                         text_font=self.font,
                         scale=self.scale)
        fr = b.node().getFrame()
        b.getParent().removeNode()
        baselineToCenter = (fr[2] + fr[3]) * self.scale
        LH = (fr[3] - fr[2]) * self.itemHeight * self.scale
        imageHalfHeight = .5 * (fr[3] - fr[2]) * self.itemHeight * .85
        arrowHalfHeight = .5 * (fr[3] - fr[2]) * self.itemHeight * .5
        baselineToTop = (fr[3] * self.itemHeight * self.scale /
                         LH) / (1. + self.baselineOffset)
        baselineToBot = LH / self.scale - baselineToTop
        itemZcenter = (baselineToTop - baselineToBot) * .5
        separatorHalfHeight = .5 * separatorHeight * LH
        LSseparator = LineSegs()
        LSseparator.setColor(.5, .5, .5, .2)

        arrowVtx = [
            (0, itemZcenter),
            (-2 * arrowHalfHeight, itemZcenter + arrowHalfHeight),
            (-arrowHalfHeight, itemZcenter),
            (-2 * arrowHalfHeight, itemZcenter - arrowHalfHeight),
        ]
        tri = Triangulator()
        vdata = GeomVertexData('trig', GeomVertexFormat.getV3(), Geom.UHStatic)
        vwriter = GeomVertexWriter(vdata, 'vertex')
        for x, z in arrowVtx:
            vi = tri.addVertex(x, z)
            vwriter.addData3f(x, 0, z)
            tri.addPolygonVertex(vi)
        tri.triangulate()
        prim = GeomTriangles(Geom.UHStatic)
        for i in range(tri.getNumTriangles()):
            prim.addVertices(tri.getTriangleV0(i), tri.getTriangleV1(i),
                             tri.getTriangleV2(i))
            prim.closePrimitive()
        geom = Geom(vdata)
        geom.addPrimitive(prim)
        geomNode = GeomNode('arrow')
        geomNode.addGeom(geom)
        realArrow = NodePath(geomNode)
        z = -baselineToTop * self.scale - bgPad
        maxWidth = .1 / self.scale
        shortcutTextMaxWidth = 0
        anyImage = False
        anyArrow = False
        anyShortcut = False
        arrows = []
        shortcutTexts = []
        loadPrcFileData('', 'text-flatten 0')
        for item in items:
            if item:
                t, imgPath, f = item[:3]
                haveSubmenu = type(f) in SEQUENCE_TYPES
                anyArrow |= haveSubmenu
                anyImage |= bool(imgPath)
                disabled = not len(f) if haveSubmenu else not callable(f)
                args = item[3:]
                underlinePos = t.find('_')
                t = t.replace('_', '')
                shortcutSepPos = t.find('>')
                if shortcutSepPos > -1:
                    if haveSubmenu:
                        print(
                            "\nA SHORTCUT KEY POINTING TO A SUBMENU IS NON-SENSE, DON'T YOU AGREE ?"
                        )
                    else:
                        shortcutText = NodePath(
                            OnscreenText(
                                parent=self.menu,
                                text=t[shortcutSepPos + 1:],
                                font=self.font,
                                scale=1,
                                fg=(1, 1, 1, 1),
                                align=TextNode.ARight,
                            ))
                        shortcutTextMaxWidth = max(
                            shortcutTextMaxWidth,
                            abs(shortcutText.getTightBounds()[0][0]))
                        anyShortcut = True
                    t = t[:shortcutSepPos]
                else:
                    shortcutText = ''
                EoLcount = t.count('\n')
                arrowZpos = -self.font.getLineHeight() * EoLcount * .5
                if disabled:
                    b = NodePath(
                        OnscreenText(
                            parent=self.menu,
                            text=t,
                            font=self.font,
                            scale=1,
                            fg=textColorDisabled,
                            align=TextNode.ALeft,
                        ))
                    # don't pass the scale and position to OnscreenText constructor,
                    # to maintain correctness between the OnscreenText and DirectButton items
                    # due to the new text generation implementation
                    b.setScale(self.scale)
                    b.setZ(z)
                    maxWidth = max(maxWidth,
                                   b.getTightBounds()[1][0] / self.scale)
                    if shortcutText:
                        shortcutText.reparentTo(b)
                        shortcutText.setColor(Vec4(*textColorDisabled), 1)
                        shortcutText.setZ(arrowZpos)
                        shortcutTexts.append(shortcutText)
                else:
                    b = DirectButton(
                        parent=self.menu,
                        text=t,
                        text_font=self.font,
                        scale=self.scale,
                        pos=(0, 0, z),
                        text_fg=textColorReady,
                        # text color when mouse over
                        text2_fg=textColorHover,
                        # text color when pressed
                        text1_fg=textColorHover
                        if haveSubmenu else textColorPress,
                        # framecolor when pressed
                        frameColor=frameColorHover
                        if haveSubmenu else frameColorPress,
                        command=(lambda: 0)
                        if haveSubmenu else self.__runCommand,
                        extraArgs=[] if haveSubmenu else [f, args],
                        text_align=TextNode.ALeft,
                        relief=DGG.FLAT,
                        rolloverSound=0,
                        clickSound=0,
                        pressEffect=0)
                    b.stateNodePath[2].setColor(
                        *frameColorHover)  # framecolor when mouse over
                    b.stateNodePath[0].setColor(0, 0, 0,
                                                0)  # framecolor when ready
                    bframe = Vec4(b.node().getFrame())
                    if EoLcount:
                        bframe.setZ(EoLcount * 10)
                        b['frameSize'] = bframe
                    maxWidth = max(maxWidth, bframe[1])
                    if shortcutText:
                        for snpi, col in ((0, textColorReady),
                                          (1, textColorPress),
                                          (2, textColorHover)):
                            sct = shortcutText.copyTo(b.stateNodePath[snpi],
                                                      sort=10)
                            sct.setColor(Vec4(*col), 1)
                            sct.setZ(arrowZpos)
                            shortcutTexts.append(sct)
                        shortcutText.removeNode()
                if imgPath:
                    img = loader.loadTexture(imgPath)
                    if disabled:
                        if imgPath in PopupMenu.grayImages:
                            img = PopupMenu.grayImages[imgPath]
                        else:
                            pnm = PNMImage()
                            img.store(pnm)
                            pnm.makeGrayscale(.2, .2, .2)
                            img = Texture()
                            img.load(pnm)
                            PopupMenu.grayImages[imgPath] = img
                    img.setMinfilter(Texture.FTLinearMipmapLinear)
                    img.setWrapU(Texture.WMClamp)
                    img.setWrapV(Texture.WMClamp)
                    CM = CardMaker('')
                    CM.setFrame(-2 * imageHalfHeight - leftPad, -leftPad,
                                itemZcenter - imageHalfHeight,
                                itemZcenter + imageHalfHeight)
                    imgCard = b.attachNewNode(CM.generate())
                    imgCard.setTexture(img)
                if underlinePos > -1:
                    oneLineText = t[:underlinePos + 1]
                    oneLineText = oneLineText[oneLineText.rfind('\n') + 1:]
                    tn = TextNode('')
                    tn.setFont(self.font)
                    tn.setText(oneLineText)
                    tnp = NodePath(tn.getInternalGeom())
                    underlineXend = tnp.getTightBounds()[1][0]
                    tnp.removeNode()
                    tn.setText(t[underlinePos])
                    tnp = NodePath(tn.getInternalGeom())
                    b3 = tnp.getTightBounds()
                    underlineXstart = underlineXend - (b3[1] - b3[0])[0]
                    tnp.removeNode()
                    underlineZpos = -.7 * baselineToBot - self.font.getLineHeight(
                    ) * t[:underlinePos].count('\n')
                    LSunder = LineSegs()
                    LSunder.setThickness(underscoreThickness)
                    LSunder.moveTo(underlineXstart + texMargin, 0,
                                   underlineZpos)
                    LSunder.drawTo(underlineXend - texMargin, 0, underlineZpos)
                    if disabled:
                        underline = b.attachNewNode(LSunder.create())
                        underline.setColor(Vec4(*textColorDisabled), 1)
                    else:
                        underline = b.stateNodePath[0].attachNewNode(
                            LSunder.create())
                        underline.setColor(Vec4(*textColorReady), 1)
                        underline.copyTo(b.stateNodePath[1], 10).setColor(
                            Vec4(*textColorHover
                                 if haveSubmenu else textColorPress), 1)
                        underline.copyTo(b.stateNodePath[2],
                                         10).setColor(Vec4(*textColorHover), 1)
                        hotkey = t[underlinePos].lower()
                        if hotkey in self.hotkeys:
                            self.hotkeys[hotkey].append(self.numItems)
                        else:
                            self.hotkeys[hotkey] = [self.numItems]
                            self.accept(self.BTprefix + hotkey,
                                        self.__processHotkey, [hotkey])
                            self.accept(self.BTprefix + 'alt-' + hotkey,
                                        self.__processHotkey, [hotkey])
                if haveSubmenu:
                    if disabled:
                        arrow = realArrow.instanceUnderNode(b, '')
                        arrow.setColor(Vec4(*textColorDisabled), 1)
                        arrow.setZ(arrowZpos)
                    else:
                        arrow = realArrow.instanceUnderNode(
                            b.stateNodePath[0], 'r')
                        arrow.setColor(Vec4(*textColorReady), 1)
                        arrow.setZ(arrowZpos)
                        arrPress = realArrow.instanceUnderNode(
                            b.stateNodePath[1], 'p')
                        arrPress.setColor(Vec4(*textColorHover), 1)
                        arrPress.setZ(arrowZpos)
                        arrHover = realArrow.instanceUnderNode(
                            b.stateNodePath[2], 'h')
                        arrHover.setColor(Vec4(*textColorHover), 1)
                        arrHover.setZ(arrowZpos)
                        # weird, if sort order is 0, it's obscured by the frame
                        for a in (arrPress, arrHover):
                            a.reparentTo(a.getParent(), sort=10)
                if not disabled:
                    extraArgs = [self.numItems, f if haveSubmenu else 0]
                    self.accept(DGG.ENTER + b.guiId, self.__hoverOnItem,
                                extraArgs)
                    self.accept(DGG.EXIT + b.guiId, self.__offItem)
                    #~ self.itemCommand.append((None,0) if haveSubmenu else (f,args))
                    self.itemCommand.append((f, args))
                    if self.numItems == 0:
                        self.firstButtonIdx = int(b.guiId[2:])
                    self.numItems += 1
                z -= LH + self.font.getLineHeight() * self.scale * EoLcount
            else:  # SEPARATOR LINE
                z += LH - separatorHalfHeight - baselineToBot * self.scale
                LSseparator.moveTo(0, 0, z)
                LSseparator.drawTo(self.scale * .5, 0, z)
                LSseparator.drawTo(self.scale, 0, z)
                z -= separatorHalfHeight + baselineToTop * self.scale
        maxWidth += 7 * arrowHalfHeight * (
            anyArrow or anyShortcut) + .2 + shortcutTextMaxWidth
        arrowXpos = maxWidth - arrowHalfHeight
        realArrow.setX(arrowXpos)
        if anyImage:
            leftPad += 2 * imageHalfHeight + leftPad
        for sct in shortcutTexts:
            sct.setX(maxWidth - 2 * (arrowHalfHeight * anyArrow + .2))
        for c in asList(self.menu.findAllMatches('**/DirectButton*')):
            numLines = c.node().getFrame()[2]
            c.node().setFrame(
                Vec4(
                    -leftPad, maxWidth, -baselineToBot -
                    (numLines * .1 * self.itemHeight if numLines >= 10 else 0),
                    baselineToTop))
        loadPrcFileData('', 'text-flatten 1')

        try:
            minZ = self.menu.getChild(0).getRelativePoint(
                b, Point3(0, 0,
                          b.node().getFrame()[2]))[2]
        except:
            minZ = self.menu.getChild(0).getRelativePoint(
                self.menu, Point3(
                    0, 0,
                    b.getTightBounds()[0][2]))[2] - baselineToBot * .5
        try:
            top = self.menu.getChild(0).node().getFrame()[3]
        except:
            top = self.menu.getChild(0).getZ() + baselineToTop
        l, r, b, t = -leftPad - bgPad / self.scale, maxWidth + bgPad / self.scale, minZ - bgPad / self.scale, top + bgPad / self.scale
        menuBG = DirectFrame(parent=self.menu.getChild(0),
                             frameSize=(l, r, b, t),
                             frameColor=BGColor,
                             state=DGG.NORMAL,
                             suppressMouse=1)
        menuBorder = self.menu.getChild(0).attachNewNode('border')
        borderVtx = (
            (l, 0, b),
            (l, 0, .5 * (b + t)),
            (l, 0, t),
            (.5 * (l + r), 0, t),
            (r, 0, t),
            (r, 0, .5 * (b + t)),
            (r, 0, b),
            (.5 * (l + r), 0, b),
            (l, 0, b),
        )
        LSborderBG = LineSegs()
        LSborderBG.setThickness(4)
        LSborderBG.setColor(0, 0, 0, .7)
        LSborderBG.moveTo(*(borderVtx[0]))
        for v in borderVtx[1:]:
            LSborderBG.drawTo(*v)
        # fills the gap at corners
        for v in range(0, 7, 2):
            LSborderBG.moveTo(*(borderVtx[v]))
        menuBorder.attachNewNode(LSborderBG.create())
        LSborder = LineSegs()
        LSborder.setThickness(2)
        LSborder.setColor(*BGBorderColor)
        LSborder.moveTo(*(borderVtx[0]))
        for v in borderVtx[1:]:
            LSborder.drawTo(*v)
        menuBorder.attachNewNode(LSborder.create())
        for v in range(1, 8, 2):
            LSborderBG.setVertexColor(v, Vec4(0, 0, 0, .1))
            LSborder.setVertexColor(v, Vec4(.3, .3, .3, .5))
        menuBorderB3 = menuBorder.getTightBounds()
        menuBorderDims = menuBorderB3[1] - menuBorderB3[0]
        menuBG.wrtReparentTo(self.menu, sort=-1)
        self.menu.reparentTo(self.parent)
        x = -menuBorderB3[0][0] * self.scale
        for c in asList(self.menu.getChildren()):
            c.setX(x)
        self.maxWidth = maxWidth = menuBorderDims[0]
        self.height = menuBorderDims[2]
        maxWidthR2D = maxWidth * self.menu.getChild(0).getSx(render2d)
        separatorLines = self.menu.attachNewNode(LSseparator.create(), 10)
        separatorLines.setSx(maxWidth)
        for v in range(1, LSseparator.getNumVertices(), 3):
            LSseparator.setVertexColor(v, Vec4(*separatorColor))
        x = clampScalar(-.98, .98 - maxWidthR2D,
                        self.mpos[0] - maxWidthR2D * .5)
        minZ = (-.98 if self.minZ is None else self.minZ)
        z = clampScalar(
            minZ +
            menuBorderDims[2] * self.scale * self.parent.getSz(render2d), .98,
            self.mpos[1] if useMouseZ else -1000)
        self.menu.setPos(render2d, x, 0, z)
        self.menu.setTransparency(1)

        self.origBTprefix = self.BT.getPrefix()
        self.BT.setPrefix(self.BTprefix)
        self.accept(self.BTprefix + 'escape', self.destroy)
        for e in ('mouse1', 'mouse3'):
            self.accept(self.BTprefix + e, self.destroy, [True])
        self.accept(self.BTprefix + 'arrow_down', self.__nextItem)
        self.accept(self.BTprefix + 'arrow_down-repeat', self.__nextItem)
        self.accept(self.BTprefix + 'arrow_up', self.__prevItem)
        self.accept(self.BTprefix + 'arrow_up-repeat', self.__prevItem)
        self.accept(self.BTprefix + 'enter', self.__runSelItemCommand)
        self.accept(self.BTprefix + 'space', self.__runSelItemCommand)
Ejemplo n.º 15
0
    def initRaceMode(self):
        self.mapScene = self.raceModeRoot.attachNewNode('MapScene')
        self.mapScene.setPos(1.1, 0, 0.75)
        self.mapScene.setScale(0.25, 0.001, 0.25)
        maxT = self.race.curve.getMaxT()
        pt = Vec3(0, 0, 0)
        ls = LineSegs('MapLines')
        ls.setColor(1, 1, 1, 1)
        ls.setThickness(2)
        for x in range(101):
            self.race.curve.getPoint(x / 100.0 * maxT, pt)
            if x == 0:
                ls.moveTo(pt[0], pt[1], pt[2])
            else:
                ls.drawTo(pt[0], pt[1], pt[2])

        self.mapLines = self.mapScene.attachNewNode(ls.create())
        self.mapLines.setScale(0.00025 *
                               RaceGlobals.TrackDict[self.race.trackId][6])
        self.mapLines.setP(90)
        self.faceStartPos = Vec3(-0.8, 0, 0.93)
        self.faceEndPos = Vec3(0.8, 0, 0.93)
        self.placeLabelNum = DirectLabel(
            relief=None,
            pos=TTLocalizer.RGUIplaceLabelNumPos,
            text='1',
            text_scale=0.35,
            text_fg=(0.95, 0.95, 0, 1),
            text_font=ToontownGlobals.getSignFont())
        self.placeLabelNum.reparentTo(self.raceModeRoot)
        self.directObjList.append(self.placeLabelNum)
        self.placeLabelStr = DirectLabel(
            relief=None,
            pos=TTLocalizer.RGUIplaceLabelStrPos,
            text=TTLocalizer.KartRace_FirstSuffix,
            text_scale=0.1,
            text_fg=(0.95, 0.95, 0, 1),
            text_font=ToontownGlobals.getSignFont())
        self.placeLabelStr.reparentTo(self.raceModeRoot)
        self.directObjList.append(self.placeLabelStr)
        self.lapLabel = DirectLabel(relief=None,
                                    pos=(1.1, 0, 0.45),
                                    text='1/' + str(self.race.lapCount),
                                    text_scale=0.1,
                                    text_fg=(0.95, 0.95, 0, 1),
                                    text_font=ToontownGlobals.getSignFont())
        self.lapLabel.reparentTo(self.raceModeRoot)
        self.directObjList.append(self.lapLabel)
        self.photoFinishLabel = DirectLabel(
            relief=None,
            pos=(0, 0, -0.1),
            text=TTLocalizer.KartRace_PhotoFinish,
            text_scale=TTLocalizer.RGUIphotoFinish,
            text_fg=(0.95, 0.95, 0, 1),
            text_font=ToontownGlobals.getSignFont())
        self.photoFinishLabel.hide()
        self.directObjList.append(self.photoFinishLabel)
        self.wrongWayLabel = DirectLabel(
            relief=None,
            pos=(1.1, 0, 0.85),
            text=TTLocalizer.KartRace_WrongWay,
            text_scale=0.1,
            text_fg=(0.95, 0, 0, 1),
            text_font=ToontownGlobals.getSignFont())
        self.wrongWayLabel.reparentTo(self.raceModeRoot)
        self.directObjList.append(self.wrongWayLabel)
        self.wrongWayLabel.setColorScale(Vec4(1, 1, 1, 0))
        self.wrongWaySeq = Sequence(
            self.wrongWayLabel.colorScaleInterval(0.25,
                                                  colorScale=Vec4(1, 1, 1, 1),
                                                  startColorScale=Vec4(
                                                      1, 1, 1, 0)),
            self.wrongWayLabel.colorScaleInterval(0.25,
                                                  colorScale=Vec4(1, 1, 1, 0),
                                                  startColorScale=Vec4(
                                                      1, 1, 1, 1)))
        interpolateFacePos = lambda x: self.faceStartPos * (
            1.0 - x) + self.faceEndPos * x
        self.timeLabels = []
        for x in range(self.race.lapCount):
            minLabel = DirectLabel(
                relief=None,
                pos=(interpolateFacePos(
                    (2.0 * x + 1) / (self.race.lapCount * 2))[0] - 0.06, 0,
                     0.84),
                text="0'",
                text_scale=0.06,
                text_fg=(0.95, 0.95, 0, 1),
                text_font=ToontownGlobals.getSignFont(),
                text_align=TextNode.ARight)
            minLabel.reparentTo(self.raceModeRoot)
            self.directObjList.append(minLabel)
            secLabel = DirectLabel(
                relief=None,
                pos=(interpolateFacePos(
                    (2.0 * x + 1) / (self.race.lapCount * 2))[0] + 0.06, 0,
                     0.84),
                text="00''",
                text_scale=0.06,
                text_fg=(0.95, 0.95, 0, 1),
                text_font=ToontownGlobals.getSignFont(),
                text_align=TextNode.ARight)
            secLabel.reparentTo(self.raceModeRoot)
            self.directObjList.append(secLabel)
            fractionLabel = DirectLabel(
                relief=None,
                pos=(interpolateFacePos(
                    (2.0 * x + 1) / (self.race.lapCount * 2))[0] + 0.14, 0,
                     0.84),
                text='00',
                text_scale=0.06,
                text_fg=(0.95, 0.95, 0, 1),
                text_font=ToontownGlobals.getSignFont(),
                text_align=TextNode.ARight)
            fractionLabel.reparentTo(self.raceModeRoot)
            self.directObjList.append(fractionLabel)
            self.timeLabels.append((minLabel, secLabel, fractionLabel))

        self.cardMaker.reset()
        self.cardMaker.setName('GagIndicator')
        self.cardMaker.setFrame(-0.5, 0.5, -0.5, 0.5)
        self.cardMaker.setColor(1, 1, 1, 1)
        self.gagPanel = DirectFrame(
            parent=self.raceModeRoot,
            relief=None,
            image=loader.loadModel('phase_6/models/karting/gag_panel'),
            image_scale=0.25,
            pos=(-1.13, 0, -0.5))
        self.directObjList.append(self.gagPanel)
        self.gag = self.gagPanel.attachNewNode('gag')
        self.gag.setScale(0.2)
        for gag in self.gagTextures:
            gag.reparentTo(self.gag)
            gag.hide()

        self.cardMaker.reset()
        self.cardMaker.setName('RaceProgressLine')
        self.cardMaker.setFrame(-0.5, 0.5, -0.5, 0.5)
        line = self.raceModeRoot.attachNewNode(self.cardMaker.generate())
        line.setScale(self.faceEndPos[0] - self.faceStartPos[0], 1, 0.01)
        line.setPos(0, 0, self.faceStartPos[2])
        self.cardMaker.setName('RaceProgressLineHash')
        for n in range(self.race.lapCount + 1):
            hash = self.raceModeRoot.attachNewNode(self.cardMaker.generate())
            hash.setScale(line.getScale()[2], 1, line.getScale()[2] * 5)
            t = float(n) / self.race.lapCount
            hash.setPos(
                self.faceStartPos[0] * (1 - t) + self.faceEndPos[0] * t,
                self.faceStartPos[1], self.faceStartPos[2])

        self.raceModeReady = True
        self.disable()
        return
Ejemplo n.º 16
0
 def _createTimePage(self):
     page = DirectFrame(self.frame)
     page.setName('PartyPlannerTimePage')
     self.createTimeTitleLabel = DirectLabel(
         parent=page,
         relief=None,
         text=TTLocalizer.PartyPlannerTimeTitle,
         pos=self.gui.find('**/title_locator').getPos(),
         scale=self.titleScale)
     self.clockImage = DirectFrame(
         parent=page,
         relief=None,
         geom=self.gui.find('**/toontownTime_background'))
     self.timePageToontownLabel = DirectLabel(
         parent=page,
         relief=None,
         text=TTLocalizer.PartyPlannerTimeToontown,
         pos=self.gui.find('**/step_03_toontown_locator').getPos(),
         scale=0.15,
         text_fg=(1.0, 0.0, 0.0, 1.0),
         text_font=ToontownGlobals.getSignFont())
     self.timePageTimeLabel = DirectLabel(
         parent=page,
         relief=None,
         text=TTLocalizer.PartyPlannerTimeTime,
         pos=self.gui.find('**/step_03_time_locator').getPos(),
         scale=0.15,
         text_fg=(1.0, 0.0, 0.0, 1.0),
         text_font=ToontownGlobals.getSignFont())
     self.timePageRecapLabel = DirectLabel(
         parent=page,
         relief=None,
         text=TTLocalizer.PartyPlannerTimeRecap,
         pos=self.gui.find('**/step_03_partyDateAndTime_locator').getPos(),
         scale=0.09)
     self.timePageRecapToontownTimeLabel1 = DirectLabel(
         parent=page,
         relief=None,
         text=TTLocalizer.PartyPlannerTimeToontownTime,
         pos=self.gui.find('**/step_03_toontownTime_locator').getPos(),
         scale=0.06)
     self.timePageRecapToontownTimeLabel2 = DirectLabel(
         parent=page,
         relief=None,
         text='%s' % PartyUtils.formatDateTime(self.partyTime),
         pos=self.gui.find(
             '**/step_03_toontownDateAndTime_loactor').getPos(),
         textMayChange=True,
         scale=0.06)
     self.timePageRecapLocalTimeLabel = DirectLabel(
         parent=page,
         relief=None,
         text='%s%s' %
         (TTLocalizer.PartyPlannerTimeLocalTime,
          PartyUtils.formatDateTime(self.partyTime, inLocalTime=True)),
         pos=self.gui.find('**/step_03_localDateAndTime_loactor').getPos(),
         textMayChange=True,
         scale=0.06,
         text_fg=(1.0, 0.0, 0.0, 1.0))
     self.timeInputHourLabel, self.timeInputHourUpButton, self.timeInputHourDownButton = self.getTimeWidgets(
         page, 'hour')
     self.timeInputMinuteLabel, self.timeInputMinuteUpButton, self.timeInputMinuteDownButton = self.getTimeWidgets(
         page, 'minute')
     self.timeInputAmPmLabel, self.timeInputAmPmUpButton, self.timeInputAmPmDownButton = self.getTimeWidgets(
         page, 'ampm')
     self.timePagecolonLabel = DirectLabel(
         parent=page,
         relief=None,
         text=':',
         pos=self.gui.find('**/step_03_colon_locator').getPos(),
         scale=0.15)
     return page
Ejemplo n.º 17
0
 def makeFrame(self):
     from direct.gui.DirectGui import DirectFrame
     frame = DirectFrame(parent=hidden, frameSize=(-1.0, 1.0, -1.0, 1.0), relief=None)
     return frame
Ejemplo n.º 18
0
    def _createGuestPage(self):
        page = DirectFrame(self.frame)
        page.setName('PartyPlannerGuestPage')
        self.guestTitleLabel = DirectLabel(
            parent=page,
            relief=None,
            text=TTLocalizer.PartyPlannerGuestTitle,
            pos=self.gui.find('**/title_locator').getPos(),
            scale=self.titleScale)
        self.guestBackgroundLabel = DirectLabel(
            parent=page,
            relief=None,
            image=self.gui.find('**/guestListBackground_flat'),
            scale=(1.2, 1.0, 1.0))
        self.friendList = ScrolledFriendList(page,
                                             self.gui,
                                             makeItemsCheckBoxes=True)
        if len(base.localAvatar.friendsList) == 0:
            self.noFriends = True
        else:
            self.noFriends = False
            for friendPair in base.localAvatar.friendsList:
                self.friendList.addFriend(determineFriendName(friendPair),
                                          friendPair[0])

            self.friendList.scrollTo(0)
        pos = self.gui.find('**/step_04_partyWillBe_locator').getPos()
        self.publicPrivateLabel = DirectLabel(
            parent=page,
            relief=None,
            text=TTLocalizer.PartyPlannerPublicPrivateLabel,
            text_align=TextNode.ACenter,
            text_scale=0.065,
            pos=pos)
        self.publicDescriptionLabel = DirectLabel(
            parent=page,
            relief=None,
            text=TTLocalizer.PartyPlannerPublicDescription,
            text_align=TextNode.ACenter,
            text_scale=TTLocalizer.PPpbulicDescriptionLabel,
            pos=(pos[0] - 0.52, pos[1], pos[2]))
        self.publicDescriptionLabel.stash()
        self.privateDescriptionLabel = DirectLabel(
            parent=page,
            relief=None,
            text=TTLocalizer.PartyPlannerPrivateDescription,
            text_align=TextNode.ACenter,
            text_scale=TTLocalizer.PPprivateDescriptionLabel,
            pos=(pos[0] + 0.55, pos[1], pos[2]))
        self.privateDescriptionLabel.stash()
        pos = self.gui.find('**/step_04_public_locator').getPos()
        self.publicButton = DirectButton(
            parent=page,
            relief=None,
            geom=(self.gui.find('**/publicButton_up'),
                  self.gui.find('**/publicButton_down'),
                  self.gui.find('**/publicButton_rollover'),
                  self.gui.find('**/publicButton_inactive')),
            text=TTLocalizer.PartyPlannerPublic,
            text_pos=(pos[0], pos[2]),
            text_scale=TTLocalizer.PPpublicButton,
            command=self.__doTogglePublicPrivate)
        self.publicButton['state'] = DirectGuiGlobals.DISABLED
        self.publicButton.bind(DirectGuiGlobals.ENTER, self.__enterPublic)
        self.publicButton.bind(DirectGuiGlobals.EXIT, self.__exitPublic)
        pos = self.gui.find('**/step_04_private_locator').getPos()
        self.privateButton = DirectButton(
            parent=page,
            relief=None,
            geom=(self.gui.find('**/privateButton_up'),
                  self.gui.find('**/privateButton_down'),
                  self.gui.find('**/privateButton_rollover'),
                  self.gui.find('**/privateButton_inactive')),
            text=TTLocalizer.PartyPlannerPrivate,
            text_pos=(pos[0], pos[2]),
            text_scale=TTLocalizer.PPprivateButton,
            command=self.__doTogglePublicPrivate)
        self.privateButton.bind(DirectGuiGlobals.ENTER, self.__enterPrivate)
        self.privateButton.bind(DirectGuiGlobals.EXIT, self.__exitPrivate)
        self.checkAllButton = DirectButton(
            parent=page,
            relief=None,
            geom=(self.gui.find('**/checkAllButton_up'),
                  self.gui.find('**/checkAllButton_down'),
                  self.gui.find('**/checkAllButton_rollover')),
            command=self.__doCheckAll)
        self.uncheckAllButton = DirectButton(
            parent=page,
            relief=None,
            geom=(self.gui.find('**/uncheckAllButton_up'),
                  self.gui.find('**/uncheckAllButton_down'),
                  self.gui.find('**/uncheckAllButton_rollover')),
            command=self.__doUncheckAll)
        return page
Ejemplo n.º 19
0
    def __init__(self, services: Services,
                 mouse1_press_callbacks: List[Callable[[], None]]):
        self.__services = services
        self.__services.ev_manager.register_listener(self)
        self.__base = self.__services.graphics.window

        self.__window = Window(self.__base,
                               "view_editor",
                               mouse1_press_callbacks,
                               borderWidth=(0.0, 0.0),
                               frameColor=WINDOW_BG_COLOUR,
                               pos=(1.1, 0.5, 0.5),
                               frameSize=(-1.1, 1.1, -5.79, 1.56))

        self.__colour_picker = AdvancedColourPicker(
            self.__base, self.__window.frame, self.__colour_picker_callback,
            mouse1_press_callbacks)

        # spacers
        DirectFrame(parent=self.__window.frame,
                    borderWidth=(.0, .0),
                    frameColor=WIDGET_BG_COLOUR,
                    frameSize=(-1., 1., -0.01, 0.01),
                    pos=(0.0, 0.0, -1.75))

        DirectFrame(parent=self.__window.frame,
                    borderWidth=(.0, .0),
                    frameColor=WIDGET_BG_COLOUR,
                    frameSize=(-1., 1., -0.01, 0.01),
                    pos=(0.0, 0.0, 1.1))

        DirectFrame(parent=self.__window.frame,
                    borderWidth=(.0, .0),
                    frameColor=WIDGET_BG_COLOUR,
                    frameSize=(-1., 1., -0.01, 0.01),
                    pos=(0.0, 0.0, -4.1))

        # ViewElements listing
        self.__elems_frame = DirectScrolledFrame(parent=self.__window.frame,
                                                 frameColor=WINDOW_BG_COLOUR,
                                                 frameSize=(-1, 1, -1.125,
                                                            1.1),
                                                 pos=(0, 0, -2.9),
                                                 autoHideScrollBars=True)

        # selected colour view frame
        self.__selected_cv_outline = DirectFrame(
            parent=self.__elems_frame.getCanvas(),
            relief=DGG.SUNKEN,
            frameColor=WHITE,
            borderWidth=(0.15, 0.15),
            frameSize=(-0.62, 0.62, -0.54, 0.54),
            scale=(0.18, 1.0, 0.18))
        # selected view frame
        self.__selected_view_outline = DirectFrame(parent=self.__window.frame,
                                                   relief=DGG.SUNKEN,
                                                   frameColor=WHITE,
                                                   borderWidth=(0.15, 0.15),
                                                   frameSize=(-0.62, 0.62,
                                                              -0.54, 0.54),
                                                   scale=(0.3, 2.0, 0.35))

        self.heading = DirectLabel(parent=self.__window.frame,
                                   text="View Editor",
                                   text_fg=WHITE,
                                   text_bg=WINDOW_BG_COLOUR,
                                   frameColor=WINDOW_BG_COLOUR,
                                   borderWidth=(.0, .0),
                                   pos=(-0.42, 0.0, 1.27),
                                   scale=(0.2, 3, 0.2))

        self.__save_outline = DirectFrame(parent=self.__window.frame,
                                          frameColor=WHITE,
                                          pos=(-0.57, 0, -5.45),
                                          borderWidth=(0.25, 0.15),
                                          frameSize=(-0.62, 0.62, -0.54, 0.54),
                                          scale=(0.50, 2.1, 0.25))

        self.__restore_outline = DirectFrame(parent=self.__window.frame,
                                             frameColor=WHITE,
                                             pos=(0.50, 0, -5.45),
                                             borderWidth=(0.25, 0.15),
                                             frameSize=(-0.62, 0.62, -0.54,
                                                        0.54),
                                             scale=(0.65, 2.1, 0.25))

        # save and restore
        self.btn_s = DirectButton(text="Save",
                                  text_fg=(0.3, 0.3, 0.3, 1.0),
                                  pressEffect=1,
                                  command=self.__save,
                                  pos=(-0.575, 0, -5.5),
                                  parent=self.__window.frame,
                                  scale=(0.20, 2.1, 0.15),
                                  frameColor=TRANSPARENT)

        self.btn_r = DirectButton(text="Restore",
                                  text_fg=(0.3, 0.3, 0.3, 1.0),
                                  pressEffect=1,
                                  command=self.__reset,
                                  pos=(0.50, 0, -5.5),
                                  parent=self.__window.frame,
                                  scale=(0.20, 2.1, 0.15),
                                  frameColor=TRANSPARENT)

        # zoom window in / out
        self.btn_zoom_out = DirectButton(text="-",
                                         text_fg=WHITE,
                                         pressEffect=1,
                                         command=self.__window.zoom_out,
                                         pos=(0.5, 0., 1.25),
                                         parent=self.__window.frame,
                                         scale=(0.38, 4.25, 0.45),
                                         frameColor=TRANSPARENT)

        self.btn_zoom_in = DirectButton(text="+",
                                        text_fg=WHITE,
                                        pressEffect=1,
                                        command=self.__window.zoom_in,
                                        pos=(0.71, 0., 1.28),
                                        parent=self.__window.frame,
                                        scale=(0.35, 4.19, 0.38),
                                        frameColor=TRANSPARENT)

        # Quit button
        self.btn = DirectButton(text='x',
                                text_fg=WHITE,
                                command=self.__window.toggle_visible,
                                pos=(0.91, 0.4, 1.3),
                                parent=self.__window.frame,
                                scale=(0.3, 2.9, 0.2),
                                pressEffect=1,
                                frameColor=TRANSPARENT)

        # Creating view selectors
        self.__view_selectors = []
        for i in range(0, PersistentStateViews.MAX_VIEWS):
            num = os.path.join(GUI_DATA_PATH, str(i + 1) + ".png")

            self.__view_selectors.append(
                DirectButton(image=num,
                             pos=(-0.7 + (i % 3) * 0.7, 0.4,
                                  -4.4 - 0.5 * (i // 3)),
                             parent=self.__window.frame,
                             scale=0.16,
                             frameColor=TRANSPARENT,
                             command=lambda v: setattr(self, "view_idx", v),
                             extraArgs=[i]))

        self.__elems = []
        self.__reset()
Ejemplo n.º 20
0
 def _createPartyEditorPage(self):
     page = DirectFrame(self.frame)
     page.setName('PartyPlannerEditorPage')
     self.LayoutTitleLabel = DirectLabel(
         parent=page,
         relief=None,
         text=TTLocalizer.PartyPlannerEditorTitle,
         pos=self.gui.find('**/title_locator').getPos() +
         Point3(0.0, 0.0, 0.075),
         scale=self.titleScale)
     self.costLabel = DirectLabel(parent=page,
                                  pos=(-0.74, 0.0, 0.17),
                                  relief=None,
                                  text=TTLocalizer.PartyPlannerTotalCost %
                                  0,
                                  text_align=TextNode.ACenter,
                                  scale=TTLocalizer.PPcostLabel,
                                  textMayChange=True)
     self.partyGridBackground = DirectFrame(
         parent=page, relief=None, geom=self.gui.find('**/partyGrid_flat'))
     self.partyGroundsLabel = DirectLabel(
         parent=page,
         relief=None,
         text=TTLocalizer.PartyPlannerPartyGrounds,
         text_font=ToontownGlobals.getSignFont(),
         text_fg=VBase4(1.0, 0.0, 0.0, 1.0),
         text_scale=TTLocalizer.PPpartyGroundsLabel,
         pos=self.gui.find('**/step_05_partyGrounds_text_locator').getPos(),
         scale=0.1)
     self.activityBackground = DirectFrame(
         parent=page,
         relief=None,
         geom=self.gui.find('**/activitiesDecorations_flat1'),
         pos=(0.0, 0.0, 0.04))
     pos = self.gui.find('**/step_05_instructions_locator').getPos()
     self.instructionLabel = DirectLabel(
         parent=page,
         relief=None,
         text=' ',
         text_pos=(pos[0], pos[2]),
         text_scale=TTLocalizer.PPinstructionLabel,
         textMayChange=True,
         geom=self.gui.find('**/instructions_flat'))
     self.elementTitleLabel = DirectLabel(
         parent=page,
         relief=None,
         text=' ',
         pos=self.gui.find(
             '**/step_05_activitiesName_text_locator').getPos() +
         Point3(0.0, 0.0, 0.04),
         text_scale=TTLocalizer.PPelementTitleLabel,
         textMayChange=True)
     self.elementPriceNode = TextNode('ElementPrice')
     self.elementPriceNode.setAlign(TextNode.ALeft)
     self.elementPriceNode.setTextColor(0.0, 0.0, 0.0, 1.0)
     self.elementPriceNode.setFont(ToontownGlobals.getToonFont())
     self.elementPrice = page.attachNewNode(self.elementPriceNode)
     self.elementPrice.setScale(TTLocalizer.PPelementPriceNode)
     self.elementPrice.setPos(
         self.gui.find('**/step_05_activityPrice_text_locator').getPos() +
         Point3(-0.02, 0.0, 0.04))
     self.elementDescriptionNode = TextNode('ElementDescription')
     self.elementDescriptionNode.setAlign(TextNode.ACenter)
     self.elementDescriptionNode.setWordwrap(8)
     self.elementDescriptionNode.setFont(ToontownGlobals.getToonFont())
     self.elementDescriptionNode.setTextColor(0.0, 0.0, 0.0, 1.0)
     self.elementDescription = page.attachNewNode(
         self.elementDescriptionNode)
     self.elementDescription.setScale(TTLocalizer.PPelementDescription)
     self.elementDescription.setPos(
         self.gui.find(
             '**/step_05_activityDescription_text_locator').getPos() +
         Point3(0.0, 0.0, 0.04))
     self.totalMoney = base.localAvatar.getTotalMoney()
     catalogGui = loader.loadModel('phase_5.5/models/gui/catalog_gui')
     self.beanBank = DirectLabel(parent=page,
                                 relief=None,
                                 text=str(self.totalMoney),
                                 text_align=TextNode.ARight,
                                 text_scale=0.075,
                                 text_fg=(0.95, 0.95, 0, 1),
                                 text_shadow=(0, 0, 0, 1),
                                 text_pos=(0.495, -0.53),
                                 text_font=ToontownGlobals.getSignFont(),
                                 textMayChange=True,
                                 image=catalogGui.find('**/bean_bank'),
                                 image_scale=(0.65, 0.65, 0.65),
                                 scale=0.9,
                                 pos=(-0.75, 0.0, 0.6))
     catalogGui.removeNode()
     del catalogGui
     self.accept(localAvatar.uniqueName('moneyChange'), self.__moneyChange)
     self.accept(localAvatar.uniqueName('bankMoneyChange'),
                 self.__moneyChange)
     self.partyEditor = PartyEditor(self, page)
     self.partyEditor.request('Hidden')
     pos = self.gui.find('**/step_05_add_text_locator').getPos()
     self.elementBuyButton = DirectButton(
         parent=page,
         relief=None,
         text=TTLocalizer.PartyPlannerBuy,
         text_pos=(pos[0], pos[2]),
         text_scale=TTLocalizer.PPelementBuyButton,
         geom=(self.gui.find('**/add_up'), self.gui.find('**/add_down'),
               self.gui.find('**/add_rollover')),
         geom3_color=VBase4(0.5, 0.5, 0.5, 1.0),
         textMayChange=True,
         pos=(0.0, 0.0, 0.04),
         command=self.partyEditor.buyCurrentElement)
     self.okWithPartyGroundsLayoutEvent = 'okWithPartyGroundsLayoutEvent'
     self.accept(self.okWithPartyGroundsLayoutEvent,
                 self.okWithPartyGroundsLayout)
     self.okWithGroundsGui = TTDialog.TTGlobalDialog(
         dialogName=self.uniqueName('PartyEditorOkGui'),
         doneEvent=self.okWithPartyGroundsLayoutEvent,
         message=TTLocalizer.PartyPlannerOkWithGroundsLayout,
         style=TTDialog.YesNo,
         okButtonText=OTPLocalizer.DialogYes,
         cancelButtonText=OTPLocalizer.DialogNo)
     self.okWithGroundsGui.doneStatus = ''
     self.okWithGroundsGui.hide()
     return page
 def loadMainPage(self):
     self.mainFrame = DirectFrame(parent=self,
                                  frameSize=self.FrameDimensions,
                                  frameColor=(1, 0, 0, 1))
Ejemplo n.º 22
0
    def __init__(self):
        global pointball_value
        global title_screen
        global loading_screen
        # Basics
        ShowBase.__init__(self)
        #Setup the window
        base.disableMouse()
        render.setAntialias(AntialiasAttrib.MAuto)
        self.set_windowsettings()
        base.camLens.setFar(asteroid_spawn_distance * 100)
        base.camLens.setNear(2000)
        self.setBackgroundColor(colors.get("black"))
        # Create the directional and ambient lights, and apply them to the world.
        ambientLight = AmbientLight("ambientLight")
        ambientLight.setColor((0.8, 0.8, 0.8, 1))
        directionalLight = DirectionalLight("directionalLight")
        directionalLight.setDirection(LVector3(0, 45, -45))
        directionalLight.setColor((1, 1, 1, 1))
        directionalLight.setShadowCaster(True)
        render.setLight(render.attachNewNode(directionalLight))
        render.setLight(render.attachNewNode(ambientLight))
        # Create a black fog and apply it to the world.
        self.fog = Fog('distanceFog')
        self.fog.setColor(0, 0, 0)
        self.fog.setExpDensity(fog_quality)
        render.setFog(self.fog)
        # Initialize Collisions
        base.cTrav = CollisionTraverser()
        base.cTrav.setRespectPrevTransform(True)
        self.collHandEvent = CollisionHandlerEvent()
        self.collHandEvent.addInPattern("%fn-into-%in")
        # Add colision sphere to player for losing state
        cNode = CollisionNode("player")
        cNode.addSolid(CollisionSphere(0, 0, 0, 3))
        self.player_np = base.camera.attachNewNode(cNode)
        base.cTrav.addCollider(self.player_np, self.collHandEvent)
        # Setup initial score
        self.title = OnscreenText(text="Score: {0}".format(score),
                                  parent=base.a2dTopLeft,
                                  scale=.07,
                                  align=TextNode.ALeft,
                                  pos=(0.1, -0.1),
                                  fg=(1, 1, 1, 1),
                                  shadow=(0, 0, 0, 0.5),
                                  font=thunderstrike)
        # Add Occluder Culling - I will need to figure this out later
        # occluder_model = self.loader.loadModel("./Models/cone_10vert.egg")
        # render.setOccluder(occluder_model)

        Begin.keyMap = {
            "forward": False,
            "strafe-left": False,
            "backward": False,
            "strafe-right": False,
            "strafe-up": False,
            "strafe-down": False,
            "roll-left": False,
            "roll-right": False
        }  #True if coresponding key is currently held down.
        #Basic camera movement on the xyz coordinate plane
        self.accept("escape", sys.exit)
        self.accept(
            "w", self.setKey, ["forward", True]
        )  # Pressing the key down sets the state to true. Tasks will function as if pressing key each frame.
        self.accept(
            "w-up", self.setKey, ["forward", False]
        )  # Releasing the key changes the key state in begin.keyMap to False to tasks will stop looping.
        self.accept(
            "a", self.setKey, ["strafe-left", True]
        )  # Both previous comments apply to the following 'accept self.setKey' block of code.
        self.accept("a-up", self.setKey, ["strafe-left", False])
        self.accept("s", self.setKey, ["backward", True])
        self.accept("s-up", self.setKey, ["backward", False])
        self.accept("d", self.setKey, ["strafe-right", True])
        self.accept("d-up", self.setKey, ["strafe-right", False])
        self.accept("space", self.setKey, ["strafe-up", True])
        self.accept("space-up", self.setKey, ["strafe-up", False])
        self.accept("control", self.setKey, ["strafe-down", True])
        self.accept("control-up", self.setKey, ["strafe-down", False])
        self.accept("shift", self.setKey, ["strafe-down", True])
        self.accept("shift-up", self.setKey, ["strafe-down", False])
        self.accept("q", self.setKey, ["roll-left", True])
        self.accept("q-up", self.setKey, ["roll-left", False])
        self.accept("e", self.setKey, ["roll-right", True])
        self.accept("e-up", self.setKey, ["roll-right", False])
        self.accept('mouse1', self.shoot)  # Shoots the projectile
        self.accept('f11', self.fullscreenToggle)
        self.accept('f12', self.framesToggle)
        # Development keys
        self.accept('0', self.stop_moving)  # Stop moving
        self.accept('1', self.angle1)
        self.accept('2', self.angle2)
        self.accept('3', self.angle3)
        self.accept('4', self.angle4)
        self.accept('5', self.angle5)
        self.accept('6', self.angle6)

        # Create the loading bar
        self.loading = DirectFrame(frameSize=(-10, 10, -10, 10),
                                   frameColor=(0, 0, 0, 1))
        self.loading_bar = DirectWaitBar(
            text="Generating Asteroids . . .",
            text_font=thunderstrike,
            text_fg=(0, 0, 0, 1),
            text_shadow=(1, 1, 1, 1),
            #text_pos=(0.001,0.001, -1),
            value=50,
            range=asteroid_max + (2 * int(asteroid_max * 0.05)),
            barColor=(1, 1, 1, 1),
            frameColor=(0, 0, 0, 0),
            parent=self.loading)
        loading_screen = self.loading
        loading_screen.loading_bar = self.loading_bar

        # Create the main menu
        self.quality_name = "Low"
        self.quality_num = 1
        self.quality_applied = 1
        self.menu = DirectFrame(frameSize=(10, -10, 10, -10),
                                frameColor=(0, 0, 0, 1))

        self.menu_title = DirectFrame(
            frameSize=(base.a2dLeft, base.a2dRight, 0.55, 0.8),
            frameTexture=loader.loadTexture("./Fonts/title.png"),
            parent=self.menu)

        title_asteroid = Asteroid("small")
        self.menu_asteroid = DirectFrame(geom=title_asteroid.np,
                                         geom_scale=(0.000008, 0.000008,
                                                     0.000008),
                                         pos=(1.13, 0, 0.56),
                                         frameColor=(0, 0, 0, 1),
                                         enableEdit=1,
                                         parent=self.menu_title)
        title_screen = self.menu
        title_screen.menu_asteroid = self.menu_asteroid
        title_screen.start_btn = self.createButton("Start", self.start_game,
                                                   0.2)
        title_screen.how_to_btn = self.createButton("How to Play",
                                                    self.how_to_play, 0)
        title_screen.exit_btn = self.createButton("Quit", sys.exit, -0.2)
        title_screen.res_apply_btn = self.createButton("Apply",
                                                       self.apply_res_button,
                                                       -0.4, 1,
                                                       (-2, 2.3, -0.6, 1))
        title_screen.res_apply_btn.hide()
        title_screen.resolution_btn = self.createButton(
            f"Resolution ({resolution[0]} x {resolution[1]})", self.resolution,
            -0.4)
        title_screen.fullscreen_btn = self.createButton(
            "Toggle Fullscreen", self.fullscreenToggle, -0.6)
        title_screen.quality_btn = self.createButton(
            f"Qualilty ({self.quality_name})", self.quality, -0.8)
        title_screen.qual_apply_btn = self.createButton(
            "Apply", self.apply_qual_button, -0.8, 1, (-2, 2.3, -0.6, 1))
        title_screen.qual_apply_btn.hide()
        taskMgr.add(Begin.menu, "Menu")
        title_screen.hide()

        # Setup game tasks and create the 3d asteroids.
        taskMgr.add(Begin.createAsteroids, "Generate asteroids")
Ejemplo n.º 23
0
    def generate(self, r, g, b, animal, maxHP=50, initialHP=50):
        self.maxHP = maxHP
        self.initialHP = initialHP
        self.color = (r, g, b, 1)

        gui = loader.loadModel("phase_3/models/gui/laff_o_meter.bam")
        if animal == "rabbit":
            animal = "bunny"
        headmodel = gui.find('**/' + animal + 'head')
        self.container['image'] = headmodel
        self.container['image_color'] = self.color
        if animal == 'monkey':
            self.setPos(0.153, 0.0, 0.13)
        else:
            self.setPos(0.133, 0, 0.13)
        self.resetFrameSize()
        self.setScale(0.075)
        self.frown = DirectFrame(parent=self.container,
                                 relief=None,
                                 image=gui.find('**/frown'))
        self.smile = DirectFrame(parent=self.container,
                                 relief=None,
                                 image=gui.find('**/smile'))
        self.eyes = DirectFrame(parent=self.container,
                                relief=None,
                                image=gui.find('**/eyes'))
        self.openSmile = DirectFrame(parent=self.container,
                                     relief=None,
                                     image=gui.find('**/open_smile'))
        self.tooth1 = DirectFrame(parent=self.openSmile,
                                  relief=None,
                                  image=gui.find('**/tooth_1'))
        self.tooth2 = DirectFrame(parent=self.openSmile,
                                  relief=None,
                                  image=gui.find('**/tooth_2'))
        self.tooth3 = DirectFrame(parent=self.openSmile,
                                  relief=None,
                                  image=gui.find('**/tooth_3'))
        self.tooth4 = DirectFrame(parent=self.openSmile,
                                  relief=None,
                                  image=gui.find('**/tooth_4'))
        self.tooth5 = DirectFrame(parent=self.openSmile,
                                  relief=None,
                                  image=gui.find('**/tooth_5'))
        self.tooth6 = DirectFrame(parent=self.openSmile,
                                  relief=None,
                                  image=gui.find('**/tooth_6'))

        self.teethList = [
            self.tooth6, self.tooth5, self.tooth4, self.tooth3, self.tooth2,
            self.tooth1
        ]
        if self.forRender:
            self.container['image_pos'] = (0, 0.01, 0)
            for tooth in self.teethList:
                tooth.setDepthWrite(False)
            self.eyes.setDepthWrite(False)
            self.smile.setDepthWrite(False)
            self.openSmile.setDepthWrite(False)
            self.frown.setDepthWrite(False)
        self.fractions = [0.0, 0.166666, 0.333333, 0.5, 0.666666, 0.833333]

        self.currentHealthLbl = DirectLabel(text=str(self.initialHP),
                                            parent=self.eyes,
                                            pos=(-0.425, 0, 0.05),
                                            scale=0.4,
                                            relief=None)
        self.maxHealthLbl = DirectLabel(text=str(self.maxHP),
                                        parent=self.eyes,
                                        pos=(0.425, 0, 0.05),
                                        scale=0.4,
                                        relief=None)
        if self.forRender:
            self.currentHealthLbl.setY(-0.01)
            self.maxHealthLbl.setY(-0.01)

        self.updateMeter(self.initialHP, self.initialHP)
        gui.removeNode()
        return
Ejemplo n.º 24
0
 def loadBackground(self):
     upsellBackground = loader.loadModel('phase_3.5/models/gui/tt_m_gui_ign_newsStatusBackground')
     imageScaleX = self.FrameDimensions[1] - self.FrameDimensions[0]
     imageScaleY = self.FrameDimensions[3] - self.FrameDimensions[2]
     self.backFrame = DirectFrame(parent=self.parent, image=upsellBackground, image_scale=(imageScaleX, 1, imageScaleY), frameColor=(1, 1, 1, 0), frameSize=self.FrameDimensions, pos=(0, 0, 0), relief=DGG.FLAT, text=TTLocalizer.NewsPageDownloadingNews1, text_scale=0.06, text_pos=(0, -0.4))
Ejemplo n.º 25
0
    def __init__(self):
        self._temp_wids = []
        self._recruits = []
        self._reward_fr = None
        self.visit_num = 1

        self._amb_snd = loader.loadSfx(
            "sounds/hangar_ambient.ogg")  # noqa: F821
        self._amb_snd.setVolume(0)
        self._amb_snd.setLoop(True)

        self._coins_s_snd = loader.loadSfx(
            "sounds/GUI/coins_short.ogg")  # noqa: F821
        self._coins_l_snd = loader.loadSfx(
            "sounds/GUI/coins_long.ogg")  # noqa: F821
        self._toot_snd = loader.loadSfx("sounds/train/toot1.ogg")  # noqa: F821
        self._add_upgrade_snd = loader.loadSfx(  # noqa: F821
            "sounds/GUI/install_upgrade.ogg")
        self.write_snd = loader.loadSfx("sounds/GUI/write.ogg")  # noqa: F821

        self._fr = DirectFrame(
            parent=base.a2dTopLeft,  # noqa: F821
            frameSize=(-0.35, 0.35, -0.4, 0.7),
            pos=(0.85, 0, -0.82),
            frameTexture=GUI_PIC + "metal1.png",
            state=DGG.NORMAL,
        )
        self._fr.setTransparency(TransparencyAttrib.MAlpha)
        self._fr.hide()

        DirectLabel(  # Services
            parent=self._fr,
            text=base.labels.CITY[0],  # noqa: F821
            text_font=base.main_font,  # noqa: F821
            frameSize=(0.1, 0.1, 0.1, 0.1),
            text_scale=0.045,
            text_fg=RUST_COL,
            pos=(0, 0, 0.62),
        )
        self._party_but = DirectButton(  # Party
            parent=self._fr,
            text_scale=0.035,
            text_fg=SILVER_COL,
            text=base.labels.CITY[1],  # noqa: F821
            text_font=base.main_font,  # noqa: F821
            relief=None,
            command=self._show_party,
            extraArgs=[0.56],
            pos=(-0.1, 0, 0.56),
            clickSound=base.main_menu.click_snd,  # noqa: F821
        )
        base.main_menu.bind_button(self._party_but)  # noqa: F821

        self._train_but = DirectButton(  # Train
            parent=self._fr,
            text_scale=0.035,
            text_fg=RUST_COL,
            text=base.labels.CITY[2],  # noqa: F821
            text_font=base.main_font,  # noqa: F821
            relief=None,
            command=self._show_train,
            extraArgs=[0.56],
            pos=(0.1, 0, 0.56),
            clickSound=base.main_menu.click_snd,  # noqa: F821
        )
        base.main_menu.bind_button(self._train_but)  # noqa: F821

        base.main_menu.bind_button(  # noqa: F821
            DirectButton(  # Exit city
                parent=self._fr,
                pos=(-0.205, 0, -0.35),
                text_fg=RUST_COL,
                text=base.labels.CITY[3],  # noqa: F821
                text_font=base.main_font,  # noqa: F821
                relief=None,
                text_scale=0.035,
                command=self._exit_city,
            ))
        base.main_menu.bind_button(  # noqa: F821
            DirectButton(  # Turn around and exit
                parent=self._fr,
                pos=(0.1, 0, -0.35),
                text_fg=RUST_COL,
                text=base.labels.CITY[4],  # noqa: F821
                text_font=base.main_font,  # noqa: F821
                relief=None,
                text_scale=0.035,
                command=self._exit_city,
                extraArgs=[True],
            ))
Ejemplo n.º 26
0
    def __init__(self, panelData):
        dialogBox = loader.loadModel('phase_3/models/gui/dialog_box_gui.bam')
        DirectFrame.__init__(self,
                             relief=None,
                             geom=dialogBox,
                             geom_color=CIGlobals.DialogColor,
                             geom_scale=(1.75, 1, 0.75 * 1.1),
                             geom_pos=Point3(0, 0, -0.05),
                             pos=(0, 0, 0.661))
        self.initialiseoptions(RewardPanel)
        self.setScale(0.8)

        # The data for the reward panel inside of a RPToonData object.
        self.panelData = panelData

        # Top wood panel saying Reward Panel
        gagShopNodes = loader.loadModel(
            'phase_4/models/gui/gag_shop_purchase_gui.bam')
        # Original pos: (-0.02, 0, 0.3) scale = (1.55, 1, 1)
        self.titlePanel = OnscreenImage(
            parent=self,
            image=gagShopNodes.find('**/Goofys_Sign'),
            pos=(0, 0, 0.3),
            hpr=(1, 0, 0),
            scale=(1.3, 1, 0.9))

        self.avatarNamePanel = DirectFrame(parent=self.titlePanel,
                                           pos=(0, 0.005, 0))
        self.avatarText = OnscreenText(parent=self.avatarNamePanel,
                                       text='',
                                       font=CIGlobals.getMickeyFont(),
                                       fg=(0.698, 0.13, 0.13, 1),
                                       mayChange=1,
                                       scale=(0.1, 0.13, 0.1))

        self.panelContentsTitle = OnscreenText(parent=self,
                                               text=GagPanelName,
                                               font=CIGlobals.getMickeyFont(),
                                               pos=(0, 0.24, 0),
                                               fg=(0.3725, 0.619, 0.627, 1),
                                               mayChange=1)

        self.playerInfo = DirectFrame(parent=self,
                                      relief=None,
                                      pos=(-0.5, 0, 0))
        self.playerInfo.setBin('gui-popup', 0)

        self.bonusText = OnscreenText(parent=self.playerInfo,
                                      text='2X Cog Office Bonus!',
                                      font=CIGlobals.getToonFont(),
                                      pos=(0, 0.15, 0),
                                      scale=(0.055, 0.055, 0.055),
                                      align=TextNode.ACenter)
        self.bonusText.hide()

        ##################################################################################
        # GUI Elements relating to the Favorite Gag/Gag Popup Used for showing Gag Unlock#
        ##################################################################################
        self.favoriteGagText = OnscreenText(parent=self.playerInfo,
                                            text=FavoriteGag,
                                            font=CIGlobals.getMickeyFont(),
                                            pos=FavoriteGagTitlePos,
                                            fg=(1, 0.2, 0.2, 1),
                                            sort=0)

        glow = loader.loadModel('phase_4/models/minigames/particleGlow.bam')
        self.favoriteGagGlow = OnscreenImage(parent=self.playerInfo,
                                             image=glow,
                                             pos=FavoriteGagPos,
                                             color=GagGlowColor,
                                             scale=(0.8, 0.8, 0.8))
        self.favoriteGagGlow.setBin('gui-popup', 10)
        # particleGlow.bam uses a material since it's normally part of render, not render2d.
        # Since render2d is still fixed-function, we have to explicitly enable shader generation
        # to correctly display the glow in render2d.
        self.favoriteGagGlow.setShaderAuto()

        invIcons = loader.loadModel('phase_3.5/models/gui/inventory_icons.bam')
        gag = invIcons.find(
            GagGlobals.InventoryIconByName.get(GagGlobals.Foghorn))
        self.favoriteGag = OnscreenImage(parent=self.playerInfo,
                                         image=gag,
                                         pos=FavoriteGagPos,
                                         scale=(1.65, 1.65, 1.65))
        self.favoriteGag.setBin('gui-popup', 20)

        self.favoriteGagName = OnscreenText(parent=self.playerInfo,
                                            text=GagGlobals.Foghorn,
                                            font=CIGlobals.getToonFont(),
                                            pos=FavoriteGagNamePos,
                                            mayChange=1)

        ################################################################################
        # GUI elements showing gag experience on the right-side of the gag exp panel   #
        ################################################################################

        self.gagExpFrame = DirectFrame(parent=self,
                                       relief=None,
                                       pos=(0.085, 0, 0.15))
        self.trackLabels = []
        self.trackIncLabels = []
        self.trackBars = []
        self.trackBarsOffset = 0

        for i in range(len(GagGlobals.TrackNameById.values())):
            track = GagGlobals.TrackNameById.values()[i]
            color = GagGlobals.TrackColorByName.get(track)
            label = DirectLabel(parent=self.gagExpFrame,
                                relief=None,
                                text=track.upper(),
                                text_scale=0.05,
                                text_align=TextNode.ARight,
                                pos=(0.13, 0, -0.09 * i),
                                text_pos=(0, -0.02))
            incrementLabel = DirectLabel(parent=self.gagExpFrame,
                                         relief=None,
                                         text='',
                                         text_scale=0.05,
                                         text_align=TextNode.ALeft,
                                         pos=(0.65, 0, -0.09 * i),
                                         text_pos=(0, -0.02))
            progressBar = DirectWaitBar(
                parent=self.gagExpFrame,
                relief=DGG.SUNKEN,
                frameSize=(-1, 1, -0.15, 0.15),
                borderWidth=(0.02, 0.02),
                scale=0.25,
                frameColor=(color[0] * 0.7, color[1] * 0.7, color[2] * 0.7, 1),
                barColor=(color[0], color[1], color[2], 1),
                text='0/0',
                text_scale=0.18,
                text_fg=(0, 0, 0, 1),
                text_align=TextNode.ACenter,
                text_pos=(0, -0.05),
                pos=(0.4, 0, -0.09 * i))
            self.trackLabels.append(label)
            self.trackIncLabels.append(incrementLabel)
            self.trackBars.append(progressBar)

        ################################################################################
        # GUI elements showing progress updates on quests                              #
        ################################################################################

        self.questFrame = DirectFrame(parent=self, relief=None)
        self.questPosters = []

        self.congratsLeft = OnscreenText(parent=self.playerInfo,
                                         pos=(-0.1, 0.125, -0.1),
                                         text='',
                                         scale=0.06,
                                         align=TextNode.ARight)
        self.congratsLeft.setR(-30)
        self.congratsRight = OnscreenText(parent=self.playerInfo,
                                          pos=(0.1, 0.125, 0.1),
                                          text='',
                                          scale=0.06,
                                          align=TextNode.ALeft)
        self.congratsRight.setR(30)

        glow.removeNode()
        invIcons.removeNode()
        gagShopNodes.removeNode()
        dialogBox.removeNode()
    def load(self):
        if self.__loaded:
            return
        self.__timerPad = PartyUtils.getNewToontownTimer()
        guiModel = 'phase_4/models/gui/cannon_game_gui'
        guiNode = loader.loadModel(guiModel)
        self.__aimPad = DirectFrame(image=guiNode.find('**/CannonFire_PAD'),
                                    relief=None,
                                    pos=(0.7, 0, -0.553333),
                                    scale=0.8)
        guiNode.removeNode()
        self.fireButton = DirectButton(parent=self.__aimPad,
                                       image=((guiModel, '**/Fire_Btn_UP'),
                                              (guiModel, '**/Fire_Btn_DN'),
                                              (guiModel, '**/Fire_Btn_RLVR')),
                                       relief=None,
                                       pos=(0.0115741, 0, 0.00505051),
                                       scale=1.0,
                                       command=self.__firePressed)
        self.upButton = DirectButton(parent=self.__aimPad,
                                     image=((guiModel, '**/Cannon_Arrow_UP'),
                                            (guiModel, '**/Cannon_Arrow_DN'),
                                            (guiModel,
                                             '**/Cannon_Arrow_RLVR')),
                                     relief=None,
                                     pos=(0.0115741, 0, 0.221717))
        self.downButton = DirectButton(parent=self.__aimPad,
                                       image=((guiModel, '**/Cannon_Arrow_UP'),
                                              (guiModel, '**/Cannon_Arrow_DN'),
                                              (guiModel,
                                               '**/Cannon_Arrow_RLVR')),
                                       relief=None,
                                       pos=(0.0136112, 0, -0.210101),
                                       image_hpr=(0, 0, 180))
        self.leftButton = DirectButton(parent=self.__aimPad,
                                       image=((guiModel, '**/Cannon_Arrow_UP'),
                                              (guiModel, '**/Cannon_Arrow_DN'),
                                              (guiModel,
                                               '**/Cannon_Arrow_RLVR')),
                                       relief=None,
                                       pos=(-0.199352, 0, -0.000505269),
                                       image_hpr=(0, 0, -90))
        self.rightButton = DirectButton(
            parent=self.__aimPad,
            image=((guiModel, '**/Cannon_Arrow_UP'),
                   (guiModel, '**/Cannon_Arrow_DN'), (guiModel,
                                                      '**/Cannon_Arrow_RLVR')),
            relief=None,
            pos=(0.219167, 0, -0.00101024),
            image_hpr=(0, 0, 90))
        self.__aimPad.setColor(1, 1, 1, 0.9)

        def bindButton(button, upHandler, downHandler):
            button.bind(DGG.B1PRESS, lambda x, handler=upHandler: handler())
            button.bind(DGG.B1RELEASE,
                        lambda x, handler=downHandler: handler())

        bindButton(self.upButton, self.__upPressed, self.__upReleased)
        bindButton(self.downButton, self.__downPressed, self.__downReleased)
        bindButton(self.leftButton, self.__leftPressed, self.__leftReleased)
        bindButton(self.rightButton, self.__rightPressed, self.__rightReleased)
        self.__loaded = True
 def __init__(self, doneEvent):
     self.doneEvent = doneEvent
     DirectFrame.__init__(self)
     self.reparentTo(aspect2d)
     self.setPos(0.0, 0.0, 0.16)
     self.stash()
     publicPartyGui = loader.loadModel(
         'phase_4/models/parties/publicPartyGUI')
     self.frame = DirectFrame(
         parent=self,
         geom=publicPartyGui.find('**/activities_background'),
         geom_pos=(-0.8, 0.0, 0.2),
         geom_scale=2.0,
         relief=None)
     self.earnedLabel = DirectLabel(
         parent=self,
         relief=None,
         text=str(0),
         text_align=TextNode.ACenter,
         text_pos=(0.0, -0.07),
         text_scale=0.2,
         text_fg=(0.95, 0.95, 0.0, 1.0),
         text_font=ToontownGlobals.getSignFont(),
         textMayChange=True,
         image=DirectGuiGlobals.getDefaultDialogGeom(),
         image_scale=(0.33, 1.0, 0.33),
         pos=(-0.3, 0.0, 0.2),
         scale=0.9)
     purchaseModels = loader.loadModel('phase_4/models/gui/purchase_gui')
     jarImage = purchaseModels.find('**/Jar')
     self.jarLabel = DirectLabel(
         parent=self,
         relief=None,
         text=str(0),
         text_align=TextNode.ACenter,
         text_pos=(0.0, -0.07),
         text_scale=0.2,
         text_fg=JellybeanRewardGui.JarLabelTextColor,
         text_font=ToontownGlobals.getSignFont(),
         textMayChange=True,
         image=jarImage,
         scale=0.7,
         pos=(0.3, 0.0, 0.17))
     purchaseModels.removeNode()
     del purchaseModels
     jarImage.removeNode()
     del jarImage
     self.messageLabel = DirectLabel(parent=self,
                                     relief=None,
                                     text='',
                                     text_align=TextNode.ALeft,
                                     text_wordwrap=16.0,
                                     text_scale=0.07,
                                     pos=(-0.52, 0.0, -0.1),
                                     textMayChange=True)
     self.doubledJellybeanLabel = DirectLabel(
         parent=self,
         relief=None,
         text=TTLocalizer.PartyRewardDoubledJellybean,
         text_align=TextNode.ACenter,
         text_wordwrap=12.0,
         text_scale=0.09,
         text_fg=(1.0, 0.125, 0.125, 1.0),
         pos=(0.0, 0.0, -0.465),
         textMayChange=False)
     self.doubledJellybeanLabel.hide()
     self.closeButton = DirectButton(
         parent=self,
         relief=None,
         text=TTLocalizer.PartyJellybeanRewardOK,
         text_align=TextNode.ACenter,
         text_scale=0.065,
         text_pos=(0.0, -0.625),
         geom=(publicPartyGui.find('**/startButton_up'),
               publicPartyGui.find('**/startButton_down'),
               publicPartyGui.find('**/startButton_rollover'),
               publicPartyGui.find('**/startButton_inactive')),
         geom_pos=(-0.39, 0.0, 0.125),
         command=self._close)
     publicPartyGui.removeNode()
     del publicPartyGui
     self.countSound = base.loadSfx(
         'phase_13/audio/sfx/tick_counter_short.ogg')
     self.overMaxSound = base.loadSfx(
         'phase_13/audio/sfx/tick_counter_overflow.ogg')
     return
Ejemplo n.º 29
0
    def __init__(self):
        """Default constructor"""
        # create a main frame as big as the window
        self.frameMain = DirectFrame(
            # set framesize the same size as the window
            frameSize=(base.a2dLeft, base.a2dRight, base.a2dTop,
                       base.a2dBottom),
            image="LogoTextGlow.png",
            image_scale=(1.06 / 2.0, 1, 0.7 / 2.0),
            image_pos=(0, 0, 0.7),
            # position center
            pos=(0, 0, 0),
            # set tramsparent background color
            frameColor=(0, 0, 0, 0))
        self.frameMain.setTransparency(1)
        self.frameMain.setBin("fixed", 100)

        sliderscale = 0.5
        buttonScale = 0.25
        textscale = 0.1
        checkboxscale = 0.05
        left = -0.5
        right = 0.5

        self.sliderTextspeed = DirectSlider(
            scale=sliderscale,
            pos=(left, 0, 0.2),
            range=(0.2, 0.01),
            scrollSize=0.01,
            text=_("Textspeed %0.1f%%") % (base.textWriteSpeed * 10),
            text_scale=textscale,
            text_align=TextNode.ACenter,
            text_pos=(0.0, 0.15),
            text_fg=(1, 1, 1, 1),
            thumb_frameColor=(0.65, 0.65, 0.0, 1),
            thumb_relief=DGG.FLAT,
            frameColor=(0.15, 0.15, 0.15, 1),
            value=base.textWriteSpeed,
            command=self.sliderTextspeed_ValueChanged)
        self.sliderTextspeed.reparentTo(self.frameMain)

        self.cbParticles = DirectCheckButton(
            text=_(" Enable Particles"),
            text_fg=(1, 1, 1, 1),
            text_shadow=(0, 0, 0, 0.35),
            pos=(left, 0, -0.0),
            scale=checkboxscale,
            frameColor=(0, 0, 0, 0),
            command=self.cbParticles_CheckedChanged,
            rolloverSound=None,
            clickSound=None,
            pressEffect=False,
            boxPlacement="below",
            boxBorder=0.8,
            boxRelief=DGG.FLAT,
            indicator_scale=1.5,
            indicator_text_fg=(0.65, 0.65, 0.0, 1),
            indicator_text_shadow=(0, 0, 0, 0.35),
            indicator_frameColor=(0.15, 0.15, 0.15, 1),
            indicatorValue=base.particleMgrEnabled)
        self.cbParticles.indicator['text'] = (' ', 'x')
        self.cbParticles.indicator['text_pos'] = (0, 0.1)
        #self.cbParticles.indicator.setX(self.cbParticles.indicator, -0.5)
        #self.cbParticles.indicator.setZ(self.cbParticles.indicator, -0.1)
        #self.cbParticles.setFrameSize()
        self.cbParticles.setTransparency(1)
        self.cbParticles.reparentTo(self.frameMain)

        volume = base.musicManager.getVolume()
        self.sliderVolume = DirectSlider(
            scale=sliderscale,
            pos=(left, 0, -0.35),
            range=(0, 1),
            scrollSize=0.01,
            text=_("Volume %d%%") % volume * 100,
            text_scale=textscale,
            text_align=TextNode.ACenter,
            text_pos=(.0, 0.15),
            text_fg=(1, 1, 1, 1),
            thumb_frameColor=(0.65, 0.65, 0.0, 1),
            thumb_relief=DGG.FLAT,
            frameColor=(0.15, 0.15, 0.15, 1),
            value=volume,
            command=self.sliderVolume_ValueChanged)
        self.sliderVolume.reparentTo(self.frameMain)

        self.lblControltype = DirectLabel(text=_("Control type"),
                                          text_fg=(1, 1, 1, 1),
                                          text_shadow=(0, 0, 0, 0.35),
                                          frameColor=(0, 0, 0, 0),
                                          scale=textscale / 2,
                                          pos=(right, 0, 0.27))
        self.lblControltype.setTransparency(1)
        self.lblControltype.reparentTo(self.frameMain)
        selectedControlType = 0
        if base.controlType == "MouseAndKeyboard":
            selectedControlType = 1
        self.controltype = DirectOptionMenu(
            pos=(right, 0, 0.18),
            text_fg=(1, 1, 1, 1),
            scale=0.1,
            items=[_("Keyboard"), _("Keyboard + Mouse")],
            initialitem=selectedControlType,
            frameColor=(0.15, 0.15, 0.15, 1),
            popupMarker_frameColor=(0.65, 0.65, 0.0, 1),
            popupMarker_relief=DGG.FLAT,
            highlightColor=(0.65, 0.65, 0.0, 1),
            relief=DGG.FLAT,
            command=self.controlType_Changed)
        self.controltype.reparentTo(self.frameMain)
        b = self.controltype.getBounds()
        xPos = right - ((b[1] - b[0]) / 2.0 * 0.1)
        self.controltype.setX(xPos)
        setItems(self.controltype)
        self.controltype.setItems = setItems
        self.controltype.showPopupMenu = showPopupMenu
        self.controltype.popupMarker.unbind(DGG.B1PRESS)
        self.controltype.popupMarker.bind(DGG.B1PRESS, showPopupMenu)
        self.controltype.unbind(DGG.B1PRESS)
        self.controltype.bind(DGG.B1PRESS, showPopupMenuExtra,
                              [self.controltype])

        isChecked = not base.AppHasAudioFocus
        img = None
        if base.AppHasAudioFocus:
            img = "AudioSwitch_on.png"
        else:
            img = "AudioSwitch_off.png"
        self.cbVolumeMute = DirectCheckBox(
            text=_("Mute Audio"),
            text_scale=0.5,
            text_align=TextNode.ACenter,
            text_pos=(0.0, 0.65),
            text_fg=(1, 1, 1, 1),
            pos=(right, 0, -0.35),
            scale=0.21 / 2.0,
            command=self.cbVolumeMute_CheckedChanged,
            rolloverSound=None,
            clickSound=None,
            relief=None,
            pressEffect=False,
            isChecked=isChecked,
            image=img,
            image_scale=0.5,
            checkedImage="AudioSwitch_off.png",
            uncheckedImage="AudioSwitch_on.png")
        self.cbVolumeMute.setTransparency(1)
        self.cbVolumeMute.setImage()
        self.cbVolumeMute.reparentTo(self.frameMain)

        sensitivity = base.mouseSensitivity
        self.sliderSensitivity = DirectSlider(
            scale=sliderscale,
            pos=(right, 0, -0.075),
            range=(0.5, 2),
            scrollSize=0.01,
            text=_("Mouse Sensitivity %0.1fx") % sensitivity,
            text_scale=textscale,
            text_align=TextNode.ACenter,
            text_pos=(.0, 0.15),
            text_fg=(1, 1, 1, 1),
            thumb_frameColor=(0.65, 0.65, 0.0, 1),
            thumb_relief=DGG.FLAT,
            frameColor=(0.15, 0.15, 0.15, 1),
            value=sensitivity,
            command=self.sliderSensitivity_ValueChanged)
        self.sliderSensitivity.reparentTo(self.frameMain)
        if base.controlType == "Gamepad":
            self.sliderSensitivity.hide()

        # create the back button
        self.btnBack = DirectButton(
            scale=buttonScale,
            # position on the window
            pos=(0, 0, base.a2dBottom + 0.15),
            frameColor=(0, 0, 0, 0),
            # text properties
            text=_("Back"),
            text_scale=0.5,
            text_fg=(1, 1, 1, 1),
            text_pos=(0.0, -0.15),
            text_shadow=(0, 0, 0, 0.35),
            text_shadowOffset=(-0.05, -0.05),
            # sounds that should be played
            rolloverSound=None,
            clickSound=None,
            pressEffect=False,
            relief=None,
            # the event which is thrown on clickSound
            command=lambda: base.messenger.send("options_back"))
        self.btnBack.setTransparency(1)
        self.btnBack.reparentTo(self.frameMain)

        self.hide()
Ejemplo n.º 30
0
    def load(self):
        gui = loader.loadModel('phase_3/models/gui/laff_o_meter')
        if self.isToon:
            hType = self.style.getType()
            if hType == 'dog':
                headModel = gui.find('**/doghead')
            else:
                if hType == 'cat':
                    headModel = gui.find('**/cathead')
                else:
                    if hType == 'mouse':
                        headModel = gui.find('**/mousehead')
                    else:
                        if hType == 'horse':
                            headModel = gui.find('**/horsehead')
                        else:
                            if hType == 'rabbit':
                                headModel = gui.find('**/bunnyhead')
                            else:
                                if hType == 'duck':
                                    headModel = gui.find('**/duckhead')
                                else:
                                    if hType == 'monkey':
                                        headModel = gui.find('**/monkeyhead')
                                    else:
                                        if hType == 'bear':
                                            headModel = gui.find('**/bearhead')
                                        else:
                                            if hType == 'pig':
                                                headModel = gui.find(
                                                    '**/pighead')
                                            else:
                                                if hType == 'scrooge' or hType == 'gyro':
                                                    headModel = gui.find(
                                                        '**/duckhead')
                                                else:
                                                    if hType == 'riggy':
                                                        headModel = gui.find(
                                                            '**/bunnyhead')
                                                    else:
                                                        raise StandardError(
                                                            'unknown toon species: ',
                                                            hType)
            self.color = self.style.getHeadColor()
            self.resetFrameSize()
            self.setScale(0.1)
            self.image = DirectFrame(parent=self.container,
                                     relief=None,
                                     image=headModel)
            self.image.setColor(self.color)
            self.magicRainbow = Sequence(
                LerpColorInterval(self.image,
                                  duration=1,
                                  color=VBase4(0.996094, 0.898438, 0.320312,
                                               1.0)),
                LerpColorInterval(self.image,
                                  duration=1,
                                  color=VBase4(0.304688, 0.96875, 0.402344,
                                               1.0)),
                LerpColorInterval(self.image,
                                  duration=1,
                                  color=VBase4(0.191406, 0.5625, 0.773438,
                                               1.0)),
                LerpColorInterval(self.image,
                                  duration=0.5,
                                  color=VBase4(0.546875, 0.28125, 0.75, 1.0)),
                LerpColorInterval(self.image,
                                  duration=0.5,
                                  color=VBase4(0.933594, 0.265625, 0.28125,
                                               1.0)))
            if self.style.headColor == 39 and self.magicRainbow.isStopped():
                self.magicRainbow.loop()
            self.frown = DirectFrame(parent=self.container,
                                     relief=None,
                                     image=gui.find('**/frown'))
            self.frown.setY(-0.1)
            self.smile = DirectFrame(parent=self.container,
                                     relief=None,
                                     image=gui.find('**/smile'))
            self.eyes = DirectFrame(parent=self.container,
                                    relief=None,
                                    image=gui.find('**/eyes'))
            self.eyes.setY(-0.1)
            self.openSmile = DirectFrame(parent=self.container,
                                         relief=None,
                                         image=gui.find('**/open_smile'))
            self.openSmile.setY(-0.1)
            self.tooth1 = DirectFrame(parent=self.openSmile,
                                      relief=None,
                                      image=gui.find('**/tooth_1'))
            self.tooth2 = DirectFrame(parent=self.openSmile,
                                      relief=None,
                                      image=gui.find('**/tooth_2'))
            self.tooth3 = DirectFrame(parent=self.openSmile,
                                      relief=None,
                                      image=gui.find('**/tooth_3'))
            self.tooth4 = DirectFrame(parent=self.openSmile,
                                      relief=None,
                                      image=gui.find('**/tooth_4'))
            self.tooth5 = DirectFrame(parent=self.openSmile,
                                      relief=None,
                                      image=gui.find('**/tooth_5'))
            self.tooth6 = DirectFrame(parent=self.openSmile,
                                      relief=None,
                                      image=gui.find('**/tooth_6'))
            self.maxLabel = DirectLabel(
                parent=self.eyes,
                relief=None,
                pos=(0.442, 0, 0.051),
                text='120',
                text_scale=0.4,
                text_font=ToontownGlobals.getInterfaceFont())
            self.maxLabel.setY(-0.1)
            self.hpLabel = DirectLabel(
                parent=self.eyes,
                relief=None,
                pos=(-0.398, 0, 0.051),
                text='120',
                text_scale=0.4,
                text_font=ToontownGlobals.getInterfaceFont())
            self.hpLabel.setY(-0.1)
            self.teeth = [
                self.tooth6, self.tooth5, self.tooth4, self.tooth3,
                self.tooth2, self.tooth1
            ]
            for tooth in self.teeth:
                tooth.setY(-0.1)

            self.fractions = [0.0, 0.166666, 0.333333, 0.5, 0.666666, 0.833333]
        gui.removeNode()
        return