from __future__ import print_function

# Used to guarantee to use at least Wx2.8
import wxversion
wxversion.ensureMinimal('2.8')

import sys, time, os, gc
import matplotlib
matplotlib.use('WXAgg')
import matplotlib.cm as cm
import matplotlib.cbook as cbook
from matplotlib.backends.backend_wxagg import Toolbar, FigureCanvasWxAgg
from matplotlib.figure import Figure
import numpy as np

import wx
import wx.xrc as xrc

#import ryans_first_xrc

import pdb

ERR_TOL = 1e-5 # floating point slop for peak-detection

class PlotPanel(wx.Panel):

    def __init__(self, parent):
        wx.Panel.__init__(self, parent, -1)

        self.fig = Figure((9,6), 100)
        self.canvas = FigureCanvasWxAgg(self, -1, self.fig)
        self.toolbar = Toolbar(self.canvas) #matplotlib toolbar
        self.toolbar.Realize()
        #self.toolbar.set_active([0,1])

        # Now put all into a sizer
        sizer = wx.BoxSizer(wx.VERTICAL)
        # This way of adding to sizer allows resizing
        sizer.Add(self.canvas, 1, wx.LEFT|wx.TOP|wx.GROW)
        # Best to allow the toolbar to resize!
        sizer.Add(self.toolbar, 0, wx.GROW)
        self.SetSizer(sizer)
        self.Fit()


    def init_plot_data(self):
        a = self.fig.add_subplot(111)
        t = np.arange(0,1,0.01)
        y = np.sin(2*np.pi*t)
        self.lines = a.plot(t,y)
        self.ax = a
        self.toolbar.update() # Not sure why this is needed - ADS


    def change_plot(self):
        self.ax.clear()
        t = np.arange(0,1,0.01)
        y2 = np.cos(2*np.pi*t)
        self.ax.plot(t,y2)
        self.canvas.draw()

        
    def GetToolBar(self):
        # You will need to override GetToolBar if you are using an
        # unmanaged toolbar in your frame
        return self.toolbar

    ## def OnWhiz(self,evt):
    ##     self.x += np.pi/15
    ##     self.y += np.pi/20
    ##     z = np.sin(self.x) + np.cos(self.y)
    ##     self.im.set_array(z)

    ##     zmax = np.amax(z) - ERR_TOL
    ##     ymax_i, xmax_i = np.nonzero(z >= zmax)
    ##     if self.im.origin == 'upper':
    ##         ymax_i = z.shape[0]-ymax_i
    ##     self.lines[0].set_data(xmax_i,ymax_i)

    ##     self.canvas.draw()

    def onEraseBackground(self, evt):
        # this is supposed to prevent redraw flicker on some X servers...
        pass


class MyApp(wx.App):
    def on_add_block(self,event):
        print('in on_add_block')
        print('selection: %s' % self.NewBlockChoice.GetStringSelection())
        self.plotpanel.change_plot()

    def on_new_block_choice(self, event):
        print('in OnNewBlockChoice')
        print('selection: %s' % self.NewBlockChoice.GetStringSelection())
        
        
    def OnInit(self):
        #xrcfile = cbook.get_sample_data('ryans_first_xrc.xrc', asfileobj=False)
        xrcfile = 'ryans_first_xrc.xrc'
        print('loading', xrcfile)

        self.res = xrc.XmlResource(xrcfile)

        # main frame and panel ---------

        self.frame = self.res.LoadFrame(None,"MainFrame")
        self.panel = xrc.XRCCTRL(self.frame,"MainPanel")
        self.new_block_choice = xrc.XRCCTRL(self.frame, "new_block_choice")
        self.new_block_choice.SetItems(['dc_motor','torsional_spring_damper','rigid_mass','beam'])
        self.add_blockButton = xrc.XRCCTRL(self.frame,"add_block_button")
        wx.EVT_BUTTON(self.add_blockButton, self.add_blockButton.GetId(),
                      self.on_add_block)
        wx.EVT_CHOICE(self.new_block_choice, self.new_block_choice.GetId(),
                      self.on_new_block_choice)

        self.params_grid = xrc.XRCCTRL(self.frame, "params_grid")
        self.params_grid.CreateGrid(10,2)

        plot_container = xrc.XRCCTRL(self.frame,"plot_container_panel")
        sizer = wx.BoxSizer(wx.VERTICAL)

        # matplotlib panel itself
        self.plotpanel = PlotPanel(plot_container)
        self.plotpanel.init_plot_data()

        # wx boilerplate
        sizer.Add(self.plotpanel, 1, wx.EXPAND)
        plot_container.SetSizer(sizer)
        #self.plotpanel.SetMinSize((900,600))

        self.frame.SetClientSize((800,500))
        self.frame.Show(1)
        self.SetTopWindow(self.frame)
        return True


if __name__ == '__main__':
    app = MyApp(0)
    app.MainLoop()

