def test_set_scrollbar_width(): w = 1 frm = DirectScrolledFrame(scrollBarWidth=w) assert frm['scrollBarWidth'] == 1 assert frm.verticalScroll['frameSize'] == (-w / 2.0, w / 2.0, -1, 1) assert frm.horizontalScroll['frameSize'] == (-1, 1, -w / 2.0, w / 2.0) # manual changes to the framesize frm.verticalScroll['frameSize'] = (-2, 2, -4, 4) frm.horizontalScroll['frameSize'] = (-4, 4, -2, 2) assert frm.verticalScroll['frameSize'] == (-2, 2, -4, 4) assert frm.horizontalScroll['frameSize'] == (-4, 4, -2, 2) # change scrollbar width to a new value w = 2 frm['scrollBarWidth'] = w # check, new value is set correct assert frm['scrollBarWidth'] == 2 # check if new size is set correct assert frm.verticalScroll['frameSize'] == (-w / 2.0, w / 2.0, -4, 4) assert frm.horizontalScroll['frameSize'] == (-4, 4, -w / 2.0, w / 2.0)
def __init__(self, text='', align=TextNode.ALeft, scale=(1, 1), font=None, font_size=12, parent=None, frameColor=(0.33, 0.33, 0.33, .66)): if parent is None: parent = aspect2d self.parent = parent self.frame = DirectScrolledFrame( parent=parent, frameColor=frameColor, state=DGG.DISABLED, relief=DGG.FLAT, scrollBarWidth=scale[0] * font_size, horizontalScroll_relief=DGG.FLAT, verticalScroll_relief=DGG.FLAT, ) self.text = OnscreenText(parent=self.frame.getCanvas(), text=text, align=align, scale=tuple(scale * font_size), font=font) bounds = self.text.getTightBounds() self.frame['canvasSize'] = [ 0, bounds[1][0] - bounds[0][0], -bounds[1][2] + bounds[0][2], 0 ] self.frame['frameSize'] = [0, 0.5, -0.5, 0] self.text.setPos(-bounds[0][0], -bounds[1][2]) self.frame.setPos(0, 0, 0)
def __init__(self): ''' Constructor ''' SogalForm.__init__(self, fading = True, fading_duration = 0.3, enableMask = True,backgroundColor = (0,0,0,0.6)) self.reparentTo(aspect2d,sort = 101) self.frame = DirectScrolledFrame(parent = self, canvasSize = CANVASSIZE, frameSize = FRAMESIZE, autoHideScrollBars = AUTO_HIDE_SCROLLBARS, ) self.reloadTheme() self.height = TOP self.shiftedHeight = 0 self.shifter = NodePath('text_history_shifter') self.shifter.reparentTo(self.frame.getCanvas()) if not prop_set_up: nameprops = TextProperties() # @UndefinedVariable nameprops.setTextScale(0.75) TextPropertiesManager.getGlobalPtr().setProperties("th_name", nameprops) # @UndefinedVariable self.labels = []
def __init__(self, parent, getEditorRootCanvas, elementDict, selectedElement): height = DGH.getRealHeight(parent) self.collapsedElements = [] self.parent = parent self.box = DirectBoxSizer(frameColor=(0.25, 0.25, 0.25, 1), autoUpdateFrameSize=False, orientation=DGG.VERTICAL) self.sizer = DirectAutoSizer(parent=parent, child=self.box, childUpdateSizeFunc=self.box.refresh) self.lblHeader = DirectLabel( text="Structure", text_scale=16, text_align=TextNode.ALeft, text_fg=(1, 1, 1, 1), frameColor=VBase4(0, 0, 0, 0), ) self.box.addItem(self.lblHeader) color = ( (0.8, 0.8, 0.8, 1), # Normal (0.9, 0.9, 1, 1), # Click (0.8, 0.8, 1, 1), # Hover (0.5, 0.5, 0.5, 1)) # Disabled self.structureFrame = DirectScrolledFrame( # make the frame fit into our background frame frameSize=VBase4( self.parent["frameSize"][0], self.parent["frameSize"][1], self.parent["frameSize"][2] + DGH.getRealHeight(self.lblHeader), self.parent["frameSize"][3]), #canvasSize=VBase4(parent["frameSize"][0], parent["frameSize"][1]-20, height+30, 0), # set the frames color to transparent frameColor=VBase4(1, 1, 1, 1), scrollBarWidth=20, verticalScroll_scrollSize=20, verticalScroll_thumb_relief=DGG.FLAT, verticalScroll_incButton_relief=DGG.FLAT, verticalScroll_decButton_relief=DGG.FLAT, verticalScroll_thumb_frameColor=color, verticalScroll_incButton_frameColor=color, verticalScroll_decButton_frameColor=color, horizontalScroll_thumb_relief=DGG.FLAT, horizontalScroll_incButton_relief=DGG.FLAT, horizontalScroll_decButton_relief=DGG.FLAT, horizontalScroll_thumb_frameColor=color, horizontalScroll_incButton_frameColor=color, horizontalScroll_decButton_frameColor=color, state=DGG.NORMAL) self.box.addItem(self.structureFrame) self.structureFrame.bind(DGG.MWDOWN, self.scroll, [0.01]) self.structureFrame.bind(DGG.MWUP, self.scroll, [-0.01]) self.maxWidth = parent["frameSize"][1] - 20 self.getEditorRootCanvas = getEditorRootCanvas self.refreshStructureTree(elementDict, selectedElement)
def __init__(self, menu_args): GameObject.__init__(self) self.eng.log('created match message form') self.chat = None self.msg_frm = DirectFrame( frameSize=(-.02, 2.5, 0, 1.22), frameColor=(.2, .2, .2, .5), pos=(.04, 1, -1.69), parent=base.a2dTopLeft) t_a = menu_args.text_args t_a['scale'] = .05 t_a['fg'] = menu_args.text_normal self.dst_txt = OnscreenText( text='', pos=(0, 1.16), parent=self.msg_frm, align=TextNode.A_left, **t_a) self.ent = Entry( scale=.04, pos=(0, 1, .03), entryFont=menu_args.font, width=62, frameColor=menu_args.btn_color, parent=self.msg_frm, initialText=_('write here your message'), command=self.on_typed_msg, focusInCommand=self.on_focus, focusInExtraArgs=['in'], focusOutCommand=self.on_focus, focusOutExtraArgs=['out'], text_fg=menu_args.text_active) self.ent['state'] = DISABLED self.txt_frm = DirectScrolledFrame( frameSize=(-.02, 2.46, -.02, 1.02), canvasSize=(-.02, 2.42, -.02, 1.02), scrollBarWidth=.036, verticalScroll_relief=FLAT, verticalScroll_frameColor=(.2, .2, .2, .4), verticalScroll_thumb_relief=FLAT, verticalScroll_thumb_frameColor=(.8, .8, .8, .6), verticalScroll_incButton_relief=FLAT, verticalScroll_incButton_frameColor=(.8, .8, .8, .6), verticalScroll_decButton_relief=FLAT, verticalScroll_decButton_frameColor=(.8, .8, .8, .6), horizontalScroll_relief=FLAT, frameColor=(1, 1, 1, .0), pos=(.02, 1, .11), parent=self.msg_frm) t_a['scale'] = .046 self.msg_txt = OnscreenText( text='', pos=(0, .24), parent=self.txt_frm.getCanvas(), align=TextNode.A_left, wordwrap=52, **t_a) lab_args = menu_args.label_args lab_args['scale'] = .046 lab_args['text_fg'] = menu_args.text_normal self.lab_frm = Btn( frameSize=(-.02, 2.5, -.01, .05), frameColor=(1, 1, 1, 0), pos=(0, 1, 1.15), parent=self.msg_frm) self.lab_frm.bind(ENTER, self.on_enter) self.lab_frm.bind(EXIT, self.on_exit) self.tooltip = DirectLabel( text='', pos=(2.4, 1, -.06), parent=self.lab_frm, text_wordwrap=50, text_bg=(.2, .2, .2, .8), text_align=TextNode.A_right, **lab_args) self.tooltip.set_bin('gui-popup', 10) self.tooltip.hide()
def __init__(self): ''' Constructor ''' SogalForm.__init__(self, fading=True, fading_duration=0.5, enableMask=True, backgroundColor=color_themes.sirius_bgColor) self.reparentTo(aspect2d, sort=102) self.frame = DirectScrolledFrame( parent=self, canvasSize=LOAD_CANVAS_SIZE, frameSize=FRAMESIZE, autoHideScrollBars=AUTO_HIDE_SCROLLBARS, **color_themes.sirius_frame) self.labels = [] self.labelDict = {} self.vbox = VLayout(parent=self.frame.getCanvas(), margin=vspacing) hbox = None self.__dumped = None pos2 = MAX_SAVE + runtime_data.MAX_QUICKSAVE pos3 = MAX_SAVE + runtime_data.MAX_QUICKSAVE + runtime_data.MAX_AUTOSAVE for i in range(1, pos3 + 1): if i <= MAX_SAVE: fname = 'save' + str(i) head = str(i) elif MAX_SAVE < i <= pos2: index = i - MAX_SAVE fname = 'quick_save' + str(index) head = 'Quick Save ' + str(index) elif pos2 < i <= pos3: index = i - pos2 fname = 'auto_save' + str(index) head = 'Auto Save ' + str(index) label = SaveLoadLabel(command=self.load, always_enable=False, fileName=fname, head=head, extraArgs=[fname], style=color_themes.sirius_button) self.labels.append(label) self.labelDict[label.getFileName()] = label if not hbox: hbox = HLayout(margin=hspacing) self.vbox.append(hbox) hbox.append(label) else: hbox.append(label) hbox = None
def __init__(self, parent=None, **kw): optiondefs = ( # Define type of DirectGuiWidget # The height of the area to drag the widget around ('dragAreaHeight', 0.1, None), ('resortOnDrag', True, None), ('showClose', True, None), ('closeButtonPosition', 'Right', None), ('closeButtonScale', 0.05, None)) # Merge keyword options with default options self.defineoptions(kw, optiondefs) # Initialize superclasses DirectScrolledFrame.__init__(self, parent) # Call option initialization functions self.initialiseoptions(DirectScrolledWindowFrame) self.dragDropTask = None b = self.bounds c = self.createcomponent( 'dragFrame', (), 'dragFrame', DirectFrame, # set the parent of the frame to this class ( self, ), state=DGG.NORMAL, suppressMouse=True, frameColor=(0.5, 0.5, 0.5, 1), relief=1, pos=(0, 0, b[3]), # set the size frameSize=(b[0], b[1], 0, self['dragAreaHeight'])) c.bind(DGG.B1PRESS, self.dragStart) c.bind(DGG.B1RELEASE, self.dragStop) scale = self['closeButtonScale'] pos = (0, 0, self['dragAreaHeight'] * 0.5) if self['closeButtonPosition'] == 'Right': pos = (b[1] - scale * 0.5, 0, self['dragAreaHeight'] * 0.5) elif self['closeButtonPosition'] == 'Left': pos = (b[0] + scale * 0.5, 0, self['dragAreaHeight'] * 0.5) closeBtn = self.createcomponent('closeButton', (), 'closeButton', DirectButton, (c, ), text='x', scale=scale, pos=pos, command=self.destroy)
def __init__(self): ''' Constructor ''' SogalForm.__init__(self, fading = True, fading_duration = 0.5, enableMask = True,backgroundColor= color_themes.ilia_bgColor) self.reparentTo(aspect2d,sort = 102) self.frame = DirectScrolledFrame(parent = self, canvasSize = SAVE_CANVAS_SIZE, frameSize = FRAMESIZE, autoHideScrollBars = AUTO_HIDE_SCROLLBARS, **color_themes.ilia_frame) self.labels = [] self.labelDict = {} self.vbox = VLayout(parent = self.frame.getCanvas(), margin = vspacing) hbox = None self.__dumped = None for i in range(1,MAX_SAVE + 1): fname = 'save' + str(i) head = str(i) label = SaveLoadLabel(command = self.save, always_enable = True, fileName = fname, head = head,extraArgs = [fname],style = color_themes.ilia_button) self.labels.append(label) self.labelDict[label.getFileName()] = label if not hbox: hbox = HLayout(margin = hspacing) self.vbox.append(hbox) hbox.append(label) else: hbox.append(label) hbox = None
def _create_components(self): """ Creates the window components """ DraggableWindow._create_components(self) self._content_frame = DirectScrolledFrame( frameSize=(0, self._width - 15, 0, self._height - 90), canvasSize=(0, self._width - 80, 0, self._scroll_height), autoHideScrollBars=False, scrollBarWidth=20.0, frameColor=(0, 0, 0, 0), verticalScroll_relief=False, horizontalScroll_relief=False, horizontalScroll_incButton_relief=False, horizontalScroll_decButton_relief=False, horizontalScroll_thumb_relief=False, parent=self._node, pos=(0, 1, -self._height)) self._content_node = self._content_frame.getCanvas().attach_new_node( "BufferComponents") self._content_node.set_scale(1, 1, -1) self._content_node.set_z(self._scroll_height) self._chb_show_images = BetterLabeledCheckbox( parent=self._node, x=20, y=60, chb_callback=self._set_show_images, chb_checked=False, text="Display image resources", text_color=Vec3(0.5), expand_width=200)
def _create_components(self): """ Internal method to create the window components """ DraggableWindow._create_components(self) self._content_frame = DirectScrolledFrame( frameSize=(0, self._width - 40, 0, self._height - 80), canvasSize=(0, self._scroll_width, 0, self._scroll_height), autoHideScrollBars=False, scrollBarWidth=20.0, frameColor=(0, 0, 0, 0), verticalScroll_relief=False, horizontalScroll_relief=False, parent=self._node, pos=(20, 1, -self._height + 20)) self._content_node = self._content_frame.getCanvas().attach_new_node("PipeComponents") self._content_node.set_scale(1, 1, -1) self._content_node.set_z(self._scroll_height)
def __init__(self, menu_args, yorg_srv): GameObject.__init__(self) self.eng.log('create users form') self.ver_check = VersionChecker() self.yorg_srv = yorg_srv self.room_name = None self.labels = [] self.invited_users = [] self.menu_args = menu_args lab_args = menu_args.label_args lab_args['scale'] = .046 self.users_lab = DirectLabel(text=_('Current online users'), pos=(-.85, 1, -.02), hpr=(0, 0, -90), parent=base.a2dTopRight, text_align=TextNode.A_right, **lab_args) self.frm = DirectScrolledFrame( frameSize=(-.02, .8, .45, 2.43), canvasSize=(-.02, .76, -.08, 3.8), scrollBarWidth=.036, verticalScroll_relief=FLAT, verticalScroll_frameColor=(.2, .2, .2, .4), verticalScroll_thumb_relief=FLAT, verticalScroll_thumb_frameColor=(.8, .8, .8, .6), verticalScroll_incButton_relief=FLAT, verticalScroll_incButton_frameColor=(.8, .8, .8, .6), verticalScroll_decButton_relief=FLAT, verticalScroll_decButton_frameColor=(.8, .8, .8, .6), horizontalScroll_relief=FLAT, frameColor=(.2, .2, .2, .5), pos=(-.82, 1, -2.44), parent=base.a2dTopRight) self.conn_lab = DirectLabel(text='', pos=(.38, 1, 1.5), parent=self.frm, text_wordwrap=10, **lab_args) self.set_connection_label() self.in_match_room = None self.invited = False
def __init__(self): ''' Constructor ''' SogalForm.__init__(self, fading=True, fading_duration=0.5, enableMask=True, backgroundColor=color_themes.ilia_bgColor) self.reparentTo(aspect2d, sort=102) self.frame = DirectScrolledFrame( parent=self, canvasSize=SAVE_CANVAS_SIZE, frameSize=FRAMESIZE, autoHideScrollBars=AUTO_HIDE_SCROLLBARS, **color_themes.ilia_frame) self.labels = [] self.labelDict = {} self.vbox = VLayout(parent=self.frame.getCanvas(), margin=vspacing) hbox = None self.__dumped = None for i in range(1, MAX_SAVE + 1): fname = 'save' + str(i) head = str(i) label = SaveLoadLabel(command=self.save, always_enable=True, fileName=fname, head=head, extraArgs=[fname], style=color_themes.ilia_button) self.labels.append(label) self.labelDict[label.getFileName()] = label if not hbox: hbox = HLayout(margin=hspacing) self.vbox.append(hbox) hbox.append(label) else: hbox.append(label) hbox = None
def _create_components(self): """ Creates the window components """ DraggableWindow._create_components(self) self._content_frame = DirectScrolledFrame( frameSize=(0, self._width - 15, 0, self._height - 70), canvasSize=(0, self._width - 80, 0, self._scroll_height), autoHideScrollBars=False, scrollBarWidth=12.0, frameColor=(0, 0, 0, 0), verticalScroll_relief=DGG.FLAT, verticalScroll_incButton_relief=DGG.FLAT, verticalScroll_decButton_relief=DGG.FLAT, verticalScroll_thumb_relief=DGG.FLAT, verticalScroll_frameColor=(0.05, 0.05, 0.05, 1), verticalScroll_thumb_frameColor=(0.8, 0.8, 0.8, 1), verticalScroll_incButton_frameColor=(0.6, 0.6, 0.6, 1), verticalScroll_decButton_frameColor=(0.6, 0.6, 0.6, 1), horizontalScroll_frameColor=(0, 0, 0, 0), horizontalScroll_relief=False, horizontalScroll_thumb_relief=False, horizontalScroll_incButton_relief=False, horizontalScroll_decButton_relief=False, parent=self._node, pos=(0, 1, -self._height)) self._content_node = self._content_frame.getCanvas().attach_new_node( "BufferComponents") self._content_node.set_scale(1, 1, -1) self._content_node.set_z(self._scroll_height) self._chb_show_images = LabeledCheckbox( parent=self._node, x=10, y=43, chb_callback=self._set_show_images, chb_checked=False, text="Display image resources", text_color=Vec3(0.4), expand_width=330)
def createDirectScrolledFrame(self, parent=None): parent = self.getEditorRootCanvas() if parent is None else parent pos = self.editorCenter if parent == self.getEditorRootCanvas() else (0,0,0) if self.visEditorInAspect2D: element = DirectScrolledFrame( frameColor=(1,1,1,1), frameSize=(-1,1,-1,1), canvasSize=(-2,2,-2,2), parent=parent, state = DGG.NORMAL) else: element = DirectScrolledFrame( frameColor=(1,1,1,1), text_scale=24, frameSize=(-150, 150, -150, 150), pos=pos, borderWidth=(2, 2), canvasSize=(-300,300,-300,300), scrollBarWidth=20, parent=parent, state = DGG.NORMAL) elementInfo = ElementInfo(element, "DirectScrolledFrame") self.setupBind(elementInfo) return elementInfo
def __init__(self): ''' Constructor ''' SogalForm.__init__(self, fading = True, fading_duration = 0.5, enableMask = True,backgroundColor=color_themes.sirius_bgColor) self.reparentTo(aspect2d,sort = 102) self.frame = DirectScrolledFrame(parent = self, canvasSize = LOAD_CANVAS_SIZE, frameSize = FRAMESIZE, autoHideScrollBars = AUTO_HIDE_SCROLLBARS, **color_themes.sirius_frame) self.labels = [] self.labelDict = {} self.vbox = VLayout(parent = self.frame.getCanvas(), margin = vspacing) hbox = None self.__dumped = None pos2 = MAX_SAVE + runtime_data.MAX_QUICKSAVE pos3 = MAX_SAVE + runtime_data.MAX_QUICKSAVE + runtime_data.MAX_AUTOSAVE for i in range(1, pos3 + 1): if i <= MAX_SAVE: fname = 'save' + str(i) head = str(i) elif MAX_SAVE < i <= pos2: index = i - MAX_SAVE fname = 'quick_save' + str(index) head = 'Quick Save ' + str(index) elif pos2 < i <= pos3: index = i - pos2 fname = 'auto_save' + str(index) head = 'Auto Save ' + str(index) label = SaveLoadLabel(command = self.load, always_enable = False, fileName = fname, head = head, extraArgs = [fname],style = color_themes.sirius_button) self.labels.append(label) self.labelDict[label.getFileName()] = label if not hbox: hbox = HLayout(margin = hspacing) self.vbox.append(hbox) hbox.append(label) else: hbox.append(label) hbox = None
class BufferViewer(DraggableWindow): """ This class provides a view into the buffers to inspect them """ def __init__(self, pipeline, parent): """ Constructs the buffer viewer """ DraggableWindow.__init__(self, width=1400, height=800, parent=parent, title="Buffer- and Image-Browser") self._pipeline = pipeline self._scroll_height = 3000 self._display_images = False self._stages = [] self._create_components() self._tex_preview = TexturePreview(self._pipeline, parent) self._tex_preview.hide() self.hide() def toggle(self): """ Updates all the buffers and then toggles the buffer viewer """ if self._visible: self._remove_components() self.hide() else: self._perform_update() self.show() @property def entries(self): """ Returns a list of all registered entries """ return RenderTarget.REGISTERED_TARGETS + Image.REGISTERED_IMAGES @property def stage_information(self): """ Returns the amount of attached stages, and also the memory consumed in MiB in a tuple. """ count, memory = 0, 0 for entry in self.entries: if isinstance(entry, Texture): memory += entry.estimate_texture_memory() count += 1 elif entry.__class__.__name__ == "RenderTarget": for target in itervalues(entry.targets): memory += target.estimate_texture_memory() count += 1 else: self.warn("Unkown type:", entry.__class__.__name__) return memory, count def _create_components(self): """ Creates the window components """ DraggableWindow._create_components(self) self._content_frame = DirectScrolledFrame( frameSize=(0, self._width - 15, 0, self._height - 70), canvasSize=(0, self._width - 80, 0, self._scroll_height), autoHideScrollBars=False, scrollBarWidth=12.0, frameColor=(0, 0, 0, 0), verticalScroll_relief=DGG.FLAT, verticalScroll_incButton_relief=DGG.FLAT, verticalScroll_decButton_relief=DGG.FLAT, verticalScroll_thumb_relief=DGG.FLAT, verticalScroll_frameColor=(0.05, 0.05, 0.05, 1), verticalScroll_thumb_frameColor=(0.8, 0.8, 0.8, 1), verticalScroll_incButton_frameColor=(0.6, 0.6, 0.6, 1), verticalScroll_decButton_frameColor=(0.6, 0.6, 0.6, 1), horizontalScroll_frameColor=(0, 0, 0, 0), horizontalScroll_relief=False, horizontalScroll_thumb_relief=False, horizontalScroll_incButton_relief=False, horizontalScroll_decButton_relief=False, parent=self._node, pos=(0, 1, -self._height)) self._content_node = self._content_frame.getCanvas().attach_new_node( "BufferComponents") self._content_node.set_scale(1, 1, -1) self._content_node.set_z(self._scroll_height) self._chb_show_images = LabeledCheckbox( parent=self._node, x=10, y=43, chb_callback=self._set_show_images, chb_checked=False, text="Display image resources", text_color=Vec3(0.4), expand_width=330) def _set_show_images(self, arg): """ Sets whether images and textures will be shown """ self._display_images = arg self._perform_update() def _set_scroll_height(self, height): """ Sets the maximum scroll height in the content frame """ self._scroll_height = height self._content_frame["canvasSize"] = (0, self._width - 80, 0, self._scroll_height) self._content_node.set_z(self._scroll_height) def _remove_components(self): """ Removes all components of the buffer viewer """ self._content_node.node().remove_all_children() self._tex_preview.hide() def _perform_update(self): """ Collects all entries, extracts their images and re-renders the window """ # Collect texture stages self._stages = [] for entry in sorted(self.entries, key=lambda entry: entry.sort): if isinstance(entry, Texture): if self._display_images: self._stages.append(entry) # Can not use isinstance or we get circular import references elif entry.__class__.__name__ == "RenderTarget": for target in itervalues(entry.targets): self._stages.append(target) else: self.warn("Unrecognized instance!", entry.__class__) self._render_stages() def _on_texture_hovered(self, hover_frame, evt=None): # pylint: disable=unused-argument """ Internal method when a texture is hovered """ hover_frame["frameColor"] = (0, 0, 0, 0.1) def _on_texture_blurred(self, hover_frame, evt=None): # pylint: disable=unused-argument """ Internal method when a texture is blurred """ hover_frame["frameColor"] = (0, 0, 0, 0) def _on_texture_clicked(self, tex_handle, evt=None): # pylint: disable=unused-argument """ Internal method when a texture is blurred """ self._tex_preview.present(tex_handle) def _render_stages(self): """ Renders the stages to the window """ self._remove_components() entries_per_row = 6 aspect = Globals.native_resolution.y / Globals.native_resolution.x entry_width = 235 entry_height = (entry_width - 20) * aspect + 55 # Store already processed images processed = set() index = -1 # Iterate over all stages for stage_tex in self._stages: if stage_tex in processed: continue processed.add(stage_tex) index += 1 stage_name = stage_tex.get_name() xoffs = index % entries_per_row yoffs = index // entries_per_row node = self._content_node.attach_new_node("Preview") node.set_sz(-1) node.set_pos(10 + xoffs * (entry_width - 14), 1, yoffs * (entry_height - 14 + 10)) r, g, b = 0.2, 0.2, 0.2 if isinstance(stage_tex, Image): r, g, b = 0.2, 0.4, 0.6 stage_name = stage_name.replace("render_pipeline_internal:", "") parts = stage_name.split(":") stage_name = parts[-1] DirectFrame( parent=node, frameSize=(7, entry_width - 17, -7, -entry_height + 17), frameColor=(r, g, b, 1.0), pos=(0, 0, 0)) frame_hover = DirectFrame( parent=node, frameSize=(0, entry_width - 10, 0, -entry_height + 10), frameColor=(0, 0, 0, 0), pos=(0, 0, 0), state=DGG.NORMAL) frame_hover.bind( DGG.ENTER, partial(self._on_texture_hovered, frame_hover)) frame_hover.bind( DGG.EXIT, partial(self._on_texture_blurred, frame_hover)) frame_hover.bind( DGG.B1PRESS, partial(self._on_texture_clicked, stage_tex)) Text(text=stage_name, x=15, y=29, parent=node, size=12, color=Vec3(0.8)) # Scale image so it always fits w, h = stage_tex.get_x_size(), stage_tex.get_y_size() padd_x, padd_y = 24, 57 scale_x = (entry_width - padd_x) / max(1, w) scale_y = (entry_height - padd_y) / max(1, h) scale_factor = min(scale_x, scale_y) if stage_tex.get_texture_type() == Image.TT_buffer_texture: scale_factor = 1 w = entry_width - padd_x h = entry_height - padd_y preview = Sprite( image=stage_tex, w=scale_factor * w, h=scale_factor * h, any_filter=False, parent=node, x=7, y=40, transparent=False) preview.set_shader_input("mipmap", 0) preview.set_shader_input("slice", 0) preview.set_shader_input("brightness", 1) preview.set_shader_input("tonemap", False) preview_shader = DisplayShaderBuilder.build( stage_tex, scale_factor * w, scale_factor * h) preview.set_shader(preview_shader) num_rows = (index + entries_per_row) // entries_per_row self._set_scroll_height(50 + (entry_height - 14 + 10) * num_rows)
def test_set_scrollbar_width_on_init(): frm = DirectScrolledFrame(verticalScroll_frameSize=(-2, 2, -4, 4), horizontalScroll_frameSize=(-4, 4, -2, 2)) assert frm.verticalScroll['frameSize'] == (-2, 2, -4, 4) assert frm.horizontalScroll['frameSize'] == (-4, 4, -2, 2)
class DirectFolderBrowser(DirectObject): def __init__(self, command, fileBrowser=False, defaultPath="~", defaultFilename="unnamed.txt", fileExtensions=[], tooltip=None): """ A simple file and folder browser command: The command that will be called on closing the browser fileBrowser: If set to True the browser will show files, otherwise it will only show folders defaultPath: The initial path the browser will be set to show defaultFilename: The filename that will be set by default, only usefull if fileBrowser is True fileExtensions: A list of extensions. Only files with those extensions will be shown. Only usefull if fileBrowser is True tooltip: An instance of the Tooltip class to display tooltips for certain parts of the editor """ self.tt = tooltip self.command = command self.showFiles = fileBrowser self.fileExtensions = fileExtensions self.showHidden = False self.currentPath = os.path.expanduser(defaultPath) if not os.path.exists(self.currentPath): self.currentPath = os.path.expanduser("~") self.previousPath = self.currentPath self.screenWidthPx = base.getSize()[0] self.screenWidthPxHalf = self.screenWidthPx * 0.5 self.screenHeightPx = base.getSize()[1] self.screenHeightPxHalf = self.screenHeightPx * 0.5 self.mainFrame = DirectFrame( relief=1, frameSize=(-self.screenWidthPxHalf,self.screenWidthPxHalf,-self.screenHeightPxHalf,self.screenHeightPxHalf), frameColor=(1, 1, 1, 1), pos=LPoint3f(base.getSize()[0]/2, 0, -base.getSize()[1]/2), parent=base.pixel2d, state=DGG.NORMAL, ) self.pathRightMargin = 153 self.pathEntryWidth = self.screenWidthPx - self.pathRightMargin self.pathEntry = DirectEntry( parent=self.mainFrame, relief=DGG.SUNKEN, frameColor=(1, 1, 1, 1), pad=(0.2, 0.2), pos=LPoint3f(-self.screenWidthPxHalf + 15, 0, self.screenHeightPxHalf - 25), scale=12, width=self.pathEntryWidth/12, overflow=True, command=self.entryAccept, initialText=self.currentPath, focusInCommand=base.messenger.send, focusInExtraArgs=["unregisterKeyboardEvents"], focusOutCommand=base.messenger.send, focusOutExtraArgs=["reregisterKeyboardEvents"], ) x = self.pathEntryWidth/2-28 self.btnReload = DirectButton( parent=self.mainFrame, relief=1, frameColor = ( (0.8, 0.8, 0.8, 1), # Normal (0.9, 0.9, 1, 1), # Click (0.8, 0.8, 1, 1), # Hover (0.5, 0.5, 0.5, 1)), # Disabled frameSize=(-14, 14, -10, 18), pos=LPoint3f(x, 0, self.screenHeightPxHalf - 25), command=self.folderReload, image="icons/Reload.png", image_scale=14, image_pos=(0,0,4), ) self.btnReload.setTransparency(TransparencyAttrib.M_multisample) if self.tt is not None: self.btnReload.bind(DGG.ENTER, self.tt.show, ["Reload Folder"]) self.btnReload.bind(DGG.EXIT, self.tt.hide) x += 28 self.btnFolderUp = DirectButton( parent=self.mainFrame, relief=1, frameColor = ( (0.8, 0.8, 0.8, 1), # Normal (0.9, 0.9, 1, 1), # Click (0.8, 0.8, 1, 1), # Hover (0.5, 0.5, 0.5, 1)), # Disabled frameSize=(-14, 14, -10, 18), pos=LPoint3f(x, 0, self.screenHeightPxHalf - 25), command=self.folderUp, image="icons/FolderUp.png", image_scale=14, image_pos=(0,0,4), ) self.btnFolderUp.setTransparency(TransparencyAttrib.M_multisample) if self.tt is not None: self.btnFolderUp.bind(DGG.ENTER, self.tt.show, ["Move up one level"]) self.btnFolderUp.bind(DGG.EXIT, self.tt.hide) x += 28 self.btnFolderNew = DirectButton( parent=self.mainFrame, relief=1, frameColor = ( (0.8, 0.8, 0.8, 1), # Normal (0.9, 0.9, 1, 1), # Click (0.8, 0.8, 1, 1), # Hover (0.5, 0.5, 0.5, 1)), # Disabled frameSize=(-14, 14, -10, 18), pos=LPoint3f(x, 0, self.screenHeightPxHalf - 25), command=self.folderNew, image="icons/FolderNew.png", image_scale=14, image_pos=(0,0,4), ) self.btnFolderNew.setTransparency(TransparencyAttrib.M_multisample) if self.tt is not None: self.btnFolderNew.bind(DGG.ENTER, self.tt.show, ["Create new folder"]) self.btnFolderNew.bind(DGG.EXIT, self.tt.hide) x += 28 self.btnFolderShowHidden = DirectButton( parent=self.mainFrame, relief=1, frameColor = ( (0.8, 0.8, 0.8, 1), # Normal (0.9, 0.9, 1, 1), # Click (0.8, 0.8, 1, 1), # Hover (0.5, 0.5, 0.5, 1)), # Disabled frameSize=(-14, 14, -10, 18), pos=LPoint3f(x, 0, self.screenHeightPxHalf - 25), command=self.folderShowHidden, image="icons/FolderShowHidden.png", image_scale=14, image_pos=(0,0,4), ) self.btnFolderShowHidden.setTransparency(TransparencyAttrib.M_multisample) if self.tt is not None: self.btnFolderShowHidden.bind(DGG.ENTER, self.tt.show, ["Show/Hide hidden files and folders"]) self.btnFolderShowHidden.bind(DGG.EXIT, self.tt.hide) color = ( (0.8, 0.8, 0.8, 1), # Normal (0.9, 0.9, 1, 1), # Click (0.8, 0.8, 1, 1), # Hover (0.5, 0.5, 0.5, 1)) # Disabled self.container = DirectScrolledFrame( relief=DGG.RIDGE, borderWidth=(2, 2), frameColor=(1, 1, 1, 1), frameSize=(-self.screenWidthPxHalf+10, self.screenWidthPxHalf-10, -self.screenHeightPxHalf+50, self.screenHeightPxHalf-50), canvasSize=(-self.screenWidthPxHalf+31, self.screenWidthPxHalf-10, -self.screenHeightPxHalf+50, self.screenHeightPxHalf-50), pos=LPoint3f(0, 0, 0), parent=self.mainFrame, scrollBarWidth=20, verticalScroll_scrollSize=20, verticalScroll_thumb_relief=DGG.FLAT, verticalScroll_incButton_relief=DGG.FLAT, verticalScroll_decButton_relief=DGG.FLAT, verticalScroll_thumb_frameColor=color, verticalScroll_incButton_frameColor=color, verticalScroll_decButton_frameColor=color, horizontalScroll_thumb_relief=DGG.FLAT, horizontalScroll_incButton_relief=DGG.FLAT, horizontalScroll_decButton_relief=DGG.FLAT, horizontalScroll_thumb_frameColor=color, horizontalScroll_incButton_frameColor=color, horizontalScroll_decButton_frameColor=color, state=DGG.NORMAL, ) self.container.bind(DGG.MWDOWN, self.scroll, [0.01]) self.container.bind(DGG.MWUP, self.scroll, [-0.01]) self.btnOk = DirectButton( parent=self.mainFrame, relief=1, frameColor = ( (0.8, 0.8, 0.8, 1), # Normal (0.9, 0.9, 1, 1), # Click (0.8, 0.8, 1, 1), # Hover (0.5, 0.5, 0.5, 1)), # Disabled frameSize=(-45, 45, -6, 14), pos=LPoint3f(self.screenWidthPxHalf-160, 0, -self.screenHeightPxHalf+25), text = "ok", text_scale=12, command=command, extraArgs=[1], ) self.btnCancel = DirectButton( parent=self.mainFrame, relief=1, frameColor = ( (0.8, 0.8, 0.8, 1), # Normal (0.9, 0.9, 1, 1), # Click (0.8, 0.8, 1, 1), # Hover (0.5, 0.5, 0.5, 1)), # Disabled frameSize=(-45, 45, -6, 14), pos=LPoint3f(self.screenWidthPxHalf-55, 0, -self.screenHeightPxHalf+25), text = "Cancel", text_scale=12, command=command, extraArgs=[0] ) if self.showFiles: self.txtFileName = DirectEntry( parent=self.mainFrame, relief=DGG.SUNKEN, frameColor=(1, 1, 1, 1), pad=(0.2, 0.2), pos=LPoint3f(-self.screenWidthPxHalf+25, 0, -self.screenHeightPxHalf+25), scale=12, width=200/12, overflow=True, command=self.filenameAccept, initialText=defaultFilename, focusInCommand=base.messenger.send, focusInExtraArgs=["unregisterKeyboardEvents"], focusOutCommand=base.messenger.send, focusOutExtraArgs=["reregisterKeyboardEvents"], ) self.newFolderFrame = DirectFrame( parent=self.mainFrame, relief=1, frameSize=(-self.screenWidthPxHalf+10,self.screenWidthPxHalf-10,-20,20), pos=LPoint3f(0, 0, self.screenHeightPxHalf-55), frameColor=(0.5,0.5,0.5,1), ) self.txtNewFolderName = DirectLabel( parent=self.newFolderFrame, text="New Folder Name", text_scale=12, frameColor=(0,0,0,0), text_align=TextNode.ALeft, pos=(-self.screenWidthPxHalf+15, 0, -3), ) self.folderName = DirectEntry( parent=self.newFolderFrame, relief=DGG.SUNKEN, frameColor=(1, 1, 1, 1), pad=(0.2, 0.2), pos=LPoint3f(-self.screenWidthPxHalf+25 + self.txtNewFolderName.getWidth(), 0, -4), scale=12, width=((self.screenWidthPxHalf-25)*2-self.txtNewFolderName.getWidth() - 100)/12, overflow=True, command=self.entryAccept, initialText="New Folder", focusInCommand=base.messenger.send, focusInExtraArgs=["unregisterKeyboardEvents"], focusOutCommand=base.messenger.send, focusOutExtraArgs=["reregisterKeyboardEvents"], ) self.btnCreate = DirectButton( parent=self.newFolderFrame, relief=1, frameColor = ( (0.8, 0.8, 0.8, 1), # Normal (0.9, 0.9, 1, 1), # Click (0.8, 0.8, 1, 1), # Hover (0.5, 0.5, 0.5, 1)), # Disabled frameSize=(-45, 45, -6, 14), pos=LPoint3f(self.screenWidthPxHalf-65, 0, -4), text = "Create", text_scale=12, command=self.folderCreate, extraArgs=[0] ) self.newFolderFrame.hide() self.folderReload() # handle window resizing self.prevScreenSize = base.getSize() self.accept("window-event", self.windowEventHandler) def show(self): self.mainFrame.show() self.accept("window-event", self.windowEventHandler) def hide(self): self.ignore("window-event") self.mainFrame.hide() def destroy(self): self.ignore("window-event") self.mainFrame.destroy() def scroll(self, scrollStep, event): self.container.verticalScroll.scrollStep(scrollStep) def get(self): if self.showFiles: return os.path.join(self.currentPath, self.txtFileName.get(True)) return self.currentPath def filenameAccept(self, filename): self.command(1) def entryAccept(self, path): self.folderReload() def folderReload(self): for element in self.container.getCanvas().getChildren(): element.removeNode() path = self.pathEntry.get(True) path = os.path.expanduser(path) path = os.path.expandvars(path) if not os.path.exists(path): return self.currentPath = path try: content = os.scandir(path) except PermissionError: base.messenger.send("showWarning", ["Access denied!"]) self.pathEntry.set(self.previousPath) self.currentPath = self.previousPath self.folderReload() return # start position for the folders and files xPos = -self.screenWidthPxHalf + 20 + 50 - 110 zPos = self.screenHeightPxHalf-60-40 dirList = [] fileList = [] unkList = [] for entry in content: if entry.name.startswith(".") and not self.showHidden: continue if entry.is_dir(): dirList.append(entry) elif entry.is_file() and self.showFiles: if len(self.fileExtensions) > 0: if os.path.splitext(entry.name)[1] in self.fileExtensions: fileList.append(entry) else: fileList.append(entry) elif self.showFiles: unkList.append(entry) def moveNext(entry): nonlocal xPos nonlocal zPos if entry.is_dir() or self.showFiles: if xPos + 110 > self.screenWidthPxHalf - 45: # move to the next line if we hit the right border (incl. scrollbar size) xPos = -self.screenWidthPxHalf + 20 + 50 zPos -= 110 else: # move right the next position xPos += 110 def getKey(item): return item.name.lower() for entry in sorted(dirList, key=getKey): moveNext(entry) self.__createFolder(entry, xPos, zPos) for entry in sorted(fileList, key=getKey): moveNext(entry) self.__createFile(entry.name, xPos, zPos) for entry in sorted(unkList, key=getKey): moveNext(entry) self.__createUnknown(entry.name, xPos, zPos) # recalculate the canvas size self.container["canvasSize"] = (-self.screenWidthPxHalf+31, self.screenWidthPxHalf-15, zPos-90, self.screenHeightPxHalf-50) self.container.setCanvasSize() def folderUp(self): self.previousPath = self.currentPath self.currentPath = os.path.normpath(os.path.join(self.currentPath, "..")) self.pathEntry.set(self.currentPath) self.folderReload() def folderMoveIn(self, path): path = os.path.expanduser(path) path = os.path.expandvars(path) self.previousPath = self.currentPath self.currentPath = path self.pathEntry.set(path) self.folderReload() self.container.verticalScroll["value"] = 0 def folderNew(self): if self.newFolderFrame.isHidden(): self.newFolderFrame.show() else: self.newFolderFrame.hide() def folderShowHidden(self): self.showHidden = not self.showHidden self.folderReload() def folderCreate(self, path=""): try: os.makedirs(os.path.join(self.currentPath, self.folderName.get(True))) except: base.messenger.send("showWarning", ["Can't create folder"]) self.newFolderFrame.hide() self.folderReload() def __createFolder(self, entry, xPos, zPos): name = entry.name if len(entry.name) > 10: name = "" for i in range(max(math.ceil(len(entry.name)/10), 4)): name += entry.name[i*10:i*10+10]+"\n" name = name[:-1] if math.ceil(len(entry.name)/10) > 4: name += "..." btn = DirectButton( parent=self.container.getCanvas(), image="icons/Folder.png", image_scale=35, relief=1, frameColor = ( (0.9, 0.9, 0.9, 0), # Normal (0.95, 0.95, 1, 1), # Click (0.9, 0.9, 1, 1), # Hover (0.5, 0.5, 0.5, 1)), # Disabled frameSize=(-40, 40, -40, 40), pos=LPoint3f(xPos, 0, zPos), text = name, text_scale=12, text_pos=(0,-40), command=self.folderMoveIn, extraArgs=[entry.path] ) btn.bind(DGG.MWDOWN, self.scroll, [0.01]) btn.bind(DGG.MWUP, self.scroll, [-0.01]) btn.setTransparency(TransparencyAttrib.M_multisample) def __createFile(self, filename, xPos, zPos): name = filename if len(filename) > 10: name = "" for i in range(min(math.ceil(len(filename)/10), 4)): name += filename[i*10:i*10+10]+"\n" name = name[:-1] if math.ceil(len(filename)/10) > 4: name += "..." btn = DirectButton( parent=self.container.getCanvas(), image="icons/File.png", image_scale=35, relief=1, frameColor = ( (0.9, 0.9, 0.9, 0), # Normal (0.95, 0.95, 1, 1), # Click (0.9, 0.9, 1, 1), # Hover (0.5, 0.5, 0.5, 1)), # Disabled frameSize=(-40, 40, -40, 40), pos=LPoint3f(xPos, 0, zPos), text = name, text_scale=12, text_pos=(0,-40), command=self.txtFileName.set, extraArgs=[filename] ) btn.bind(DGG.MWDOWN, self.scroll, [0.01]) btn.bind(DGG.MWUP, self.scroll, [-0.01]) btn.setTransparency(TransparencyAttrib.M_multisample) def __createUnknown(self, filename, xPos, zPos): name = filename if len(filename) > 10: name = "" for i in range(math.ceil(len(filename)/10)): name += filename[i*10:i*10+10]+"\n" name = name[:-1] lbl = DirectLabel( parent=self.container.getCanvas(), image="icons/File.png", image_scale=35, image_color=(0.9,0.5,0.5,1), relief=1, frameColor = (0.7, 0.7, 0.7, 0), frameSize=(-40, 40, -40, 40), pos=LPoint3f(xPos, 0, zPos), text = name, text_scale=12, text_pos=(0,-40), ) lbl.bind(DGG.MWDOWN, self.scroll, [0.01]) lbl.bind(DGG.MWUP, self.scroll, [-0.01]) lbl.setTransparency(TransparencyAttrib.M_multisample) def windowEventHandler(self, window=None): if window != base.win: # This event isn't about our window. return if window is not None: # window is none if panda3d is not started if self.prevScreenSize == base.getSize(): return self.prevScreenSize = base.getSize() self.screenWidthPx = base.getSize()[0] self.screenWidthPxHalf = self.screenWidthPx * 0.5 self.screenHeightPx = base.getSize()[1] self.screenHeightPxHalf = self.screenHeightPx * 0.5 # reposition and resize all gui elements self.mainFrame.setPos(self.screenWidthPx/2, 0, -self.screenHeightPx/2) self.mainFrame["frameSize"] = (-self.screenWidthPxHalf,self.screenWidthPxHalf,-self.screenHeightPxHalf,self.screenHeightPxHalf) self.pathEntryWidth = self.screenWidthPx - self.pathRightMargin self.pathEntry.setPos(LPoint3f(-self.screenWidthPxHalf + 15, 0, self.screenHeightPxHalf - 25)) self.pathEntry["width"] = self.pathEntryWidth/12 self.pathEntry.resetFrameSize() # reposition top right icons x = self.pathEntryWidth/2-28 self.btnReload.setPos(LPoint3f(x, 0, self.screenHeightPxHalf - 25)) x += 28 self.btnFolderUp.setPos(pos=LPoint3f(x, 0, self.screenHeightPxHalf - 25)) x += 28 self.btnFolderNew.setPos(pos=LPoint3f(x, 0, self.screenHeightPxHalf - 25)) x += 28 self.btnFolderShowHidden.setPos(pos=LPoint3f(x, 0, self.screenHeightPxHalf - 25)) # resize the browsing area self.container["frameSize"] = (-self.screenWidthPxHalf+10, self.screenWidthPxHalf-10, -self.screenHeightPxHalf+50, self.screenHeightPxHalf-50) # Note: canvas size of the container will be reset in the # folder Reload call at the end of this function self.btnOk.setPos(LPoint3f(self.screenWidthPxHalf-160, 0, -self.screenHeightPxHalf+25)) self.btnCancel.setPos(LPoint3f(self.screenWidthPxHalf-55, 0, -self.screenHeightPxHalf+25)) if self.showFiles: self.txtFileName.setPos(LPoint3f(-self.screenWidthPxHalf+25, 0, -self.screenHeightPxHalf+25)) self.newFolderFrame.setPos(LPoint3f(0, 0, self.screenHeightPxHalf-55)) self.newFolderFrame["frameSize"] = (-self.screenWidthPxHalf+10,self.screenWidthPxHalf-10,-20,20) self.txtNewFolderName.setPos(-self.screenWidthPxHalf+15, 0, -3) self.folderName.setPos(LPoint3f(-self.screenWidthPxHalf+25 + self.txtNewFolderName.getWidth(), 0, -4)) self.folderName["width"]=((self.screenWidthPxHalf-25)*2-self.txtNewFolderName.getWidth() - 100)/12 self.btnCreate.setPos(LPoint3f(self.screenWidthPxHalf-65, 0, -4)) self.folderReload()
def __init__(self, command, fileBrowser=False, defaultPath="~", defaultFilename="unnamed.txt", fileExtensions=[], tooltip=None): """ A simple file and folder browser command: The command that will be called on closing the browser fileBrowser: If set to True the browser will show files, otherwise it will only show folders defaultPath: The initial path the browser will be set to show defaultFilename: The filename that will be set by default, only usefull if fileBrowser is True fileExtensions: A list of extensions. Only files with those extensions will be shown. Only usefull if fileBrowser is True tooltip: An instance of the Tooltip class to display tooltips for certain parts of the editor """ self.tt = tooltip self.command = command self.showFiles = fileBrowser self.fileExtensions = fileExtensions self.showHidden = False self.currentPath = os.path.expanduser(defaultPath) if not os.path.exists(self.currentPath): self.currentPath = os.path.expanduser("~") self.previousPath = self.currentPath self.screenWidthPx = base.getSize()[0] self.screenWidthPxHalf = self.screenWidthPx * 0.5 self.screenHeightPx = base.getSize()[1] self.screenHeightPxHalf = self.screenHeightPx * 0.5 self.mainFrame = DirectFrame( relief=1, frameSize=(-self.screenWidthPxHalf,self.screenWidthPxHalf,-self.screenHeightPxHalf,self.screenHeightPxHalf), frameColor=(1, 1, 1, 1), pos=LPoint3f(base.getSize()[0]/2, 0, -base.getSize()[1]/2), parent=base.pixel2d, state=DGG.NORMAL, ) self.pathRightMargin = 153 self.pathEntryWidth = self.screenWidthPx - self.pathRightMargin self.pathEntry = DirectEntry( parent=self.mainFrame, relief=DGG.SUNKEN, frameColor=(1, 1, 1, 1), pad=(0.2, 0.2), pos=LPoint3f(-self.screenWidthPxHalf + 15, 0, self.screenHeightPxHalf - 25), scale=12, width=self.pathEntryWidth/12, overflow=True, command=self.entryAccept, initialText=self.currentPath, focusInCommand=base.messenger.send, focusInExtraArgs=["unregisterKeyboardEvents"], focusOutCommand=base.messenger.send, focusOutExtraArgs=["reregisterKeyboardEvents"], ) x = self.pathEntryWidth/2-28 self.btnReload = DirectButton( parent=self.mainFrame, relief=1, frameColor = ( (0.8, 0.8, 0.8, 1), # Normal (0.9, 0.9, 1, 1), # Click (0.8, 0.8, 1, 1), # Hover (0.5, 0.5, 0.5, 1)), # Disabled frameSize=(-14, 14, -10, 18), pos=LPoint3f(x, 0, self.screenHeightPxHalf - 25), command=self.folderReload, image="icons/Reload.png", image_scale=14, image_pos=(0,0,4), ) self.btnReload.setTransparency(TransparencyAttrib.M_multisample) if self.tt is not None: self.btnReload.bind(DGG.ENTER, self.tt.show, ["Reload Folder"]) self.btnReload.bind(DGG.EXIT, self.tt.hide) x += 28 self.btnFolderUp = DirectButton( parent=self.mainFrame, relief=1, frameColor = ( (0.8, 0.8, 0.8, 1), # Normal (0.9, 0.9, 1, 1), # Click (0.8, 0.8, 1, 1), # Hover (0.5, 0.5, 0.5, 1)), # Disabled frameSize=(-14, 14, -10, 18), pos=LPoint3f(x, 0, self.screenHeightPxHalf - 25), command=self.folderUp, image="icons/FolderUp.png", image_scale=14, image_pos=(0,0,4), ) self.btnFolderUp.setTransparency(TransparencyAttrib.M_multisample) if self.tt is not None: self.btnFolderUp.bind(DGG.ENTER, self.tt.show, ["Move up one level"]) self.btnFolderUp.bind(DGG.EXIT, self.tt.hide) x += 28 self.btnFolderNew = DirectButton( parent=self.mainFrame, relief=1, frameColor = ( (0.8, 0.8, 0.8, 1), # Normal (0.9, 0.9, 1, 1), # Click (0.8, 0.8, 1, 1), # Hover (0.5, 0.5, 0.5, 1)), # Disabled frameSize=(-14, 14, -10, 18), pos=LPoint3f(x, 0, self.screenHeightPxHalf - 25), command=self.folderNew, image="icons/FolderNew.png", image_scale=14, image_pos=(0,0,4), ) self.btnFolderNew.setTransparency(TransparencyAttrib.M_multisample) if self.tt is not None: self.btnFolderNew.bind(DGG.ENTER, self.tt.show, ["Create new folder"]) self.btnFolderNew.bind(DGG.EXIT, self.tt.hide) x += 28 self.btnFolderShowHidden = DirectButton( parent=self.mainFrame, relief=1, frameColor = ( (0.8, 0.8, 0.8, 1), # Normal (0.9, 0.9, 1, 1), # Click (0.8, 0.8, 1, 1), # Hover (0.5, 0.5, 0.5, 1)), # Disabled frameSize=(-14, 14, -10, 18), pos=LPoint3f(x, 0, self.screenHeightPxHalf - 25), command=self.folderShowHidden, image="icons/FolderShowHidden.png", image_scale=14, image_pos=(0,0,4), ) self.btnFolderShowHidden.setTransparency(TransparencyAttrib.M_multisample) if self.tt is not None: self.btnFolderShowHidden.bind(DGG.ENTER, self.tt.show, ["Show/Hide hidden files and folders"]) self.btnFolderShowHidden.bind(DGG.EXIT, self.tt.hide) color = ( (0.8, 0.8, 0.8, 1), # Normal (0.9, 0.9, 1, 1), # Click (0.8, 0.8, 1, 1), # Hover (0.5, 0.5, 0.5, 1)) # Disabled self.container = DirectScrolledFrame( relief=DGG.RIDGE, borderWidth=(2, 2), frameColor=(1, 1, 1, 1), frameSize=(-self.screenWidthPxHalf+10, self.screenWidthPxHalf-10, -self.screenHeightPxHalf+50, self.screenHeightPxHalf-50), canvasSize=(-self.screenWidthPxHalf+31, self.screenWidthPxHalf-10, -self.screenHeightPxHalf+50, self.screenHeightPxHalf-50), pos=LPoint3f(0, 0, 0), parent=self.mainFrame, scrollBarWidth=20, verticalScroll_scrollSize=20, verticalScroll_thumb_relief=DGG.FLAT, verticalScroll_incButton_relief=DGG.FLAT, verticalScroll_decButton_relief=DGG.FLAT, verticalScroll_thumb_frameColor=color, verticalScroll_incButton_frameColor=color, verticalScroll_decButton_frameColor=color, horizontalScroll_thumb_relief=DGG.FLAT, horizontalScroll_incButton_relief=DGG.FLAT, horizontalScroll_decButton_relief=DGG.FLAT, horizontalScroll_thumb_frameColor=color, horizontalScroll_incButton_frameColor=color, horizontalScroll_decButton_frameColor=color, state=DGG.NORMAL, ) self.container.bind(DGG.MWDOWN, self.scroll, [0.01]) self.container.bind(DGG.MWUP, self.scroll, [-0.01]) self.btnOk = DirectButton( parent=self.mainFrame, relief=1, frameColor = ( (0.8, 0.8, 0.8, 1), # Normal (0.9, 0.9, 1, 1), # Click (0.8, 0.8, 1, 1), # Hover (0.5, 0.5, 0.5, 1)), # Disabled frameSize=(-45, 45, -6, 14), pos=LPoint3f(self.screenWidthPxHalf-160, 0, -self.screenHeightPxHalf+25), text = "ok", text_scale=12, command=command, extraArgs=[1], ) self.btnCancel = DirectButton( parent=self.mainFrame, relief=1, frameColor = ( (0.8, 0.8, 0.8, 1), # Normal (0.9, 0.9, 1, 1), # Click (0.8, 0.8, 1, 1), # Hover (0.5, 0.5, 0.5, 1)), # Disabled frameSize=(-45, 45, -6, 14), pos=LPoint3f(self.screenWidthPxHalf-55, 0, -self.screenHeightPxHalf+25), text = "Cancel", text_scale=12, command=command, extraArgs=[0] ) if self.showFiles: self.txtFileName = DirectEntry( parent=self.mainFrame, relief=DGG.SUNKEN, frameColor=(1, 1, 1, 1), pad=(0.2, 0.2), pos=LPoint3f(-self.screenWidthPxHalf+25, 0, -self.screenHeightPxHalf+25), scale=12, width=200/12, overflow=True, command=self.filenameAccept, initialText=defaultFilename, focusInCommand=base.messenger.send, focusInExtraArgs=["unregisterKeyboardEvents"], focusOutCommand=base.messenger.send, focusOutExtraArgs=["reregisterKeyboardEvents"], ) self.newFolderFrame = DirectFrame( parent=self.mainFrame, relief=1, frameSize=(-self.screenWidthPxHalf+10,self.screenWidthPxHalf-10,-20,20), pos=LPoint3f(0, 0, self.screenHeightPxHalf-55), frameColor=(0.5,0.5,0.5,1), ) self.txtNewFolderName = DirectLabel( parent=self.newFolderFrame, text="New Folder Name", text_scale=12, frameColor=(0,0,0,0), text_align=TextNode.ALeft, pos=(-self.screenWidthPxHalf+15, 0, -3), ) self.folderName = DirectEntry( parent=self.newFolderFrame, relief=DGG.SUNKEN, frameColor=(1, 1, 1, 1), pad=(0.2, 0.2), pos=LPoint3f(-self.screenWidthPxHalf+25 + self.txtNewFolderName.getWidth(), 0, -4), scale=12, width=((self.screenWidthPxHalf-25)*2-self.txtNewFolderName.getWidth() - 100)/12, overflow=True, command=self.entryAccept, initialText="New Folder", focusInCommand=base.messenger.send, focusInExtraArgs=["unregisterKeyboardEvents"], focusOutCommand=base.messenger.send, focusOutExtraArgs=["reregisterKeyboardEvents"], ) self.btnCreate = DirectButton( parent=self.newFolderFrame, relief=1, frameColor = ( (0.8, 0.8, 0.8, 1), # Normal (0.9, 0.9, 1, 1), # Click (0.8, 0.8, 1, 1), # Hover (0.5, 0.5, 0.5, 1)), # Disabled frameSize=(-45, 45, -6, 14), pos=LPoint3f(self.screenWidthPxHalf-65, 0, -4), text = "Create", text_scale=12, command=self.folderCreate, extraArgs=[0] ) self.newFolderFrame.hide() self.folderReload() # handle window resizing self.prevScreenSize = base.getSize() self.accept("window-event", self.windowEventHandler)
class BufferViewer(DraggableWindow): """ This class provides a view into the buffers to inspect them """ def __init__(self, pipeline, parent): """ Constructs the buffer viewer """ DraggableWindow.__init__(self, width=1400, height=800, parent=parent, title="Buffer- and Image-Browser") self._pipeline = pipeline self._scroll_height = 3000 self._display_images = False self._stages = [] self._create_components() self._tex_preview = TexturePreview(self._pipeline, parent) self._tex_preview.hide() self.hide() def toggle(self): """ Updates all the buffers and then toggles the buffer viewer """ if self._visible: self._remove_components() self.hide() else: self._perform_update() self.show() @property def entries(self): """ Returns a list of all registered entries """ return RenderTarget.REGISTERED_TARGETS + Image.REGISTERED_IMAGES @property def stage_information(self): """ Returns the amount of attached stages, and also the memory consumed in MiB in a tuple. """ count, memory = 0, 0 for entry in self.entries: if isinstance(entry, Texture): memory += entry.estimate_texture_memory() count += 1 elif entry.__class__.__name__ == "RenderTarget": for target in itervalues(entry.targets): memory += target.estimate_texture_memory() count += 1 else: self.warn("Unkown type:", entry.__class__.__name__) return memory, count def _create_components(self): """ Creates the window components """ DraggableWindow._create_components(self) self._content_frame = DirectScrolledFrame( frameSize=(0, self._width - 15, 0, self._height - 70), canvasSize=(0, self._width - 80, 0, self._scroll_height), autoHideScrollBars=False, scrollBarWidth=12.0, frameColor=(0, 0, 0, 0), verticalScroll_relief=DGG.FLAT, verticalScroll_incButton_relief=DGG.FLAT, verticalScroll_decButton_relief=DGG.FLAT, verticalScroll_thumb_relief=DGG.FLAT, verticalScroll_frameColor=(0.05, 0.05, 0.05, 1), verticalScroll_thumb_frameColor=(0.8, 0.8, 0.8, 1), verticalScroll_incButton_frameColor=(0.6, 0.6, 0.6, 1), verticalScroll_decButton_frameColor=(0.6, 0.6, 0.6, 1), horizontalScroll_frameColor=(0, 0, 0, 0), horizontalScroll_relief=False, horizontalScroll_thumb_relief=False, horizontalScroll_incButton_relief=False, horizontalScroll_decButton_relief=False, parent=self._node, pos=(0, 1, -self._height)) self._content_node = self._content_frame.getCanvas().attach_new_node( "BufferComponents") self._content_node.set_scale(1, 1, -1) self._content_node.set_z(self._scroll_height) self._chb_show_images = LabeledCheckbox( parent=self._node, x=10, y=43, chb_callback=self._set_show_images, chb_checked=False, text="Display image resources", text_color=Vec3(0.4), expand_width=330) def _set_show_images(self, arg): """ Sets whether images and textures will be shown """ self._display_images = arg self._perform_update() def _set_scroll_height(self, height): """ Sets the maximum scroll height in the content frame """ self._scroll_height = height self._content_frame["canvasSize"] = (0, self._width - 80, 0, self._scroll_height) self._content_node.set_z(self._scroll_height) def _remove_components(self): """ Removes all components of the buffer viewer """ self._content_node.node().remove_all_children() self._tex_preview.hide() def _perform_update(self): """ Collects all entries, extracts their images and re-renders the window """ # Collect texture stages self._stages = [] for entry in sorted(self.entries, key=lambda entry: entry.sort): if isinstance(entry, Texture): if self._display_images: self._stages.append(entry) # Can not use isinstance or we get circular import references elif entry.__class__.__name__ == "RenderTarget": for target in itervalues(entry.targets): self._stages.append(target) else: self.warn("Unrecognized instance!", entry.__class__) self._render_stages() def _on_texture_hovered(self, hover_frame, evt=None): # pylint: disable=unused-argument """ Internal method when a texture is hovered """ hover_frame["frameColor"] = (0, 0, 0, 0.1) def _on_texture_blurred(self, hover_frame, evt=None): # pylint: disable=unused-argument """ Internal method when a texture is blurred """ hover_frame["frameColor"] = (0, 0, 0, 0) def _on_texture_clicked(self, tex_handle, evt=None): # pylint: disable=unused-argument """ Internal method when a texture is blurred """ self._tex_preview.present(tex_handle) def _render_stages(self): """ Renders the stages to the window """ self._remove_components() entries_per_row = 6 aspect = Globals.native_resolution.y / Globals.native_resolution.x entry_width = 235 entry_height = (entry_width - 20) * aspect + 55 # Store already processed images processed = set() index = -1 # Iterate over all stages for stage_tex in self._stages: if stage_tex in processed: continue processed.add(stage_tex) index += 1 stage_name = stage_tex.get_name() xoffs = index % entries_per_row yoffs = index // entries_per_row node = self._content_node.attach_new_node("Preview") node.set_sz(-1) node.set_pos(10 + xoffs * (entry_width - 14), 1, yoffs * (entry_height - 14 + 10)) r, g, b = 0.2, 0.2, 0.2 if isinstance(stage_tex, Image): r, g, b = 0.2, 0.4, 0.6 stage_name = stage_name.replace("render_pipeline_internal:", "") parts = stage_name.split(":") stage_name = parts[-1] DirectFrame(parent=node, frameSize=(7, entry_width - 17, -7, -entry_height + 17), frameColor=(r, g, b, 1.0), pos=(0, 0, 0)) frame_hover = DirectFrame(parent=node, frameSize=(0, entry_width - 10, 0, -entry_height + 10), frameColor=(0, 0, 0, 0), pos=(0, 0, 0), state=DGG.NORMAL) frame_hover.bind(DGG.ENTER, partial(self._on_texture_hovered, frame_hover)) frame_hover.bind(DGG.EXIT, partial(self._on_texture_blurred, frame_hover)) frame_hover.bind(DGG.B1PRESS, partial(self._on_texture_clicked, stage_tex)) Text(text=stage_name, x=15, y=29, parent=node, size=12, color=Vec3(0.8)) # Scale image so it always fits w, h = stage_tex.get_x_size(), stage_tex.get_y_size() padd_x, padd_y = 24, 57 scale_x = (entry_width - padd_x) / max(1, w) scale_y = (entry_height - padd_y) / max(1, h) scale_factor = min(scale_x, scale_y) if stage_tex.get_texture_type() == Image.TT_buffer_texture: scale_factor = 1 w = entry_width - padd_x h = entry_height - padd_y preview = Sprite(image=stage_tex, w=scale_factor * w, h=scale_factor * h, any_filter=False, parent=node, x=7, y=40, transparent=False) preview.set_shader_input("mipmap", 0) preview.set_shader_input("slice", 0) preview.set_shader_input("brightness", 1) preview.set_shader_input("tonemap", False) preview_shader = DisplayShaderBuilder.build( stage_tex, scale_factor * w, scale_factor * h) preview.set_shader(preview_shader) num_rows = (index + entries_per_row) // entries_per_row self._set_scroll_height(50 + (entry_height - 14 + 10) * num_rows)
class MessageFrm(GameObject): def __init__(self, menu_props): GameObject.__init__(self) self.eng.log('created message form') self.chats = [] self.curr_chat = None self.curr_match_room = None self.msg_frm = DirectFrame( frameSize=(-.02, .8, 0, .45), frameColor=(.2, .2, .2, .5), pos=(-.82, 1, .02), parent=base.a2dBottomRight) self.presences_sent = [] self.menu_props = menu_props t_a = menu_props.text_args t_a['scale'] = .05 t_a['fg'] = menu_props.text_normal_col self.dst_txt = OnscreenText( text='', pos=(0, .4), parent=self.msg_frm, align=TextNode.A_left, **t_a) self.arrow_btn = ImgBtn( parent=self.msg_frm, scale=(.024, .024), pos=(.7, 1, .42), frame_col=(1, 1, 1, 1), frame_texture='assets/images/gui/arrow.txo', cmd=self.on_arrow, **menu_props.imgbtn_args) self.arrow_btn.disable() self.close_btn = ImgBtn( parent=self.msg_frm, scale=(.024, .024), pos=(.76, 1, .42), frame_col=(1, 1, 1, 1), frame_texture='assets/images/gui/close.txo', cmd=self.on_close, **menu_props.imgbtn_args) self.close_btn.disable() self.ent = Entry( scale=.04, pos=(0, .03), entry_font=menu_props.font, width=19.5, frame_col=menu_props.btn_col, parent=self.msg_frm, initial_text=_('write here your message'), cmd=self.on_typed_msg, focus_in_cmd=self.on_focus, focus_in_args=['in'], focus_out_cmd=self.on_focus, focus_out_args=['out'], text_fg=menu_props.text_active_col) self.ent['state'] = DISABLED self.txt_frm = DirectScrolledFrame( frameSize=(-.02, .76, -.02, .28), canvasSize=(-.02, .72, -.02, .28), scrollBarWidth=.036, verticalScroll_relief=FLAT, verticalScroll_frameColor=(.2, .2, .2, .4), verticalScroll_thumb_relief=FLAT, verticalScroll_thumb_frameColor=(.8, .8, .8, .6), verticalScroll_incButton_relief=FLAT, verticalScroll_incButton_frameColor=(.8, .8, .8, .6), verticalScroll_decButton_relief=FLAT, verticalScroll_decButton_frameColor=(.8, .8, .8, .6), horizontalScroll_relief=FLAT, frameColor=(1, 1, 1, 0), pos=(.02, 1, .11), parent=self.msg_frm) t_a['scale'] = .046 self.msg_txt = OnscreenText( text='', pos=(0, .24), parent=self.txt_frm.getCanvas(), align=TextNode.A_left, wordwrap=14, **t_a) lab_args = menu_props.label_args lab_args['scale'] = .046 lab_args['text_fg'] = menu_props.text_normal_col self.lab_frm = Btn( frame_size=(-.02, .64, -.01, .05), frame_col=(1, 1, 1, 0), pos=(0, 1, .4), parent=self.msg_frm) self.lab_frm.bind(ENTER, self.on_enter) self.lab_frm.bind(EXIT, self.on_exit) self.tooltip = Label( text='', pos=(.78, 1, -.06), parent=self.lab_frm, text_wordwrap=16,# text_bg=(.2, .2, .2, .8), text_align=TextNode.A_right, **lab_args) self.tooltip.set_bin('gui-popup', 10) self.tooltip.hide() def on_enter(self, pos): self.tooltip.show() def on_exit(self, pos): self.tooltip.hide() def show(self): self.msg_frm.show() def hide(self): self.msg_frm.hide() def add_msg_txt(self, msg): self.msg_txt['text'] += ('\n' if self.msg_txt['text'] else '') + msg txt_height = self.msg_txt.textNode.getUpperLeft3d()[2] - \ self.msg_txt.textNode.getLowerRight3d()[2] self.txt_frm['canvasSize'] = (-.02, .72, .28 - txt_height, .28) def set_title(self, title): ttitle = self.trunc(title, 32) fix_name = lambda name: name if '@' not in name else name.split('@')[0] + '\1smaller\1@' + name.split('@')[1] + '\2' if title: if ',' in ttitle: is_muc = True ttitle = ttitle names = ttitle.split(',') names = [name.strip() for name in names] names = [fix_name(name) for name in names] ttitle = ', '.join(names) else: ttitle = fix_name(ttitle) self.dst_txt['text'] = ttitle self.tooltip['text'] = title @staticmethod def trunc(name, lgt): if len(name) > lgt: return name[:lgt] + '...' return name def set_chat(self, chat): self.curr_chat = chat self.set_title(chat.title) self.msg_txt['text'] = '\n'.join(chat.messages) txt_height = self.msg_txt.textNode.getUpperLeft3d()[2] - \ self.msg_txt.textNode.getLowerRight3d()[2] self.txt_frm['canvasSize'] = (-.02, .72, .28 - txt_height, .28) if not self.chats: self.close_btn.disable() self.ent['state'] = DISABLED elif len(self.chats) == 1: self.close_btn.enable() self.ent['state'] = NORMAL self.arrow_btn.disable() else: self.close_btn.enable() self.ent['state'] = NORMAL self.arrow_btn.enable() if all(_chat.read for _chat in self.chats): self.arrow_btn['frameTexture'] = 'assets/images/gui/arrow.txo' else: self.arrow_btn['frameTexture'] = 'assets/images/gui/message.txo' def on_arrow(self): chat_idx = self.chats.index(self.curr_chat) next_idx = (chat_idx + 1) % len(self.chats) chat = self.chats[next_idx] self.set_title(chat.title) chat.read = True self.set_chat(chat) @property def open_chats(self): return [chat for chat in self.chats if not chat.closed] def on_close(self): if self.curr_chat not in self.open_chats: return curr_idx = self.open_chats.index(self.curr_chat) #self.chats.remove(self.curr_chat) self.curr_chat.closed = True if self.open_chats: self.set_chat(self.open_chats[curr_idx - 1]) else: self.set_chat(Chat('')) self.notify('on_close_all_chats') def on_typed_msg(self, val): self.add_msg_txt('\1italic\1' + _('you') + '\2: ' + val) self.ent.set('') #if self.curr_chat.dst not in self.presences_sent and \ # not str(self.curr_chat.dst).startswith('yorg'): # self.eng.xmpp.client.send_presence( # pfrom=self.eng.xmpp.client.boundjid.full, # pto=self.curr_chat.dst) # self.presences_sent += [self.curr_chat.dst] #if str(self.curr_chat.dst).startswith('yorg'): # self.eng.xmpp.client.send_message( # mfrom=self.eng.xmpp.client.boundjid.full, # mto=self.curr_chat.dst, # mtype='groupchat', # mbody=val) #else: # self.eng.xmpp.client.send_message( # mfrom=self.eng.xmpp.client.boundjid.full, # mto=self.curr_chat.dst, # msubject='chat', # mbody=val) if len(self.curr_chat.dst) > 12 and all(char.isdigit() for char in self.curr_chat.dst[-12:]): self.eng.client.send([ 'msg_room', self.eng.client.myid, self.curr_chat.dst, val]) else: self.eng.client.send(['msg', self.eng.client.myid, self.curr_chat.dst, val]) msg = '\1italic\1' + _('you') + '\2: ' + val self.curr_chat.messages += [msg] self.ent['focus'] = 1 def on_msg(self, from_, to, txt): #src = str(JID(msg['from']).bare) #src = src.split('@')[0] + '\1smaller\1@' + src.split('@')[1] + '\2' str_msg = '\1italic\1' + from_ + '\2: ' + txt chat = self.__find_chat(from_) if not chat: chat = Chat(from_) self.chats += [chat] chat.messages += [str_msg] if self.dst_txt['text'] == '': self.set_chat(chat) elif self.curr_chat.dst == from_: self.add_msg_txt(str_msg) else: chat.read = False chat.closed = False self.arrow_btn['frameTexture'] = 'assets/images/gui/message.txo' def on_groupchat_msg(self, from_, to, txt): #if str(JID(msg['from']).bare) == self.curr_match_room: if to == self.curr_match_room: if self.match_msg_frm: # we're still in the room page self.match_msg_frm.on_groupchat_msg(from_, to, txt) #src = str(JID(msg['mucnick'])) #src = src.split('@')[0] + '\1smaller\1@' + src.split('@')[1] + '\2' src = from_ #self.eng.log('received groupchat message from %s in the chat %s' %(msg['mucnick'], JID(msg['from']).bare)) self.eng.log('received groupchat message from %s in the chat %s' % (from_, to)) #str_msg = '\1italic\1' + src + '\2: ' + str(msg['body']) str_msg = '\1italic\1' + src + '\2: ' + txt chat = self.curr_chat if not chat: #chat = MUC(str(JID(msg['from']).bare)) chat = MUC(to) self.chats += [chat] chat.messages += [str_msg] if self.dst_txt['text'] == '': self.set_chat(chat) #elif self.curr_chat.dst == str(JID(msg['from']).bare): elif self.curr_chat.dst == to: self.add_msg_txt(str_msg) else: chat.read = False chat.closed = False self.arrow_btn['frameTexture'] = 'assets/images/gui/message.txo' def on_presence_available_room(self, uid, room): if room == self.curr_match_room: self.match_msg_frm.on_presence_available_room(uid, room) #room = str(JID(msg['muc']['room']).bare) #nick = str(msg['muc']['nick']) self.eng.log('user %s has logged in the chat %s' %(uid, room)) chat = self.__find_chat(room) chat.users += [uid] if room != self.curr_match_room: if self.curr_chat.dst == room: self.set_title(chat.title) def on_presence_unavailable_room(self, uid, room_name): if self.match_msg_frm and room_name == self.curr_match_room: self.match_msg_frm.on_presence_unavailable_room(uid, room_name) return room = room_name nick = uid self.eng.log('user %s has left the chat %s' %(nick, room)) chat = self.__find_chat(room) if nick == self.eng.client.myid: self.on_close() else: chat.users.remove(nick) if self.curr_chat.dst == room: self.set_title(chat.title) def __find_chat(self, dst): chats = [chat for chat in self.chats if chat.dst == dst] if chats: return chats[0] def add_chat(self, usr): #self.set_title(JID(usr).bare) chat = self.__find_chat(usr) if not chat: chat = Chat(usr) self.chats += [chat] self.set_chat(chat) self.ent['focus'] = 1 def add_groupchat(self, room, usr): self.set_title(usr) chat = self.__find_chat(room) if not chat: chat = MUC(room) self.chats += [chat] chat.users += [usr] self.set_chat(chat) self.add_match_chat(room, usr) def remove_groupchat(self): self.match_msg_frm.detach(self.on_match_msg_focus) self.match_msg_frm = self.match_msg_frm.destroy() def on_focus(self, val): if val and self.ent.get() == _('write here your message'): self.ent.set('') self.notify('on_msg_focus', val) def on_match_msg_focus(self, val): self.notify('on_msg_focus', val) def on_room_back(self): self.curr_match_room = None self.match_msg_frm.destroy() def add_match_chat(self, room, usr): if self.curr_match_room: return self.curr_match_room = room self.match_msg_frm = MatchMsgFrm(self.menu_props) self.match_msg_frm.attach(self.on_match_msg_focus) self.match_msg_frm.add_groupchat(room, usr)
class TextHistory(SogalForm): ''' Text history form ''' def __init__(self): ''' Constructor ''' SogalForm.__init__(self, fading = True, fading_duration = 0.3, enableMask = True,backgroundColor = (0,0,0,0.6)) self.reparentTo(aspect2d,sort = 101) self.frame = DirectScrolledFrame(parent = self, canvasSize = CANVASSIZE, frameSize = FRAMESIZE, autoHideScrollBars = AUTO_HIDE_SCROLLBARS, ) self.reloadTheme() self.height = TOP self.shiftedHeight = 0 self.shifter = NodePath('text_history_shifter') self.shifter.reparentTo(self.frame.getCanvas()) if not prop_set_up: nameprops = TextProperties() # @UndefinedVariable nameprops.setTextScale(0.75) TextPropertiesManager.getGlobalPtr().setProperties("th_name", nameprops) # @UndefinedVariable self.labels = [] def destroy(self): self.labels = [] self.shifter.removeNode() SogalForm.destroy(self) def append(self,text,speaker,voiceName): if len(self.labels) >= MAXENTITIES: self.removeHead() label = TextHistoryLabel(text, speaker, voiceName, parent = self.shifter, height=self.height) self.height += label.getLabelHeight() + SPACING self.labels.append(label) self.resetCanvasSize() def removeHead(self): removing = self.labels.pop(0) h = removing.getLabelHeight() + SPACING self.shiftedHeight += h self.shifter.setZ(self.shifter.getZ() + h) #shift the parent NodePath to move all labels up removing.destroy() self.frame.verticalScroll.setValue(1) def resetCanvasSize(self): self.frame['canvasSize'] = (CANVASSIZE[0],CANVASSIZE[1],- TOP - self.height + self.shiftedHeight, 0) self.frame.verticalScroll.setValue(1) def roll(self,value): if self.labels: self.frame.verticalScroll.setValue(self.frame.verticalScroll.getValue() + value*2.0/len(self.labels)) def focused(self): self.accept('mouse1', self.hide) self.accept('mouse2', self.hide) self.accept('mouse3', self.hide) self.accept('escape', self.hide) self.accept('wheel_up', self.roll, [-1.0]) #self.accept('wheel_down', self.wheeldown) self.accept('wheel_down', self.roll, [1.0]) self.accept('arrow_up-repeat', self.roll, [-1.0]) self.accept('arrow_down-repeat', self.roll, [1.0]) self.accept('arrow_up', self.roll, [-1.0]) self.accept('arrow_down', self.roll, [1.0]) self.accept('w-repeat', self.roll, [-1.0]) self.accept('s-repeat', self.roll, [1.0]) self.accept('w', self.roll, [-1.0]) self.accept('s', self.roll, [1.0]) SogalForm.focused(self) def defocused(self): self.ignore('mouse1') self.ignore('mouse2') self.ignore('mouse3') self.ignore('escape') self.ignore('wheel_up') self.ignore('wheel_down') self.ignore('arrow_up-repeat') self.ignore('arrow_down-repeat') self.ignore('arrow_up') self.ignore('arrow_down') self.ignore('w-repeat') self.ignore('s-repeat') self.ignore('w') self.ignore('s') SogalForm.defocused(self) def hide(self): self.removeFocus() SogalForm.hide(self) def wheeldown(self): if self.frame.verticalScroll.getValue() < 1: self.roll(1.0) else: self.hide() def reloadTheme(self): di = base.getStyle('frame') for key in di: self.frame[key] = di[key]
def __init__(self, rootParent=None): self.frmInventory = DirectFrame( frameColor=(0.2, 0.2, 0.2, 1.0), frameSize=(-0.3, 0.3, -0.5, 0.5), hpr=LVecBase3f(0, 0, 0), pos=LPoint3f(0.725, 0, 0.2), parent=rootParent, ) self.frmInventory.setTransparency(0) self.frmContent = DirectScrolledFrame( canvasSize=(-0.8, 0.8, -0.8, 0.8), frameColor=(0.2, 0.2, 0.2, 1.0), frameSize=(-0.8, 0.8, -0.8, 0.8), hpr=LVecBase3f(0, 0, 0), pos=LPoint3f(-0.475, 0, 0.1), scrollBarWidth=0.08, state='normal', horizontalScroll_borderWidth=(0.01, 0.01), horizontalScroll_frameSize=(-0.05, 0.05, -0.04, 0.04), horizontalScroll_hpr=LVecBase3f(0, 0, 0), horizontalScroll_pos=LPoint3f(0, 0, 0), horizontalScroll_decButton_borderWidth=(0.01, 0.01), horizontalScroll_decButton_frameSize=(-0.05, 0.05, -0.04, 0.04), horizontalScroll_decButton_hpr=LVecBase3f(0, 0, 0), horizontalScroll_decButton_pos=LPoint3f(0, 0, 0), horizontalScroll_incButton_borderWidth=(0.01, 0.01), horizontalScroll_incButton_frameSize=(-0.05, 0.05, -0.04, 0.04), horizontalScroll_incButton_hpr=LVecBase3f(0, 0, 0), horizontalScroll_incButton_pos=LPoint3f(0, 0, 0), horizontalScroll_thumb_borderWidth=(0.01, 0.01), horizontalScroll_thumb_hpr=LVecBase3f(0, 0, 0), horizontalScroll_thumb_pos=LPoint3f(0, 0, 0), verticalScroll_borderWidth=(0.01, 0.01), verticalScroll_frameSize=(-0.04, 0.04, -0.05, 0.05), verticalScroll_hpr=LVecBase3f(0, 0, 0), verticalScroll_pos=LPoint3f(0, 0, 0), verticalScroll_decButton_borderWidth=(0.01, 0.01), verticalScroll_decButton_frameSize=(-0.04, 0.04, -0.05, 0.05), verticalScroll_decButton_hpr=LVecBase3f(0, 0, 0), verticalScroll_decButton_pos=LPoint3f(0, 0, 0), verticalScroll_incButton_borderWidth=(0.01, 0.01), verticalScroll_incButton_frameSize=(-0.04, 0.04, -0.05, 0.05), verticalScroll_incButton_hpr=LVecBase3f(0, 0, 0), verticalScroll_incButton_pos=LPoint3f(0, 0, 0), verticalScroll_thumb_borderWidth=(0.01, 0.01), verticalScroll_thumb_hpr=LVecBase3f(0, 0, 0), verticalScroll_thumb_pos=LPoint3f(0, 0, 0), parent=rootParent, ) self.frmContent.setTransparency(1) self.btnQuit = DirectButton( frameSize=(-3.0, 3.0, -0.3, 0.9), hpr=LVecBase3f(0, 0, 0), pos=LPoint3f(0.725, 0, -0.85), scale=LVecBase3f(0.1, 0.1, 0.1), text='Quit', text_align=TextNode.A_center, text_scale=(1, 1), text_pos=(0, 0), text_fg=LVecBase4f(0, 0, 0, 1), text_bg=LVecBase4f(0, 0, 0, 0), text_wordwrap=None, parent=rootParent, command=base.messenger.send, extraArgs=["quitGame"], pressEffect=1, ) self.btnQuit.setTransparency(0) self.btnAudioToggle = DirectButton( frameSize=(-3.0, 3.0, -0.3, 0.9), hpr=LVecBase3f(0, 0, 0), pos=LPoint3f(0.725, 0, -0.7), scale=LVecBase3f(0.1, 0.1, 0.1), text='Audio On', text_align=TextNode.A_center, text_scale=(1, 1), text_pos=(0, 0), text_fg=LVecBase4f(0, 0, 0, 1), text_bg=LVecBase4f(0, 0, 0, 0), text_wordwrap=None, parent=rootParent, command=base.messenger.send, extraArgs=["toggleAudio"], pressEffect=1, ) self.btnAudioToggle.setTransparency(0) self.frmBorderOverlay = DirectFrame( frameColor=(1.0, 1.0, 1.0, 0.0), frameSize=(-0.8, 0.8, -0.8, 0.8), hpr=LVecBase3f(0, 0, 0), image='gameScreen/border.png', pos=LPoint3f(-0.475, 0, 0.1), image_scale=LVecBase3f(0.8, 1, 0.8), image_pos=LPoint3f(0, 0, 0), parent=rootParent, ) self.frmBorderOverlay.setTransparency(1) self.lblInventory = DirectLabel( frameColor=(0.8, 0.8, 0.8, 0.0), hpr=LVecBase3f(0, 0, 0), pos=LPoint3f(0.725, 0, 0.775), scale=LVecBase3f(0.1, 0.1, 0.1), text='Inventory', text_align=TextNode.A_center, text_scale=(1, 1), text_pos=(0, 0), text_fg=LVecBase4f(0.9, 0.9, 0.9, 1), text_bg=LVecBase4f(0, 0, 0, 0), text_wordwrap=None, parent=rootParent, ) self.lblInventory.setTransparency(0) self.lblStory = DirectLabel( frameSize=(-0.125, 12.0, -0.313, 0.925), hpr=LVecBase3f(0, 0, 0), pad=(0.2, 0.2), pos=LPoint3f(-1.26, 0, -0.845), scale=LVecBase3f(0.1, 0.1, 0.1), text='', text_align=TextNode.A_left, text_scale=(0.4, 0.4), text_pos=(0.0, 0.4), text_fg=LVecBase4f(0, 0, 0, 1), text_bg=LVecBase4f(0, 0, 0, 0), text_wordwrap=29.8, parent=rootParent, ) self.lblStory.setTransparency(0) self.btnContinue = DirectButton( frameSize=(-1.8, 1.8, -0.3, 0.9), hpr=LVecBase3f(0, 0, 0), pos=LPoint3f(0.145, 0, -0.845), scale=LVecBase3f(0.1, 0.1, 0.1), text='Cont.', text_align=TextNode.A_center, text_scale=(1, 1), text_pos=(0, 0), text_fg=LVecBase4f(0, 0, 0, 1), text_bg=LVecBase4f(0, 0, 0, 0), text_wordwrap=None, parent=rootParent, command=base.messenger.send, extraArgs=["story_continue"], pressEffect=1, ) self.btnContinue.setTransparency(0) self.frmFadeOverlay = DirectFrame( frameColor=(0.0, 0.0, 0.0, 1.0), frameSize=(-0.8, 0.8, -0.8, 0.8), hpr=LVecBase3f(0, 0, 0), pos=LPoint3f(-0.475, 0, 0.1), parent=rootParent, ) self.frmFadeOverlay.setTransparency(1)
class LoadForm(SogalForm): ''' Form of saving ''' def __init__(self): ''' Constructor ''' SogalForm.__init__(self, fading=True, fading_duration=0.5, enableMask=True, backgroundColor=color_themes.sirius_bgColor) self.reparentTo(aspect2d, sort=102) self.frame = DirectScrolledFrame( parent=self, canvasSize=LOAD_CANVAS_SIZE, frameSize=FRAMESIZE, autoHideScrollBars=AUTO_HIDE_SCROLLBARS, **color_themes.sirius_frame) self.labels = [] self.labelDict = {} self.vbox = VLayout(parent=self.frame.getCanvas(), margin=vspacing) hbox = None self.__dumped = None pos2 = MAX_SAVE + runtime_data.MAX_QUICKSAVE pos3 = MAX_SAVE + runtime_data.MAX_QUICKSAVE + runtime_data.MAX_AUTOSAVE for i in range(1, pos3 + 1): if i <= MAX_SAVE: fname = 'save' + str(i) head = str(i) elif MAX_SAVE < i <= pos2: index = i - MAX_SAVE fname = 'quick_save' + str(index) head = 'Quick Save ' + str(index) elif pos2 < i <= pos3: index = i - pos2 fname = 'auto_save' + str(index) head = 'Auto Save ' + str(index) label = SaveLoadLabel(command=self.load, always_enable=False, fileName=fname, head=head, extraArgs=[fname], style=color_themes.sirius_button) self.labels.append(label) self.labelDict[label.getFileName()] = label if not hbox: hbox = HLayout(margin=hspacing) self.vbox.append(hbox) hbox.append(label) else: hbox.append(label) hbox = None def roll(self, value): self.frame.verticalScroll.setValue( self.frame.verticalScroll.getValue() + value * LOAD_ROLL_SPEED) def setData(self, dumped, message): self.__dumped = dumped self.__message = message def reload(self): for label in self.labels: label.reload() def reloadMember(self, key): if self.labelDict.has_key(key): self.labelDict[key].reload() def load(self, fname): if base.isStarted(): ConfirmDialog(text='读取进度吗?', command=self.confirmedLoad, style='sirius', extraArgs=[fname]) else: self.confirmedLoad(fname) def confirmedLoad(self, fname): messenger.send('load_data', [fname]) self.hide() def focused(self): self.accept('mouse3', self.hide) self.accept('wheel_up', self.roll, [-1.0]) self.accept('wheel_down', self.roll, [1.0]) self.accept('arrow_up-repeat', self.roll, [-1.0]) self.accept('arrow_down-repeat', self.roll, [1.0]) self.accept('arrow_up', self.roll, [-1.0]) self.accept('arrow_down', self.roll, [1.0]) self.accept('w-repeat', self.roll, [-1.0]) self.accept('s-repeat', self.roll, [1.0]) self.accept('w', self.roll, [-1.0]) self.accept('s', self.roll, [1.0]) def defocused(self): self.ignore('mouse3') self.ignore('wheel_up') self.ignore('wheel_down') self.ignore('arrow_up-repeat') self.ignore('arrow_down-repeat') self.ignore('arrow_up') self.ignore('arrow_down') self.ignore('w-repeat') self.ignore('s-repeat') self.ignore('w') self.ignore('s')
class PipeViewer(DraggableWindow): """ Small tool which displays the order of the graphic pipes """ _STAGE_MGR = None @classmethod def register_stage_mgr(cls, mgr): """ Sets the stage manager, this is a workaround to prevent circular imports, since the pipe viewer is already included from the StageManager """ cls._STAGE_MGR = mgr def __init__(self, pipeline, parent): """ Constructs the pipe viewer """ DraggableWindow.__init__(self, width=1300, height=900, parent=parent, title="Pipeline Visualizer") self._pipeline = pipeline self._scroll_width = 8000 self._scroll_height = 2000 self._created = False self._create_components() self.hide() def toggle(self): """ Toggles the pipe viewer """ if self._visible: Globals.base.taskMgr.remove("UpdatePipeViewer") self.hide() else: Globals.base.taskMgr.add(self._update_task, "RP_GUI_UpdatePipeViewer") if not self._created: self._populate_content() self.show() def _update_task(self, task=None): """ Updates the viewer """ scroll_value = self._content_frame.horizontalScroll["value"] scroll_value *= 2.45 self._pipe_descriptions.set_x(scroll_value * 2759.0) return task.cont def _populate_content(self): """ Reads the pipes and stages from the stage manager and renders those into the window """ self._created = True self._pipe_node = self._content_node.attach_new_node("pipes") self._pipe_node.set_scale(1, 1, -1) self._stage_node = self._content_node.attach_new_node("stages") current_pipes = [] pipe_pixel_size = 3 pipe_height = 100 # Generate stages for offs, stage in enumerate(self._STAGE_MGR._stages): node = self._content_node.attach_new_node("stage") node.set_pos(220 + offs * 200.0, 0, 20) node.set_scale(1, 1, -1) DirectFrame(parent=node, frameSize=(10, 150, 0, -3600), frameColor=(0.2, 0.2, 0.2, 1)) BetterOnscreenText(text=str(stage.get_name().replace("Stage", "")), parent=node, x=20, y=25, size=15) for output_pipe, pipe_tex in iteritems(stage.get_produced_pipes()): pipe_idx = 0 r, g, b = rgb_from_string(output_pipe) if output_pipe in current_pipes: pipe_idx = current_pipes.index(output_pipe) else: current_pipes.append(output_pipe) pipe_idx = len(current_pipes) - 1 DirectFrame(parent=node, frameSize=(0, 8000, pipe_pixel_size / 2, -pipe_pixel_size / 2), frameColor=(r, g, b, 1), pos=(10, 1, -95 - pipe_idx * pipe_height)) w = 160 h = Globals.base.win.get_y_size() /\ float(Globals.base.win.get_x_size()) * w DirectFrame(parent=node, frameSize=(-pipe_pixel_size, w + pipe_pixel_size, h / 2 + pipe_pixel_size, -h / 2 - pipe_pixel_size), frameColor=(r, g, b, 1), pos=(0, 1, -95 - pipe_idx * pipe_height)) if isinstance(pipe_tex, (list, tuple)): pipe_tex = pipe_tex[0] if isinstance(pipe_tex, BaseUBO): icon_file = "Data/GUI/OnscreenDebugger/IconUBO.png" elif pipe_tex.get_z_size() > 1: icon_file = "Data/GUI/OnscreenDebugger/IconTexture.png" elif pipe_tex.get_texture_type() == Texture.TT_buffer_texture: icon_file = "Data/GUI/OnscreenDebugger/IconBufferTexture.png" else: icon_file = None preview = BetterOnscreenImage( image=pipe_tex, parent=node, x=0, y=50 + pipe_idx * pipe_height, w=w, h=h, any_filter=False, transparent=False) preview_shader = DisplayShaderBuilder.build(pipe_tex, int(w), int(h)) preview.set_shader(preview_shader) preview.set_shader_input("mipmap", 0) preview.set_shader_input("slice", 0) if icon_file: BetterOnscreenImage(image=icon_file, parent=node, x=55, y=65 + pipe_idx * pipe_height, w=48, h=48, near_filter=False, transparent=True) if isinstance(pipe_tex, BaseUBO): tex_desc = "UBO" else: tex_desc = pipe_tex.format_texture_type(pipe_tex.get_texture_type()) tex_desc += " - " + pipe_tex.format_format(pipe_tex.get_format()).upper() BetterOnscreenText( text=tex_desc, parent=node, x=55 + 48/2, y=130 + pipe_idx * pipe_height, color=Vec3(0.2), size=12, align="center") for input_pipe in stage.get_required_pipes(): idx = current_pipes.index(input_pipe) r, g, b = rgb_from_string(input_pipe) DirectFrame(parent=node, frameSize=(0, 10, 40, -40), frameColor=(r, g, b, 1), pos=(5, 1, -95 - idx * pipe_height)) self._pipe_descriptions = self._content_node.attach_new_node( "PipeDescriptions") self._pipe_descriptions.set_scale(1, 1, -1) DirectFrame(parent=self._pipe_descriptions, frameSize=(0, 190, 0, -5000), frameColor=(0.1, 0.1, 0.1, 1.0)) # Generate the pipe descriptions for idx, pipe in enumerate(current_pipes): r, g, b = rgb_from_string(pipe) DirectFrame(parent=self._pipe_descriptions, frameSize=(0, 180, -95, -135), frameColor=(r, g, b, 1.0), pos=(0, 1, -idx * pipe_height)) BetterOnscreenText(parent=self._pipe_descriptions, text=pipe, x=42, y=121 + idx * pipe_height, size=15, color=Vec3(0.1)) BetterOnscreenImage( parent=self._pipe_descriptions, x=9, y=103 + idx * pipe_height, image="Data/GUI/OnscreenDebugger/IconPipe.png", transparent=True, near_filter=False) def _create_components(self): """ Internal method to create the window components """ DraggableWindow._create_components(self) self._content_frame = DirectScrolledFrame( frameSize=(0, self._width - 40, 0, self._height - 80), canvasSize=(0, self._scroll_width, 0, self._scroll_height), autoHideScrollBars=False, scrollBarWidth=20.0, frameColor=(0, 0, 0, 0), verticalScroll_relief=False, horizontalScroll_relief=False, parent=self._node, pos=(20, 1, -self._height + 20)) self._content_node = self._content_frame.getCanvas().attach_new_node("PipeComponents") self._content_node.set_scale(1, 1, -1) self._content_node.set_z(self._scroll_height)
class UsersFrm(GameObject): def __init__(self, menu_args, yorg_srv): GameObject.__init__(self) self.eng.log('create users form') self.ver_check = VersionChecker() self.yorg_srv = yorg_srv self.room_name = None self.labels = [] self.invited_users = [] self.menu_args = menu_args lab_args = menu_args.label_args lab_args['scale'] = .046 self.users_lab = DirectLabel(text=_('Current online users'), pos=(-.85, 1, -.02), hpr=(0, 0, -90), parent=base.a2dTopRight, text_align=TextNode.A_right, **lab_args) self.frm = DirectScrolledFrame( frameSize=(-.02, .8, .45, 2.43), canvasSize=(-.02, .76, -.08, 3.8), scrollBarWidth=.036, verticalScroll_relief=FLAT, verticalScroll_frameColor=(.2, .2, .2, .4), verticalScroll_thumb_relief=FLAT, verticalScroll_thumb_frameColor=(.8, .8, .8, .6), verticalScroll_incButton_relief=FLAT, verticalScroll_incButton_frameColor=(.8, .8, .8, .6), verticalScroll_decButton_relief=FLAT, verticalScroll_decButton_frameColor=(.8, .8, .8, .6), horizontalScroll_relief=FLAT, frameColor=(.2, .2, .2, .5), pos=(-.82, 1, -2.44), parent=base.a2dTopRight) self.conn_lab = DirectLabel(text='', pos=(.38, 1, 1.5), parent=self.frm, text_wordwrap=10, **lab_args) self.set_connection_label() self.in_match_room = None def show(self): self.frm.show() self.users_lab.show() def hide(self): self.frm.hide() self.users_lab.hide() def set_connection_label(self): lab_args = self.menu_args.label_args lab_args['scale'] = .046 txt = '' if not self.ver_check.is_uptodate(): txt = _("Your game isn't up-to-date, please update") elif not self.eng.xmpp.client: txt = _("You aren't logged in") elif not self.eng.xmpp.is_server_up: txt = _("Yorg's server isn't running") self.conn_lab['text'] = txt def set_size(self, full=True): if full: self.frm.setPos(-.82, 1, -2.44) self.frm['frameSize'] = (-.02, .8, .45, 2.43) else: self.frm.setPos(-.82, 1, -1.97) self.frm['frameSize'] = (-.02, .8, .45, 1.96) @staticmethod def trunc(name, lgt): if len(name) > lgt: return name[:lgt] + '...' return name def on_users(self): self.set_connection_label() bare_users = [ self.trunc(user.name, 20) for user in self.eng.xmpp.users_nodup ] for lab in self.labels[:]: _lab = lab.lab.lab['text'].replace('\1smaller\1', '').replace('\2', '') if _lab not in bare_users: if _lab not in self.eng.xmpp.client.client_roster.keys(): lab.destroy() self.labels.remove(lab) nusers = len(self.eng.xmpp.users_nodup) invite_btn = len(self.invited_users) < 8 invite_btn = invite_btn and not self.in_match_room top = .08 * nusers + .08 self.frm['canvasSize'] = (-.02, .76, 0, top) label_users = [lab.lab.lab['text'] for lab in self.labels] clean = lambda n: n.replace('\1smaller\1', '').replace('\2', '') label_users = map(clean, label_users) for i, user in enumerate(self.eng.xmpp.users_nodup): usr_inv = invite_btn and user.is_in_yorg if self.trunc(user.name, 20) not in label_users: if self.eng.xmpp.client.boundjid.bare != user.name: lab = UserFrmList(self.trunc(user.name, 20), user, user.is_supporter, user.is_online, self.eng.xmpp.is_friend(user.name), user.is_in_yorg, user.is_playing, (0, 1, top - .08 - .08 * i), self.frm.getCanvas(), self.menu_args) else: lab = UserFrmListMe(self.trunc(user.name, 20), user, user.is_supporter, (0, 1, top - .08 - .08 * i), self.frm.getCanvas(), self.menu_args) self.labels += [lab] lab.attach(self.on_invite) lab.attach(self.on_friend) lab.attach(self.on_unfriend) lab.attach(self.on_add_chat) for i, user in enumerate(self.eng.xmpp.users_nodup): clean = lambda n: n.replace('\1smaller\1', '').replace('\2', '') lab = [ lab for lab in self.labels if clean(lab.lab.lab['text']) == self.trunc(user.name, 20) ][0] enb_val = usr_inv and user.name not in self.invited_users and user.is_in_yorg and not user.is_playing if hasattr(lab, 'invite_btn'): inv_btn = lab.invite_btn if enb_val: inv_btn.tooltip['text'] = _('invite the user to a match') elif len(self.invited_users) == 8: inv_btn.tooltip['text'] = _( "you can't invite more players") elif self.in_match_room: inv_btn.tooltip['text'] = _("you're already in a match") elif not user.is_in_yorg: inv_btn.tooltip['text'] = _("the user isn't playing yorg") elif user.name in self.invited_users: inv_btn.tooltip['text'] = _( "you've already invited this user") elif user.is_playing: inv_btn.tooltip['text'] = _( "the user is already playing a match") lab.enable_invite_btn(enb_val) lab.frm.set_z(top - .08 - .08 * i) lab.lab.set_supporter(user.is_supporter) lab.lab.set_online(user.is_online) def on_invite(self, usr): self.invited_users += [usr.name] self.notify('on_invite', usr) self.on_users() if not self.room_name: jid = self.eng.xmpp.client.boundjid time_code = strftime('%y%m%d%H%M%S') srv = self.eng.xmpp.client.conf_srv self.room_name = 'yorg' + jid.user + time_code + '@' + srv self.eng.xmpp.client.plugin['xep_0045'].joinMUC( self.room_name, self.eng.xmpp.client.boundjid.bare, pfrom=self.eng.xmpp.client.boundjid.full) cfg = self.eng.xmpp.client.plugin['xep_0045'].getRoomConfig( self.room_name) values = cfg.get_values() values['muc#roomconfig_publicroom'] = False cfg.set_values(values) self.eng.xmpp.client.plugin['xep_0045'].configureRoom( self.room_name, cfg) self.eng.log('created room ' + self.room_name) for usr_name in [self.yorg_srv] + \ [_usr.name_full for _usr in self.eng.xmpp.users if _usr.is_in_yorg]: self.eng.xmpp.client.send_message( mfrom=self.eng.xmpp.client.boundjid.full, mto=usr_name, mtype='ya2_yorg', msubject='is_playing', mbody='1') public_addr = load(urlopen('http://httpbin.org/ip'))['origin'] sock = socket(AF_INET, SOCK_DGRAM) try: sock.connect(('ya2.it', 8080)) local_addr = sock.getsockname()[0] except gaierror: local_addr = '' self.eng.xmpp.client.send_message( mfrom=self.eng.xmpp.client.boundjid.full, mto=usr.name_full, mtype='ya2_yorg', msubject='invite', mbody=self.room_name + '\n' + public_addr + '\n' + local_addr) self.eng.log('invited ' + str(usr.name_full)) self.notify('on_add_groupchat', self.room_name, usr.name) def on_declined(self, msg): self.eng.log('declined from ' + str(JID(msg['from']).bare)) usr = str(JID(msg['from']).bare) self.invited_users.remove(usr) self.on_users() def on_add_chat(self, msg): self.notify('on_add_chat', msg) def on_logout(self): map(lambda lab: lab.destroy(), self.labels) self.labels = [] def on_friend(self, usr_name): self.eng.log('send friend to ' + usr_name) self.eng.xmpp.client.send_presence_subscription( usr_name, ptype='subscribe', pfrom=self.eng.xmpp.client.boundjid.full) def on_unfriend(self, usr): self.eng.log('roster ' + str(self.eng.xmpp.client.client_roster)) self.eng.xmpp.client.del_roster_item(usr) self.eng.log('roster ' + str(self.eng.xmpp.client.client_roster)) def destroy(self): self.eng.log('destroyed usersfrm') self.frm = self.frm.destroy() GameObject.destroy(self)
class MatchMsgFrm(GameObject): def __init__(self, menu_args): GameObject.__init__(self) self.eng.log('created match message form') self.chat = None self.msg_frm = DirectFrame(frameSize=(-.02, 2.5, 0, 1.22), frameColor=(.2, .2, .2, .5), pos=(.04, 1, -1.69), parent=base.a2dTopLeft) t_a = menu_args.text_args t_a['scale'] = .05 t_a['fg'] = menu_args.text_normal self.dst_txt = OnscreenText(text='', pos=(0, 1.16), parent=self.msg_frm, align=TextNode.A_left, **t_a) self.ent = Entry(scale=.04, pos=(0, 1, .03), entryFont=menu_args.font, width=62, frameColor=menu_args.btn_color, parent=self.msg_frm, initialText=_('write here your message'), command=self.on_typed_msg, focusInCommand=self.on_focus, focusInExtraArgs=['in'], focusOutCommand=self.on_focus, focusOutExtraArgs=['out'], text_fg=menu_args.text_active) self.ent['state'] = DISABLED self.txt_frm = DirectScrolledFrame( frameSize=(-.02, 2.46, -.02, 1.02), canvasSize=(-.02, 2.42, -.02, 1.02), scrollBarWidth=.036, verticalScroll_relief=FLAT, verticalScroll_frameColor=(.2, .2, .2, .4), verticalScroll_thumb_relief=FLAT, verticalScroll_thumb_frameColor=(.8, .8, .8, .6), verticalScroll_incButton_relief=FLAT, verticalScroll_incButton_frameColor=(.8, .8, .8, .6), verticalScroll_decButton_relief=FLAT, verticalScroll_decButton_frameColor=(.8, .8, .8, .6), horizontalScroll_relief=FLAT, frameColor=(1, 1, 1, .0), pos=(.02, 1, .11), parent=self.msg_frm) t_a['scale'] = .046 self.msg_txt = OnscreenText(text='', pos=(0, .24), parent=self.txt_frm.getCanvas(), align=TextNode.A_left, wordwrap=52, **t_a) lab_args = menu_args.label_args lab_args['scale'] = .046 lab_args['text_fg'] = menu_args.text_normal self.lab_frm = Btn(frameSize=(-.02, 2.5, -.01, .05), frameColor=(1, 1, 1, 0), pos=(0, 1, 1.15), parent=self.msg_frm) self.lab_frm.bind(ENTER, self.on_enter) self.lab_frm.bind(EXIT, self.on_exit) self.tooltip = DirectLabel(text='', pos=(2.4, 1, -.06), parent=self.lab_frm, text_wordwrap=50, text_bg=(.2, .2, .2, .8), text_align=TextNode.A_right, **lab_args) self.tooltip.set_bin('gui-popup', 10) self.tooltip.hide() def on_enter(self, pos): self.tooltip.show() def on_exit(self, pos): self.tooltip.hide() def add_msg_txt(self, msg): self.msg_txt['text'] += ('\n' if self.msg_txt['text'] else '') + msg txt_height = self.msg_txt.textNode.getUpperLeft3d()[2] - \ self.msg_txt.textNode.getLowerRight3d()[2] self.txt_frm['canvasSize'] = (-.02, .72, .28 - txt_height, .28) def set_title(self, title): ttitle = self.trunc(title, 160) fix_name = lambda name: name if '@' not in name else name.split('@')[ 0] + '\1smaller\1@' + name.split('@')[1] + '\2' if title: if ',' in ttitle: is_muc = True ttitle = ttitle names = ttitle.split(',') names = [name.strip() for name in names] names = [fix_name(name) for name in names] ttitle = ', '.join(names) else: ttitle = fix_name(ttitle) self.dst_txt['text'] = ttitle self.tooltip['text'] = title @staticmethod def trunc(name, lgt): if len(name) > lgt: return name[:lgt] + '...' return name def on_typed_msg(self, val): #self.add_msg_txt('\1italic\1' + _('you') + '\2: ' + val) self.ent.set('') self.eng.xmpp.client.send_message( mfrom=self.eng.xmpp.client.boundjid.full, mto=self.chat.dst, mtype='groupchat', mbody=val) self.ent['focus'] = 1 def on_groupchat_msg(self, msg): src = str(JID(msg['mucnick'])) src = src.split('@')[0] + '\1smaller\1@' + src.split('@')[1] + '\2' self.eng.log('received groupchat message from %s in the chat %s' % (msg['mucnick'], JID(msg['from']).bare)) str_msg = '\1italic\1' + src + '\2: ' + str(msg['body']) if not self.chat: self.chat = MUC(str(JID(msg['from']).bare)) self.chat.messages += [str_msg] if self.dst_txt['text'] == '': self.set_chat(self.chat) elif self.chat.dst == str(JID(msg['from']).bare): self.add_msg_txt(str_msg) def on_presence_available_room(self, msg): room = str(JID(msg['muc']['room']).bare) nick = str(msg['muc']['nick']) self.eng.log('user %s has logged in the chat %s' % (nick, room)) self.chat.users += [nick] self.set_title(self.chat.title) def on_presence_unavailable_room(self, msg): room = str(JID(msg['muc']['room']).bare) nick = str(msg['muc']['nick']) self.eng.log('user %s has left the chat %s' % (nick, room)) self.chat.users.remove(nick) self.set_title(self.chat.title) def add_groupchat(self, room, usr): self.set_title(usr) if not self.chat: self.chat = MUC(room) self.set_chat(self.chat) def set_chat(self, chat): self.set_title(chat.title) self.msg_txt['text'] = '\n'.join(chat.messages) txt_height = self.msg_txt.textNode.getUpperLeft3d()[2] - \ self.msg_txt.textNode.getLowerRight3d()[2] self.txt_frm['canvasSize'] = (-.02, .72, .28 - txt_height, .28) self.ent['state'] = NORMAL def on_focus(self, val): if val == 'in' and self.ent.get() == _('write here your message'): self.ent.set('') self.notify('on_match_msg_focus', val) def destroy(self): self.eng.log('message form destroyed') self.msg_frm.destroy() GameObject.destroy(self)
class MessageFrm(GameObject): def __init__(self, menu_args): GameObject.__init__(self) self.eng.log('created message form') self.chats = [] self.curr_chat = None self.curr_match_room = None self.msg_frm = DirectFrame(frameSize=(-.02, .8, 0, .45), frameColor=(.2, .2, .2, .5), pos=(-.82, 1, .02), parent=base.a2dBottomRight) self.presences_sent = [] self.menu_args = menu_args t_a = menu_args.text_args t_a['scale'] = .05 t_a['fg'] = menu_args.text_normal self.dst_txt = OnscreenText(text='', pos=(0, .4), parent=self.msg_frm, align=TextNode.A_left, **t_a) self.arrow_btn = ImgBtn(parent=self.msg_frm, scale=.024, pos=(.7, 1, .42), frameColor=(1, 1, 1, 1), frameTexture='assets/images/gui/arrow.txo', command=self.on_arrow, **menu_args.imgbtn_args) self.arrow_btn.disable() self.close_btn = ImgBtn(parent=self.msg_frm, scale=.024, pos=(.76, 1, .42), frameColor=(1, 1, 1, 1), frameTexture='assets/images/gui/close.txo', command=self.on_close, **menu_args.imgbtn_args) self.close_btn.disable() self.ent = Entry(scale=.04, pos=(0, 1, .03), entryFont=menu_args.font, width=19.5, frameColor=menu_args.btn_color, parent=self.msg_frm, initialText=_('write here your message'), command=self.on_typed_msg, focusInCommand=self.on_focus, focusInExtraArgs=['in'], focusOutCommand=self.on_focus, focusOutExtraArgs=['out'], text_fg=menu_args.text_active) self.ent['state'] = DISABLED self.txt_frm = DirectScrolledFrame( frameSize=(-.02, .76, -.02, .28), canvasSize=(-.02, .72, -.02, .28), scrollBarWidth=.036, verticalScroll_relief=FLAT, verticalScroll_frameColor=(.2, .2, .2, .4), verticalScroll_thumb_relief=FLAT, verticalScroll_thumb_frameColor=(.8, .8, .8, .6), verticalScroll_incButton_relief=FLAT, verticalScroll_incButton_frameColor=(.8, .8, .8, .6), verticalScroll_decButton_relief=FLAT, verticalScroll_decButton_frameColor=(.8, .8, .8, .6), horizontalScroll_relief=FLAT, frameColor=(1, 1, 1, 0), pos=(.02, 1, .11), parent=self.msg_frm) t_a['scale'] = .046 self.msg_txt = OnscreenText(text='', pos=(0, .24), parent=self.txt_frm.getCanvas(), align=TextNode.A_left, wordwrap=14, **t_a) lab_args = menu_args.label_args lab_args['scale'] = .046 lab_args['text_fg'] = menu_args.text_normal self.lab_frm = Btn(frameSize=(-.02, .64, -.01, .05), frameColor=(1, 1, 1, 0), pos=(0, 1, .4), parent=self.msg_frm) self.lab_frm.bind(ENTER, self.on_enter) self.lab_frm.bind(EXIT, self.on_exit) self.tooltip = DirectLabel(text='', pos=(.78, 1, -.06), parent=self.lab_frm, text_wordwrap=16, text_bg=(.2, .2, .2, .8), text_align=TextNode.A_right, **lab_args) self.tooltip.set_bin('gui-popup', 10) self.tooltip.hide() def on_enter(self, pos): self.tooltip.show() def on_exit(self, pos): self.tooltip.hide() def show(self): self.msg_frm.show() def hide(self): self.msg_frm.hide() def add_msg_txt(self, msg): self.msg_txt['text'] += ('\n' if self.msg_txt['text'] else '') + msg txt_height = self.msg_txt.textNode.getUpperLeft3d()[2] - \ self.msg_txt.textNode.getLowerRight3d()[2] self.txt_frm['canvasSize'] = (-.02, .72, .28 - txt_height, .28) def set_title(self, title): ttitle = self.trunc(title, 32) fix_name = lambda name: name if '@' not in name else name.split('@')[ 0] + '\1smaller\1@' + name.split('@')[1] + '\2' if title: if ',' in ttitle: is_muc = True ttitle = ttitle names = ttitle.split(',') names = [name.strip() for name in names] names = [fix_name(name) for name in names] ttitle = ', '.join(names) else: ttitle = fix_name(ttitle) self.dst_txt['text'] = ttitle self.tooltip['text'] = title @staticmethod def trunc(name, lgt): if len(name) > lgt: return name[:lgt] + '...' return name def set_chat(self, chat): self.curr_chat = chat self.set_title(chat.title) self.msg_txt['text'] = '\n'.join(chat.messages) txt_height = self.msg_txt.textNode.getUpperLeft3d()[2] - \ self.msg_txt.textNode.getLowerRight3d()[2] self.txt_frm['canvasSize'] = (-.02, .72, .28 - txt_height, .28) if not self.chats: self.close_btn.disable() self.ent['state'] = DISABLED elif len(self.chats) == 1: self.close_btn.enable() self.ent['state'] = NORMAL self.arrow_btn.disable() else: self.close_btn.enable() self.ent['state'] = NORMAL self.arrow_btn.enable() if all(_chat.read for _chat in self.chats): self.arrow_btn['frameTexture'] = 'assets/images/gui/arrow.txo' else: self.arrow_btn['frameTexture'] = 'assets/images/gui/message.txo' def on_arrow(self): chat_idx = self.chats.index(self.curr_chat) next_idx = (chat_idx + 1) % len(self.chats) chat = self.chats[next_idx] self.set_title(chat.title) chat.read = True self.set_chat(chat) @property def open_chats(self): return [chat for chat in self.chats if not chat.closed] def on_close(self): if self.curr_chat not in self.open_chats: return curr_idx = self.open_chats.index(self.curr_chat) #self.chats.remove(self.curr_chat) self.curr_chat.closed = True if self.open_chats: self.set_chat(self.open_chats[curr_idx - 1]) else: self.set_chat(Chat('')) self.notify('on_close_all_chats') def on_typed_msg(self, val): self.add_msg_txt('\1italic\1' + _('you') + '\2: ' + val) self.ent.set('') if self.curr_chat.dst not in self.presences_sent and \ not str(self.curr_chat.dst).startswith('yorg'): self.eng.xmpp.client.send_presence( pfrom=self.eng.xmpp.client.boundjid.full, pto=self.curr_chat.dst) self.presences_sent += [self.curr_chat.dst] if str(self.curr_chat.dst).startswith('yorg'): self.eng.xmpp.client.send_message( mfrom=self.eng.xmpp.client.boundjid.full, mto=self.curr_chat.dst, mtype='groupchat', mbody=val) else: self.eng.xmpp.client.send_message( mfrom=self.eng.xmpp.client.boundjid.full, mto=self.curr_chat.dst, msubject='chat', mbody=val) msg = '\1italic\1' + _('you') + '\2: ' + val self.curr_chat.messages += [msg] self.ent['focus'] = 1 def on_msg(self, msg): src = str(JID(msg['from']).bare) src = src.split('@')[0] + '\1smaller\1@' + src.split('@')[1] + '\2' str_msg = '\1italic\1' + src + '\2: ' + str(msg['body']) chat = self.__find_chat(msg['from']) if not chat: chat = Chat(msg['from']) self.chats += [chat] chat.messages += [str_msg] if self.dst_txt['text'] == '': self.set_chat(chat) elif JID(self.curr_chat.dst).bare == JID(msg['from']).bare: self.add_msg_txt(str_msg) else: chat.read = False chat.closed = False self.arrow_btn['frameTexture'] = 'assets/images/gui/message.txo' def on_groupchat_msg(self, msg): if str(JID(msg['from']).bare) == self.curr_match_room: if self.match_msg_frm: # we're still in the room page self.match_msg_frm.on_groupchat_msg(msg) src = str(JID(msg['mucnick'])) src = src.split('@')[0] + '\1smaller\1@' + src.split('@')[1] + '\2' self.eng.log('received groupchat message from %s in the chat %s' % (msg['mucnick'], JID(msg['from']).bare)) str_msg = '\1italic\1' + src + '\2: ' + str(msg['body']) chat = self.curr_chat if not chat: chat = MUC(str(JID(msg['from']).bare)) self.chats += [chat] chat.messages += [str_msg] if self.dst_txt['text'] == '': self.set_chat(chat) elif self.curr_chat.dst == str(JID(msg['from']).bare): self.add_msg_txt(str_msg) else: chat.read = False chat.closed = False self.arrow_btn['frameTexture'] = 'assets/images/gui/message.txo' def on_presence_available_room(self, msg): if str(JID(msg['from']).bare) == self.curr_match_room: self.match_msg_frm.on_presence_available_room(msg) room = str(JID(msg['muc']['room']).bare) nick = str(msg['muc']['nick']) self.eng.log('user %s has logged in the chat %s' % (nick, room)) chat = self.__find_chat(room) chat.users += [nick] if str(JID(msg['from']).bare) != self.curr_match_room: if self.curr_chat.dst == room: self.set_title(chat.title) def on_presence_unavailable_room(self, msg): if self.match_msg_frm and str(JID( msg['from']).bare) == self.curr_match_room: self.match_msg_frm.on_presence_unavailable_room(msg) return room = str(JID(msg['muc']['room']).bare) nick = str(msg['muc']['nick']) self.eng.log('user %s has left the chat %s' % (nick, room)) chat = self.__find_chat(room) if nick == self.eng.xmpp.client.boundjid.bare: self.on_close() else: chat.users.remove(nick) if self.curr_chat.dst == room: self.set_title(chat.title) def __find_chat(self, dst): chats = [chat for chat in self.chats if chat.dst == dst] if chats: return chats[0] def add_chat(self, usr): self.set_title(JID(usr).bare) chat = self.__find_chat(usr) if not chat: chat = Chat(usr) self.chats += [chat] self.set_chat(chat) self.ent['focus'] = 1 def add_groupchat(self, room, usr): self.set_title(usr) chat = self.__find_chat(room) if not chat: chat = MUC(room) self.chats += [chat] chat.users += [usr] self.set_chat(chat) self.add_match_chat(room, usr) def remove_groupchat(self): self.match_msg_frm.detach(self.on_match_msg_focus) self.match_msg_frm = self.match_msg_frm.destroy() def on_focus(self, val): if val and self.ent.get() == _('write here your message'): self.ent.set('') self.notify('on_msg_focus', val) def on_match_msg_focus(self, val): self.notify('on_msg_focus', val) def on_room_back(self): self.curr_match_room = None self.match_msg_frm.destroy() def add_match_chat(self, room, usr): if self.curr_match_room: return self.curr_match_room = room self.match_msg_frm = MatchMsgFrm(self.menu_args) self.match_msg_frm.attach(self.on_match_msg_focus) self.match_msg_frm.add_groupchat(room, usr)
class BufferViewer(DraggableWindow): """ This class provides a view into the buffers to inspect them """ _REGISTERED_ENTRIES = [] @classmethod def register_entry(cls, entry): """ Adds a new target to the registered entries """ cls._REGISTERED_ENTRIES.append(entry) @classmethod def unregister_entry(cls, entry): """ Removes a target from the registered entries """ if entry in cls._REGISTERED_ENTRIES: cls._REGISTERED_ENTRIES.remove(entry) def __init__(self, pipeline, parent): """ Constructs the buffer viewer """ DraggableWindow.__init__(self, width=1400, height=800, parent=parent, title="Buffer- and Image-Browser") RenderTarget.RT_CREATE_HANDLER = self.register_entry self._pipeline = pipeline self._scroll_height = 3000 self._display_images = False self._stages = [] self._create_components() self._tex_preview = TexturePreview(self._pipeline, parent) self._tex_preview.hide() self.hide() def toggle(self): """ Updates all the buffers and then toggles the buffer viewer """ if self._visible: self._remove_components() self.hide() else: self._perform_update() self.show() def get_stage_information(self): """ Returns the amount of attached stages, and also the memory consumed in MiB.""" count = 0 memory = 0.0 for entry in BufferViewer._REGISTERED_ENTRIES: if isinstance(entry, Texture): count += 1 memory += entry.estimate_texture_memory() elif entry.__class__.__name__ == "RenderTarget": for target in entry.get_all_targets(): count += 1 memory += entry[target].estimate_texture_memory() elif entry.__class__.__name__ == "Image": count += 1 memory += entry.get_texture().estimate_texture_memory() else: self.warn("Unkown type:", entry.__class__.__name) return {"count": count, "memory": memory} def _create_components(self): """ Creates the window components """ DraggableWindow._create_components(self) self._content_frame = DirectScrolledFrame( frameSize=(0, self._width - 15, 0, self._height - 90), canvasSize=(0, self._width - 80, 0, self._scroll_height), autoHideScrollBars=False, scrollBarWidth=20.0, frameColor=(0, 0, 0, 0), verticalScroll_relief=False, horizontalScroll_relief=False, horizontalScroll_incButton_relief=False, horizontalScroll_decButton_relief=False, horizontalScroll_thumb_relief=False, parent=self._node, pos=(0, 1, -self._height)) self._content_node = self._content_frame.getCanvas().attach_new_node( "BufferComponents") self._content_node.set_scale(1, 1, -1) self._content_node.set_z(self._scroll_height) self._chb_show_images = BetterLabeledCheckbox( parent=self._node, x=20, y=60, chb_callback=self._set_show_images, chb_checked=False, text="Display image resources", text_color=Vec3(0.5), expand_width=200) def _set_show_images(self, arg): self._display_images = arg self._perform_update() def _remove_components(self): """ Removes all components of the buffer viewer """ self._content_node.node().remove_all_children() self._tex_preview.hide() def _perform_update(self): """ Collects all entries, extracts their images and re-renders the window """ # Collect texture stages self._stages = [] for entry in BufferViewer._REGISTERED_ENTRIES: if isinstance(entry, Texture): self._stages.append(entry) # Cant use isinstance or we get circular references elif entry.__class__.__name__ == "RenderTarget": for target in entry.get_all_targets(): self._stages.append(entry[target]) # Cant use isinstance or we get circular references elif entry.__class__.__name__ == "Image": if self._display_images: self._stages.append(entry.get_texture()) else: self.warn("Unrecognized instance!", entry.__class__) self._render_stages() def _on_texture_hovered(self, hover_frame, evt=None): """ Internal method when a texture is hovered """ hover_frame["frameColor"] = (0, 0, 0, 0.1) def _on_texture_blurred(self, hover_frame, evt=None): """ Internal method when a texture is blurred """ hover_frame["frameColor"] = (0, 0, 0, 0) def _on_texture_clicked(self, tex_handle, evt=None): """ Internal method when a texture is blurred """ self._tex_preview.present(tex_handle) def _render_stages(self): """ Renders the stages to the window """ self._remove_components() entries_per_row = 8 aspect = Globals.base.win.get_y_size() /\ float(Globals.base.win.get_x_size()) entry_width = 180 entry_height = (entry_width - 20) * aspect + 55 # Store already processed images processed = set() index = -1 # Iterate over all stages for stage_tex in self._stages: if stage_tex in processed: continue processed.add(stage_tex) index += 1 stage_name = stage_tex.get_name() xoffs = index % entries_per_row yoffs = index // entries_per_row node = self._content_node.attach_new_node("Preview") node.set_sz(-1) node.set_pos(10 + xoffs * (entry_width - 14), 1, yoffs * (entry_height-14)) if stage_name.startswith("Image"): r, g, b = 0.4, 0.4, 0.4 else: r, g, b = rgb_from_string(stage_name) DirectFrame( parent=node, frameSize=(7, entry_width - 17, -7, -entry_height + 17), frameColor=(r, g, b, 1.0), pos=(0, 0, 0)) frame_hover = DirectFrame( parent=node, frameSize=(0, entry_width - 10, 0, -entry_height + 10), frameColor=(0, 0, 0, 0), pos=(0, 0, 0), state=DGG.NORMAL) frame_hover.bind( DGG.ENTER, partial(self._on_texture_hovered, frame_hover)) frame_hover.bind( DGG.EXIT, partial(self._on_texture_blurred, frame_hover)) frame_hover.bind( DGG.B1PRESS, partial(self._on_texture_clicked, stage_tex)) BetterOnscreenText(text=stage_name, x=15, y=29, parent=node, size=12, color=Vec3(0.2)) # Scale image so it always fits w, h = stage_tex.get_x_size(), stage_tex.get_y_size() scale_x = float(entry_width - 30) / max(1, w) scale_y = float(entry_height - 60) / max(1, h) scale_factor = min(scale_x, scale_y) if stage_tex.get_texture_type() == Texture.TT_buffer_texture: scale_factor = 1 w = entry_width - 30 h = entry_height - 60 preview = BetterOnscreenImage( image=stage_tex, w=scale_factor * w, h=scale_factor * h, any_filter=False, parent=node, x=10, y=40, transparent=False) preview.set_shader_input("mipmap", 0) preview.set_shader_input("slice", 0) preview_shader = DisplayShaderBuilder.build(stage_tex, scale_factor*w, scale_factor*h) preview.set_shader(preview_shader)
def __init__(self, menu_props): GameObject.__init__(self) self.eng.log('created message form') self.chats = [] self.curr_chat = None self.curr_match_room = None self.msg_frm = DirectFrame( frameSize=(-.02, .8, 0, .45), frameColor=(.2, .2, .2, .5), pos=(-.82, 1, .02), parent=base.a2dBottomRight) self.presences_sent = [] self.menu_props = menu_props t_a = menu_props.text_args t_a['scale'] = .05 t_a['fg'] = menu_props.text_normal_col self.dst_txt = OnscreenText( text='', pos=(0, .4), parent=self.msg_frm, align=TextNode.A_left, **t_a) self.arrow_btn = ImgBtn( parent=self.msg_frm, scale=(.024, .024), pos=(.7, 1, .42), frame_col=(1, 1, 1, 1), frame_texture='assets/images/gui/arrow.txo', cmd=self.on_arrow, **menu_props.imgbtn_args) self.arrow_btn.disable() self.close_btn = ImgBtn( parent=self.msg_frm, scale=(.024, .024), pos=(.76, 1, .42), frame_col=(1, 1, 1, 1), frame_texture='assets/images/gui/close.txo', cmd=self.on_close, **menu_props.imgbtn_args) self.close_btn.disable() self.ent = Entry( scale=.04, pos=(0, .03), entry_font=menu_props.font, width=19.5, frame_col=menu_props.btn_col, parent=self.msg_frm, initial_text=_('write here your message'), cmd=self.on_typed_msg, focus_in_cmd=self.on_focus, focus_in_args=['in'], focus_out_cmd=self.on_focus, focus_out_args=['out'], text_fg=menu_props.text_active_col) self.ent['state'] = DISABLED self.txt_frm = DirectScrolledFrame( frameSize=(-.02, .76, -.02, .28), canvasSize=(-.02, .72, -.02, .28), scrollBarWidth=.036, verticalScroll_relief=FLAT, verticalScroll_frameColor=(.2, .2, .2, .4), verticalScroll_thumb_relief=FLAT, verticalScroll_thumb_frameColor=(.8, .8, .8, .6), verticalScroll_incButton_relief=FLAT, verticalScroll_incButton_frameColor=(.8, .8, .8, .6), verticalScroll_decButton_relief=FLAT, verticalScroll_decButton_frameColor=(.8, .8, .8, .6), horizontalScroll_relief=FLAT, frameColor=(1, 1, 1, 0), pos=(.02, 1, .11), parent=self.msg_frm) t_a['scale'] = .046 self.msg_txt = OnscreenText( text='', pos=(0, .24), parent=self.txt_frm.getCanvas(), align=TextNode.A_left, wordwrap=14, **t_a) lab_args = menu_props.label_args lab_args['scale'] = .046 lab_args['text_fg'] = menu_props.text_normal_col self.lab_frm = Btn( frame_size=(-.02, .64, -.01, .05), frame_col=(1, 1, 1, 0), pos=(0, 1, .4), parent=self.msg_frm) self.lab_frm.bind(ENTER, self.on_enter) self.lab_frm.bind(EXIT, self.on_exit) self.tooltip = Label( text='', pos=(.78, 1, -.06), parent=self.lab_frm, text_wordwrap=16,# text_bg=(.2, .2, .2, .8), text_align=TextNode.A_right, **lab_args) self.tooltip.set_bin('gui-popup', 10) self.tooltip.hide()
class LoadForm(SogalForm): ''' Form of saving ''' def __init__(self): ''' Constructor ''' SogalForm.__init__(self, fading = True, fading_duration = 0.5, enableMask = True,backgroundColor=color_themes.sirius_bgColor) self.reparentTo(aspect2d,sort = 102) self.frame = DirectScrolledFrame(parent = self, canvasSize = LOAD_CANVAS_SIZE, frameSize = FRAMESIZE, autoHideScrollBars = AUTO_HIDE_SCROLLBARS, **color_themes.sirius_frame) self.labels = [] self.labelDict = {} self.vbox = VLayout(parent = self.frame.getCanvas(), margin = vspacing) hbox = None self.__dumped = None pos2 = MAX_SAVE + runtime_data.MAX_QUICKSAVE pos3 = MAX_SAVE + runtime_data.MAX_QUICKSAVE + runtime_data.MAX_AUTOSAVE for i in range(1, pos3 + 1): if i <= MAX_SAVE: fname = 'save' + str(i) head = str(i) elif MAX_SAVE < i <= pos2: index = i - MAX_SAVE fname = 'quick_save' + str(index) head = 'Quick Save ' + str(index) elif pos2 < i <= pos3: index = i - pos2 fname = 'auto_save' + str(index) head = 'Auto Save ' + str(index) label = SaveLoadLabel(command = self.load, always_enable = False, fileName = fname, head = head, extraArgs = [fname],style = color_themes.sirius_button) self.labels.append(label) self.labelDict[label.getFileName()] = label if not hbox: hbox = HLayout(margin = hspacing) self.vbox.append(hbox) hbox.append(label) else: hbox.append(label) hbox = None def roll(self,value): self.frame.verticalScroll.setValue(self.frame.verticalScroll.getValue() + value * LOAD_ROLL_SPEED) def setData(self,dumped,message): self.__dumped = dumped self.__message = message def reload(self): for label in self.labels: label.reload() def reloadMember(self,key): if self.labelDict.has_key(key): self.labelDict[key].reload() def load(self,fname): if base.isStarted(): ConfirmDialog(text= '读取进度吗?', command = self.confirmedLoad, style = 'sirius', extraArgs = [fname]) else: self.confirmedLoad(fname) def confirmedLoad(self,fname): messenger.send('load_data',[fname]) self.hide() def focused(self): self.accept('mouse3', self.hide) self.accept('wheel_up', self.roll, [-1.0]) self.accept('wheel_down', self.roll, [1.0]) self.accept('arrow_up-repeat', self.roll, [-1.0]) self.accept('arrow_down-repeat', self.roll, [1.0]) self.accept('arrow_up', self.roll, [-1.0]) self.accept('arrow_down', self.roll, [1.0]) self.accept('w-repeat', self.roll, [-1.0]) self.accept('s-repeat', self.roll, [1.0]) self.accept('w', self.roll, [-1.0]) self.accept('s', self.roll, [1.0]) def defocused(self): self.ignore('mouse3') self.ignore('wheel_up') self.ignore('wheel_down') self.ignore('arrow_up-repeat') self.ignore('arrow_down-repeat') self.ignore('arrow_up') self.ignore('arrow_down') self.ignore('w-repeat') self.ignore('s-repeat') self.ignore('w') self.ignore('s')
class StructurePanel(): def __init__(self, parent, getEditorRootCanvas, elementDict, selectedElement): height = DGH.getRealHeight(parent) self.collapsedElements = [] self.parent = parent self.box = DirectBoxSizer(frameColor=(0.25, 0.25, 0.25, 1), autoUpdateFrameSize=False, orientation=DGG.VERTICAL) self.sizer = DirectAutoSizer(parent=parent, child=self.box, childUpdateSizeFunc=self.box.refresh) self.lblHeader = DirectLabel( text="Structure", text_scale=16, text_align=TextNode.ALeft, text_fg=(1, 1, 1, 1), frameColor=VBase4(0, 0, 0, 0), ) self.box.addItem(self.lblHeader) color = ( (0.8, 0.8, 0.8, 1), # Normal (0.9, 0.9, 1, 1), # Click (0.8, 0.8, 1, 1), # Hover (0.5, 0.5, 0.5, 1)) # Disabled self.structureFrame = DirectScrolledFrame( # make the frame fit into our background frame frameSize=VBase4( self.parent["frameSize"][0], self.parent["frameSize"][1], self.parent["frameSize"][2] + DGH.getRealHeight(self.lblHeader), self.parent["frameSize"][3]), #canvasSize=VBase4(parent["frameSize"][0], parent["frameSize"][1]-20, height+30, 0), # set the frames color to transparent frameColor=VBase4(1, 1, 1, 1), scrollBarWidth=20, verticalScroll_scrollSize=20, verticalScroll_thumb_relief=DGG.FLAT, verticalScroll_incButton_relief=DGG.FLAT, verticalScroll_decButton_relief=DGG.FLAT, verticalScroll_thumb_frameColor=color, verticalScroll_incButton_frameColor=color, verticalScroll_decButton_frameColor=color, horizontalScroll_thumb_relief=DGG.FLAT, horizontalScroll_incButton_relief=DGG.FLAT, horizontalScroll_decButton_relief=DGG.FLAT, horizontalScroll_thumb_frameColor=color, horizontalScroll_incButton_frameColor=color, horizontalScroll_decButton_frameColor=color, state=DGG.NORMAL) self.box.addItem(self.structureFrame) self.structureFrame.bind(DGG.MWDOWN, self.scroll, [0.01]) self.structureFrame.bind(DGG.MWUP, self.scroll, [-0.01]) self.maxWidth = parent["frameSize"][1] - 20 self.getEditorRootCanvas = getEditorRootCanvas self.refreshStructureTree(elementDict, selectedElement) def scroll(self, scrollStep, event): self.structureFrame.verticalScroll.scrollStep(scrollStep) def resizeFrame(self): self.sizer.refresh() self.structureFrame["frameSize"] = (self.parent["frameSize"][0], self.parent["frameSize"][1], self.parent["frameSize"][2] + DGH.getRealHeight(self.lblHeader), self.parent["frameSize"][3]) #posZ = 0 #height = DGH.getRealHeight(parent) #self.lblHeader["frameSize"] = (self.parent["frameSize"][0], self.parent["frameSize"][1], -10, 20) #self.lblHeader["text_pos"] = (self.parent["frameSize"][0], 0) #self.lblHeader.setPos(0,0,posZ-20) #posZ -= 30 #self.structureFrame["frameSize"] = (self.parent["frameSize"][0], self.parent["frameSize"][1], height+30, 0) #self.structureFrame.setPos(0,0,posZ) def refreshStructureTree(self, elementDict, selectedElement): self.elementDict = elementDict self.selectedElement = selectedElement for element in self.structureFrame.getCanvas().getChildren(): element.removeNode() self.maxWidth = self.parent["frameSize"][1] - 20 self.itemCounter = 0 self.__fillStructureTree(self.getEditorRootCanvas(), 0, 0) self.structureFrame["canvasSize"] = ( self.structureFrame["frameSize"][0], self.maxWidth, self.itemCounter * -16, 0) self.structureFrame.setCanvasSize() def __fillStructureTree(self, root, level, z): if "DirectGrid" in root.getName(): return self.itemCounter += 1 elementInfo = None if root.getName() in self.elementDict.keys(): elementInfo = self.elementDict[root.getName()] elif len(root.getName().split("-")) > 1 and root.getName().split( "-")[1] in self.elementDict.keys(): elementInfo = self.elementDict[root.getName().split("-")[1]] if level > 0: self.__makeStructureFrameTreeItem(root, elementInfo, level, z) if hasattr(root, "getChildren") \ and elementInfo not in self.collapsedElements: for child in root.getChildren(): z = -16 * self.itemCounter self.__fillStructureTree(child, level + 1, z) def __makeStructureFrameTreeItem(self, elementNP, elementInfo, parentsLevel, z): if elementInfo is None: lbl = DirectLabel(text=elementNP.getName(), text_align=TextNode.ALeft, frameColor=(0, 0, 0, 0), relief=DGG.FLAT, pos=(self.structureFrame["frameSize"][0] + 20 * parentsLevel, 0, z), scale=16, parent=self.structureFrame.getCanvas()) self.maxWidth = max( self.maxWidth, lbl.getX() + lbl.getWidth() * lbl.getScale()[0]) else: margin = 5 shift = 6 if hasattr(elementNP, "getChildren"): if len(elementNP.getChildren()) > 0: # Collapse Button btnC = DirectCheckBox( relief=DGG.FLAT, pos=(self.structureFrame["frameSize"][0] + 20 * parentsLevel - 16 + margin, 0, z + shift), frameSize=(-8, 8, -8, 8), frameColor=(0, 0, 0, 0), command=self.__collapseElement, extraArgs=[elementInfo], image="icons/Collapsed.png" if elementInfo in self.collapsedElements else "icons/Collapse.png", uncheckedImage="icons/Collapse.png", checkedImage="icons/Collapsed.png", image_scale=8, isChecked=elementInfo in self.collapsedElements, parent=self.structureFrame.getCanvas()) btnC.setTransparency(TransparencyAttrib.M_alpha) btnC.bind(DGG.MWDOWN, self.scroll, [0.01]) btnC.bind(DGG.MWUP, self.scroll, [-0.01]) # Element Name btn = DirectButton( frameColor=( VBase4(1, 1, 1, 1), #normal VBase4(0.9, 0.9, 0.9, 1), #click VBase4(0.8, 0.8, 0.8, 1), #hover VBase4(0.5, 0.5, 0.5, 1)), #disabled text=elementInfo.name, text_align=TextNode.ALeft, relief=DGG.FLAT, pos=(self.structureFrame["frameSize"][0] + 20 * parentsLevel, 0, z), scale=16, command=self.__selectElement, extraArgs=[elementInfo], parent=self.structureFrame.getCanvas()) btn.bind(DGG.MWDOWN, self.scroll, [0.01]) btn.bind(DGG.MWUP, self.scroll, [-0.01]) if self.selectedElement is not None and self.selectedElement == elementInfo: btn.setColorScale(1, 1, 0, 1) # Delete Button btnX = DirectButton( relief=DGG.FLAT, pos=(self.structureFrame["frameSize"][0] + 8 + margin + 20 * parentsLevel + btn.getWidth() * btn.getScale()[0], 0, z + shift), frameSize=(-8, 8, -8, 8), frameColor=(0, 0, 0, 0), command=self.__removeElement, extraArgs=[elementInfo], image="icons/DeleteSmall.png", image_scale=8, parent=self.structureFrame.getCanvas()) btnX.setTransparency(TransparencyAttrib.M_multisample) btnX.bind(DGG.MWDOWN, self.scroll, [0.01]) btnX.bind(DGG.MWUP, self.scroll, [-0.01]) # Visibility Button btnV = DirectCheckBox( relief=DGG.FLAT, pos=(self.structureFrame["frameSize"][0] + 8 + margin * 2 + 20 * parentsLevel + btn.getWidth() * btn.getScale()[0] + btnX.getWidth(), 0, z + shift), frameSize=(-8, 8, -8, 8), frameColor=(0, 0, 0, 0), command=self.__toggleElementVisibility, extraArgs=[elementInfo], image="icons/VisibilityOffSmall.png" if elementInfo.element.isHidden() else "icons/VisibilityOnSmall.png", uncheckedImage="icons/VisibilityOffSmall.png", checkedImage="icons/VisibilityOnSmall.png", image_scale=8, isChecked=not elementInfo.element.isHidden(), parent=self.structureFrame.getCanvas()) btnV.setTransparency(TransparencyAttrib.M_multisample) btnV.bind(DGG.MWDOWN, self.scroll, [0.01]) btnV.bind(DGG.MWUP, self.scroll, [-0.01]) self.maxWidth = max(self.maxWidth, btnV.getX() + 8) def __selectElement(self, elementInfo, args=None): if elementInfo is not None: base.messenger.send("selectElement", [elementInfo, args]) def __removeElement(self, elementInfo): if elementInfo is not None: base.messenger.send("removeElement", [elementInfo.element]) def __toggleElementVisibility(self, toggle, elementInfo): if elementInfo is not None: base.messenger.send("toggleElementVisibility", [elementInfo.element]) def __collapseElement(self, collapse, elementInfo): if elementInfo is not None: if collapse: self.collapsedElements.append(elementInfo) else: self.collapsedElements.remove(elementInfo) base.messenger.send("refreshStructureTree")
def __init__(self, rootParent=None): self.frmChat = DirectFrame( frameColor=(0.25, 0.25, 0.25, 1.0), frameSize=(-0.4, 0.4, -1.25, 0.0), hpr=LVecBase3f(0, 0, 0), pos=LPoint3f(0, 0, 0), parent=rootParent, ) self.frmChat.setTransparency(0) self.frmMessages = DirectScrolledFrame( borderWidth=(0.005, 0.005), canvasSize=(-0.38, 0.34, -1.2, 0.0), frameColor=(1, 1, 1, 1), frameSize=(-0.38, 0.38, -1.0, 0.0), hpr=LVecBase3f(0, 0, 0), pos=LPoint3f(0, 0, -0.1), relief=3, scrollBarWidth=0.03, state='normal', horizontalScroll_borderWidth=(0.01, 0.01), horizontalScroll_frameSize=(-0.05, 0.05, -0.015, 0.015), horizontalScroll_hpr=LVecBase3f(0, 0, 0), horizontalScroll_pos=LPoint3f(0, 0, 0), horizontalScroll_decButton_borderWidth=(0.01, 0.01), horizontalScroll_decButton_frameSize=(-0.05, 0.05, -0.04, 0.04), horizontalScroll_decButton_hpr=LVecBase3f(0, 0, 0), horizontalScroll_decButton_pos=LPoint3f(0, 0, 0), horizontalScroll_incButton_borderWidth=(0.01, 0.01), horizontalScroll_incButton_frameSize=(-0.05, 0.05, -0.04, 0.04), horizontalScroll_incButton_hpr=LVecBase3f(0, 0, 0), horizontalScroll_incButton_pos=LPoint3f(0, 0, 0), horizontalScroll_thumb_borderWidth=(0.01, 0.01), horizontalScroll_thumb_hpr=LVecBase3f(0, 0, 0), horizontalScroll_thumb_pos=LPoint3f(0, 0, 0), verticalScroll_borderWidth=(0.01, 0.01), verticalScroll_frameSize=(-0.015, 0.015, -0.05, 0.05), verticalScroll_hpr=LVecBase3f(0, 0, 0), verticalScroll_pos=LPoint3f(0, 0, 0), verticalScroll_decButton_borderWidth=(0.01, 0.01), verticalScroll_decButton_frameSize=(-0.04, 0.04, -0.05, 0.05), verticalScroll_decButton_hpr=LVecBase3f(0, 0, 0), verticalScroll_decButton_pos=LPoint3f(0.36, 0, -0.02), verticalScroll_incButton_borderWidth=(0.01, 0.01), verticalScroll_incButton_frameSize=(-0.04, 0.04, -0.05, 0.05), verticalScroll_incButton_hpr=LVecBase3f(0, 0, 0), verticalScroll_incButton_pos=LPoint3f(0.36, 0, -0.98), verticalScroll_thumb_borderWidth=(0.01, 0.01), verticalScroll_thumb_hpr=LVecBase3f(0, 0, 0), verticalScroll_thumb_pos=LPoint3f(0.36, 0, -0.418625), parent=self.frmChat, ) self.frmMessages.setTransparency(0) self.txtMessage = DirectEntry( borderWidth=(0.005, 0.005), frameColor=(1.0, 1.0, 1.0, 1.0), hpr=LVecBase3f(0, 0, 0), overflow=1, pos=LPoint3f(-0.375, 0, -1.195), relief=3, scale=LVecBase3f(0.045, 0.045, 0.045), width=14.0, text_align=TextNode.A_left, text_scale=(1.0, 1.0), text_pos=(0, 0), text_fg=LVecBase4f(0, 0, 0, 1), text_bg=LVecBase4f(0, 0, 0, 0), parent=self.frmChat, ) self.txtMessage.setTransparency(0) self.btnSend = DirectButton( frameColor=(0.0, 0.0, 0.0, 0.0), frameSize=(-0.4, 0.4, -0.4, 0.4), hpr=LVecBase3f(0, 0, 0), image='assets/chat/ChatSend.png', pos=LPoint3f(0.33, 0, -1.18), relief=1, scale=LVecBase3f(0.1, 0.1, 0.1), text='', image_scale=LVecBase3f(0.4, 1, 0.4), image_pos=LPoint3f(0, 0, 0), text_align=TextNode.A_center, text_scale=(1, 1), text_pos=(0, 0), text_fg=LVecBase4f(0, 0, 0, 1), text_bg=LVecBase4f(0, 0, 0, 0), parent=self.frmChat, command=base.messenger.send, extraArgs=["sendMessage"], ) self.btnSend.setTransparency(1) self.btnToggleChat = DirectButton( frameColor=(0.15, 0.15, 0.15, 1.0), frameSize=(-0.4, 0.4, -0.02, 0.05), hpr=LVecBase3f(0, 0, 0), pos=LPoint3f(0, 0, -0.05), relief=1, scale=LVecBase3f(1, 1, 1), text='Toggle Chat', text_align=TextNode.A_center, text_scale=(0.05, 0.05), text_pos=(0, 0), text_fg=LVecBase4f(0.8, 0.8, 0.8, 1), text_bg=LVecBase4f(0, 0, 0, 0), parent=rootParent, command=base.messenger.send, extraArgs=["toggleChat"], ) self.btnToggleChat.setTransparency(0)
class SaveForm(SogalForm): ''' Form of saving ''' def __init__(self): ''' Constructor ''' SogalForm.__init__(self, fading = True, fading_duration = 0.5, enableMask = True,backgroundColor= color_themes.ilia_bgColor) self.reparentTo(aspect2d,sort = 102) self.frame = DirectScrolledFrame(parent = self, canvasSize = SAVE_CANVAS_SIZE, frameSize = FRAMESIZE, autoHideScrollBars = AUTO_HIDE_SCROLLBARS, **color_themes.ilia_frame) self.labels = [] self.labelDict = {} self.vbox = VLayout(parent = self.frame.getCanvas(), margin = vspacing) hbox = None self.__dumped = None for i in range(1,MAX_SAVE + 1): fname = 'save' + str(i) head = str(i) label = SaveLoadLabel(command = self.save, always_enable = True, fileName = fname, head = head,extraArgs = [fname],style = color_themes.ilia_button) self.labels.append(label) self.labelDict[label.getFileName()] = label if not hbox: hbox = HLayout(margin = hspacing) self.vbox.append(hbox) hbox.append(label) else: hbox.append(label) hbox = None def roll(self,value): self.frame.verticalScroll.setValue(self.frame.verticalScroll.getValue() + value * SAVE_ROLL_SPEED) def setData(self,dumped,message): self.__dumped = dumped self.__message = message def reload(self): for label in self.labels: label.reload() def reloadMember(self,key): if self.labelDict.has_key(key): self.labelDict[key].reload() def save(self,fname): if self.labelDict[fname].getExists(): ConfirmDialog(text= '要覆盖吗?不覆盖吗?', command = self.confirmedSave, extraArgs = [fname], style = 'ilia') else: self.confirmedSave(fname) def confirmedSave(self,fname): if not self.__dumped: return else: messenger.send('save_data',[self.__dumped, fname, self.__message]) def focused(self): self.accept('mouse3', self.hide) self.accept('escape', self.hide) self.accept('wheel_up', self.roll, [-1.0]) self.accept('wheel_down', self.roll, [1.0]) self.accept('arrow_up-repeat', self.roll, [-1.0]) self.accept('arrow_down-repeat', self.roll, [1.0]) self.accept('arrow_up', self.roll, [-1.0]) self.accept('arrow_down', self.roll, [1.0]) self.accept('w-repeat', self.roll, [-1.0]) self.accept('s-repeat', self.roll, [1.0]) self.accept('w', self.roll, [-1.0]) self.accept('s', self.roll, [1.0]) def defocused(self): self.ignore('mouse3') self.ignore('escape') self.ignore('wheel_up') self.ignore('wheel_down') self.ignore('arrow_up-repeat') self.ignore('arrow_down-repeat') self.ignore('arrow_up') self.ignore('arrow_down') self.ignore('w-repeat') self.ignore('s-repeat') self.ignore('w') self.ignore('s')
class UsersFrm(GameObject): def __init__(self, menu_props, yorg_srv): GameObject.__init__(self) self.eng.log('create users form') self.ver_check = VersionChecker() self.yorg_srv = yorg_srv self.room_name = None self.labels = [] self.invited_users = [] self.menu_props = menu_props lab_args = menu_props.label_args lab_args['scale'] = .046 self.users_lab = Label( text=_('Current online users'), pos=(-.85, -.02), hpr=(0, 0, -90), parent=base.a2dTopRight, text_align=TextNode.A_right, **lab_args) self.frm = DirectScrolledFrame( frameSize=(-.02, .8, .45, 2.43), canvasSize=(-.02, .76, -.08, 3.8), scrollBarWidth=.036, verticalScroll_relief=FLAT, verticalScroll_frameColor=(.2, .2, .2, .4), verticalScroll_thumb_relief=FLAT, verticalScroll_thumb_frameColor=(.8, .8, .8, .6), verticalScroll_incButton_relief=FLAT, verticalScroll_incButton_frameColor=(.8, .8, .8, .6), verticalScroll_decButton_relief=FLAT, verticalScroll_decButton_frameColor=(.8, .8, .8, .6), horizontalScroll_relief=FLAT, frameColor=(.2, .2, .2, .5), pos=(-.82, 1, -2.44), parent=base.a2dTopRight) self.conn_lab = Label( text='', pos=(.38, 1.5), parent=self.frm, text_wordwrap=10, **lab_args) self.set_connection_label() self.in_match_room = None self.invited = False def show(self): self.frm.show() self.users_lab.show() def hide(self): self.frm.hide() self.users_lab.hide() def set_connection_label(self): lab_args = self.menu_props.label_args lab_args['scale'] = .046 txt = '' if not self.ver_check.is_uptodate(): txt = _("Your game isn't up-to-date, please update") elif not self.eng.client.is_server_up: txt = _("Yorg's server isn't running") elif not self.eng.client.authenticated: txt = _("You aren't logged in") (self.conn_lab.show if txt else self.conn_lab.hide)() self.conn_lab['text'] = txt def set_size(self, full=True): if full: self.frm.setPos(-.82, 1, -2.44) self.frm['frameSize'] = (-.02, .8, .45, 2.43) else: self.frm.setPos(-.82, 1, -1.97) self.frm['frameSize'] = (-.02, .8, .45, 1.96) @staticmethod def trunc(name, lgt): if len(name) > lgt: return name[:lgt] + '...' return name def on_users(self): self.set_connection_label() bare_users = [self.trunc(user.uid, 20) for user in self.eng.client.sorted_users] for lab in self.labels[:]: _lab = lab.lab.lab['text'].replace('\1smaller\1', '').replace('\2', '') if _lab not in bare_users: if _lab not in self.eng.client.users: lab.destroy() self.labels.remove(lab) nusers = len(self.eng.client.sorted_users) invite_btn = len(self.invited_users) < 8 invite_btn = invite_btn and not self.in_match_room and not self.invited top = .08 * nusers + .08 self.frm['canvasSize'] = (-.02, .76, 0, top) label_users = [lab.lab.lab['text'] for lab in self.labels] clean = lambda n: n.replace('\1smaller\1', '').replace('\2', '') label_users = list(map(clean, label_users)) for i, user in enumerate(self.eng.client.sorted_users): if self.trunc(user.uid, 20) not in label_users: if self.eng.client.myid != user.uid: lab = UserFrmList( user.uid, user.is_supporter, user.is_playing, (0, 1, top - .08 - .08 * i), self.frm.getCanvas(), self.menu_props) else: lab = UserFrmListMe( user.uid, user.is_supporter, (0, 1, top - .08 - .08 * i), self.frm.getCanvas(), self.menu_props) self.labels += [lab] lab.attach(self.on_invite) lab.attach(self.on_friend) lab.attach(self.on_unfriend) lab.attach(self.on_add_chat) #for i, user in enumerate(self.eng.client.sorted_users): # clean = lambda n: n.replace('\1smaller\1', '').replace('\2', '') # lab = [lab for lab in self.labels # if clean(lab.lab.lab['text']) == self.trunc(user.uid, 20)][0] # enb_val = invite_btn and user.uid not in self.invited_users and not user.is_playing # if hasattr(lab, 'invite_btn'): # inv_btn = lab.invite_btn # if enb_val: inv_btn.tooltip['text'] = _('invite the user to a match') # elif len(self.invited_users) == 8: inv_btn.tooltip['text'] = _("you can't invite more players") # elif self.in_match_room: inv_btn.tooltip['text'] = _("you're already in a match") # elif user.uid in self.invited_users: inv_btn.tooltip['text'] = _("you've already invited this user") # elif user.is_playing: inv_btn.tooltip['text'] = _("the user is already playing a match") # lab.enable_invite_btn(enb_val) # lab.frm.set_z(top - .08 - .08 * i) # lab.lab.set_supporter(user.is_supporter) def on_invite(self, usr): self.notify('on_invite', usr) self.invited_users += [usr.uid] self.on_users() if not self.room_name: time_code = strftime('%y%m%d%H%M%S') self.room_name = self.eng.client.myid + time_code #self.eng.xmpp.client.plugin['xep_0045'].joinMUC( # self.room_name, self.eng.xmpp.client.boundjid.bare, # pfrom=self.eng.xmpp.client.boundjid.full) #cfg = self.eng.xmpp.client.plugin['xep_0045'].getRoomConfig(self.room_name) #values = cfg.get_values() #values['muc#roomconfig_publicroom'] = False #cfg.set_values(values) #self.eng.xmpp.client.plugin['xep_0045'].configureRoom(self.room_name, cfg) self.eng.client.register_rpc('join_room') self.eng.client.join_room(self.room_name) self.eng.log('created room ' + self.room_name) self.eng.client.is_server_active = True #for usr_name in [self.yorg_srv] + \ # [_usr.name_full for _usr in self.eng.xmpp.users if _usr.is_in_yorg]: # self.eng.xmpp.client.send_message( # mfrom=self.eng.xmpp.client.boundjid.full, # mto=usr_name, # mtype='ya2_yorg', # msubject='is_playing', # mbody='1') self.eng.client.register_rpc('invite') ret = self.eng.client.invite(usr.uid, self.room_name) #self.eng.xmpp.client.send_message( # mfrom=self.eng.xmpp.client.boundjid.full, # mto=usr.name_full, # mtype='ya2_yorg', # msubject='invite', # mbody=self.room_name + '\n' + self.eng.server.public_addr + '\n' + self.eng.server.local_addr) if ret == 'ok': self.eng.log('invited ' + str(usr.uid)) self.notify('on_add_groupchat', self.room_name, usr.uid) def on_declined(self, from_): self.eng.log('declined from ' + from_) self.invited_users.remove(from_) self.on_users() def on_add_chat(self, msg): self.notify('on_add_chat', msg) def on_logout(self): list(map(lambda lab: lab.destroy(), self.labels)) self.labels = [] def on_friend(self, usr_name): self.eng.log('send friend to ' + usr_name) self.eng.xmpp.client.send_presence_subscription( usr_name, ptype='subscribe', pfrom=self.eng.xmpp.client.boundjid.full) def on_unfriend(self, usr): self.eng.log('roster ' + str(self.eng.xmpp.client.client_roster)) self.eng.xmpp.client.del_roster_item(usr) self.eng.log('roster ' + str(self.eng.xmpp.client.client_roster)) def destroy(self): self.eng.log('destroyed usersfrm') self.frm = self.frm.destroy() GameObject.destroy(self)
def __init__(self, rootParent=None): self.frmMain = DirectFrame( frameColor=(1, 1, 1, 1), frameSize=(-1.777778, 1.77777778, -1.1638, 1.1638), hpr=LVecBase3f(0, 0, 0), image='assets/menu/Background.png', pos=LPoint3f(0, 0, 0), image_scale=LVecBase3f(1.77778, 1, 1.1638), image_pos=LPoint3f(0, 0, 0), parent=rootParent, ) self.frmMain.setTransparency(0) self.frmRoomList = DirectScrolledFrame( canvasSize=(-1.0, 1.0, -2.0, 0.0), frameColor=(1, 1, 1, 1), frameSize=(-1.0, 1.08, -1.4, 0.0), hpr=LVecBase3f(0, 0, 0), pos=LPoint3f(0, 0, 0.7), scrollBarWidth=0.08, state='normal', horizontalScroll_borderWidth=(0.01, 0.01), horizontalScroll_frameSize=(-0.05, 0.05, -0.04, 0.04), horizontalScroll_hpr=LVecBase3f(0, 0, 0), horizontalScroll_pos=LPoint3f(0, 0, 0), horizontalScroll_decButton_borderWidth=(0.01, 0.01), horizontalScroll_decButton_frameSize=(-0.05, 0.05, -0.04, 0.04), horizontalScroll_decButton_hpr=LVecBase3f(0, 0, 0), horizontalScroll_decButton_pos=LPoint3f(-0.96, 0, -1.36), horizontalScroll_incButton_borderWidth=(0.01, 0.01), horizontalScroll_incButton_frameSize=(-0.05, 0.05, -0.04, 0.04), horizontalScroll_incButton_hpr=LVecBase3f(0, 0, 0), horizontalScroll_incButton_pos=LPoint3f(0.96, 0, -1.36), horizontalScroll_thumb_borderWidth=(0.01, 0.01), horizontalScroll_thumb_hpr=LVecBase3f(0, 0, 0), horizontalScroll_thumb_pos=LPoint3f(0, 0, -1.36), verticalScroll_borderWidth=(0.01, 0.01), verticalScroll_frameSize=(-0.04, 0.04, -0.05, 0.05), verticalScroll_hpr=LVecBase3f(0, 0, 0), verticalScroll_pos=LPoint3f(0, 0, 0), verticalScroll_decButton_borderWidth=(0.01, 0.01), verticalScroll_decButton_frameSize=(-0.04, 0.04, -0.05, 0.05), verticalScroll_decButton_hpr=LVecBase3f(0, 0, 0), verticalScroll_decButton_pos=LPoint3f(1.04, 0, -0.04), verticalScroll_incButton_borderWidth=(0.01, 0.01), verticalScroll_incButton_frameSize=(-0.04, 0.04, -0.05, 0.05), verticalScroll_incButton_hpr=LVecBase3f(0, 0, 0), verticalScroll_incButton_pos=LPoint3f(1.04, 0, -1.28), verticalScroll_thumb_borderWidth=(0.01, 0.01), verticalScroll_thumb_hpr=LVecBase3f(0, 0, 0), verticalScroll_thumb_pos=LPoint3f(1.04, 0, -0.4628), parent=self.frmMain, ) self.frmRoomList.setTransparency(0) self.btnBack = DirectButton( hpr=LVecBase3f(0, 0, 0), pos=LPoint3f(0.96, 0, -0.825), scale=LVecBase3f(0.1, 0.1, 0.1), text='Back', text_align=TextNode.A_center, text_scale=(1, 1), text_pos=(0, 0), text_fg=LVecBase4f(0, 0, 0, 1), text_bg=LVecBase4f(0, 0, 0, 0), parent=self.frmMain, command=base.messenger.send, extraArgs=["roomList_back"], ) self.btnBack.setTransparency(0) self.lblRoomName = DirectLabel( frameColor=(0.8, 0.8, 0.8, 0.0), hpr=LVecBase3f(0, 0, 0), pos=LPoint3f(-1, 0, 0.725), scale=LVecBase3f(0.07, 0.1, 0.07), text='Room Name', text_align=TextNode.A_left, text_scale=(1, 1), text_pos=(0, 0), text_fg=LVecBase4f(0, 0, 0, 1), text_bg=LVecBase4f(0, 0, 0, 0), parent=self.frmMain, ) self.lblRoomName.setTransparency(0) self.lblPlayerCount = DirectLabel( frameColor=(0.8, 0.8, 0.8, 0.0), hpr=LVecBase3f(0, 0, 0), pos=LPoint3f(-0.15, 0, 0.725), scale=LVecBase3f(0.07, 0.1, 0.07), text='Players', text_align=TextNode.A_center, text_scale=(1, 1), text_pos=(0, 0), text_fg=LVecBase4f(0, 0, 0, 1), text_bg=LVecBase4f(0, 0, 0, 0), parent=self.frmMain, ) self.lblPlayerCount.setTransparency(0) self.btnCreateRoom = DirectButton( hpr=LVecBase3f(0, 0, 0), pad=(0.2, 0.2), pos=LPoint3f(-0.955, 0, -0.815), scale=LVecBase3f(0.1, 0.1, 0.1), text='+', text_align=TextNode.A_center, text_scale=(1, 1), text_pos=(0, 0), text_fg=LVecBase4f(0, 0, 0, 1), text_bg=LVecBase4f(0, 0, 0, 0), parent=self.frmMain, ) self.btnCreateRoom.setTransparency(0) self.btnReloadRoomList = DirectButton( hpr=LVecBase3f(0, 0, 0), pos=LPoint3f(0.025, 0, -0.825), scale=LVecBase3f(0.1, 0.1, 0.1), text='Reload Rooms', text_align=TextNode.A_center, text_scale=(1, 1), text_pos=(0, 0), text_fg=LVecBase4f(0, 0, 0, 1), text_bg=LVecBase4f(0, 0, 0, 0), parent=self.frmMain, command=base.messenger.send, extraArgs=["roomList_reload"], ) self.btnReloadRoomList.setTransparency(0) self.lblGameType = DirectLabel( frameColor=(0.8, 0.8, 0.8, 0.0), hpr=LVecBase3f(0, 0, 0), pos=LPoint3f(0.125, 0, 0.725), scale=LVecBase3f(0.07, 0.1, 0.07), text='Type', text_align=TextNode.A_center, text_scale=(1, 1), text_pos=(0, 0), text_fg=LVecBase4f(0, 0, 0, 1), text_bg=LVecBase4f(0, 0, 0, 0), parent=self.frmMain, ) self.lblGameType.setTransparency(0) self.lblDifficulty = DirectLabel( frameColor=(0.8, 0.8, 0.8, 0.0), hpr=LVecBase3f(0, 0, 0), pos=LPoint3f(0.54, 0, 0.72), scale=LVecBase3f(0.07, 0.1, 0.07), text='Difficulty', text_align=TextNode.A_center, text_scale=(1, 1), text_pos=(0, 0), text_fg=LVecBase4f(0, 0, 0, 1), text_bg=LVecBase4f(0, 0, 0, 0), parent=self.frmMain, ) self.lblDifficulty.setTransparency(0)
def __init__(self, menu_args): GameObject.__init__(self) self.eng.log('created message form') self.chats = [] self.curr_chat = None self.curr_match_room = None self.msg_frm = DirectFrame(frameSize=(-.02, .8, 0, .45), frameColor=(.2, .2, .2, .5), pos=(-.82, 1, .02), parent=base.a2dBottomRight) self.presences_sent = [] self.menu_args = menu_args t_a = menu_args.text_args t_a['scale'] = .05 t_a['fg'] = menu_args.text_normal self.dst_txt = OnscreenText(text='', pos=(0, .4), parent=self.msg_frm, align=TextNode.A_left, **t_a) self.arrow_btn = ImgBtn(parent=self.msg_frm, scale=.024, pos=(.7, 1, .42), frameColor=(1, 1, 1, 1), frameTexture='assets/images/gui/arrow.txo', command=self.on_arrow, **menu_args.imgbtn_args) self.arrow_btn.disable() self.close_btn = ImgBtn(parent=self.msg_frm, scale=.024, pos=(.76, 1, .42), frameColor=(1, 1, 1, 1), frameTexture='assets/images/gui/close.txo', command=self.on_close, **menu_args.imgbtn_args) self.close_btn.disable() self.ent = Entry(scale=.04, pos=(0, 1, .03), entryFont=menu_args.font, width=19.5, frameColor=menu_args.btn_color, parent=self.msg_frm, initialText=_('write here your message'), command=self.on_typed_msg, focusInCommand=self.on_focus, focusInExtraArgs=['in'], focusOutCommand=self.on_focus, focusOutExtraArgs=['out'], text_fg=menu_args.text_active) self.ent['state'] = DISABLED self.txt_frm = DirectScrolledFrame( frameSize=(-.02, .76, -.02, .28), canvasSize=(-.02, .72, -.02, .28), scrollBarWidth=.036, verticalScroll_relief=FLAT, verticalScroll_frameColor=(.2, .2, .2, .4), verticalScroll_thumb_relief=FLAT, verticalScroll_thumb_frameColor=(.8, .8, .8, .6), verticalScroll_incButton_relief=FLAT, verticalScroll_incButton_frameColor=(.8, .8, .8, .6), verticalScroll_decButton_relief=FLAT, verticalScroll_decButton_frameColor=(.8, .8, .8, .6), horizontalScroll_relief=FLAT, frameColor=(1, 1, 1, 0), pos=(.02, 1, .11), parent=self.msg_frm) t_a['scale'] = .046 self.msg_txt = OnscreenText(text='', pos=(0, .24), parent=self.txt_frm.getCanvas(), align=TextNode.A_left, wordwrap=14, **t_a) lab_args = menu_args.label_args lab_args['scale'] = .046 lab_args['text_fg'] = menu_args.text_normal self.lab_frm = Btn(frameSize=(-.02, .64, -.01, .05), frameColor=(1, 1, 1, 0), pos=(0, 1, .4), parent=self.msg_frm) self.lab_frm.bind(ENTER, self.on_enter) self.lab_frm.bind(EXIT, self.on_exit) self.tooltip = DirectLabel(text='', pos=(.78, 1, -.06), parent=self.lab_frm, text_wordwrap=16, text_bg=(.2, .2, .2, .8), text_align=TextNode.A_right, **lab_args) self.tooltip.set_bin('gui-popup', 10) self.tooltip.hide()
class SaveForm(SogalForm): ''' Form of saving ''' def __init__(self): ''' Constructor ''' SogalForm.__init__(self, fading=True, fading_duration=0.5, enableMask=True, backgroundColor=color_themes.ilia_bgColor) self.reparentTo(aspect2d, sort=102) self.frame = DirectScrolledFrame( parent=self, canvasSize=SAVE_CANVAS_SIZE, frameSize=FRAMESIZE, autoHideScrollBars=AUTO_HIDE_SCROLLBARS, **color_themes.ilia_frame) self.labels = [] self.labelDict = {} self.vbox = VLayout(parent=self.frame.getCanvas(), margin=vspacing) hbox = None self.__dumped = None for i in range(1, MAX_SAVE + 1): fname = 'save' + str(i) head = str(i) label = SaveLoadLabel(command=self.save, always_enable=True, fileName=fname, head=head, extraArgs=[fname], style=color_themes.ilia_button) self.labels.append(label) self.labelDict[label.getFileName()] = label if not hbox: hbox = HLayout(margin=hspacing) self.vbox.append(hbox) hbox.append(label) else: hbox.append(label) hbox = None def roll(self, value): self.frame.verticalScroll.setValue( self.frame.verticalScroll.getValue() + value * SAVE_ROLL_SPEED) def setData(self, dumped, message): self.__dumped = dumped self.__message = message def reload(self): for label in self.labels: label.reload() def reloadMember(self, key): if self.labelDict.has_key(key): self.labelDict[key].reload() def save(self, fname): if self.labelDict[fname].getExists(): ConfirmDialog(text='要覆盖吗?不覆盖吗?', command=self.confirmedSave, extraArgs=[fname], style='ilia') else: self.confirmedSave(fname) def confirmedSave(self, fname): if not self.__dumped: return else: messenger.send('save_data', [self.__dumped, fname, self.__message]) def focused(self): self.accept('mouse3', self.hide) self.accept('escape', self.hide) self.accept('wheel_up', self.roll, [-1.0]) self.accept('wheel_down', self.roll, [1.0]) self.accept('arrow_up-repeat', self.roll, [-1.0]) self.accept('arrow_down-repeat', self.roll, [1.0]) self.accept('arrow_up', self.roll, [-1.0]) self.accept('arrow_down', self.roll, [1.0]) self.accept('w-repeat', self.roll, [-1.0]) self.accept('s-repeat', self.roll, [1.0]) self.accept('w', self.roll, [-1.0]) self.accept('s', self.roll, [1.0]) def defocused(self): self.ignore('mouse3') self.ignore('escape') self.ignore('wheel_up') self.ignore('wheel_down') self.ignore('arrow_up-repeat') self.ignore('arrow_down-repeat') self.ignore('arrow_up') self.ignore('arrow_down') self.ignore('w-repeat') self.ignore('s-repeat') self.ignore('w') self.ignore('s')
class PipeViewer(DraggableWindow): """ Small tool which displays the order of the graphic pipes """ _STAGE_MGR = None @classmethod def register_stage_mgr(cls, mgr): """ Sets the stage manager, this is a workaround to prevent circular imports, since the pipe viewer is already included from the StageManager """ cls._STAGE_MGR = mgr def __init__(self, pipeline, parent): """ Constructs the pipe viewer """ DraggableWindow.__init__(self, width=1300, height=900, parent=parent, title="Pipeline Visualizer") self._pipeline = pipeline self._scroll_width = 8000 self._scroll_height = 3000 self._created = False self._create_components() self.hide() def toggle(self): """ Toggles the pipe viewer """ if self._visible: Globals.base.taskMgr.remove("RP_GUI_UpdatePipeViewer") self.hide() else: Globals.base.taskMgr.add(self._update_task, "RP_GUI_UpdatePipeViewer") if not self._created: self._populate_content() self.show() def _update_task(self, task=None): """ Updates the viewer """ scroll_value = self._content_frame.horizontalScroll["value"] scroll_value *= 2.45 self._pipe_descriptions.set_x(scroll_value * 2759.0) return task.cont def _populate_content(self): # pylint: disable=too-many-branches,too-many-statements """ Reads the pipes and stages from the stage manager and renders those into the window """ self._created = True self._pipe_node = self._content_node.attach_new_node("pipes") self._pipe_node.set_scale(1, 1, -1) self._stage_node = self._content_node.attach_new_node("stages") current_pipes = [] pipe_pixel_size = 3 pipe_height = 100 # Generate stages for offs, stage in enumerate(self._STAGE_MGR.stages): node = self._content_node.attach_new_node("stage") node.set_pos(220 + offs * 200.0, 0, 20) node.set_scale(1, 1, -1) DirectFrame(parent=node, frameSize=(10, 150, 0, -3600), frameColor=(0.2, 0.2, 0.2, 1)) Text(text=str(stage.debug_name.replace("Stage", "")), parent=node, x=20, y=25, size=15) for output_pipe, pipe_tex in iteritems(stage.produced_pipes): pipe_idx = 0 r, g, b = rgb_from_string(output_pipe) if output_pipe in current_pipes: pipe_idx = current_pipes.index(output_pipe) else: current_pipes.append(output_pipe) pipe_idx = len(current_pipes) - 1 DirectFrame(parent=node, frameSize=(0, 8000, pipe_pixel_size / 2, -pipe_pixel_size / 2), frameColor=(r, g, b, 1), pos=(10, 1, -95 - pipe_idx * pipe_height)) w = 160 h = Globals.native_resolution.y /\ float(Globals.native_resolution.x) * w DirectFrame(parent=node, frameSize=(-pipe_pixel_size, w + pipe_pixel_size, h / 2 + pipe_pixel_size, -h / 2 - pipe_pixel_size), frameColor=(r, g, b, 1), pos=(0, 1, -95 - pipe_idx * pipe_height)) if isinstance(pipe_tex, (list, tuple)): pipe_tex = pipe_tex[0] if isinstance(pipe_tex, (SimpleInputBlock, GroupedInputBlock)): icon_file = "/$$rp/data/gui/icon_ubo.png" elif pipe_tex.get_z_size() > 1: icon_file = "/$$rp/data/gui/icon_texture.png" elif pipe_tex.get_texture_type() == Texture.TT_buffer_texture: icon_file = "/$$rp/data/gui/icon_buffer_texture.png" else: icon_file = None preview = Sprite(image=pipe_tex, parent=node, x=0, y=50 + pipe_idx * pipe_height, w=w, h=h, any_filter=False, transparent=False) preview_shader = DisplayShaderBuilder.build( pipe_tex, int(w), int(h)) preview.set_shader(preview_shader) preview.set_shader_inputs(mipmap=0, slice=0, brightness=1, tonemap=False) if icon_file: Sprite(image=icon_file, parent=node, x=55, y=65 + pipe_idx * pipe_height, w=48, h=48, near_filter=False, transparent=True) if isinstance(pipe_tex, (SimpleInputBlock, GroupedInputBlock)): tex_desc = "UBO" else: tex_desc = pipe_tex.format_texture_type( pipe_tex.get_texture_type()) tex_desc += " - " + pipe_tex.format_format( pipe_tex.get_format()).upper() Text(text=tex_desc, parent=node, x=55 + 48 / 2, y=130 + pipe_idx * pipe_height, color=Vec3(0.2), size=12, align="center") for input_pipe in stage.required_pipes: if input_pipe not in current_pipes: self.warn("Pipe not found:", input_pipe) continue idx = current_pipes.index(input_pipe) r, g, b = rgb_from_string(input_pipe) DirectFrame(parent=node, frameSize=(0, 10, 40, -40), frameColor=(r, g, b, 1), pos=(5, 1, -95 - idx * pipe_height)) self._pipe_descriptions = self._content_node.attach_new_node( "PipeDescriptions") self._pipe_descriptions.set_scale(1, 1, -1) DirectFrame(parent=self._pipe_descriptions, frameSize=(0, 190, 0, -5000), frameColor=(0.1, 0.1, 0.1, 1.0)) # Generate the pipe descriptions for idx, pipe in enumerate(current_pipes): r, g, b = rgb_from_string(pipe) DirectFrame(parent=self._pipe_descriptions, frameSize=(0, 180, -95, -135), frameColor=(r, g, b, 1.0), pos=(0, 1, -idx * pipe_height)) Text(parent=self._pipe_descriptions, text=pipe, x=42, y=121 + idx * pipe_height, size=15, color=Vec3(0.1)) Sprite(parent=self._pipe_descriptions, x=9, y=103 + idx * pipe_height, image="/$$rp/data/gui/icon_pipe.png", transparent=True, near_filter=False) def _create_components(self): """ Internal method to create the window components """ DraggableWindow._create_components(self) self._content_frame = DirectScrolledFrame( frameSize=(0, self._width - 40, 0, self._height - 80), canvasSize=(0, self._scroll_width, 0, self._scroll_height), autoHideScrollBars=False, scrollBarWidth=20.0, frameColor=(0, 0, 0, 0), verticalScroll_relief=False, horizontalScroll_relief=False, parent=self._node, pos=(20, 1, -self._height + 20)) self._content_node = self._content_frame.getCanvas().attach_new_node( "PipeComponents") self._content_node.set_scale(1, 1, -1) self._content_node.set_z(self._scroll_height)
def __init__(self, parent): height = DGH.getRealHeight(parent) self.parent = parent self.box = DirectBoxSizer(frameColor=(0.25, 0.25, 0.25, 1), autoUpdateFrameSize=False, orientation=DGG.VERTICAL) self.sizer = DirectAutoSizer(parent=parent, child=self.box, childUpdateSizeFunc=self.box.refresh) self.lblHeader = DirectLabel( text="Toolbox", text_scale=16, text_align=TextNode.ALeft, text_fg=(1, 1, 1, 1), frameColor=VBase4(0, 0, 0, 0), ) self.box.addItem(self.lblHeader) color = ( (0.8, 0.8, 0.8, 1), # Normal (0.9, 0.9, 1, 1), # Click (0.8, 0.8, 1, 1), # Hover (0.5, 0.5, 0.5, 1)) # Disabled self.toolboxFrame = DirectScrolledFrame( # make the frame fit into our background frame frameSize=VBase4( self.parent["frameSize"][0], self.parent["frameSize"][1], self.parent["frameSize"][2] + DGH.getRealHeight(self.lblHeader), self.parent["frameSize"][3]), scrollBarWidth=20, verticalScroll_scrollSize=20, verticalScroll_thumb_relief=DGG.FLAT, verticalScroll_incButton_relief=DGG.FLAT, verticalScroll_decButton_relief=DGG.FLAT, verticalScroll_thumb_frameColor=color, verticalScroll_incButton_frameColor=color, verticalScroll_decButton_frameColor=color, horizontalScroll_thumb_relief=DGG.FLAT, horizontalScroll_incButton_relief=DGG.FLAT, horizontalScroll_decButton_relief=DGG.FLAT, horizontalScroll_thumb_frameColor=color, horizontalScroll_incButton_frameColor=color, horizontalScroll_decButton_frameColor=color, state=DGG.NORMAL) self.box.addItem(self.toolboxFrame) self.toolboxFrame.bind(DGG.MWDOWN, self.scroll, [0.01]) self.toolboxFrame.bind(DGG.MWUP, self.scroll, [-0.01]) self.toolboxEntries = [ ["~Interactive Elements~"], ["Button", "DirectButton"], ["Entry", "DirectEntry"], ["Scrolled Entry", "DirectEntryScroll"], ["Check Box", "DirectCheckBox"], ["Check Button", "DirectCheckButton"], ["Option Menu", "DirectOptionMenu"], ["Radio Button", "DirectRadioButton"], ["Slider", "DirectSlider"], ["Scroll Bar", "DirectScrollBar"], ["Scrolled List Item", "DirectScrolledListItem"], ["~Display Elements~"], ["Label", "DirectLabel"], ["Wait Bar", "DirectWaitBar"], ["~Container~"], ["Frame", "DirectFrame"], ["Scrolled Frame", "DirectScrolledFrame"], ["Scrolled List", "DirectScrolledList"], ["~Dialogs~"], ["OK Dialog", "OkDialog"], ["OK Cancel Dialog", "OkCancelDialog"], ["Yes No Dialog", "YesNoDialog"], ["Yes No Cancel Dialog", "YesNoCancelDialog"], ["Retry Cancel Dialog", "RetryCancelDialog"], ] self.createEntries()