class _BaseButton(Window): class WidthType(object): STRETCH = 0 REPEAT = 1 BASE_PATH = "%s/controls/common/button/" % illumina.BASE_PATH IMAGES = None OPACITY = { _ButtonState.NORMAL: 1.0, _ButtonState.HOVER: 1.0, _ButtonState.ACTIVE: 1.0, _ButtonState.DISABLED: 1.0 } WIDTH = None HEIGHT = None WIDTH_TYPE = None TEXT_COLOR = None def __init__(self, layer="UI"): Window.__init__(self, layer) self.__state = _ButtonState.NORMAL self.__CreateUI() self._SetEventListeners() self.SetWidth(0) self.SetState(_ButtonState.NORMAL) def __del__(self): Window.__del__(self) def __CreateUI(self): self.__dictImages = { 'LEFT': { _ButtonState.NORMAL: ImageBox(), _ButtonState.HOVER: ImageBox(), _ButtonState.ACTIVE: ImageBox(), _ButtonState.DISABLED: ImageBox() }, 'CENTER': { _ButtonState.NORMAL: ExpandedImageBox(), _ButtonState.HOVER: ExpandedImageBox(), _ButtonState.ACTIVE: ExpandedImageBox(), _ButtonState.DISABLED: ExpandedImageBox() }, 'RIGHT': { _ButtonState.NORMAL: ImageBox(), _ButtonState.HOVER: ImageBox(), _ButtonState.ACTIVE: ImageBox(), _ButtonState.DISABLED: ImageBox() } } self.__txtText = None for position, imageDictByState in self.__dictImages.iteritems(): for state, image in imageDictByState.iteritems(): image.SetParent(self) image.AddFlag("not_pick") image.LoadImage(self.IMAGES[position][state]) image.Hide() def _SetEventListeners(self): self.AddEventListener( _BaseButton.Events.ON_MOUSE_OVER_IN, lambda state=_ButtonState.HOVER: self.SetState(state, True)) self.AddEventListener( _BaseButton.Events.ON_MOUSE_OVER_OUT, lambda state=_ButtonState.NORMAL: self.SetState(state, True)) self.AddEventListener( _BaseButton.Events.ON_MOUSE_LEFT_BUTTON_DOWN, lambda state=_ButtonState.ACTIVE: self.SetState(state, True)) self.AddEventListener(_BaseButton.Events.ON_MOUSE_LEFT_BUTTON_UP, self.OnClick) self.AddEventListener(_BaseButton.Events.ON_CLICK, lambda state=-1: self.SetState(state, True)) def __RefreshButton(self): for position, imageDictByState in self.__dictImages.iteritems(): for state, image in imageDictByState.iteritems(): if state != self.GetState(): image.Hide() else: image.SetAlpha(self.OPACITY[self.GetState()]) image.Show() self.UpdateTextColor() def GetState(self): return self.__state def SetState(self, state, byEvent=False): if byEvent and self.IsDisabled(): return callEnableEvent = self.GetState() == _ButtonState.DISABLED self.__state = state if self.GetState() < _ButtonState.NORMAL or self.GetState( ) > _ButtonState.DISABLED: if self.IsIn(): self.__state = _ButtonState.HOVER else: self.__state = _ButtonState.NORMAL self.__RefreshButton() if callEnableEvent: self.CallEventListener(_BaseButton.Events.ON_ENABLE) elif self.IsDisabled(): self.CallEventListener(_BaseButton.Events.ON_DISABLE) def SetEnabled(self, enabled=True): if enabled and self.IsDisabled(): self.SetState(_ButtonState.NORMAL) elif not enabled and not self.IsDisabled(): self.SetState(_ButtonState.DISABLED) def IsDisabled(self): return self.GetState() == _ButtonState.DISABLED def SetWidth(self, width): width = max(self.WIDTH['LEFT'] + self.WIDTH['RIGHT'], width) self.SetSize(width, self.HEIGHT) for image in self.__dictImages['CENTER'].itervalues(): image.SetPosition(self.WIDTH['LEFT'], 0) rect = float(width - (self.WIDTH['LEFT'] + self.WIDTH['RIGHT'])) / float( self.WIDTH['CENTER']) if self.WIDTH_TYPE == _BaseButton.WidthType.STRETCH: image.SetScale(rect, 1.0) else: image.SetRenderingRect(0.0, 0.0, -1.0 + rect, 0.0) for image in self.__dictImages['RIGHT'].itervalues(): image.SetPosition(width - self.WIDTH['RIGHT'], 0) self.UpdateText() ## Text def SetText(self, text): if not self.__txtText: self.__txtText = TextLine() self.__txtText.SetParent(self) self.__txtText.AddFlag("not_pick") self.__txtText.SetHorizontalAlignCenter() self.__txtText.SetVerticalAlignCenter() self.__txtText.Show() self.UpdateText() self.UpdateTextColor() self.__txtText.SetText(text) def GetText(self): if not self.__txtText: return "" return self.__txtText.GetText() def UpdateText(self): if not self.__txtText: return self.__txtText.SetPosition(self.GetWidth() / 2, self.GetHeight() / 2 - 2) def UpdateTextColor(self): if not self.__txtText: return self.__txtText.SetPackedFontColor(self.TEXT_COLOR[self.GetState()]) ################################################## ## EVENTS class Events(Window.Events): ON_CLICK = EventEnum() ON_DISABLE = EventEnum() ON_ENABLE = EventEnum() def OnClick(self): if self.IsDisabled(): return self.CallEventListener(_BaseButton.Events.ON_CLICK)
class Expander(Window): BASE_PATH = "%s/controls/common/expander/" % illumina.BASE_PATH IMAGES = { 'LEFT' : { ExpanderState.COLLAPSED : "left_01_normal.tga", ExpanderState.EXPANDED : "left_02_hover.tga" }, 'CENTER' : { ExpanderState.COLLAPSED : "center_01_normal.tga", ExpanderState.EXPANDED : "center_02_hover.tga" }, 'RIGHT' : { ExpanderState.COLLAPSED : "right_01_normal.tga", ExpanderState.EXPANDED : "right_02_hover.tga" } } MIN_WIDTH = 30 HEIGHT = 30 def __init__(self, layer = "UI"): Window.__init__(self, layer) self.__state = ExpanderState.COLLAPSED self.__arrowRotation = 0.0 self.__CreateUI() self.__SetEventListeners() self.SetWidth(0) self.SetState(ExpanderState.COLLAPSED) def __del__(self): Window.__del__(self) def __CreateUI(self): self.__dictImages = { 'LEFT' : { ExpanderState.EXPANDED : ImageBox(), ExpanderState.COLLAPSED : ImageBox() }, 'CENTER' : { ExpanderState.EXPANDED : ExpandedImageBox(), ExpanderState.COLLAPSED : ExpandedImageBox() }, 'RIGHT' : { ExpanderState.EXPANDED : ImageBox(), ExpanderState.COLLAPSED : ImageBox() } } self.__txtText = None for position, imageDictByState in self.__dictImages.iteritems(): for state, image in imageDictByState.iteritems(): image.SetParent(self) image.AddFlag("not_pick") image.LoadImage("%s/%s" % (Expander.BASE_PATH, Expander.IMAGES[position][state])) image.Hide() self.__imgArrowBackground = ImageBox() self.__imgArrowBackground.SetParent(self) self.__imgArrowBackground.AddFlag("not_pick") self.__imgArrowBackground.SetPosition(0, 0) self.__imgArrowBackground.LoadImage("%s/arrow_bg.tga" % Expander.BASE_PATH) self.__imgArrowBackground.Show() self.__imgArrow = ExpandedImageBox() self.__imgArrow.SetParent(self.__imgArrowBackground) self.__imgArrow.AddFlag("not_pick") self.__imgArrow.SetPosition(0, 0) self.__imgArrow.LoadImage("%s/arrow.tga" % Expander.BASE_PATH) self.__imgArrow.SetHorizontalAlign(wndMgr.HORIZONTAL_ALIGN_CENTER) self.__imgArrow.SetVerticalAlign(wndMgr.VERTICAL_ALIGN_CENTER) self.__imgArrow.Show() def __SetEventListeners(self): self.AddEventListener(Expander.Events.ON_MOUSE_OVER_IN, lambda : self.__RefreshButton(ExpanderState.EXPANDED)) self.AddEventListener(Expander.Events.ON_MOUSE_OVER_OUT, lambda : self.__RefreshButton(ExpanderState.COLLAPSED)) self.AddEventListener(Expander.Events.ON_MOUSE_LEFT_BUTTON_UP, lambda : self.SetState(ExpanderState.EXPANDED if self.GetState() == ExpanderState.COLLAPSED else ExpanderState.COLLAPSED)) def __RefreshButton(self, expandingState): for position, imageDictByState in self.__dictImages.iteritems(): for state, image in imageDictByState.iteritems(): if state != expandingState: image.Hide() else: image.Show() if self.GetState() == ExpanderState.COLLAPSED: self.__imgArrow.SetRotation(self.__arrowRotation) else: self.__imgArrow.SetRotation(180.0 + self.__arrowRotation) def GetState(self): return self.__state def SetState(self, state): self.__state = state self.__RefreshButton(self.__state) def SetWidth(self, width): width = max(Expander.MIN_WIDTH, width) self.SetSize(width, Expander.HEIGHT) for image in self.__dictImages['CENTER'].itervalues(): image.SetPosition(5, 0) image.SetScale(float(width - 10), 1.0) for image in self.__dictImages['RIGHT'].itervalues(): image.SetPosition(width - 5, 0) self.UpdateText() def SetArrowRotation(self, rotation): self.__arrowRotation = rotation self.__imgArrow.SetRotation(rotation) ## Text def SetText(self, text): if not self.__txtText: self.__txtText = TextLine() self.__txtText.SetParent(self) self.__txtText.AddFlag("not_pick") self.__txtText.SetVerticalAlignCenter() self.__txtText.SetPackedFontColor(0xFFE6D0A2) self.__txtText.Show() self.UpdateText() self.__txtText.SetText(text) def GetText(self): if not self.__txtText: return "" return self.__txtText.GetText() def UpdateText(self): if not self.__txtText: return self.__txtText.SetPosition(35, self.GetHeight() / 2 - 2) ################################################## ## EVENTS class Events(Window.Events): ON_EXPAND = EventEnum() ON_COLLAPSE = EventEnum()