Ejemplo n.º 1
0
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)
Ejemplo n.º 2
0
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()