diff options
author | olpc <olpc@xo-12-34-56.localdomain> | 2008-11-18 03:17:35 (GMT) |
---|---|---|
committer | olpc <olpc@xo-12-34-56.localdomain> | 2008-11-18 03:17:35 (GMT) |
commit | 6c2b1ff609c87eb42d036b63953f229a077a17e0 (patch) | |
tree | 01d6c1ff08f7f9fb1df40c0f89c15712a6ed8a78 | |
parent | 0f64fe1984496579ea6cb3dadeafd1c6a346c5fe (diff) |
Further lesson improvements.
-rw-r--r-- | lessons/en_US/dummy.lesson | 3 | ||||
-rw-r--r-- | lessons/en_US/homerow_intro.lesson | 6 | ||||
-rwxr-xr-x | typingturtle.py | 180 |
3 files changed, 115 insertions, 74 deletions
diff --git a/lessons/en_US/dummy.lesson b/lessons/en_US/dummy.lesson index 52c7e0d..f3049ea 100644 --- a/lessons/en_US/dummy.lesson +++ b/lessons/en_US/dummy.lesson @@ -8,7 +8,8 @@ }, "steps": [ { - "instructions": "Type an <b>x</b>.", + "type": "key", + "instructions": "Type an x.", "text": "x" } ] diff --git a/lessons/en_US/homerow_intro.lesson b/lessons/en_US/homerow_intro.lesson index 008de2c..774a148 100644 --- a/lessons/en_US/homerow_intro.lesson +++ b/lessons/en_US/homerow_intro.lesson @@ -49,7 +49,7 @@ }, { "type": "key", - "instructions": "Excellent! These keys are known as the <i>home row</i>. Your fingers should always return to them after typing each letter.\n\nType all of the letters below. Press down with your fingertips, but do not move your hands.", + "instructions": "Excellent! These keys are known as the home row. Your fingers should always return to them after typing each letter.\n\nType all of the letters below. Press down with your fingertips, but do not move your hands.", "text": "fdsajkl;" }, { @@ -64,12 +64,12 @@ }, { "type": "key", - "instructions": "Okay, you are done with that. Now to begin moving your fingers. Without moving any <i>other</i> fingers, move your left index finger over and press the g key.", + "instructions": "Okay, you are done with that. Now to begin moving your fingers. Without moving any other fingers, move your left index finger over and press the g key.", "text": "g" }, { "type": "key", - "instructions": "Now do the same with your right hand. Move your right index finger <i>only</i> and press the h key.", + "instructions": "Now do the same with your right hand. Move your right index finger only and press the h key.", "text": "h" }, { diff --git a/typingturtle.py b/typingturtle.py index 9c93037..652b416 100755 --- a/typingturtle.py +++ b/typingturtle.py @@ -154,11 +154,12 @@ class LessonScreen(gtk.VBox): #self.lessontext.set_cursor_visible(False) self.lessontext.set_left_margin(20) self.lessontext.set_right_margin(20) - + self.lessontext.set_wrap_mode(gtk.WRAP_WORD) + self.lessonscroll = gtk.ScrolledWindow() self.lessonscroll.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_ALWAYS) self.lessonscroll.add_with_viewport(self.lessontext) - + frame = gtk.Frame() frame.add(self.lessonscroll) @@ -185,11 +186,11 @@ class LessonScreen(gtk.VBox): self.correct_keys = 0 self.incorrect_keys = 0 + self.start_time = None + self.next_step_idx = 0 self.advance_step() - self.start_time = None - def update_stats(self): self.total_time = time.time() - self.start_time if self.total_time >= 1.0: @@ -230,55 +231,72 @@ class LessonScreen(gtk.VBox): return new_lines def advance_step(self): - if self.next_step_idx < len(self.lesson['steps']): - # TODO - Play 'step finished' sound here. - - self.step = self.lesson['steps'][self.next_step_idx] - self.next_step_idx = self.next_step_idx + 1 - + if self.next_step_idx >= len(self.lesson['steps']): + self.finish_lesson() + return + + # TODO - Play 'step finished' sound here. + + self.step = self.lesson['steps'][self.next_step_idx] + self.next_step_idx = self.next_step_idx + 1 + + if self.step['type'] == 'text': # Clear the text buffer and output the instructions. self.lessonbuffer.set_text('') self.lessonbuffer.insert_with_tags_by_name( self.lessonbuffer.get_end_iter(), self.step['instructions'] + '\n\n', 'instructions') - + # Replace newlines with paragraph marks. text = unicode(self.step['text']) - + # Split text into lines. self.lines = text.split('\n') - + # Append paragraph codes. self.lines = [l + PARAGRAPH_CODE for l in self.lines] - + # TODO: Split by line length in addition to by paragraphs. for i in range(0, len(self.lines)): line = self.lines[i] if len(line) > 30: self.lines[i:i+1] = self.wrap_line(line) - + # Fill text buffer with text lines, each followed by room for the user to type. self.line_marks = {} line_idx = 0 for l in self.lines: self.lessonbuffer.insert_with_tags_by_name( self.lessonbuffer.get_end_iter(), l.encode('utf-8') + '\n', 'text') - + self.line_marks[line_idx] = self.lessonbuffer.create_mark(None, self.lessonbuffer.get_end_iter(), True) self.lessonbuffer.insert_at_cursor('\n') - + line_idx += 1 - + self.line_idx = 0 self.begin_line() - - else: - self.finish_lesson() + + elif self.step['type'] == 'key': + # Clear the text buffer and output the instructions. + self.lessonbuffer.set_text('') + self.lessonbuffer.insert_with_tags_by_name( + self.lessonbuffer.get_end_iter(), self.step['instructions'] + '\n\n', 'instructions') + + # Prepare the key. + self.key_expected = unicode(self.step['text'][0]) + + # Hilite the key on the virtual keyboard. + self.keyboard.clear_hilite() + key = self.keyboard.find_key_by_letter(self.key_expected) + if key: + key.set_hilite(True) def begin_line(self): self.line = self.lines[self.line_idx] self.line_mark = self.line_marks[self.line_idx] self.char_idx = 0 + self.hilite_next_key() def key_press_cb(self, widget, event): @@ -297,39 +315,76 @@ class LessonScreen(gtk.VBox): print "key_press_cb: key=%s key_name=%s event.keyval=%d" % (key, key_name, event.keyval) - # Handle backspace by deleting text and optionally moving up lines. - if key_name == 'BackSpace': - # Move to previous line if at the end of the current one. - if self.char_idx == 0 and self.line_idx > 0: - self.line_idx -= 1 - self.begin_line() - - self.char_idx = len(self.line) - - # Then delete the current character. - if self.char_idx > 0: - self.char_idx -= 1 + # Timer starts with first keypress. + if not self.start_time: + self.start_time = time.time() + # Handle backspace by deleting text and optionally moving up lines. + if self.step['type'] == 'text': + if key_name == 'BackSpace': + # Move to previous line if at the end of the current one. + if self.char_idx == 0 and self.line_idx > 0: + self.line_idx -= 1 + self.begin_line() + + self.char_idx = len(self.line) + + # Then delete the current character. + if self.char_idx > 0: + self.char_idx -= 1 + + iter = self.lessonbuffer.get_iter_at_mark(self.line_mark) + iter.forward_chars(self.char_idx) + + iter_end = iter.copy() + iter_end.forward_char() + + self.lessonbuffer.delete(iter, iter_end) + + # Process normal key presses. + elif key != 0: + + # Check to see if they pressed the correct key. + if key == self.line[self.char_idx]: + tag_name = 'correct-copy' + self.correct_keys += 1 + self.total_keys += 1 + + else: + # TODO - Play 'incorrect key' sound here. + + tag_name = 'incorrect-copy' + self.incorrect_keys += 1 + self.total_keys += 1 + + # Insert the key into the bufffer. iter = self.lessonbuffer.get_iter_at_mark(self.line_mark) iter.forward_chars(self.char_idx) - - iter_end = iter.copy() - iter_end.forward_char() - - self.lessonbuffer.delete(iter, iter_end) - - # Process normal key presses. - elif key != 0: - - # Timer starts with first keypress. - if not self.start_time: - self.start_time = time.time() - + + self.lessonbuffer.insert_with_tags_by_name(iter, key, tag_name) + + # Advance to the next character (or else). + self.char_idx += 1 + if self.char_idx >= len(self.line): + self.line_idx += 1 + if self.line_idx >= len(self.lines): + self.advance_step() + else: + self.begin_line() + + self.update_stats() + + self.hilite_next_key() + + elif self.step['type'] == 'key': + # Check to see if they pressed the correct key. - if key == self.line[self.char_idx]: + if key == self.key_expected: tag_name = 'correct-copy' self.correct_keys += 1 self.total_keys += 1 + + self.advance_step() else: # TODO - Play 'incorrect key' sound here. @@ -337,26 +392,9 @@ class LessonScreen(gtk.VBox): tag_name = 'incorrect-copy' self.incorrect_keys += 1 self.total_keys += 1 - - # Insert the key itno the bufffer. - iter = self.lessonbuffer.get_iter_at_mark(self.line_mark) - iter.forward_chars(self.char_idx) - - self.lessonbuffer.insert_with_tags_by_name(iter, key, tag_name) - - # Advance to the next character (or else). - self.char_idx += 1 - if self.char_idx >= len(self.line): - self.line_idx += 1 - if self.line_idx >= len(self.lines): - self.advance_step() - else: - self.begin_line() - + self.update_stats() - - self.hilite_next_key() - + return False def hilite_next_key(self): @@ -376,7 +414,9 @@ class LessonScreen(gtk.VBox): self.lessontext.grab_focus() # Scroll the TextView so the cursor is on screen. - self.lessontext.scroll_to_mark(self.lessonbuffer.get_insert(), 0) + mark = self.lessonbuffer.get_insert() + #self.lessonbuffer.get_iter_at_mark(mark) + self.lessontext.scroll_mark_onscreen(mark) def finish_lesson(self): self.activity.pop_screen() @@ -384,9 +424,9 @@ class LessonScreen(gtk.VBox): self.update_stats() #self.add_text(_('Congratulations! You finished the lesson in %(time)d seconds.\n\n') % # { 'time': int(self.total_time) } ) - + lesson_name = self.lesson['name'] - + # Add to the lesson history. report = { 'lesson': lesson_name, @@ -395,7 +435,7 @@ class LessonScreen(gtk.VBox): 'accuracy': self.accuracy } self.activity.add_history(report) - + # Show the medal screen, if one should be given. got_medal = None for medal_name in ['bronze', 'silver', 'gold']: |