#!/usr/bin/env python

"""
A small demo of how to use Groups of Objects

"""

import wx

# import the installed version
from wx.lib.floatcanvas import NavCanvas, FloatCanvas
import wx.lib.floatcanvas.FloatCanvas as fc


### import a local version
#import sys
#sys.path.append("..")
#from floatcanvas import NavCanvas, FloatCanvas

import rack_utils as rutils

class DrawFrame(wx.Frame):

    """
    A frame used for the FloatCanvas Demo

    """

    def __init__(self, *args, **kwargs):
        wx.Frame.__init__(self, *args, **kwargs)

        self.CreateStatusBar()

        # Add the Canvas
        NC = NavCanvas.NavCanvas(self,-1,
                                     size = (500,500),
                                     ProjectionFun = None,
                                     Debug = 0,
                                     BackgroundColor = "DARK SLATE BLUE",
                                     )
        Canvas = NC.Canvas
        self.Canvas = Canvas

        FloatCanvas.EVT_MOTION(self.Canvas, self.OnMove ) 

        Point = (45,40)

        ## create a few Objects:
        C = FloatCanvas.Circle((0, 0), 10, FillColor="Red")
        R = FloatCanvas.Rectangle((5, 5),(15, 8), FillColor="Blue")
        E = FloatCanvas.Ellipse((1.5, 1.5), (12, 8), FillColor="Purple")
        C2 = FloatCanvas.Circle((0, 5), 10, FillColor="cyan")
        T = FloatCanvas.Text("Group A", (5.5, 5.5), Position="cc", Size = 16, Weight=wx.BOLD, Family=wx.SWISS)

        self.GroupA = FloatCanvas.Group()
        Canvas.AddObject(self.GroupA)
        self.GroupA.AddObject(C2)
        self.GroupA.AddObject(T)
        self.GroupA.AddObject(R)
        self.GroupA.AddObject(C)
        self.GroupA.AddObject(E)

        
        ## create another Groups of objects

        R = FloatCanvas.Rectangle((15, 15),(10, 18), FillColor="orange")
        E = FloatCanvas.Ellipse((22, 28), (12, 8), FillColor="yellow")
        C = FloatCanvas.Circle((25, 20), 15, FillColor="Green")
        C2 = FloatCanvas.Circle((12, 22), 10, FillColor="cyan")
        T = FloatCanvas.Text("Group B", (19, 24), Position="cc", Size = 16, Weight=wx.BOLD, Family=wx.SWISS)

        self.GroupB = FloatCanvas.Group()
        Canvas.AddObject(self.GroupB)
        self.GroupB.AddObjects((R,E,C,C2,T))
       
        self.Groups = {"A":self.GroupA, "B":self.GroupB}
        
        # add another rect to show problem
        self._rackModules = []
        self._rackModulesCount = 0
        
        self.doUnitSingleBottle()
        print "BB:", self.rackUnit.BoundingBox
        BB = self.rackUnit.BoundingBox
        pr = FloatCanvas.Rectangle((BB.Right,BB.Bottom),
                                   (10, 18),
                                   FillColor="yellow")
        Canvas.AddObject(pr)

        # Add a couple of tools to the Canvas Toolbar

        tb = NC.ToolBar
#        tb.AddSeparator()

        for Group in self.Groups.keys():
            Button = wx.Button(tb, wx.ID_ANY, "Hide/Show%s"%Group)
            tb.AddControl(Button)
            print Group
            Button.Bind(wx.EVT_BUTTON, lambda evt, group=Group: self.HideGroup(evt, group))
        tb.Realize()

        self.Show()
        Canvas.ZoomToBB()

    def OnMove(self, event):
        """
        Updates the status bar with the world coordinates of the mouse position

        """
        self.SetStatusText("%.2f, %.2f"%tuple(event.Coords))

    def HideGroup(self, evt, group=""):
        G = self.Groups[group]
        G.Visible = not G.Visible
        self.Canvas.Draw(Force=True)

#added stuff
    def getStartPos(self):
        if self.Canvas.BoundingBoxDirty:
            self.Canvas._ResetBoundingBox()

        bBox = self.Canvas.BoundingBox[1]
        if bBox.IsNull():
            startPos = 0
        else:
            startPos = bBox[0]

        return startPos


    # fake it a bit
    def doUnitSingleBottle(self, rows=5, cols=5, rtype=2, convert=False):
        """a single, double or 'alternatively' stacked bottle rack

        :param int `rows`: number of rows to create
        :param int `cols`: number of columns to create
        :param int `rtype`: see rutils.RACKTYPE* for valid entries
        :param boolean `convert`: convert a v3 rack

        """
        wx.BeginBusyCursor()

        rackUnit = rutils.MovingGroup()
        self.Canvas.AddObject(rackUnit)
        self._rackModules.append(rackUnit)
        self._rackModulesCount += 1

        startPos = self.getStartPos() + 2

        # define start positions
        if rtype == 1:
            startRowPos = -10
            startColPos = startPos -10
            colIncr = 20
        if rtype == 2:
            startRowPos = -10
            startColPos = startPos -10
            startBackRowPos = 0
            startBackColPos = startPos
            colIncr = 20
            doubleSize = 10
        if rtype == 3:
            startRowPos = -20
            startColPos = startPos -20
            startBackRowPos = -5
            startBackColPos = startPos -5
            colIncr = 30
            doubleSize = 20

        if rtype in [2,
                     3]:
            nRows = rows + 1
            nCols = cols
            step = -2
        else:
            nRows = rows
            nCols = cols
            step = -1

        for rowPos in range(nRows, 0, step):
            # create the rows
            startRowPos += colIncr
            actColPos = startColPos

            for colPos in range(nCols):
                actColPos += colIncr
                bot = rutils.MovingCircle((actColPos, startRowPos), 20,
                                   LineColor='blue', LineWidth=2)
        if rtype in [2,
                     3]:
            # double stack
            nRows = rows - 1
            nCols += -1
            for rowPos in range(nRows, 0, step):
                startBackRowPos += colIncr
                actColPos = startBackColPos

                for colPos in range(nCols):
                    actColPos += colIncr
                    bot = rutils.MovingCircle((actColPos, startBackRowPos),
                                       doubleSize, LineColor='red', LineWidth=2)
                    rackUnit.AddObject(bot)


        rackFrame = rutils.MovingPolygonFrame(rackUnit.getOutlinePoints())
        rackUnit.AddObject(rackFrame)
        self.rackUnit = rackUnit
        #self.Canvas.AddObject(rackFrame)
        #rackUnit.Bind(fc.EVT_FC_LEFT_DOWN, self.objectHit)

        self.Canvas.ZoomToBB()
        self.Canvas.Draw(True)

        wx.EndBusyCursor()


app = wx.App(False)
F = DrawFrame(None, title="FloatCanvas Demo App", size=(700,700) )
app.MainLoop()
    
    
    
    









