[kepi] ability to use subkeys. Fixes #6051
[gajim.git] / src / cell_renderer_image.py
blob1e5b4bb8e8cb560da52fae227fb1ff6e73ec3d80
1 # -*- coding:utf-8 -*-
2 ## src/cell_renderer_image.py
3 ##
4 ## Copyright (C) 2003-2010 Yann Leboulanger <asterix AT lagaule.org>
5 ## Copyright (C) 2005 Vincent Hanquez <tab AT snarc.org>
6 ## Copyright (C) 2005-2007 Nikos Kouremenos <kourem AT gmail.com>
7 ## Copyright (C) 2006 Travis Shirk <travis AT pobox.com>
8 ##
9 ## This file is part of Gajim.
11 ## Gajim is free software; you can redistribute it and/or modify
12 ## it under the terms of the GNU General Public License as published
13 ## by the Free Software Foundation; version 3 only.
15 ## Gajim is distributed in the hope that it will be useful,
16 ## but WITHOUT ANY WARRANTY; without even the implied warranty of
17 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 ## GNU General Public License for more details.
20 ## You should have received a copy of the GNU General Public License
21 ## along with Gajim. If not, see <http://www.gnu.org/licenses/>.
25 import gtk
26 import gobject
28 class CellRendererImage(gtk.GenericCellRenderer):
30 __gproperties__ = {
31 'image': (gobject.TYPE_OBJECT, 'Image',
32 'Image', gobject.PARAM_READWRITE),
35 def __init__(self, col_index, tv_index):
36 self.__gobject_init__()
37 self.image = None
38 self.col_index = col_index
39 self.tv_index = tv_index
40 self.iters = {}
42 def do_set_property(self, pspec, value):
43 setattr(self, pspec.name, value)
45 def do_get_property(self, pspec):
46 return getattr(self, pspec.name)
48 def func(self, model, path, iter_, image_tree):
49 image, tree = image_tree
50 if model.get_value(iter_, self.tv_index) != image:
51 return
52 self.redraw = 1
53 col = tree.get_column(self.col_index)
54 cell_area = tree.get_cell_area(path, col)
56 tree.queue_draw_area(cell_area.x, cell_area.y,
57 cell_area.width, cell_area.height)
59 def animation_timeout(self, tree, image):
60 if image.get_storage_type() != gtk.IMAGE_ANIMATION:
61 return
62 self.redraw = 0
63 iter_ = self.iters[image]
64 iter_.advance()
65 model = tree.get_model()
66 if model:
67 model.foreach(self.func, (image, tree))
68 if self.redraw:
69 gobject.timeout_add(iter_.get_delay_time(),
70 self.animation_timeout, tree, image)
71 elif image in self.iters:
72 del self.iters[image]
74 def on_render(self, window, widget, background_area, cell_area,
75 expose_area, flags):
76 if not self.image:
77 return
78 pix_rect = gtk.gdk.Rectangle()
79 pix_rect.x, pix_rect.y, pix_rect.width, pix_rect.height = \
80 self.on_get_size(widget, cell_area)
82 pix_rect.x += cell_area.x
83 pix_rect.y += cell_area.y
84 pix_rect.width -= 2 * self.get_property('xpad')
85 pix_rect.height -= 2 * self.get_property('ypad')
87 draw_rect = cell_area.intersect(pix_rect)
88 draw_rect = expose_area.intersect(draw_rect)
90 if self.image.get_storage_type() == gtk.IMAGE_ANIMATION:
91 if self.image not in self.iters:
92 if not isinstance(widget, gtk.TreeView):
93 return
94 animation = self.image.get_animation()
95 iter_ = animation.get_iter()
96 self.iters[self.image] = iter_
97 gobject.timeout_add(iter_.get_delay_time(),
98 self.animation_timeout, widget, self.image)
100 pix = self.iters[self.image].get_pixbuf()
101 elif self.image.get_storage_type() == gtk.IMAGE_PIXBUF:
102 pix = self.image.get_pixbuf()
103 else:
104 return
105 if draw_rect.x < 1:
106 return
107 window.draw_pixbuf(widget.style.black_gc, pix,
108 draw_rect.x - pix_rect.x,
109 draw_rect.y - pix_rect.y,
110 draw_rect.x, draw_rect.y,
111 draw_rect.width, draw_rect.height,
112 gtk.gdk.RGB_DITHER_NONE, 0, 0)
114 def on_get_size(self, widget, cell_area):
115 if not self.image:
116 return 0, 0, 0, 0
117 if self.image.get_storage_type() == gtk.IMAGE_ANIMATION:
118 animation = self.image.get_animation()
119 pix = animation.get_iter().get_pixbuf()
120 elif self.image.get_storage_type() == gtk.IMAGE_PIXBUF:
121 pix = self.image.get_pixbuf()
122 else:
123 return 0, 0, 0, 0
124 pixbuf_width = pix.get_width()
125 pixbuf_height = pix.get_height()
126 calc_width = self.get_property('xpad') * 2 + pixbuf_width
127 calc_height = self.get_property('ypad') * 2 + pixbuf_height
128 x_offset = 0
129 y_offset = 0
130 if cell_area and pixbuf_width > 0 and pixbuf_height > 0:
131 x_offset = self.get_property('xalign') * \
132 (cell_area.width - calc_width - \
133 self.get_property('xpad'))
134 y_offset = self.get_property('yalign') * \
135 (cell_area.height - calc_height - \
136 self.get_property('ypad'))
137 return x_offset, y_offset, calc_width, calc_height