Statistics
| Revision:

root / src / progressdialog.c @ 3072

History | View | Annotate | Download (9 kB)

1
/*
2
 * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3
 * Copyright (C) 1999-2009 Hiroyuki Yamamoto
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 2 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, write to the Free Software
17
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
 */
19
20
#ifdef HAVE_CONFIG_H
21
#  include "config.h"
22
#endif
23
24
#include <glib.h>
25
#include <glib/gi18n.h>
26
#include <gtk/gtkdialog.h>
27
#include <gtk/gtkhbox.h>
28
#include <gtk/gtklabel.h>
29
#include <gtk/gtkprogressbar.h>
30
#include <gtk/gtkscrolledwindow.h>
31
#include <gtk/gtkliststore.h>
32
#include <gtk/gtktreeview.h>
33
#include <gtk/gtktreeselection.h>
34
#include <gtk/gtkcellrendererpixbuf.h>
35
#include <gtk/gtkcellrenderertext.h>
36
#include <gtk/gtkbutton.h>
37
#include <gtk/gtkstock.h>
38
39
#include "progressdialog.h"
40
#include "gtkutils.h"
41
#include "utils.h"
42
43
ProgressDialog *progress_dialog_create(void)
44
{
45
        ProgressDialog *progress;
46
        GtkWidget *scrolledwin;
47
        GtkWidget *treeview;
48
        GtkListStore *store;
49
        GtkTreeSelection *selection;
50
        GtkTreeViewColumn *column;
51
        GtkCellRenderer *renderer;
52
53
        progress = progress_dialog_simple_create();
54
55
        scrolledwin = gtk_scrolled_window_new(NULL, NULL);
56
        gtk_widget_show(scrolledwin);
57
        gtk_box_pack_start(GTK_BOX(GTK_DIALOG(progress->window)->vbox),
58
                           scrolledwin, TRUE, TRUE, 0);
59
        gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwin),
60
                                       GTK_POLICY_AUTOMATIC,
61
                                       GTK_POLICY_AUTOMATIC);
62
        gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwin),
63
                                            GTK_SHADOW_IN);
64
65
        store = gtk_list_store_new(PROG_N_COLS, GDK_TYPE_PIXBUF, G_TYPE_STRING,
66
                                   G_TYPE_STRING, G_TYPE_STRING,
67
                                   G_TYPE_POINTER);
68
69
        treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
70
        g_object_unref(G_OBJECT(store));
71
        gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), TRUE);
72
        gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(treeview), TRUE);
73
        gtk_widget_show(treeview);
74
        gtk_container_add(GTK_CONTAINER(scrolledwin), treeview);
75
        gtk_widget_set_size_request(treeview, -1, 120);
76
77
        selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
78
        gtk_tree_selection_set_mode(selection, GTK_SELECTION_BROWSE);
79
80
        renderer = gtk_cell_renderer_pixbuf_new();
81
        g_object_set(renderer, "xalign", 0.5, NULL);
82
        column = gtk_tree_view_column_new_with_attributes
83
                (NULL, renderer, "pixbuf", PROG_COL_PIXBUF, NULL);
84
        gtk_tree_view_column_set_alignment(column, 0.5);
85
        gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
86
        gtk_tree_view_column_set_fixed_width(column, 20);
87
        gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
88
89
        renderer = gtk_cell_renderer_text_new();
90
        column = gtk_tree_view_column_new_with_attributes
91
                (_("Account"), renderer, "text", PROG_COL_NAME, NULL);
92
        gtk_tree_view_column_set_resizable(column, TRUE);
93
        gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
94
        gtk_tree_view_column_set_fixed_width(column, 120);
95
        gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
96
97
        renderer = gtk_cell_renderer_text_new();
98
        column = gtk_tree_view_column_new_with_attributes
99
                (_("Status"), renderer, "text", PROG_COL_STATUS, NULL);
100
        gtk_tree_view_column_set_resizable(column, TRUE);
101
        gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
102
        gtk_tree_view_column_set_fixed_width(column, 80);
103
        gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
104
105
        renderer = gtk_cell_renderer_text_new();
106
        column = gtk_tree_view_column_new_with_attributes
107
                (_("Progress"), renderer, "text", PROG_COL_PROGRESS, NULL);
108
        gtk_tree_view_column_set_resizable(column, TRUE);
109
        gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
110
        gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
111
112
        progress->treeview = treeview;
113
        progress->store    = store;
114
115
        return progress;
116
}
117
118
ProgressDialog *progress_dialog_simple_create(void)
119
{
120
        ProgressDialog *progress;
121
        GtkWidget *dialog;
122
        GtkWidget *hbox;
123
        GtkWidget *label;
124
        GtkWidget *cancel_btn;
125
        GtkWidget *progressbar;
126
127
        debug_print("Creating progress dialog\n");
128
        progress = g_new0(ProgressDialog, 1);
129
130
        dialog = gtk_dialog_new();
131
        gtk_widget_set_size_request(dialog, 460, -1);
132
        gtk_container_set_border_width(GTK_CONTAINER(dialog), 8);
133
        gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER);
134
        gtk_window_set_policy(GTK_WINDOW(dialog), FALSE, TRUE, TRUE);
135
        gtk_widget_realize(dialog);
136
137
        gtk_container_set_border_width
138
                (GTK_CONTAINER(GTK_DIALOG(dialog)->action_area), 0);
139
        gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(dialog)->vbox), 8);
140
        gtk_dialog_set_has_separator(GTK_DIALOG(dialog), FALSE);
141
142
        hbox = gtk_hbox_new(FALSE, 0);
143
        gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox,
144
                           FALSE, FALSE, 8);
145
        gtk_widget_show(hbox);
146
147
        label = gtk_label_new("");
148
        gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 8);
149
        gtk_widget_show(label);
150
151
        cancel_btn = gtk_dialog_add_button(GTK_DIALOG(dialog),
152
                                           GTK_STOCK_CANCEL,
153
                                           GTK_RESPONSE_NONE);
154
        gtk_widget_grab_default(cancel_btn);
155
        gtk_widget_grab_focus(cancel_btn);
156
157
        progressbar = gtk_progress_bar_new();
158
        gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), progressbar,
159
                           FALSE, FALSE, 0);
160
        gtk_widget_show(progressbar);
161
162
        progress->window      = dialog;
163
        progress->label       = label;
164
        progress->cancel_btn  = cancel_btn;
165
        progress->progressbar = progressbar;
166
        progress->treeview    = NULL;
167
        progress->store       = NULL;
168
169
        return progress;
170
}
171
172
void progress_dialog_destroy(ProgressDialog *progress)
173
{
174
        if (progress) {
175
                gtk_widget_destroy(progress->window);
176
                g_free(progress);
177
        }
178
}
179
180
void progress_dialog_set_label(ProgressDialog *progress, gchar *str)
181
{
182
        gtk_label_set_text(GTK_LABEL(progress->label), str);
183
}
184
185
void progress_dialog_set_value(ProgressDialog *progress, gfloat value)
186
{
187
        gtk_progress_set_value(GTK_PROGRESS(progress->progressbar), value);
188
}
189
190
void progress_dialog_set_percentage(ProgressDialog *progress,
191
                                    gfloat percentage)
192
{
193
        gtk_progress_set_percentage(GTK_PROGRESS(progress->progressbar),
194
                                    percentage);
195
}
196
197
void progress_dialog_append(ProgressDialog *progress, GdkPixbuf *pixbuf,
198
                            const gchar *name, const gchar *status,
199
                            const gchar *progress_str, gpointer data)
200
{
201
        GtkListStore *store = progress->store;
202
        GtkTreeIter iter;
203
204
        gtk_list_store_append(store, &iter);
205
206
        gtk_list_store_set(store, &iter,
207
                           PROG_COL_PIXBUF, pixbuf,
208
                           PROG_COL_NAME, name,
209
                           PROG_COL_STATUS, status,
210
                           PROG_COL_PROGRESS, progress_str,
211
                           PROG_COL_POINTER, data,
212
                           -1);
213
}
214
215
void progress_dialog_set_row(ProgressDialog *progress, gint row,
216
                             GdkPixbuf *pixbuf, const gchar *name,
217
                             const gchar *status, const gchar *progress_str,
218
                             gpointer data)
219
{
220
        GtkListStore *store = progress->store;
221
        GtkTreeIter iter;
222
223
        if (gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(store),
224
                                          &iter, NULL, row)) {
225
                gtk_list_store_set(store, &iter,
226
                                   PROG_COL_PIXBUF, pixbuf,
227
                                   PROG_COL_NAME, name,
228
                                   PROG_COL_STATUS, status,
229
                                   PROG_COL_PROGRESS, progress_str,
230
                                   PROG_COL_POINTER, data,
231
                                   -1);
232
        }
233
}
234
235
void progress_dialog_set_row_pixbuf(ProgressDialog *progress, gint row,
236
                                    GdkPixbuf *pixbuf)
237
{
238
        GtkListStore *store = progress->store;
239
        GtkTreeIter iter;
240
241
        if (gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(store),
242
                                          &iter, NULL, row)) {
243
                gtk_list_store_set(store, &iter, PROG_COL_PIXBUF, pixbuf, -1);
244
        }
245
}
246
247
void progress_dialog_set_row_name(ProgressDialog *progress, gint row,
248
                                  const gchar *name)
249
{
250
        GtkListStore *store = progress->store;
251
        GtkTreeIter iter;
252
253
        if (gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(store),
254
                                          &iter, NULL, row)) {
255
                gtk_list_store_set(store, &iter, PROG_COL_NAME, name, -1);
256
        }
257
}
258
259
void progress_dialog_set_row_status(ProgressDialog *progress, gint row,
260
                                    const gchar *status)
261
{
262
        GtkListStore *store = progress->store;
263
        GtkTreeIter iter;
264
265
        if (gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(store),
266
                                          &iter, NULL, row)) {
267
                gtk_list_store_set(store, &iter, PROG_COL_STATUS, status, -1);
268
        }
269
}
270
271
void progress_dialog_set_row_progress(ProgressDialog *progress, gint row,
272
                                      const gchar *progress_str)
273
{
274
        GtkListStore *store = progress->store;
275
        GtkTreeIter iter;
276
277
        if (gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(store),
278
                                          &iter, NULL, row)) {
279
                gtk_list_store_set(store, &iter, PROG_COL_PROGRESS,
280
                                   progress_str, -1);
281
        }
282
}
283
284
void progress_dialog_scroll_to_row(ProgressDialog *progress, gint row)
285
{
286
        GtkTreeModel *model = GTK_TREE_MODEL(progress->store);
287
        GtkTreeIter iter;
288
        GtkTreePath *path;
289
290
        if (!gtk_tree_model_iter_nth_child(model, &iter, NULL, row))
291
                return;
292
293
        path = gtk_tree_model_get_path(model, &iter);
294
        gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(progress->treeview),
295
                                     path, NULL, FALSE, 0.0, 0.0);
296
        gtk_tree_path_free(path);
297
}