changeset d97926068f3c in /home/hg/repos/gajim details:http://hg.gajim.org/gajim?cmd=changeset;node=d97926068f3c description: Now there is valid SVG produced
diffstat: src/whiteboardwidget.py | 142 +++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 142 insertions(+), 0 deletions(-) diffs (146 lines): diff -r a6060b725966 -r d97926068f3c src/whiteboardwidget.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/whiteboardwidget.py Thu Jun 25 22:43:44 2009 -0700 @@ -0,0 +1,142 @@ +import gtk +import goocanvas +from xml.dom.minidom import Document + +""" +A whiteboard widget made for Gajim. Only has basic line tool that draws +SVG Paths. +- Ummu +""" + +class Whiteboard(goocanvas.Canvas): + def __init__(self): + goocanvas.Canvas.__init__(self) + self.set_flags(gtk.CAN_FOCUS) + self.root = self.get_root_item() + + # Events + self.connect("button-press-event", self.button_press_event) + self.connect("button-release-event", self.button_release_event) + self.connect("motion-notify-event", self.motion_notify_event) + self.connect("key-press-event", self.key_press_event) + + # Config + self.draw_tool = 'brush' + self.line_width = 3 + + # SVG Storage + #TODO: get height width info + self.image = SVGObject(self.root) + + # Temporary Variables for items + self.item_temp = None + self.item_data = None + + + + def button_press_event(self, widget, event): + x = event.x + y = event.y + state = event.state + + if self.draw_tool == 'brush': + self.item_data = 'M %s,%s L ' % (x, y) + self.item_temp = goocanvas.Path(parent = self.root, + data = self.item_data + 'z', + line_width = self.line_width) + self.request_update() + + def motion_notify_event(self, widget, event): + x = event.x + y = event.y + state = event.state + if self.item_temp is not None: + self.item_temp.remove() + + if self.draw_tool == 'brush': + if self.item_data is not None: + self.item_data = self.item_data + '%s,%s ' % (x, y) + self.item_temp = goocanvas.Path(parent = self.root, + data = self.item_data, + line_width = self.line_width) + + def button_release_event(self, widget, event): + x = event.x + y = event.y + state = event.state + + if self.draw_tool == 'brush': + self.item_data = self.item_data + '%s,%s' % (x, y) + self.image.add_path(self.item_data, self.line_width) + + self.item_data = None + if self.item_temp is not None: + self.item_temp.remove() + self.item_temp = None + + def key_press_event(self, widget, event): + print 'test' + if event.keyval == 'p': + self.image.print_xml() + +class SVGObject(): + ''' A class to store the svg document and make changes to it. + Stores items in a tuple that's (minidom node, goocanvas object).''' + + def __init__(self, root, height = 1000, width = 1000): + self.items = [] + self.root = root + + # initialize svg document + self.doc = Document() + self.svg = self.doc.createElement('svg') + self.svg.setAttribute('version', '1.1') + self.svg.setAttribute('height', str(height)) + self.svg.setAttribute('width', str(width)) + self.svg.setAttribute('xmlns', 'http://www.w3.org/2000/svg') + self.doc.appendChild(self.svg) + #TODO: make this settable + self.g = self.doc.createElement('g') + self.g.setAttribute('fill', 'none') + self.g.setAttribute('stroke-linecap', 'round') + self.svg.appendChild(self.g) + + def add_path(self, data, line_width): + ''' adds the path to the items listing, both minidom node and goocanvas + object in a tuple ''' + + goocanvas_obj = self.items.append(goocanvas.Path(parent = self.root, + data = data, + line_width = line_width)) + + minidom_obj = self.doc.createElement('path') + minidom_obj.setAttribute('d', data) + minidom_obj.setAttribute('stroke-width', str(line_width)) + minidom_obj.setAttribute('stroke', 'black') + self.g.appendChild(minidom_obj) + + self.items.append((minidom_obj, goocanvas_obj)) + self.print_xml() + + def print_xml(self): + file = open('whiteboardtest.svg','w') + file.writelines(self.doc.toprettyxml(' ')) + file.close() + + +def main(): + window = gtk.Window() + window.set_events(gtk.gdk.EXPOSURE_MASK + | gtk.gdk.LEAVE_NOTIFY_MASK + | gtk.gdk.BUTTON_PRESS_MASK + | gtk.gdk.POINTER_MOTION_MASK + | gtk.gdk.KEY_PRESS_MASK) + board = Whiteboard() + window.add(board) + window.connect("destroy", gtk.main_quit) + window.show_all() + + gtk.main() + +if __name__ == "__main__": + main() _______________________________________________ Commits mailing list Commits@gajim.org http://lists.gajim.org/cgi-bin/listinfo/commits