Mercurial > pidgin
comparison pidgin/gtkcellrendererexpander.c @ 32672:3828a61c44da
A boring and large patch so I can merge heads.
author | Elliott Sales de Andrade <qulogic@pidgin.im> |
---|---|
date | Fri, 23 Dec 2011 08:21:58 +0000 |
parents | 63181cbb941c |
children |
comparison
equal
deleted
inserted
replaced
32671:0e69949b3e61 | 32672:3828a61c44da |
---|---|
42 GParamSpec *pspec); | 42 GParamSpec *pspec); |
43 static void pidgin_cell_renderer_expander_init (PidginCellRendererExpander *cellexpander); | 43 static void pidgin_cell_renderer_expander_init (PidginCellRendererExpander *cellexpander); |
44 static void pidgin_cell_renderer_expander_class_init (PidginCellRendererExpanderClass *class); | 44 static void pidgin_cell_renderer_expander_class_init (PidginCellRendererExpanderClass *class); |
45 static void pidgin_cell_renderer_expander_get_size (GtkCellRenderer *cell, | 45 static void pidgin_cell_renderer_expander_get_size (GtkCellRenderer *cell, |
46 GtkWidget *widget, | 46 GtkWidget *widget, |
47 const GdkRectangle *cell_area, | 47 GdkRectangle *cell_area, |
48 gint *x_offset, | 48 gint *x_offset, |
49 gint *y_offset, | 49 gint *y_offset, |
50 gint *width, | 50 gint *width, |
51 gint *height); | 51 gint *height); |
52 static void pidgin_cell_renderer_expander_render (GtkCellRenderer *cell, | 52 static void pidgin_cell_renderer_expander_render (GtkCellRenderer *cell, |
53 cairo_t *cr, | 53 GdkWindow *window, |
54 GtkWidget *widget, | 54 GtkWidget *widget, |
55 const GdkRectangle *background_area, | 55 GdkRectangle *background_area, |
56 const GdkRectangle *cell_area, | 56 GdkRectangle *cell_area, |
57 GtkCellRendererState flags); | 57 GdkRectangle *expose_area, |
58 guint flags); | |
58 static gboolean pidgin_cell_renderer_expander_activate (GtkCellRenderer *r, | 59 static gboolean pidgin_cell_renderer_expander_activate (GtkCellRenderer *r, |
59 GdkEvent *event, | 60 GdkEvent *event, |
60 GtkWidget *widget, | 61 GtkWidget *widget, |
61 const gchar *p, | 62 const gchar *p, |
62 const GdkRectangle *bg, | 63 GdkRectangle *bg, |
63 const GdkRectangle *cell, | 64 GdkRectangle *cell, |
64 GtkCellRendererState flags); | 65 GtkCellRendererState flags); |
65 static void pidgin_cell_renderer_expander_finalize (GObject *gobject); | 66 static void pidgin_cell_renderer_expander_finalize (GObject *gobject); |
66 | 67 |
67 enum { | 68 enum { |
68 LAST_SIGNAL | 69 LAST_SIGNAL |
105 return cell_expander_type; | 106 return cell_expander_type; |
106 } | 107 } |
107 | 108 |
108 static void pidgin_cell_renderer_expander_init (PidginCellRendererExpander *cellexpander) | 109 static void pidgin_cell_renderer_expander_init (PidginCellRendererExpander *cellexpander) |
109 { | 110 { |
110 g_object_set(G_OBJECT(cellexpander), "mode", | 111 GTK_CELL_RENDERER(cellexpander)->mode = GTK_CELL_RENDERER_MODE_ACTIVATABLE; |
111 GTK_CELL_RENDERER_MODE_ACTIVATABLE, NULL); | 112 GTK_CELL_RENDERER(cellexpander)->xpad = 0; |
112 /*GTK_CELL_RENDERER(cellexpander)->mode = GTK_CELL_RENDERER_MODE_ACTIVATABLE;*/ | 113 GTK_CELL_RENDERER(cellexpander)->ypad = 2; |
113 gtk_cell_renderer_set_padding(GTK_CELL_RENDERER(cellexpander), 0, 2); | |
114 } | 114 } |
115 | 115 |
116 static void pidgin_cell_renderer_expander_class_init (PidginCellRendererExpanderClass *class) | 116 static void pidgin_cell_renderer_expander_class_init (PidginCellRendererExpanderClass *class) |
117 { | 117 { |
118 GObjectClass *object_class = G_OBJECT_CLASS(class); | 118 GObjectClass *object_class = G_OBJECT_CLASS(class); |
188 return g_object_new(PIDGIN_TYPE_GTK_CELL_RENDERER_EXPANDER, NULL); | 188 return g_object_new(PIDGIN_TYPE_GTK_CELL_RENDERER_EXPANDER, NULL); |
189 } | 189 } |
190 | 190 |
191 static void pidgin_cell_renderer_expander_get_size (GtkCellRenderer *cell, | 191 static void pidgin_cell_renderer_expander_get_size (GtkCellRenderer *cell, |
192 GtkWidget *widget, | 192 GtkWidget *widget, |
193 const GdkRectangle *cell_area, | 193 GdkRectangle *cell_area, |
194 gint *x_offset, | 194 gint *x_offset, |
195 gint *y_offset, | 195 gint *y_offset, |
196 gint *width, | 196 gint *width, |
197 gint *height) | 197 gint *height) |
198 { | 198 { |
199 gint calc_width; | 199 gint calc_width; |
200 gint calc_height; | 200 gint calc_height; |
201 gint expander_size; | 201 gint expander_size; |
202 gint xpad; | 202 |
203 gint ypad; | |
204 gfloat xalign; | |
205 gfloat yalign; | |
206 | |
207 gtk_widget_style_get(widget, "expander-size", &expander_size, NULL); | 203 gtk_widget_style_get(widget, "expander-size", &expander_size, NULL); |
208 | 204 |
209 gtk_cell_renderer_get_padding(cell, &xpad, &ypad); | 205 calc_width = (gint) cell->xpad * 2 + expander_size; |
210 gtk_cell_renderer_get_alignment(cell, &xalign, &yalign); | 206 calc_height = (gint) cell->ypad * 2 + expander_size; |
211 calc_width = (gint) xpad * 2 + expander_size; | |
212 calc_height = (gint) ypad * 2 + expander_size; | |
213 | 207 |
214 if (width) | 208 if (width) |
215 *width = calc_width; | 209 *width = calc_width; |
216 | 210 |
217 if (height) | 211 if (height) |
219 | 213 |
220 if (cell_area) | 214 if (cell_area) |
221 { | 215 { |
222 if (x_offset) | 216 if (x_offset) |
223 { | 217 { |
224 *x_offset = xalign * (cell_area->width - calc_width); | 218 *x_offset = cell->xalign * (cell_area->width - calc_width); |
225 *x_offset = MAX (*x_offset, 0); | 219 *x_offset = MAX (*x_offset, 0); |
226 } | 220 } |
227 if (y_offset) | 221 if (y_offset) |
228 { | 222 { |
229 *y_offset = yalign * (cell_area->height - calc_height); | 223 *y_offset = cell->yalign * (cell_area->height - calc_height); |
230 *y_offset = MAX (*y_offset, 0); | 224 *y_offset = MAX (*y_offset, 0); |
231 } | 225 } |
232 } | 226 } |
233 } | 227 } |
234 | 228 |
235 | 229 |
236 static void pidgin_cell_renderer_expander_render(GtkCellRenderer *cell, | 230 static void pidgin_cell_renderer_expander_render(GtkCellRenderer *cell, |
237 cairo_t *cr, | 231 GdkWindow *window, |
238 GtkWidget *widget, | 232 GtkWidget *widget, |
239 const GdkRectangle *background_area, | 233 GdkRectangle *background_area, |
240 const GdkRectangle *cell_area, | 234 GdkRectangle *cell_area, |
241 GtkCellRendererState flags) | 235 GdkRectangle *expose_area, |
236 guint flags) | |
242 { | 237 { |
243 PidginCellRendererExpander *cellexpander = (PidginCellRendererExpander *) cell; | 238 PidginCellRendererExpander *cellexpander = (PidginCellRendererExpander *) cell; |
244 gboolean set; | 239 gboolean set; |
245 gint width, height; | 240 gint width, height; |
246 GtkStateType state; | 241 GtkStateType state; |
247 gint xpad; | 242 |
248 gint ypad; | |
249 gboolean is_expanded; | |
250 GtkAllocation allocation; | |
251 | |
252 gtk_cell_renderer_get_padding(cell, &xpad, &ypad); | |
253 g_object_get(G_OBJECT(cell), "is-expanded", &is_expanded, NULL); | |
254 | |
255 if (!cellexpander->is_expander) | 243 if (!cellexpander->is_expander) |
256 return; | 244 return; |
257 | 245 |
258 width = cell_area->width; | 246 width = cell_area->width; |
259 height = cell_area->height; | 247 height = cell_area->height; |
260 | 248 |
261 if (!gtk_widget_get_sensitive(widget)) | 249 if (!cell->sensitive) |
262 state = GTK_STATE_INSENSITIVE; | 250 state = GTK_STATE_INSENSITIVE; |
263 else if (flags & GTK_CELL_RENDERER_PRELIT) | 251 else if (flags & GTK_CELL_RENDERER_PRELIT) |
264 state = GTK_STATE_PRELIGHT; | 252 state = GTK_STATE_PRELIGHT; |
265 else if (gtk_widget_has_focus(widget) && flags & GTK_CELL_RENDERER_SELECTED) | 253 #if GTK_CHECK_VERSION(2,18,0) |
254 else if (gtk_widget_has_focus (widget) && flags & GTK_CELL_RENDERER_SELECTED) | |
266 state = GTK_STATE_ACTIVE; | 255 state = GTK_STATE_ACTIVE; |
256 #else | |
257 else if (GTK_WIDGET_HAS_FOCUS (widget) && flags & GTK_CELL_RENDERER_SELECTED) | |
258 state = GTK_STATE_ACTIVE; | |
259 #endif | |
267 else | 260 else |
268 state = GTK_STATE_NORMAL; | 261 state = GTK_STATE_NORMAL; |
269 | 262 |
270 width -= xpad*2; | 263 width -= cell->xpad*2; |
271 height -= ypad*2; | 264 height -= cell->ypad*2; |
272 | 265 |
273 gtk_paint_expander (gtk_widget_get_style(widget), | 266 gtk_paint_expander (widget->style, |
274 cr, state, | 267 window, state, |
275 widget, "treeview", | 268 NULL, widget, "treeview", |
276 cell_area->x + xpad + (width / 2), | 269 cell_area->x + cell->xpad + (width / 2), |
277 cell_area->y + ypad + (height / 2), | 270 cell_area->y + cell->ypad + (height / 2), |
278 is_expanded ? GTK_EXPANDER_EXPANDED : GTK_EXPANDER_COLLAPSED); | 271 cell->is_expanded ? GTK_EXPANDER_EXPANDED : GTK_EXPANDER_COLLAPSED); |
279 | 272 |
280 /* only draw the line if the color isn't set - this prevents a bug where the hline appears only under the expander */ | 273 /* only draw the line if the color isn't set - this prevents a bug where the hline appears only under the expander */ |
281 g_object_get(cellexpander, "cell-background-set", &set, NULL); | 274 g_object_get(cellexpander, "cell-background-set", &set, NULL); |
282 gtk_widget_get_allocation(widget, &allocation); | 275 if (cell->is_expanded && !set) |
283 | 276 gtk_paint_hline (widget->style, window, state, NULL, widget, NULL, 0, |
284 if (is_expanded && !set) | 277 widget->allocation.width, cell_area->y + cell_area->height); |
285 gtk_paint_hline (gtk_widget_get_style(widget), cr, state, widget, NULL, 0, | |
286 allocation.width, cell_area->y + cell_area->height); | |
287 } | 278 } |
288 | 279 |
289 static gboolean pidgin_cell_renderer_expander_activate(GtkCellRenderer *r, | 280 static gboolean pidgin_cell_renderer_expander_activate(GtkCellRenderer *r, |
290 GdkEvent *event, | 281 GdkEvent *event, |
291 GtkWidget *widget, | 282 GtkWidget *widget, |
292 const gchar *p, | 283 const gchar *p, |
293 const GdkRectangle *bg, | 284 GdkRectangle *bg, |
294 const GdkRectangle *cell, | 285 GdkRectangle *cell, |
295 GtkCellRendererState flags) | 286 GtkCellRendererState flags) |
296 { | 287 { |
297 GtkTreePath *path = gtk_tree_path_new_from_string(p); | 288 GtkTreePath *path = gtk_tree_path_new_from_string(p); |
298 if (gtk_tree_view_row_expanded(GTK_TREE_VIEW(widget), path)) | 289 if (gtk_tree_view_row_expanded(GTK_TREE_VIEW(widget), path)) |
299 gtk_tree_view_collapse_row(GTK_TREE_VIEW(widget), path); | 290 gtk_tree_view_collapse_row(GTK_TREE_VIEW(widget), path); |