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);