1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
| class Composer(object):
def __init__(self):
self.builder = Gtk.Builder()
self.builder.add_from_file('/home/christophe/.poppy/ui/Composer.glade')
self.builder.connect_signals(self)
self.dialog = self.builder.get_object('dialog1')
self.textview = self.builder.get_object('textview')
self.textbuffer = self.textview.get_buffer()
# Toggled Buttons
self.button_bold = self.builder.get_object('button_bold')
self.button_underline = self.builder.get_object('button_underline')
self.button_italic = self.builder.get_object('button_italic')
# Normal Buttons
self.button_color = self.builder.get_object('button_color')
# Tags
b_tag = self.textbuffer.create_tag( "b", weight=pango.WEIGHT_BOLD)
i_tag = self.textbuffer.create_tag( "i", style=pango.STYLE_ITALIC)
u_tag = self.textbuffer.create_tag( "u", underline=pango.UNDERLINE_SINGLE)
# Signals
self.button_bold.connect("toggled", self.style_changed, b_tag)
self.button_italic.connect("toggled", self.style_changed, i_tag)
self.button_underline.connect("toggled", self.style_changed, u_tag)
self.button_color.connect("color_set", self.color_changed)
# Dict of attibutes in textview
self.styles = {}
def style_changed(self, widget, tag):
start, end = self.get_selection()
if start == end:
return
if widget.get_active():
self.textbuffer.apply_tag(tag, start, end)
else:
self.textbuffer.remove_tag(tag, start, end)
def color_changed(self, widget):
start, end = self.get_selection()
if start == end:
return
color = widget.get_color()
tag_name = color.to_string()
# Remove obsolete Tags before applying new Tag.
tags = [tag for tag in start.get_tags() if tag == v['tag'] for k, v in self.styles.items() if v['type'] == "color"]
for tag in tags:
self.textbuffer.remove_tag(tag, start, end)
# Create or load existing Tag
if tag_name in self.styles.keys():
tag = self.styles[tag_name]['tag']
else:
tag = self.textbuffer.create_tag(tag_name)
tag.set_property('foreground-gdk', color)
self.styles[tag_name] = {'tag': tag, 'type': 'color'}
self.textbuffer.apply_tag(tag, start, end)
def get_selection(self):
bounds = self.textbuffer.get_selection_bounds()
if len(bounds) != 0:
start, end = bounds
else:
start = self.textbuffer.get_iter_at_mark(self.textbuffer.get_insert())
end = self.textbuffer.get_iter_at_mark(self.textbuffer.get_insert())
if not start.inside_word():
end = start
else:
if not start.starts_word():
start.backward_word_start()
if not end.ends_word():
end.forward_word_end()
return start, end |
Partager