from TSMaster import *

class SwitchBox(PaintBox):
  '''Emulate a relay like switch box
  Usage:
    sw = TSExtControls.SwitchBox(self)
    sw.SetBounds(100, 100, 100, 50)
    def OnSwitched(sender):
      print("switch state changed to", sw.IsConnected)
    sw.OnSwitchChange = OnSwitched
  '''
  def __init__(self, AParent):
    self.Parent = AParent
    self.Cursor = crArrow
    self.Width = 100
    self.Height = 50
    self.__OnSwitchChange = None
    self.__isConnected = False
    def OnSwitchPaint(sender):
      c = self.Canvas
      c.Brush.Color = cl3DLight
      c.Pen.Width = 3
      c.Pen.Color = clBlack
      r = Rect(0, 0, self.Width, self.Height)      
      c.FillRect(r)
      y = self.Height // 2
      x = self.Width // 3
      # draw left line
      c.MoveTo(0, y)
      c.LineTo(x, y)
      # draw right line
      c.MoveTo(x + x, y)
      c.LineTo(self.Width, y)
      # draw circle
      r = min(x, y) // 5      
      c.Pen.Color = clBlue
      c.Pen.Width = 3
      if self.__isConnected:        
        c.MoveTo(x + r + r, y)
        c.LineTo(x + x, y)
      else:
        c.MoveTo(x + r, y)
        c.LineTo(x + x, y - y // 2)
      c.Pen.Color = clBlack
      c.Ellipse(x, y - r, x + r + r, y + r)
    self.OnPaint = OnSwitchPaint
    def OnSwitchClick(sender):
      self.IsConnected = not self.IsConnected
      self.Refresh()
    self.OnClick = OnSwitchClick

  def getIsConnected(self):
    return self.__isConnected

  def setIsConnected(self, AConnected):
    self.__isConnected = AConnected
    if self.__OnSwitchChange != None:
      self.__OnSwitchChange(self)
    self.Refresh()
  
  def getOnSwitchChange(self):
    return self.__OnSwitchChange

  def setOnSwitchChange(self, AOnSwChange):
    self.__OnSwitchChange = AOnSwChange

  IsConnected = property(getIsConnected, setIsConnected, None, "Whether switch box is connected")
  OnSwitchChange = property(getOnSwitchChange, setOnSwitchChange, None, "On switched event callback")
