Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorolpc <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)
commit6c2b1ff609c87eb42d036b63953f229a077a17e0 (patch)
tree01d6c1ff08f7f9fb1df40c0f89c15712a6ed8a78
parent0f64fe1984496579ea6cb3dadeafd1c6a346c5fe (diff)
Further lesson improvements.
-rw-r--r--lessons/en_US/dummy.lesson3
-rw-r--r--lessons/en_US/homerow_intro.lesson6
-rwxr-xr-xtypingturtle.py180
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']: