Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWalther Neuper <neuper@neuper.(none)>2010-01-11 17:38:34 (GMT)
committer Walther Neuper <neuper@neuper.(none)>2010-01-11 17:38:34 (GMT)
commit1168885f8eb9d071097f454a27c5cd3e4d3c252e (patch)
treeaed5300c622185a0a2eb296aaa67794718875769
parent61c08754e0cc0f41e2d27b3ea94b00b14970d8f6 (diff)
inserted treeview, but old version runs
-rwxr-xr-xReckonPrimer.activity/ReckonPrimerActivity.py2
-rw-r--r--ReckonPrimer.activity/collection.py204
-rwxr-xr-xReckonPrimer.activity/display.py142
-rw-r--r--ReckonPrimer.activity/exstore.py215
-rw-r--r--ReckonPrimer.activity/img/collection.pngbin0 -> 2838 bytes
-rw-r--r--ReckonPrimer.activity/img/exercise.pngbin0 -> 2842 bytes
-rwxr-xr-xReckonPrimer.activity/session.py9
-rw-r--r--ReckonPrimer.activity/task.py33
-rw-r--r--ReckonPrimer.activity/treeview_icon.py247
-rw-r--r--ReckonPrimer.tests/exstore/__init__.py (renamed from ReckonPrimer.tests/collection/__init__.py)0
-rw-r--r--ReckonPrimer.tests/exstore/test_collection_WW091215.py (renamed from ReckonPrimer.tests/collection/test_collection_WW091215.py)0
-rw-r--r--ReckonPrimer.tests/exstore/test_perfect_minimum.py (renamed from ReckonPrimer.tests/collection/test_perfect_minimum.py)0
12 files changed, 741 insertions, 111 deletions
diff --git a/ReckonPrimer.activity/ReckonPrimerActivity.py b/ReckonPrimer.activity/ReckonPrimerActivity.py
index ef875d2..570490a 100755
--- a/ReckonPrimer.activity/ReckonPrimerActivity.py
+++ b/ReckonPrimer.activity/ReckonPrimerActivity.py
@@ -46,7 +46,7 @@ class ReckonPrimerActivity(activity.Activity):
journal_object.metadata['icon-color'] = '#AFD600,#5B615C'
datastore.write( journal_object )
journal_object.destroy()
-
+
self.run_session()
diff --git a/ReckonPrimer.activity/collection.py b/ReckonPrimer.activity/collection.py
index adc6f2e..a90d82d 100644
--- a/ReckonPrimer.activity/collection.py
+++ b/ReckonPrimer.activity/collection.py
@@ -1,95 +1,123 @@
# -*- coding: utf-8 -*-
-import gtk
-import pygtk
-import pango
-import random
-import copy
-from sugar.graphics import style
-
-from settings import Settings
-from coach import Coach
-
-from exercises.exaddsimp import ExAddSimp
-from exercises import *
-from exercises.exercise import Exercise
-
+'''
+date: 07.01.2010
+description: test class "collection" to test our new idea for saving all tasks
+'''
-class Collection:
-
- def __init__(self, display, coach):
- self._sett = Settings()
- #WN.LV diese Daten via pickle.load(...) holen ############
- self._data = [(self._sett.get_setting('addsub_simp'), []),
- (self._sett.get_setting('passten'), []),
- (self._sett.get_setting('times_div'), [])]
- #WN.LV [] ist die vorlaeufige Liste der errors ###########
- self._display = display
- self._coach = coach
- self._active_exerc = None
-
- def select(self, key):
- """ Select an exercise by key. return instance of an exercise.
- Errors are retrieved for (future) use by Coach. """
- #WN.LV Code ersetzen: key ist dann fuer Listen von Listen !!
- (_sett, _errors) = self._data[key]
- exercise_label = _sett['topic']
-
- if not Exercise.EXERCISES.has_key(exercise_label):
- raise Exception('Collection#select: Wrong key. To register an exercise see exercises/__init__.py')
-
- klass = Exercise.EXERCISES[exercise_label]
- package = __import__("exercises." + klass.lower())
- module = getattr(package, klass.lower())
- return getattr(module, klass)(self._display, (_sett, _errors))
+import gtk
+import pickle
+import os
+class CollectionTest:
+# __data = None
+# __title = None
+# __description = None
+ #__pic = None
- def define_coll_gui(self):
- """ Define gui-elements for presenting the collection.
- TODO: define once at startup of RP ?"""
- #WN.LV diesen Code ersetzen: collection_table.attach(self.colldata,...
- self.topic_box = gtk.HBox(True, 0)
- #self._display.collection_table.attach(self.topic_box, 0, 6, 0, 1)
- self._display.collection_table.attach(self.topic_box, 0, 9, 5, 6)
+ def __init__(self):
+ self.__data = []
+ self.__title = "Collection"
+ self.__description = "Description"
+ #self.__pic = gtk.gdk.pixbuf_new_from_file("collection.png")
- def set_coll_gui(self, coll_data):
- """ Set gui-elements according to Collection.data. """
- #WN.LV diesen Code ersetzen !!!!!
- _i = 0
- for _t in ['addsub_simp','passten','times_div']:
- self.button = gtk.Button()
- self.image = gtk.Image()
-
- if(_t == 'addsub_simp'):
- self.image.set_from_file("img/addsub_simp.jpg")
- elif(_t == 'passten'):
- self.image.set_from_file("img/passten.jpg")
- elif(_t == 'times_div'):
- self.image.set_from_file("img/times_div.jpg")
+ '''
+ def __init__(self, title, description, pic):
+ self.__data = []
+ self.__title = title
+ self.__description = description
+ self.__pic = pic
+ '''
- self.button.set_image(self.image)
- self.button.connect("clicked", self.select_exerc_callback, _i)
- self.topic_box.pack_start(self.button)
- self.button.show()
- _i = _i + 1
- self.topic_box.show()
-
- def select_exerc_callback(self, widget, coll_key):
- """ Callback telling the item from the collection selected. """
- #WN.LV diesen Code ersetzen> statt 1..n fuer Listen kommt coll_key
- print('in Collection.select_exerc_callback')
- if(self._active_exerc == None):
- # at startup
- self._active_exerc = coll_key
- self._display.set_select_exerc_semaphore(coll_key)
- #self._coach.notify(('exerc-selected', coll_key))
- elif(self._active_exerc == coll_key):
- # hit the same button once more
- pass
- elif(self._active_exerc != coll_key):
- # switched to another exercise
- self._active_exerc = coll_key
- self._display.switch_exercise() # TODO rename
- self._display.set_select_exerc_semaphore(coll_key)
- #self._coach.notify(('exerc-selected', coll_key))
-
+# def getData(self):
+# return self.__data
+#
+# def setData(self, data):
+# self.__data = data
+#
+# def getTitle(self):
+# return self.__title
+#
+# def setTitle(self, title):
+# self.__title = title
+#
+# def getDescription(self):
+# return self.__description
+#
+# def setDescription(self, description):
+# self.__description = description
+#
+# ''' keep for need, TODO icon reformatting icon to string
+# def getPic(self):
+# return self.__pic
+#
+# def setPic(self, pic):
+# self.__pic = pic
+# '''
+#
+# def get_data_from_pickle(self):
+# path = os.path.join(os.getcwd(), "data/Collection.data")
+# f = open(path, "rb")
+# root = pickle.load(f)
+# f.close()
+# return root
+#
+# def set_data_in_pickle(self, root):
+# path = os.path.join(os.getcwd(), "data/Collection.data")
+# f = open(path, "wb")
+# pickle.dump(root, f)
+# f.close()
+#
+#
+# def insert_object(self, obj, pos):
+# root = self.get_data_from_pickle()
+# list = root.getData()
+#
+# if (pos == None):
+# list.append(obj) # sonderfall ganz hinten einfügen
+# else:
+# max = len(pos)
+# for i in range(len(pos)):
+# try:
+# if isinstance(list[pos[i]], CollectionTest):
+# list = list[pos[i]].getData()
+# if (i == (max - 1)):
+# list.append(obj)
+# else:
+# list.insert(pos[i], obj)
+# except IndexError:
+# list.append(obj) # wenn in eigener collection verschoben wird, wurde ja element schon gelöscht daher passt index nicht mehr
+#
+# self.set_data_in_pickle(root)
+#
+#
+# def get_object(self, pos):
+# root = self.get_data_from_pickle()
+#
+# list = root.getData()
+#
+# # find object and return it to insert it in collection
+# for i in range(len(pos)):
+# if isinstance(list[pos[i]], CollectionTest):
+# obj = list[pos[i]]
+# list = list[pos[i]].getData()
+# else:
+# obj = list[pos[i]]
+#
+# list = root.getData()
+# max = len(pos)
+#
+# # find object and delete it in current collection
+# for i in range(len(pos)):
+# if isinstance(list[pos[i]], CollectionTest):
+# if (i == (max - 1)):
+# #collection löschen (evt. abfrage ob wirklich gelöscht werden soll inkl. kinder)
+# list.remove(obj)
+# else:
+# list = list[pos[i]].getData()
+# else:
+# #task löschen
+# list.remove(obj)
+#
+# self.set_data_in_pickle(root)
+# return obj
diff --git a/ReckonPrimer.activity/display.py b/ReckonPrimer.activity/display.py
index a1f9fcd..0f9a6d9 100755
--- a/ReckonPrimer.activity/display.py
+++ b/ReckonPrimer.activity/display.py
@@ -16,7 +16,12 @@ class Display:
Definition and manipulation of all GUI-elemts.
Exception (redesign?): def define_buttons in classes derived from Exercise.
"""
- print("in display, class definition")
+ print("in display, class definition")
+ # DnD for gtk_tree in
+ TARGETS = [
+ ('pixbuf', gtk.TARGET_SAME_WIDGET, 0),
+ ('text', gtk.TARGET_SAME_WIDGET, 1)
+ ]
def __init__(self, window):
self._permanent_gui_elements(window)
@@ -29,11 +34,12 @@ class Display:
# and Collection.select_exerc_callback
self._testvar = 'FOUND'
- def register(self, sess, co, learner):
+ def register(self, sess, co, learner, exstore):
"""register _after_ Session and Coach have been instantiated"""
self._sess = sess
self._co = co
self._learner = learner
+ self._exstore = exstore
def _permanent_gui_elements(self, window):
# The display is partitioned as follows
@@ -43,7 +49,7 @@ class Display:
#0+-------------------------+------------------------+
# | | |
#1| | OVERLAYS OF |
- # | scrolled_window | collection_table |
+ # | scrolled_window | exstore_table |
#2| | OR |
# | | settings_table |
#3+-------------------------+ OR |
@@ -90,17 +96,19 @@ class Display:
# 3 tables as overlays with same 15 lines and 6 columns
self.settings_table = gtk.Table (14, 9, True)
- self.collection_table = gtk.Table(14, 9, True)
+ self.exstore_table = gtk.Table(14, 9, True)
+ self.gtk_tree() #-->self.treeview
+ #@# self.exstore_table.attach(self.treeview, 0, 9, 0, 13)
self.feedback_table = gtk.Table (14, 9, True)
# Insert the 3 tables into the right half of the screen
self.table.attach(self.settings_table, 1, 2, 0, 5)
- self.table.attach(self.collection_table,1, 2, 0, 5)
+ self.table.attach(self.exstore_table, 1, 2, 0, 5)
self.table.attach(self.feedback_table, 1, 2, 0, 5)
# show all tables, scrolled_window already shown above
self.settings_table_show() # treat uniformly <>!
- self.collection_table.show() # treat uniformly !
+ self.exstore_table.show() # treat uniformly !
self.feedback_table.show() # treat uniformly !
self.table.show() # since all other tables have been inserted
@@ -139,9 +147,9 @@ class Display:
self.sec_butt.show()
def switch_setts_to_coll_callback(self, widget):
- """ Switch from settings_table to collection_table. """
+ """ Switch from settings_table to exstore_table. """
self.settings_table.hide()
- self.collection_table.show()
+ self.exstore_table.show()
def feedback_table_show(self):
"""RENAME to draw_feedback_screen"""
@@ -253,14 +261,14 @@ class Display:
print('in display.release_feedb_callback')
self.calc_table.destroy()
self.feedback_table_hide()
- self.collection_table.show() # from here the next user-interactions
+ self.exstore_table.show() # from here the next user-interactions
def release_sett_callback(self, widget):
""" Start calcs with these settings (probably updated). """
print('in display.release_sett_callback')
self._co.settings_done(self._ex._sett)
self.settings_table.hide()
- #self.collection_table.hide()
+ #self.exstore_table.hide()
self.feedback_table_show()
@@ -387,9 +395,9 @@ class Display:
self.calc_table.destroy()
def offer_coll_to_learner(self, collect):
- """TODO: get the users choice from buttons above the settings"""
- collect.define_coll_gui()
- collect.set_coll_gui(collect) # sets callbacks
+ """Show the exstore to the learner"""
+ collect.define_coll_gui() #@#
+ collect.set_coll_gui(collect) #@# sets callbacks
self.set_coll_to_learner() # set finish_learner_coll_butt + callb
def switch_exercise(self):
@@ -411,12 +419,12 @@ class Display:
self._coll_key = coll_key
def set_coll_to_learner(self):
- """ Set the permanent gui-elements for collection_table. """
+ """ Set the permanent gui-elements for exstore_table. """
print('in display.set_coll_to_learner')
# button switching from collect_table to calcs
self.flc_butt = gtk.Button(None, gtk.STOCK_GO_FORWARD)
self.flc_butt.connect("clicked", self.finish_learner_coll_callback)
- self.collection_table.attach(self.flc_butt, 0, 8, 13, 14)
+ self.exstore_table.attach(self.flc_butt, 0, 8, 13, 14)
self.flc_alignment = self.flc_butt.get_children()[0]
self.flc_hbox = self.flc_alignment.get_children()[0]
self.flc_image, self.flc_label = self.flc_hbox.get_children()
@@ -426,7 +434,7 @@ class Display:
# button switching from collect_table to settings_table
self.sts_butt = gtk.Button("")
self.sts_butt.connect("clicked", self.switch_learner_to_setts)
- self.collection_table.attach(self.sts_butt, 8, 9, 13, 14)
+ self.exstore_table.attach(self.sts_butt, 8, 9, 13, 14)
self.sts_alignment = self.sts_butt.get_children()[0]
self.sts_butt.show()
@@ -436,14 +444,112 @@ class Display:
print('in display.finish_learner_coll_callback, _coll_key=', self._coll_key)
if not(self._coll_key is None):
self._co.exercise_selected(self._coll_key)
- self.collection_table.hide()
+ self.exstore_table.hide()
self.feedback_table_show()
def switch_learner_to_setts(self, widget):
""" Callback on sts_butt. asks the Coach if allowed. """
self._co.switch_to_settings(self._coll_key)
- self.collection_table.hide()
+ self.exstore_table.hide()
def set_curr_exerc(self, exerc):
""" self._ex is needed for feedback_table etc. """
self._ex = exerc
+
+ def gtk_tree(self):
+ """
+ Define TreeStore and TreeView
+ """
+ self.treestore = gtk.TreeStore(gtk.gdk.Pixbuf, str)
+
+ self.treestore.clear()
+ #self._exstore.fill_store(self.treestore, None, None)
+
+ self.treeview = gtk.TreeView(self.treestore)
+ # create the TreeViewColumn to display the data
+ self.tvcolumn = gtk.TreeViewColumn('Uebungssammlung')
+
+ self.cellpb = gtk.CellRendererPixbuf()
+ self.tvcolumn.pack_start(self.cellpb, True)
+ self.tvcolumn.add_attribute(self.cellpb, 'pixbuf', 0)
+
+ # create a CellRendererText to render the data
+ self.cell = gtk.CellRendererText()
+
+ # add the cell to the tvcolumn and allow it to expand
+ self.tvcolumn.pack_start(self.cell, True)
+
+ # set the cell "text" attribute to column 0 - retrieve text
+ # from that column in treestore
+ self.tvcolumn.add_attribute(self.cell, 'text', 1)
+
+ # add tvcolumn to treeview
+ self.treeview.append_column(self.tvcolumn)
+
+ # make it searchable
+ self.treeview.set_search_column(0)
+
+ # Allow sorting on the column
+ self.tvcolumn.set_sort_column_id(-1)
+
+ # ab hier teil von robert
+ self.treeview.enable_model_drag_source(gtk.gdk.BUTTON1_MASK,
+ self.TARGETS,
+ gtk.gdk.ACTION_MOVE)
+ self.treeview.enable_model_drag_dest(self.TARGETS,
+ gtk.gdk.ACTION_MOVE)
+ self.treeview.connect("drag_data_get", self.drag_data_get_data)
+ self.treeview.connect("drag_data_received",
+ self.drag_data_received_data)
+ self.treeview.expand_all()
+
+ def drag_data_get_data(self, treeview, context, selection, target_id, etime):
+ # selection erfassen und pixbuf in string umwandeln
+ treeselection = treeview.get_selection()
+ model, iter = treeselection.get_selected()
+
+ # Tupel der die Drag Position angibt
+ path = self.treestore.get_path(iter)
+
+ print "Tree-Element: ", model.get_value(iter, 1)
+ print "Drag-Position: ", path
+ self.__from = path
+
+ iconstr = (model.get_value(iter, 0)).get_pixels()
+
+ title = model.get_value(iter, 1)
+ sep = "*"
+ data = iconstr + sep + title
+ selection.set(selection.target, 8, data)
+ return
+
+
+ def drag_data_received_data(self, treeview, context, x, y, selection, info, etime):
+ treeselection = treeview.get_selection()
+ model, from_parent = treeselection.get_selected()
+ model = treeview.get_model()
+ sep = "*"
+ data = selection.data
+ # aus pixel-string wieder pixbuf objekt erstellen
+ iconpixtemp, sep, title = data.partition(sep)
+ iconpix = gtk.gdk.pixbuf_new_from_data(iconpixtemp, gtk.gdk.COLORSPACE_RGB, True, 8, 10, 10, 40)
+ data = [iconpix, title]
+
+ c = CollectionTest()
+ obj = c.get_object(self.__from)
+ #obj = self.get_object(self.__from)
+
+ drop_info = treeview.get_dest_row_at_pos(x, y)
+ if drop_info:
+ self.__to = drop_info[0]
+
+ c.insert_object(obj, self.__to)
+ #self.insert_object(obj, self.__to)
+ self.treestore.clear()
+ self.fill_store(self.treestore, None, None)
+ self.treeview.expand_all()
+
+ if context.action == gtk.gdk.ACTION_MOVE:
+ context.finish(True, True, etime)
+ return
+
diff --git a/ReckonPrimer.activity/exstore.py b/ReckonPrimer.activity/exstore.py
new file mode 100644
index 0000000..308c2e6
--- /dev/null
+++ b/ReckonPrimer.activity/exstore.py
@@ -0,0 +1,215 @@
+# -*- coding: utf-8 -*-
+
+import gtk
+import pygtk
+import pango
+import random
+import copy
+from sugar.graphics import style
+
+from settings import Settings
+from coach import Coach
+
+from exercises.exaddsimp import ExAddSimp
+from exercises import *
+from exercises.exercise import Exercise
+
+
+class ExStore:
+
+ def __init__(self, display, coach):
+ self._sett = Settings()
+# #WN.LV diese Daten via pickle.load(...) holen ############
+# self._data = [(self._sett.get_setting('addsub_simp'), []),
+# (self._sett.get_setting('passten'), []),
+# (self._sett.get_setting('times_div'), [])]
+# #WN.LV [] ist die vorlaeufige Liste der errors ###########
+ self._data =
+ self._display = display
+ self._coach = coach
+ self._active_exerc = None
+ self.__data = []
+ self.__title = "Collection"
+ self.__description = "Description"
+ self.imagecollection = gtk.gdk.pixbuf_new_from_file(
+ "./img/collection.png")
+ self.imageexercise = gtk.gdk.pixbuf_new_from_file(
+ "./img/exercise.png")
+
+ def select(self, key):
+ """ Select an exercise by key. return instance of an exercise.
+ Errors are retrieved for (future) use by Coach. """
+ #WN.LV Code ersetzen: key ist dann fuer Listen von Listen !!
+ (_sett, _errors) = self._data[key]
+ exercise_label = _sett['topic']
+
+ if not Exercise.EXERCISES.has_key(exercise_label):
+ raise Exception('Collection#select: Wrong key. To register an exercise see exercises/__init__.py')
+
+ klass = Exercise.EXERCISES[exercise_label]
+ package = __import__("exercises." + klass.lower())
+ module = getattr(package, klass.lower())
+ return getattr(module, klass)(self._display, (_sett, _errors))
+
+
+ #@# vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
+ def define_coll_gui(self):
+ """ Define gui-elements for presenting the collection.
+ TODO: define once at startup of RP ?"""
+ #WN.LV diesen Code ersetzen: exstore_table.attach(self.colldata,...
+ self.topic_box = gtk.HBox(True, 0)
+ #self._display.exstore_table.attach(self.topic_box, 0, 6, 0, 1)
+ self._display.exstore_table.attach(self.topic_box, 0, 9, 5, 6)
+
+ def set_coll_gui(self, coll_data):
+ """ Set gui-elements according to Collection.data. """
+ #WN.LV diesen Code ersetzen !!!!!
+ _i = 0
+ for _t in ['addsub_simp','passten','times_div']:
+ self.button = gtk.Button()
+ self.image = gtk.Image()
+
+ if(_t == 'addsub_simp'):
+ self.image.set_from_file("img/addsub_simp.jpg")
+ elif(_t == 'passten'):
+ self.image.set_from_file("img/passten.jpg")
+ elif(_t == 'times_div'):
+ self.image.set_from_file("img/times_div.jpg")
+
+ self.button.set_image(self.image)
+ self.button.connect("clicked", self.select_exerc_callback, _i)
+ self.topic_box.pack_start(self.button)
+ self.button.show()
+ _i = _i + 1
+ self.topic_box.show()
+ #@# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+ def select_exerc_callback(self, widget, coll_key):
+ """ Callback telling the item from the collection selected. """
+ #WN.LV diesen Code ersetzen> statt 1..n fuer Listen kommt coll_key
+ print('in Collection.select_exerc_callback')
+ if(self._active_exerc == None):
+ # at startup
+ self._active_exerc = coll_key
+ self._display.set_select_exerc_semaphore(coll_key)
+ #self._coach.notify(('exerc-selected', coll_key))
+ elif(self._active_exerc == coll_key):
+ # hit the same button once more
+ pass
+ elif(self._active_exerc != coll_key):
+ # switched to another exercise
+ self._active_exerc = coll_key
+ self._display.switch_exercise() # TODO rename
+ self._display.set_select_exerc_semaphore(coll_key)
+ #self._coach.notify(('exerc-selected', coll_key))
+
+
+ def fill_store(self, ts, parent, list):
+ """ Fill treestore with data from disk. """
+ #c = CollectionTest()
+ root = self.get_data_from_pickle()
+
+ if list == None:
+ list = root.getData()
+
+ for i in range(len(list)):
+ if isinstance(list[i], CollectionTest):
+ olditer = ts.append(parent, [self.imagecollection, list[i].getTitle()])
+ c_list = list[i].getData()
+ self.fill_store(ts, olditer, c_list)
+ else:
+ text = list[i].getTitle() + ": " + list[i].getDescription()
+ iter = ts.append(parent, [self.imageexercise, text])
+
+ def getData(self):
+ return self.__data
+
+ def setData(self, data):
+ self.__data = data
+
+ def getTitle(self):
+ return self.__title
+
+ def setTitle(self, title):
+ self.__title = title
+
+ def getDescription(self):
+ return self.__description
+
+ def setDescription(self, description):
+ self.__description = description
+
+ ''' keep for need, TODO icon reformatting icon to string
+ def getPic(self):
+ return self.__pic
+
+ def setPic(self, pic):
+ self.__pic = pic
+ '''
+
+ def get_data_from_pickle(self):
+ path = os.path.join(os.getcwd(), "data/Collection.data")
+ f = open(path, "rb")
+ root = pickle.load(f)
+ f.close()
+ return root
+
+ def set_data_in_pickle(self, root):
+ path = os.path.join(os.getcwd(), "data/Collection.data")
+ f = open(path, "wb")
+ pickle.dump(root, f)
+ f.close()
+
+
+ def insert_object(self, obj, pos):
+ root = self.get_data_from_pickle()
+ list = root.getData()
+
+ if (pos == None):
+ list.append(obj) # sonderfall ganz hinten einfügen
+ else:
+ max = len(pos)
+ for i in range(len(pos)):
+ try:
+ if isinstance(list[pos[i]], CollectionTest):
+ list = list[pos[i]].getData()
+ if (i == (max - 1)):
+ list.append(obj)
+ else:
+ list.insert(pos[i], obj)
+ except IndexError:
+ list.append(obj) # wenn in eigener collection verschoben wird, wurde ja element schon gelöscht daher passt index nicht mehr
+
+ self.set_data_in_pickle(root)
+
+
+ def get_object(self, pos):
+ root = self.get_data_from_pickle()
+
+ list = root.getData()
+
+ # find object and return it to insert it in collection
+ for i in range(len(pos)):
+ if isinstance(list[pos[i]], CollectionTest):
+ obj = list[pos[i]]
+ list = list[pos[i]].getData()
+ else:
+ obj = list[pos[i]]
+
+ list = root.getData()
+ max = len(pos)
+
+ # find object and delete it in current collection
+ for i in range(len(pos)):
+ if isinstance(list[pos[i]], CollectionTest):
+ if (i == (max - 1)):
+ #collection löschen (evt. abfrage ob wirklich gelöscht werden soll inkl. kinder)
+ list.remove(obj)
+ else:
+ list = list[pos[i]].getData()
+ else:
+ #task löschen
+ list.remove(obj)
+
+ self.set_data_in_pickle(root)
+ return obj
diff --git a/ReckonPrimer.activity/img/collection.png b/ReckonPrimer.activity/img/collection.png
new file mode 100644
index 0000000..23a7de8
--- /dev/null
+++ b/ReckonPrimer.activity/img/collection.png
Binary files differ
diff --git a/ReckonPrimer.activity/img/exercise.png b/ReckonPrimer.activity/img/exercise.png
new file mode 100644
index 0000000..51c52b7
--- /dev/null
+++ b/ReckonPrimer.activity/img/exercise.png
Binary files differ
diff --git a/ReckonPrimer.activity/session.py b/ReckonPrimer.activity/session.py
index a399c73..33e7c3a 100755
--- a/ReckonPrimer.activity/session.py
+++ b/ReckonPrimer.activity/session.py
@@ -2,7 +2,7 @@
from author import Author
from coach import Coach
-from collection import Collection
+from exstore import ExStore
from display import Display
from learner import Learner
@@ -19,9 +19,10 @@ class Session:
self._co = Coach()
self._learner = Learner(self._dis, self._co)
self._author = Author()
- self._collect = Collection(self._dis, self._co)
- self._co.register(self, self._dis, self._collect, self._learner)
- self._dis.register(self, self._co, self._learner)
+ self._exstore = ExStore(self._dis, self._co)
+ self._co.register(self, self._dis, self._exstore, self._learner)
+ print("in session, before _dis.register")
+ self._dis.register(self, self._co, self._learner, self._exstore)
#self._co.create_exercises() #TODO.WN091101 replace by storing Exerc.s
self._calcs = None #pop !
diff --git a/ReckonPrimer.activity/task.py b/ReckonPrimer.activity/task.py
new file mode 100644
index 0000000..ddb64ee
--- /dev/null
+++ b/ReckonPrimer.activity/task.py
@@ -0,0 +1,33 @@
+'''
+author: Bernhard Ruttinger
+date: 02.12.2009
+description: test class "task" to test our new idea for saving all tasks
+'''
+
+class Task:
+ __title = None
+ __description = None
+ __settings = None
+
+ def __init__(self):
+ self.__title = "title"
+ self.__description = "description"
+ self.__settings = "settings"
+
+ def getTitle(self):
+ return self.__title
+
+ def setTitle(self, title):
+ self.__title = title
+
+ def getDescription(self):
+ return self.__description
+
+ def setDescription(self, description):
+ self.__description = description
+
+ def getSettings(self):
+ return self.__settings
+
+ def setSettings(self, settings):
+ self.__settings = settings
diff --git a/ReckonPrimer.activity/treeview_icon.py b/ReckonPrimer.activity/treeview_icon.py
new file mode 100644
index 0000000..9b45c25
--- /dev/null
+++ b/ReckonPrimer.activity/treeview_icon.py
@@ -0,0 +1,247 @@
+# -*- coding: utf-8 -*-
+
+"""
+author: Bernhard Ruttinger, Robert Gröbl
+date: 07.01.2010 treeview_icon Version 0.3 (first test with drag and drop)
+description: it's the first attempt for drag and drop on display layer.
+ problem with icons is fixed
+ print with Drag and with Drop positions
+"""
+
+import gtk
+import pygtk
+import pickle
+import os
+from collection import CollectionTest
+from task import Task
+
+class TreeViewExampleWithIcon:
+
+ # Allowed targets for DnD
+ TARGETS = [
+ ('pixbuf', gtk.TARGET_SAME_WIDGET, 0),
+ ('text', gtk.TARGET_SAME_WIDGET, 1)
+ ]
+
+ # close the window and quit
+
+ def __init__(self):
+ self.__from = None
+ self.__to = None
+
+ # create a new window
+ self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
+ self.window.set_title("TreeView")
+ self.window.set_size_request(400, 400)
+ self.window.connect("delete_event", self.delete_event)
+
+ # create a TreeStore with one string column to use as the model
+# self.treestore = gtk.TreeStore(gtk.gdk.Pixbuf, str)
+#
+# self.imagecollection = gtk.gdk.pixbuf_new_from_file("collection.png")
+# self.imageexercise = gtk.gdk.pixbuf_new_from_file("exercise.png")
+#
+# self.treestore.clear()
+# self.fill_store(self.treestore, None, None)
+#
+# self.treeview = gtk.TreeView(self.treestore)
+# # create the TreeViewColumn to display the data
+# self.tvcolumn = gtk.TreeViewColumn('Uebungssammlung')
+#
+# self.cellpb = gtk.CellRendererPixbuf()
+# self.tvcolumn.pack_start(self.cellpb, True)
+# self.tvcolumn.add_attribute(self.cellpb, 'pixbuf', 0)
+#
+# # create a CellRendererText to render the data
+# self.cell = gtk.CellRendererText()
+#
+# # add the cell to the tvcolumn and allow it to expand
+# self.tvcolumn.pack_start(self.cell, True)
+#
+# # set the cell "text" attribute to column 0 - retrieve text
+# # from that column in treestore
+# self.tvcolumn.add_attribute(self.cell, 'text', 1)
+#
+# # add tvcolumn to treeview
+# self.treeview.append_column(self.tvcolumn)
+#
+# # make it searchable
+# self.treeview.set_search_column(0)
+#
+# # Allow sorting on the column
+# self.tvcolumn.set_sort_column_id(-1)
+#
+# # ab hier teil von robert
+#
+# self.treeview.enable_model_drag_source(gtk.gdk.BUTTON1_MASK,
+# self.TARGETS,
+# gtk.gdk.ACTION_MOVE)
+#
+# self.treeview.enable_model_drag_dest(self.TARGETS,
+# gtk.gdk.ACTION_MOVE)
+#
+# self.treeview.connect("drag_data_get", self.drag_data_get_data)
+# self.treeview.connect("drag_data_received", self.drag_data_received_data)
+#
+# self.treeview.expand_all()
+ self.window.add(self.treeview)
+ self.window.show_all()
+
+ def delete_event(self, widget, event, data = None):
+ gtk.main_quit()
+ return False
+
+
+ def fill_store(self, ts, parent, list):
+ c = CollectionTest()
+ root = c.get_data_from_pickle()
+
+ if list == None:
+ list = root.getData()
+
+ for i in range(len(list)):
+ if isinstance(list[i], CollectionTest):
+ olditer = ts.append(parent, [self.imagecollection, list[i].getTitle()])
+ c_list = list[i].getData()
+ self.fill_store(ts, olditer, c_list)
+ else:
+ text = list[i].getTitle() + ": " + list[i].getDescription()
+ iter = ts.append(parent, [self.imageexercise, text])
+
+
+ def drag_data_get_data(self, treeview, context, selection, target_id, etime):
+ # selection erfassen und pixbuf in string umwandeln
+ treeselection = treeview.get_selection()
+ model, iter = treeselection.get_selected()
+
+ # Tupel der die Drag Position angibt
+ path = self.treestore.get_path(iter)
+
+ print "Tree-Element: ", model.get_value(iter, 1)
+ print "Drag-Position: ", path
+ self.__from = path
+
+ iconstr = (model.get_value(iter, 0)).get_pixels()
+
+ title = model.get_value(iter, 1)
+ sep = "*"
+ data = iconstr + sep + title
+ selection.set(selection.target, 8, data)
+ return
+
+
+ def drag_data_received_data(self, treeview, context, x, y, selection, info, etime):
+ treeselection = treeview.get_selection()
+ model, from_parent = treeselection.get_selected()
+ model = treeview.get_model()
+ sep = "*"
+ data = selection.data
+ # aus pixel-string wieder pixbuf objekt erstellen
+ iconpixtemp, sep, title = data.partition(sep)
+ iconpix = gtk.gdk.pixbuf_new_from_data(iconpixtemp, gtk.gdk.COLORSPACE_RGB, True, 8, 10, 10, 40)
+ data = [iconpix, title]
+
+ c = CollectionTest()
+ obj = c.get_object(self.__from)
+ #obj = self.get_object(self.__from)
+
+ drop_info = treeview.get_dest_row_at_pos(x, y)
+ if drop_info:
+ self.__to = drop_info[0]
+
+ c.insert_object(obj, self.__to)
+ #self.insert_object(obj, self.__to)
+ self.treestore.clear()
+ self.fill_store(self.treestore, None, None)
+ self.treeview.expand_all()
+
+ if context.action == gtk.gdk.ACTION_MOVE:
+ context.finish(True, True, etime)
+ return
+
+
+def main():
+ gtk.main()
+
+if __name__ == "__main__":
+ #'''
+ filesystem = CollectionTest() # entspricht dem gesamten Filesystem = Überliste
+
+ c1 = CollectionTest()
+ c1.setTitle("Addieren leicht")
+
+ c2 = CollectionTest()
+ c2.setTitle("Hausuebungen")
+
+ c3 = CollectionTest()
+ c3.setTitle("Addieren sehr leicht")
+
+ ex1 = Task()
+ ex1.setTitle("Aufgabe 1")
+ ex1.setDescription("Addieren mit Zahlen von 2-5")
+ ex1.setSettings("2345+")
+
+ ex2 = Task()
+ ex2.setTitle("Aufgabe 2")
+ ex2.setDescription("Addieren bis 10")
+ ex2.setSettings("123456789+")
+
+ ex3 = Task()
+ ex3.setTitle("Hausuebung bis 26.11.2009")
+ ex3.setDescription("Rechnen bis 4")
+ ex3.setSettings("1234+")
+
+ ex4 = Task()
+ ex4.setTitle("Hausuebung bis 04.12.2009")
+ ex4.setDescription("Rechnen bis 7")
+ ex4.setSettings("1234567+-")
+
+ ex5 = Task()
+ ex5.setTitle("Multiplizieren")
+ ex5.setDescription("Multiplizieren mit Zahlen bis 5")
+ ex5.setSettings("12345*")
+
+ ex6 = Task()
+ ex6.setTitle("Aufgabe 1")
+ ex6.setDescription("erstes mal addieren")
+ ex6.setSettings("12+")
+
+ ex7 = Task()
+ ex7.setTitle("Aufgabe 2")
+ ex7.setDescription("zweites mal addieren")
+ ex7.setSettings("123+")
+
+ list = [ex6, ex7]
+ c3.setData(list)
+
+ list = [ex1, ex2, c3]
+ c1.setData(list)
+
+ list = [ex3, ex4]
+ c2.setData(list)
+
+ list = [c1, c2, ex5]
+ filesystem.setData(list)
+
+ # pickle erstellen
+ path = os.path.join(os.getcwd(), "data")
+ path = path + "/" + filesystem.getTitle() + ".data"
+ f = open(path, "wb")
+ pickle.dump(filesystem, f)
+ f.close()
+
+ del filesystem
+ del c1
+ del c2
+ del c3
+ del ex1
+ del ex2
+ del ex3
+ del ex4
+ del ex5
+ del ex6
+ del ex7
+ #'''
+
+ tvexample = TreeViewExampleWithIcon()
+ main()
diff --git a/ReckonPrimer.tests/collection/__init__.py b/ReckonPrimer.tests/exstore/__init__.py
index 8abc8d0..8abc8d0 100644
--- a/ReckonPrimer.tests/collection/__init__.py
+++ b/ReckonPrimer.tests/exstore/__init__.py
diff --git a/ReckonPrimer.tests/collection/test_collection_WW091215.py b/ReckonPrimer.tests/exstore/test_collection_WW091215.py
index b8008c8..b8008c8 100644
--- a/ReckonPrimer.tests/collection/test_collection_WW091215.py
+++ b/ReckonPrimer.tests/exstore/test_collection_WW091215.py
diff --git a/ReckonPrimer.tests/collection/test_perfect_minimum.py b/ReckonPrimer.tests/exstore/test_perfect_minimum.py
index 8e1134b..8e1134b 100644
--- a/ReckonPrimer.tests/collection/test_perfect_minimum.py
+++ b/ReckonPrimer.tests/exstore/test_perfect_minimum.py