Пример #1
0
 def OnInit(self):
     # wx.InitAllImageHandlers()
     self.gg = GuiGlue()  #singleton
     self.gg.initConfig()
     myMainFrame = ortho.gui.MainFrame(None, -1, "")
     self.SetTopWindow(myMainFrame)
     myMainFrame.Show()
     return 1
Пример #2
0
class OrthoApp(wx.App):
    def OnInit(self):
        # wx.InitAllImageHandlers()
        self.gg = GuiGlue() #singleton
        self.gg.initConfig()
        myMainFrame = ortho.gui.MainFrame(None, -1, "")
        self.SetTopWindow(myMainFrame)
        myMainFrame.Show()
        return 1
Пример #3
0
    def __init__(self, *args, **kwds):
        # begin wxGlade: MyGladedPanel.__init__
        kwds["style"] = wx.TAB_TRAVERSAL
        wx.Panel.__init__(self, *args, **kwds)
        self.title_lbl = wx.StaticText(self,
                                       -1,
                                       u"Exercice d'orthographe pour Eléa",
                                       style=wx.ALIGN_CENTRE)
        self.reponse_lbl = wx.StaticText(self,
                                         -1,
                                         u"Réponse: ",
                                         style=wx.ALIGN_RIGHT)
        self.responseCtrl = wx.TextCtrl(self,
                                        -1,
                                        "",
                                        style=wx.TE_PROCESS_ENTER | wx.TE_RICH)
        self.resultat_lbl = wx.TextCtrl(self,
                                        -1,
                                        "",
                                        style=wx.TE_READONLY | wx.TE_MULTILINE)
        self.start_btn = wx.Button(self, -1, u"Démarrer!")
        self.repeat_btn = wx.Button(self, -1, u"Répéter")
        self.next_btn = wx.Button(self, -1, "Suivant")
        self.score_lbl = wx.StaticText(self, -1, "Score")
        self.end_btn = wx.Button(self, -1, "Terminer l'exercice")
        self.mode = 0  #default mode: Exam
        self.correct = 0  #for training
        self.wrong = 0  #for training too
        self.__set_properties()
        self.__do_layout()

        self.Bind(wx.EVT_TEXT_ENTER, self.onNextClickExam, self.responseCtrl)
        self.Bind(wx.EVT_BUTTON, self.onStartClick, self.start_btn)
        self.Bind(wx.EVT_BUTTON, self.onRepeatClick, self.repeat_btn)
        self.Bind(wx.EVT_BUTTON, self.onNextClickExam, self.next_btn)
        self.Bind(wx.EVT_BUTTON, self.onQuit, self.end_btn)
        # end wxGlade

        self.timer = wx.Timer(self, -1)
        self.redStyle = wx.TextAttr(wx.RED)
        self.greenStyle = wx.TextAttr(wx.Colour(0, 255, 0))
        self.bravoSound = Word(
            "bravo",
            os.path.normpath(
                os.path.dirname(__file__) + "/../../resources/bravo.wav"))
        self.errorSound = Word(
            "error",
            os.path.normpath(
                os.path.dirname(__file__) + "/../../resources/error.wav"))
        self.gg = GuiGlue()  #singleton
Пример #4
0
 def __init__(self, *args, **kwds):
     # begin wxGlade: MyGladedPanel.__init__
     kwds["style"] = wx.TAB_TRAVERSAL
     wx.Panel.__init__(self, *args, **kwds)
     self.title_lbl = wx.StaticText(self, -1, u"Exercice d'orthographe pour Eléa", style=wx.ALIGN_CENTRE)
     self.reponse_lbl = wx.StaticText(self, -1, u"Réponse: ", style=wx.ALIGN_RIGHT)
     self.responseCtrl = wx.TextCtrl(self, -1, "", style=wx.TE_PROCESS_ENTER | wx.TE_RICH)
     self.resultat_lbl = wx.TextCtrl(self, -1, "", style=wx.TE_READONLY | wx.TE_MULTILINE)
     self.start_btn = wx.Button(self, -1, u"Démarrer!")
     self.repeat_btn = wx.Button(self, -1, u"Répéter")
     self.next_btn = wx.Button(self, -1, "Suivant")
     self.score_lbl = wx.StaticText(self, -1, "Score")
     self.end_btn = wx.Button(self, -1, "Terminer l'exercice")
     self.mode = 0 #default mode: Exam
     self.correct = 0 #for training
     self.wrong = 0 #for training too
     self.__set_properties()
     self.__do_layout()
     
     
     self.Bind(wx.EVT_TEXT_ENTER, self.onNextClickExam, self.responseCtrl)
     self.Bind(wx.EVT_BUTTON, self.onStartClick, self.start_btn)
     self.Bind(wx.EVT_BUTTON, self.onRepeatClick, self.repeat_btn)
     self.Bind(wx.EVT_BUTTON, self.onNextClickExam, self.next_btn)
     self.Bind(wx.EVT_BUTTON, self.onQuit, self.end_btn)
     # end wxGlade
     
     self.timer = wx.Timer(self, -1)
     self.redStyle = wx.TextAttr(wx.RED)
     self.greenStyle = wx.TextAttr(wx.Colour(0,255,0))
     self.bravoSound = Word("bravo", os.path.normpath(os.path.dirname(__file__) + "/../../resources/bravo.wav"))
     self.errorSound = Word("error", os.path.normpath(os.path.dirname(__file__) + "/../../resources/error.wav"))
     self.gg = GuiGlue() #singleton
Пример #5
0
    def __init__(self, *args, **kwds):
        kwds["style"] = wx.DEFAULT_DIALOG_STYLE
        wx.Dialog.__init__(self, *args, **kwds)
        
        self.gg = GuiGlue() #singleton
        
        # Lessons selector
        self.availableLessons = sorted(self.gg.searchLessons(),key=lambda lesson: lesson[0])
        self.lessonsCheckBoxes = [(wx.CheckBox(self, -1, lesson[0]), lesson[0], lesson[1])  
           for lesson in self.availableLessons]
        
        self.__do_layout()

        self.Bind(wx.EVT_BUTTON, self.onOK, id=wx.ID_OK)
        self.Bind(wx.EVT_BUTTON, self.onCancel, id=wx.ID_CANCEL)
        self.Bind(wx.EVT_BUTTON, self.onSelectAll, self.selectAll_btn)
        self.Bind(wx.EVT_BUTTON, self.onInvertSelect, self.invertSelect_btn)
        self.Bind(wx.EVT_RADIOBOX, self.onModeSelect, self.rmode)
Пример #6
0
class LessonsSelectorDialog(wx.Dialog):
    """
    Modal dialog to choose the lessons.
    """
    def __init__(self, *args, **kwds):
        kwds["style"] = wx.DEFAULT_DIALOG_STYLE
        wx.Dialog.__init__(self, *args, **kwds)
        
        self.gg = GuiGlue() #singleton
        
        # Lessons selector
        self.availableLessons = sorted(self.gg.searchLessons(),key=lambda lesson: lesson[0])
        self.lessonsCheckBoxes = [(wx.CheckBox(self, -1, lesson[0]), lesson[0], lesson[1])  
           for lesson in self.availableLessons]
        
        self.__do_layout()

        self.Bind(wx.EVT_BUTTON, self.onOK, id=wx.ID_OK)
        self.Bind(wx.EVT_BUTTON, self.onCancel, id=wx.ID_CANCEL)
        self.Bind(wx.EVT_BUTTON, self.onSelectAll, self.selectAll_btn)
        self.Bind(wx.EVT_BUTTON, self.onInvertSelect, self.invertSelect_btn)
        self.Bind(wx.EVT_RADIOBOX, self.onModeSelect, self.rmode)


    def __do_layout(self):
        self.SetTitle(u"Quelles leçons?")
        
        #top Sizer
        vbox1 = wx.BoxSizer(wx.VERTICAL)
        
        hbox1 = wx.BoxSizer(wx.HORIZONTAL) 
        hbox2 = wx.BoxSizer(wx.HORIZONTAL) #for main buttons
        
        sbox1 = wx.StaticBox(self, -1, u"Leçons")
        vbox2 = wx.StaticBoxSizer(sbox1, wx.VERTICAL) #lessons selector
        vbox3 = wx.BoxSizer(wx.HORIZONTAL) #for selection button
        vbox4 = wx.BoxSizer(wx.VERTICAL) #for mode
        
        #create all lessons check boxes
        hbox3 = wx.BoxSizer(wx.HORIZONTAL)
        vbox5 = wx.BoxSizer(wx.VERTICAL)
        vbox6 = wx.BoxSizer(wx.VERTICAL)
        #gbox1_1_1_1 = wx.GridSizer(1+len(self.lessonsCheckBoxes) /2, 2, 2, 2)
        idx = 0
        for l in self.lessonsCheckBoxes:
            if self.gg.quiz is not None and l[1] in self.gg.quiz.lessonsNames:
                l[0].SetValue(True)
            #gbox1_1_1_1.Add(l[0], 0, wx.ALL | wx.ALIGN_LEFT, 2)
            if idx < len(self.lessonsCheckBoxes)/2+1:
                vbox5.Add(l[0], 0, wx.ALL | wx.ALIGN_LEFT, 2)
            else:
                vbox6.Add(l[0], 0, wx.ALL | wx.ALIGN_LEFT, 2)
            idx += 1
        #vbox2.Add(gbox1_1_1_1, 1, wx.ALL | wx.EXPAND, 2)
        hbox3.Add(vbox5, 1, wx.ALL | wx.EXPAND, 2)
        hbox3.Add(vbox6, 1, wx.ALL | wx.EXPAND, 2)
        vbox2.Add(hbox3, 1, wx.ALL | wx.EXPAND, 2)
        
        self.selectAll_btn = wx.Button(self, -1, "Tout choisir")
        self.invertSelect_btn = wx.Button(self, -1, u"Inverser la sélection")
        vbox3.Add(self.selectAll_btn, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 0)
        vbox3.Add((20, 20), 0, wx.ALIGN_RIGHT, 0)
        vbox3.Add(self.invertSelect_btn, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 0)
        vbox3.Add((20, 20), 0, wx.ALIGN_RIGHT, 0)
        vbox2.Add(vbox3, 0, wx.ALL | wx.EXPAND, 2)
        
        # Main buttons
        self.OK_1 = wx.Button(self, wx.ID_OK, "OK")
        self.cancel_1 = wx.Button(self, wx.ID_CANCEL, "Annuler")
        hbox2.Add((20, 20), 0, wx.ALIGN_RIGHT, 0)
        hbox2.Add(self.OK_1, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 0)
        hbox2.Add((20, 20), 0, wx.ALIGN_RIGHT, 0)
        hbox2.Add(self.cancel_1, 0, wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 0)
        hbox2.Add((20, 20), 0, wx.ALIGN_RIGHT, 0)
        
         # Mode
        self.rmode = wx.RadioBox(self, -1, "Quel mode?", 
            choices=["Interrogation", "En continu"], majorDimension=1, 
            style=wx.RA_SPECIFY_COLS)
        self.rmode.SetSelection(self.gg.mode)
        self.length_lbl = wx.StaticText(self, -1, u"Nombre de questions")
        self.length_txt = wx.TextCtrl(self, -1, str(self.gg.length))
        self.length_txt.SetMaxLength(3)
        if self.gg.mode == 1:
            self.length_txt.Enable(False)
        vbox4.Add(self.rmode, 0, 0, 0)
        vbox4.Add(self.length_lbl, 0, 0, 0)
        vbox4.Add(self.length_txt, 0, 0, 0)
        
        hbox1.Add(vbox2, 0, 0, 0)
        hbox1.Add((5,5), 0, 0, 0)
        hbox1.Add(vbox4, 0, 0, 0)
        
        
        vbox1.Add(hbox1, 1, wx.ALL | wx.ALIGN_RIGHT, 2)
        vbox1.Add(hbox2, 0, wx.ALL | wx.ALIGN_RIGHT, 2)
        self.SetSizer(vbox1)
        vbox1.Fit(self)
        self.Layout()
        self.Centre()
        
    def onModeSelect(self, event):
        """
        Called when a mode radio button is clicked.
        The goal is to enable/disable question length depending on the mode.
        """
        idx = self.rmode.GetSelection()
        if idx == 0: #interrogation mode
            self.length_txt.Enable(True)
        elif idx == 1: #never ending exercise
            self.length_txt.Enable(False)
    
    def onSelectAll(self, event):
        for l in self.lessonsCheckBoxes:
            l[0].SetValue(True)
    
    def onInvertSelect(self, event):
        for l in self.lessonsCheckBoxes:
            l[0].SetValue(not l[0].GetValue())

    def onOK(self, event):
        """
        Create a quiz object with the selected lessons.
        """
        self.gg.length = int(self.length_txt.GetValue().strip())
        self.gg.mode = self.rmode.GetSelection()
        self.gg.createQuiz(self.lessonsCheckBoxes)
        # self.GetParent().quiz = Quiz(name="test", length=10)
        # for lesson in self.lessonsCheckBoxes:
            # if (lesson[0].IsChecked()):
                # self.GetParent().quiz.add_lesson(name=lesson[1], path=lesson[2])
        # self.GetParent().quiz.generate()
        # if (self.rmode.GetSelection() == 1):
            # self.GetParent().orthoApp.usePredefinedOrder()
        self.EndModal(wx.ID_OK)

    def onCancel(self, event): 
        self.EndModal(wx.ID_CANCEL)
Пример #7
0
class MainPanel(wx.Panel):
    def __init__(self, *args, **kwds):
        # begin wxGlade: MyGladedPanel.__init__
        kwds["style"] = wx.TAB_TRAVERSAL
        wx.Panel.__init__(self, *args, **kwds)
        self.title_lbl = wx.StaticText(self,
                                       -1,
                                       u"Exercice d'orthographe pour Eléa",
                                       style=wx.ALIGN_CENTRE)
        self.reponse_lbl = wx.StaticText(self,
                                         -1,
                                         u"Réponse: ",
                                         style=wx.ALIGN_RIGHT)
        self.responseCtrl = wx.TextCtrl(self,
                                        -1,
                                        "",
                                        style=wx.TE_PROCESS_ENTER | wx.TE_RICH)
        self.resultat_lbl = wx.TextCtrl(self,
                                        -1,
                                        "",
                                        style=wx.TE_READONLY | wx.TE_MULTILINE)
        self.start_btn = wx.Button(self, -1, u"Démarrer!")
        self.repeat_btn = wx.Button(self, -1, u"Répéter")
        self.next_btn = wx.Button(self, -1, "Suivant")
        self.score_lbl = wx.StaticText(self, -1, "Score")
        self.end_btn = wx.Button(self, -1, "Terminer l'exercice")
        self.mode = 0  #default mode: Exam
        self.correct = 0  #for training
        self.wrong = 0  #for training too
        self.__set_properties()
        self.__do_layout()

        self.Bind(wx.EVT_TEXT_ENTER, self.onNextClickExam, self.responseCtrl)
        self.Bind(wx.EVT_BUTTON, self.onStartClick, self.start_btn)
        self.Bind(wx.EVT_BUTTON, self.onRepeatClick, self.repeat_btn)
        self.Bind(wx.EVT_BUTTON, self.onNextClickExam, self.next_btn)
        self.Bind(wx.EVT_BUTTON, self.onQuit, self.end_btn)
        # end wxGlade

        self.timer = wx.Timer(self, -1)
        self.redStyle = wx.TextAttr(wx.RED)
        self.greenStyle = wx.TextAttr(wx.Colour(0, 255, 0))
        self.bravoSound = Word(
            "bravo",
            os.path.normpath(
                os.path.dirname(__file__) + "/../../resources/bravo.wav"))
        self.errorSound = Word(
            "error",
            os.path.normpath(
                os.path.dirname(__file__) + "/../../resources/error.wav"))
        self.gg = GuiGlue()  #singleton

    def __set_properties(self):
        self.title_lbl.SetFont(
            wx.Font(14, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, ""))
        self.responseCtrl.SetFont(
            wx.Font(12, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, ""))
        self.responseCtrl.Enable(False)
        self.resultat_lbl.SetFont(
            wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, ""))
        self.repeat_btn.Enable(False)
        self.next_btn.Enable(False)
        self.score_lbl.SetFont(
            wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, ""))

    def __do_layout(self):
        sizer_3 = wx.BoxSizer(wx.VERTICAL)
        sizer_4 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_5 = wx.BoxSizer(wx.VERTICAL)
        sizer_6 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_7 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_5.Add(self.title_lbl, 0, wx.TOP | wx.BOTTOM | wx.EXPAND, 8)
        sizer_7.Add((5, 5), 0, wx.ALIGN_RIGHT, 0)
        sizer_7.Add(
            self.reponse_lbl, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_HORIZONTAL
            | wx.ALIGN_CENTER_VERTICAL, 0)
        sizer_7.Add((5, 5), 0, 0, 0)
        sizer_7.Add(self.responseCtrl, 6, wx.EXPAND, 0)
        sizer_7.Add((5, 5), 0, 0, 0)
        sizer_5.Add(sizer_7, 0, wx.EXPAND, 0)
        sizer_6.Add((5, 5), 0, 0, 0)
        sizer_6.Add(self.resultat_lbl, 6, wx.EXPAND, 0)
        sizer_6.Add((20, 20), 0, 0, 0)
        sizer_6.Add(self.repeat_btn, 0, 0, 0)
        sizer_6.Add((20, 20), 0, 0, 0)
        sizer_6.Add(self.next_btn, 0, 0, 0)
        sizer_6.Add((5, 5), 0, 0, 0)
        sizer_5.Add(sizer_6, 1,
                    wx.TOP | wx.BOTTOM | wx.EXPAND | wx.ALIGN_RIGHT, 5)
        sizer_3.Add(sizer_5, 1, wx.EXPAND, 0)
        sizer_4.Add((5, 5), 0, wx.ALIGN_RIGHT, 0)
        sizer_4.Add(self.score_lbl, 1, 0, 0)
        sizer_4.Add((20, 20), 0, 0, 0)
        sizer_4.Add(self.start_btn, 0, wx.ALIGN_RIGHT, 0)
        sizer_4.Add((20, 20), 0, 0, 0)
        sizer_4.Add(self.end_btn, 0, wx.EXPAND | wx.ALIGN_RIGHT, 0)
        sizer_4.Add((5, 5), 0, 0, 0)
        sizer_3.Add(sizer_4, 0, wx.TOP | wx.BOTTOM | wx.EXPAND, 5)
        self.SetSizer(sizer_3)
        sizer_3.Fit(self)

    def _endExam(self):
        self.score_lbl.SetLabel(self.gg.endExam())
        self.resultat_lbl.SetValue(self.gg.getExamDetails())

    def _refreshConfig(self):
        """
        Called when a configuration has been changed via the menu.
        """
        if self.gg.mode == self.mode:
            return

        # change of mode: unbind nextClick
        self.mode = self.gg.mode
        if self.mode == 0:
            #Exam mode
            self.Unbind(wx.EVT_BUTTON, source=self.next_btn)
            self.Unbind(wx.EVT_TEXT_ENTER, source=self.responseCtrl)

            self.Bind(wx.EVT_BUTTON, self.onNextClickExam, self.next_btn)
            self.Bind(wx.EVT_TEXT_ENTER, self.onNextClickExam,
                      self.responseCtrl)
        else:
            # Training mode
            self.Unbind(wx.EVT_BUTTON, source=self.next_btn)
            self.Unbind(wx.EVT_TEXT_ENTER, source=self.responseCtrl)

            self.Bind(wx.EVT_BUTTON, self.onNextClickTraining, self.next_btn)
            self.Bind(wx.EVT_TEXT_ENTER, self.onNextClickTraining,
                      self.responseCtrl)

    def onQuit(self, event):
        # print "Event at MyGladedPanel Level"
        if self.mode == 0:
            self._endExam()
        self.GetParent().OnCloseWindow()

    def onRepeatClick(self, event):
        # print "Event handler `onRepeatClick' implemented"
        self.word.play()

    def onNextClickExam(self, event):
        try:
            self.chooseNewWord(self.responseCtrl.GetValue().strip())
        except StopIteration:
            self._endExam()

    def onNextClickTraining(self, event):
        if self.responseCtrl.GetValue().strip() == self.word.word:
            self.responseCtrl.SetStyle(0, self.responseCtrl.GetLastPosition(),
                                       self.greenStyle)
            self.resultat_lbl.AppendText(u'\nBravo! Le mot était: %s' %
                                         self.word.word)
            ## to force refresh of the window, otherwise
            ## the resultat_lbl is not updated before the sound.
            # self.Update()
            self.correct += 1
            self.bravoSound.play()
            self.chooseNewWord()
        else:
            # print "c'est faux!"
            self.wrong += 1
            self.resultat_lbl.AppendText(
                u"\nCe n'est pas juste... Tu as écrit: %s" %
                self.responseCtrl.GetValue().strip())
            self.errorSound.play()
            self.resultat_lbl.Show(True)
            self.responseCtrl.SetFocus()
            self.responseCtrl.SetStyle(0, self.responseCtrl.GetLastPosition(),
                                       self.redStyle)

    def onStartClick(self, event):
        print "Event handler `onStartClick' started!"

        if not self.gg.quiz:
            dial = LessonsSelectorDialog(self)
            dial.ShowModal()
        if not self.gg.quiz:
            return
        else:
            self._refreshConfig()

        self.responseCtrl.Enable(True)
        self.gg.startExam()
        self.chooseNewWord()

        self.start_btn.Hide()
        self.repeat_btn.Enable(True)
        self.next_btn.Enable(True)

    def chooseNewWord(self, answer=None):
        self.responseCtrl.Clear()
        self.word = self.gg.getNextWord(answer)
        if self.mode == 0:
            self.score_lbl.SetLabel(self.gg.getExamStatus())
        self.word.play()
        self.responseCtrl.SetFocus()
Пример #8
0
class MainPanel(wx.Panel):
    def __init__(self, *args, **kwds):
        # begin wxGlade: MyGladedPanel.__init__
        kwds["style"] = wx.TAB_TRAVERSAL
        wx.Panel.__init__(self, *args, **kwds)
        self.title_lbl = wx.StaticText(self, -1, u"Exercice d'orthographe pour Eléa", style=wx.ALIGN_CENTRE)
        self.reponse_lbl = wx.StaticText(self, -1, u"Réponse: ", style=wx.ALIGN_RIGHT)
        self.responseCtrl = wx.TextCtrl(self, -1, "", style=wx.TE_PROCESS_ENTER | wx.TE_RICH)
        self.resultat_lbl = wx.TextCtrl(self, -1, "", style=wx.TE_READONLY | wx.TE_MULTILINE)
        self.start_btn = wx.Button(self, -1, u"Démarrer!")
        self.repeat_btn = wx.Button(self, -1, u"Répéter")
        self.next_btn = wx.Button(self, -1, "Suivant")
        self.score_lbl = wx.StaticText(self, -1, "Score")
        self.end_btn = wx.Button(self, -1, "Terminer l'exercice")
        self.mode = 0 #default mode: Exam
        self.correct = 0 #for training
        self.wrong = 0 #for training too
        self.__set_properties()
        self.__do_layout()
        
        
        self.Bind(wx.EVT_TEXT_ENTER, self.onNextClickExam, self.responseCtrl)
        self.Bind(wx.EVT_BUTTON, self.onStartClick, self.start_btn)
        self.Bind(wx.EVT_BUTTON, self.onRepeatClick, self.repeat_btn)
        self.Bind(wx.EVT_BUTTON, self.onNextClickExam, self.next_btn)
        self.Bind(wx.EVT_BUTTON, self.onQuit, self.end_btn)
        # end wxGlade
        
        self.timer = wx.Timer(self, -1)
        self.redStyle = wx.TextAttr(wx.RED)
        self.greenStyle = wx.TextAttr(wx.Colour(0,255,0))
        self.bravoSound = Word("bravo", os.path.normpath(os.path.dirname(__file__) + "/../../resources/bravo.wav"))
        self.errorSound = Word("error", os.path.normpath(os.path.dirname(__file__) + "/../../resources/error.wav"))
        self.gg = GuiGlue() #singleton
        
    def __set_properties(self):
        self.title_lbl.SetFont(wx.Font(14, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, ""))
        self.responseCtrl.SetFont(wx.Font(12, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, ""))
        self.responseCtrl.Enable(False)
        self.resultat_lbl.SetFont(wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, ""))
        self.repeat_btn.Enable(False)
        self.next_btn.Enable(False)
        self.score_lbl.SetFont(wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, ""))

    def __do_layout(self):
        sizer_3 = wx.BoxSizer(wx.VERTICAL)
        sizer_4 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_5 = wx.BoxSizer(wx.VERTICAL)
        sizer_6 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_7 = wx.BoxSizer(wx.HORIZONTAL)
        sizer_5.Add(self.title_lbl, 0, wx.TOP | wx.BOTTOM | wx.EXPAND, 8)
        sizer_7.Add((5, 5), 0, wx.ALIGN_RIGHT, 0)
        sizer_7.Add(self.reponse_lbl, 0, wx.ALIGN_LEFT | wx.ALIGN_CENTER_HORIZONTAL | wx.ALIGN_CENTER_VERTICAL, 0)
        sizer_7.Add((5, 5), 0, 0, 0)
        sizer_7.Add(self.responseCtrl, 6, wx.EXPAND, 0)
        sizer_7.Add((5, 5), 0, 0, 0)
        sizer_5.Add(sizer_7, 0, wx.EXPAND, 0)
        sizer_6.Add((5, 5), 0, 0, 0)
        sizer_6.Add(self.resultat_lbl, 6, wx.EXPAND, 0)
        sizer_6.Add((20, 20), 0, 0, 0)
        sizer_6.Add(self.repeat_btn, 0, 0, 0)
        sizer_6.Add((20, 20), 0, 0, 0)
        sizer_6.Add(self.next_btn, 0, 0, 0)
        sizer_6.Add((5, 5), 0, 0, 0)
        sizer_5.Add(sizer_6, 1, wx.TOP | wx.BOTTOM | wx.EXPAND | wx.ALIGN_RIGHT, 5)
        sizer_3.Add(sizer_5, 1, wx.EXPAND, 0)
        sizer_4.Add((5, 5), 0, wx.ALIGN_RIGHT, 0)
        sizer_4.Add(self.score_lbl, 1, 0, 0)
        sizer_4.Add((20, 20), 0, 0, 0)
        sizer_4.Add(self.start_btn, 0, wx.ALIGN_RIGHT, 0)
        sizer_4.Add((20, 20), 0, 0, 0)
        sizer_4.Add(self.end_btn, 0, wx.EXPAND | wx.ALIGN_RIGHT, 0)
        sizer_4.Add((5, 5), 0, 0, 0)
        sizer_3.Add(sizer_4, 0, wx.TOP | wx.BOTTOM | wx.EXPAND, 5)
        self.SetSizer(sizer_3)
        sizer_3.Fit(self)

    def _endExam(self):
        self.score_lbl.SetLabel(self.gg.endExam())
        self.resultat_lbl.SetValue(self.gg.getExamDetails())
    
    def _refreshConfig(self):
        """
        Called when a configuration has been changed via the menu.
        """
        if self.gg.mode == self.mode:
            return
        
        # change of mode: unbind nextClick
        self.mode = self.gg.mode
        if self.mode == 0:
            #Exam mode
            self.Unbind(wx.EVT_BUTTON, source=self.next_btn)
            self.Unbind(wx.EVT_TEXT_ENTER, source=self.responseCtrl)
            
            self.Bind(wx.EVT_BUTTON, self.onNextClickExam, self.next_btn)
            self.Bind(wx.EVT_TEXT_ENTER, self.onNextClickExam, self.responseCtrl)
        else:
            # Training mode
            self.Unbind(wx.EVT_BUTTON, source=self.next_btn)
            self.Unbind(wx.EVT_TEXT_ENTER, source=self.responseCtrl)
            
            self.Bind(wx.EVT_BUTTON, self.onNextClickTraining, self.next_btn)
            self.Bind(wx.EVT_TEXT_ENTER, self.onNextClickTraining, self.responseCtrl)
            
            
    
    def onQuit(self, event):
        # print "Event at MyGladedPanel Level"
        if self.mode == 0:
            self._endExam()
        self.GetParent().OnCloseWindow()
    def onRepeatClick(self, event):
        # print "Event handler `onRepeatClick' implemented"
        self.word.play()

    def onNextClickExam(self, event):
        try:
            self.chooseNewWord(self.responseCtrl.GetValue().strip())
        except StopIteration:
            self._endExam()
    
    def onNextClickTraining(self, event):
        if self.responseCtrl.GetValue().strip() == self.word.word:
            self.responseCtrl.SetStyle(0, self.responseCtrl.GetLastPosition(), self.greenStyle)
            self.resultat_lbl.AppendText(u'\nBravo! Le mot était: %s' % self.word.word)
            ## to force refresh of the window, otherwise 
            ## the resultat_lbl is not updated before the sound.
            # self.Update() 
            self.correct += 1
            self.bravoSound.play()
            self.chooseNewWord()
        else:
            # print "c'est faux!"
            self.wrong += 1
            self.resultat_lbl.AppendText(u"\nCe n'est pas juste... Tu as écrit: %s" % self.responseCtrl.GetValue().strip())
            self.errorSound.play()
            self.resultat_lbl.Show(True)
            self.responseCtrl.SetFocus()
            self.responseCtrl.SetStyle(0, self.responseCtrl.GetLastPosition(), self.redStyle)


    
    def onStartClick(self, event):
        print "Event handler `onStartClick' started!"  
        
        if not self.gg.quiz:
            dial = LessonsSelectorDialog(self)
            dial.ShowModal()
        if not self.gg.quiz:
            return
        else:
            self._refreshConfig()
            
        self.responseCtrl.Enable(True)
        self.gg.startExam()
        self.chooseNewWord()
        
        self.start_btn.Hide()
        self.repeat_btn.Enable(True)
        self.next_btn.Enable(True)
        

    def chooseNewWord(self, answer=None):
        self.responseCtrl.Clear()
        self.word = self.gg.getNextWord(answer)
        if self.mode == 0:
            self.score_lbl.SetLabel(self.gg.getExamStatus())
        self.word.play()
        self.responseCtrl.SetFocus()