From 1c54ef5002071ceb408b25a47de25c1458f7aaee Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Sun, 21 May 2006 00:29:20 -0400 Subject: [PATCH] Make colors work in Sketch --- configure.ac | 3 +- sugar/browser/Makefile.am | 2 -- sugar/browser/browser.py | 2 -- sugar/chat/Makefile.am | 6 +--- sugar/chat/chat.py | 7 +++-- sugar/chat/richtext.py | 48 ++++++++----------------------- sugar/chat/sketchpad/Sketch.py | 13 +++++---- sugar/chat/sketchpad/SketchPad.py | 21 ++++++++------ sugar/chat/sketchpad/Toolbox.py | 10 +++++-- sugar/env.py | 3 -- sugar/session/session.py | 2 +- 11 files changed, 47 insertions(+), 70 deletions(-) diff --git a/configure.ac b/configure.ac index 097cc0a5..434bd514 100644 --- a/configure.ac +++ b/configure.ac @@ -1,4 +1,4 @@ -AC_INIT([Sugar],[0.6],[],[sugar]) +AC_INIT([Sugar],[0.4],[],[sugar]) AC_PREREQ([2.59]) @@ -21,7 +21,6 @@ sugar/Makefile sugar/__installed__.py sugar/browser/Makefile sugar/chat/Makefile -sugar/chat/sketchpad/Makefile sugar/p2p/Makefile sugar/p2p/model/Makefile sugar/shell/Makefile diff --git a/sugar/browser/Makefile.am b/sugar/browser/Makefile.am index 7aacdd8a..4bf03d2a 100644 --- a/sugar/browser/Makefile.am +++ b/sugar/browser/Makefile.am @@ -16,6 +16,4 @@ activitydir = $(pkgdatadir)/activities activity_DATA = browser.activity EXTRA_DIST = \ - $(rc_DATA) \ - $(activity_DATA) \ $(icon_DATA) diff --git a/sugar/browser/browser.py b/sugar/browser/browser.py index 1bc61608..cec6e096 100755 --- a/sugar/browser/browser.py +++ b/sugar/browser/browser.py @@ -322,8 +322,6 @@ class BrowserShell(dbus.service.Object): get_instance = staticmethod(get_instance) def __init__(self): - geckoembed.set_profile_path(sugar.env.get_user_dir()) - session_bus = dbus.SessionBus() bus_name = dbus.service.BusName('com.redhat.Sugar.Browser', bus=session_bus) object_path = '/com/redhat/Sugar/Browser' diff --git a/sugar/chat/Makefile.am b/sugar/chat/Makefile.am index c43ba873..4197815e 100644 --- a/sugar/chat/Makefile.am +++ b/sugar/chat/Makefile.am @@ -1,5 +1,3 @@ -SUBDIRS = sketchpad - sugardir = $(pythondir)/sugar/chat sugar_PYTHON = \ __init__.py \ @@ -14,6 +12,4 @@ icon_DATA = \ activitydir = $(pkgdatadir)/activities activity_DATA = chat.activity -EXTRA_DIST = \ - $(icon_DATA) \ - $(activity_DATA) +EXTRA_DIST = $(icon_DATA) diff --git a/sugar/chat/chat.py b/sugar/chat/chat.py index cb472fba..a04b8b4b 100755 --- a/sugar/chat/chat.py +++ b/sugar/chat/chat.py @@ -19,7 +19,6 @@ from sugar.p2p.Stream import Stream from sugar.session.LogWriter import LogWriter from sugar.chat.sketchpad.Toolbox import Toolbox from sugar.chat.sketchpad.SketchPad import SketchPad -from sugar.chat.Emoticons import Emoticons import sugar.env import richtext @@ -48,6 +47,7 @@ class Chat(activity.Activity): toolbox = Toolbox() toolbox.connect('tool-selected', self._tool_selected) + toolbox.connect('color-selected', self._color_selected) vbox.pack_start(toolbox, False) toolbox.show() @@ -64,6 +64,9 @@ class Chat(activity.Activity): def __send_button_clicked_cb(self, button): self.send_sketch(self._sketchpad.to_svg()) + + def _color_selected(self, toolbox, color): + self._sketchpad.set_color(color) def _tool_selected(self, toolbox, tool_id): if tool_id == 'text': @@ -193,8 +196,6 @@ class Chat(activity.Activity): # FIXME self._controller.notify_activate(self) def _insert_rich_message(self, nick, msg): - msg = Emoticons.get_instance().replace(msg) - buf = self._chat_view.get_buffer() aniter = buf.get_end_iter() buf.insert(aniter, nick + ": ") diff --git a/sugar/chat/richtext.py b/sugar/chat/richtext.py index 5aa44f7c..543e431e 100644 --- a/sugar/chat/richtext.py +++ b/sugar/chat/richtext.py @@ -59,7 +59,7 @@ class RichTextView(gtk.TextView): it = self.__get_event_iter(event) if it and self.__iter_is_link(it): buf = self.get_buffer() - address_tag = buf.get_tag_table().lookup("object-id") + address_tag = buf.get_tag_table().lookup("link-address") address_end = it.copy() address_end.backward_to_tag_toggle(address_tag) @@ -81,18 +81,9 @@ class RichTextBuffer(gtk.TextBuffer): def append_link(self, title, address): it = self.get_iter_at_mark(self.get_insert()) - self.insert_with_tags_by_name(it, address, "link", "object-id") + self.insert_with_tags_by_name(it, address, "link", "link-address") self.insert_with_tags_by_name(it, title, "link") - - def append_icon(self, name, it = None): - if not it: - it = self.get_iter_at_mark(self.get_insert()) - - self.insert_with_tags_by_name(it, name, "icon", "object-id") - icon_theme = gtk.icon_theme_get_default() - pixbuf = icon_theme.load_icon(name, 16, 0) - self.insert_pixbuf(it, pixbuf) - + def apply_tag(self, tag_name): self.active_tags.append(tag_name) @@ -110,13 +101,11 @@ class RichTextBuffer(gtk.TextBuffer): self.remove_tag_by_name(tag_name, start, end) def __create_tags(self): - tag = self.create_tag("icon") - tag = self.create_tag("link") tag.set_property("underline", pango.UNDERLINE_SINGLE) tag.set_property("foreground", "#0000FF") - tag = self.create_tag("object-id") + tag = self.create_tag("link-address") tag.set_property("invisible", True) tag = self.create_tag("bold") @@ -235,8 +224,6 @@ class RichTextHandler(xml.sax.handler.ContentHandler): self.tags.append(tag) if name == "link": self.href = attrs['href'] - elif name == "icon": - self.buf.append_icon(attrs['name'], self.buf.get_end_iter()) def characters(self, data): start_it = it = self.buf.get_end_iter() @@ -248,8 +235,8 @@ class RichTextHandler(xml.sax.handler.ContentHandler): self.buf.apply_tag_by_name(tag, start_it, it) if tag == "link": self.buf.insert_with_tags_by_name(start_it, self.href, - "link", "object-id") - + "link", "link-address") + def endElement(self, name): if not self._done and self._in_richtext: if name != "richtext": @@ -271,17 +258,9 @@ class RichTextSerializer: return "font-size-" + attributes["size"] elif el_name == "link": return "link" - elif el_name == "icon": - return "icon" else: return None - def _parse_object_id(self, it): - object_id_tag = self.buf.get_tag_table().lookup("object-id") - end = it.copy() - end.forward_to_tag_toggle(object_id_tag) - return self.buf.get_text(it, end) - def serialize_tag_start(self, tag, it): name = tag.get_property("name") if name == "bold": @@ -289,12 +268,12 @@ class RichTextSerializer: elif name == "italic": return "" elif name == "link": - address = self._parse_object_id(it) + address_tag = self.buf.get_tag_table().lookup("link-address") + end = it.copy() + end.forward_to_tag_toggle(address_tag) + address = self.buf.get_text(it, end) return "" - elif name == "icon": - name = self._parse_object_id(it) - return "" - elif name == "object-id": + elif name == "link-address": return "" elif name.startswith("font-size-"): tag_name = name.replace("font-size-", "", 1) @@ -310,9 +289,7 @@ class RichTextSerializer: return "" elif name == "link": return "" - elif name == "icon": - return "" - elif name == "object-id": + elif name == "link-address": return "" elif name.startswith("font-size-"): return "" @@ -392,7 +369,6 @@ if __name__ == "__main__": test_xml += "Test two" test_xml += "Test three" test_xml += "Test link" - test_xml += "" test_xml += "" RichTextSerializer().deserialize(test_xml, rich_buf) diff --git a/sugar/chat/sketchpad/Sketch.py b/sugar/chat/sketchpad/Sketch.py index 8c70f8d4..3504b83b 100644 --- a/sugar/chat/sketchpad/Sketch.py +++ b/sugar/chat/sketchpad/Sketch.py @@ -1,25 +1,27 @@ from SVGdraw import path class Sketch: - def __init__(self): + def __init__(self, rgb): self._points = [] + self._rgb = (float(rgb[0]), float(rgb[1]), float(rgb[2])) def add_point(self, x, y): - self._points.append([x, y]) + self._points.append((x, y)) def draw(self, ctx): start = True - for [x, y] in self._points: + for (x, y) in self._points: if start: ctx.move_to(x, y) start = False else: ctx.line_to(x, y) + ctx.set_source_rgb(self._rgb[0], self._rgb[1], self._rgb[2]) ctx.stroke() def draw_to_svg(self): i = 0 - for [x, y] in self._points: + for (x, y) in self._points: coords = str(x) + ' ' + str(y) + ' ' if i == 0: path_data = 'M ' + coords @@ -28,4 +30,5 @@ class Sketch: else: path_data += coords i += 1 - return path(path_data, fill = 'none', stroke = '#000000') + color = "#%02X%02X%02X" % (255 * self._rgb[0], 255 * self._rgb[1], 255 * self._rgb[2]) + return path(path_data, fill = 'none', stroke = color) diff --git a/sugar/chat/sketchpad/SketchPad.py b/sugar/chat/sketchpad/SketchPad.py index 93193784..150b6fbb 100644 --- a/sugar/chat/sketchpad/SketchPad.py +++ b/sugar/chat/sketchpad/SketchPad.py @@ -13,6 +13,7 @@ class SketchPad(gtk.DrawingArea): gtk.DrawingArea.__init__(self) self._active_sketch = None + self._rgb = (0.0, 0.0, 0.0) self._sketches = [] self.add_events(gtk.gdk.BUTTON_PRESS_MASK | @@ -23,6 +24,7 @@ class SketchPad(gtk.DrawingArea): self.connect('expose_event', self.expose) def expose(self, widget, event): + """Draw the background of the sketchpad.""" rect = self.get_allocation() ctx = widget.window.cairo_create() @@ -38,27 +40,28 @@ class SketchPad(gtk.DrawingArea): return False + def set_color(self, color): + """Sets the current drawing color of the sketchpad. + color agument should be 3-item tuple of rgb values between 0 and 1.""" + self._rgb = color + def add_sketch(self, sketch): self._sketches.append(sketch) - def add_point(self, event): - if self._active_sketch: - self._active_sketch.add_point(event.x, event.y) - self.window.invalidate_rect(None, False) - def __button_press_cb(self, widget, event): - self._active_sketch = Sketch() + self._active_sketch = Sketch(self._rgb) self.add_sketch(self._active_sketch) - self.add_point(event) def __button_release_cb(self, widget, event): - self.add_point(event) self._active_sketch = None def __motion_notify_cb(self, widget, event): - self.add_point(event) + if self._active_sketch: + self._active_sketch.add_point(event.x, event.y) + self.window.invalidate_rect(None, False) def to_svg(self): + """Return a string containing an SVG representation of this sketch.""" d = drawing() s = svg() for sketch in self._sketches: diff --git a/sugar/chat/sketchpad/Toolbox.py b/sugar/chat/sketchpad/Toolbox.py index bf56ccc4..7ed814ad 100644 --- a/sugar/chat/sketchpad/Toolbox.py +++ b/sugar/chat/sketchpad/Toolbox.py @@ -18,6 +18,9 @@ class ColorButton(gtk.RadioButton): self.add(drawing_area) drawing_area.show() + def color(self): + return self._rgb + def expose(self, widget, event): rect = widget.get_allocation() ctx = widget.window.cairo_create() @@ -31,7 +34,9 @@ class ColorButton(gtk.RadioButton): class Toolbox(gtk.VBox): __gsignals__ = { 'tool-selected': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, - ([gobject.TYPE_STRING])) + ([gobject.TYPE_STRING])), + 'color-selected': (gobject.SIGNAL_RUN_FIRST, gobject.TYPE_NONE, + ([gobject.TYPE_PYOBJECT])) } def __init__(self): @@ -96,4 +101,5 @@ class Toolbox(gtk.VBox): self.emit("tool-selected", tool_id) def __color_clicked_cb(self, button, rgb): - pass + self.emit("color-selected", button.color()) + diff --git a/sugar/env.py b/sugar/env.py index ffea539a..9359409b 100644 --- a/sugar/env.py +++ b/sugar/env.py @@ -4,9 +4,6 @@ try: from sugar.__uninstalled__ import * except ImportError: from sugar.__installed__ import * - -def get_user_dir(): - return os.path.expanduser('~/.sugar/') def get_data_file(filename): for data_dir in get_data_dirs(): diff --git a/sugar/session/session.py b/sugar/session/session.py index 4d57a208..df0a0db4 100644 --- a/sugar/session/session.py +++ b/sugar/session/session.py @@ -20,7 +20,7 @@ def start(console): act_dir = os.path.join(data_dir, env.get_activities_dir()) activities_dirs.append(act_dir) - activities_dirs.append(os.path.join(env.get_user_dir(), 'activities')) + activities_dirs.append(os.path.expanduser('~/.sugar/activities')) for activities_dir in activities_dirs: if os.path.isdir(activities_dir):