Bonjour je souhaiterai faire un petit editeur de texte basique en Gtk.
Pour les styles (gras, italique et souligné) je n'ai pas trop de pb.
Par contre pour la couleur je me suis plus torturé

Voici mon programme (non terminé) il fonctionne mais la gestion de la couleur du texte ne me plait pas.
Comment pourrais-je améliorer la gestion de la couleur du texte ?

Merci d'avance


Code : Sélectionner tout - Visualiser dans une fenêtre à part
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