"""
   This is the GUI for the Curve Animation
"""
import os, wx, time

from direct.interval.IntervalGlobal import *
from direct.actor.Actor import *
from direct.showutil.Rope import Rope
import ObjectGlobals as OG

class CurveAnimUI(wx.Dialog):
    """
    This is the Curve Animation Panel implementation.
    """
    def __init__(self, parent, editor):
        wx.Dialog.__init__(self, parent, id=wx.ID_ANY, title="Curve Animation",
                           pos=wx.DefaultPosition, size=(430, 140))
        
        self.editor = editor
        self.nodePath = None
        self.curve = None
                           
        self.mainPanel = wx.Panel(self, -1)
        
        self.chooseNode = wx.StaticText( self.mainPanel, -1, "Choose NodePath:")
        self.chooseNodeTxt = wx.TextCtrl( self.mainPanel, -1, "")
        self.chooseNodeButton = wx.Button( self.mainPanel, -1, "Choose..")
        
        self.chooseCurve = wx.StaticText( self.mainPanel, -1, "Choose attch Curve:")
        self.chooseCurveTxt = wx.TextCtrl( self.mainPanel, -1, "")
        self.chooseCurveButton = wx.Button( self.mainPanel, -1, "Choose..")
        
        self.duritionTime = wx.StaticText( self.mainPanel, -1, "Durition(Frame):")
        self.duritionTimeSpin = wx.SpinCtrl( self.mainPanel, -1, "",size = (70,25), min=24, max=10000)
        
        self.createAnimButton = wx.Button( self.mainPanel, -1, "Creat")
        self.saveAnimButton = wx.Button( self.mainPanel, -1, "Save Animation")
        
        self.SetProperties()
        self.DoLayout()
        
        self.Bind(wx.EVT_BUTTON, self.OnChooseNode, self.chooseNodeButton)
        self.Bind(wx.EVT_BUTTON, self.OnChooseCurve, self.chooseCurveButton)
        self.Bind(wx.EVT_BUTTON, self.OnCreateAnim, self.createAnimButton)
        self.Bind(wx.EVT_BUTTON, self.OnSaveAnim, self.saveAnimButton)

        self.Bind(wx.EVT_CLOSE, self.OnExit)
        
    def SetProperties(self):
        self.duritionTimeSpin.SetValue(24)
        self.chooseNodeTxt.SetMinSize((200,21))
        self.chooseCurveTxt.SetMinSize((200,21))
        self.saveAnimButton.SetToolTipString("Save the animation to the global animation control")
    
    def DoLayout(self):
        dialogSizer = wx.BoxSizer(wx.VERTICAL)
        mainSizer = wx.FlexGridSizer(4, 3, 0, 0)
        
        mainSizer.Add(self.chooseNode, 0, wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.RIGHT, 10)
        mainSizer.Add(self.chooseNodeTxt, 0, wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.RIGHT, 5)
        mainSizer.Add(self.chooseNodeButton, 0, wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.RIGHT, 5)
        
        mainSizer.Add(self.chooseCurve, 0, wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.RIGHT, 10)
        mainSizer.Add(self.chooseCurveTxt, 0, wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.RIGHT, 5)
        mainSizer.Add(self.chooseCurveButton, 0, wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.RIGHT, 5)
        
        mainSizer.Add(self.duritionTime, 0, wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.RIGHT, 10)
        mainSizer.Add(self.duritionTimeSpin, 0, wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.RIGHT, 5)
        mainSizer.Add(self.createAnimButton, 0, wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.RIGHT, 5)
        
        mainSizer.Add(self.saveAnimButton, 0, wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.RIGHT, 5)
        
        self.mainPanel.SetSizerAndFit(mainSizer)
        
        dialogSizer.Add(self.mainPanel, 1, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5)
        
        self.SetSizer(dialogSizer)
        self.Layout()
        
    def OnChooseNode(self, evt):
        if base.direct.selected.last == None or base.direct.selected.last.hasTag('Controller') or not base.direct.selected.last.hasTag('OBJRoot'):
            dlg = wx.MessageDialog(None, 'Please select an object.', 'NOTICE', wx.OK )
            dlg.ShowModal()
            dlg.Destroy()
        else:
            obj = self.editor.objectMgr.findObjectByNodePath(base.direct.selected.last)
            if obj[OG.OBJ_DEF].name == '__Curve__':
                dlg = wx.MessageDialog(None, 'Please select an object, not a curve.', 'NOTICE', wx.OK )
                dlg.ShowModal()
                dlg.Destroy()
            else:
                self.nodePath = obj
                self.chooseNodeTxt.SetValue(str(self.nodePath[OG.OBJ_UID]))
    
    def OnChooseCurve(self, evt):
        if base.direct.selected.last == None or base.direct.selected.last.hasTag('Controller') or not base.direct.selected.last.hasTag('OBJRoot'):
            dlg = wx.MessageDialog(None, 'Please select a curve.', 'NOTICE', wx.OK )
            dlg.ShowModal()
            dlg.Destroy()
        else:
            obj = self.editor.objectMgr.findObjectByNodePath(base.direct.selected.last)
            if obj[OG.OBJ_DEF].name != '__Curve__':
                dlg = wx.MessageDialog(None, 'Please select a curve, not an object.', 'NOTICE', wx.OK )
                dlg.ShowModal()
                dlg.Destroy()
            elif obj[OG.OBJ_DEF].name == '__Curve__':
                self.curve = obj
                self.chooseCurveTxt.SetValue(str(self.curve[OG.OBJ_UID]))
        
    def OnCreateAnim(self, evt):
        self.time = self.duritionTimeSpin.GetValue()
        if self.nodePath == None or self.curve == None:
            dlg = wx.MessageDialog(None, 'Please select an object and a curve first.', 'NOTICE', wx.OK )
            dlg.ShowModal()
            dlg.Destroy()
        else:
            self.curveSequence = self.editor.animMgr.singleCurveAnimation(self.nodePath, self.curve, self.time)
            self.curveSequence.start()
   
    def OnSaveAnim(self,evt):
        if not self.curveSequence:
            dlg = wx.MessageDialog(None, 'Please create a animation first.', 'NOTICE', wx.OK )
            dlg.ShowModal()
            dlg.Destroy()
        else:
            if self.editor.animMgr.curveAnimation == {}:
                self.editor.animMgr.curveAnimation[(self.nodePath[OG.OBJ_UID],self.curve[OG.OBJ_UID])] = (self.nodePath[OG.OBJ_UID],self.curve[OG.OBJ_UID],self.time)
                self.editor.updateStatusReadout('Sucessfully saved to global animation list')
                return 
            
            hasKey = False
            for key in self.editor.animMgr.curveAnimation.keys():
                if key == (self.nodePath[OG.OBJ_UID],self.curve[OG.OBJ_UID]):
                    dlg = wx.MessageDialog(None, 'Already have the animation for this object attach to this curve.', 'NOTICE', wx.OK )
                    dlg.ShowModal()
                    dlg.Destroy()
                    hasKey = True
                    return
                elif self.nodePath[OG.OBJ_UID] == key[0]:
                    dlg = wx.MessageDialog(None, 'This object is already attached to a curve.', 'NOTICE', wx.OK )
                    dlg.ShowModal()
                    dlg.Destroy()
                    hasKey = True
                    return
            
            if hasKey == False and self.editor.animMgr.curveAnimation != {}:
                self.editor.animMgr.curveAnimation[(self.nodePath[OG.OBJ_UID],self.curve[OG.OBJ_UID])] = (self.nodePath[OG.OBJ_UID],self.curve[OG.OBJ_UID],self.time)
                self.editor.updateStatusReadout('Sucessfully saved to global animation list')
        
    def OnExit(self,evt):
        self.Destroy()
        self.editor.ui.curveAnimMenuItem.Check(False)