1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
|
#// auth_ Mohamad Janati
#// Copyright (c) 2019-2021 Mohamad Janati (freaking stupid, right? :|)
import json
from aqt import mw
import aqt
from aqt.qt import *
from aqt.utils import downArrow, shortcut, showInfo
from aqt.reviewer import Reviewer
from anki.hooks import wrap
from . import Card_Info
from . import styles
from .Skip import test
from .Skip import burySkipped
from .Skip import try_unburySkipped
#// getting config information
config = mw.addonManager.getConfig(__name__)
speedFocus_addOn = config[' Speed Focus Add-on']
bottombarButtons_style = config[' Review_ Bottombar Buttons Style']
skipMethod = config[' Skip Method']
skip = config['Button_ Skip Button']
showSkipped = config['Button_ Show Skipped Button']
info = config['Button_ Info Button']
undo = config['Button_ Undo Button']
skip_shortcut = config ['Button_ Shortcut_ Skip Button'].lower()
showSkipped_shortcut = config ['Button_ Shortcut_ Show Skipped Button'].lower()
info_shortcut = config['Button_ Shortcut_ Info Button'].lower()
undo_shortcut = config['Button_ Shortcut_ Undo Button'].lower()
info_position = config['Button_ Position_ Info Button'].lower()
skip_position = config['Button_ Position_ Skip Button'].lower()
showSkipped_position = config['Button_ Position_ Show Skipped Button'].lower()
undo_position = config['Button_ Position_ Undo Button'].lower()
edit_label = config['Button Label_ Edit']
showAnswer_label = config['Button Label_ Show Answer']
more_label = config['Button Label_ More']
info_label = config['Button Label_ Info']
skip_label = config['Button Label_ Skip']
showSkipped_label = config['Button Label_ Show Skipped']
undo_label = config['Button Label_ Undo']
custom_buttonSize = config ['Button_ Custom Button Sizes']
buttons_height = config['Button_ Height_ All Bottombar Buttons']
answer_width = config['Button_ Width_ Show Answer Button']
text_size = config['Button_ Text Size']
custom_bottombarButtonBorderColor = config['Color_ Custom Bottombar Button Border Color']
bottombarButtonBorder_color = config['Color_ Bottombar Button Border Color']
showAnswerBorderColor_style = config['ShowAnswer_ Border Color Style']
showAnswerEase1 = config['ShowAnswer_ Ease1']
showAnswerEase2 = config['ShowAnswer_ Ease2']
showAnswerEase3 = config['ShowAnswer_ Ease3']
showAnswerEase4 = config['ShowAnswer_ Ease4']
showAnswerEase1_color = config['ShowAnswer_ Ease1 Color']
showAnswerEase2_color = config['ShowAnswer_ Ease2 Color']
showAnswerEase3_color = config['ShowAnswer_ Ease3 Color']
showAnswerEase4_color = config['ShowAnswer_ Ease4 Color']
# TODO: set the showSkipped styling and stuff
edit_style = styles.edit_style
info_style = styles.info_style
skip_style = styles.skip_style
showSkipped_style = styles.showSkipped_style
undo_style = styles.undo_style
more_style = styles.more_style
min_buttonSize = styles.min_buttonSize
bottombar_neon1 = styles.bottombar_neon1
bottombar_neon2 = styles.bottombar_neon2
bottombar_fill1 = styles.bottombar_fill1
bottombar_fill2 = styles.bottombar_fill2
#// adding shortcuts to _shortcutKeys function in anki
def _shortcutKeys_wrap(self, _old):
original = _old(self)
sched_ver = mw.col.sched.version
if sched_ver > 2 or skipMethod == 1:
original.append((skip_shortcut, lambda: burySkipped()))
original.append((showSkipped_shortcut, lambda: try_unburySkipped()))
else:
original.append((skip_shortcut, lambda: self.nextCard()))
original.extend([
(info_shortcut, lambda: Card_Info._cs.toggle()),
(undo_shortcut, lambda: mw.onUndo())
])
return original
#// adding button links to link handler function
def linkHandler_wrap(reviewer, url):
sched_ver = mw.col.sched.version
if url == "card_info":
Card_Info._cs.toggle()
elif url == "skip":
if sched_ver > 2 or skipMethod == 1:
burySkipped()
else:
reviewer.nextCard()
elif url == "showSkipped":
if sched_ver > 2 or skipMethod == 1:
try_unburySkipped()
else:
showInfo("Your skip method is not \"Bury\" Hence you don't have any skipped cards that can be shown using this button.")
elif url == "undo":
mw.onUndo()
else:
Review_linkHandelr_Original(reviewer, url)
Review_linkHandelr_Original = Reviewer._linkHandler
Reviewer._linkHandler = linkHandler_wrap
#// Chosing stylinhg for review other buttons in reviewer bottombar based on chosen style
if bottombarButtons_style == 0:
bottomHTML_style = "<style></style>"
elif bottombarButtons_style == 1:
bottomHTML_style = bottombar_neon1
elif bottombarButtons_style == 2:
bottomHTML_style = bottombar_neon2
elif bottombarButtons_style == 3:
bottomHTML_style = bottombar_fill1
elif bottombarButtons_style == 4:
bottomHTML_style = bottombar_fill2
#// info button | written in a separate functions to preserve the original bottombar
def info_button():
if info:
return """<button title="Shortcut key: {}" onclick="pycmd('card_info');" {}>{}</button>""".format(info_shortcut.upper(), info_style, info_label)
else:
return ""
#// skip button | written in a separate functions to preserve the original bottombar
def skip_button():
if skip:
return """<button title="Shortcut key: {}" onclick="pycmd('skip');" {}>{}</button>""".format(skip_shortcut.upper(), skip_style, skip_label)
else:
return ""
#// Show Skipped button
def showSkipped_button():
if showSkipped:
return """<button title="Shortcut key: {}" onclick="pycmd('showSkipped');" {}>{}</button>""".format(showSkipped_shortcut.upper(), showSkipped_style, showSkipped_label)
else:
return ""
#// undo button
def undo_button():
if undo:
return """<button title="Shortcut key: {}" onclick="pycmd('undo');" {}>{}</button>""".format(undo_shortcut, undo_style, undo_label)
else:
return ""
#// Button Positions
leftSide_button1 = ""
leftSide_button2 = ""
leftSide_button3 = ""
leftSide_button4 = ""
middleLeftSide_button1 = ""
middleLeftSide_button2 = ""
middleLeftSide_button3 = ""
middleLeftSide_button4 = ""
middleRightSide_button1 = ""
middleRightSide_button2 = ""
middleRightSide_button3 = ""
middleRightSide_button4 = ""
rightSide_button1 = ""
rightSide_button2 = ""
rightSide_button3 = ""
rightSide_button4 = ""
if info_position == "right":
rightSide_button1 = info_button()
elif info_position == "middle left":
middleLeftSide_button1 = info_button()
elif info_position == "middle right":
middleRightSide_button1 = info_button()
else:
leftSide_button1 = info_button()
if skip_position == "left":
leftSide_button2 = skip_button()
elif skip_position == "middle right":
middleRightSide_button2 = skip_button()
elif skip_position == "right":
rightSide_button2 = skip_button()
else:
middleLeftSide_button2 = skip_button()
if showSkipped_position == "left":
leftSide_button3 = showSkipped_button()
elif showSkipped_position == "middle right":
middleRightSide_button3 = showSkipped_button()
elif showSkipped_position == "right":
rightSide_button3 = showSkipped_button()
else:
middleLeftSide_button3 = showSkipped_button()
if undo_position == "left":
leftSide_button4 = undo_button()
elif undo_position == "middle right":
middleRightSide_button4 = undo_button()
elif undo_position == "right":
rightSide_button4 = undo_button()
else:
middleLeftSide_button4 = undo_button()
#// Speed focus remove conflicts
if speedFocus_addOn:
SF_bottomHTML = """
var autoAnswerTimeout = 0;
var autoAgainTimeout = 0;
var autoAlertTimeout = 0;
var setAutoAnswer = function(ms) {
clearTimeout(autoAnswerTimeout);
autoAnswerTimeout = setTimeout(function () { pycmd('ans') }, ms);
}
var setAutoAgain = function(ms) {
clearTimeout(autoAgainTimeout);
autoAgainTimeout = setTimeout(function () { pycmd("ease1"); }, ms);
}
var setAutoAlert = function(ms) {
clearTimeout(autoAlertTimeout);
autoAlertTimeout = setTimeout(function () { pycmd("autoalert"); }, ms);
}"""
else:
SF_bottomHTML = ""
#// setting buttons based on their position
if leftSide_button1 != "":
left_side1 = "<td width=50 align=left valign=top class=stat><br> {} </td>".format(leftSide_button1)
else:
left_side1 = ""
if leftSide_button2 != "":
left_side2 = "<td width=50 align=left valign=top class=stat><br> {} </td>".format(leftSide_button2)
else:
left_side2 = ""
if leftSide_button3 != "":
left_side3 = "<td width=50 align=left valign=top class=stat><br> {} </td>".format(leftSide_button3)
else:
left_side3 = ""
if leftSide_button4 != "":
left_side4 = "<td width=50 align=left valign=top class=stat><br> {} </td>".format(leftSide_button4)
else:
left_side4 = ""
if rightSide_button1 != "":
right_side1 = "<td width=50 align=right valign=top class=stat><br> {} </td>".format(rightSide_button1)
else:
right_side1 = ""
if rightSide_button2 != "":
right_side2 = "<td width=50 align=right valign=top class=stat><br> {} </td>".format(rightSide_button2)
else:
right_side2 = ""
if rightSide_button3 != "":
right_side3 = "<td width=50 align=right valign=top class=stat><br> {} </td>".format(rightSide_button3)
else:
right_side3 = ""
if rightSide_button4 != "":
right_side4 = "<td width=50 align=right valign=top class=stat><br> {} </td>".format(rightSide_button4)
else:
right_side4 = ""
#// Review Screen Bottombar HTML
def _bottomHTML(self):
time_color = ""
if custom_bottombarButtonBorderColor:
time_color = bottombarButtonBorder_color
return """%(bottomHTML_style)s
%(min_buttonSize)s
<center id=outer>
<table id=innertable width=100%% cellspacing=0 cellpadding=0>
<tr>
<td align=left width=50 valign=top class=stat>
<br>
<button title="Shortcut key: E" onclick="pycmd('edit');" %(edit_style)s>%(edit_label)s</button></td>
%(left_side1)s
%(left_side2)s
%(left_side3)s
%(left_side4)s
<td align=center valign=top id=middle>
</td>
%(right_side1)s
%(right_side2)s
%(right_side3)s
%(right_side4)s
<td width=50 align=right valign=top class=stat style='color: %(time_color)s'><span id=time class=stattxt>
</span><br>
<button onclick="pycmd('more');" %(more_style)s>%(more_label)s %(downArrow)s</button>
</td>
</tr>
</table>
</center>
<script>
time = %(time)d;
%(SF_bottomHTML)s
</script>
""" % dict(bottomHTML_style=bottomHTML_style, min_buttonSize=min_buttonSize, rem=self._remaining(), downArrow=downArrow(), time=self.card.time_taken() // 1000,
edit_style=edit_style, edit_label=edit_label, left_side1=left_side1, left_side2=left_side2, left_side3=left_side3, left_side4=left_side4, right_side1=right_side1,
right_side2=right_side2, right_side3=right_side3, right_side4=right_side4, more_style=more_style, more_label=more_label, SF_bottomHTML=SF_bottomHTML, time_color=time_color)
#// Show Answer Button
def _showAnswerButton(self):
showAnswer_text = showAnswer_label
highEase_tooltip = ""
if self.card.type not in [0, 1] and showAnswerBorderColor_style in [1, 3]:
if self.card.factor // 10 < showAnswerEase1:
showAnswerBorder_color = showAnswerEase1_color
elif (showAnswerEase1 - 1) < self.card.factor // 10 < showAnswerEase2:
showAnswerBorder_color = showAnswerEase2_color
elif (showAnswerEase2 - 1) < self.card.factor // 10 < showAnswerEase3:
showAnswerBorder_color = showAnswerEase3_color
elif (showAnswerEase3 - 1) < self.card.factor // 10 < showAnswerEase4:
showAnswerBorder_color = showAnswerEase4_color
else:
showAnswerBorder_color = "#7000A8"
showAnswer_text = "<font size=6 color='#7000A8'> ^_~ </font>"
else:
showAnswerBorder_color = ""
#// Moved show answer button size from "styles.py" here to make show answer border color based on ease compatible with custom button sizes
if custom_buttonSize:
if bottombarButtons_style ==0:
showAnswer_style = 'style="height: {}px; width: {}px; font-size: {}px; border-color: {};"'.format(buttons_height, answer_width, text_size, showAnswerBorder_color)
else:
showAnswer_style = 'style="height: {}px; width: {}px; font-size: {}px; border-color: {};" id=main'.format(buttons_height, answer_width, text_size, showAnswerBorder_color)
else:
if bottombarButtons_style == 0:
showAnswer_style = "style='border-color: {}' id=ansbut".format(showAnswerBorder_color) #// removed id=ansbut from it's own code for styling
else:
showAnswer_style = "style='border-color: {}' id=main".format(showAnswerBorder_color)
#// removing conflict with speed focus add-on
if speedFocus_addOn:
c = self.mw.col.decks.confForDid(self.card.odid or self.card.did)
if c.get('autoAnswer', 0) > 0:
self.bottom.web.eval("setAutoAnswer(%d);" % (c['autoAnswer'] * 1000))
if c.get('autoAlert', 0) > 0:
self.bottom.web.eval("setAutoAlert(%d);" % (c['autoAlert'] * 1000))
middle = '''
<table cellspacing=0 cellpadding=0><tr><td class=stat2 align=center>
<span class=stattxt> %(remaining)s </span><br>
%(middleLeft_side1)s
%(middleLeft_side2)s
%(middleLeft_side3)s
%(middleLeft_side4)s
<button title="Shortcut key: Space" onclick='pycmd("ans");' %(answer_style)s>%(showAnswer_text)s</button>
%(middleRight_side1)s
%(middleRight_side2)s
%(middleRight_side3)s
%(middleRight_side4)s
</td></tr></table>''' % dict(remaining=self._remaining(), middleLeft_side1=middleLeftSide_button1, middleLeft_side2=middleLeftSide_button2, middleLeft_side3=middleLeftSide_button3, middleLeft_side4=middleLeftSide_button4,
answer_style=showAnswer_style, middleRight_side1=middleRightSide_button1, middleRight_side2=middleRightSide_button2, middleRight_side3=middleRightSide_button3, middleRight_side4=middleRightSide_button4, showAnswer_text=showAnswer_text)
# wrap it in a table so it has the same top margin as the ease buttons
middle = "%s" % middle
if self.card.should_show_timer():
maxTime = self.card.time_limit() / 1000
else:
maxTime = 0
self.bottom.web.eval("showQuestion(%s,%d);" % (json.dumps(middle), maxTime))
self.bottom.web.adjustHeightToFit()
#// replacing/wraping functions
Reviewer._shortcutKeys = wrap(Reviewer._shortcutKeys, _shortcutKeys_wrap, 'around')
Reviewer._showAnswerButton = _showAnswerButton
Reviewer._bottomHTML = _bottomHTML
|