Use the engine to make sugar icons insensitive.

This commit is contained in:
Benjamin Berg 2007-12-14 19:59:46 +01:00
parent f87118c02c
commit ce2452ea42
2 changed files with 50 additions and 12 deletions

1
NEWS
View File

@ -1,3 +1,4 @@
* #4892: Use the engine to make sugar icons insensitive (benzea)
* #4941: Add menu entry with dialog to show About this XO (erikos) * #4941: Add menu entry with dialog to show About this XO (erikos)
* #5089: show frame shortly when adding object to clipboard (erikos) * #5089: show frame shortly when adding object to clipboard (erikos)
* #5097: Fix pasting text between activities through the clipboard. (tomeu) * #5097: Fix pasting text between activities through the clipboard. (tomeu)

View File

@ -88,9 +88,10 @@ class _IconBuffer(object):
self.cache = False self.cache = False
self.scale = 1.0 self.scale = 1.0
def _get_cache_key(self): def _get_cache_key(self, sensitive):
return (self.icon_name, self.file_name, self.fill_color, return (self.icon_name, self.file_name, self.fill_color,
self.stroke_color, self.badge_name, self.width, self.height) self.stroke_color, self.badge_name, self.width, self.height,
sensitive)
def _load_svg(self, file_name): def _load_svg(self, file_name):
entities = {} entities = {}
@ -139,16 +140,19 @@ class _IconBuffer(object):
return icon_info return icon_info
def _draw_badge(self, context, size): def _draw_badge(self, context, size, sensitive, widget):
theme = gtk.icon_theme_get_default() theme = gtk.icon_theme_get_default()
badge_info = theme.lookup_icon(self.badge_name, size, 0) badge_info = theme.lookup_icon(self.badge_name, size, 0)
if badge_info: if badge_info:
badge_file_name = badge_info.get_filename() badge_file_name = badge_info.get_filename()
if badge_file_name.endswith('.svg'): if badge_file_name.endswith('.svg'):
handle = self._loader.load(badge_file_name, {}, self.cache) handle = self._loader.load(badge_file_name, {}, self.cache)
handle.render_cairo(context) pixbuf = handle.get_pixbuf()
else: else:
pixbuf = gtk.gdk.pixbuf_new_from_file(badge_file_name) pixbuf = gtk.gdk.pixbuf_new_from_file(badge_file_name)
if not sensitive:
pixbuf = self._get_insensitive_pixbuf(pixbuf, widget)
surface = hippo.cairo_surface_from_gdk_pixbuf(pixbuf) surface = hippo.cairo_surface_from_gdk_pixbuf(pixbuf)
context.set_source_surface(surface, 0, 0) context.set_source_surface(surface, 0, 0)
context.paint() context.paint()
@ -196,8 +200,30 @@ class _IconBuffer(object):
self.stroke_color = None self.stroke_color = None
self.fill_color = None self.fill_color = None
def get_surface(self): def _get_insensitive_pixbuf (self, pixbuf, widget):
cache_key = self._get_cache_key() if not (widget and widget.style):
return pixbuf
icon_source = gtk.IconSource()
# Special size meaning "don't touch"
icon_source.set_size(-1)
icon_source.set_pixbuf(pixbuf)
icon_source.set_state(gtk.STATE_INSENSITIVE)
icon_source.set_direction_wildcarded(False)
icon_source.set_size_wildcarded(False)
# Please note that the pixbuf returned by this function is leaked
# with current stable versions of pygtk. The relevant bug is
# http://bugzilla.gnome.org/show_bug.cgi?id=502871
# -- 2007-12-14 Benjamin Berg
pixbuf = widget.style.render_icon(icon_source, widget.get_direction(),
gtk.STATE_INSENSITIVE, -1, widget,
"sugar-icon")
return pixbuf
def get_surface(self, sensitive=True, widget=None):
cache_key = self._get_cache_key(sensitive)
if cache_key in self._surface_cache: if cache_key in self._surface_cache:
return self._surface_cache[cache_key] return self._surface_cache[cache_key]
@ -230,8 +256,18 @@ class _IconBuffer(object):
context.translate(padding, padding) context.translate(padding, padding)
if is_svg: if is_svg:
if sensitive:
handle.render_cairo(context) handle.render_cairo(context)
else: else:
pixbuf = handle.get_pixbuf()
pixbuf = self._get_insensitive_pixbuf(pixbuf, widget)
pixbuf_surface = hippo.cairo_surface_from_gdk_pixbuf(pixbuf)
context.set_source_surface(pixbuf_surface, 0, 0)
context.paint()
else:
if not sensitive:
pixbuf = self._get_insensitive_pixbuf(pixbuf, widget)
pixbuf_surface = hippo.cairo_surface_from_gdk_pixbuf(pixbuf) pixbuf_surface = hippo.cairo_surface_from_gdk_pixbuf(pixbuf)
context.set_source_surface(pixbuf_surface, 0, 0) context.set_source_surface(pixbuf_surface, 0, 0)
context.paint() context.paint()
@ -239,7 +275,7 @@ class _IconBuffer(object):
if self.badge_name: if self.badge_name:
context.restore() context.restore()
context.translate(badge_info.attach_x, badge_info.attach_y) context.translate(badge_info.attach_x, badge_info.attach_y)
self._draw_badge(context, badge_info.size) self._draw_badge(context, badge_info.size, sensitive, widget)
self._surface_cache[cache_key] = surface self._surface_cache[cache_key] = surface
@ -307,7 +343,8 @@ class Icon(gtk.Image):
def do_expose_event(self, event): def do_expose_event(self, event):
self._sync_image_properties() self._sync_image_properties()
surface = self._buffer.get_surface() sensitive = (self.state != gtk.STATE_INSENSITIVE)
surface = self._buffer.get_surface(sensitive, self)
if surface is None: if surface is None:
return return