def __init__(self, parent):
        wx.Dialog.__init__(self, parent, wx.NewId(), "Edit Mask")

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.AddSpacer((10, 10))

        # if mask is defined
        vars = gaParams.getAppVars()
        if vars:
            options = [name for name in vars.iterkeys()]
            list = wx.CheckListBox(self, -1, choices=options)
            self.list = list
            i = 0
            for value in vars.values():
                if value.has_key("mask") and value["mask"]:
                    list.Check(i, True)
                i += 1

            sizer.Add(list)
        else:
            sizer.Add(wx.StaticText(self, -1, "No mask defined."))

        bSizer = wx.StdDialogButtonSizer()
        okButton = wx.Button(self, wx.ID_OK, "")
        cancelButton = wx.Button(self, wx.ID_CANCEL, "")
        bSizer.AddButton(okButton)
        bSizer.AddButton(cancelButton)
        bSizer.Realize()

        sizer.AddSpacer((10, 18))
        sizer.Add(bSizer)
        self.SetSizer(sizer)
        self.Fit()
    def __init__(self, parent, size = None, color = "LIGHT BLUE", style = None):
#wx.Panel.__init__(self, parent, -1, size=size, style = wx.RAISED_BORDER | wx.DOUBLE_BORDER)
        wx.Panel.__init__(self, parent, -1, size=size, style = wx.DOUBLE_BORDER)

        self.SetBackgroundColour('WHITE')
        self.SetFont(wx.Font(9, wx.SWISS, wx.NORMAL,wx.FONTWEIGHT_BOLD))
        self.gaWindow = parent.GetParent()

        yaml = gaParams.getYaml()
        f = open('config/guiconfig.yml', 'r')
        widgets = yaml.load(f)
        widgets = widgets['widgets']
        f.close()

        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.sizer.Add((10, 14))

        # Population size label
        self.sizer.Add(wx.StaticText(self, -1, 'Population Size:'), 0, wx.ALIGN_CENTER)
        # Population size slider
        self.populationSlider = wx.Slider(self, -1, size=(100, 40), style= wx.SL_LABELS | wx.SL_AUTOTICKS)
        max = int(widgets['population']['max'])
        min = int(widgets['population']['min'])
        self.populationSlider.SetRange(min, max)
        self.populationSlider.SetValue(gaParams.getVar('population_size'))

        self.sizer.Add(self.populationSlider, 0, wx.ALIGN_CENTER)
        self.Bind(wx.EVT_SCROLL, self.onPopulationChange, self.populationSlider)

        xoRate, mutRate = gaParams.getGARates()
        # XO Rate Slider
        self.xoRateSlider = wx.Slider(self, -1, size = (100, 40), style = wx.SL_LABELS | wx.SL_AUTOTICKS)
        max = int(widgets['crossover']['max'])
        min = int(widgets['crossover']['min'])
        self.xoRateSlider.SetRange(min, max)
        self.xoRateSlider.SetValue(xoRate * max)

        # Add xo slider to sizer
        self.sizer.Add((10, 10))
        self.sizer.Add(wx.StaticText(self, -1, 'Crossover Rate:'), 0, wx.ALIGN_CENTER)
        self.sizer.Add(self.xoRateSlider, 0, wx.ALIGN_CENTER)

        self.Bind(wx.EVT_SCROLL, self.onCrossoverChange, self.xoRateSlider)

        # Mutation Rate
        self.mutBox = wx.TextCtrl(self, -1, size = (50, -1))
        self.mutBox.SetValue("%.3f" % mutRate)

        tempSizer = wx.BoxSizer(wx.HORIZONTAL)
        tempSizer.Add(wx.StaticText(self, -1, 'Mutation:'), 0, wx.ALIGN_CENTER_VERTICAL)
        tempSizer.Add(self.mutBox, 0)
        self.sizer.Add((10, 10))
        self.sizer.Add(tempSizer, 0, wx.ALIGN_CENTER)

        max = int(widgets['mutation']['max'])
        min = int(widgets['mutation']['min'])

        self.Bind(wx.EVT_TEXT, self.onMutationChange, self.mutBox)

        self.sizer.Add((10, 10))

        # Step size spinner control
        self.stepSize = wx.SpinCtrl(self, wx.ID_ANY, size = (50,23))
        self.stepSize.SetRange(1, 300)
        step = gaParams.getVar('stepSize') or 1
        self.stepSize.SetValue(step)

        self.Bind(wx.EVT_SPINCTRL, self.onSpin, self.stepSize)

        # Add spinner with text label to sizer
        tempSizer = wx.BoxSizer(wx.HORIZONTAL)
        tempSizer.Add(wx.StaticText(self, -1, 'Step Size:'), 0, wx.ALIGN_CENTER_VERTICAL)
        tempSizer.Add(self.stepSize)
        self.sizer.Add(tempSizer, 0, wx.ALIGN_CENTER)

        # edit mask button
        self.sizer.AddSpacer((10, 10))
        self.maskB = wx.Button(self, -1, 'Edit Mask')
        self.Bind(wx.EVT_BUTTON, self.onEditMask, self.maskB)
        self.sizer.Add(self.maskB, 0, wx.ALIGN_CENTER) 
        if not gaParams.getAppVars():
            self.maskB.Enable(False)

        # 8px spaces for widgets in same group
        # 10px for widgets not in the same group

        # -----------------------------------
        # peer stuff
        self.sizer.Add((10, 10))
        self.sizer.Add(wx.StaticLine(self), 0, wx.EXPAND)
        self.sizer.Add((10, 10))

        peers = {}
        peer_list = gaParams.getVar('peers')
        online = wx.Bitmap('gui/online.png')
        offline = wx.Bitmap('gui/offline.png')
        delete = wx.Bitmap('gui/delete.png')
        self.online, self.offline, self.delete = online, offline, delete

        # my status
        tmp_sizer = wx.BoxSizer(wx.HORIZONTAL)
        self.my_status = wx.StaticBitmap(self)
        self.my_status.SetBitmap(online)
        tmp_sizer.Add(self.my_status)
        tmp_sizer.Add(wx.StaticText(self, -1, 'Collaborate'))
        self.sizer.Add(tmp_sizer)

        # add peer button
        self.sizer.Add((10, 10))
        newButton = wx.Button(self, -1, 'Add Peer...')
        newButton.Bind(wx.EVT_BUTTON, self.onAddPeer, newButton)
        self.sizer.Add(newButton)
        self.sizer.Add((10, 10))

        # keeps track of each ID for each peer
        self.names = {}
        # add list of peers
        all_peers_sizer = wx.BoxSizer(wx.VERTICAL)
        for peer in peer_list:
            id = wx.NewId()

            peer_sizer = wx.BoxSizer(wx.HORIZONTAL)
            peer_status = wx.StaticBitmap(self)
            peer_status.SetBitmap(offline)
            peer_name = wx.StaticText(self, -1, peer)
            peer_name.Bind(wx.EVT_LEFT_DOWN, self.onEditPeer, peer_name)
            peer_sizer.Add(peer_status)
            peer_sizer.Add(peer_name)

            peer_delete = wx.BitmapButton(self, id = id, bitmap = delete, 
                                                style = wx.ALIGN_RIGHT)
            self.Bind(wx.EVT_BUTTON, self.onDeletePeer, peer_delete)

            peer_sizer.Add(wx.StaticText(self, -1, '  '), 1)
            peer_sizer.Add(peer_delete)

            all_peers_sizer.Add(peer_sizer, 0, wx.EXPAND)
            peers[id] = {'name': peer,
                         'sizer': peer_sizer, 'status': peer_status}
            self.names[peer] = id
                
        self.sizer.Add(all_peers_sizer)
        self.peer_sizer = all_peers_sizer

        self.peers = peers
        self.status_bitmap = {}
        self.status_bitmap['online'] = online
        self.status_bitmap['offline'] = offline

        # Disconnect button
        self.sizer.AddSpacer((10, 10))
        self.disconnect = wx.Button(self, -1, 'Disconnect')
        self.Bind(wx.EVT_BUTTON, self.onDisconnect, self.disconnect)
        self.sizer.Add(self.disconnect, 0, wx.ALIGN_CENTER) 

        # refresh button
        self.sizer.AddSpacer((10, 10))
        self.refresh = wx.Button(self, wx.ID_REFRESH, '')
        self.Bind(wx.EVT_BUTTON, self.onRefresh, self.refresh)
        self.sizer.Add(self.refresh, 0, wx.ALIGN_CENTER) 

        # back button
        self.sizer.AddSpacer((10, 10))
        self.back = wx.Button(self, wx.ID_BACKWARD, '')
        self.back.Enable(False)
        self.Bind(wx.EVT_BUTTON, self.onBack, self.back)
        self.sizer.Add(self.back, 0, wx.ALIGN_CENTER) 


        self.sizer.AddSpacer((10, 10))
        self.sizer.Add(wx.StaticLine(self), 0, wx.EXPAND)
        self.sizer.AddSpacer((10, 10))

        self.app_panels = []
        self.appSizer = wx.BoxSizer(wx.VERTICAL)
        self.sizer.Add(self.appSizer, 0, wx.EXPAND)
        self.reset()

        # Add submit button
        self.submit = wx.Button(self, -1, 'Step %d Gen' % step, size = (130,-1))
        self.submit.Enable(False)
        self.Bind(wx.EVT_BUTTON, self.onSubmit, self.submit)
        self.sizer.Add(self.submit, 0, wx.ALIGN_CENTER)

        # final sizer and fitting stuff
        self.SetSizer(self.sizer)
        self.SetAutoLayout(True)
        self.sizer.Layout()
        self.sizer.Fit(self)
        self.sizer.SetSizeHints(self)
        self.Layout()

        # Keeps the textbox from having the default focus, which was annoying
        self.SetFocus()

        self.timestamp = 0.
        self.gen = 0