Mercurial > pidgin.yaz
diff pidgin/gtkstatusbox.c @ 20407:1122d47583a1
explicit merge of 'd42ad2da81f881b2fbd2fb080cc70a843bc70d02'
and '8582c561c020d2d1e8d358e2e7cd9e3da113ed9e'
to branch 'im.pidgin.cpw.khc.msnp14'
author | Ka-Hing Cheung <khc@hxbc.us> |
---|---|
date | Wed, 02 May 2007 05:25:27 +0000 |
parents | cf62255b0a74 |
children | 89328a54948b 6b4e778ee4b4 |
line wrap: on
line diff
--- a/pidgin/gtkstatusbox.c Sun Apr 15 20:12:06 2007 +0000 +++ b/pidgin/gtkstatusbox.c Wed May 02 05:25:27 2007 +0000 @@ -1,6 +1,6 @@ /* * @file gtkstatusbox.c GTK+ Status Selection Widget - * @ingroup gtkui + * @ingroup pidgin * * pidgin * @@ -106,13 +106,23 @@ /** A plain-English description of this item */ DESC_COLUMN, - /* + /** * This value depends on TYPE_COLUMN. For POPULAR types, * this is the creation time. For PRIMITIVE types, * this is the PurpleStatusPrimitive. */ DATA_COLUMN, + /** + * This column stores the GdkPixbuf for the status emblem. Currently only 'saved' is stored + */ + EMBLEM_COLUMN, + + /** + * This column stores whether to show the emblem. + */ + EMBLEM_VISIBLE_COLUMN, + NUM_COLUMNS }; @@ -540,6 +550,32 @@ ); } +static GdkPixbuf * +pidgin_status_box_get_pixbuf(PidginStatusBox *status_box, PurpleStatusPrimitive prim) +{ + GdkPixbuf *pixbuf; + GtkIconSize icon_size = gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL); + if (prim == PURPLE_STATUS_UNAVAILABLE) + pixbuf = gtk_widget_render_icon (GTK_WIDGET(status_box), PIDGIN_STOCK_STATUS_BUSY, + icon_size, "PidginStatusBox"); + else if (prim == PURPLE_STATUS_AWAY) + pixbuf = gtk_widget_render_icon (GTK_WIDGET(status_box), PIDGIN_STOCK_STATUS_AWAY, + icon_size, "PidginStatusBox"); + else if (prim == PURPLE_STATUS_EXTENDED_AWAY) + pixbuf = gtk_widget_render_icon (GTK_WIDGET(status_box), PIDGIN_STOCK_STATUS_XA, + icon_size, "PidginStatusBox"); + else if (prim == PURPLE_STATUS_INVISIBLE) + pixbuf = gtk_widget_render_icon (GTK_WIDGET(status_box), PIDGIN_STOCK_STATUS_INVISIBLE, + icon_size, "PidginStatusBox"); + else if (prim == PURPLE_STATUS_OFFLINE) + pixbuf = gtk_widget_render_icon (GTK_WIDGET(status_box), PIDGIN_STOCK_STATUS_OFFLINE, + icon_size, "PidginStatusBox"); + else + pixbuf = gtk_widget_render_icon (GTK_WIDGET(status_box), PIDGIN_STOCK_STATUS_AVAILABLE, + icon_size, "PidginStatusBox"); + return pixbuf; +} + /** * This updates the text displayed on the status box so that it shows * the current status. This is the only function in this file that @@ -636,7 +672,6 @@ { PurpleStatusType *status_type; PurpleStatusPrimitive prim; - GtkIconSize icon_size = gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL); if (account_status) { status_type = purple_status_get_type(purple_account_get_active_status(acct)); prim = purple_status_type_get_primitive(status_type); @@ -644,21 +679,7 @@ prim = purple_savedstatus_get_type(saved_status); } - if (prim == PURPLE_STATUS_UNAVAILABLE) - pixbuf = gtk_widget_render_icon (GTK_WIDGET(status_box), PIDGIN_STOCK_STATUS_BUSY, - icon_size, "PidginStatusBox"); - else if (prim == PURPLE_STATUS_AWAY) - pixbuf = gtk_widget_render_icon (GTK_WIDGET(status_box), PIDGIN_STOCK_STATUS_AWAY, - icon_size, "PidginStatusBox"); - else if (prim == PURPLE_STATUS_EXTENDED_AWAY) - pixbuf = gtk_widget_render_icon (GTK_WIDGET(status_box), PIDGIN_STOCK_STATUS_XA, - icon_size, "PidginStatusBox"); - else if (prim == PURPLE_STATUS_OFFLINE) - pixbuf = gtk_widget_render_icon (GTK_WIDGET(status_box), PIDGIN_STOCK_STATUS_OFFLINE, - icon_size, "PidginStatusBox"); - else - pixbuf = gtk_widget_render_icon (GTK_WIDGET(status_box), PIDGIN_STOCK_STATUS_AVAILABLE, - icon_size, "PidginStatusBox"); + pixbuf = pidgin_status_box_get_pixbuf(status_box, prim); #if 0 if (account_status) pixbuf = pidgin_create_prpl_icon_with_status(acct, @@ -876,17 +897,15 @@ static void add_popular_statuses(PidginStatusBox *statusbox) { - GtkIconSize icon_size; GList *list, *cur; GdkPixbuf *pixbuf; + PidginStatusBoxItemType type = PIDGIN_STATUS_BOX_TYPE_POPULAR; list = purple_savedstatuses_get_popular(6); if (list == NULL) /* Odd... oh well, nothing we can do about it. */ return; - icon_size = gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL); - pidgin_status_box_add_separator(statusbox); for (cur = list; cur != NULL; cur = cur->next) @@ -899,21 +918,8 @@ /* Get an appropriate status icon */ prim = purple_savedstatus_get_type(saved); - if (prim == PURPLE_STATUS_UNAVAILABLE) - pixbuf = gtk_widget_render_icon (GTK_WIDGET(statusbox), - PIDGIN_STOCK_STATUS_BUSY, icon_size, "PidginStatusBox"); - else if (prim == PURPLE_STATUS_AWAY) - pixbuf = gtk_widget_render_icon (GTK_WIDGET(statusbox), - PIDGIN_STOCK_STATUS_AWAY, icon_size, "PidginStatusBox"); - else if (prim == PURPLE_STATUS_EXTENDED_AWAY) - pixbuf = gtk_widget_render_icon (GTK_WIDGET(statusbox), - PIDGIN_STOCK_STATUS_XA, icon_size, "PidginStatusBox"); - else if (prim == PURPLE_STATUS_OFFLINE) - pixbuf = gtk_widget_render_icon (GTK_WIDGET(statusbox), - PIDGIN_STOCK_STATUS_OFFLINE, icon_size, "PidginStatusBox"); - else - pixbuf = gtk_widget_render_icon (GTK_WIDGET(statusbox), - PIDGIN_STOCK_STATUS_AVAILABLE, icon_size, "PidginStatusBox"); + + pixbuf = pidgin_status_box_get_pixbuf(statusbox, prim); if (purple_savedstatus_is_transient(saved)) { @@ -931,23 +937,10 @@ stripped = purple_markup_strip_html(message); purple_util_chrreplace(stripped, '\n', ' '); } -#if 0 - /* Overlay a disk in the bottom left corner */ - emblem = gtk_widget_render_icon(GTK_WIDGET(statusbox->vbox), - GTK_STOCK_SAVE, icon_size, "PidginStatusBox"); - if (emblem != NULL) - { - width = gdk_pixbuf_get_width(pixbuf) / 2; - height = gdk_pixbuf_get_height(pixbuf) / 2; - gdk_pixbuf_composite(emblem, pixbuf, 0, height, - width, height, 0, height, - 0.5, 0.5, GDK_INTERP_BILINEAR, 255); - g_object_unref(G_OBJECT(emblem)); - } -#endif + type = PIDGIN_STATUS_BOX_TYPE_SAVED_POPULAR; } - pidgin_status_box_add(statusbox, PIDGIN_STATUS_BOX_TYPE_POPULAR, + pidgin_status_box_add(statusbox, type, pixbuf, purple_savedstatus_get_title(saved), stripped, GINT_TO_POINTER(purple_savedstatus_get_creation_time(saved))); g_free(stripped); @@ -1019,28 +1012,13 @@ { PurpleStatusType *status_type = (PurpleStatusType *)l->data; PurpleStatusPrimitive prim; - GtkIconSize icon_size = gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL); if (!purple_status_type_is_user_settable(status_type)) continue; prim = purple_status_type_get_primitive(status_type); - if (prim == PURPLE_STATUS_UNAVAILABLE) - pixbuf = gtk_widget_render_icon (GTK_WIDGET(status_box), PIDGIN_STOCK_STATUS_BUSY, - icon_size, "PidginStatusBox"); - else if (prim == PURPLE_STATUS_AWAY) - pixbuf = gtk_widget_render_icon (GTK_WIDGET(status_box), PIDGIN_STOCK_STATUS_AWAY, - icon_size, "PidginStatusBox"); - else if (prim == PURPLE_STATUS_EXTENDED_AWAY) - pixbuf = gtk_widget_render_icon (GTK_WIDGET(status_box), PIDGIN_STOCK_STATUS_XA, - icon_size, "PidginStatusBox"); - else if (prim == PURPLE_STATUS_OFFLINE) - pixbuf = gtk_widget_render_icon (GTK_WIDGET(status_box), PIDGIN_STOCK_STATUS_OFFLINE, - icon_size, "PidginStatusBox"); - else - pixbuf = gtk_widget_render_icon (GTK_WIDGET(status_box), PIDGIN_STOCK_STATUS_AVAILABLE, - icon_size, "PidginStatusBox"); + pixbuf = pidgin_status_box_get_pixbuf(status_box, prim); pidgin_status_box_add(PIDGIN_STATUS_BOX(status_box), PIDGIN_STATUS_BOX_TYPE_PRIMITIVE, pixbuf, @@ -1083,7 +1061,7 @@ icon_size, "PidginStatusBox"); pixbuf3 = gtk_widget_render_icon (GTK_WIDGET(status_box->vbox), PIDGIN_STOCK_STATUS_OFFLINE, icon_size, "PidginStatusBox"); - pixbuf4 = gtk_widget_render_icon (GTK_WIDGET(status_box->vbox), PIDGIN_STOCK_STATUS_AVAILABLE_I, + pixbuf4 = gtk_widget_render_icon (GTK_WIDGET(status_box->vbox), PIDGIN_STOCK_STATUS_INVISIBLE, icon_size, "PidginStatusBox"); pidgin_status_box_add(PIDGIN_STATUS_BOX(status_box), PIDGIN_STATUS_BOX_TYPE_PRIMITIVE, pixbuf, _("Available"), NULL, GINT_TO_POINTER(PURPLE_STATUS_AVAILABLE)); @@ -1099,8 +1077,8 @@ add_popular_statuses(status_box); pidgin_status_box_add_separator(PIDGIN_STATUS_BOX(status_box)); - pidgin_status_box_add(PIDGIN_STATUS_BOX(status_box), PIDGIN_STATUS_BOX_TYPE_CUSTOM, pixbuf, _("New..."), NULL, NULL); - pidgin_status_box_add(PIDGIN_STATUS_BOX(status_box), PIDGIN_STATUS_BOX_TYPE_SAVED, pixbuf, _("Saved..."), NULL, NULL); + pidgin_status_box_add(PIDGIN_STATUS_BOX(status_box), PIDGIN_STATUS_BOX_TYPE_CUSTOM, NULL, _("New..."), NULL, NULL); + pidgin_status_box_add(PIDGIN_STATUS_BOX(status_box), PIDGIN_STATUS_BOX_TYPE_SAVED, NULL, _("Saved..."), NULL, NULL); if (pixbuf) g_object_unref(G_OBJECT(pixbuf)); status_menu_refresh_iter(status_box); @@ -1606,6 +1584,7 @@ { GtkCellRenderer *text_rend; GtkCellRenderer *icon_rend; + GtkCellRenderer *emblem_rend; GtkTextBuffer *buffer; GtkWidget *toplevel; GtkTreeSelection *sel; @@ -1621,9 +1600,11 @@ status_box->vsep = gtk_vseparator_new(); status_box->arrow = gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_NONE); - status_box->store = gtk_list_store_new(NUM_COLUMNS, G_TYPE_INT, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER); - status_box->dropdown_store = gtk_list_store_new(NUM_COLUMNS, G_TYPE_INT, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER); -; + status_box->store = gtk_list_store_new(NUM_COLUMNS, G_TYPE_INT, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING, + G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_STRING, G_TYPE_BOOLEAN); + status_box->dropdown_store = gtk_list_store_new(NUM_COLUMNS, G_TYPE_INT, GDK_TYPE_PIXBUF, G_TYPE_STRING, + G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_STRING, G_TYPE_BOOLEAN); + gtk_cell_view_set_model(GTK_CELL_VIEW(status_box->cell_view), GTK_TREE_MODEL(status_box->store)); gtk_list_store_append(status_box->store, &(status_box->iter)); @@ -1638,7 +1619,7 @@ text_rend = gtk_cell_renderer_text_new(); icon_rend = gtk_cell_renderer_pixbuf_new(); - + emblem_rend = gtk_cell_renderer_pixbuf_new(); status_box->popup_window = gtk_window_new (GTK_WINDOW_POPUP); toplevel = gtk_widget_get_toplevel (GTK_WIDGET (status_box)); @@ -1689,8 +1670,10 @@ status_box->column); gtk_tree_view_column_pack_start(status_box->column, icon_rend, FALSE); gtk_tree_view_column_pack_start(status_box->column, text_rend, TRUE); + gtk_tree_view_column_pack_start(status_box->column, emblem_rend, FALSE); gtk_tree_view_column_set_attributes(status_box->column, icon_rend, "pixbuf", ICON_COLUMN, NULL); gtk_tree_view_column_set_attributes(status_box->column, text_rend, "markup", TEXT_COLUMN, NULL); + gtk_tree_view_column_set_attributes(status_box->column, emblem_rend, "stock-id", EMBLEM_COLUMN, "visible", EMBLEM_VISIBLE_COLUMN, NULL); gtk_container_add(GTK_CONTAINER(status_box->scrolled_window), status_box->tree_view); gtk_widget_show(status_box->tree_view); gtk_tree_view_set_search_column(GTK_TREE_VIEW(status_box->tree_view), TEXT_COLUMN); @@ -2002,6 +1985,8 @@ TITLE_COLUMN, title, DESC_COLUMN, desc, DATA_COLUMN, data, + EMBLEM_VISIBLE_COLUMN, type == PIDGIN_STATUS_BOX_TYPE_SAVED_POPULAR, + EMBLEM_COLUMN, GTK_STOCK_SAVE, -1); g_free(text); } @@ -2062,11 +2047,10 @@ if (status_box->buddy_icon == NULL) { /* Show a placeholder icon */ - gchar *filename; - filename = g_build_filename(DATADIR, "pixmaps", - "pidgin", "insert-image.png", NULL); - status_box->buddy_icon = gdk_pixbuf_new_from_file(filename, NULL); - g_free(filename); + GtkIconSize icon_size = gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_SMALL); + status_box->buddy_icon = gtk_widget_render_icon(GTK_WIDGET(status_box), + PIDGIN_STOCK_TOOLBAR_SELECT_AVATAR, + icon_size, "PidginStatusBox"); } if (status_box->buddy_icon != NULL) {