~kevang/mnemosyne-proj/grade-shortcuts-improvements

« back to all changes in this revision

Viewing changes to mnemosyne/mnemosyne/libmnemosyne/ui_controllers/SM2_controller.py

  • Committer: pbienst
  • Date: 2008-07-23 09:59:16 UTC
  • Revision ID: svn-v3-trunk0:e5e6b78b-db40-0410-9517-b98c64f8d2c1:trunk:467
Progress dump.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
##############################################################################
 
2
#
 
3
# SM2-controller.py <Peter.Bienstman@UGent.be>
 
4
#
 
5
##############################################################################
 
6
 
 
7
import gettext
 
8
_ = gettext.gettext
 
9
 
 
10
from mnemosyne.libmnemosyne.config import config
 
11
from mnemosyne.libmnemosyne.stopwatch import stopwatch
 
12
from mnemosyne.libmnemosyne.plugin_manager import get_database, get_scheduler
 
13
 
 
14
 
 
15
##############################################################################
 
16
#
 
17
# Tooltip texts
 
18
#
 
19
##############################################################################
 
20
 
 
21
tooltip = [["","","","","",""],["","","","","",""]]
 
22
 
 
23
def install_tooltip_strings(self):
 
24
 
 
25
    global tooltip
 
26
    
 
27
    tooltip[0][0] = \
 
28
        _("You don't remember this card yet.")
 
29
    tooltip[0][1] = \
 
30
        _("Like '0', but it's getting more familiar.") + " " + \
 
31
        _("Show it less often.")
 
32
    tooltip[0][2] = tooltip[0][3] = tooltip[0][4] = tooltip[0][5] = \
 
33
        _("You've memorised this card now,") + \
 
34
        _(" and will probably remember it for a few days.")
 
35
 
 
36
    tooltip[1][0] = tooltip[1][1] = \
 
37
        _("You have forgotten this card completely.")
 
38
    tooltip[1][2] = \
 
39
        _("Barely correct answer. The interval was way too long.")
 
40
    tooltip[1][3] = \
 
41
        _("Correct answer, but with much effort.") + " " + \
 
42
        _("The interval was probably too long.")
 
43
    tooltip[1][4] = \
 
44
        _("Correct answer, with some effort.") + " " + \
 
45
        _("The interval was probably just right.")
 
46
    tooltip[1][5] = \
 
47
        _("Correct answer, but without any difficulties.") + " " + \
 
48
        _("The interval was probably too short.")
 
49
    
 
50
 
 
51
 
 
52
##############################################################################
 
53
#
 
54
# SM2Controller
 
55
#
 
56
##############################################################################
 
57
 
 
58
class SM2Controller(object):
 
59
 
 
60
 
 
61
    ##########################################################################
 
62
    #
 
63
    # new_question
 
64
    #
 
65
    ##########################################################################
 
66
 
 
67
    def new_question(self, learn_ahead = False):
 
68
        
 
69
        if get_database().card_count() == 0:
 
70
            self.state = "EMPTY"
 
71
            self.card = None
 
72
        else:
 
73
            self.card = get_scheduler().get_new_question(learn_ahead)
 
74
            if self.card != None:
 
75
                self.state = "SELECT SHOW"
 
76
            else:
 
77
                self.state = "SELECT AHEAD"
 
78
 
 
79
        #self.q_sound_played = False
 
80
        #self.a_sound_played = False
 
81
        
 
82
        stopwatch.start()
 
83
 
 
84
 
 
85
    ##########################################################################
 
86
    #
 
87
    # show_answer
 
88
    #
 
89
    ##########################################################################
 
90
 
 
91
    def show_answer(self):
 
92
 
 
93
        if self.state == "SELECT AHEAD":
 
94
            self.newQuestion(learn_ahead = True)
 
95
        else:
 
96
            stop_thinking()
 
97
            self.state = "SELECT GRADE"
 
98
            
 
99
        self.widget.updateDialog()
 
100
 
 
101
 
 
102
    ##########################################################################
 
103
    #
 
104
    # grade_answer
 
105
    #
 
106
    ##########################################################################
 
107
 
 
108
    def grade_answer(self, grade):
 
109
 
 
110
        get_scheduler().process_answer(self.card, grade)
 
111
 
 
112
        
 
113
    ##########################################################################
 
114
    #
 
115
    # update_dialog
 
116
    #
 
117
    ##########################################################################
 
118
 
 
119
    def update_dialog(self):
 
120
 
 
121
        # Update title.
 
122
        
 
123
        database_name = os.path.basename(config["path"])[:-4]
 
124
        title = _("Mnemosyne") + " - " + database_name
 
125
        self.widget.set_window_title(title)
 
126
 
 
127
        # Update menu bar.
 
128
 
 
129
        if config["only_editable_when_answer_shown"] == True:
 
130
            if self.card != None and self.state == "SELECT GRADE":
 
131
                self.widget.enable_edit_current_card(True)
 
132
            else:
 
133
                self.widget.enable_edit_current_card(False)
 
134
        else:
 
135
            if self.card != None:
 
136
                self.widget.enable_edit_current_card(True)
 
137
            else:
 
138
                self.widget.enable_edit_current_card(False)            
 
139
            
 
140
        self.widget.enable_delete_current_card(self.card != None)
 
141
        self.widget_enable_edit_deck(number_of_cards() > 0)
 
142
        
 
143
        # Size for non-latin characters.
 
144
 
 
145
        increase_non_latin = config["non_latin_font_size_increase"]
 
146
        non_latin_size = self.widget.get_font_size() + increase_non_latin
 
147
 
 
148
        # Hide/show the question and answer boxes.
 
149
        
 
150
        if self.state == "SELECT SHOW":
 
151
            self.question.show()
 
152
            self.question_label.show()
 
153
            if self.card.type.a_on_top_of_q == True:
 
154
                self.answer.hide()
 
155
                self.answer_label.hide()
 
156
        elif self.state == "SELECT GRADE":
 
157
            self.answer.show()
 
158
            self.answer_label.show()
 
159
            if self.card.type.a_on_top_of_q == True:
 
160
                self.question.hide()
 
161
                self.question_label.hide()
 
162
        else:
 
163
            self.question.show()
 
164
            self.question_label.show()
 
165
            self.answer.show()
 
166
            self.answer_label.show()
 
167
 
 
168
        # Update question label.
 
169
        
 
170
        question_label_text = _("Question:")
 
171
        if self.card != None and self.card.cat.name != _("<default>"):
 
172
            question_label_text += " " + self.card.cat.name
 
173
            
 
174
        self.widget.set_question_label(question_label_text)
 
175
 
 
176
        # Update question content.
 
177
        
 
178
        if self.card == None:
 
179
            self.widget.set_question("")
 
180
        else:
 
181
            text = self.card.filtered_q()
 
182
 
 
183
            #if self.q_sound_played == False:
 
184
            #    play_sound(text)
 
185
            #    self.q_sound_played = True
 
186
                
 
187
            if increase_non_latin:
 
188
                text = set_non_latin_font_size(text, non_latin_size)
 
189
 
 
190
            self.widget.set_question(text)
 
191
 
 
192
        # Update answer content.
 
193
        
 
194
        if self.card == None or self.state == "SELECT SHOW":
 
195
            self.widget.set_answer("")
 
196
        else:
 
197
            text = self.card.filtered_a()
 
198
 
 
199
            #if self.a_sound_played == False:
 
200
            #    play_sound(text)
 
201
            #    self.a_sound_played = True
 
202
                
 
203
            if increase_non_latin:
 
204
                text = set_non_latin_font_size(text, non_latin_size)
 
205
 
 
206
            self.widget.set_answer(text)
 
207
 
 
208
        # Update 'show answer' button.
 
209
        
 
210
        if self.state == "EMPTY":
 
211
            show_enabled, default, text = 0, 1, _("Show answer")
 
212
            grades_enabled = 0 
 
213
        elif self.state == "SELECT SHOW":
 
214
            show_enabled, default, text = 1, 1, _("Show answer")
 
215
            grades_enabled = 0
 
216
        elif self.state == "SELECT GRADE":
 
217
            show_enabled, default, text = 0, 1, _("Show answer")
 
218
            grades_enabled = 1
 
219
        elif self.state == "SELECT AHEAD":
 
220
            show_enabled, default, text = 1, 0, \
 
221
                                     _("Learn ahead of schedule")
 
222
            grades_enabled = 0
 
223
 
 
224
        self.widget.update_show_button(text, default, enabled)
 
225
 
 
226
        # Update grade buttons. Make sure that no signals get connected
 
227
        # twice, and put the disconnects inside a try statement to work
 
228
        # around a Windows issue.
 
229
 
 
230
        self.grade_0_button.setDefault(False)
 
231
        self.grade_4_button.setDefault(False)
 
232
 
 
233
        try:
 
234
            self.disconnect(self.defaultAction,SIGNAL("activated()"),
 
235
                            self.grade_0_button.animateClick)
 
236
        except:
 
237
            pass
 
238
        
 
239
        try:
 
240
            self.disconnect(self.defaultAction,SIGNAL("activated()"),
 
241
                            self.grade_4_button.animateClick)
 
242
        except:
 
243
            pass
 
244
        
 
245
        if self.card != None and self.card.grade in [0,1]:  ##
 
246
            i = 0 # Acquisition phase.
 
247
            self.grade_0_button.setDefault(grades_enabled)
 
248
            self.connect(self.actionDefault,SIGNAL("activated()"),
 
249
                         self.grade_0_button.animateClick)
 
250
        else:
 
251
            i = 1 # Retention phase.
 
252
            self.grade_4_button.setDefault(grades_enabled)
 
253
            self.connect(self.actionDefault,SIGNAL("activated()"),
 
254
                         self.grade_4_button.animateClick)
 
255
                        
 
256
        self.grades.setEnabled(grades_enabled)
 
257
 
 
258
        #QToolTip.setWakeUpDelay(0) #TODO?
 
259
 
 
260
        for grade in range(0,6):
 
261
 
 
262
            # Tooltip.
 
263
            
 
264
            #QToolTip.remove(self.grade_buttons[grade])
 
265
            
 
266
            if self.state == "SELECT GRADE" and \
 
267
               config["show_intervals"] == "tooltips":
 
268
                #QToolTip.add(self.grade_buttons[grade],
 
269
                #      tooltip[i][grade].
 
270
                #      append(self.next_rep_string(process_answer(self.card,
 
271
                #                                  grade, dry_run=True))))
 
272
                self.grade_buttons[grade].setToolTip(tooltip[i][grade].
 
273
                      append(self.next_rep_string(process_answer(self.card,
 
274
                                                  grade, dry_run=True))))
 
275
            else:
 
276
                self.grade_buttons[grade].setToolTip(tooltip[i][grade])
 
277
                
 
278
                #QToolTip.add(self.grade_buttons[grade], tooltip[i][grade])
 
279
 
 
280
            # Button text.
 
281
                    
 
282
            if self.state == "SELECT GRADE" and \
 
283
               config["show_intervals"] == "buttons":
 
284
                self.grade_buttons[grade].setText(\
 
285
                        str(process_answer(self.card, grade, dry_run=True)))
 
286
                self.grades.setTitle(\
 
287
                    _("Pick days until next repetition:"))
 
288
            else:
 
289
                self.grade_buttons[grade].setText(str(grade))
 
290
                self.grades.setTitle(_("Grade your answer:"))
 
291
 
 
292
            # Todo: accelerator update needed?
 
293
            #self.grade_buttons[grade].setAccel(QKeySequence(str(grade)))
 
294
 
 
295
        # Run possible update code that independent of the controller state.
 
296
 
 
297
        self.widget.update_dialog()
 
298