Mercurial > pidgin.yaz
comparison pidgin/gtkstatusbox.c @ 15413:e6b40365930c
More statusbox tweaks:
- Integrate more Tango icons
- When using opaque buddy icons, draw a slight button
border around the icon selector, causing it to look
better next to the status dropdown.
author | Sean Egan <seanegan@gmail.com> |
---|---|
date | Thu, 25 Jan 2007 08:42:26 +0000 |
parents | 74ab783e3676 |
children | 9c0cf4db1f4d |
comparison
equal
deleted
inserted
replaced
15412:c2d21369098e | 15413:e6b40365930c |
---|---|
591 if (status_box->typing != 0) | 591 if (status_box->typing != 0) |
592 pixbuf = status_box->typing_pixbufs[status_box->typing_index]; | 592 pixbuf = status_box->typing_pixbufs[status_box->typing_index]; |
593 else if (status_box->connecting) | 593 else if (status_box->connecting) |
594 pixbuf = status_box->connecting_pixbufs[status_box->connecting_index]; | 594 pixbuf = status_box->connecting_pixbufs[status_box->connecting_index]; |
595 else | 595 else |
596 { | 596 { |
597 GaimStatusType *status_type; | |
598 GaimStatusPrimitive prim; | |
599 GtkIconSize icon_size = gtk_icon_size_from_name(GAIM_ICON_SIZE_TANGO_EXTRA_SMALL); | |
600 if (account_status) { | |
601 status_type = gaim_status_get_type(gaim_account_get_active_status(acct)); | |
602 prim = gaim_status_type_get_primitive(status_type); | |
603 } else { | |
604 prim = gaim_savedstatus_get_type(saved_status); | |
605 } | |
606 | |
607 if (prim == GAIM_STATUS_UNAVAILABLE) | |
608 pixbuf = gtk_widget_render_icon (GTK_WIDGET(status_box), GAIM_STOCK_STATUS_BUSY, | |
609 icon_size, "GtkTreeView"); | |
610 else if (prim == GAIM_STATUS_AWAY) | |
611 pixbuf = gtk_widget_render_icon (GTK_WIDGET(status_box), GAIM_STOCK_STATUS_AWAY, | |
612 icon_size, "GtkTreeView"); | |
613 else if (prim == GAIM_STATUS_EXTENDED_AWAY) | |
614 pixbuf = gtk_widget_render_icon (GTK_WIDGET(status_box), GAIM_STOCK_STATUS_XA, | |
615 icon_size, "GtkTreeView"); | |
616 else if (prim == GAIM_STATUS_OFFLINE) | |
617 pixbuf = gtk_widget_render_icon (GTK_WIDGET(status_box), GAIM_STOCK_STATUS_OFFLINE, | |
618 icon_size, "GtkTreeView"); | |
619 else | |
620 pixbuf = gtk_widget_render_icon (GTK_WIDGET(status_box), GAIM_STOCK_STATUS_AVAILABLE, | |
621 icon_size, "GtkTreeView"); | |
622 #if 0 | |
597 if (account_status) | 623 if (account_status) |
598 pixbuf = gaim_gtk_create_prpl_icon_with_status(acct, | 624 pixbuf = gaim_gtk_create_prpl_icon_with_status(acct, |
599 gaim_status_get_type(gaim_account_get_active_status(acct)), | 625 gaim_status_get_type(gaim_account_get_active_status(acct)), |
600 0.5); | 626 0.5); |
601 else | 627 else |
619 width, height, 0, height, | 645 width, height, 0, height, |
620 0.5, 0.5, GDK_INTERP_BILINEAR, 255); | 646 0.5, 0.5, GDK_INTERP_BILINEAR, 255); |
621 g_object_unref(G_OBJECT(emblem)); | 647 g_object_unref(G_OBJECT(emblem)); |
622 } | 648 } |
623 } | 649 } |
650 #endif | |
651 | |
624 } | 652 } |
625 | 653 |
626 if (status_box->account != NULL) { | 654 if (status_box->account != NULL) { |
627 text = g_strdup_printf("%s - <span size=\"smaller\" color=\"%s\">%s</span>", | 655 text = g_strdup_printf("%s - <span size=\"smaller\" color=\"%s\">%s</span>", |
628 gaim_account_get_username(status_box->account), | 656 gaim_account_get_username(status_box->account), |
825 for (cur = list; cur != NULL; cur = cur->next) | 853 for (cur = list; cur != NULL; cur = cur->next) |
826 { | 854 { |
827 GaimSavedStatus *saved = cur->data; | 855 GaimSavedStatus *saved = cur->data; |
828 const gchar *message; | 856 const gchar *message; |
829 gchar *stripped = NULL; | 857 gchar *stripped = NULL; |
858 GaimStatusPrimitive prim; | |
830 | 859 |
831 /* Get an appropriate status icon */ | 860 /* Get an appropriate status icon */ |
832 pixbuf = gaim_gtk_create_gaim_icon_with_status( | 861 prim = gaim_savedstatus_get_type(saved); |
833 gaim_savedstatus_get_type(saved), | 862 |
834 0.5); | 863 if (prim == GAIM_STATUS_UNAVAILABLE) |
835 | 864 pixbuf = gtk_widget_render_icon (GTK_WIDGET(statusbox), GAIM_STOCK_STATUS_BUSY, |
865 icon_size, "GtkTreeView"); | |
866 else if (prim == GAIM_STATUS_AWAY) | |
867 pixbuf = gtk_widget_render_icon (GTK_WIDGET(statusbox), GAIM_STOCK_STATUS_AWAY, | |
868 icon_size, "GtkTreeView"); | |
869 else if (prim == GAIM_STATUS_EXTENDED_AWAY) | |
870 pixbuf = gtk_widget_render_icon (GTK_WIDGET(statusbox), GAIM_STOCK_STATUS_XA, | |
871 icon_size, "GtkTreeView"); | |
872 else if (prim == GAIM_STATUS_OFFLINE) | |
873 pixbuf = gtk_widget_render_icon (GTK_WIDGET(statusbox), GAIM_STOCK_STATUS_OFFLINE, | |
874 icon_size, "GtkTreeView"); | |
875 else | |
876 pixbuf = gtk_widget_render_icon (GTK_WIDGET(statusbox), GAIM_STOCK_STATUS_AVAILABLE, | |
877 icon_size, "GtkTreeView"); | |
878 | |
836 if (gaim_savedstatus_is_transient(saved)) | 879 if (gaim_savedstatus_is_transient(saved)) |
837 { | 880 { |
838 /* | 881 /* |
839 * Transient statuses do not have a title, so the savedstatus | 882 * Transient statuses do not have a title, so the savedstatus |
840 * API returns the message when gaim_savedstatus_get_title() is | 883 * API returns the message when gaim_savedstatus_get_title() is |
847 if (message != NULL) | 890 if (message != NULL) |
848 { | 891 { |
849 stripped = gaim_markup_strip_html(message); | 892 stripped = gaim_markup_strip_html(message); |
850 gaim_util_chrreplace(stripped, '\n', ' '); | 893 gaim_util_chrreplace(stripped, '\n', ' '); |
851 } | 894 } |
852 | 895 #if 0 |
853 /* Overlay a disk in the bottom left corner */ | 896 /* Overlay a disk in the bottom left corner */ |
854 emblem = gtk_widget_render_icon(GTK_WIDGET(statusbox->vbox), | 897 emblem = gtk_widget_render_icon(GTK_WIDGET(statusbox->vbox), |
855 GTK_STOCK_SAVE, icon_size, "GtkGaimStatusBox"); | 898 GTK_STOCK_SAVE, icon_size, "GtkGaimStatusBox"); |
856 if (emblem != NULL) | 899 if (emblem != NULL) |
857 { | 900 { |
860 gdk_pixbuf_composite(emblem, pixbuf, 0, height, | 903 gdk_pixbuf_composite(emblem, pixbuf, 0, height, |
861 width, height, 0, height, | 904 width, height, 0, height, |
862 0.5, 0.5, GDK_INTERP_BILINEAR, 255); | 905 0.5, 0.5, GDK_INTERP_BILINEAR, 255); |
863 g_object_unref(G_OBJECT(emblem)); | 906 g_object_unref(G_OBJECT(emblem)); |
864 } | 907 } |
908 #endif | |
865 } | 909 } |
866 | 910 |
867 gtk_gaim_status_box_add(statusbox, GTK_GAIM_STATUS_BOX_TYPE_POPULAR, | 911 gtk_gaim_status_box_add(statusbox, GTK_GAIM_STATUS_BOX_TYPE_POPULAR, |
868 pixbuf, gaim_savedstatus_get_title(saved), stripped, | 912 pixbuf, gaim_savedstatus_get_title(saved), stripped, |
869 GINT_TO_POINTER(gaim_savedstatus_get_creation_time(saved))); | 913 GINT_TO_POINTER(gaim_savedstatus_get_creation_time(saved))); |
928 static void | 972 static void |
929 add_account_statuses(GtkGaimStatusBox *status_box, GaimAccount *account) | 973 add_account_statuses(GtkGaimStatusBox *status_box, GaimAccount *account) |
930 { | 974 { |
931 /* Per-account */ | 975 /* Per-account */ |
932 const GList *l; | 976 const GList *l; |
933 GdkPixbuf *tmp; | 977 GdkPixbuf *pixbuf; |
934 | 978 |
935 for (l = gaim_account_get_status_types(account); l != NULL; l = l->next) | 979 for (l = gaim_account_get_status_types(account); l != NULL; l = l->next) |
936 { | 980 { |
937 GaimStatusType *status_type = (GaimStatusType *)l->data; | 981 GaimStatusType *status_type = (GaimStatusType *)l->data; |
982 GaimStatusPrimitive prim; | |
983 GtkIconSize icon_size = gtk_icon_size_from_name(GAIM_ICON_SIZE_TANGO_EXTRA_SMALL); | |
938 | 984 |
939 if (!gaim_status_type_is_user_settable(status_type)) | 985 if (!gaim_status_type_is_user_settable(status_type)) |
940 continue; | 986 continue; |
941 | 987 |
942 tmp = gaim_gtk_create_prpl_icon_with_status(account, status_type, 0.5); | 988 prim = gaim_status_type_get_primitive(status_type); |
989 | |
990 if (prim == GAIM_STATUS_UNAVAILABLE) | |
991 pixbuf = gtk_widget_render_icon (GTK_WIDGET(status_box), GAIM_STOCK_STATUS_BUSY, | |
992 icon_size, "GtkTreeView"); | |
993 else if (prim == GAIM_STATUS_AWAY) | |
994 pixbuf = gtk_widget_render_icon (GTK_WIDGET(status_box), GAIM_STOCK_STATUS_AWAY, | |
995 icon_size, "GtkTreeView"); | |
996 else if (prim == GAIM_STATUS_EXTENDED_AWAY) | |
997 pixbuf = gtk_widget_render_icon (GTK_WIDGET(status_box), GAIM_STOCK_STATUS_XA, | |
998 icon_size, "GtkTreeView"); | |
999 else if (prim == GAIM_STATUS_OFFLINE) | |
1000 pixbuf = gtk_widget_render_icon (GTK_WIDGET(status_box), GAIM_STOCK_STATUS_OFFLINE, | |
1001 icon_size, "GtkTreeView"); | |
1002 else | |
1003 pixbuf = gtk_widget_render_icon (GTK_WIDGET(status_box), GAIM_STOCK_STATUS_AVAILABLE, | |
1004 icon_size, "GtkTreeView"); | |
1005 | |
943 gtk_gaim_status_box_add(GTK_GAIM_STATUS_BOX(status_box), | 1006 gtk_gaim_status_box_add(GTK_GAIM_STATUS_BOX(status_box), |
944 GTK_GAIM_STATUS_BOX_TYPE_PRIMITIVE, tmp, | 1007 GTK_GAIM_STATUS_BOX_TYPE_PRIMITIVE, pixbuf, |
945 gaim_status_type_get_name(status_type), | 1008 gaim_status_type_get_name(status_type), |
946 NULL, | 1009 NULL, |
947 GINT_TO_POINTER(gaim_status_type_get_primitive(status_type))); | 1010 GINT_TO_POINTER(gaim_status_type_get_primitive(status_type))); |
948 if (tmp != NULL) | 1011 if (pixbuf != NULL) |
949 g_object_unref(tmp); | 1012 g_object_unref(pixbuf); |
950 } | 1013 } |
951 } | 1014 } |
952 | 1015 |
953 static void | 1016 static void |
954 gtk_gaim_status_box_regenerate(GtkGaimStatusBox *status_box) | 1017 gtk_gaim_status_box_regenerate(GtkGaimStatusBox *status_box) |
1671 gint border_width = GTK_CONTAINER (widget)->border_width; | 1734 gint border_width = GTK_CONTAINER (widget)->border_width; |
1672 | 1735 |
1673 gtk_widget_size_request(GTK_GAIM_STATUS_BOX(widget)->toggle_button, requisition); | 1736 gtk_widget_size_request(GTK_GAIM_STATUS_BOX(widget)->toggle_button, requisition); |
1674 | 1737 |
1675 /* Make this icon the same size as other buddy icons in the list; unless it already wants to be bigger */ | 1738 /* Make this icon the same size as other buddy icons in the list; unless it already wants to be bigger */ |
1676 requisition->height = MAX(requisition->height, 32 + (border_width*2)); | 1739 requisition->height = MAX(requisition->height, 34); |
1740 requisition->height += border_width * 2; | |
1677 | 1741 |
1678 /* If the gtkimhtml is visible, then add some additional padding */ | 1742 /* If the gtkimhtml is visible, then add some additional padding */ |
1679 gtk_widget_size_request(GTK_GAIM_STATUS_BOX(widget)->vbox, &box_req); | 1743 gtk_widget_size_request(GTK_GAIM_STATUS_BOX(widget)->vbox, &box_req); |
1680 if (box_req.height > 1) | 1744 if (box_req.height > 1) |
1681 requisition->height += box_req.height + border_width * 2; | 1745 requisition->height += box_req.height + border_width * 2; |
1733 gint border_width = GTK_CONTAINER (widget)->border_width; | 1797 gint border_width = GTK_CONTAINER (widget)->border_width; |
1734 | 1798 |
1735 gtk_widget_size_request(status_box->toggle_button, &req); | 1799 gtk_widget_size_request(status_box->toggle_button, &req); |
1736 /* Make this icon the same size as other buddy icons in the list; unless it already wants to be bigger */ | 1800 /* Make this icon the same size as other buddy icons in the list; unless it already wants to be bigger */ |
1737 | 1801 |
1738 req.height = MAX(req.height, 32 + (border_width*2)); | 1802 req.height = MAX(req.height, 34); |
1803 req.height += border_width * 2; | |
1739 | 1804 |
1740 box_alc = *allocation; | 1805 box_alc = *allocation; |
1741 | 1806 |
1742 box_alc.width -= (border_width * 2); | 1807 box_alc.width -= (border_width * 2); |
1743 box_alc.height = MAX(1, ((allocation->height - req.height) - (border_width*2))); | 1808 box_alc.height = MAX(1, ((allocation->height - req.height) - (border_width*2))); |
1753 | 1818 |
1754 if (status_box->icon_box) | 1819 if (status_box->icon_box) |
1755 { | 1820 { |
1756 GtkTextDirection dir = gtk_widget_get_direction(widget); | 1821 GtkTextDirection dir = gtk_widget_get_direction(widget); |
1757 parent_alc.width -= (parent_alc.height + border_width); | 1822 parent_alc.width -= (parent_alc.height + border_width); |
1758 icon_alc = *allocation; | 1823 icon_alc = parent_alc; |
1759 icon_alc.height = MAX(1,req.height) - (border_width*2); | 1824 icon_alc.height = MAX(1,req.height) - (border_width*2) -2; |
1760 icon_alc.width = icon_alc.height; | 1825 icon_alc.width = icon_alc.height; |
1761 if (dir == GTK_TEXT_DIR_RTL) { | 1826 if (dir == GTK_TEXT_DIR_RTL) { |
1762 icon_alc.x = parent_alc.x; | 1827 icon_alc.x = parent_alc.x; |
1763 parent_alc.x += icon_alc.width + border_width; | 1828 parent_alc.x += icon_alc.width + border_width; |
1764 } else { | 1829 } else { |
1765 icon_alc.x = allocation->width - (icon_alc.width + border_width); | 1830 icon_alc.x = allocation->width - (icon_alc.width + border_width + 1); |
1766 } | 1831 } |
1767 icon_alc.y += border_width; | 1832 icon_alc.y += 1; |
1768 | 1833 |
1769 if (status_box->icon_size != icon_alc.height) | 1834 if (status_box->icon_size != icon_alc.height) |
1770 { | 1835 { |
1771 status_box->icon_size = icon_alc.height; | 1836 status_box->icon_size = icon_alc.height; |
1772 gtk_gaim_status_box_redisplay_buddy_icon(status_box); | 1837 gtk_gaim_status_box_redisplay_buddy_icon(status_box); |
1773 } | 1838 } |
1774 gtk_widget_size_allocate(status_box->icon_box, &icon_alc); | 1839 gtk_widget_size_allocate(status_box->icon_box, &icon_alc); |
1775 } | 1840 } |
1776 | |
1777 gtk_widget_size_allocate(status_box->toggle_button, &parent_alc); | 1841 gtk_widget_size_allocate(status_box->toggle_button, &parent_alc); |
1778 widget->allocation = *allocation; | 1842 widget->allocation = *allocation; |
1779 } | 1843 } |
1780 | 1844 |
1781 static gboolean | 1845 static gboolean |
1783 GdkEventExpose *event) | 1847 GdkEventExpose *event) |
1784 { | 1848 { |
1785 GtkGaimStatusBox *status_box = GTK_GAIM_STATUS_BOX(widget); | 1849 GtkGaimStatusBox *status_box = GTK_GAIM_STATUS_BOX(widget); |
1786 gtk_container_propagate_expose(GTK_CONTAINER(widget), status_box->vbox, event); | 1850 gtk_container_propagate_expose(GTK_CONTAINER(widget), status_box->vbox, event); |
1787 gtk_container_propagate_expose(GTK_CONTAINER(widget), status_box->toggle_button, event); | 1851 gtk_container_propagate_expose(GTK_CONTAINER(widget), status_box->toggle_button, event); |
1788 if (status_box->icon_box) | 1852 if (status_box->icon_box && status_box->icon_opaque) { |
1789 gtk_container_propagate_expose(GTK_CONTAINER(widget), status_box->icon_box, event); | 1853 gtk_paint_box(widget->style, widget->window, GTK_STATE_NORMAL, GTK_SHADOW_OUT, NULL, |
1854 status_box->icon_box, "button", status_box->icon_box->allocation.x-1, status_box->icon_box->allocation.y-1, | |
1855 34, 34); | |
1856 } | |
1790 return FALSE; | 1857 return FALSE; |
1791 } | 1858 } |
1792 | 1859 |
1793 static void | 1860 static void |
1794 gtk_gaim_status_box_forall(GtkContainer *container, | 1861 gtk_gaim_status_box_forall(GtkContainer *container, |
1947 status_box->buddy_icon = gdk_pixbuf_new_from_file(filename, NULL); | 2014 status_box->buddy_icon = gdk_pixbuf_new_from_file(filename, NULL); |
1948 g_free(filename); | 2015 g_free(filename); |
1949 } | 2016 } |
1950 | 2017 |
1951 if (status_box->buddy_icon != NULL) { | 2018 if (status_box->buddy_icon != NULL) { |
2019 status_box->icon_opaque = gaim_gdk_pixbuf_is_opaque(status_box->buddy_icon); | |
1952 gtk_image_set_from_pixbuf(GTK_IMAGE(status_box->icon), status_box->buddy_icon); | 2020 gtk_image_set_from_pixbuf(GTK_IMAGE(status_box->icon), status_box->buddy_icon); |
1953 status_box->buddy_icon_hover = gdk_pixbuf_copy(status_box->buddy_icon); | 2021 status_box->buddy_icon_hover = gdk_pixbuf_copy(status_box->buddy_icon); |
1954 do_colorshift(status_box->buddy_icon_hover, status_box->buddy_icon_hover, 32); | 2022 do_colorshift(status_box->buddy_icon_hover, status_box->buddy_icon_hover, 32); |
2023 gtk_widget_queue_resize(GTK_WIDGET(status_box)); | |
1955 } | 2024 } |
1956 } | 2025 } |
1957 | 2026 |
1958 void | 2027 void |
1959 gtk_gaim_status_box_set_buddy_icon(GtkGaimStatusBox *status_box, const char *filename) | 2028 gtk_gaim_status_box_set_buddy_icon(GtkGaimStatusBox *status_box, const char *filename) |