Use the engine to make sugar icons insensitive.
This commit is contained in:
parent
f87118c02c
commit
ce2452ea42
1
NEWS
1
NEWS
@ -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)
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user