1
##############################################################################
3
# SM2-controller.py <Peter.Bienstman@UGent.be>
5
##############################################################################
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
15
##############################################################################
19
##############################################################################
21
tooltip = [["","","","","",""],["","","","","",""]]
23
def install_tooltip_strings(self):
28
_("You don't remember this card yet.")
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.")
36
tooltip[1][0] = tooltip[1][1] = \
37
_("You have forgotten this card completely.")
39
_("Barely correct answer. The interval was way too long.")
41
_("Correct answer, but with much effort.") + " " + \
42
_("The interval was probably too long.")
44
_("Correct answer, with some effort.") + " " + \
45
_("The interval was probably just right.")
47
_("Correct answer, but without any difficulties.") + " " + \
48
_("The interval was probably too short.")
52
##############################################################################
56
##############################################################################
58
class SM2Controller(object):
61
##########################################################################
65
##########################################################################
67
def new_question(self, learn_ahead = False):
69
if get_database().card_count() == 0:
73
self.card = get_scheduler().get_new_question(learn_ahead)
75
self.state = "SELECT SHOW"
77
self.state = "SELECT AHEAD"
79
#self.q_sound_played = False
80
#self.a_sound_played = False
85
##########################################################################
89
##########################################################################
91
def show_answer(self):
93
if self.state == "SELECT AHEAD":
94
self.newQuestion(learn_ahead = True)
97
self.state = "SELECT GRADE"
99
self.widget.updateDialog()
102
##########################################################################
106
##########################################################################
108
def grade_answer(self, grade):
110
get_scheduler().process_answer(self.card, grade)
113
##########################################################################
117
##########################################################################
119
def update_dialog(self):
123
database_name = os.path.basename(config["path"])[:-4]
124
title = _("Mnemosyne") + " - " + database_name
125
self.widget.set_window_title(title)
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)
133
self.widget.enable_edit_current_card(False)
135
if self.card != None:
136
self.widget.enable_edit_current_card(True)
138
self.widget.enable_edit_current_card(False)
140
self.widget.enable_delete_current_card(self.card != None)
141
self.widget_enable_edit_deck(number_of_cards() > 0)
143
# Size for non-latin characters.
145
increase_non_latin = config["non_latin_font_size_increase"]
146
non_latin_size = self.widget.get_font_size() + increase_non_latin
148
# Hide/show the question and answer boxes.
150
if self.state == "SELECT SHOW":
152
self.question_label.show()
153
if self.card.type.a_on_top_of_q == True:
155
self.answer_label.hide()
156
elif self.state == "SELECT GRADE":
158
self.answer_label.show()
159
if self.card.type.a_on_top_of_q == True:
161
self.question_label.hide()
164
self.question_label.show()
166
self.answer_label.show()
168
# Update question label.
170
question_label_text = _("Question:")
171
if self.card != None and self.card.cat.name != _("<default>"):
172
question_label_text += " " + self.card.cat.name
174
self.widget.set_question_label(question_label_text)
176
# Update question content.
178
if self.card == None:
179
self.widget.set_question("")
181
text = self.card.filtered_q()
183
#if self.q_sound_played == False:
185
# self.q_sound_played = True
187
if increase_non_latin:
188
text = set_non_latin_font_size(text, non_latin_size)
190
self.widget.set_question(text)
192
# Update answer content.
194
if self.card == None or self.state == "SELECT SHOW":
195
self.widget.set_answer("")
197
text = self.card.filtered_a()
199
#if self.a_sound_played == False:
201
# self.a_sound_played = True
203
if increase_non_latin:
204
text = set_non_latin_font_size(text, non_latin_size)
206
self.widget.set_answer(text)
208
# Update 'show answer' button.
210
if self.state == "EMPTY":
211
show_enabled, default, text = 0, 1, _("Show answer")
213
elif self.state == "SELECT SHOW":
214
show_enabled, default, text = 1, 1, _("Show answer")
216
elif self.state == "SELECT GRADE":
217
show_enabled, default, text = 0, 1, _("Show answer")
219
elif self.state == "SELECT AHEAD":
220
show_enabled, default, text = 1, 0, \
221
_("Learn ahead of schedule")
224
self.widget.update_show_button(text, default, enabled)
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.
230
self.grade_0_button.setDefault(False)
231
self.grade_4_button.setDefault(False)
234
self.disconnect(self.defaultAction,SIGNAL("activated()"),
235
self.grade_0_button.animateClick)
240
self.disconnect(self.defaultAction,SIGNAL("activated()"),
241
self.grade_4_button.animateClick)
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)
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)
256
self.grades.setEnabled(grades_enabled)
258
#QToolTip.setWakeUpDelay(0) #TODO?
260
for grade in range(0,6):
264
#QToolTip.remove(self.grade_buttons[grade])
266
if self.state == "SELECT GRADE" and \
267
config["show_intervals"] == "tooltips":
268
#QToolTip.add(self.grade_buttons[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))))
276
self.grade_buttons[grade].setToolTip(tooltip[i][grade])
278
#QToolTip.add(self.grade_buttons[grade], tooltip[i][grade])
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:"))
289
self.grade_buttons[grade].setText(str(grade))
290
self.grades.setTitle(_("Grade your answer:"))
292
# Todo: accelerator update needed?
293
#self.grade_buttons[grade].setAccel(QKeySequence(str(grade)))
295
# Run possible update code that independent of the controller state.
297
self.widget.update_dialog()