From 2ac1c1760adf98f465e2977f85fcc641edc29d13 Mon Sep 17 00:00:00 2001 From: hiro Date: Wed, 31 Jan 2007 07:26:51 +0000 Subject: reimplemented the toolbar with new APIs. git-svn-id: svn://sylpheed.sraoss.jp/sylpheed/trunk@1514 ee746299-78ed-0310-b773-934348b2243d --- ChangeLog | 9 +++++++ ChangeLog.ja | 9 +++++++ src/compose.c | 79 +++++++++++++++++++++++++++++++++++++------------------- src/gtkutils.c | 22 ++++++++++++---- src/gtkutils.h | 6 ++++- src/mainwindow.c | 70 +++++++++++++++++++++++++++++++++++-------------- src/menu.c | 1 - 7 files changed, 143 insertions(+), 53 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3645919a..9e9e4dcd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2007-01-31 + + * src/compose.c + src/menu.c + src/gtkutils.[ch] + src/mainwindow.c: reimplemented the toolbar with new APIs. + Overflow menu was added, and the size of button became not fully + homogeneous. + 2007-01-30 * libsylph/mh.c: mh_scan_tree_recursive(): also scan symbolic links. diff --git a/ChangeLog.ja b/ChangeLog.ja index f9637cf1..bb75bd48 100644 --- a/ChangeLog.ja +++ b/ChangeLog.ja @@ -1,3 +1,12 @@ +2007-01-31 + + * src/compose.c + src/menu.c + src/gtkutils.[ch] + src/mainwindow.c: ツールバーを新しい API で実装し直した。 + オーバーフローメニューを追加。ボタンのサイズを全て同一にはしない + ようにした。 + 2007-01-30 * libsylph/mh.c: mh_scan_tree_recursive(): シンボリックリンクも diff --git a/src/compose.c b/src/compose.c index 2455e391..5eefede0 100644 --- a/src/compose.c +++ b/src/compose.c @@ -50,6 +50,9 @@ #include #include #include +#include +#include +#include #include #include #include @@ -4736,11 +4739,16 @@ static Compose *compose_create(PrefsAccount *account, ComposeMode mode) FALSE); #endif - gtk_widget_set_sensitive(compose->insert_btn, FALSE); - gtk_widget_set_sensitive(compose->attach_btn, FALSE); - gtk_widget_set_sensitive(compose->sig_btn, FALSE); - gtk_widget_set_sensitive(compose->exteditor_btn, FALSE); - gtk_widget_set_sensitive(compose->linewrap_btn, FALSE); + if (compose->insert_btn) + gtk_widget_set_sensitive(compose->insert_btn, FALSE); + if (compose->attach_btn) + gtk_widget_set_sensitive(compose->attach_btn, FALSE); + if (compose->sig_btn) + gtk_widget_set_sensitive(compose->sig_btn, FALSE); + if (compose->exteditor_btn) + gtk_widget_set_sensitive(compose->exteditor_btn, FALSE); + if (compose->linewrap_btn) + gtk_widget_set_sensitive(compose->linewrap_btn, FALSE); /* gtk_widget_set_sensitive(compose->attach_toggle, FALSE); */ @@ -4892,7 +4900,7 @@ static GtkWidget *compose_toolbar_create_from_list(Compose *compose, { GtkWidget *toolbar; GtkWidget *icon_wid; - GtkWidget *button; + GtkToolItem *toolitem; gint i; GList *cur; @@ -4900,8 +4908,6 @@ static GtkWidget *compose_toolbar_create_from_list(Compose *compose, gtk_toolbar_set_orientation(GTK_TOOLBAR(toolbar), GTK_ORIENTATION_HORIZONTAL); gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_BOTH); - gtk_toolbar_set_icon_size(GTK_TOOLBAR(toolbar), - GTK_ICON_SIZE_LARGE_TOOLBAR); g_signal_connect(G_OBJECT(toolbar), "button_press_event", G_CALLBACK(toolbar_button_pressed), compose); @@ -4920,9 +4926,12 @@ static GtkWidget *compose_toolbar_create_from_list(Compose *compose, for (cur = item_list; cur != NULL; cur = cur->next) { const PrefsDisplayItem *ditem = cur->data; PrefsToolbarItem *item; + GtkTooltips *tips; + gint width; if (ditem->id == T_SEPARATOR) { - gtk_toolbar_append_space(GTK_TOOLBAR(toolbar)); + toolitem = gtk_separator_tool_item_new(); + gtk_toolbar_insert(GTK_TOOLBAR(toolbar), toolitem, -1); continue; } @@ -4933,19 +4942,31 @@ static GtkWidget *compose_toolbar_create_from_list(Compose *compose, if (item->id == -1) continue; - icon_wid = stock_pixbuf_widget(NULL, item->icon); + if (item->stock_id) { + icon_wid = gtk_image_new_from_stock + (item->stock_id, GTK_ICON_SIZE_LARGE_TOOLBAR); + } else + icon_wid = stock_pixbuf_widget(NULL, item->icon); + + toolitem = gtk_tool_button_new(icon_wid, gettext(ditem->label)); + tips = gtk_tooltips_new(); + gtk_tool_item_set_tooltip(toolitem, tips, + gettext(item->tooltip), ditem->name); + + gtkut_get_str_size(GTK_WIDGET(toolitem), gettext(ditem->label), + &width, NULL); + gtk_tool_item_set_homogeneous + (toolitem, width < 52 ? TRUE : FALSE); - button = gtk_toolbar_append_item(GTK_TOOLBAR(toolbar), - gettext(ditem->label), - gettext(item->tooltip), - ditem->name, icon_wid, - G_CALLBACK(item->callback), - compose); + gtk_toolbar_insert(GTK_TOOLBAR(toolbar), toolitem, -1); - g_signal_connect(G_OBJECT(button), "button_press_event", + g_signal_connect(G_OBJECT(toolitem), "clicked", + G_CALLBACK(item->callback), compose); + g_signal_connect(G_OBJECT(GTK_BIN(toolitem)->child), + "button_press_event", G_CALLBACK(toolbar_button_pressed), compose); - *(GtkWidget **)item->data = button; + *(GtkWidget **)item->data = GTK_WIDGET(toolitem); } gtk_widget_show_all(toolbar); @@ -5793,14 +5814,20 @@ static void compose_set_ext_editor_sensitive(Compose *compose, menu_set_sensitive(ifactory, "/Tools/Edit with external editor", sensitive); - gtk_widget_set_sensitive(compose->text, sensitive); - gtk_widget_set_sensitive(compose->send_btn, sensitive); - gtk_widget_set_sensitive(compose->sendl_btn, sensitive); - gtk_widget_set_sensitive(compose->draft_btn, sensitive); - gtk_widget_set_sensitive(compose->insert_btn, sensitive); - gtk_widget_set_sensitive(compose->sig_btn, sensitive); - gtk_widget_set_sensitive(compose->exteditor_btn, sensitive); - gtk_widget_set_sensitive(compose->linewrap_btn, sensitive); +#define SET_SENS(w) \ + if (compose->w) \ + gtk_widget_set_sensitive(compose->w, sensitive); + + SET_SENS(text); + SET_SENS(send_btn); + SET_SENS(sendl_btn); + SET_SENS(draft_btn); + SET_SENS(insert_btn); + SET_SENS(sig_btn); + SET_SENS(exteditor_btn); + SET_SENS(linewrap_btn); + +#undef SET_SENS } /** diff --git a/src/gtkutils.c b/src/gtkutils.c index d7c620f7..18e1b89b 100644 --- a/src/gtkutils.c +++ b/src/gtkutils.c @@ -1,6 +1,6 @@ /* * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client - * Copyright (C) 1999-2006 Hiroyuki Yamamoto + * Copyright (C) 1999-2007 Hiroyuki Yamamoto * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -47,23 +47,33 @@ #include "codeconv.h" #include "menu.h" -gboolean gtkut_get_font_size(GtkWidget *widget, gint *width, gint *height) +gboolean gtkut_get_str_size(GtkWidget *widget, const gchar *str, + gint *width, gint *height) { PangoLayout *layout; - const gchar *str = "Abcdef"; g_return_val_if_fail(GTK_IS_WIDGET(widget), FALSE); layout = gtk_widget_create_pango_layout(widget, str); g_return_val_if_fail(layout, FALSE); pango_layout_get_pixel_size(layout, width, height); - if (width) - *width = *width / g_utf8_strlen(str, -1); g_object_unref(layout); return TRUE; } +gboolean gtkut_get_font_size(GtkWidget *widget, gint *width, gint *height) +{ + const gchar *str = "Abcdef"; + gboolean ret; + + ret = gtkut_get_str_size(widget, str, width, height); + if (ret && width) + *width = *width / g_utf8_strlen(str, -1); + + return ret; +} + PangoFontDescription *gtkut_get_default_font_desc(void) { static PangoFontDescription *font_desc = NULL; @@ -262,10 +272,12 @@ ComboButton *gtkut_combo_button_create(GtkWidget *button, g_signal_connect(G_OBJECT(combo->button), "size_request", G_CALLBACK(combo_button_size_request), combo); +#if 0 g_signal_connect(G_OBJECT(combo->button), "enter", G_CALLBACK(combo_button_enter), combo); g_signal_connect(G_OBJECT(combo->button), "leave", G_CALLBACK(combo_button_leave), combo); +#endif g_signal_connect(G_OBJECT(combo->arrow), "enter", G_CALLBACK(combo_button_enter), combo); g_signal_connect(G_OBJECT(combo->arrow), "leave", diff --git a/src/gtkutils.h b/src/gtkutils.h index ebc9bfed..7afa31be 100644 --- a/src/gtkutils.h +++ b/src/gtkutils.h @@ -1,6 +1,6 @@ /* * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client - * Copyright (C) 1999-2006 Hiroyuki Yamamoto + * Copyright (C) 1999-2007 Hiroyuki Yamamoto * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -82,6 +82,10 @@ struct _ComboButton #define GTKUT_CTREE_REFRESH(clist) \ GTK_CLIST_GET_CLASS(clist)->refresh(clist) +gboolean gtkut_get_str_size (GtkWidget *widget, + const gchar *str, + gint *width, + gint *height); gboolean gtkut_get_font_size (GtkWidget *widget, gint *width, gint *height); diff --git a/src/mainwindow.c b/src/mainwindow.c index 7ebc2216..075d1f79 100644 --- a/src/mainwindow.c +++ b/src/mainwindow.c @@ -39,6 +39,9 @@ #include #include #include +#include +#include +#include #include #include #include @@ -2438,7 +2441,8 @@ static GtkWidget *main_window_toolbar_create_from_list(MainWindow *mainwin, { GtkWidget *toolbar; GtkWidget *icon_wid; - GtkWidget *button; + GtkToolItem *toolitem; + GtkToolItem *comboitem; ComboButton *combo; gint n_entries; gint i; @@ -2448,8 +2452,6 @@ static GtkWidget *main_window_toolbar_create_from_list(MainWindow *mainwin, gtk_toolbar_set_orientation(GTK_TOOLBAR(toolbar), GTK_ORIENTATION_HORIZONTAL); gtk_toolbar_set_style(GTK_TOOLBAR(toolbar), GTK_TOOLBAR_BOTH); - gtk_toolbar_set_icon_size(GTK_TOOLBAR(toolbar), - GTK_ICON_SIZE_LARGE_TOOLBAR); g_signal_connect(G_OBJECT(toolbar), "button_press_event", G_CALLBACK(toolbar_button_pressed), mainwin); @@ -2477,9 +2479,12 @@ static GtkWidget *main_window_toolbar_create_from_list(MainWindow *mainwin, for (cur = item_list; cur != NULL; cur = cur->next) { const PrefsDisplayItem *ditem = cur->data; PrefsToolbarItem *item; + GtkTooltips *tips; + gint width; if (ditem->id == T_SEPARATOR) { - gtk_toolbar_append_space(GTK_TOOLBAR(toolbar)); + toolitem = gtk_separator_tool_item_new(); + gtk_toolbar_insert(GTK_TOOLBAR(toolbar), toolitem, -1); continue; } @@ -2496,45 +2501,70 @@ static GtkWidget *main_window_toolbar_create_from_list(MainWindow *mainwin, } else icon_wid = stock_pixbuf_widget(NULL, item->icon); - button = gtk_toolbar_append_item(GTK_TOOLBAR(toolbar), - gettext(ditem->label), - gettext(item->tooltip), - ditem->name, icon_wid, - G_CALLBACK(item->callback), - mainwin); + toolitem = gtk_tool_button_new(icon_wid, gettext(ditem->label)); + tips = gtk_tooltips_new(); + gtk_tool_item_set_tooltip(toolitem, tips, + gettext(item->tooltip), ditem->name); + + gtkut_get_str_size(GTK_WIDGET(toolitem), gettext(ditem->label), + &width, NULL); + gtk_tool_item_set_homogeneous + (toolitem, width < 52 ? TRUE : FALSE); + + gtk_toolbar_insert(GTK_TOOLBAR(toolbar), toolitem, -1); - g_signal_connect(G_OBJECT(button), "button_press_event", + g_signal_connect(G_OBJECT(toolitem), "clicked", + G_CALLBACK(item->callback), mainwin); + g_signal_connect(G_OBJECT(GTK_BIN(toolitem)->child), + "button_press_event", G_CALLBACK(toolbar_button_pressed), mainwin); if (ditem->id == T_REPLY) { n_entries = sizeof(reply_entries) / sizeof(reply_entries[0]); combo = gtkut_combo_button_create - (button, reply_entries, n_entries, "", - mainwin); + (GTK_WIDGET(toolitem), + reply_entries, n_entries, "", mainwin); gtk_button_set_relief(GTK_BUTTON(combo->arrow), GTK_RELIEF_NONE); - gtk_toolbar_append_widget(GTK_TOOLBAR(toolbar), - GTK_WIDGET_PTR(combo), + + comboitem = gtk_tool_item_new(); + gtk_tool_item_set_homogeneous(comboitem, FALSE); + gtk_container_add(GTK_CONTAINER(comboitem), + GTK_WIDGET_PTR(combo)); + tips = gtk_tooltips_new(); + gtk_tool_item_set_tooltip(comboitem, tips, gettext(item->tooltip), ditem->name); + + gtk_toolbar_insert(GTK_TOOLBAR(toolbar), comboitem, -1); + mainwin->reply_combo = combo; } else if (ditem->id == T_FORWARD) { n_entries = sizeof(forward_entries) / sizeof(forward_entries[0]); combo = gtkut_combo_button_create - (button, forward_entries, n_entries, - "", mainwin); + (GTK_WIDGET(toolitem), + forward_entries, n_entries, "", + mainwin); gtk_button_set_relief(GTK_BUTTON(combo->arrow), GTK_RELIEF_NONE); - gtk_toolbar_append_widget(GTK_TOOLBAR(toolbar), - GTK_WIDGET_PTR(combo), + + comboitem = gtk_tool_item_new(); + gtk_tool_item_set_homogeneous(comboitem, FALSE); + gtk_container_add(GTK_CONTAINER(comboitem), + GTK_WIDGET_PTR(combo)); + tips = gtk_tooltips_new(); + gtk_tool_item_set_tooltip(comboitem, tips, gettext(item->tooltip), ditem->name); + + gtk_toolbar_insert(GTK_TOOLBAR(toolbar), comboitem, -1); + mainwin->fwd_combo = combo; } - *(GtkWidget **)item->data = button; + *(GtkWidget **)item->data = GTK_WIDGET(toolitem); } gtk_widget_show_all(toolbar); diff --git a/src/menu.c b/src/menu.c index baba7f7c..f956b312 100644 --- a/src/menu.c +++ b/src/menu.c @@ -195,7 +195,6 @@ void menu_button_position(GtkMenu *menu, gint *x, gint *y, gboolean *push_in, gint scr_width, scr_height; g_return_if_fail(x != NULL && y != NULL); - g_return_if_fail(GTK_IS_BUTTON(user_data)); button = GTK_WIDGET(user_data); -- cgit v1.2.3