diff options
author | Bruno Coudoin <bcoudoin@src.gnome.org> | 2008-01-07 00:40:22 (GMT) |
---|---|---|
committer | Bruno Coudoin <bcoudoin@src.gnome.org> | 2008-01-07 00:40:22 (GMT) |
commit | 40a3f900368587409c21ed4b83e642b9a4d24913 (patch) | |
tree | 31e91fc70a6df4f98eb4fd5f85a2fd021434b4fa | |
parent | fb6de7e84ad394a0d36686295bcdb0e50bee036f (diff) |
removed writing tutor
svn path=/branches/gcomprixo/; revision=3200
63 files changed, 3 insertions, 3623 deletions
diff --git a/boards/writing_tutor.xml.in b/boards/writing_tutor.xml.in deleted file mode 100644 index 9f9b2d7..0000000 --- a/boards/writing_tutor.xml.in +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<GCompris> - <Board - name="writing_tutor" - type="menu" - section="/experimental" - icon="writing_tutor_tablet.png" - difficulty="0" - author="Jozef Cerven (jcmail80@gmail.com)"> - <_title>TBD</_title> - <_description>TBD</description> - </Board> -</GCompris> diff --git a/configure.in b/configure.in index eafd1ba..8d356a4 100644 --- a/configure.in +++ b/configure.in @@ -647,10 +647,6 @@ src/maze2DRelative-activity/Makefile src/money-activity/Makefile src/money-activity/resources/Makefile src/money-activity/resources/money/Makefile -src/writing_tutor_image_match-activity/Makefile -src/writing_tutor_image_match-activity/resources/Makefile -src/writing_tutor_image_match-activity/resources/writing_tutor/Makefile -src/writing_tutor_image_match-activity/DTW/Makefile src/algebra_plus-activity/Makefile src/crane-activity/Makefile src/crane-activity/resources/Makefile @@ -740,7 +736,6 @@ src/target-activity/resources/target/Makefile src/memory-activity/Makefile src/memory-activity/resources/Makefile src/memory-activity/resources/memory/Makefile -src/writing_tutor_template_match-activity/Makefile src/wordsgame-activity/Makefile src/advanced_colors-activity/Makefile src/advanced_colors-activity/resources/advanced_colors/Makefile @@ -752,7 +747,6 @@ src/tangram-activity/resources/Makefile src/tangram-activity/resources/tangram/Makefile src/gnumch-inequality-activity/Makefile src/maze3D-activity/Makefile -src/writing_tutor_pattern_admin-activity/Makefile src/chess_computer-activity/Makefile src/chess_computer-activity/resources/Makefile src/chess_computer-activity/resources/chess/Makefile @@ -768,7 +762,6 @@ src/railroad-activity/resources/Makefile src/railroad-activity/resources/railroad/Makefile src/memory_sound-activity/Makefile src/memory_add_minus_tux-activity/Makefile -src/writing_tutor_missing_match-activity/Makefile src/gnumch-multiples-activity/Makefile src/babyshapes-activity/Makefile src/babyshapes-activity/resources/babyshapes/Makefile diff --git a/src/bundleit.sh b/src/bundleit.sh index b5eae22..bff4ee8 100755 --- a/src/bundleit.sh +++ b/src/bundleit.sh @@ -17,6 +17,7 @@ fi if test "$1" != "draw-activity" && \ test "$1" != "anim-activity" && \ + test "$1" != "pythontest-activity" && \ test "$1" != "electric-activity" ; then draw="--exclude resources/skins/gartoon/draw" else @@ -24,6 +25,8 @@ else fi if test "$1" = "administration-activity" || \ + test "$1" = "tuxpaint-activity" || \ + test "$1" = "melody-activity" || \ test "$1" = "gcompris-activity" ; then echo "Skipping $1" exit 0 diff --git a/src/writing_tutor_image_match-activity/DTW/Makefile.am b/src/writing_tutor_image_match-activity/DTW/Makefile.am deleted file mode 100644 index bc02a00..0000000 --- a/src/writing_tutor_image_match-activity/DTW/Makefile.am +++ /dev/null @@ -1,8 +0,0 @@ -SUBDIRS= - -pythondir = $(PYTHON_PLUGIN_DIR)/DTW - -dist_python_DATA= \ - __init__.py \ - dtw.py - diff --git a/src/writing_tutor_image_match-activity/DTW/__init__.py b/src/writing_tutor_image_match-activity/DTW/__init__.py deleted file mode 100644 index e69de29..0000000 --- a/src/writing_tutor_image_match-activity/DTW/__init__.py +++ /dev/null diff --git a/src/writing_tutor_image_match-activity/DTW/dtw.py b/src/writing_tutor_image_match-activity/DTW/dtw.py deleted file mode 100644 index 148a0c3..0000000 --- a/src/writing_tutor_image_match-activity/DTW/dtw.py +++ /dev/null @@ -1,170 +0,0 @@ -# gcompris/tutor/DTW/dtw.py - Writing Tutor project -# -# Author: Jozef Cerven, 5mi, (c) 2006/2007 -# FACULTY OF MATHEMATICS, PHYSICS AND INFORMATICS COMENIUS UNIVERSITY BRATISLAVA, Informatics Teaching and Basic of Informatics department -# http://www.edi.fmph.uniba.sk -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# - - -import os -import gtk - -from Numeric import * -import math - - - -# -# implementacia DTW algoritmu - na porovnavanie 2och obrazcov(predloha/reference <-> vzorka/sample) -# - -# BEGIN OF class DTW ************************************ -class DTW: - - def __init__(self, save_path, pattern): - self.save_path = save_path - self.pattern = pattern - - def compute_dtw(self, vzorka_file, predloha_file): - pf = open(predloha_file, "r") - self.plines = pf.readlines() - pf.close() - - vf = open(vzorka_file, "r") - self.vlines = vf.readlines() - vf.close() - - - # matica lokalnych vzdialenosti - - loc_dist = [None] * len(self.plines) - glob_dist = [None] * len(self.plines) - tmp = [None] * len(self.plines) - - print "len(self.plines)=", len(self.plines) - print "predloha_file=", predloha_file - print "len(self.vlines)=", len(self.vlines) - print "vzorka_file", vzorka_file - - # zlozitost je O(n*m) - for i in range(len(self.plines)): - loc_dist[i] = [None] * len(self.vlines) - glob_dist[i] = [None] * len(self.vlines) - tmp[i] = [None] * len(self.vlines) - pline = self.plines[i].split() - - while gtk.events_pending(): gtk.main_iteration() # for animation refresh... - - for j in range(len(self.vlines)): - vline = self.vlines[j].split() - loc_dist[i][j] = math.sqrt((int(float(pline[0]))-int(float(vline[0])))**2 + - (int(float(pline[1]))-int(float(vline[1])))**2 + - (int(float(pline[2]))-int(float(vline[2])))**2) - - - - - # matica globalnych vzdialenosti - - i = 0 - j = 0 - - glob_dist[i][j] = loc_dist[i][j] - tmp[i][j] = [0,0] #? - - # j!=0 - for j in range(len(self.vlines)-1): # 1..n-1 - glob_dist[i][j+1] = loc_dist[i][j+1] + glob_dist[i][j] - tmp[i][j+1] = [i, j] - - - # i!=0 - for i in range(len(self.plines)-1): # 1..n-1 - j = 0 - glob_dist[i+1][j] = loc_dist[i+1][j] + glob_dist[i][j] - tmp[i+1][j] = [i,j] - - for j in range(len(self.vlines)-1): # 1..n-1 - while gtk.events_pending(): gtk.main_iteration() # for animation refresh... - - glob_dist[i+1][j+1] = loc_dist[i+1][j+1] + min(min(glob_dist[i][j+1],glob_dist[i+1][j]),glob_dist[i][j]) - if glob_dist[i][j] <= glob_dist[i][j+1]: - if glob_dist[i][j] <= glob_dist[i+1][j]: - tmp[i+1][j+1] = [i,j] - else: - tmp[i+1][j+1] = [i+1,j] - else: - if glob_dist[i][j+1] <= glob_dist[i+1][j]: - tmp[i+1][j+1] = [i,j+1] - else: - tmp[i+1][j+1] = [i+1,j] - - - - return glob_dist[len(glob_dist)-1][len(glob_dist[0])-1] #? - - - # vypocita dtw pre test_vzorka count-krat, teda count-krat porovna test_vzorka s referencnyni predlohami,a vrati najlepsie (min) cislo - def dtw(self, test_vzorka, count): - self.count = count - self.test_vzorka = test_vzorka - predlohy_dir = self.save_path + "/writing_tutor/predlohy/" + self.pattern + "/" - if not os.path.exists(predlohy_dir): - print "%s DOES NOT EXISTS!", predlohy_dir - else: - arglist = [] - os.path.walk(predlohy_dir,self.walk_callback,arglist) - - return self.dtw_res - - - def walk_callback(self, arg, dirname, fnames ): - _count = 1 - dtw_res = [None] * 10 - if self.count > 10: - self.count = 10 - - #print "dirname: ", dirname - if len(fnames) < 1: - print "dtw.py: walk_callback: len(fnames)<1 !! : ", len(fnames) - - for _filename in fnames: # porovna test s predlohami - if os.path.getsize(dirname+_filename) > 0: - #print "df: ", dirname , _filename - - _dtw_res = self.compute_dtw(self.test_vzorka, dirname + _filename) - #dtw_res[_count-1] = self.compute_dtw(self.test_vzorka, dirname + _filename) - dtw_res[_count-1] = int(_dtw_res / ((len(self.plines) * len(self.vlines)))*100) - - print "_dtw_res=", str(_dtw_res),",plines=",str(len(self.plines)),", vlines=",str(len(self.vlines)) - - - if _count == self.count: # tolko dtw porovnani, kolko je parameter count - break - else: - _count = _count + 1 - - # ak je count > 1, potom vrati minimum z jednotlivych dtw_res - _min = dtw_res[0] - for i in range(self.count): # 0..n-1 - if _min > dtw_res[i]: - _min = dtw_res[i] - print "dtw_res["+str(i)+"]=", dtw_res[i] - self.dtw_res = _min - - -# END OF class DTW ************************************ diff --git a/src/writing_tutor_image_match-activity/Makefile.am b/src/writing_tutor_image_match-activity/Makefile.am deleted file mode 100644 index 8bc3fde..0000000 --- a/src/writing_tutor_image_match-activity/Makefile.am +++ /dev/null @@ -1,35 +0,0 @@ -SUBDIRS = resources DTW - -pythondir = $(PYTHON_PLUGIN_DIR) - -dist_python_DATA= writing_tutor_image_match.py \ - writing_tutor_common.py - - - -xmldir = $(pkgdatadir)/@PACKAGE_DATA_DIR@ - -xml_in_files = \ - writing_tutor_image_match.xml.in - - -xml_DATA = $(xml_in_files:.xml.in=.xml) - -# Do not use the INTLTOOL_XML_RULE, we don't need to embed the translations -# in the file themselves. GCompris pick the translations from the po file at -# runtime. -# -$(xml_DATA): %.xml: %.xml.in - sed -e "s/\(<\{1\}\/*\)_/\1/g" $< > $@ - -# Use this directive and instead of the one above to embed the translations -# in the xml files directly, this is needed for the tool gcompris2spip -#@INTLTOOL_XML_RULE@ - -CLEANFILES = $(xml_DATA) - -icondir = $(pkgdatadir)/@PACKAGE_DATA_DIR@ -icon_DATA = writing_tutor_image_match.png - -EXTRA_DIST = $(icon_DATA) - diff --git a/src/writing_tutor_image_match-activity/gcompris b/src/writing_tutor_image_match-activity/gcompris deleted file mode 120000 index 6a7dc8a..0000000 --- a/src/writing_tutor_image_match-activity/gcompris +++ /dev/null @@ -1 +0,0 @@ -../boards/python/gcompris
\ No newline at end of file diff --git a/src/writing_tutor_image_match-activity/init_path.sh b/src/writing_tutor_image_match-activity/init_path.sh deleted file mode 100755 index 8dae034..0000000 --- a/src/writing_tutor_image_match-activity/init_path.sh +++ /dev/null @@ -1,8 +0,0 @@ -# Set the different path for this activity -# This is sourced by runit.sh -path=$1 -activity=writing_tutor_image_match -plugindir=$path/../boards/.libs -pythonplugindir=$path -resourcedir=$path/resources -section="/experimental/writing_tutor" diff --git a/src/writing_tutor_image_match-activity/resources/Makefile.am b/src/writing_tutor_image_match-activity/resources/Makefile.am deleted file mode 100644 index 51b90d6..0000000 --- a/src/writing_tutor_image_match-activity/resources/Makefile.am +++ /dev/null @@ -1 +0,0 @@ -SUBDIRS = writing_tutor diff --git a/src/writing_tutor_image_match-activity/resources/skins b/src/writing_tutor_image_match-activity/resources/skins deleted file mode 120000 index 070dcd2..0000000 --- a/src/writing_tutor_image_match-activity/resources/skins +++ /dev/null @@ -1 +0,0 @@ -../../../boards/skins/
\ No newline at end of file diff --git a/src/writing_tutor_image_match-activity/resources/writing_tutor/Makefile.am b/src/writing_tutor_image_match-activity/resources/writing_tutor/Makefile.am deleted file mode 100644 index 2dd44e0..0000000 --- a/src/writing_tutor_image_match-activity/resources/writing_tutor/Makefile.am +++ /dev/null @@ -1,13 +0,0 @@ -imgdir = $(pkgdatadir)/@PACKAGE_DATA_DIR@/writing_tutor -img_DATA = \ - drop.png \ - notepad.png \ - pattern_admin_bg.png \ - tablet_active.png \ - tablet_inactive.png \ - wood_oak.png \ - wood_pine.png \ - anim_pen.txt \ - anim_pen.gif - -EXTRA_DIST = $(img_DATA) diff --git a/src/writing_tutor_image_match-activity/resources/writing_tutor/anim_pen.gif b/src/writing_tutor_image_match-activity/resources/writing_tutor/anim_pen.gif Binary files differdeleted file mode 100644 index 8596c77..0000000 --- a/src/writing_tutor_image_match-activity/resources/writing_tutor/anim_pen.gif +++ /dev/null diff --git a/src/writing_tutor_image_match-activity/resources/writing_tutor/anim_pen.txt b/src/writing_tutor_image_match-activity/resources/writing_tutor/anim_pen.txt deleted file mode 100644 index 2328afc..0000000 --- a/src/writing_tutor_image_match-activity/resources/writing_tutor/anim_pen.txt +++ /dev/null @@ -1 +0,0 @@ -writing_tutor/anim_pen.gif diff --git a/src/writing_tutor_image_match-activity/resources/writing_tutor/drop.png b/src/writing_tutor_image_match-activity/resources/writing_tutor/drop.png Binary files differdeleted file mode 100644 index c29a2dd..0000000 --- a/src/writing_tutor_image_match-activity/resources/writing_tutor/drop.png +++ /dev/null diff --git a/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/@kruh.png b/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/@kruh.png Binary files differdeleted file mode 100644 index c34ad44..0000000 --- a/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/@kruh.png +++ /dev/null diff --git a/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/@obdlznik.png b/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/@obdlznik.png Binary files differdeleted file mode 100644 index eccdf28..0000000 --- a/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/@obdlznik.png +++ /dev/null diff --git a/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/@stvorec.png b/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/@stvorec.png Binary files differdeleted file mode 100644 index 7b7ce17..0000000 --- a/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/@stvorec.png +++ /dev/null diff --git a/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/@trojuholnik.png b/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/@trojuholnik.png Binary files differdeleted file mode 100644 index bfd40ad..0000000 --- a/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/@trojuholnik.png +++ /dev/null diff --git a/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/a.png b/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/a.png Binary files differdeleted file mode 100644 index d6098f1..0000000 --- a/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/a.png +++ /dev/null diff --git a/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/b.png b/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/b.png Binary files differdeleted file mode 100644 index c4ea259..0000000 --- a/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/b.png +++ /dev/null diff --git a/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/c.png b/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/c.png Binary files differdeleted file mode 100644 index 158ff5e..0000000 --- a/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/c.png +++ /dev/null diff --git a/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/d.png b/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/d.png Binary files differdeleted file mode 100644 index 5f5debd..0000000 --- a/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/d.png +++ /dev/null diff --git a/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/g.png b/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/g.png Binary files differdeleted file mode 100644 index a4d3831..0000000 --- a/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/g.png +++ /dev/null diff --git a/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/h.png b/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/h.png Binary files differdeleted file mode 100644 index 10afda8..0000000 --- a/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/h.png +++ /dev/null diff --git a/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/j.png b/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/j.png Binary files differdeleted file mode 100644 index 6e5122a..0000000 --- a/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/j.png +++ /dev/null diff --git a/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/l.png b/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/l.png Binary files differdeleted file mode 100644 index c1a6df2..0000000 --- a/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/l.png +++ /dev/null diff --git a/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/m.png b/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/m.png Binary files differdeleted file mode 100644 index 42b59ef..0000000 --- a/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/m.png +++ /dev/null diff --git a/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/r.png b/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/r.png Binary files differdeleted file mode 100644 index 402bf83..0000000 --- a/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/r.png +++ /dev/null diff --git a/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/s.png b/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/s.png Binary files differdeleted file mode 100644 index aa0bd32..0000000 --- a/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/s.png +++ /dev/null diff --git a/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/t.png b/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/t.png Binary files differdeleted file mode 100644 index 3b9bcd2..0000000 --- a/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/t.png +++ /dev/null diff --git a/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/z.png b/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/z.png Binary files differdeleted file mode 100644 index 71524f2..0000000 --- a/src/writing_tutor_image_match-activity/resources/writing_tutor/image_match/z.png +++ /dev/null diff --git a/src/writing_tutor_image_match-activity/resources/writing_tutor/notepad.png b/src/writing_tutor_image_match-activity/resources/writing_tutor/notepad.png Binary files differdeleted file mode 100644 index f06a9e6..0000000 --- a/src/writing_tutor_image_match-activity/resources/writing_tutor/notepad.png +++ /dev/null diff --git a/src/writing_tutor_image_match-activity/resources/writing_tutor/pattern_admin_bg.png b/src/writing_tutor_image_match-activity/resources/writing_tutor/pattern_admin_bg.png Binary files differdeleted file mode 100644 index 424fbdd..0000000 --- a/src/writing_tutor_image_match-activity/resources/writing_tutor/pattern_admin_bg.png +++ /dev/null diff --git a/src/writing_tutor_image_match-activity/resources/writing_tutor/tablet_active.png b/src/writing_tutor_image_match-activity/resources/writing_tutor/tablet_active.png Binary files differdeleted file mode 100644 index 3c668bf..0000000 --- a/src/writing_tutor_image_match-activity/resources/writing_tutor/tablet_active.png +++ /dev/null diff --git a/src/writing_tutor_image_match-activity/resources/writing_tutor/tablet_inactive.png b/src/writing_tutor_image_match-activity/resources/writing_tutor/tablet_inactive.png Binary files differdeleted file mode 100644 index b6333a5..0000000 --- a/src/writing_tutor_image_match-activity/resources/writing_tutor/tablet_inactive.png +++ /dev/null diff --git a/src/writing_tutor_image_match-activity/resources/writing_tutor/wood_oak.png b/src/writing_tutor_image_match-activity/resources/writing_tutor/wood_oak.png Binary files differdeleted file mode 100644 index 0dd6c14..0000000 --- a/src/writing_tutor_image_match-activity/resources/writing_tutor/wood_oak.png +++ /dev/null diff --git a/src/writing_tutor_image_match-activity/resources/writing_tutor/wood_pine.png b/src/writing_tutor_image_match-activity/resources/writing_tutor/wood_pine.png Binary files differdeleted file mode 100644 index e08826a..0000000 --- a/src/writing_tutor_image_match-activity/resources/writing_tutor/wood_pine.png +++ /dev/null diff --git a/src/writing_tutor_image_match-activity/writing_tutor_common.py b/src/writing_tutor_image_match-activity/writing_tutor_common.py deleted file mode 100644 index 4e210ef..0000000 --- a/src/writing_tutor_image_match-activity/writing_tutor_common.py +++ /dev/null @@ -1,165 +0,0 @@ -# gcompris/tutor/common.py - Writing Tutor project -# -# Author: Jozef Cerven, 5mi, (c) 2006/2007 -# FACULTY OF MATHEMATICS, PHYSICS AND INFORMATICS COMENIUS UNIVERSITY BRATISLAVA, Informatics Teaching and Basic of Informatics department -# http://www.edi.fmph.uniba.sk -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# - -import gnomecanvas -import gcompris -import gcompris.utils -import gcompris.bonus -import gcompris.skin -import gcompris.anim -import gcompris.sound -import gcompris.admin -import gcompris.score -import gtk -import gtk.gdk -import random -import pango -import time -import os -import socket -import fcntl -import struct -import re -import glob -import string -import time - - - - -# BEGIN OF class GtkInputDialog ************************************ -class GtkInputDialog: - - inputd = None - - def __init__(self, Gcompris_template_match_instance): - - self.gd_instance = Gcompris_template_match_instance - - self.inputd = gtk.InputDialog() - self.inputd.move((gcompris.BOARD_WIDTH)/2, (gcompris.BOARD_HEIGHT)/2) # ! - self.inputd.connect("enable-device", self.clb_enable_device) - self.inputd.connect("disable-device", self.clb_disable_device) - self.inputd.connect("response", self.clb_close_dialog, None) - self.inputd.run() - - def clb_close_dialog(self, inputdialog, deviceid, x=None): - self.inputd.hide() - - - def clb_enable_device(self, inputdialog, deviceid, x=None): - print "clb_enable_device", deviceid.name - - if (deviceid.source == gtk.gdk.SOURCE_PEN) and (deviceid.mode == gtk.gdk.MODE_SCREEN or deviceid.mode == gtk.gdk.MODE_WINDOW): - self.gd_instance.set_tablet_indicator(1) - - self.clb_close_dialog(inputdialog, deviceid) - - def clb_disable_device(self, inputdialog, deviceid, x=None): - print "clb_disable_device", deviceid.name - - if (deviceid.source == gtk.gdk.SOURCE_PEN): - self.gd_instance.set_tablet_indicator(0) - - self.clb_close_dialog(inputdialog, deviceid) - -# END OF class GtkInputDialog ************************************ - - - -def draw_guiding_lines(_pixmap, _area, _pattern, _right, _color='SlateGrey'): - """ - Description: - Paint guiding lines according to type of shape (lower, upper, digit, script,...) - - Arguments: - _pixmap -- gtk.gdk.Pixmap - _area -- gtk.DrawingArea - _pattern -- pattern to be written - _color -- foreground color of lines, color string specified in the X11 rgb.txt - """ - - left = 60 - right = _right - top = 60 - bottom = 450 - - colormap = _area.get_colormap() - _color_ = colormap.alloc_color(_color) - - gc_solid = _pixmap.new_gc() - gc_solid.copy(_area.get_style().black_gc) - gc_solid.set_foreground(_color_) - gc_solid.set_line_attributes(2, gtk.gdk.LINE_SOLID, gtk.gdk.CAP_BUTT, gtk.gdk.JOIN_MITER) - - gc_dash = _pixmap.new_gc() - gc_dash.copy(gc_solid) - gc_dash.set_foreground(_color_) - gc_dash.set_line_attributes(1, gtk.gdk.LINE_ON_OFF_DASH, gtk.gdk.CAP_BUTT, gtk.gdk.JOIN_MITER) - - _pixmap.draw_line(gc_dash, left, top, right, top) # top line - _pixmap.draw_line(gc_dash, left, bottom, right, bottom) # bottom line - - - if _pattern[0] == '_': # tlacene pismena..(in english?) - _pixmap.draw_line(gc_solid, left, top+40, right, top+40) # top1 line - if _pattern[1] in ['a','b','c','d','e','f','h','i','k','l','m','n','o','r','s','t','u','v','z']: - _pixmap.draw_line(gc_dash, left, 200, right, 200) - _pixmap.draw_line(gc_solid, left, bottom-40, right, bottom-40) - elif _pattern[1] in ['g','p']: - _pixmap.draw_line(gc_dash, left, 320, right, 320) - _pixmap.draw_line(gc_solid, left, bottom-40, right, bottom-40) - elif _pattern[1] in ['j']: - _pixmap.draw_line(gc_dash, left, 210, right, 210) - _pixmap.draw_line(gc_solid, left, bottom-50, right, bottom-50) - elif _pattern[1] in ['A','B','E','F','G','H','J','K','P','R',]: - _pixmap.draw_line(gc_dash, left, 260, right, 260) - _pixmap.draw_line(gc_solid, left, bottom-40, right, bottom-40) - elif _pattern[1] in ['C','D','I','L','M','N','O','S','T','U','V','Z']: - _pixmap.draw_line(gc_dash, left, 200, right, 200) - _pixmap.draw_line(gc_solid, left, bottom-40, right, bottom-40) - - - elif _pattern[0] == '@': # geometric shapes - pass - - else: # pisane pismena male aj velke, a cislice 0-9 - _pixmap.draw_line(gc_solid, left, top+40, right, top+40) # top1 line - if _pattern[0] not in ['f','g','G','j','J','p']: - _pixmap.draw_line(gc_dash, left, 240, right, 240) - _pixmap.draw_line(gc_solid, left, bottom-40, right, bottom-40) - else: - _pixmap.draw_line(gc_dash, left, 210, right, 210) - _pixmap.draw_line(gc_solid, left, bottom-110, right, bottom-110) - - - - - -def get_ip_address(ifname): - try: - s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - return socket.inet_ntoa(fcntl.ioctl(s.fileno(), 0x8915, struct.pack('256s', ifname[:15]))[20:24]) - except: - return "127.0.0.1" - - - diff --git a/src/writing_tutor_image_match-activity/writing_tutor_image_match.png b/src/writing_tutor_image_match-activity/writing_tutor_image_match.png Binary files differdeleted file mode 100644 index 5d5b44d..0000000 --- a/src/writing_tutor_image_match-activity/writing_tutor_image_match.png +++ /dev/null diff --git a/src/writing_tutor_image_match-activity/writing_tutor_image_match.py b/src/writing_tutor_image_match-activity/writing_tutor_image_match.py deleted file mode 100644 index 14c53d0..0000000 --- a/src/writing_tutor_image_match-activity/writing_tutor_image_match.py +++ /dev/null @@ -1,750 +0,0 @@ -# gcompris/tutor/image_match.py - Writing Tutor project -# -# Author: Jozef Cerven, 5mi, (c) 2006/2007 -# FACULTY OF MATHEMATICS, PHYSICS AND INFORMATICS COMENIUS UNIVERSITY BRATISLAVA, Informatics Teaching and Basic of Informatics department -# http://www.edi.fmph.uniba.sk -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# - - -import gnomecanvas -import gcompris -import gcompris.utils -import gcompris.bonus -import gcompris.skin -import gcompris.anim -import gcompris.sound -import gcompris.admin -import gcompris.score -import gtk -import gtk.gdk -import random -import pango -import time -import os -import socket -import fcntl -import struct -import re -import glob -import string -import time - - -#import gobject -from gettext import gettext as _ - -from writing_tutor_common import * - -import DTW.dtw - - -_global_rootitem = None # for config dialog -_global_tablet_indicator= None - - - - - -# BEGIN OF class Gcompris_image_match ************************************ -class Gcompris_writing_tutor_image_match: - - _ap = None - ap = None - _sb = None - sb = None - - rootitem = None - board_paused = 0 - - save_path = None - sequence = None - pattern = None - pattern_image = None - show_template = 100*[None] # if show_template[0]==1: show_template in level 1 - - area = None - notepad_area = None - label = None - won_level = 0 - - dat_filename = None - pixmap = None # drawing area pixmap - filename = None - file_handle = None - writing_status = None - last_written_point_index = None - motions_count = None - points = [None] * 2000 - cas_start = None - button_pixbuf = None - - def __init__(self, gcomprisBoard): - self.gcomprisBoard = gcomprisBoard - - _notepad_width = 485 - _notepad_height = 485 - - #self.notepad_area = ((gcompris.BOARD_WIDTH/2 - _notepad_width/2), 20, _notepad_width, _notepad_height) # centered - self.notepad_area = (280, 10, _notepad_width, _notepad_height) - - - - def start(self): - global _global_rootitem - - self.window = self.gcomprisBoard.canvas.get_toplevel() - - self.config_dict = self.init_config() - self.config_dict.update(gcompris.get_board_conf()) - - self.save_path = self.config_dict['save_path'] - self.sequence = self.config_dict['image_match_sequence'] - - self.parse_sequence() - - self.gcomprisBoard.level=1 - self.gcomprisBoard.maxlevel=len(self.sequence) - self.gcomprisBoard.sublevel=1 - self.gcomprisBoard.number_of_sublevel = len(self.sequence[self.gcomprisBoard.level-1]) - - - _pixmap = gcompris.utils.load_pixmap(gcompris.skin.image_to_skin("button_reload.png")) - if(_pixmap): - gcompris.bar_set_repeat_icon(_pixmap) - gcompris.bar_set(gcompris.BAR_LEVEL|gcompris.BAR_OK|gcompris.BAR_REPEAT_ICON|gcompris.BAR_CONFIG) - else: - gcompris.bar_set(gcompris.BAR_LEVEL|gcompris.BAR_OK|gcompris.BAR_REPEAT|gcompris.BAR_CONFIG) - - - #gcompris.set_background(self.rootitem, gcompris.skin.image_to_skin("gcompris-bg.jpg")) - gcompris.set_background(self.rootitem, "writing_tutor/wood_pine.png") - - - # Create our rootitem. We put each canvas item in it so at the end we - # only have to kill it. The canvas deletes all the items it contains automaticaly. - self.rootitem = self.gcomprisBoard.canvas.root().add(gnomecanvas.CanvasGroup, x=0.0, y=0.0) - _global_rootitem = self.rootitem - - - # show tablet indicator icon - - _t_active = 0 - _devices = gtk.gdk.devices_list() - for _d in _devices: - if _d.source == gtk.gdk.SOURCE_PEN: - _t_active = 1 - if _d.mode == gtk.gdk.MODE_DISABLED: # if tablet is disabled - _d.set_mode(gtk.gdk.MODE_SCREEN) # enable it (first in sequence) - break - else: # already enabled.. - break - - if _t_active == 1: - self.set_tablet_indicator(1) - else: - self.set_tablet_indicator(0) - - - self.set_level(1) - - - - - def recreate_drawing_area(self): - - # BEGIN OF drawing_area ************************************ - - if self.area != None: - self.area.destroy() - - self.area = gtk.DrawingArea() - - # Signals used to handle backing pixmap - self.area.connect("expose_event", self.expose_event) - self.area.connect("configure_event", self.configure_event) - - # Event signals - self.area.connect("motion_notify_event", self.motion_notify_event) - #area.connect("button_press_event", self.button_press_event) - - self.area.set_events(gtk.gdk.EXPOSURE_MASK | gtk.gdk.LEAVE_NOTIFY_MASK | gtk.gdk.BUTTON_PRESS_MASK - | gtk.gdk.POINTER_MOTION_MASK | gtk.gdk.PROXIMITY_IN | gtk.gdk.PROXIMITY_OUT_MASK) - - # The following call enables tracking and processing of extension - # events for the drawing area - #self.area.set_extension_events(gtk.gdk.EXTENSION_EVENTS_CURSOR) - self.area.set_extension_events(gtk.gdk.EXTENSION_EVENTS_ALL) - - self.rootitem.add(gnomecanvas.CanvasWidget, widget=self.area, x=self.notepad_area[0], y=self.notepad_area[1], - width=self.notepad_area[2], height=self.notepad_area[3]) - - self.area.show() - # END OF drawing_area ************************************ - - #print "recreate_drawing_area()" - - - - def start_2(self, recreate="yes"): - - self.pattern = self.sequence[self.gcomprisBoard.level-1][self.gcomprisBoard.sublevel-1] - gcompris.score.set(self.gcomprisBoard.sublevel) - self.draw_image(30, 150, self.pattern) - self.won_level = 0 - - if recreate == "yes": - self.recreate_drawing_area() - - if self.show_template[self.gcomprisBoard.level-1] == 1: # level with "show_template" - predlohy_dir = self.save_path + "/writing_tutor/predlohy/" + self.pattern + "/" - if not os.path.exists(predlohy_dir): - print "%s DOES NOT EXISTS!", predlohy_dir - else: - arglist = [] - os.path.walk(predlohy_dir,self.walk_callback,arglist) - - ip = get_ip_address('eth0') # eth0 - datum = time.strftime('%d.%m.%Y_%X').replace('/','.') - filename1 = self.save_path + "/writing_tutor/predloha_test/" + self.pattern - self.filename = filename1 + "/" + ip + "__" + datum + ".dat" - # musi existovat cesta => adresare! - if not os.path.exists(filename1): - os.makedirs(filename1) - - self.file_handle = open(self.filename,"w") - - self.show_pen_animation(1) - - - - - def walk_callback(self, arg, dirname, fnames ): - global area - - # print "dirname: ", dirname - if len(fnames) < 1: - print "walk_callback: len(fnames)<1 !! : ", len(fnames) - - for _filename in fnames: - if os.path.getsize(dirname+_filename) > 0: - # print "df: ", dirname , _filename - _filehandle = open(dirname + _filename, "r") - for line in _filehandle: - l = line.split() - #print "x=",l[0]," y=",l[1], " pressure=", l[2] - self.draw_brush(self.area, float(l[0]), float(l[1]), float(l[2]),'predloha') - time.sleep(0.010) - _filehandle.close() - break # berieme len prvu predlohu v adresari - - - - # BEGIN OF drawing_area HANDLERS ************************************ - # Create a new backing pixmap of the appropriate size - def configure_event(self, widget, event): - x, y, width, height = widget.get_allocation() - self.pixmap = gtk.gdk.Pixmap(widget.window, width, height) - #self.pixmap.draw_rectangle(widget.get_style().white_gc, True, 0, 0, width, height) - - #pixbuf = gcompris.utils.load_pixmap("boardicons/notepad.png") - tmp = self.gcomprisBoard.filename.split("/") - _file = tmp[len(tmp)-1] - tmp.remove(_file) - _board_dir = "/".join(tmp) - - pixbuf = gtk.gdk.pixbuf_new_from_file(_board_dir + "/writing_tutor/wood_pine.png") # transparent png - self.pixmap.draw_pixbuf(widget.get_style().fg_gc[gtk.STATE_NORMAL], pixbuf, 0, 0, 0, 0, width, height) - pixbuf = gtk.gdk.pixbuf_new_from_file(_board_dir + "/writing_tutor/notepad.png") # transparent png - self.pixmap.draw_pixbuf(widget.get_style().fg_gc[gtk.STATE_NORMAL], pixbuf, 0, 0, 0, 0, width, height) - - draw_guiding_lines(self.pixmap, self.area, self.pattern, 450) - - return True - - - # Redraw the screen from the backing pixmap - def expose_event(self, widget, event): - x , y, width, height = event.area - widget.window.draw_drawable(widget.get_style().fg_gc[gtk.STATE_NORMAL], self.pixmap, x, y, x, y, width, height) - return False - - - def draw_brush(self, widget, x, y, pressure, _type='vzorka'): - - colormap = self.area.get_colormap() - if _type == 'predloha': - color = colormap.alloc_color(86*256, 153*256, 215*256) # slabo modra - rect = (int(x-4*pressure), int(y-4*pressure), int(8*pressure), int(8*pressure)) - else: - color = colormap.alloc_color(97*256, 105*256, 141*256) # tmavo seda - rect = (int(x-5*pressure), int(y-5*pressure), int(10*pressure), int(10*pressure)) - - - gc = self.area.get_style().fg_gc[gtk.STATE_NORMAL] - gc.foreground = color - - self.pixmap.draw_rectangle(widget.get_style().fg_gc[gtk.STATE_NORMAL], True, rect[0], rect[1], rect[2], rect[3]) - widget.window.draw_drawable(widget.get_style().fg_gc[gtk.STATE_NORMAL], self.pixmap, rect[0], rect[1], rect[0], rect[1], rect[2], rect[3]) - - while gtk.events_pending(): gtk.main_iteration() # refreshing widget - - # nastavim naspat ciernu - color = colormap.alloc_color(0,0,0) # slabo modra - gc = self.area.get_style().fg_gc[gtk.STATE_NORMAL] - gc.foreground = color - - - - def motion_notify_event(self, widget, event): - #if not self.can_write: #!! - # return True - # is_hint => mys - if event.is_hint: - x, y, state = event.window.get_pointer() - pressure = 0.0 - x_tilt = 0.0 - y_tilt = 0.0 - else: # pero tabletu - state = event.state - x = event.get_axis(gtk.gdk.AXIS_X) - y = event.get_axis(gtk.gdk.AXIS_Y) - pressure = event.get_axis(gtk.gdk.AXIS_PRESSURE) - x_tilt = event.get_axis(gtk.gdk.AXIS_XTILT) # musi to podporovat tablet,napr "Wacom Intuos" - if x_tilt == None: - x_tilt = 0.0 - y_tilt = event.get_axis(gtk.gdk.AXIS_YTILT) - if y_tilt == None: - y_tilt = 0.0 - - #wheel = event.get_axis(gtk.gdk.AXIS_WHEEL) #? - #print "x=",x," y=",y," pressure=",pressure, " x_tilt=", x_tilt," y_tilt=",y_tilt - - - if (not (x >= 10 and x <= 485 and y >= 10 and y<= 485)): #if not in drawing_area_rect: - if self.writing_status == 1: - self.writing_status = None - return True - - - if state & gtk.gdk.BUTTON1_MASK and self.pixmap != None: - - if event.is_hint: - pressure = 1.0 - if pressure == None: - pressure = 1.0 - - if self.writing_status == None and pressure > 0.0: - self.show_pen_animation(0) - self.writing_status = 1 # zacal som pisat pismeno/zaznamenavat udaje - self.motions_count = 1 - self.cas_start = time.time() # pri zaciatku pisania pismena sa poznaci cas - - - - if pressure > 0.0: - self.draw_brush(widget, x, y, pressure) - self.last_written_point_index = self.motions_count - - if self.writing_status == 1: - #points[motions_count] = str(int(x)) + " " + str(int(y)) + " " + str(int(pressure)) + "\n" - self.points[self.motions_count] = str(float(x)) + " " + str(float(y)) + " " + str(pressure) + " " + str(x_tilt) + " " + str(y_tilt) + " " + str((time.time()-self.cas_start)*1000.0) + "\n" - #print "points[",motions_count,"]=", points[motions_count] - self.motions_count = self.motions_count + 1 - - return True - - - - # END OF drawing_area HANDLERS ************************************ - - - - #def onBoard(self, x, y): - # return x >= 0 and x < self.width and y >= 0 and y < self.height - - - - def draw_image(self, x, y, _pattern): - _pixmap = gcompris.utils.load_pixmap("writing_tutor/image_match/" + self.pattern + ".png") - - if self.pattern_image != None: - self.pattern_image.destroy() - - self.pattern_image = self.rootitem.add(gnomecanvas.CanvasPixbuf, pixbuf = _pixmap, x = 20, y = 150) - self.pattern_image.show() - - - - def end(self): - #gcompris.sound.reopen() - - if self.rootitem != None: - self.rootitem.destroy() - self.rootitem = None - gcompris.score.end() - pass - - - def get_datfiles_list(self, _pattern): - - dat_list = glob.glob(self.save_path + "/writing_tutor/predlohy/" + _pattern + "/*.dat") - res_dat_list = [] - for _file in dat_list: - if os.stat(_file).st_size > 0: - res_dat_list.append(_file) # v zozname necha len neprazdne subory - - return res_dat_list - - - def _remove_empty_list_item(self, _list): - if '' in _list: - _list.remove('') - - return _list - - - def parse_sequence(self): - """ parse sequence string into levels and sublevels """ - # sequence: - # a|b|@kruh$ - $ :level separator - # x|@tvar - - _sequence = re.sub(r'\s', '', self.sequence) # remove white spaces - _sequence = _sequence.split("$") # divide into levels (this activity has 2 levels) - _sequence = self._remove_empty_list_item(_sequence) # remove empty level string if extsts - self.sequence = [] - - - tmp = self.gcomprisBoard.filename.split("/") - _file = tmp[len(tmp)-1] - tmp.remove(_file) - _board_dir = "/".join(tmp) - - _level = 0 - for _s in _sequence: # for each level (should be max 2) - _s_tmp = _s - _dat_list = self._remove_empty_list_item(_s_tmp.split("|")) - _non_empty_dat_list = _dat_list[:] - for s in _dat_list: # for each pattern in level - if s != '*': - img_path = _board_dir + "/writing_tutor/image_match/" + s + ".png" - if (len(self.get_datfiles_list(s)) < 1) or (not os.path.exists(img_path)): # iba ak existuju .dat subor predlohy a obrazok - _non_empty_dat_list.remove(s) - - if _non_empty_dat_list.count('*') > 0: - _non_empty_dat_list.remove('*') - self.show_template[_level] = 1 - else: - self.show_template[_level] = 0 - - _level += 1 - - if len(_non_empty_dat_list) > 0: - self.sequence.append(_non_empty_dat_list) - - - - - - # Called by gcompris when the user click on the level icon - def set_level(self, level): - #print "set_level: level=",level - - if self.gcomprisBoard.sublevel-1 == self.gcomprisBoard.number_of_sublevel and self.gcomprisBoard.level == self.gcomprisBoard.maxlevel: - gcompris.bonus.board_finished(gcompris.bonus.FINISHED_RANDOM) - self.won_level = 1 - return - - self.gcomprisBoard.level=level - self.gcomprisBoard.sublevel=1 - self.gcomprisBoard.number_of_sublevel = len(self.sequence[self.gcomprisBoard.level-1]) - gcompris.bar_set_level(self.gcomprisBoard) # nastavi kocku na cislo levelu - - gcompris.score.start(gcompris.score.STYLE_NOTE, 10, 50, len(self.sequence[self.gcomprisBoard.level-1])) - - self.start_2("yes") - - - - def increment_level(self): - self.gcomprisBoard.sublevel += 1 - if self.gcomprisBoard.sublevel > self.gcomprisBoard.number_of_sublevel: - self.set_level(self.gcomprisBoard.level % self.gcomprisBoard.maxlevel + 1) - else: - self.start_2("yes") - - - # stlacenie "ruky" - def ok(self): - - self.writing_status = None - - # zapise do suboru vsetky body od prveho prilozenia pera, az po posledny napisany bod.. - - if self.last_written_point_index != None: # if something was written... - for i in range(self.last_written_point_index): - self.file_handle.write(self.points[i+1]) - - self.file_handle.close() - - self.show_sablier_animation(1) - - _dtw = DTW.dtw.DTW(self.save_path, self.pattern) - dtw_res = _dtw.dtw(self.filename, 1) - print "ok: dtw_res=", str(dtw_res) - - self.show_sablier_animation(0) - - if self.pattern[0] == '@': - limit = 13 - else: - limit = 9 - - if self.show_template[self.gcomprisBoard.level-1] == 1: - limit = 5 - - if dtw_res < limit: - gcompris.bonus.display(gcompris.bonus.WIN, gcompris.bonus.RANDOM) - self.won_level = 1 - else: - gcompris.bonus.display(gcompris.bonus.LOOSE, gcompris.bonus.RANDOM) - self.won_level = 1 - - else: # none was written - gcompris.bonus.display(gcompris.bonus.LOOSE, gcompris.bonus.RANDOM) - self.won_level = 1 - - - self.last_written_point_index = None - - - - - - - def key_press(self, keyval, commit_str, preedit_str): - return False - - def repeat(self): - print "repeat" - self.start_2("yes") - - - - def pause(self, pause): # called after config dialog, help, bonus - print "pause" - - self.board_paused = pause - - if(pause): - self.area.hide() - self.show_pen_animation(0) - if self.label != None: - self.label.hide() - else: - self.area.show() - if self.won_level: - # if we are paused, then unpaused it means that they beat the sublevel - self.increment_level() - else: - self.set_level(self.gcomprisBoard.level) - - ## There is a problem with GTK widgets, they are not covered by the help, We hide/show them here - #if(pause): - # self.area.hide() - #else: - # self.area.show() - # self.repeat() - - - return - - - - def config(self): - print "Config" - pass - - def config_stop(self): - print "config_stop", self - pass - - - - - def show_pen_animation(self, show): - if show == 0: - if self.ap != None: - self.ap.gnomecanvas.hide() - else: - if self.ap == None: - self._ap = gcompris.anim.Animation("writing_tutor/anim_pen.txt") - self.ap = gcompris.anim.CanvasItem(self._ap, self.rootitem) - self.ap.gnomecanvas.set(x=80, y=gcompris.BOARD_HEIGHT - 70) - self.ap.setState(0) - self.ap.gnomecanvas.show() - else: - self.ap.gnomecanvas.show() - - - def show_sablier_animation(self, show): - if show == 0: - if self.sb != None: - self.sb.gnomecanvas.hide() - else: - if self.sb == None: - self._sb = gcompris.anim.Animation("connect4/sablier.txt") - self.sb = gcompris.anim.CanvasItem(self._sb, self.rootitem) - self.sb.gnomecanvas.set(x=40, y= gcompris.BOARD_HEIGHT - 230) - self.sb.setState(0) - self.sb.gnomecanvas.show() - else: - self.sb.gnomecanvas.show() - - - - - - def set_tablet_indicator(self, tablet_status): - """ - Description: - Set tablet indicator icon - - Arguments: - tablet_status -- 1 or 0 indicating status of tablet device (enabled or disabled) - """ - global _global_rootitem - global _global_tablet_indicator - - #print "set_tablet_indicator(", tablet_status, ")" - - if tablet_status == 1: - _pixmap = gcompris.utils.load_pixmap("writing_tutor/tablet_active.png") - else: - _pixmap = gcompris.utils.load_pixmap("writing_tutor/tablet_inactive.png") - - if _global_tablet_indicator != None: - _global_tablet_indicator.destroy() - - _global_tablet_indicator = _global_rootitem.add(gnomecanvas.CanvasPixbuf, pixbuf = _pixmap, x = 10, y = gcompris.BOARD_HEIGHT -50) - _global_tablet_indicator.show() - - - - def config_start(self, profile): - print "config_start" - global _global_rootitem - - - # show only tablet configuration. save_path, sequence only in admin mode - if _global_rootitem != None: # not in admin mode - dlg = GtkInputDialog(self) - return - - self.configure_profile = profile - - self.config_dict = self.init_config() - self.config_dict.update(gcompris.get_conf(profile, self.gcomprisBoard)) - - self.main_vbox = gcompris.configuration_window (\ - _('Hra <b>%s</b> - nastavenie pre profil <b>%s</b>') % ('Tutor', profile.name), self.save_config) - - gcompris.separator() - self.button = gtk.Button("Nastavenie tabletu...") - self.button.connect("clicked", self.input_dlg_callback) - self.button.show() - self.main_vbox.pack_start(self.button, False, False, 0) - gcompris.separator() - - # !! ak je v admin mode, tak nemoze nastavovat tablet... - if _global_rootitem == None: # in admin mode - self.button.set_state(gtk.STATE_INSENSITIVE) - - - gcompris.textview(_('Adresar, kde sa budu ukladat vzorky/predlohy: '), 'save_path', 'desc', self.config_dict['save_path'], - self.validate_callback) - gcompris.separator() - - gcompris.textview(_('Postupnosti tvarov pre testovanie: '), 'image_match_sequence', 'desc', self.config_dict['image_match_sequence'], self.validate_callback) - gcompris.separator() - - - def validate_callback(self, key, value, z): - #print "validate_callback: key=", key, ", value=", value, ", z=", z - - if key == 'save_path': - if not os.path.exists(value): - return False - if key == 'sequence': - pass - - return True - - - def input_dlg_callback(self, table): - dlg = GtkInputDialog() - - - def dummy_enter_callback(self, widget, _entry): - pass - - def clb_dummy(self, x=None): - pass - - def save_config(self, table): - print "save_config: table=", table - global _global_rootitem - - if table == None: - return - - for key,value in table.iteritems(): - gcompris.set_board_conf(self.configure_profile, self.gcomprisBoard, key, value) # save config to db - - if _global_rootitem != None: - self.start_2("no") - - - def configuration(self, value, init): - if self.config_dict.has_key(value): - return eval(self.config_dict[value]) - else: - return init - - - def init_config(self): - default_config_dict = { 'save_path' : gcompris.get_properties().user_dir , - 'image_match_sequence' : 'a|b|g $ @kruh|@stvorec' - } - return default_config_dict - - # sequence format: - - #a|b|c|d $ 1. level - #@kruh $ 2. level - - - -# END OF class Gcompris_image_match ************************************ - - - - -def stop_board(): - gcompris.bonus.board_finished(gcompris.bonus.FINISHED_RANDOM) - - diff --git a/src/writing_tutor_image_match-activity/writing_tutor_image_match.xml.in b/src/writing_tutor_image_match-activity/writing_tutor_image_match.xml.in deleted file mode 100644 index 95e0250..0000000 --- a/src/writing_tutor_image_match-activity/writing_tutor_image_match.xml.in +++ /dev/null @@ -1,18 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<GCompris> - <Board - name="writing_tutor_image_match" - type="python:writing_tutor_image_match" - section="/experimental/writing_tutor" - icon="writing_tutor_image_match.png" - difficulty="1" - mode="normal" - author="Jozef Cerven (jcmail80@gmail.com)" - boarddir="tutor"> - <title>TBD</title> - <description>TBD</description> - <prerequisite>TBD</prerequisite> - <goal></goal> - <manual></manual> - </Board> -</GCompris> diff --git a/src/writing_tutor_missing_match-activity/Makefile.am b/src/writing_tutor_missing_match-activity/Makefile.am deleted file mode 100644 index 69f62fe..0000000 --- a/src/writing_tutor_missing_match-activity/Makefile.am +++ /dev/null @@ -1,34 +0,0 @@ -SUBDIRS = - -pythondir = $(PYTHON_PLUGIN_DIR) - -dist_python_DATA= writing_tutor_missing_match.py - - - -xmldir = $(pkgdatadir)/@PACKAGE_DATA_DIR@ - -xml_in_files = \ - writing_tutor_missing_match.xml.in - - -xml_DATA = $(xml_in_files:.xml.in=.xml) - -# Do not use the INTLTOOL_XML_RULE, we don't need to embed the translations -# in the file themselves. GCompris pick the translations from the po file at -# runtime. -# -$(xml_DATA): %.xml: %.xml.in - sed -e "s/\(<\{1\}\/*\)_/\1/g" $< > $@ - -# Use this directive and instead of the one above to embed the translations -# in the xml files directly, this is needed for the tool gcompris2spip -#@INTLTOOL_XML_RULE@ - -CLEANFILES = $(xml_DATA) - -icondir = $(pkgdatadir)/@PACKAGE_DATA_DIR@ -icon_DATA = writing_tutor_missing_match.png - -EXTRA_DIST = $(icon_DATA) - diff --git a/src/writing_tutor_missing_match-activity/gcompris b/src/writing_tutor_missing_match-activity/gcompris deleted file mode 120000 index 6a7dc8a..0000000 --- a/src/writing_tutor_missing_match-activity/gcompris +++ /dev/null @@ -1 +0,0 @@ -../boards/python/gcompris
\ No newline at end of file diff --git a/src/writing_tutor_missing_match-activity/init_path.sh b/src/writing_tutor_missing_match-activity/init_path.sh deleted file mode 100755 index 70bb435..0000000 --- a/src/writing_tutor_missing_match-activity/init_path.sh +++ /dev/null @@ -1,8 +0,0 @@ -# Set the different path for this activity -# This is sourced by runit.sh -path=$1 -activity=writing_tutor_missing_match -plugindir=$path/../boards/.libs -pythonplugindir=$path -resourcedir=$path/resources -section="/experimental/writing_tutor" diff --git a/src/writing_tutor_missing_match-activity/resources/skins b/src/writing_tutor_missing_match-activity/resources/skins deleted file mode 120000 index 070dcd2..0000000 --- a/src/writing_tutor_missing_match-activity/resources/skins +++ /dev/null @@ -1 +0,0 @@ -../../../boards/skins/
\ No newline at end of file diff --git a/src/writing_tutor_missing_match-activity/writing_tutor_missing_match.png b/src/writing_tutor_missing_match-activity/writing_tutor_missing_match.png Binary files differdeleted file mode 100644 index ac4a4fd..0000000 --- a/src/writing_tutor_missing_match-activity/writing_tutor_missing_match.png +++ /dev/null diff --git a/src/writing_tutor_missing_match-activity/writing_tutor_missing_match.py b/src/writing_tutor_missing_match-activity/writing_tutor_missing_match.py deleted file mode 100644 index 3b002b9..0000000 --- a/src/writing_tutor_missing_match-activity/writing_tutor_missing_match.py +++ /dev/null @@ -1,735 +0,0 @@ -# gcompris/tutor/missing_match.py - Writing Tutor project -# -# Author: Jozef Cerven, 5mi, (c) 2006/2007 -# FACULTY OF MATHEMATICS, PHYSICS AND INFORMATICS COMENIUS UNIVERSITY BRATISLAVA, Informatics Teaching and Basic of Informatics department -# http://www.edi.fmph.uniba.sk -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# - - - -import gnomecanvas -import gcompris -import gcompris.utils -import gcompris.bonus -import gcompris.skin -import gcompris.anim -import gcompris.sound -import gcompris.admin -import gcompris.score -import gtk -import gtk.gdk -import random -import pango -import time -import os -import socket -import fcntl -import struct -import re -import glob -import string -import time - - -#import gobject -from gettext import gettext as _ - -from writing_tutor_common import * - -import DTW.dtw - - -_global_rootitem = None # for config dialog -_global_tablet_indicator= None - - - - - -# BEGIN OF class Gcompris_missing_match ************************************ -class Gcompris_writing_tutor_missing_match: - - _ap = None - ap = None - _sb = None - sb = None - - rootitem = None - board_paused = 0 - - save_path = None - sequence = None - pattern = None # eg 'a' - word = None # eg: c_r - show_template = 100*[None] # if show_template[0]==1: show_template in level 1 - - area = None - notepad_area = None - label = None - won_level = 0 - - dat_filename = None - pixmap = None # drawing area pixmap - filename = None - file_handle = None - writing_status = None - last_written_point_index = None - motions_count = None - points = [None] * 2000 - cas_start = None - button_pixbuf = None - - def __init__(self, gcomprisBoard): - self.gcomprisBoard = gcomprisBoard - - _notepad_width = 485 - _notepad_height = 485 - - #self.notepad_area = ((gcompris.BOARD_WIDTH/2 - _notepad_width/2), 20, _notepad_width, _notepad_height) # centered - self.notepad_area = (280, 10, _notepad_width, _notepad_height) - - - - def start(self): - global _global_rootitem - - self.window = self.gcomprisBoard.canvas.get_toplevel() - - self.config_dict = self.init_config() - self.config_dict.update(gcompris.get_board_conf()) - - self.save_path = self.config_dict['save_path'] - self.sequence = self.config_dict['missing_match_sequence'] - - self.parse_sequence() - - self.gcomprisBoard.level=1 - self.gcomprisBoard.maxlevel=len(self.sequence) - self.gcomprisBoard.sublevel=1 - self.gcomprisBoard.number_of_sublevel = len(self.sequence[self.gcomprisBoard.level-1]) - - - _pixmap = gcompris.utils.load_pixmap(gcompris.skin.image_to_skin("button_reload.png")) - if(_pixmap): - gcompris.bar_set_repeat_icon(_pixmap) - gcompris.bar_set(gcompris.BAR_LEVEL|gcompris.BAR_OK|gcompris.BAR_REPEAT_ICON|gcompris.BAR_CONFIG) - else: - gcompris.bar_set(gcompris.BAR_LEVEL|gcompris.BAR_OK|gcompris.BAR_REPEAT|gcompris.BAR_CONFIG) - - - #gcompris.set_background(self.rootitem, gcompris.skin.image_to_skin("gcompris-bg.jpg")) - gcompris.set_background(self.rootitem, "writing_tutor/wood_pine.png") - - - # Create our rootitem. We put each canvas item in it so at the end we - # only have to kill it. The canvas deletes all the items it contains automaticaly. - self.rootitem = self.gcomprisBoard.canvas.root().add(gnomecanvas.CanvasGroup, x=0.0, y=0.0) - _global_rootitem = self.rootitem - - - # show tablet indicator icon - - _t_active = 0 - _devices = gtk.gdk.devices_list() - for _d in _devices: - if _d.source == gtk.gdk.SOURCE_PEN: - _t_active = 1 - if _d.mode == gtk.gdk.MODE_DISABLED: # if tablet is disabled - _d.set_mode(gtk.gdk.MODE_SCREEN) # enable it (first in sequence) - break - else: # already enabled.. - break - - if _t_active == 1: - self.set_tablet_indicator(1) - else: - self.set_tablet_indicator(0) - - - self.set_level(1) - - - - - def recreate_drawing_area(self): - - # BEGIN OF drawing_area ************************************ - - if self.area != None: - self.area.destroy() - - self.area = gtk.DrawingArea() - - # Signals used to handle backing pixmap - self.area.connect("expose_event", self.expose_event) - self.area.connect("configure_event", self.configure_event) - - # Event signals - self.area.connect("motion_notify_event", self.motion_notify_event) - #area.connect("button_press_event", self.button_press_event) - - self.area.set_events(gtk.gdk.EXPOSURE_MASK | gtk.gdk.LEAVE_NOTIFY_MASK | gtk.gdk.BUTTON_PRESS_MASK - | gtk.gdk.POINTER_MOTION_MASK | gtk.gdk.PROXIMITY_IN | gtk.gdk.PROXIMITY_OUT_MASK) - - # The following call enables tracking and processing of extension - # events for the drawing area - #self.area.set_extension_events(gtk.gdk.EXTENSION_EVENTS_CURSOR) - self.area.set_extension_events(gtk.gdk.EXTENSION_EVENTS_ALL) - - self.rootitem.add(gnomecanvas.CanvasWidget, widget=self.area, x=self.notepad_area[0], y=self.notepad_area[1], - width=self.notepad_area[2], height=self.notepad_area[3]) - - self.area.show() - # END OF drawing_area ************************************ - - #print "recreate_drawing_area()" - - - - def start_2(self, recreate="yes"): - - self.word = self.sequence[self.gcomprisBoard.level-1][self.gcomprisBoard.sublevel-1].split('&')[0] - self.pattern = self.sequence[self.gcomprisBoard.level-1][self.gcomprisBoard.sublevel-1].split('&')[1] - gcompris.score.set(self.gcomprisBoard.sublevel) - self.won_level = 0 - - if recreate == "yes": - self.recreate_drawing_area() - - self.draw_text(140, 150, self.word) - - if self.show_template[self.gcomprisBoard.level-1] == 1: # level with "show_template" - predlohy_dir = self.save_path + "/writing_tutor/predlohy/" + self.pattern + "/" - if not os.path.exists(predlohy_dir): - print "%s DOES NOT EXISTS!", predlohy_dir - else: - arglist = [] - os.path.walk(predlohy_dir,self.walk_callback,arglist) - - ip = get_ip_address('eth0') # eth0 - datum = time.strftime('%d.%m.%Y_%X').replace('/','.') - filename1 = self.save_path + "/writing_tutor/predloha_test/" + self.pattern - self.filename = filename1 + "/" + ip + "__" + datum + ".dat" - # musi existovat cesta => adresare! - if not os.path.exists(filename1): - os.makedirs(filename1) - - self.file_handle = open(self.filename,"w") - - self.show_pen_animation(1) - - - - - def walk_callback(self, arg, dirname, fnames ): - global area - - # print "dirname: ", dirname - if len(fnames) < 1: - print "walk_callback: len(fnames)<1 !! : ", len(fnames) - - for _filename in fnames: - if os.path.getsize(dirname+_filename) > 0: - # print "df: ", dirname , _filename - _filehandle = open(dirname + _filename, "r") - for line in _filehandle: - l = line.split() - #print "x=",l[0]," y=",l[1], " pressure=", l[2] - self.draw_brush(self.area, float(l[0]), float(l[1]), float(l[2]),'predloha') - time.sleep(0.010) - _filehandle.close() - break # berieme len prvu predlohu v adresari - - - - # BEGIN OF drawing_area HANDLERS ************************************ - # Create a new backing pixmap of the appropriate size - def configure_event(self, widget, event): - x, y, width, height = widget.get_allocation() - self.pixmap = gtk.gdk.Pixmap(widget.window, width, height) - #self.pixmap.draw_rectangle(widget.get_style().white_gc, True, 0, 0, width, height) - - #pixbuf = gcompris.utils.load_pixmap("boardicons/notepad.png") - tmp = self.gcomprisBoard.filename.split("/") - _file = tmp[len(tmp)-1] - tmp.remove(_file) - _board_dir = "/".join(tmp) - - pixbuf = gtk.gdk.pixbuf_new_from_file(_board_dir + "/writing_tutor/wood_pine.png") # transparent png - self.pixmap.draw_pixbuf(widget.get_style().fg_gc[gtk.STATE_NORMAL], pixbuf, 0, 0, 0, 0, width, height) - pixbuf = gtk.gdk.pixbuf_new_from_file(_board_dir + "/writing_tutor/notepad.png") # transparent png - self.pixmap.draw_pixbuf(widget.get_style().fg_gc[gtk.STATE_NORMAL], pixbuf, 0, 0, 0, 0, width, height) - - draw_guiding_lines(self.pixmap, self.area, self.pattern, 450) - - return True - - - # Redraw the screen from the backing pixmap - def expose_event(self, widget, event): - x , y, width, height = event.area - widget.window.draw_drawable(widget.get_style().fg_gc[gtk.STATE_NORMAL], self.pixmap, x, y, x, y, width, height) - return False - - - def draw_brush(self, widget, x, y, pressure, _type='vzorka'): - - colormap = self.area.get_colormap() - if _type == 'predloha': - color = colormap.alloc_color(86*256, 153*256, 215*256) # slabo modra - rect = (int(x-4*pressure), int(y-4*pressure), int(8*pressure), int(8*pressure)) - else: - color = colormap.alloc_color(97*256, 105*256, 141*256) # tmavo seda - rect = (int(x-5*pressure), int(y-5*pressure), int(10*pressure), int(10*pressure)) - - - gc = self.area.get_style().fg_gc[gtk.STATE_NORMAL] - gc.foreground = color - - self.pixmap.draw_rectangle(widget.get_style().fg_gc[gtk.STATE_NORMAL], True, rect[0], rect[1], rect[2], rect[3]) - widget.window.draw_drawable(widget.get_style().fg_gc[gtk.STATE_NORMAL], self.pixmap, rect[0], rect[1], rect[0], rect[1], rect[2], rect[3]) - - while gtk.events_pending(): gtk.main_iteration() # refreshing widget - - # nastavim naspat ciernu - color = colormap.alloc_color(0,0,0) # slabo modra - gc = self.area.get_style().fg_gc[gtk.STATE_NORMAL] - gc.foreground = color - - - - def motion_notify_event(self, widget, event): - #if not self.can_write: #!! - # return True - # is_hint => mys - if event.is_hint: - x, y, state = event.window.get_pointer() - pressure = 0.0 - x_tilt = 0.0 - y_tilt = 0.0 - else: # pero tabletu - state = event.state - x = event.get_axis(gtk.gdk.AXIS_X) - y = event.get_axis(gtk.gdk.AXIS_Y) - pressure = event.get_axis(gtk.gdk.AXIS_PRESSURE) - x_tilt = event.get_axis(gtk.gdk.AXIS_XTILT) # musi to podporovat tablet,napr "Wacom Intuos" - if x_tilt == None: - x_tilt = 0.0 - y_tilt = event.get_axis(gtk.gdk.AXIS_YTILT) - if y_tilt == None: - y_tilt = 0.0 - - #wheel = event.get_axis(gtk.gdk.AXIS_WHEEL) #? - #print "x=",x," y=",y," pressure=",pressure, " x_tilt=", x_tilt," y_tilt=",y_tilt - - - if (not (x >= 10 and x <= 485 and y >= 10 and y<= 485)): #if not in drawing_area_rect: - if self.writing_status == 1: - self.writing_status = None - return True - - - if state & gtk.gdk.BUTTON1_MASK and self.pixmap != None: - - if event.is_hint: - pressure = 1.0 - if pressure == None: - pressure = 1.0 - - if self.writing_status == None and pressure > 0.0: - self.show_pen_animation(0) - self.writing_status = 1 # zacal som pisat pismeno/zaznamenavat udaje - self.motions_count = 1 - self.cas_start = time.time() # pri zaciatku pisania pismena sa poznaci cas - - - - if pressure > 0.0: - self.draw_brush(widget, x, y, pressure) - self.last_written_point_index = self.motions_count - - if self.writing_status == 1: - #points[motions_count] = str(int(x)) + " " + str(int(y)) + " " + str(int(pressure)) + "\n" - self.points[self.motions_count] = str(float(x)) + " " + str(float(y)) + " " + str(pressure) + " " + str(x_tilt) + " " + str(y_tilt) + " " + str((time.time()-self.cas_start)*1000.0) + "\n" - #print "points[",motions_count,"]=", points[motions_count] - self.motions_count = self.motions_count + 1 - - return True - - - - # END OF drawing_area HANDLERS ************************************ - - - - def end(self): - #gcompris.sound.reopen() - - if self.rootitem != None: - self.rootitem.destroy() - self.rootitem = None - gcompris.score.end() - pass - - - def get_datfiles_list(self, _pattern): - - dat_list = glob.glob(self.save_path + "/writing_tutor/predlohy/" + _pattern + "/*.dat") - res_dat_list = [] - for _file in dat_list: - if os.stat(_file).st_size > 0: - res_dat_list.append(_file) # v zozname necha len neprazdne subory - - return res_dat_list - - - def _remove_empty_list_item(self, _list): - if '' in _list: - _list.remove('') - - return _list - - - def parse_sequence(self): - """ parse sequence string into levels and sublevels """ - - # sequence format: - #a_to&a|p_ro&e|okn_&o$ | - item separator, $ - level separator, &a - "a" is missing - - _sequence = re.sub(r'\s', '', self.sequence) # remove white spaces - _sequence = _sequence.split("$") # divide into levels (this activity has 2 levels) - _sequence = self._remove_empty_list_item(_sequence) # remove empty level string if extsts - self.sequence = [] - - - _level = 0 - for _s in _sequence: # for each level (should be max 2) - _s_tmp = _s - _dat_list = self._remove_empty_list_item(_s_tmp.split("|")) - _non_empty_dat_list = _dat_list[:] - for s in _dat_list: # for each pattern in level - if s != '*': - _missing_pattern = s.split('&')[1] - if len(self.get_datfiles_list(_missing_pattern)) < 1: # iba ak existuju .dat subor predlohy - _non_empty_dat_list.remove(s) - - if _non_empty_dat_list.count('*') > 0: - _non_empty_dat_list.remove('*') - self.show_template[_level] = 1 - else: - self.show_template[_level] = 0 - - _level += 1 - - if len(_non_empty_dat_list) > 0: - self.sequence.append(_non_empty_dat_list) - - - - # Called by gcompris when the user click on the level icon - def set_level(self, level): - #print "set_level: level=",level - - if self.gcomprisBoard.sublevel-1 == self.gcomprisBoard.number_of_sublevel and self.gcomprisBoard.level == self.gcomprisBoard.maxlevel: - gcompris.bonus.board_finished(gcompris.bonus.FINISHED_RANDOM) - self.won_level = 1 - return - - self.gcomprisBoard.level=level - self.gcomprisBoard.sublevel=1 - self.gcomprisBoard.number_of_sublevel = len(self.sequence[self.gcomprisBoard.level-1]) - gcompris.bar_set_level(self.gcomprisBoard) # nastavi kocku na cislo levelu - - gcompris.score.start(gcompris.score.STYLE_NOTE, 10, 50, len(self.sequence[self.gcomprisBoard.level-1])) - - self.start_2("yes") - - - - def increment_level(self): - self.gcomprisBoard.sublevel += 1 - if self.gcomprisBoard.sublevel > self.gcomprisBoard.number_of_sublevel: - self.set_level(self.gcomprisBoard.level % self.gcomprisBoard.maxlevel + 1) - else: - self.start_2("yes") - - - # stlacenie "ruky" - def ok(self): - - self.writing_status = None - - # zapise do suboru vsetky body od prveho prilozenia pera, az po posledny napisany bod.. - - if self.last_written_point_index != None: # if something was written... - for i in range(self.last_written_point_index): - self.file_handle.write(self.points[i+1]) - - self.file_handle.close() - - self.show_sablier_animation(1) - - _dtw = DTW.dtw.DTW(self.save_path, self.pattern) - dtw_res = _dtw.dtw(self.filename, 1) - print "ok: dtw_res=", str(dtw_res) - - self.show_sablier_animation(0) - - if self.show_template[self.gcomprisBoard.level-1] == 1: - limit = 5 - else: - limit = 9 - - if dtw_res < limit: - gcompris.bonus.display(gcompris.bonus.WIN, gcompris.bonus.RANDOM) - self.won_level = 1 - else: - gcompris.bonus.display(gcompris.bonus.LOOSE, gcompris.bonus.RANDOM) - self.won_level = 1 - - else: # none was written - gcompris.bonus.display(gcompris.bonus.LOOSE, gcompris.bonus.RANDOM) - self.won_level = 1 - - - self.last_written_point_index = None - - - - - - - def key_press(self, keyval, commit_str, preedit_str): - return False - - def repeat(self): - #print "repeat" - self.start_2("yes") - - - - def pause(self, pause): # called after config dialog, help, bonus - #print "pause" - - self.board_paused = pause - - if(pause): - self.area.hide() - self.show_pen_animation(0) - if self.label != None: - self.label.hide() - else: - self.area.show() - if self.won_level: - # if we are paused, then unpaused it means that they beat the sublevel - self.increment_level() - else: - self.set_level(self.gcomprisBoard.level) - - ## There is a problem with GTK widgets, they are not covered by the help, We hide/show them here - #if(pause): - # self.area.hide() - #else: - # self.area.show() - # self.repeat() - - - return - - - - def config(self): - print "Config" - pass - - def config_stop(self): - print "config_stop", self - pass - - - - - def show_pen_animation(self, show): - if show == 0: - if self.ap != None: - self.ap.gnomecanvas.hide() - else: - if self.ap == None: - self._ap = gcompris.anim.Animation("writing_tutor/anim_pen.txt") - self.ap = gcompris.anim.CanvasItem(self._ap, self.rootitem) - self.ap.gnomecanvas.set(x=80, y=gcompris.BOARD_HEIGHT - 70) - self.ap.setState(0) - self.ap.gnomecanvas.show() - else: - self.ap.gnomecanvas.show() - - - def show_sablier_animation(self, show): - if show == 0: - if self.sb != None: - self.sb.gnomecanvas.hide() - else: - if self.sb == None: - self._sb = gcompris.anim.Animation("connect4/sablier.txt") - self.sb = gcompris.anim.CanvasItem(self._sb, self.rootitem) - self.sb.gnomecanvas.set(x=40, y= gcompris.BOARD_HEIGHT - 300) - self.sb.setState(0) - self.sb.gnomecanvas.show() - else: - self.sb.gnomecanvas.show() - - - def draw_text(self, x, y, text, color='blue'): - if self.label != None: - self.label.destroy() - - self.label = self.rootitem.add(gnomecanvas.CanvasText, x=x, y=y, text=text, fill_color="dark blue", font='sans bold 45', ) - - #self.label = self.rootitem.add(gnomecanvas.CanvasText, x= x, y= y, text= text, fill_color="black", - # font=gcompris.skin.get_font("gcompris/board/huge bold"), ) - - - def set_tablet_indicator(self, tablet_status): - """ - Description: - Set tablet indicator icon - - Arguments: - tablet_status -- 1 or 0 indicating status of tablet device (enabled or disabled) - """ - global _global_rootitem - global _global_tablet_indicator - - #print "set_tablet_indicator(", tablet_status, ")" - - if tablet_status == 1: - _pixmap = gcompris.utils.load_pixmap("writing_tutor/tablet_active.png") - else: - _pixmap = gcompris.utils.load_pixmap("writing_tutor/tablet_inactive.png") - - if _global_tablet_indicator != None: - _global_tablet_indicator.destroy() - - _global_tablet_indicator = _global_rootitem.add(gnomecanvas.CanvasPixbuf, pixbuf = _pixmap, x = 10, y = gcompris.BOARD_HEIGHT -50) - _global_tablet_indicator.show() - - - - def config_start(self, profile): - print "config_start" - global _global_rootitem - - - # show only tablet configuration. save_path, sequence only in admin mode - if _global_rootitem != None: # not in admin mode - dlg = GtkInputDialog(self) - return - - self.configure_profile = profile - - self.config_dict = self.init_config() - self.config_dict.update(gcompris.get_conf(profile, self.gcomprisBoard)) - - self.main_vbox = gcompris.configuration_window (\ - _('Hra <b>%s</b> - nastavenie pre profil <b>%s</b>') % ('Tutor', profile.name), self.save_config) - - gcompris.separator() - self.button = gtk.Button("Nastavenie tabletu...") - self.button.connect("clicked", self.input_dlg_callback) - self.button.show() - self.main_vbox.pack_start(self.button, False, False, 0) - gcompris.separator() - - # !! ak je v admin mode, tak nemoze nastavovat tablet... - if _global_rootitem == None: # in admin mode - self.button.set_state(gtk.STATE_INSENSITIVE) - - - gcompris.textview(_('Adresar, kde sa budu ukladat vzorky/predlohy: '), 'save_path', 'desc', self.config_dict['save_path'], - self.validate_callback) - gcompris.separator() - - gcompris.textview(_('Postupnosti tvarov pre testovanie: '), 'missing_match_sequence', 'desc', self.config_dict['missing_match_sequence'], self.validate_callback) - gcompris.separator() - - - def validate_callback(self, key, value, z): - #print "validate_callback: key=", key, ", value=", value, ", z=", z - - if key == 'save_path': - if not os.path.exists(value): - return False - if key == 'sequence': - pass - - return True - - - def input_dlg_callback(self, table): - dlg = GtkInputDialog() - - - def dummy_enter_callback(self, widget, _entry): - pass - - def clb_dummy(self, x=None): - pass - - def save_config(self, table): - print "save_config: table=", table - global _global_rootitem - - if table == None: - return - - for key,value in table.iteritems(): - gcompris.set_board_conf(self.configure_profile, self.gcomprisBoard, key, value) # save config to db - - if _global_rootitem != None: - self.start_2("no") - - - def configuration(self, value, init): - if self.config_dict.has_key(value): - return eval(self.config_dict[value]) - else: - return init - - - def init_config(self): - default_config_dict = { 'save_path' : gcompris.get_properties().user_dir, - 'missing_match_sequence' : 'a_to&u|p_ro&e|okn_&o|gum_&a|_ambus&b$1+1=_&2|8-2=_&6|7-5=_&2' - } - return default_config_dict - - # sequence format: - - #a_to&a|p_ro&u|okn_&o$ 1. level - #a_to&a|p_ro&u|okn_&o$ 2. level.. - - - - -# END OF class Gcompris_missing_match ************************************ - - - - -def stop_board(): - gcompris.bonus.board_finished(gcompris.bonus.FINISHED_RANDOM) - - diff --git a/src/writing_tutor_missing_match-activity/writing_tutor_missing_match.xml.in b/src/writing_tutor_missing_match-activity/writing_tutor_missing_match.xml.in deleted file mode 100644 index 50a3466..0000000 --- a/src/writing_tutor_missing_match-activity/writing_tutor_missing_match.xml.in +++ /dev/null @@ -1,20 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<GCompris> - <Board - name="writing_tutor_missing_match" - type="python:writing_tutor_missing_match" - section="/experimental/writing_tutor" - icon="writing_tutor_missing_match.png" - difficulty="1" - mode="normal" - author="Jozef Cerven (jcmail80@gmail.com)" - boarddir="tutor"> - <title>Dopĺňanie chýbajúceho písmena</title> - <description>Úlohou je uhádnuť chýbajúce -písmenko,a správne ho napísať</description> - <prerequisite>2. trieda na ZŠ</prerequisite> - <goal>Uhádnuť a správne napísať chýbajúce písmeno/tvar.</goal> - <manual>V ľavej časti sa zobrazí slovo, v ktorom chýba niektoré písmenko, ktoré treba uhádnuť, a potom ho správne napísať. Keď ho už máme napísané, stlačíme ruku v spodnom paneli. - </manual> - </Board> -</GCompris> diff --git a/src/writing_tutor_pattern_admin-activity/Makefile.am b/src/writing_tutor_pattern_admin-activity/Makefile.am deleted file mode 100644 index a686f23..0000000 --- a/src/writing_tutor_pattern_admin-activity/Makefile.am +++ /dev/null @@ -1,34 +0,0 @@ -SUBDIRS = - -pythondir = $(PYTHON_PLUGIN_DIR) - -dist_python_DATA= writing_tutor_pattern_admin.py - - - -xmldir = $(pkgdatadir)/@PACKAGE_DATA_DIR@ - -xml_in_files = \ - writing_tutor_pattern_admin.xml.in - - -xml_DATA = $(xml_in_files:.xml.in=.xml) - -# Do not use the INTLTOOL_XML_RULE, we don't need to embed the translations -# in the file themselves. GCompris pick the translations from the po file at -# runtime. -# -$(xml_DATA): %.xml: %.xml.in - sed -e "s/\(<\{1\}\/*\)_/\1/g" $< > $@ - -# Use this directive and instead of the one above to embed the translations -# in the xml files directly, this is needed for the tool gcompris2spip -#@INTLTOOL_XML_RULE@ - -CLEANFILES = $(xml_DATA) - -icondir = $(pkgdatadir)/@PACKAGE_DATA_DIR@ -icon_DATA = writing_tutor_pattern_admin.png - -EXTRA_DIST = $(icon_DATA) - diff --git a/src/writing_tutor_pattern_admin-activity/gcompris b/src/writing_tutor_pattern_admin-activity/gcompris deleted file mode 120000 index 6a7dc8a..0000000 --- a/src/writing_tutor_pattern_admin-activity/gcompris +++ /dev/null @@ -1 +0,0 @@ -../boards/python/gcompris
\ No newline at end of file diff --git a/src/writing_tutor_pattern_admin-activity/init_path.sh b/src/writing_tutor_pattern_admin-activity/init_path.sh deleted file mode 100755 index ae074a9..0000000 --- a/src/writing_tutor_pattern_admin-activity/init_path.sh +++ /dev/null @@ -1,8 +0,0 @@ -# Set the different path for this activity -# This is sourced by runit.sh -path=$1 -activity=writing_tutor_pattern_admin -plugindir=$path/../boards/.libs -pythonplugindir=$path -resourcedir=$path/resources -section="/experimental/writing_tutor" diff --git a/src/writing_tutor_pattern_admin-activity/resources/skins b/src/writing_tutor_pattern_admin-activity/resources/skins deleted file mode 120000 index 070dcd2..0000000 --- a/src/writing_tutor_pattern_admin-activity/resources/skins +++ /dev/null @@ -1 +0,0 @@ -../../../boards/skins/
\ No newline at end of file diff --git a/src/writing_tutor_pattern_admin-activity/writing_tutor_pattern_admin.png b/src/writing_tutor_pattern_admin-activity/writing_tutor_pattern_admin.png Binary files differdeleted file mode 100644 index 60c00f4..0000000 --- a/src/writing_tutor_pattern_admin-activity/writing_tutor_pattern_admin.png +++ /dev/null diff --git a/src/writing_tutor_pattern_admin-activity/writing_tutor_pattern_admin.py b/src/writing_tutor_pattern_admin-activity/writing_tutor_pattern_admin.py deleted file mode 100644 index 51b54ed..0000000 --- a/src/writing_tutor_pattern_admin-activity/writing_tutor_pattern_admin.py +++ /dev/null @@ -1,774 +0,0 @@ -# gcompris/tutor/pattern_admin.py - -# -# Author: Jozef Cerven, 5mi, (c) 2006/2007 -# FACULTY OF MATHEMATICS, PHYSICS AND INFORMATICS COMENIUS UNIVERSITY BRATISLAVA, Informatics Teaching and Basic of Informatics department -# http://www.edi.fmph.uniba.sk -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# - - - -import gnomecanvas -import gcompris -import gcompris.utils -import gcompris.bonus -import gcompris.skin -import gcompris.anim -import gcompris.sound -import gcompris.admin -import gtk -import gtk.gdk -import random -import pango -import time -import os -import socket -import fcntl -import struct -import re -import glob -import string - - -from gettext import gettext as _ - -from writing_tutor_common import * - -_global_rootitem = None # for config dialog -_global_tablet_indicator= None - - - -# BEGIN OF class Gcompris_pattern_admin ************************** -class Gcompris_writing_tutor_pattern_admin: - - _ap = None - ap = None - - rootitem = None - board_paused = False - last_selected_pattern = None - last_selected_writing_type = None - pattern = None - writing_type = "vzorky" - save_path = None - sequence = None - cursor_index = 0 - patterns_count = 0 - area = None - can_write = False - tree_already_clicked = False - drop_button = None - dat_filename = None - pixmap = None # drawing area pixmap - filename = None - file_handle = None - writing_status = None - last_written_point_index = None - motions_count = None - points = [None] * 2000 - cas_start = None - - - def __init__(self, gcomprisBoard): - # this constructor is called for every refresh of gcompris board, eg. help window, config window.. -> global variables may be needed for - # persistence.. - - self.gcomprisBoard = gcomprisBoard - - gap = 10 - panel_x = 130 - self.select_area = (gap , gap, panel_x + gap , gcompris.BOARD_HEIGHT-gap-100) - self.panel_area = (panel_x + 3*gap , 0, gcompris.BOARD_WIDTH-gap, gcompris.BOARD_HEIGHT-gap) - - - - def __del__(self): - pass - - - def start(self): - global _global_rootitem - - self.window = self.gcomprisBoard.canvas.get_toplevel() - - #get default values - self.config_dict = self.init_config() - - #replace configured values (..ak su v db..) - self.config_dict.update(gcompris.get_board_conf()) - - self.save_path = self.config_dict['save_path'] - self.sequence = self.config_dict['sequence'] - - #print "start: save_path=",self.save_path, ", sequence=", self.sequence - - self.gcomprisBoard.level=1 - self.gcomprisBoard.maxlevel=1 - self.gcomprisBoard.sublevel=1 - self.gcomprisBoard.number_of_sublevel=1 - - # Create our rootitem. We put each canvas item in it so at the end we - # only have to kill it. The canvas deletes all the items it contains automaticaly. - self.rootitem = self.gcomprisBoard.canvas.root().add(gnomecanvas.CanvasGroup, x=0.0, y=0.0) - _global_rootitem = self.rootitem - - - gcompris.bar_set( gcompris.BAR_LEVEL|gcompris.BAR_OK|gcompris.BAR_CONFIG ) - #gcompris.bar_hide(1) - - gcompris.set_background(self.rootitem, gcompris.skin.image_to_skin("gcompris-bg.jpg")) - - - # graphics controls... - - self.left_win = gtk.ScrolledWindow() - self.left_win.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) - self.left_win.set_shadow_type(gtk.SHADOW_ETCHED_OUT) - - self.model = gtk.ListStore(str, str) - self.treeview = gtk.TreeView(self.model) - self.treeview.connect('cursor-changed', self.clb_tree_cursor_changed) - self.treeview.add_events(gtk.gdk.BUTTON_PRESS_MASK) - self.treeview.connect('button_press_event', self.clb_tree_button_press) - colnum = 2 - colwidths = [90, 20] - coltexts = ['Tvar', 'Pocet'] - - for col in range(colnum): - renderer = gtk.CellRendererText() - renderer.set_property('ellipsize', True) - #renderer.set_property('editable', True) - renderer.set_property('xpad', 5) - - #renderer.connect('edited', on_edit_item, col) - treecol = self.treeview.insert_column_with_attributes(-1, coltexts[col], renderer, text=col) - treecol.set_spacing(10) - treecol.set_resizable(True) - treecol.set_alignment(0.5) - treecol.set_data('id', col) - treecol.set_data('renderer', renderer) - treecol.set_min_width(colwidths[col]) - - - self.update_tree_data() - - self.left_win.add(self.treeview) - - self.rootitem.add(gnomecanvas.CanvasWidget, widget=self.left_win, x=self.select_area[0], y=self.select_area[1], width=self.select_area[2], - height=self.select_area[3]) - self.treeview.show() - self.left_win.show() - - - - # BEGIN OF radio buttons ************************************ - self.rbgr = gtk.RadioButton(label="vzorky") - self.rbgr.connect("toggled", self.rb_callback, "vzorky") - self.rootitem.add(gnomecanvas.CanvasWidget, widget=self.rbgr, x=10, y=430, width=80, height=20 ) - self.rbgr.show() - - self.rb1 = gtk.RadioButton(group=self.rbgr, label="predlohy") - self.rb1.connect("toggled", self.rb_callback, "predlohy") - self.rootitem.add(gnomecanvas.CanvasWidget, widget=self.rb1, x=80, y=430, width=80, height=20 ) - self.rb1.show() - # END OF radio buttons ************************************ - - gcompris.set_background(self.gcomprisBoard.canvas.root(), - gcompris.skin.image_to_skin("gcompris-bg.jpg")) - #BC_pixmap = gcompris.utils.load_pixmap("writing_tutor/bg.png") - #BCself.bg_pixmap = self.rootitem.add(gnomecanvas.CanvasPixbuf, pixbuf = _pixmap, x=0, y=0) - - - # show tablet indicator icon - - _t_active = 0 - _devices = gtk.gdk.devices_list() - for _d in _devices: - if _d.source == gtk.gdk.SOURCE_PEN: - _t_active = 1 - if _d.mode == gtk.gdk.MODE_DISABLED: # if tablet is disabled - _d.set_mode(gtk.gdk.MODE_SCREEN) # enable it (first in sequence) - break - else: # already enabled.. - break - - if _t_active == 1: - self.set_tablet_indicator(1) - else: - self.set_tablet_indicator(0) - - self.treeview.set_cursor(self.cursor_index) - - self.start_2() - - - - def clb_tree_cursor_changed(self, treeview, user_param1=None): - if self.tree_already_clicked: - self.tree_already_clicked = False - else: - #print "clb_tree_cursor_changed:" - self.show_pen_animation(0) - treeselection = treeview.get_selection() - (model, iter) = treeselection.get_selected() - self.pattern = model.get(iter, 0)[0] - pocet = model.get(iter, 1)[0] - - self.cursor_index = model.get_path(iter)[0] - self.show_drop_button(0) - self.start_2("yes") - self.can_write = True - - - def clb_tree_button_press(self, widget, event): - - #print "clb_tree_button_press: widget=", widget, ", event.button=",event.button, ", event.type=", event.type - if event.button == 3: - - self.show_pen_animation(0) - self.can_write = False - treeselection = self.treeview.get_selection() - (model, iter) = treeselection.get_selected() - if model == None or iter == None: - return - self.pattern = model.get(iter, 0)[0] - pocet = model.get(iter, 1)[0] - - self.cursor_index = model.get_path(iter)[0] - #print "self.cursor_index=", self.cursor_index - - if self.last_selected_pattern != self.pattern or self.last_selected_writing_type != self.writing_type: - self.pattern_arr_index = 0 - self.last_selected_pattern = self.pattern - self.last_selected_writing_type = self.writing_type - self.last_selected_pattern_count = len(self.get_datfiles_list(self.pattern)) - else: - if self.last_selected_pattern_count > 0: - self.pattern_arr_index = (self.pattern_arr_index + 1) % self.last_selected_pattern_count - - if self.last_selected_pattern_count > 0: - self.dat_filename = self.get_datfiles_list(self.pattern)[self.pattern_arr_index] - - #print "paint:self.patern=", self.pattern, self.dat_filename - self.configure_event(self.area, None) - self.paint_pattern(self.dat_filename) - - # zobrazi cestu k .dat suboru - tmp = self.dat_filename.split("/") - _dat_filename_file = tmp[len(tmp)-1] - tmp.remove(_dat_filename_file) - _dat_filename_dir = "/".join(tmp) + "/" - context = self.area.create_pango_context() - desc = pango.FontDescription('Sans 9') - gc = self.pixmap.new_gc() - self.layout = self.area.create_pango_layout(_dat_filename_dir) # v 1. riadku nazov adresar - self.layout.set_font_description(desc) - self.pixmap.draw_layout(gc, x=30, y=15, layout=self.layout) - self.layout = self.area.create_pango_layout(_dat_filename_file) # v 2. riadku nazov .dat suboru - self.layout.set_font_description(desc) - self.pixmap.draw_layout(gc, x=30, y=30, layout=self.layout) - self.area.queue_draw_area(0, 0, 650, 500) - - # zobraz tlacitko na zmazanie - self.show_drop_button(1) - - - - self.tree_already_clicked = True - - - - - def get_datfiles_list(self, _pattern): - - dat_list = glob.glob(self.save_path + "/tutor/" + self.writing_type + "/" + _pattern + "/*.dat") - empty_dat_list = [] - for _file in dat_list: - if os.stat(_file).st_size <= 0: - empty_dat_list.append(_file) # v zozname necha len neprazdne subory - - set_dat_list = set(dat_list) - set_empty_dat_list = set(empty_dat_list) - - res = set_dat_list - set_empty_dat_list # rozdiel mnozin - return list(res) - - - def update_tree_data(self): - #print "update_tree_data: writing_type=", self.writing_type - - # sequence: a|b|c|d|A|B|C|D|ab|@kruh - - self.model.clear() - self.patterns_count = 0 - - _sequence = re.sub(r'\s', '', self.sequence) - _sequence = _sequence.replace("$", "|") # v tejto aktivite nie su levely, ale ak nahodou je separator $ tak -> | - _sequence = _sequence.split("|") - for s in _sequence: - if len(s) > 0: - self.model.append([s, str(len(self.get_datfiles_list(s)))]) - self.patterns_count += 1 - - - def tree_select_next_item(self): - self.cursor_index = (self.cursor_index + 1 ) % self.patterns_count - self.treeview.set_cursor(self.cursor_index) - #print "tree_select_next_item: self.cursor_index=", self.cursor_index, ", self.patterns_count=", self.patterns_count - - - - def show_drop_button(self, show): - #print "show_drop_button: show=", show - - if show == 1: - if self.drop_button == None: - _pixmap = gcompris.utils.load_pixmap("writing_tutor/drop.png") - self.drop_button = self.rootitem.add(gnomecanvas.CanvasPixbuf, pixbuf = _pixmap, x = 90, y = gcompris.BOARD_HEIGHT -60) - self.drop_button.connect("event", self.drop_button_click_event) - self.drop_button.show() - - else: - if self.drop_button != None: - self.drop_button.hide() - - - def drop_button_click_event(self, widget, event): - #print "drop_button_click_event: event.type=", event.type - if event.type == gtk.gdk.BUTTON_PRESS: # and je nejaky pattern ... - # zmaz aktualny datafile + update_tree_data+ zobraz dalsie - # dorob !! - if os.path.exists(self.dat_filename): - os.remove(self.dat_filename) - #print ".dat file deleted: ", self.dat_filename - - gcompris.sound.play_ogg_cb("sounds/crash.ogg", self.clb_dummy) - self.pattern_arr_index = 0 - self.last_selected_pattern_count = len(self.get_datfiles_list(self.pattern)) - self.update_tree_data() - self.treeview.set_cursor(self.cursor_index) - - return True - - - def recreate_drawing_area(self): - - # BEGIN OF drawing_area ************************************ - - if self.area != None: - self.area.destroy() - - self.area = gtk.DrawingArea() - - # Signals used to handle backing pixmap - self.area.connect("expose_event", self.expose_event) - self.area.connect("configure_event", self.configure_event) - - # Event signals - self.area.connect("motion_notify_event", self.motion_notify_event) - #area.connect("button_press_event", self.button_press_event) - - self.area.set_events(gtk.gdk.EXPOSURE_MASK | gtk.gdk.LEAVE_NOTIFY_MASK | gtk.gdk.BUTTON_PRESS_MASK - | gtk.gdk.POINTER_MOTION_MASK | gtk.gdk.PROXIMITY_IN | gtk.gdk.PROXIMITY_OUT_MASK) - - # The following call enables tracking and processing of extension - # events for the drawing area - #self.area.set_extension_events(gtk.gdk.EXTENSION_EVENTS_CURSOR) - self.area.set_extension_events(gtk.gdk.EXTENSION_EVENTS_ALL) - - #area.size(400, 300) - #self.area.set_size_request(550, 600) - - self.rootitem.add(gnomecanvas.CanvasWidget, widget=self.area, x=self.panel_area[0], y=self.panel_area[1], - width=self.panel_area[2], height=self.panel_area[3]) - - self.area.show() - # END OF drawing_area ************************************ - - #print "recreate_drawing_area()" - - - - def paint_pattern(self, pattern_dat_file): - #print "paint_pattern: ", pattern_dat_file - if os.path.getsize(pattern_dat_file) > 0: - _filehandle = open(pattern_dat_file, "r") - for line in _filehandle: - l = line.split() - #print "x=",l[0]," y=",l[1], " pressure=", l[2] - if len(l) == 6: - self.draw_brush(self.area, float(l[0]), float(l[1]), float(l[2])) - #time.sleep(0.010) - else: - print "BAD FILE FORMAT: " - print pattern_dat_file - break - - _filehandle.close() - - - def start_2(self, recreate="yes"): - #print "start_2" - - ip = get_ip_address('eth0') - - datum = time.strftime('%d.%m.%Y_%X').replace('/','.') - filename1 = self.save_path + "/tutor/" + self.writing_type + "/" + self.pattern - self.filename = filename1 + "/" + ip + "__" + datum + ".dat" - # musi existovat cesta => adresare! - if not os.path.exists(filename1): - os.makedirs(filename1) - - self.file_handle = open(self.filename,"w") - if recreate == "yes": - self.recreate_drawing_area() - - #self.draw_guiding_lines() - self.show_pen_animation(1) - - - - # BEGIN OF drawing_area HANDLERS ************************************ - # Create a new backing pixmap of the appropriate size - def configure_event(self, widget, event): - - x, y, width, height = widget.get_allocation() - self.pixmap = gtk.gdk.Pixmap(widget.window, width, height) - #pixmap.draw_rectangle(widget.get_style().white_gc, True, 0, 0, width, height) - - pixbuf = gcompris.utils.load_pixmap("writing_tutor/pattern_admin_bg.png") - self.pixmap.draw_pixbuf(widget.get_style().fg_gc[gtk.STATE_NORMAL], pixbuf, 0, 0, 0, 0, width, height) - - - draw_guiding_lines(self.pixmap, self.area, self.pattern, 570) - - return True - - - # Redraw the screen from the backing pixmap - def expose_event(self, widget, event): - x , y, width, height = event.area - widget.window.draw_drawable(widget.get_style().fg_gc[gtk.STATE_NORMAL], self.pixmap, x, y, x, y, width, height) - return False - - # Draw a rectangle on the screen - def draw_brush(self, widget, x, y, pressure): - rect = (int(x-5*pressure), int(y-5*pressure), int(10*pressure), int(10*pressure)) - self.pixmap.draw_rectangle(widget.get_style().black_gc, True, rect[0], rect[1], rect[2], rect[3]) - widget.queue_draw_area(rect[0], rect[1], rect[2], rect[3]) - - - - def motion_notify_event(self, widget, event): - if not self.can_write: - return True - - # is_hint => mys - if event.is_hint: - x, y, state = event.window.get_pointer() - pressure = 0.0 - x_tilt = 0.0 - y_tilt = 0.0 - else: # pero tabletu - state = event.state - x = event.get_axis(gtk.gdk.AXIS_X) - y = event.get_axis(gtk.gdk.AXIS_Y) - pressure = event.get_axis(gtk.gdk.AXIS_PRESSURE) - x_tilt = event.get_axis(gtk.gdk.AXIS_XTILT) # musi to podporovat tablet,napr "Wacom Intuos" - if x_tilt == None: - x_tilt = 0.0 - y_tilt = event.get_axis(gtk.gdk.AXIS_YTILT) - if y_tilt == None: - y_tilt = 0.0 - - #wheel = event.get_axis(gtk.gdk.AXIS_WHEEL) #? - #print "x=",x," y=",y," pressure=",pressure, " x_tilt=", x_tilt," y_tilt=",y_tilt - - - if (not (x >= 10 and x <= 550 and y >= 10 and y<= 500)): #if not in drawing_area_rect: - if self.writing_status == 1: - self.writing_status = None - return True - - - if state & gtk.gdk.BUTTON1_MASK and self.pixmap != None: - - if event.is_hint: - pressure = 1.0 - if pressure == None: - pressure = 1.0 - - if self.writing_status == None and pressure > 0.0: - self.show_pen_animation(0) - self.writing_status = 1 # zacal som pisat pismeno/zaznamenavat udaje - self.motions_count = 1 - self.cas_start = time.time() # pri zaciatku pisania pismena sa poznaci cas - - - if pressure > 0.0: - self.draw_brush(widget, x, y, pressure) - self.last_written_point_index = self.motions_count - - if self.writing_status == 1: - #points[motions_count] = str(int(x)) + " " + str(int(y)) + " " + str(int(pressure)) + "\n" - self.points[self.motions_count] = str(float(x)) + " " + str(float(y)) + " " + str(pressure) + " " + str(x_tilt) + " " + str(y_tilt) + " " + str((time.time()-self.cas_start)*1000.0) + "\n" - #print "points[",motions_count,"]=", points[motions_count] - self.motions_count += 1 - - return True - -# END OF drawing_area HANDLERS ************************************ - - - def rb_callback(self, widget, data): - # zavola sa len pri aktivovani rb, nie pri deaktivovani - if not widget.get_active(): - return - - #print "rb_callback" - - self.show_drop_button(0) - self.show_pen_animation(0) - self.writing_type = data - self.update_tree_data() - self.cursor_index = 0 - self.treeview.set_cursor(self.cursor_index) - self.start_2("no") - - - - - def end(self): - #gcompris.sound.reopen() - - if self.rootitem != None: - self.rootitem.destroy() - self.rootitem = None - pass - - - def show_pen_animation(self, show): - if show == 0: - if self.ap != None: - self.ap.gnomecanvas.hide() - else: - if self.ap == None: - self._ap = gcompris.anim.Animation("writing_tutor/anim_pen.txt") - self.ap = gcompris.anim.CanvasItem(self._ap, self.rootitem) - self.ap.gnomecanvas.set(x=80, y=gcompris.BOARD_HEIGHT - 70) - self.ap.setState(0) - self.ap.gnomecanvas.show() - else: - self.ap.gnomecanvas.show() - - - - - def ok(self): - #print "ok" - - self.writing_status = None - - # od naposledy napisaneho bodu vsetky vymaz (s tlakom=0) - # zapise do suboru vsetky body od prveho prilozenia pera, az po posledny napisany bod.. - if self.last_written_point_index != None: - for i in range(self.last_written_point_index): - #print "i=",i," , last_written_point_index=",last_written_point_index - self.file_handle.write(self.points[i+1]) - self.file_handle.close() - - _empty_dat_list = glob.glob(self.save_path + "/tutor/" + self.writing_type + "/" + self.pattern + "/*.dat") - for _file in _empty_dat_list: - if os.stat(_file).st_size <= 0: - os.remove(_file) # zmaze .dat subory 0-vej dlzky - #print "empty file deleted: ", _file - #if os.path.getsize(filename) < 1: - - #self.start_2() # !! - self.update_tree_data() - self.can_write = False - self.set_level(1) - - - def set_level(self, level): - #print "set_level" - - self.tree_select_next_item() - self.show_pen_animation(1) - self.start_2("yes") - - - - - def key_press(self, keyval, commit_str, preedit_str): - return False - - def repeat(self): - print "repeat" - - def pause(self, pause): - self.board_paused = pause - - # There is a problem with GTK widgets, they are not covered by the help, We hide/show them here - if(pause): - self.left_win.hide() - self.area.hide() - self.rbgr.hide() - self.rb1.hide() - - else: - self.left_win.show() - self.area.show() - self.rbgr.show() - self.rb1.show() - - self.repeat() - return - - - def config(self): - print "Config" - pass - - def config_stop(self): - print "config_stop", self - pass - - - def config_start(self, profile): - print "config_start" - global _global_rootitem - - # show only tablet configuration. save_path, sequence only in admin mode - if _global_rootitem != None: # not in admin mode - dlg = GtkInputDialog(self) - return - - self.configure_profile = profile - - self.config_dict = self.init_config() - self.config_dict.update(gcompris.get_conf(profile, self.gcomprisBoard)) - - self.main_vbox = gcompris.configuration_window (\ - _('Hra <b>%s</b> - nastavenie pre profil <b>%s</b>') % ('Tutor', profile.name), self.save_config) - - gcompris.separator() - self.button = gtk.Button("Nastavenie tabletu...") - self.button.connect("clicked", self.input_dlg_callback) - self.button.show() - self.main_vbox.pack_start(self.button, False, False, 0) - gcompris.separator() - - # !! ak je v admin mode, tak nemoze nastavovat tablet... - if _global_rootitem == None: # in admin mode - self.button.set_state(gtk.STATE_INSENSITIVE) - - - gcompris.textview(_('Adresar, kde sa budu ukladat vzorky/predlohy: '), 'save_path', 'desc', self.config_dict['save_path'], - self.validate_callback) - gcompris.separator() - - gcompris.textview(_('Postupnost tvarov pre zbieranie vzoriek: '), 'sequence', 'desc', self.config_dict['sequence'], - self.validate_callback) - gcompris.separator() - - - def validate_callback(self, key, value, z): - #print "validate_callback: key=", key, ", value=", value, ", z=", z - - if key == 'save_path': - if not os.path.exists(value): - return False - if key == 'sequence': - pass - - return True - - - def input_dlg_callback(self, table): - dlg = GtkInputDialog(self) - - - def dummy_enter_callback(self, widget, _entry): - pass - - def clb_dummy(self, x=None): - pass - - - def save_config(self, table): - print "save_config: table=", table - global _global_rootitem - - if table == None: - return - - - for key,value in table.iteritems(): - gcompris.set_board_conf(self.configure_profile, self.gcomprisBoard, key, value) # save config to db - - if _global_rootitem != None: - self.start_2("no") - - - def configuration(self, value, init): - if self.config_dict.has_key(value): - return eval(self.config_dict[value]) - else: - return init - - - def set_tablet_indicator(self, tablet_status): - """ - Description: - Set tablet indicator icon - - Arguments: - tablet_status -- 1 or 0 indicating status of tablet device (enabled or disabled) - """ - global _global_rootitem - global _global_tablet_indicator - - #print "set_tablet_indicator(", tablet_status, ")" - - if tablet_status == 1: - _pixmap = gcompris.utils.load_pixmap("writing_tutor/tablet_active.png") - else: - _pixmap = gcompris.utils.load_pixmap("writing_tutor/tablet_inactive.png") - - if _global_tablet_indicator != None: - _global_tablet_indicator.destroy() - - _global_tablet_indicator = _global_rootitem.add(gnomecanvas.CanvasPixbuf, pixbuf = _pixmap, x = 10, y = gcompris.BOARD_HEIGHT -50) - _global_tablet_indicator.show() - - - def init_config(self): - default_config_dict = { 'save_path' : gcompris.get_properties().user_dir, - 'sequence' : 'a|b|c|d|e|A|B|C|D|E|_A|_B|1|2|@kruh|@stvorec' - } - return default_config_dict - - # sequence format: - #a|b|c|d|A|B|C|D|ab|@kruh - - - - -# END OF class Gcompris_pattern_admin ************************************ - - diff --git a/src/writing_tutor_pattern_admin-activity/writing_tutor_pattern_admin.xml.in b/src/writing_tutor_pattern_admin-activity/writing_tutor_pattern_admin.xml.in deleted file mode 100644 index a9e8d6f..0000000 --- a/src/writing_tutor_pattern_admin-activity/writing_tutor_pattern_admin.xml.in +++ /dev/null @@ -1,18 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<GCompris> - <Board - name="writing_tutor_pattern_admin" - type="python:writing_tutor_pattern_admin" - section="/experimental/writing_tutor" - icon="writing_tutor_pattern_admin.png" - difficulty="1" - mode="normal" - author="Jozef Cerven (jcmail80@gmail.com)" - boarddir="tutor"> - <_title>TBD</_title> - <_description>TBD</_description> - <_prerequisite></_prerequisite> - <_goal></_goal> - <_manual></_manual> - </Board> -</GCompris> diff --git a/src/writing_tutor_template_match-activity/Makefile.am b/src/writing_tutor_template_match-activity/Makefile.am deleted file mode 100644 index cd0978e..0000000 --- a/src/writing_tutor_template_match-activity/Makefile.am +++ /dev/null @@ -1,34 +0,0 @@ -SUBDIRS = - -pythondir = $(PYTHON_PLUGIN_DIR) - -dist_python_DATA= writing_tutor_template_match.py - - - -xmldir = $(pkgdatadir)/@PACKAGE_DATA_DIR@ - -xml_in_files = \ - writing_tutor_template_match.xml.in - - -xml_DATA = $(xml_in_files:.xml.in=.xml) - -# Do not use the INTLTOOL_XML_RULE, we don't need to embed the translations -# in the file themselves. GCompris pick the translations from the po file at -# runtime. -# -$(xml_DATA): %.xml: %.xml.in - sed -e "s/\(<\{1\}\/*\)_/\1/g" $< > $@ - -# Use this directive and instead of the one above to embed the translations -# in the xml files directly, this is needed for the tool gcompris2spip -#@INTLTOOL_XML_RULE@ - -CLEANFILES = $(xml_DATA) - -icondir = $(pkgdatadir)/@PACKAGE_DATA_DIR@ -icon_DATA = writing_tutor_template_match.png - -EXTRA_DIST = $(icon_DATA) - diff --git a/src/writing_tutor_template_match-activity/gcompris b/src/writing_tutor_template_match-activity/gcompris deleted file mode 120000 index 6a7dc8a..0000000 --- a/src/writing_tutor_template_match-activity/gcompris +++ /dev/null @@ -1 +0,0 @@ -../boards/python/gcompris
\ No newline at end of file diff --git a/src/writing_tutor_template_match-activity/init_path.sh b/src/writing_tutor_template_match-activity/init_path.sh deleted file mode 100755 index 4156072f..0000000 --- a/src/writing_tutor_template_match-activity/init_path.sh +++ /dev/null @@ -1,8 +0,0 @@ -# Set the different path for this activity -# This is sourced by runit.sh -path=$1 -activity=writing_tutor_template_match -plugindir=$path/../boards/.libs -pythonplugindir=$path -resourcedir=$path/resources -section="/experimental/writing_tutor" diff --git a/src/writing_tutor_template_match-activity/resources/skins b/src/writing_tutor_template_match-activity/resources/skins deleted file mode 120000 index 070dcd2..0000000 --- a/src/writing_tutor_template_match-activity/resources/skins +++ /dev/null @@ -1 +0,0 @@ -../../../boards/skins/
\ No newline at end of file diff --git a/src/writing_tutor_template_match-activity/writing_tutor_template_match.png b/src/writing_tutor_template_match-activity/writing_tutor_template_match.png Binary files differdeleted file mode 100644 index 8646c3c..0000000 --- a/src/writing_tutor_template_match-activity/writing_tutor_template_match.png +++ /dev/null diff --git a/src/writing_tutor_template_match-activity/writing_tutor_template_match.py b/src/writing_tutor_template_match-activity/writing_tutor_template_match.py deleted file mode 100644 index c52d680..0000000 --- a/src/writing_tutor_template_match-activity/writing_tutor_template_match.py +++ /dev/null @@ -1,735 +0,0 @@ -# gcompris/tutor/template_match.py - Writing Tutor project -# -# Author: Jozef Cerven, 5mi, (c) 2006/2007 -# FACULTY OF MATHEMATICS, PHYSICS AND INFORMATICS COMENIUS UNIVERSITY BRATISLAVA, Informatics Teaching and Basic of Informatics department -# http://www.edi.fmph.uniba.sk -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# - -# first level of this activity is "with template", others are "without template" - - -import gnomecanvas -import gcompris -import gcompris.utils -import gcompris.bonus -import gcompris.skin -import gcompris.anim -import gcompris.sound -import gcompris.admin -import gcompris.score -import gtk -import gtk.gdk -import random -import pango -import time -import os -import socket -import fcntl -import struct -import re -import glob -import string -import time - - -#import gobject -from gettext import gettext as _ - -from writing_tutor_common import * - -import DTW.dtw - - -_global_rootitem = None # for config dialog -_global_tablet_indicator= None - - - - - -# BEGIN OF class Gcompris_template_match ************************************ -class Gcompris_writing_tutor_template_match: - - _ap = None - ap = None - _sb = None - sb = None - - rootitem = None - board_paused = 0 - - save_path = None - sequence = None - pattern = None - show_template = 100*[None] # if show_template[0]==1: show_template in level 1 - - area = None - notepad_area = None - label = None - won_level = 0 - - dat_filename = None - pixmap = None # drawing area pixmap - filename = None - file_handle = None - writing_status = None - last_written_point_index = None - motions_count = None - points = [None] * 2000 - cas_start = None - button_pixbuf = None - - def __init__(self, gcomprisBoard): - self.gcomprisBoard = gcomprisBoard - - _notepad_width = 485 - _notepad_height = 485 - - #self.notepad_area = ((gcompris.BOARD_WIDTH/2 - _notepad_width/2), 20, _notepad_width, _notepad_height) # centered - self.notepad_area = (280, 10, _notepad_width, _notepad_height) - - - - def start(self): - global _global_rootitem - - self.window = self.gcomprisBoard.canvas.get_toplevel() - - self.config_dict = self.init_config() - self.config_dict.update(gcompris.get_board_conf()) - - self.save_path = self.config_dict['save_path'] - self.sequence = self.config_dict['template_match_sequence'] - - self.parse_sequence() - - self.gcomprisBoard.level=1 - self.gcomprisBoard.maxlevel=len(self.sequence) - self.gcomprisBoard.sublevel=1 - self.gcomprisBoard.number_of_sublevel = len(self.sequence[self.gcomprisBoard.level-1]) - - - _pixmap = gcompris.utils.load_pixmap(gcompris.skin.image_to_skin("button_reload.png")) - if(_pixmap): - gcompris.bar_set_repeat_icon(_pixmap) - gcompris.bar_set(gcompris.BAR_LEVEL|gcompris.BAR_OK|gcompris.BAR_REPEAT_ICON|gcompris.BAR_CONFIG) - else: - gcompris.bar_set(gcompris.BAR_LEVEL|gcompris.BAR_OK|gcompris.BAR_REPEAT|gcompris.BAR_CONFIG) - - - #gcompris.set_background(self.rootitem, gcompris.skin.image_to_skin("gcompris-bg.jpg")) - gcompris.set_background(self.rootitem, "writing_tutor/wood_oak.png") - - - # Create our rootitem. We put each canvas item in it so at the end we - # only have to kill it. The canvas deletes all the items it contains automaticaly. - self.rootitem = self.gcomprisBoard.canvas.root().add(gnomecanvas.CanvasGroup, x=0.0, y=0.0) - _global_rootitem = self.rootitem - - - # show tablet indicator icon - - _t_active = 0 - _devices = gtk.gdk.devices_list() - for _d in _devices: - if _d.source == gtk.gdk.SOURCE_PEN: - _t_active = 1 - if _d.mode == gtk.gdk.MODE_DISABLED: # if tablet is disabled - _d.set_mode(gtk.gdk.MODE_SCREEN) # enable it (first in sequence) - break - else: # already enabled.. - break - - if _t_active == 1: - self.set_tablet_indicator(1) - else: - self.set_tablet_indicator(0) - - - self.set_level(1) - - - - - def recreate_drawing_area(self): - - # BEGIN OF drawing_area ************************************ - - if self.area != None: - self.area.destroy() - - self.area = gtk.DrawingArea() - - # Signals used to handle backing pixmap - self.area.connect("expose_event", self.expose_event) - self.area.connect("configure_event", self.configure_event) - - # Event signals - self.area.connect("motion_notify_event", self.motion_notify_event) - #area.connect("button_press_event", self.button_press_event) - - self.area.set_events(gtk.gdk.EXPOSURE_MASK | gtk.gdk.LEAVE_NOTIFY_MASK | gtk.gdk.BUTTON_PRESS_MASK - | gtk.gdk.POINTER_MOTION_MASK | gtk.gdk.PROXIMITY_IN | gtk.gdk.PROXIMITY_OUT_MASK) - - # The following call enables tracking and processing of extension - # events for the drawing area - #self.area.set_extension_events(gtk.gdk.EXTENSION_EVENTS_CURSOR) - self.area.set_extension_events(gtk.gdk.EXTENSION_EVENTS_ALL) - - self.rootitem.add(gnomecanvas.CanvasWidget, widget=self.area, x=self.notepad_area[0], y=self.notepad_area[1], - width=self.notepad_area[2], height=self.notepad_area[3]) - - self.area.show() - # END OF drawing_area ************************************ - - #print "recreate_drawing_area()" - - - - def start_2(self, recreate="yes"): - - self.pattern = self.sequence[self.gcomprisBoard.level-1][self.gcomprisBoard.sublevel-1] - gcompris.score.set(self.gcomprisBoard.sublevel) - self.draw_text(140, 150, self.pattern) - self.won_level = 0 - - if recreate == "yes": - self.recreate_drawing_area() - - - if self.show_template[self.gcomprisBoard.level-1] == 1: # level with "show_template" - predlohy_dir = self.save_path + "/writing_tutor/predlohy/" + self.pattern + "/" - if not os.path.exists(predlohy_dir): - print "%s DOES NOT EXISTS!", predlohy_dir - else: - arglist = [] - os.path.walk(predlohy_dir,self.walk_callback,arglist) - - ip = get_ip_address('eth0') # eth0 - datum = time.strftime('%d.%m.%Y_%X').replace('/','.') - filename1 = self.save_path + "/writing_tutor/predloha_test/" + self.pattern - self.filename = filename1 + "/" + ip + "__" + datum + ".dat" - # musi existovat cesta => adresare! - if not os.path.exists(filename1): - os.makedirs(filename1) - - self.file_handle = open(self.filename,"w") - - self.show_pen_animation(1) - - - - - def walk_callback(self, arg, dirname, fnames ): - global area - - # print "dirname: ", dirname - if len(fnames) < 1: - print "walk_callback: len(fnames)<1 !! : ", len(fnames) - - for _filename in fnames: - if os.path.getsize(dirname+_filename) > 0: - # print "df: ", dirname , _filename - _filehandle = open(dirname + _filename, "r") - for line in _filehandle: - l = line.split() - #print "x=",l[0]," y=",l[1], " pressure=", l[2] - self.draw_brush(self.area, float(l[0]), float(l[1]), float(l[2]),'predloha') - time.sleep(0.010) - _filehandle.close() - break # berieme len prvu predlohu v adresari - - - - # BEGIN OF drawing_area HANDLERS ************************************ - # Create a new backing pixmap of the appropriate size - def configure_event(self, widget, event): - x, y, width, height = widget.get_allocation() - self.pixmap = gtk.gdk.Pixmap(widget.window, width, height) - #self.pixmap.draw_rectangle(widget.get_style().white_gc, True, 0, 0, width, height) - - #pixbuf = gcompris.utils.load_pixmap("boardicons/notepad.png") - tmp = self.gcomprisBoard.filename.split("/") - _file = tmp[len(tmp)-1] - tmp.remove(_file) - _board_dir = "/".join(tmp) - - pixbuf = gtk.gdk.pixbuf_new_from_file(_board_dir + "/writing_tutor/wood_oak.png") # transparent png - self.pixmap.draw_pixbuf(widget.get_style().fg_gc[gtk.STATE_NORMAL], pixbuf, 0, 0, 0, 0, width, height) - pixbuf = gtk.gdk.pixbuf_new_from_file(_board_dir + "/writing_tutor/notepad.png") # transparent png - self.pixmap.draw_pixbuf(widget.get_style().fg_gc[gtk.STATE_NORMAL], pixbuf, 0, 0, 0, 0, width, height) - - draw_guiding_lines(self.pixmap, self.area, self.pattern, 450) - - return True - - - # Redraw the screen from the backing pixmap - def expose_event(self, widget, event): - x , y, width, height = event.area - widget.window.draw_drawable(widget.get_style().fg_gc[gtk.STATE_NORMAL], self.pixmap, x, y, x, y, width, height) - return False - - - def draw_brush(self, widget, x, y, pressure, _type='vzorka'): - - colormap = self.area.get_colormap() - if _type == 'predloha': - color = colormap.alloc_color(86*256, 153*256, 215*256) # slabo modra - rect = (int(x-4*pressure), int(y-4*pressure), int(8*pressure), int(8*pressure)) - else: - color = colormap.alloc_color(97*256, 105*256, 141*256) # tmavo seda - rect = (int(x-5*pressure), int(y-5*pressure), int(10*pressure), int(10*pressure)) - - - gc = self.area.get_style().fg_gc[gtk.STATE_NORMAL] - gc.foreground = color - - self.pixmap.draw_rectangle(widget.get_style().fg_gc[gtk.STATE_NORMAL], True, rect[0], rect[1], rect[2], rect[3]) - widget.window.draw_drawable(widget.get_style().fg_gc[gtk.STATE_NORMAL], self.pixmap, rect[0], rect[1], rect[0], rect[1], rect[2], rect[3]) - - while gtk.events_pending(): gtk.main_iteration() # refreshing widget - - # nastavim naspat ciernu - color = colormap.alloc_color(0,0,0) # slabo modra - gc = self.area.get_style().fg_gc[gtk.STATE_NORMAL] - gc.foreground = color - - - - def motion_notify_event(self, widget, event): - #if not self.can_write: #!! - # return True - # is_hint => mys - if event.is_hint: - x, y, state = event.window.get_pointer() - pressure = 0.0 - x_tilt = 0.0 - y_tilt = 0.0 - else: # pero tabletu - state = event.state - x = event.get_axis(gtk.gdk.AXIS_X) - y = event.get_axis(gtk.gdk.AXIS_Y) - pressure = event.get_axis(gtk.gdk.AXIS_PRESSURE) - x_tilt = event.get_axis(gtk.gdk.AXIS_XTILT) # musi to podporovat tablet,napr "Wacom Intuos" - if x_tilt == None: - x_tilt = 0.0 - y_tilt = event.get_axis(gtk.gdk.AXIS_YTILT) - if y_tilt == None: - y_tilt = 0.0 - - #wheel = event.get_axis(gtk.gdk.AXIS_WHEEL) #? - #print "x=",x," y=",y," pressure=",pressure, " x_tilt=", x_tilt," y_tilt=",y_tilt - - - if (not (x >= 10 and x <= 485 and y >= 10 and y<= 485)): #if not in drawing_area_rect: - if self.writing_status == 1: - self.writing_status = None - return True - - - if state & gtk.gdk.BUTTON1_MASK and self.pixmap != None: - - if event.is_hint: - pressure = 1.0 - if pressure == None: - pressure = 1.0 - - if self.writing_status == None and pressure > 0.0: - self.show_pen_animation(0) - self.writing_status = 1 # zacal som pisat pismeno/zaznamenavat udaje - self.motions_count = 1 - self.cas_start = time.time() # pri zaciatku pisania pismena sa poznaci cas - - - - if pressure > 0.0: - self.draw_brush(widget, x, y, pressure) - self.last_written_point_index = self.motions_count - - if self.writing_status == 1: - #points[motions_count] = str(int(x)) + " " + str(int(y)) + " " + str(int(pressure)) + "\n" - self.points[self.motions_count] = str(float(x)) + " " + str(float(y)) + " " + str(pressure) + " " + str(x_tilt) + " " + str(y_tilt) + " " + str((time.time()-self.cas_start)*1000.0) + "\n" - #print "points[",motions_count,"]=", points[motions_count] - self.motions_count = self.motions_count + 1 - - return True - - - - # END OF drawing_area HANDLERS ************************************ - - - - #def onBoard(self, x, y): - # return x >= 0 and x < self.width and y >= 0 and y < self.height - - - def end(self): - #gcompris.sound.reopen() - - if self.rootitem != None: - self.rootitem.destroy() - self.rootitem = None - gcompris.score.end() - pass - - - def get_datfiles_list(self, _pattern): - - dat_list = glob.glob(self.save_path + "/writing_tutor/predlohy/" + _pattern + "/*.dat") - res_dat_list = [] - for _file in dat_list: - if os.stat(_file).st_size > 0: - res_dat_list.append(_file) # v zozname necha len neprazdne subory - - return res_dat_list - - - def _remove_empty_list_item(self, _list): - if '' in _list: - _list.remove('') - - return _list - - - def parse_sequence(self): - """ parse sequence string into levels and sublevels """ - # sequence: - # a|b|@kruh$ - $ :level separator - # x|@tvar* - * - show template - - - _sequence = re.sub(r'\s', '', self.sequence) # remove white spaces - _sequence = _sequence.split("$") # divide into levels (this activity has 2 levels) - _sequence = self._remove_empty_list_item(_sequence) # remove empty level string if extsts - self.sequence = [] - - - _level = 0 - for _s in _sequence: # for each level (should be max 2) - _s_tmp = _s - _dat_list = self._remove_empty_list_item(_s_tmp.split("|")) - _non_empty_dat_list = _dat_list[:] - for s in _dat_list: # for each pattern in level - if s != '*' and len(self.get_datfiles_list(s)) < 1: # iba ak existuju .dat subor predlohy - _non_empty_dat_list.remove(s) - print "NEEXISTUJE predloha pre ",s - - if _non_empty_dat_list.count('*') > 0: - _non_empty_dat_list.remove('*') - self.show_template[_level] = 1 - else: - self.show_template[_level] = 0 - - _level += 1 - - if len(_non_empty_dat_list) > 0: - self.sequence.append(_non_empty_dat_list) - - - - - - # Called by gcompris when the user click on the level icon - def set_level(self, level): - #print "set_level: level=",level - - if self.gcomprisBoard.sublevel-1 == self.gcomprisBoard.number_of_sublevel and self.gcomprisBoard.level == self.gcomprisBoard.maxlevel: - gcompris.bonus.board_finished(gcompris.bonus.FINISHED_RANDOM) - self.won_level = 1 - return - - self.gcomprisBoard.level=level - self.gcomprisBoard.sublevel=1 - self.gcomprisBoard.number_of_sublevel = len(self.sequence[self.gcomprisBoard.level-1]) - gcompris.bar_set_level(self.gcomprisBoard) # nastavi kocku na cislo levelu - - gcompris.score.start(gcompris.score.STYLE_NOTE, 10, 50, len(self.sequence[self.gcomprisBoard.level-1])) - - self.start_2("yes") - - - - def increment_level(self): - self.gcomprisBoard.sublevel += 1 - if self.gcomprisBoard.sublevel > self.gcomprisBoard.number_of_sublevel: - self.set_level(self.gcomprisBoard.level % self.gcomprisBoard.maxlevel + 1) - else: - self.start_2("yes") - - - # stlacenie "ruky" - def ok(self): - - self.writing_status = None - - # zapise do suboru vsetky body od prveho prilozenia pera, az po posledny napisany bod.. - - if self.last_written_point_index != None: # if something was written... - for i in range(self.last_written_point_index): - self.file_handle.write(self.points[i+1]) - - self.file_handle.close() - - self.show_sablier_animation(1) - - _dtw = DTW.dtw.DTW(self.save_path, self.pattern) - dtw_res = _dtw.dtw(self.filename, 1) - print "ok: dtw_res=", str(dtw_res) - - self.show_sablier_animation(0) - - if dtw_res < 5: - gcompris.bonus.display(gcompris.bonus.WIN, gcompris.bonus.RANDOM) - self.won_level = 1 - else: - gcompris.bonus.display(gcompris.bonus.LOOSE, gcompris.bonus.RANDOM) - self.won_level = 1 - - else: # none was written - gcompris.bonus.display(gcompris.bonus.LOOSE, gcompris.bonus.RANDOM) - self.won_level = 1 - - - self.last_written_point_index = None - - - - - - - def key_press(self, keyval, commit_str, preedit_str): - return False - - def repeat(self): - #print "repeat" - self.start_2("yes") - - - - def pause(self, pause): # called after config dialog, help, bonus - #print "pause" - - self.board_paused = pause - - if(pause): - self.area.hide() - self.show_pen_animation(0) - if self.label != None: - self.label.hide() - else: - self.area.show() - if self.won_level: - # if we are paused, then unpaused it means that they beat the sublevel - self.increment_level() - else: - self.set_level(self.gcomprisBoard.level) - - ## There is a problem with GTK widgets, they are not covered by the help, We hide/show them here - #if(pause): - # self.area.hide() - #else: - # self.area.show() - # self.repeat() - - - return - - - - def config(self): - print "Config" - pass - - def config_stop(self): - print "config_stop", self - pass - - - - - def show_pen_animation(self, show): - if show == 0: - if self.ap != None: - self.ap.gnomecanvas.hide() - else: - if self.ap == None: - self._ap = gcompris.anim.Animation("writing_tutor/anim_pen.txt") - self.ap = gcompris.anim.CanvasItem(self._ap, self.rootitem) - self.ap.gnomecanvas.set(x=80, y=gcompris.BOARD_HEIGHT - 70) - self.ap.setState(0) - self.ap.gnomecanvas.show() - else: - self.ap.gnomecanvas.show() - - - def show_sablier_animation(self, show): - if show == 0: - if self.sb != None: - self.sb.gnomecanvas.hide() - else: - if self.sb == None: - self._sb = gcompris.anim.Animation("connect4/sablier.txt") - self.sb = gcompris.anim.CanvasItem(self._sb, self.rootitem) - self.sb.gnomecanvas.set(x=40, y= gcompris.BOARD_HEIGHT - 300) - self.sb.setState(0) - self.sb.gnomecanvas.show() - else: - self.sb.gnomecanvas.show() - - - def draw_text(self, x, y, text, color='blue'): - if self.label != None: - self.label.destroy() - - self.label = self.rootitem.add(gnomecanvas.CanvasText, x=x, y=y, text=text, fill_color="dark blue", font='sans bold 45', ) - - #self.label = self.rootitem.add(gnomecanvas.CanvasText, x= x, y= y, text= text, fill_color="black", - # font=gcompris.skin.get_font("gcompris/board/huge bold"), ) - - - def set_tablet_indicator(self, tablet_status): - """ - Description: - Set tablet indicator icon - - Arguments: - tablet_status -- 1 or 0 indicating status of tablet device (enabled or disabled) - """ - global _global_rootitem - global _global_tablet_indicator - - #print "set_tablet_indicator(", tablet_status, ")" - - if tablet_status == 1: - _pixmap = gcompris.utils.load_pixmap("writing_tutor/tablet_active.png") - else: - _pixmap = gcompris.utils.load_pixmap("writing_tutor/tablet_inactive.png") - - if _global_tablet_indicator != None: - _global_tablet_indicator.destroy() - - _global_tablet_indicator = _global_rootitem.add(gnomecanvas.CanvasPixbuf, pixbuf = _pixmap, x = 10, y = gcompris.BOARD_HEIGHT -50) - _global_tablet_indicator.show() - - - - def config_start(self, profile): - print "config_start" - global _global_rootitem - - - # show only tablet configuration. save_path, sequence only in admin mode - if _global_rootitem != None: # not in admin mode - dlg = GtkInputDialog(self) - return - - self.configure_profile = profile - - self.config_dict = self.init_config() - self.config_dict.update(gcompris.get_conf(profile, self.gcomprisBoard)) - - self.main_vbox = gcompris.configuration_window (\ - _('Hra <b>%s</b> - nastavenie pre profil <b>%s</b>') % ('Tutor', profile.name), self.save_config) - - gcompris.separator() - self.button = gtk.Button("Nastavenie tabletu...") - self.button.connect("clicked", self.input_dlg_callback) - self.button.show() - self.main_vbox.pack_start(self.button, False, False, 0) - gcompris.separator() - - # !! ak je v admin mode, tak nemoze nastavovat tablet... - if _global_rootitem == None: # in admin mode - self.button.set_state(gtk.STATE_INSENSITIVE) - - - gcompris.textview(_('Adresar, kde sa budu ukladat vzorky/predlohy: '), 'save_path', 'desc', self.config_dict['save_path'], - self.validate_callback) - gcompris.separator() - - gcompris.textview(_('Postupnosti tvarov pre testovanie: '), 'template_match_sequence', 'desc', self.config_dict['template_match_sequence'], self.validate_callback) - gcompris.separator() - - - def validate_callback(self, key, value, z): - #print "validate_callback: key=", key, ", value=", value, ", z=", z - - if key == 'save_path': - if not os.path.exists(value): - return False - if key == 'sequence': - pass - - return True - - - def input_dlg_callback(self, table): - dlg = GtkInputDialog() - - - def dummy_enter_callback(self, widget, _entry): - pass - - def clb_dummy(self, x=None): - pass - - def save_config(self, table): - print "save_config: table=", table - global _global_rootitem - - if table == None: - return - - for key,value in table.iteritems(): - gcompris.set_board_conf(self.configure_profile, self.gcomprisBoard, key, value) # save config to db - - if _global_rootitem != None: - self.start_2("no") - - - def configuration(self, value, init): - if self.config_dict.has_key(value): - return eval(self.config_dict[value]) - else: - return init - - - def init_config(self): - default_config_dict = { 'save_path' :gcompris.get_properties().user_dir, - 'template_match_sequence' : 'a|b|c $ A|B|C $ 1|2 $ @kruh' - } - return default_config_dict - - # sequence format: - - #a|b|c|d|A|B|C|D $ 1. level - #ab|auto $ 2. level - #@kruh $ 3. level - - - -# END OF class Gcompris_template_match ************************************ - - - - -def stop_board(): - gcompris.bonus.board_finished(gcompris.bonus.FINISHED_RANDOM) - - diff --git a/src/writing_tutor_template_match-activity/writing_tutor_template_match.xml.in b/src/writing_tutor_template_match-activity/writing_tutor_template_match.xml.in deleted file mode 100644 index ab53091..0000000 --- a/src/writing_tutor_template_match-activity/writing_tutor_template_match.xml.in +++ /dev/null @@ -1,18 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<GCompris> - <Board - name="writing_tutor_template_match" - type="python:writing_tutor_template_match" - section="/experimental/writing_tutor" - icon="writing_tutor_template_match.png" - difficulty="1" - mode="normal" - author="Jozef Cerven (jcmail80@gmail.com)" - boarddir="tutor"> - <_title>TBD</_title> - <_description>TBD</description> - <_prerequisite></_prerequisite> - <_goal></_goal> - <_manual></manual> - </Board> -</GCompris> |