From 5eb10bd2a285fa00fb548978e9e07bc08c16da4a Mon Sep 17 00:00:00 2001 From: Doug Blank Date: Mon, 10 Mar 2008 04:37:45 +0000 Subject: [PATCH] Added ability to have URL links on textbuffer; fixed writable age on date gramplet; draft FAQ gramplet svn: r10254 --- src/DataViews/GrampletView.py | 81 ++++++++++++++++++++++++++------- src/plugins/DefaultGramplets.py | 18 ++++++++ 2 files changed, 82 insertions(+), 17 deletions(-) diff --git a/src/DataViews/GrampletView.py b/src/DataViews/GrampletView.py index 60398947f..647d8940f 100644 --- a/src/DataViews/GrampletView.py +++ b/src/DataViews/GrampletView.py @@ -86,6 +86,21 @@ def register(**data): else: print ("Plugin did not define type.") +def parse_tag_attr(text): + text = text.strip() + parts = text.split(" ", 1) + attrs = {} + if len(parts) == 2: + attr_values = parts[1].split(" ") # "name=value name=value" + for av in attr_values: + attribute, value = av.split("=") + value = value.strip() + # trim off quotes: + if value[0] == value[-1] and value[0] in ['"', "'"]: + value = value[1:-1] + attrs[attribute.strip().lower()] = value + return [parts[0].upper(), attrs] + def get_gramplet_opts(name, opts): if name in AVAILABLE_GRAMPLETS: data = AVAILABLE_GRAMPLETS[name] @@ -256,6 +271,11 @@ class Gramplet(object): if debug: print "%s is connecting" % self.gui.title pass + def link_region(self, start, stop, link_type, url): + link_data = (LinkTag(self.gui.buffer), link_type, url, url) + self._tags.append(link_data) + self.gui.buffer.apply_tag(link_data[0], start, stop) + def link(self, text, link_type, data, size=None, tooltip=None): buffer = self.gui.buffer iter = buffer.get_end_iter() @@ -289,9 +309,6 @@ class Gramplet(object): def append_text(self, text, scroll_to="end"): self.gui.append_text(text, scroll_to) - def render_text(self, text): - self.gui.render_text(text) - def set_use_markup(self, value): self.gui.set_use_markup(value) @@ -438,6 +455,15 @@ class Gramplet(object): 'filterbyname', handle) return True + elif link_type == 'URL': + if event.button == 1: # left mouse + GrampsDisplay.url(handle) + return True + elif link_type == 'WIKI': + if event.button == 1: # left mouse + GrampsDisplay.help('gramplet', + handle.replace(" ", "_")) + return True elif link_type == 'PersonList': if event.button == 1: # left mouse if event.type == gtk.gdk._2BUTTON_PRESS: # double @@ -605,24 +631,34 @@ class GuiGramplet: self.buffer.insert_at_cursor(text) def render_text(self, text): - markup_pos = {"B": [], "I": [], "U": []} + markup_pos = {"B": [], "I": [], "U": [], "A": []} retval = "" i = 0 r = 0 + tag = "" while i < len(text): - if text[i] == "<": - if text[i+1] == "/" and text[i+3] == ">": - markup = text[i+2].upper() - markup_pos[markup][-1].append(r) - i += 4 - elif text[i+2] == ">": - markup = text[i+1].upper() - markup_pos[markup].append([r]) - i += 3 - else: + if text[i:i+2] == "") + if stop < 0: retval += text[i] r += 1 i += 1 + else: + markup = text[i+2:i+stop].upper() # close tag + markup_pos[markup][-1].append(r) + i = i + stop + 1 + elif text[i] == "<": + # start of start tag + stop = text[i:].find(">") + if stop < 0: + retval += text[i] + r += 1 + i += 1 + else: + markup, attr = parse_tag_attr(text[i+1:i+stop]) + markup_pos[markup].append([r, attr]) + i = i + stop + 1 elif text[i] == "\\": retval += text[i+1] r += 1 @@ -638,18 +674,29 @@ class GuiGramplet: i += 1 offset = len(self.get_text()) self.append_text(retval) - for (a,b) in markup_pos["B"]: + for (a,attributes,b) in markup_pos["B"]: start = self.buffer.get_iter_at_offset(a + offset) stop = self.buffer.get_iter_at_offset(b + offset) self.buffer.apply_tag_by_name("bold", start, stop) - for (a,b) in markup_pos["I"]: + for (a,attributes,b) in markup_pos["I"]: start = self.buffer.get_iter_at_offset(a + offset) stop = self.buffer.get_iter_at_offset(b + offset) self.buffer.apply_tag_by_name("italic", start, stop) - for (a,b) in markup_pos["U"]: + for (a,attributes,b) in markup_pos["U"]: start = self.buffer.get_iter_at_offset(a + offset) stop = self.buffer.get_iter_at_offset(b + offset) self.buffer.apply_tag_by_name("underline", start, stop) + for (a,attributes,b) in markup_pos["A"]: + start = self.buffer.get_iter_at_offset(a + offset) + stop = self.buffer.get_iter_at_offset(b + offset) + if "href" in attributes: + url = attributes["href"] + self.pui.link_region(start, stop, "URL", url) # tooltip? + elif "wiki" in attributes: + url = attributes["wiki"] + self.pui.link_region(start, stop, "WIKI", url) # tooltip? + else: + print "warning: no url on link: '%s'" % text[start, stop] def set_use_markup(self, value): if self.use_markup == value: return diff --git a/src/plugins/DefaultGramplets.py b/src/plugins/DefaultGramplets.py index 6896b2128..fe0bc871d 100644 --- a/src/plugins/DefaultGramplets.py +++ b/src/plugins/DefaultGramplets.py @@ -821,6 +821,14 @@ class TODOGramplet(Gramplet): self.gui.data = [] # clear out old data self.save_text_to_data() +class FAQGramplet(Gramplet): + def init(self): + self.set_use_markup(True) + self.clear_text() + self.render_text("Draft of a Frequently Asked Questions Gramplet\n\n") + self.render_text(" 1. Test 1\n") + self.render_text(" 2. Test 2\n") + def make_welcome_content(gui): text = _( 'Welcome to GRAMPS!\n\n' @@ -952,6 +960,7 @@ class AgeOnDateGramplet(Gramplet): # label, entry description = gtk.TextView() description.set_wrap_mode(gtk.WRAP_WORD) + description.set_editable(False) buffer = description.get_buffer() buffer.set_text(_("Enter a date in the entry below and click Run." " This will compute the ages for everyone in your" @@ -1087,3 +1096,12 @@ register(type="gramplet", detached_width = 600, detached_height = 400, ) + +register(type="gramplet", + name="FAQ Gramplet", + tname=_("FAQ Gramplet"), + height=300, + content = FAQGramplet, + title=_("FAQ"), + ) +