[Sugar-devel] [PATCH sugar v5 1/3] Properly wrap labels in the Network Control Panel (GTK#318276 workaround)
Sascha Silbe
silbe at activitycentral.com
Tue Aug 7 09:32:34 EDT 2012
When line wrapping is enabled (label.set_line_wrap(True)), GTK restricts
labels to an arbitrary size, rather than utilising the entire allocated space.
This has been known upstream since 2005 (GTK#318276 [1]), but remains unfixed
to date.
Work around this bug by using a size-allocate signal handler that sets the
requested size of the label to the actual allocation.
[1] https://bugzilla.gnome.org/show_bug.cgi?id=318276
Signed-off-by: Sascha Silbe <silbe at activitycentral.com>
---
v5->v4: no changes
v4: introduced this patch into the series
extensions/cpsection/network/view.py | 42 +++++++++++++++++++++++++---------
1 file changed, 31 insertions(+), 11 deletions(-)
diff --git a/extensions/cpsection/network/view.py b/extensions/cpsection/network/view.py
index 381dcb6..6298f5c 100644
--- a/extensions/cpsection/network/view.py
+++ b/extensions/cpsection/network/view.py
@@ -31,6 +31,28 @@ TITLE = _('Network')
_APPLY_TIMEOUT = 3000
+class WrappedLabel(gtk.Label):
+ """Variant of gtk.Label that automatically line-wraps the text as needed.
+
+ In theory, stock gtk.Label can already do this, but in practice a
+ long-standing bug in GTK prevents it from working as expected.
+ This class includes a workaround for that bug.
+
+ Cave-at: WrappedLabel.set_alignment() will stop working.
+ """
+
+ def __init__(self, string=None):
+ gtk.Label.__init__(self, str=string)
+ self.set_line_wrap(True)
+ self.connect('size-allocate', self.__size_allocate_cb)
+
+ def __size_allocate_cb(self, widget, rect):
+ """Propagate parent size allocation to gtk.Label"""
+ # This is a workaround for GTK bug #318276
+ # https://bugzilla.gnome.org/show_bug.cgi?id=318276
+ widget.set_size_request(rect.width, -1)
+
+
class Network(SectionView):
def __init__(self, model, alerts):
SectionView.__init__(self)
@@ -66,10 +88,9 @@ class Network(SectionView):
box_wireless.set_border_width(style.DEFAULT_SPACING * 2)
box_wireless.set_spacing(style.DEFAULT_SPACING)
- radio_info = gtk.Label(_('Turn off the wireless radio to save battery'
- ' life'))
+ radio_info = WrappedLabel(_('Turn off the wireless radio to save'
+ ' battery life'))
radio_info.set_alignment(0, 0)
- radio_info.set_line_wrap(True)
radio_info.show()
box_wireless.pack_start(radio_info, expand=False)
@@ -95,10 +116,9 @@ class Network(SectionView):
self._radio_alert.props.msg = self.restart_msg
self._radio_alert.show()
- history_info = gtk.Label(_('Discard network history if you have'
- ' trouble connecting to the network'))
+ history_info = WrappedLabel(_('Discard network history if you have'
+ ' trouble connecting to the network'))
history_info.set_alignment(0, 0)
- history_info.set_line_wrap(True)
history_info.show()
box_wireless.pack_start(history_info, expand=False)
@@ -127,12 +147,12 @@ class Network(SectionView):
box_mesh.set_border_width(style.DEFAULT_SPACING * 2)
box_mesh.set_spacing(style.DEFAULT_SPACING)
- server_info = gtk.Label(_("The server is the equivalent of what"
- " room you are in; people on the same server"
- " will be able to see each other, even when"
- " they aren't on the same network."))
+ server_info = WrappedLabel(_("The server is the equivalent of what"
+ " room you are in; people on the same"
+ " server will be able to see each other,"
+ " even when they aren't on the same "
+ " network."))
server_info.set_alignment(0, 0)
- server_info.set_line_wrap(True)
box_mesh.pack_start(server_info, expand=False)
server_info.show()
--
1.7.10.4
More information about the Sugar-devel
mailing list