icon_legend.c (5940B)
1 /* 2 * Claws Mail -- a GTK based, lightweight, and fast e-mail client 3 * Copyright (C) 2005-2022 the Claws Mail team 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; either version 3 of the License, or 8 * (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program. If not, see <http://www.gnu.org/licenses/>. 17 */ 18 19 #include "defs.h" 20 21 #include <glib.h> 22 #include <glib/gi18n.h> 23 #include <gtk/gtk.h> 24 #include <gdk/gdkkeysyms.h> 25 26 #include "gtkutils.h" 27 #include "stock_pixmap.h" 28 #include "prefs_gtk.h" 29 30 #define ICONS 23 31 #define ROWS ((ICONS % 2 == 0)? ICONS / 2: (ICONS + 1) / 2) 32 33 StockPixmap legend_icons[ICONS] = { 34 STOCK_PIXMAP_NEW, 35 STOCK_PIXMAP_UNREAD, 36 STOCK_PIXMAP_REPLIED, 37 STOCK_PIXMAP_FORWARDED, 38 STOCK_PIXMAP_REPLIED_AND_FORWARDED, 39 STOCK_PIXMAP_IGNORETHREAD, 40 STOCK_PIXMAP_WATCHTHREAD, 41 STOCK_PIXMAP_SPAM, 42 STOCK_PIXMAP_CLIP, 43 STOCK_PIXMAP_GPG_SIGNED, 44 STOCK_PIXMAP_KEY, 45 STOCK_PIXMAP_CLIP_GPG_SIGNED, 46 STOCK_PIXMAP_CLIP_KEY, 47 STOCK_PIXMAP_MARK, 48 STOCK_PIXMAP_DELETED, 49 STOCK_PIXMAP_MOVED, 50 STOCK_PIXMAP_COPIED, 51 STOCK_PIXMAP_LOCKED, 52 STOCK_PIXMAP_DIR_OPEN, 53 STOCK_PIXMAP_DIR_OPEN_HRM, 54 STOCK_PIXMAP_DIR_OPEN_MARK, 55 STOCK_PIXMAP_DIR_NOSELECT_OPEN, 56 STOCK_PIXMAP_DIR_SUBS_OPEN, 57 }; 58 59 static gchar *legend_icon_desc[] = { 60 /* status column */ 61 N_("New message"), 62 N_("Unread message"), 63 N_("Message has been replied to"), 64 N_("Message has been forwarded"), 65 N_("Message has been forwarded and replied to"), 66 N_("Message is in an ignored thread"), 67 N_("Message is in a watched thread"), 68 N_("Message is spam"), 69 /* attachment column */ 70 N_("Message has attachment(s)"), 71 N_("Digitally signed message"), 72 N_("Encrypted message"), 73 N_("Message is signed and has attachment(s)"), 74 N_("Message is encrypted and has attachment(s)"), 75 /* mark column */ 76 N_("Marked message"), 77 N_("Message is marked for deletion"), 78 N_("Message is marked for moving"), 79 N_("Message is marked for copying"), 80 /* locked column */ 81 N_("Locked message"), 82 /* others */ 83 N_("Folder (normal, opened)"), 84 N_("Folder with read messages hidden"), 85 N_("Folder contains marked messages"), 86 N_("IMAP folder which contains subfolders only"), 87 N_("IMAP mailbox showing only subscribed folders"), 88 }; 89 90 static struct LegendDialog { 91 GtkWidget *window; 92 } legend; 93 94 static void legend_create(void); 95 static void legend_close(void); 96 97 void legend_show(void) 98 { 99 if (!legend.window) 100 legend_create(); 101 else 102 gtk_window_present(GTK_WINDOW(legend.window)); 103 } 104 105 static void legend_create(void) 106 { 107 GtkWidget *window; 108 GtkWidget *scrolledwindow; 109 GtkWidget *vbox; 110 GtkWidget *confirm_area; 111 GtkWidget *close_button; 112 GtkWidget *hbox; 113 GtkWidget *label; 114 GtkWidget *icon_label; 115 GtkWidget *desc_label; 116 GtkWidget *table; 117 gint i, j, k; 118 119 window = gtkut_window_new(GTK_WINDOW_TOPLEVEL, "icon_legend"); 120 gtk_window_set_title(GTK_WINDOW(window), _("Icon Legend")); 121 gtk_container_set_border_width(GTK_CONTAINER(window), 8); 122 gtk_window_set_resizable(GTK_WINDOW(window), TRUE); 123 gtk_window_set_type_hint(GTK_WINDOW(window), GDK_WINDOW_TYPE_HINT_DIALOG); 124 gtk_window_set_default_size(GTK_WINDOW(window), 666, 340); 125 g_signal_connect(G_OBJECT(window), "delete_event", 126 G_CALLBACK(legend_close), NULL); 127 gtk_widget_realize(window); 128 129 vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 8); 130 gtk_container_add(GTK_CONTAINER(window), vbox); 131 gtk_container_set_border_width(GTK_CONTAINER(vbox), 2); 132 133 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); 134 gtk_widget_show(hbox); 135 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); 136 137 label = gtk_label_new(g_strconcat("<span weight=\"bold\">",_("The following icons " 138 "are used to show the status of messages and " 139 "folders:"), "</span>", NULL)); 140 gtk_label_set_use_markup(GTK_LABEL(label), TRUE); 141 gtk_widget_show(label); 142 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0); 143 144 scrolledwindow = gtk_scrolled_window_new(NULL, NULL); 145 gtk_scrolled_window_set_policy 146 (GTK_SCROLLED_WINDOW(scrolledwindow), 147 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); 148 gtk_scrolled_window_set_propagate_natural_height(GTK_SCROLLED_WINDOW(scrolledwindow), TRUE); 149 gtk_widget_show(scrolledwindow); 150 gtk_box_pack_start(GTK_BOX(vbox), scrolledwindow, TRUE, TRUE, 0); 151 152 table = gtk_grid_new(); 153 gtk_container_set_border_width(GTK_CONTAINER(table), 8); 154 gtk_grid_set_row_spacing(GTK_GRID(table), 4); 155 gtk_grid_set_column_spacing(GTK_GRID(table), 8); 156 157 for (i = 0, j = 0, k = 0; i < ICONS; ++i, ++k) { 158 icon_label = stock_pixmap_widget(legend_icons[i]); 159 gtk_widget_set_halign(icon_label, GTK_ALIGN_CENTER); 160 gtk_widget_set_valign(icon_label, GTK_ALIGN_CENTER); 161 gtk_grid_attach(GTK_GRID(table), icon_label, j, k, 1, 1); 162 163 desc_label = gtk_label_new(legend_icon_desc[i]); 164 gtk_label_set_xalign(GTK_LABEL(desc_label), 0.0); 165 gtk_label_set_line_wrap(GTK_LABEL(desc_label), TRUE); 166 gtk_grid_attach(GTK_GRID(table), desc_label, j+1, k, 1, 1); 167 168 if (i == ICONS / 2) { 169 j = 2; 170 k = -1; 171 } 172 } 173 174 gtk_container_add(GTK_CONTAINER(scrolledwindow), GTK_WIDGET(table)); 175 176 gtkut_stock_button_set_create(&confirm_area, &close_button, "window-close", _("_Close"), 177 NULL, NULL, NULL, NULL, NULL, NULL); 178 gtk_box_pack_end(GTK_BOX(vbox), confirm_area, FALSE, FALSE, 4); 179 gtk_widget_grab_default(close_button); 180 g_signal_connect_closure 181 (G_OBJECT(close_button), "clicked", 182 g_cclosure_new_swap(G_CALLBACK(legend_close), 183 window, NULL), FALSE); 184 185 gtk_widget_show_all(window); 186 187 legend.window = window; 188 } 189 190 static void legend_close(void) 191 { 192 gtk_widget_destroy(legend.window); 193 legend.window = NULL; 194 }