Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/lessonscreen.py
diff options
context:
space:
mode:
Diffstat (limited to 'lessonscreen.py')
-rw-r--r--lessonscreen.py165
1 files changed, 110 insertions, 55 deletions
diff --git a/lessonscreen.py b/lessonscreen.py
index daed55b..a64d3bf 100644
--- a/lessonscreen.py
+++ b/lessonscreen.py
@@ -35,6 +35,19 @@ PARAGRAPH_CODE = u'\xb6'
# Maximium width of a text line in text lesson mode.
LINE_WIDTH = 70
+FINGERS = {
+ 'LP': _('left little finger'),
+ 'LR': _('left ring finger'),
+ 'LM': _('left middle finger'),
+ 'LI': _('left index finger'),
+ 'LT': _('left thumb'),
+ 'RP': _('right little finger'),
+ 'RR': _('right ring finger'),
+ 'RM': _('right middle finger'),
+ 'RI': _('right index finger'),
+ 'RT': _('right thumb'),
+}
+
class LessonScreen(gtk.VBox):
def __init__(self, lesson, keyboard_images, activity):
gtk.VBox.__init__(self)
@@ -74,17 +87,15 @@ class LessonScreen(gtk.VBox):
# Set up font styles.
self.tagtable = gtk.TextTagTable()
instructions_tag = gtk.TextTag('instructions')
- instructions_tag.props.size = 10000
instructions_tag.props.justification = gtk.JUSTIFY_CENTER
self.tagtable.add(instructions_tag)
text_tag = gtk.TextTag('text')
text_tag.props.family = 'Monospace'
- text_tag.props.size = 10000
self.tagtable.add(text_tag)
spacer_tag = gtk.TextTag('spacer')
- spacer_tag.props.size = 10
+ spacer_tag.props.size = 3000
self.tagtable.add(spacer_tag)
image_tag = gtk.TextTag('image')
@@ -93,13 +104,11 @@ class LessonScreen(gtk.VBox):
correct_copy_tag = gtk.TextTag('correct-copy')
correct_copy_tag.props.family = 'Monospace'
- correct_copy_tag.props.size = 10000
correct_copy_tag.props.foreground = '#0000ff'
self.tagtable.add(correct_copy_tag)
incorrect_copy_tag = gtk.TextTag('incorrect-copy')
incorrect_copy_tag.props.family = 'Monospace'
- incorrect_copy_tag.props.size = 10000
incorrect_copy_tag.props.foreground = '#ff0000'
self.tagtable.add(incorrect_copy_tag)
@@ -238,6 +247,13 @@ class LessonScreen(gtk.VBox):
self.text = unicode(step['text'])
self.instructions = unicode(step['instructions'])
+ if step.has_key('mode'):
+ self.mode = step['mode']
+ else:
+ if len(self.text) == 1:
+ self.mode = 'key'
+ else:
+ self.mode = 'text'
# Show report after the last step.
elif self.next_step_idx == len(self.lesson['steps']) and not self.lesson_finished:
@@ -245,6 +261,7 @@ class LessonScreen(gtk.VBox):
self.instructions = self.get_lesson_report()
self.text = '\n'
+ self.mode = 'key'
# Leave this screen when the lesson is finished.
else:
@@ -255,12 +272,6 @@ class LessonScreen(gtk.VBox):
if len(self.text) == 0:
self.text = '\n'
- # Single character steps are handled differently from multi-character steps.
- if len(self.text) == 1:
- self.mode = 'key'
- else:
- self.mode = 'text'
-
# Clear the buffer *before* key steps.
self.lessonbuffer.set_text('')
@@ -274,33 +285,10 @@ class LessonScreen(gtk.VBox):
self.line_marks = {}
self.lessonbuffer.insert_with_tags_by_name(
- self.lessonbuffer.get_end_iter(), '\n\n', 'instructions')
+ self.lessonbuffer.get_end_iter(), '\n', 'instructions')
self.line_marks[0] = self.lessonbuffer.create_mark(None, self.lessonbuffer.get_end_iter(), True)
- # Determine what modifier keys are needed.
- key, state, group = self.keyboard.get_key_state_group_for_letter(self.text[0])
-
- if key:
- if state & gtk.gdk.SHIFT_MASK:
- shift_key = self.keyboard.find_key_by_label('shift')
- pixbuf = self.keyboard.get_key_pixbuf(shift_key, scale=1)
- self.lessonbuffer.insert_pixbuf(self.lessonbuffer.get_end_iter(), pixbuf)
- self.lessonbuffer.insert(self.lessonbuffer.get_end_iter(), ' ')
-
- if state & gtk.gdk.MOD5_MASK:
- altgr_key = self.keyboard.find_key_by_label('altgr')
- pixbuf = self.keyboard.get_key_pixbuf(altgr_key, scale=1)
- self.lessonbuffer.insert_pixbuf(self.lessonbuffer.get_end_iter(), pixbuf)
- self.lessonbuffer.insert(self.lessonbuffer.get_end_iter(), ' ')
-
- pixbuf = self.keyboard.get_key_pixbuf(key, state, group, 1)
- self.lessonbuffer.insert_pixbuf(self.lessonbuffer.get_end_iter(), pixbuf)
-
- self.lessonbuffer.apply_tag_by_name('image',
- self.lessonbuffer.get_iter_at_mark(self.line_marks[0]),
- self.lessonbuffer.get_end_iter())
-
self.lessontext.set_cursor_visible(False)
# Enable hands for key mode.
@@ -324,13 +312,15 @@ class LessonScreen(gtk.VBox):
self.line_marks = {}
line_idx = 0
for l in self.lines:
- # Add a little space between lines. Not working atm.
- #self.lessonbuffer.insert_with_tags_by_name(
- # self.lessonbuffer.get_end_iter(), '\n', 'spacer')
+ # Add a little space between lines.
+ self.lessonbuffer.insert_with_tags_by_name(
+ self.lessonbuffer.get_end_iter(), '\n', 'text')
+ self.lessonbuffer.insert_with_tags_by_name(
+ self.lessonbuffer.get_end_iter(), '\n', 'spacer')
# Add the text to copy.
self.lessonbuffer.insert_with_tags_by_name(
- self.lessonbuffer.get_end_iter(), '\n' + l.encode('utf-8') + '\n', 'text')
+ self.lessonbuffer.get_end_iter(), l.encode('utf-8') + '\n', 'text')
# Leave a marker where we will later insert text.
self.line_marks[line_idx] = self.lessonbuffer.create_mark(None, self.lessonbuffer.get_end_iter(), True)
@@ -381,12 +371,15 @@ class LessonScreen(gtk.VBox):
if self.mode == 'key':
# Check to see if they pressed the correct key.
- if key == self.line[0]:
+ if key == self.line[self.char_idx]:
self.correct_keys += 1
self.total_keys += 1
- # Advance to the next step.
- self.advance_step()
+ # Advance to the next character (or else step).
+ self.char_idx += 1
+ if self.char_idx >= len(self.line):
+ self.advance_step()
+
self.update_stats()
self.hilite_next_key()
@@ -465,24 +458,86 @@ class LessonScreen(gtk.VBox):
return True
def hilite_next_key(self):
- if not self.line:
- return
+ char = self.line[self.char_idx]
+ self.keyboard.set_hilite_letter(char)
+
+ # In Text mode, move the cursor to the insert location.
+ if self.mode == 'text':
+ iter = self.lessonbuffer.get_iter_at_mark(self.line_mark)
+ iter.forward_chars(self.char_idx)
+ self.lessonbuffer.place_cursor(iter)
+
+ # Gain focus (this causes the cursor line to draw).
+ self.lessontext.grab_focus()
+
+ # Scroll the TextView so the cursor is on screen.
+ self.lessontext.scroll_to_mark(self.lessonbuffer.get_insert(), 0)
+
+ # In Key mode, display the finger hint and the key image.
+ if self.mode == 'key':
+ iter = self.lessonbuffer.get_iter_at_mark(self.line_mark)
+ self.lessonbuffer.delete(iter, self.lessonbuffer.get_end_iter())
+
+ # Determine what modifier keys are needed.
+ key, state, group = self.keyboard.get_key_state_group_for_letter(char)
+
+ # Append the instructions and key images.
+ if key:
+ letter = char
+ if letter == PARAGRAPH_CODE:
+ letter = 'enter'
+ if letter == ' ':
+ letter = 'space'
+
+ instructions = ''
+
+ try:
+ finger = FINGERS[key['key-finger']]
+ except:
+ finger = ''
- if len(self.line) > 0:
- char = self.line[self.char_idx]
- self.keyboard.set_hilite_letter(char)
+ if state == gtk.gdk.SHIFT_MASK:
+ # Choose the finger to press the SHIFT key with.
+ if key['key-finger'][0] == 'R':
+ shift_finger = FINGERS['LP']
+ else:
+ shift_finger = FINGERS['RP']
+
+ instructions = _('Press and hold the shift key with your %(finger)s, ') % { 'finger': shift_finger }
+ instructions += _('then press the %(letter)s key with your %(finger)s.') % { 'letter': letter, 'finger': finger }
- # Move the cursor to the insert location.
- iter = self.lessonbuffer.get_iter_at_mark(self.line_mark)
- iter.forward_chars(self.char_idx)
- self.lessonbuffer.place_cursor(iter)
+ elif state == gtk.gdk.MOD5_MASK:
+ instructions = _('Press and hold the altgr key, ')
+ instructions += _('then press the %(letter)s key with your %(finger)s.') % { 'letter': letter, 'finger': finger }
- # Gain focus (this causes the cursor line to draw).
- self.lessontext.grab_focus()
+ elif state == gtk.gdk.SHIFT_MASK | gtk.gdk.MOD5_MASK:
+ instructions = _('Press and hold the altgr and shift keys, ')
+ instructions += _('then press the %(letter)s key with your %(finger)s.') % { 'letter': letter, 'finger': finger }
- # Scroll the TextView so the cursor is on screen.
- self.lessontext.scroll_to_mark(self.lessonbuffer.get_insert(), 0)
+ else:
+ instructions = _('Press the %(letter)s key with your %(finger)s.') % { 'letter': letter, 'finger': finger }
+
+ self.lessonbuffer.insert(self.lessonbuffer.get_end_iter(), instructions + '\n\n')
+
+ if state & gtk.gdk.SHIFT_MASK:
+ shift_key = self.keyboard.find_key_by_label('shift')
+ pixbuf = self.keyboard.get_key_pixbuf(shift_key, scale=1)
+ self.lessonbuffer.insert_pixbuf(self.lessonbuffer.get_end_iter(), pixbuf)
+ self.lessonbuffer.insert(self.lessonbuffer.get_end_iter(), ' ')
+
+ if state & gtk.gdk.MOD5_MASK:
+ altgr_key = self.keyboard.find_key_by_label('altgr')
+ pixbuf = self.keyboard.get_key_pixbuf(altgr_key, scale=1)
+ self.lessonbuffer.insert_pixbuf(self.lessonbuffer.get_end_iter(), pixbuf)
+ self.lessonbuffer.insert(self.lessonbuffer.get_end_iter(), ' ')
+ pixbuf = self.keyboard.get_key_pixbuf(key, state, group, 1)
+ self.lessonbuffer.insert_pixbuf(self.lessonbuffer.get_end_iter(), pixbuf)
+
+ self.lessonbuffer.apply_tag_by_name('image',
+ self.lessonbuffer.get_iter_at_mark(self.line_marks[0]),
+ self.lessonbuffer.get_end_iter())
+
def get_lesson_report(self):
self.update_stats()