Mercurial > pidgin
comparison gtk/gtkstatusbox.c @ 14561:3ff55ec8203a
[gaim-migrate @ 17284]
GtkCellRendererExpander draws an expander in a renderer to avoid a large, needless margin.
The approach is a bit hacky, but it's a good job.
- RTL fix in GtkStatusBox
- Drag-and-drop image into the global buddy icon selector to set a buddy icon
committer: Tailor Script <tailor@pidgin.im>
author | Sean Egan <seanegan@gmail.com> |
---|---|
date | Fri, 15 Sep 2006 22:05:34 +0000 |
parents | 776975f2c550 |
children | 26e7d03d40c5 |
comparison
equal
deleted
inserted
replaced
14560:16bba6d02c2a | 14561:3ff55ec8203a |
---|---|
236 box->buddy_icon_sel = gaim_gtk_buddy_icon_chooser_new(NULL, icon_choose_cb, box); | 236 box->buddy_icon_sel = gaim_gtk_buddy_icon_chooser_new(NULL, icon_choose_cb, box); |
237 gtk_widget_show_all(box->buddy_icon_sel); | 237 gtk_widget_show_all(box->buddy_icon_sel); |
238 return FALSE; | 238 return FALSE; |
239 } | 239 } |
240 | 240 |
241 static void | |
242 icon_box_dnd_cb(GtkWidget *widget, GdkDragContext *dc, gint x, gint y, | |
243 GtkSelectionData *sd, guint info, guint t, GtkGaimStatusBox *box) | |
244 { | |
245 gchar *name = (gchar *)sd->data; | |
246 | |
247 if ((sd->length >= 0) && (sd->format == 8)) { | |
248 /* Well, it looks like the drag event was cool. | |
249 * Let's do something with it */ | |
250 if (!g_ascii_strncasecmp(name, "file://", 7)) { | |
251 GError *converr = NULL; | |
252 gchar *tmp, *rtmp; | |
253 | |
254 if(!(tmp = g_filename_from_uri(name, NULL, &converr))) { | |
255 gaim_debug(GAIM_DEBUG_ERROR, "buddyicon", "%s\n", | |
256 (converr ? converr->message : | |
257 "g_filename_from_uri error")); | |
258 return; | |
259 } | |
260 if ((rtmp = strchr(tmp, '\r')) || (rtmp = strchr(tmp, '\n'))) | |
261 *rtmp = '\0'; | |
262 icon_choose_cb(tmp, box); | |
263 g_free(tmp); | |
264 } | |
265 gtk_drag_finish(dc, TRUE, FALSE, t); | |
266 } | |
267 gtk_drag_finish(dc, FALSE, FALSE, t); | |
268 } | |
269 | |
270 | |
241 static gboolean | 271 static gboolean |
242 icon_box_enter_cb(GtkWidget *widget, GdkEventCrossing *event, GtkGaimStatusBox *box) | 272 icon_box_enter_cb(GtkWidget *widget, GdkEventCrossing *event, GtkGaimStatusBox *box) |
243 { | 273 { |
244 gdk_window_set_cursor(widget->window, box->hand_cursor); | 274 gdk_window_set_cursor(widget->window, box->hand_cursor); |
245 gtk_image_set_from_pixbuf(GTK_IMAGE(box->icon), box->buddy_icon_hover); | 275 gtk_image_set_from_pixbuf(GTK_IMAGE(box->icon), box->buddy_icon_hover); |
252 gdk_window_set_cursor(widget->window, box->arrow_cursor); | 282 gdk_window_set_cursor(widget->window, box->arrow_cursor); |
253 gtk_image_set_from_pixbuf(GTK_IMAGE(box->icon), box->buddy_icon) ; | 283 gtk_image_set_from_pixbuf(GTK_IMAGE(box->icon), box->buddy_icon) ; |
254 return FALSE; | 284 return FALSE; |
255 } | 285 } |
256 | 286 |
287 | |
288 static const GtkTargetEntry dnd_targets[] = { | |
289 {"text/plain", 0, 0}, | |
290 {"text/uri-list", 0, 1}, | |
291 {"STRING", 0, 2} | |
292 }; | |
293 | |
257 static void | 294 static void |
258 setup_icon_box(GtkGaimStatusBox *status_box) | 295 setup_icon_box(GtkGaimStatusBox *status_box) |
259 { | 296 { |
260 if (status_box->icon_box != NULL) | 297 if (status_box->icon_box != NULL) |
261 return; | 298 return; |
271 { | 308 { |
272 gtk_gaim_status_box_set_buddy_icon(status_box, gaim_prefs_get_string("/gaim/gtk/accounts/buddyicon")); | 309 gtk_gaim_status_box_set_buddy_icon(status_box, gaim_prefs_get_string("/gaim/gtk/accounts/buddyicon")); |
273 } | 310 } |
274 status_box->icon = gtk_image_new_from_pixbuf(status_box->buddy_icon); | 311 status_box->icon = gtk_image_new_from_pixbuf(status_box->buddy_icon); |
275 status_box->icon_box = gtk_event_box_new(); | 312 status_box->icon_box = gtk_event_box_new(); |
313 | |
276 status_box->hand_cursor = gdk_cursor_new (GDK_HAND2); | 314 status_box->hand_cursor = gdk_cursor_new (GDK_HAND2); |
277 status_box->arrow_cursor = gdk_cursor_new (GDK_LEFT_PTR); | 315 status_box->arrow_cursor = gdk_cursor_new (GDK_LEFT_PTR); |
278 | 316 |
317 /* Set up DND */ | |
318 gtk_drag_dest_set(status_box->icon_box, | |
319 GTK_DEST_DEFAULT_MOTION | | |
320 GTK_DEST_DEFAULT_DROP, | |
321 dnd_targets, | |
322 sizeof(dnd_targets) / sizeof(GtkTargetEntry), | |
323 GDK_ACTION_COPY); | |
324 | |
325 g_signal_connect(G_OBJECT(status_box->icon_box), "drag_data_received", G_CALLBACK(icon_box_dnd_cb), status_box); | |
279 g_signal_connect(G_OBJECT(status_box->icon_box), "enter-notify-event", G_CALLBACK(icon_box_enter_cb), status_box); | 326 g_signal_connect(G_OBJECT(status_box->icon_box), "enter-notify-event", G_CALLBACK(icon_box_enter_cb), status_box); |
280 g_signal_connect(G_OBJECT(status_box->icon_box), "leave-notify-event", G_CALLBACK(icon_box_leave_cb), status_box); | 327 g_signal_connect(G_OBJECT(status_box->icon_box), "leave-notify-event", G_CALLBACK(icon_box_leave_cb), status_box); |
281 g_signal_connect(G_OBJECT(status_box->icon_box), "button-press-event", G_CALLBACK(icon_box_press_cb), status_box); | 328 g_signal_connect(G_OBJECT(status_box->icon_box), "button-press-event", G_CALLBACK(icon_box_press_cb), status_box); |
282 | 329 |
283 gtk_container_add(GTK_CONTAINER(status_box->icon_box), status_box->icon); | 330 gtk_container_add(GTK_CONTAINER(status_box->icon_box), status_box->icon); |
1270 parent_alc.x += border_width; | 1317 parent_alc.x += border_width; |
1271 parent_alc.y += border_width; | 1318 parent_alc.y += border_width; |
1272 | 1319 |
1273 if (status_box->icon_box) | 1320 if (status_box->icon_box) |
1274 { | 1321 { |
1322 GtkTextDirection dir = gtk_widget_get_direction(widget); | |
1275 parent_alc.width -= (parent_alc.height + border_width); | 1323 parent_alc.width -= (parent_alc.height + border_width); |
1276 icon_alc = *allocation; | 1324 icon_alc = *allocation; |
1277 icon_alc.height = MAX(1,req.height) - (border_width); | 1325 icon_alc.height = MAX(1,req.height) - (border_width); |
1278 icon_alc.width = icon_alc.height; | 1326 icon_alc.width = icon_alc.height; |
1279 icon_alc.x = allocation->width - (icon_alc.width + border_width); | 1327 if (dir == GTK_TEXT_DIR_RTL) { |
1328 icon_alc.x = parent_alc.x; | |
1329 parent_alc.x += icon_alc.width + border_width; | |
1330 } else { | |
1331 icon_alc.x = allocation->width - (icon_alc.width + border_width); | |
1332 } | |
1280 icon_alc.y += border_width; | 1333 icon_alc.y += border_width; |
1281 | 1334 |
1282 if (status_box->icon_size != icon_alc.height) | 1335 if (status_box->icon_size != icon_alc.height) |
1283 { | 1336 { |
1284 if (status_box->buddy_icon_hover) | 1337 if (status_box->buddy_icon_hover) |