Statistics
| Revision:

root / src / progressdialog.c @ 321

History | View | Annotate | Download (7.9 kB)

1
/*
2
 * Sylpheed -- a GTK+ based, lightweight, and fast e-mail client
3
 * Copyright (C) 1999-2005 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 *dialog;
47
        GtkWidget *hbox;
48
        GtkWidget *label;
49
        GtkWidget *cancel_btn;
50
        GtkWidget *progressbar;
51
        GtkWidget *scrolledwin;
52
        GtkWidget *treeview;
53
        GtkListStore *store;
54
        GtkTreeSelection *selection;
55
        GtkTreeViewColumn *column;
56
        GtkCellRenderer *renderer;
57
58
        debug_print(_("Creating progress dialog...\n"));
59
        progress = g_new0(ProgressDialog, 1);
60
61
        dialog = gtk_dialog_new();
62
        gtk_widget_set_size_request(dialog, 460, -1);
63
        gtk_container_set_border_width(GTK_CONTAINER(dialog), 8);
64
        gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER);
65
        gtk_window_set_policy(GTK_WINDOW(dialog), FALSE, TRUE, TRUE);
66
        gtk_widget_realize(dialog);
67
68
        gtk_container_set_border_width
69
                (GTK_CONTAINER(GTK_DIALOG(dialog)->action_area), 0);
70
        gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(dialog)->vbox), 8);
71
        gtk_dialog_set_has_separator(GTK_DIALOG(dialog), FALSE);
72
73
        hbox = gtk_hbox_new(FALSE, 0);
74
        gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox,
75
                           FALSE, FALSE, 8);
76
        gtk_widget_show(hbox);
77
78
        label = gtk_label_new("");
79
        gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 8);
80
        gtk_widget_show(label);
81
82
        cancel_btn = gtk_dialog_add_button(GTK_DIALOG(dialog),
83
                                           GTK_STOCK_CANCEL,
84
                                           GTK_RESPONSE_NONE);
85
        gtk_widget_grab_default(cancel_btn);
86
        gtk_widget_grab_focus(cancel_btn);
87
88
        progressbar = gtk_progress_bar_new();
89
        gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), progressbar,
90
                           FALSE, FALSE, 0);
91
        gtk_widget_show(progressbar);
92
93
        scrolledwin = gtk_scrolled_window_new(NULL, NULL);
94
        gtk_widget_show(scrolledwin);
95
        gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), scrolledwin,
96
                           TRUE, TRUE, 0);
97
        gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolledwin),
98
                                       GTK_POLICY_AUTOMATIC,
99
                                       GTK_POLICY_AUTOMATIC);
100
        gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwin),
101
                                            GTK_SHADOW_IN);
102
103
        store = gtk_list_store_new(PROG_N_COLS, GDK_TYPE_PIXBUF, G_TYPE_STRING,
104
                                   G_TYPE_STRING, G_TYPE_POINTER);
105
106
        treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
107
        g_object_unref(G_OBJECT(store));
108
        gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), TRUE);
109
        gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(treeview), TRUE);
110
        gtk_widget_show(treeview);
111
        gtk_container_add(GTK_CONTAINER(scrolledwin), treeview);
112
        gtk_widget_set_size_request(treeview, -1, 120);
113
114
        selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
115
        gtk_tree_selection_set_mode(selection, GTK_SELECTION_BROWSE);
116
117
        renderer = gtk_cell_renderer_pixbuf_new();
118
        g_object_set(renderer, "xalign", 0.5, NULL);
119
        column = gtk_tree_view_column_new_with_attributes
120
                (NULL, renderer, "pixbuf", PROG_COL_PIXBUF, NULL);
121
        gtk_tree_view_column_set_alignment(column, 0.5);
122
        gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
123
        gtk_tree_view_column_set_fixed_width(column, 20);
124
        gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
125
126
        renderer = gtk_cell_renderer_text_new();
127
        column = gtk_tree_view_column_new_with_attributes
128
                (_("Account"), renderer, "text", PROG_COL_NAME, NULL);
129
        gtk_tree_view_column_set_resizable(column, TRUE);
130
        gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
131
        gtk_tree_view_column_set_fixed_width(column, 160);
132
        gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
133
134
        renderer = gtk_cell_renderer_text_new();
135
        column = gtk_tree_view_column_new_with_attributes
136
                (_("Status"), renderer, "text", PROG_COL_STATUS, NULL);
137
        gtk_tree_view_column_set_resizable(column, TRUE);
138
        gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED);
139
        gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
140
141
        progress->window      = dialog;
142
        progress->label       = label;
143
        progress->cancel_btn  = cancel_btn;
144
        progress->progressbar = progressbar;
145
        progress->treeview    = treeview;
146
        progress->store       = store;
147
148
        return progress;
149
}
150
151
void progress_dialog_destroy(ProgressDialog *progress)
152
{
153
        if (progress) {
154
                gtk_widget_destroy(progress->window);
155
                g_free(progress);
156
        }
157
}
158
159
void progress_dialog_set_label(ProgressDialog *progress, gchar *str)
160
{
161
        gtk_label_set_text(GTK_LABEL(progress->label), str);
162
}
163
164
void progress_dialog_set_value(ProgressDialog *progress, gfloat value)
165
{
166
        gtk_progress_set_value(GTK_PROGRESS(progress->progressbar), value);
167
}
168
169
void progress_dialog_set_percentage(ProgressDialog *progress,
170
                                    gfloat percentage)
171
{
172
        gtk_progress_set_percentage(GTK_PROGRESS(progress->progressbar),
173
                                    percentage);
174
}
175
176
void progress_dialog_append(ProgressDialog *progress, GdkPixbuf *pixbuf,
177
                            const gchar *name, const gchar *status,
178
                            gpointer data)
179
{
180
        GtkListStore *store = progress->store;
181
        GtkTreeIter iter;
182
183
        gtk_list_store_append(store, &iter);
184
185
        gtk_list_store_set(store, &iter,
186
                           PROG_COL_PIXBUF, pixbuf,
187
                           PROG_COL_NAME, name,
188
                           PROG_COL_STATUS, status,
189
                           PROG_COL_POINTER, data,
190
                           -1);
191
}
192
193
void progress_dialog_set_row(ProgressDialog *progress, gint row,
194
                             GdkPixbuf *pixbuf, const gchar *name,
195
                             const gchar *status, gpointer data)
196
{
197
        GtkListStore *store = progress->store;
198
        GtkTreeIter iter;
199
200
        if (gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(store),
201
                                          &iter, NULL, row)) {
202
                gtk_list_store_set(store, &iter,
203
                                   PROG_COL_PIXBUF, pixbuf,
204
                                   PROG_COL_NAME, name,
205
                                   PROG_COL_STATUS, status,
206
                                   PROG_COL_POINTER, data,
207
                                   -1);
208
        }
209
}
210
211
void progress_dialog_set_row_pixbuf(ProgressDialog *progress, gint row,
212
                                    GdkPixbuf *pixbuf)
213
{
214
        GtkListStore *store = progress->store;
215
        GtkTreeIter iter;
216
217
        if (gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(store),
218
                                          &iter, NULL, row)) {
219
                gtk_list_store_set(store, &iter, PROG_COL_PIXBUF, pixbuf, -1);
220
        }
221
}
222
223
void progress_dialog_set_row_name(ProgressDialog *progress, gint row,
224
                                  const gchar *name)
225
{
226
        GtkListStore *store = progress->store;
227
        GtkTreeIter iter;
228
229
        if (gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(store),
230
                                          &iter, NULL, row)) {
231
                gtk_list_store_set(store, &iter, PROG_COL_NAME, name, -1);
232
        }
233
}
234
235
void progress_dialog_set_row_status(ProgressDialog *progress, gint row,
236
                                    const gchar *status)
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_STATUS, status, -1);
244
        }
245
}
246
247
void progress_dialog_scroll_to_row(ProgressDialog *progress, gint row)
248
{
249
        GtkTreeModel *model = GTK_TREE_MODEL(progress->store);
250
        GtkTreeIter iter;
251
        GtkTreePath *path;
252
253
        if (!gtk_tree_model_iter_nth_child(model, &iter, NULL, row))
254
                return;
255
256
        path = gtk_tree_model_get_path(model, &iter);
257
        gtk_tree_view_scroll_to_cell(GTK_TREE_VIEW(progress->treeview),
258
                                     path, NULL, FALSE, 0.0, 0.0);
259
        gtk_tree_path_free(path);
260
}