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