# Copyright (C) 2009, Tomeu Vizoso # # 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import logging import gobject import gtk import cjson from sugar import dispatch class MindMapModel(gtk.TreeStore): def __init__(self): gtk.TreeStore.__init__(self, int, str, long, long, str) self._next_thought_id = 0 self._thoughts_by_id = {} self._thoughts = [] def create_new_thought(self, name='', x=0, y=0, color='', parent_id=None): thought_id = self._next_thought_id parent = None if parent_id is not None: parent = self.find_by_id(parent_id).iter self.append(parent, (thought_id, name, x, y, color)) self._next_thought_id += 1 return thought_id def _serialize_thoughts(self, rows): thoughts = [] for row in rows: thought_dict = {} thoughts.append(thought_dict) thought_dict['id'] = row[0] thought_dict['name'] = row[1] thought_dict['x'] = row[2] thought_dict['y'] = row[3] thought_dict['color'] = row[4] children = self._serialize_thoughts(row.iterchildren()) thought_dict['children'] = children return thoughts def serialize(self): return cjson.encode({'thoughts': self._serialize_thoughts(self)}) def unserialize(self, data): thoughts = cjson.decode(data)['thoughts'] self._unserialize_thoughts(parent=None, thoughts=thoughts) def _unserialize_thoughts(self, parent, thoughts): for thought_dict in thoughts: self._next_thought_id = max(self._next_thought_id + 1, thought_dict['id'] + 1) new_row = self.append(parent, (thought_dict['id'], thought_dict.get('name', None), thought_dict.get('x', None), thought_dict.get('y', None), thought_dict.get('color', None))) children = thought_dict.get('children', []) self._unserialize_thoughts(parent=new_row, thoughts=children) def find_by_id(self, thought_id, rows=None): if rows is None: rows = self for row in rows: if row[0] == thought_id: return row children = row.iterchildren() found_row = self.find_by_id(thought_id, children) if found_row is not None: return found_row return None