import wx
from wx.lib.floatcanvas import FloatCanvas

class TestFrame(wx.Frame):
    def __init__(self, *args, **kwargs):
        wx.Frame.__init__(self, *args, **kwargs)
        self.canvas =FloatCanvas.FloatCanvas(self, BackgroundColor = "DARK SLATE BLUE")
        MainSizer = wx.BoxSizer(wx.VERTICAL)
        MainSizer.Add(self.canvas, 4, wx.EXPAND)
        self.SetSizer(MainSizer)
        ## self.canvas.Bind(FloatCanvas.EVT_LEFT_DOWN, self.OnLeftDown)
        self.A = self.canvas.AddRectangle((10,10), (100, 20), FillColor="red")
        # self.A.leftIsDown = False
        self.A.Bind(FloatCanvas.EVT_FC_LEFT_DOWN, self.OnRectDown)
        self.A.Bind(FloatCanvas.EVT_FC_LEFT_UP, self.OnRectUp)    #  Comment this line, no more crash
        wx.CallAfter(self.canvas.ZoomToBB)

    def OnLeftUp(self, event):
        if self.HasCapture():
            self.ReleaseMouse()
        self.A.leftIsDown = False
        print('OnLeftUp')
        
    def OnLeftDown(self, event):
        ## print('Left Button down clicked at:', event.Coords)
        print('Left Button down clicked at:', event.GetPosition())
        print('------')
        if self.HasCapture():
            self.ReleaseMouse()
        self.CaptureMouse()

    def OnRectDown(self, event):
        print('Rectangle: Left Button down clicked at:', event.HitCoords)
        # print('self.A.leftIsDown = %s' % self.A.leftIsDown)
        print('------')
        # self.A.leftIsDown = True
        # if self.HasCapture():
            # self.ReleaseMouse()
        # self.CaptureMouse()
        ## self.canvas.CaptureMouse()

    def OnRectUp(self, event):
        print('Rectangle: Left Button up clicked at:', event.HitCoords)
        # print('self.A.leftIsDown = %s' % self.A.leftIsDown)
        print('------')
        # self.A.leftIsDown = False
        # if self.HasCapture():
            # self.ReleaseMouse()
        ## if self.canvas.HasCapture():
        ##     self.canvas.ReleaseMouse()

app = wx.App(0)
frame = TestFrame(None, title = "Mouse Event Tester")
frame.Show(True)
app.Bind(wx.EVT_LEFT_DOWN, frame.OnLeftDown)
app.Bind(wx.EVT_LEFT_UP, frame.OnLeftUp)
app.MainLoop()
