Don't switch markup to retrieve markup value

issue2769
review511003
This commit is contained in:
Cédric Krier committed 2012-09-18 11:45:29 +02:00
1 parent 1968eaeeaf
commit eba6376ff5
2 files changed
+43 -47

No files matched your search

@@ -5,7 +5,6 @@ import gtk
import pango
import re
from gettext import gettext as _
from functools import wraps
from textbox import TextBox
from tryton.common import get_toplevel_window
@@ -62,21 +61,6 @@ def formalize_text_markup(text):
return '\n'.join(lines)
def active_markup(func):
"Decorator to activate markup"
@wraps(func)
def wrapper(self, *args, **kwargs):
active = self.tools['markup'].get_active()
if not active:
self.tools['markup'].set_active(True)
try:
return func(self, *args, **kwargs)
finally:
if not active:
self.tools['markup'].set_active(False)
return wrapper
class RichTextBox(TextBox):
'''Implements a rich text editor as widget to Tryton Client'''
@@ -187,7 +171,6 @@ class RichTextBox(TextBox):
self.tools['markup'].set_tooltip_text(_('Change the markup text view'))
# Packing widgets
tool_bar = gtk.Toolbar()
tool_bar.connect('enter-notify-event', self.enter)
tool_bar.set_style(gtk.TOOLBAR_ICONS)
for tag in tags:
@@ -196,19 +179,35 @@ class RichTextBox(TextBox):
for local in (3, 6, 11, 14):
tool_bar.insert(separator(), local)
self.widget.pack_start(tool_bar, False)
self.widget.connect('enter-notify-event', self.enter)
def get_value_markup(self):
if self.tools['markup'].get_active():
return self.get_value()
else:
return self.parser_to_text_markup(self.text_buffer)
@property
@active_markup
def modified(self):
return super(RichTextBox, self).modified
if self.record and self.field:
return (formalize_text_markup(self.field.get_client(self.record) or
'') != self.get_value_markup())
return False
@active_markup
def set_value(self, record, field):
super(RichTextBox, self).set_value(record, field)
if self.modified:
field.set_client(record, self.get_value_markup())
@active_markup
def display(self, record, field):
super(RichTextBox, self).display(record, field)
def set_buffer(self, value):
if self.tools['markup'].get_active():
super(RichTextBox, self).set_buffer(value)
else:
text_buffer, deserial = self.parser_from_text_markup(value)
self.text_buffer.deserialize(self.text_buffer, deserial,
self.text_buffer.get_start_iter(),
text_buffer.serialize(text_buffer,
"application/x-gtk-text-buffer-rich-text",
text_buffer.get_start_iter(), text_buffer.get_end_iter()))
def _focus_out(self):
if not self.focus_out:
@@ -228,21 +227,24 @@ class RichTextBox(TextBox):
if widget.get_active():
for tag in tags:
self.tools[tag].set_sensitive(False)
self.parser_to_text_markup()
text = self.parser_to_text_markup(self.text_buffer)
self.start_tags.clear()
self.end_tags.clear()
else:
for tag in tags:
self.tools[tag].set_sensitive(True)
self.parser_from_text_markup()
text = self.text_buffer.get_text(self.text_buffer.get_start_iter(),
self.text_buffer.get_end_iter())
self.set_buffer(text)
def parser_to_text_markup(self):
def parser_to_text_markup(self, buffer_):
'''Parser from rich text view to text markup'''
text_buffer = gtk.TextBuffer(self.table_tag)
deserial = text_buffer.register_deserialize_tagset()
text_buffer.deserialize(text_buffer, deserial,
text_buffer.get_start_iter(), self.text_buffer.serialize(
self.text_buffer, "application/x-gtk-text-buffer-rich-text",
self.text_buffer.get_start_iter(),
self.text_buffer.get_end_iter()))
text_buffer.get_start_iter(), buffer_.serialize(
buffer_, "application/x-gtk-text-buffer-rich-text",
buffer_.get_start_iter(), buffer_.get_end_iter()))
locks = {'bold': False, 'italic': False, 'underline': False,
'left': False, 'right': False, 'center': False, 'fill': False}
for prop in self.font_props:
@@ -287,15 +289,11 @@ class RichTextBox(TextBox):
break
text = text_buffer.get_text(text_buffer.get_start_iter(),
text_buffer.get_end_iter())
self.start_tags.clear()
self.end_tags.clear()
self.text_buffer.set_text(formalize_text_markup(text))
return formalize_text_markup(text)
def parser_from_text_markup(self):
def parser_from_text_markup(self, text):
'''Parser from text markup to rich text view'''
text_buffer = gtk.TextBuffer(self.table_tag)
text = self.text_buffer.get_text(self.text_buffer.get_start_iter(),
self.text_buffer.get_end_iter())
text_buffer.set_text(text)
tags = []
open_re = '<(?P<tag>\w{1,4})(?P<attrs> .+?)?>'
@@ -346,11 +344,7 @@ class RichTextBox(TextBox):
text_buffer.apply_tag_by_name(value, line, end)
self.text_buffer.set_text('')
deserial = self.text_buffer.register_deserialize_tagset()
self.text_buffer.deserialize(self.text_buffer, deserial,
self.text_buffer.get_start_iter(),
text_buffer.serialize(text_buffer,
"application/x-gtk-text-buffer-rich-text",
text_buffer.get_start_iter(), text_buffer.get_end_iter()))
return text_buffer, deserial
def gen_tag(self, val, tag):
'''
@@ -133,16 +133,18 @@ class TextBox(WidgetInterface, TranslateMixin):
def set_value(self, record, field):
field.set_client(record, self.get_value())
def display(self, record, field):
super(TextBox, self).display(record, field)
value = field and field.get(record)
if not value:
value = ''
def set_buffer(self, value):
buf = self.textview.get_buffer()
buf.delete(buf.get_start_iter(), buf.get_end_iter())
iter_start = buf.get_start_iter()
buf.insert(iter_start, value)
def display(self, record, field):
super(TextBox, self).display(record, field)
value = field and field.get(record)
if not value:
value = ''
self.set_buffer(value)
if gtkspell:
spell = None
try: