From 1168885f8eb9d071097f454a27c5cd3e4d3c252e Mon Sep 17 00:00:00 2001 From: Walther Neuper Date: Mon, 11 Jan 2010 17:38:34 +0000 Subject: inserted treeview, but old version runs --- 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 -- cgit v0.9.1