from pandac.PandaModules import * from direct.gui.DirectGui import * from toontown.toonbase import ToontownGlobals from toontown.toonbase import TTLocalizer class BossLobbyGui(DirectFrame): class InitialFrame(DirectFrame): frame = 0 class LobbySelection(DirectButton): def __init__(self, parent, **kw): optiondefs = ( ('relief', None, None), ('image_scale', 0.55, None), ('text_pos', (0.3, -0.0225), None), ('text_scale', 0.075, None), ) self.defineoptions(kw, optiondefs) DirectButton.__init__(self, relief=None) self.initialiseoptions(BossLobbyGui.InitialFrame.LobbySelection) def __init__(self, parent, callback, **kw): optiondefs = ( ('relief', None, None), ('state', DGG.NORMAL, None), ('image', DGG.getDefaultDialogGeom(), None), ('image_scale', (1.0, 1.0, 0.75), None), ('image_color', ToontownGlobals.GlobalDialogColor, None), ('pos', (0, 0, 0), None), ) self.defineoptions(kw, optiondefs) DirectFrame.__init__(self, relief=None) self.initialiseoptions(BossLobbyGui.InitialFrame) self.callback = callback self.selection = -1 self.load() def destroy(self): if hasattr(self, 'title') and self.title: self.title.destroy() del self.title if hasattr(self, 'buttons') and len(self.buttons): for button in self.buttons: button.destroy() del self.buttons if hasattr(self, 'okButton') and self.okButton: self.okButton.destroy() del self.okButton if hasattr(self, 'cancelButton') and self.cancelButton: self.cancelButton.destroy() del self.cancelButton DirectFrame.destroy(self) def load(self): empty = loader.loadModel("phase_3.5/models/gui/matching_game_gui.bam") buttons = loader.loadModel("phase_3/models/gui/dialog_box_buttons_gui") self.emptyList = (empty.find("**/minnieCircle"), empty.find("**/minnieCircle"), empty.find("**/minnieCircle")) okImageList = (buttons.find('**/ChtBx_OKBtn_UP'), buttons.find('**/ChtBx_OKBtn_DN'), buttons.find('**/ChtBx_OKBtn_Rllvr')) cancelImageList = (buttons.find('**/CloseBtn_UP'), buttons.find('**/CloseBtn_DN'), buttons.find('**/CloseBtn_Rllvr')) empty.removeNode() buttons.removeNode() self.title = DirectLabel(parent=self, relief=None, text="Select a Lobby", textMayChange=1, text_scale=0.1, pos=(0, 0, 0.25)) self.okButton = DirectButton(parent=self, relief=None, image=okImageList, pos=(-0.1, 0, -0.275), command=self.nextFrame, extraArgs=[True]) self.cancelButton = DirectButton(parent=self, relief=None, image=cancelImageList, pos=(0.1, 0, -0.275), command=self.nextFrame, extraArgs=[False]) self.buttons = [] public = BossLobbyGui.InitialFrame.LobbySelection(self, image=self.emptyList, pos=(-0.35, 0, 0.075), text="Public", command=self.setSelection, extraArgs=[0]) private = BossLobbyGui.InitialFrame.LobbySelection(self, image=self.emptyList, pos=(-0.3475, 0, -0.075), text="Private", command=self.setSelection, extraArgs=[1]) self.buttons.extend([ public, private ]) def setSelection(self, buttonId): newSelection = self.buttons[buttonId] if newSelection: for button in self.buttons: button.setColor(1, 1, 1, 1) newSelection.setColor(0, 1, 0, 1) self.selection = buttonId def getSelection(self): return self.selection def nextFrame(self, status): if status and self.getSelection() >= 0: options = { 'lobbyType': self.getSelection() } self.callback(self.frame + 1, options) else: self.callback(-1) class SecondaryFrame(DirectFrame): frame = 1 class LobbyList(DirectScrolledList): def __init__(self, parent, **kw): buttons = loader.loadModel("phase_3/models/gui/tt_m_gui_mat_mainGui") arrowGui = (buttons.find('**/tt_t_gui_mat_arrowUp'), buttons.find('**/tt_t_gui_mat_arrowDown'), buttons.find('**/tt_t_gui_mat_arrowDisabled')) buttons.removeNode() optiondefs = ( ('relief', None, None), ('pos', (-0.375, 0, -0.045), None), ('numItemsVisible', 4, None), ('forceHeight', 0.12, None), ('itemFrame_relief', DGG.SUNKEN, None), ('itemFrame_pos', (0, 0, 0), None), ('itemFrame_scale', 1.0, None), ('itemFrame_borderWidth', (0.015, 0.015), None), ('itemFrame_frameSize', (-0.325, 0.225, -0.325, 0.2), None), ('itemFrame_frameColor', (0.85, 0.95, 1, 1), None), ('decButton_image', arrowGui, None), ('decButton_relief', None, None), ('decButton_pos', (0.31, 0, 0.025), None), ('decButton_hpr', (0, 0, -90), None), ('decButton_scale', 0.5, None), ('incButton_image', arrowGui, None), ('incButton_relief', None, None), ('incButton_pos', (0.31, 0, -0.175), None), ('incButton_hpr', (0, 0, 90), None), ('incButton_scale', 0.5, None), ) self.defineoptions(kw, optiondefs) DirectScrolledList.__init__(self, relief=None) self.initialiseoptions(BossLobbyGui.SecondaryFrame.LobbyList) class LobbyListItem(DirectFrame): def __init__(self, parent, itemText, callback, **kw): optiondefs = ( ('relief', None, None), ('frameColor', (0.85, 0.95, 1, 1), None), ('frameSize', (-0.31, 0.21, 0.055, 0.185), None), ) self.defineoptions(kw, optiondefs) DirectFrame.__init__(self, relief=None) self.initialiseoptions(BossLobbyGui.SecondaryFrame.LobbyListItem) self.button = DirectButton( parent=self, relief=None, text=itemText, text_align=TextNode.ALeft, text_fg=Vec4(0, 0, 0, 1), text3_fg=(0.4, 0.8, 0.4, 1), text1_bg=(1, 1, 0, 1), text2_bg=(0.5, 0.9, 1, 1), pos=(-0.28, 0, 0.105), scale=0.065, command=callback, extraArgs=[itemText], ) def destroy(self): if hasattr(self, 'button') and self.button: self.button.destroy() DirectFrame.destroy(self) class LobbyEntry(DirectEntry): def __init__(self, parent, **kw): optiondefs = ( ('relief', DGG.SUNKEN, None), ('borderWidth', (0.25, 0.25), None), ('pos', (-0.675, 0, 0.285), None), ('scale', (0.05, 0.055, 0.055), None), ('numLines', 1, None), ('focus', 1, None), ('frameColor', (0.85, 0.95, 1, 1), None), ) self.defineoptions(kw, optiondefs) DirectEntry.__init__(self, relief=None) self.initialiseoptions(BossLobbyGui.SecondaryFrame.LobbyEntry) def __init__(self, parent, callback, **kw): optiondefs = ( ('relief', None, None), ('state', DGG.NORMAL, None), ('image', DGG.getDefaultDialogGeom(), None), ('image_scale', (1.6, 1.0, 1.3), None), ('image_color', ToontownGlobals.GlobalDialogColor, None), ('pos', (0, 0, 0), None), ) self.defineoptions(kw, optiondefs) DirectFrame.__init__(self, relief=None) self.initialiseoptions(BossLobbyGui.SecondaryFrame) self.callback = callback self.items = [] self.selection = None self.friendsOnly = False self.laffLimit = False self.lobbyName = None self.isCreating = False self.load() def destroy(self): if hasattr(self, 'titleLeft') and self.titleLeft: self.titleLeft.destroy() del self.titleLeft if hasattr(self, 'lobbies') and self.lobbies: self.lobbies.destroy() del self.lobbies if hasattr(self, 'entry') and self.entry: self.entry.destroy() del self.entry if hasattr(self, 'cancelButton') and self.cancelButton: self.cancelButton.destroy() del self.cancelButton if hasattr(self, 'nextButton') and self.nextButton: self.nextButton.destroy() del self.nextButton if hasattr(self, 'nameLabel') and self.nameLabel: self.nameLabel.destroy() del self.nameLabel if hasattr(self, 'nameEntry') and self.nameEntry: self.nameEntry.destroy() del self.nameEntry if hasattr(self, 'friendLabel') and self.friendLabel: self.friendLabel.destroy() del self.friendLabel if hasattr(self, 'friendCheckbox') and self.friendCheckbox: self.friendCheckbox.destroy() del self.friendCheckbox if hasattr(self, 'laffLabel') and self.laffLabel: self.laffLabel.destroy() del self.laffLabel if hasattr(self, 'laffCheckbox') and self.laffCheckbox: self.laffCheckbox.destroy() del self.laffCheckbox DirectFrame.destroy(self) def load(self): empty = loader.loadModel("phase_3.5/models/gui/matching_game_gui.bam") buttons = loader.loadModel("phase_3/models/gui/tt_m_gui_mat_mainGui") cancelImageList = (buttons.find('**/tt_t_gui_mat_closeUp'), buttons.find('**/tt_t_gui_mat_closeDown'), buttons.find('**/tt_t_gui_mat_closeDown')) nextImageList = (buttons.find('**/tt_t_gui_mat_nextUp'), buttons.find('**/tt_t_gui_mat_nextDown'), buttons.find('**/tt_t_gui_mat_nextDown')) emptyList = (empty.find("**/minnieCircle"), empty.find("**/minnieCircle"), empty.find("**/minnieCircle")) empty.removeNode() buttons.removeNode() self.titleLeft = DirectLabel(parent=self, relief=None, text="Select a Lobby", textMayChange=1, text_scale=0.08, pos=(-0.435, 0, 0.475)) self.titleRight = DirectLabel(parent=self, relief=None, text="Create a Lobby", textMayChange=1, text_scale=0.08, pos=(0.39, 0, 0.475)) self.lobbies = BossLobbyGui.SecondaryFrame.LobbyList(self) self.entry = BossLobbyGui.SecondaryFrame.LobbyEntry(self, command=self.loadItemsToList) self.items = [ "Loudrob", "Jake", "Voltage", "Daniel", "Mel", ] self.nameLabel = DirectLabel(parent=self, relief=None, text="Name:", text_scale=0.06, pos=(0.125, 0, 0.285)) self.nameEntry = BossLobbyGui.SecondaryFrame.LobbyEntry(self, command=self.setLobbyName, pos=(0.27, 0, 0.285), width=9) self.friendLabel = DirectLabel(parent=self, relief=None, text="Friends Only?", text_scale=0.06, pos=(0.221, 0, 0.085)) self.friendCheckbox = DirectButton(parent=self, relief=None, image=emptyList, pos=(0.62, 0, 0.095), scale=0.55, color=(1, 0, 0, 1), command=self.toggleFriendsOnly) self.laffLabel = DirectLabel(parent=self, relief=None, text="70+ Laff Only?", text_scale=0.06, pos=(0.251, 0, -0.115)) self.laffCheckbox = DirectButton(parent=self, relief=None, image=emptyList, pos=(0.62, 0, -0.105), scale=0.55, color=(1, 0, 0, 1), command=self.toggleLaffLimit) self.cancelButton = DirectButton(parent=self, relief=None, image=cancelImageList, pos=(-0.65, 0, -0.535), scale=0.57, command=self.nextFrame, extraArgs=[False]) self.nextButton = DirectButton(parent=self, relief=None, image=nextImageList, pos=(0.65, 0, -0.535), scale=0.3, command=self.nextFrame, extraArgs=[True]) def loadItemsToList(self, entryText): if hasattr(self, 'lobbies') and self.lobbies: self.lobbies.destroy() self.lobbies = BossLobbyGui.SecondaryFrame.LobbyList(self) toAdd = [] for i in self.items: if i.lower().startswith(entryText.lower()): toAdd.append(i) for i in sorted(toAdd): newItem = BossLobbyGui.SecondaryFrame.LobbyListItem(self, i, self.setSelection) self.lobbies.addItem(newItem) def setSelection(self, selection): self.selection = selection def getSelection(self): return self.selection def toggleFriendsOnly(self): if self.friendsOnly: self.friendsOnly = False self.friendCheckbox.setColor(1, 0, 0, 1) else: self.friendsOnly = True self.friendCheckbox.setColor(0, 1, 0, 1) def getFriendsOnly(self): return self.friendsOnly def toggleLaffLimit(self): if self.laffLimit: self.laffLimit = False self.laffCheckbox.setColor(1, 0, 0, 1) else: self.laffLimit = True self.laffCheckbox.setColor(0, 1, 0, 1) def getLaffLimit(self): return self.laffLimit def setLobbyName(self, name): self.isCreating = bool(name) self.lobbyName = name def getLobbyName(self): return self.lobbyName def nextFrame(self, status): if status: if self.getSelection(): options = { 'selected': self.getSelection() } self.callback(self.frame + 1, options) elif self.isCreating: options = { 'name': self.lobbyName, 'friends': self.getFriendsOnly(), 'laff': self.getLaffLimit(), } self.callback(self.frame + 1, options) else: self.callback(-1) else: self.callback(-1) def __init__(self, callback, av): DirectFrame.__init__(self) self.callback = callback self.avatar = av self.frame = None def destroy(self): if hasattr(self, 'frame') and self.frame: self.frame.destroy() del self.frame DirectFrame.destroy(self) def loadFrame(self, frameNum, args={}): if hasattr(self, 'frame') and self.frame: self.frame.destroy() if frameNum == -1: self.callback(self.avatar, False) elif frameNum == 0: self.frame = BossLobbyGui.InitialFrame(self, self.loadFrame) elif frameNum == 1 and args.get('lobbyType') is not None: lobby = args.get('lobbyType') if lobby == 0: self.callback(self.avatar, True) elif lobby == 1: self.frame = BossLobbyGui.SecondaryFrame(self, self.loadFrame) elif frameNum == 2: selection = args.get('selected') name = args.get('name') if selection: self.callback(self.avatar, True) elif name: friendsOnly = args.get('friends') laffLimit = args.get('laff') self.callback(self.avatar, True) else: self.callback(self.avatar, False) # The following is made for use with the GUI editor. GUI_EDITOR = """ from toontown.coghq.BossLobbyGui import BossLobbyGui test = BossLobbyGui(None, None) test.loadFrame(1, {'lobbyType': 1}) """