Commit fa979f8d5738b072aa0275d574206f8c9a114aff
1 parent
ac72231f
Exists in
master
and in
1 other branch
Refactoring simple file transfer dialog.
Showing
6 changed files
with
143 additions
and
18 deletions
Show diff stats
src/dialogs/commondialog.c
... | ... | @@ -32,17 +32,17 @@ |
32 | 32 | /*--[ Implement ]------------------------------------------------------------------------------------*/ |
33 | 33 | |
34 | 34 | #if GTK_CHECK_VERSION(3,12,0) |
35 | -static void apply_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *dialog) | |
35 | +void v3270_dialog_apply(GtkButton G_GNUC_UNUSED(*button), GtkWidget *dialog) | |
36 | 36 | { |
37 | 37 | gtk_dialog_response(GTK_DIALOG(dialog),GTK_RESPONSE_APPLY); |
38 | 38 | } |
39 | 39 | |
40 | -static void cancel_clicked(GtkButton G_GNUC_UNUSED(*button), GtkWidget *dialog) | |
40 | +void v3270_dialog_cancel(GtkButton G_GNUC_UNUSED(*button), GtkWidget *dialog) | |
41 | 41 | { |
42 | 42 | gtk_dialog_response(GTK_DIALOG(dialog),GTK_RESPONSE_CANCEL); |
43 | 43 | } |
44 | 44 | |
45 | -static GtkWidget * create_button(GtkWidget *dialog, const gchar *mnemonic, GCallback callback) | |
45 | +GtkWidget * v3270_dialog_button_new(GtkWidget *dialog, const gchar *mnemonic, GCallback callback) | |
46 | 46 | { |
47 | 47 | GtkWidget * button = gtk_button_new_with_mnemonic(mnemonic); |
48 | 48 | gtk_button_set_use_underline(GTK_BUTTON (button), TRUE); |
... | ... | @@ -91,8 +91,8 @@ LIB3270_EXPORT GtkWidget * v3270_dialog_new(GtkWidget *widget, const gchar *titl |
91 | 91 | GtkWidget * header = gtk_dialog_get_header_bar(GTK_DIALOG(dialog)); |
92 | 92 | |
93 | 93 | gtk_header_bar_set_title(GTK_HEADER_BAR(header),title); |
94 | - gtk_header_bar_pack_start(GTK_HEADER_BAR(header),create_button(dialog,_("_Cancel"),G_CALLBACK(cancel_clicked))); | |
95 | - gtk_header_bar_pack_end(GTK_HEADER_BAR(header),create_button(dialog,apply,G_CALLBACK(apply_clicked))); | |
94 | + gtk_header_bar_pack_start(GTK_HEADER_BAR(header),v3270_dialog_button_new(dialog,_("_Cancel"),G_CALLBACK(v3270_dialog_cancel))); | |
95 | + gtk_header_bar_pack_end(GTK_HEADER_BAR(header),v3270_dialog_button_new(dialog,apply,G_CALLBACK(v3270_dialog_apply))); | |
96 | 96 | } |
97 | 97 | else |
98 | 98 | { | ... | ... |
src/dialogs/transfer.c
... | ... | @@ -51,12 +51,62 @@ static void header_on_state_changed(GtkWidget *worker, guint state, const gchar |
51 | 51 | static void transfer_success(GtkWidget *worker, const gchar *msg, const gchar *description, GtkDialog *dialog) |
52 | 52 | { |
53 | 53 | debug("%s(\"%s\",\"%s\")",__FUNCTION__,msg,description); |
54 | + gtk_dialog_response(dialog,GTK_RESPONSE_OK); | |
54 | 55 | |
55 | 56 | } |
56 | 57 | |
58 | +/* | |
57 | 59 | static void transfer_failed(GtkWidget *worker, const gchar *msg, const gchar *description, GtkDialog *dialog) |
58 | 60 | { |
59 | 61 | debug("%s(\"%s\",\"%s\")",__FUNCTION__,msg,description); |
62 | +} | |
63 | +*/ | |
64 | + | |
65 | +static void save_activity_clicked(GtkWidget *button, GObject *activity) | |
66 | +{ | |
67 | + debug("%s",__FUNCTION__); | |
68 | + | |
69 | + g_autofree gchar * filename = v3270_select_file( | |
70 | + gtk_widget_get_toplevel(button), | |
71 | + _("Save transfer activity to file"), | |
72 | + _("Save"), | |
73 | + GTK_FILE_CHOOSER_ACTION_SAVE, | |
74 | + NULL, | |
75 | + N_("XML file"), "*.xml", | |
76 | + NULL ); | |
77 | + | |
78 | + if(filename) | |
79 | + { | |
80 | + GError * error = NULL; | |
81 | + GString * str = g_string_new("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<filelist>\n"); | |
82 | + | |
83 | + v3270_ft_activity_xml_encode(activity,str); | |
84 | + g_string_append(str,"</filelist>\n"); | |
85 | + | |
86 | + g_autofree gchar * text = g_string_free(str,FALSE); | |
87 | + | |
88 | + debug("Saving %s",filename); | |
89 | + | |
90 | + if(!g_file_set_contents(filename,text,-1,&error)) { | |
91 | + | |
92 | + GtkWidget *popup = gtk_message_dialog_new_with_markup( | |
93 | + GTK_WINDOW(gtk_widget_get_toplevel(button)), | |
94 | + GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, | |
95 | + GTK_MESSAGE_ERROR,GTK_BUTTONS_CLOSE, | |
96 | + _("Can't save %s"),filename | |
97 | + ); | |
98 | + | |
99 | + gtk_window_set_title(GTK_WINDOW(popup),_("Operation has failed")); | |
100 | + | |
101 | + gtk_message_dialog_format_secondary_markup(GTK_MESSAGE_DIALOG(popup),"%s",error->message); | |
102 | + g_error_free(error); | |
103 | + | |
104 | + gtk_dialog_run(GTK_DIALOG(popup)); | |
105 | + gtk_widget_destroy(popup); | |
106 | + | |
107 | + } | |
108 | + | |
109 | + } | |
60 | 110 | |
61 | 111 | } |
62 | 112 | |
... | ... | @@ -80,10 +130,15 @@ LIB3270_EXPORT gint v3270_transfer_file(GtkWidget *widget, LIB3270_FT_OPTION opt |
80 | 130 | v3270_ft_worker_set_session(worker,v3270_get_session(widget)); |
81 | 131 | v3270_ft_worker_set_activity(worker,activity); |
82 | 132 | |
133 | + // Create save button | |
134 | + GtkWidget * save_button = NULL; | |
135 | + | |
83 | 136 | // Create dialog |
137 | + const gchar *title = (options & LIB3270_FT_OPTION_RECEIVE) ? _( "Receiving file" ) : _( "Sending file" ); | |
138 | + gboolean use_header = FALSE; | |
139 | + | |
84 | 140 | #if GTK_CHECK_VERSION(3,12,0) |
85 | 141 | |
86 | - gboolean use_header; | |
87 | 142 | g_object_get(gtk_settings_get_default(), "gtk-dialogs-use-header", &use_header, NULL); |
88 | 143 | |
89 | 144 | GtkWidget * dialog = |
... | ... | @@ -93,36 +148,69 @@ LIB3270_EXPORT gint v3270_transfer_file(GtkWidget *widget, LIB3270_FT_OPTION opt |
93 | 148 | NULL |
94 | 149 | )); |
95 | 150 | |
96 | - gtk_window_set_title(GTK_WINDOW(dialog),(options & LIB3270_FT_OPTION_RECEIVE) ? _( "Receiving file" ) : _( "Sending file" )); | |
97 | - | |
98 | 151 | if(use_header) |
99 | 152 | { |
100 | - gtk_header_bar_set_subtitle(GTK_HEADER_BAR(gtk_dialog_get_header_bar(dialog)),_("Starting transfer")); | |
153 | + GtkWidget * header = gtk_dialog_get_header_bar(GTK_DIALOG(dialog)); | |
154 | + gtk_header_bar_set_title(GTK_HEADER_BAR(header),title); | |
155 | + gtk_header_bar_set_subtitle(GTK_HEADER_BAR(header),_("Starting transfer")); | |
156 | + | |
157 | + save_button = gtk_button_new_from_icon_name("document-save-as",GTK_ICON_SIZE_SMALL_TOOLBAR); | |
158 | + gtk_header_bar_pack_start(GTK_HEADER_BAR(header),save_button); | |
159 | + | |
101 | 160 | g_signal_connect(worker,"ft-state-changed",G_CALLBACK(header_on_state_changed), dialog); |
161 | + | |
162 | + gtk_container_set_border_width(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),18); | |
163 | + | |
164 | + } | |
165 | + else | |
166 | + { | |
167 | + gtk_window_set_title(GTK_WINDOW(dialog), title); | |
168 | + gtk_window_set_deletable(GTK_WINDOW(dialog),FALSE); | |
169 | + | |
170 | + gtk_container_set_border_width(GTK_CONTAINER(worker),18); | |
171 | + | |
172 | + gtk_dialog_add_buttons( | |
173 | + GTK_DIALOG (dialog), | |
174 | + _("_Close"), GTK_RESPONSE_CANCEL, | |
175 | + NULL | |
176 | + ); | |
177 | + | |
102 | 178 | } |
103 | 179 | |
104 | 180 | #else |
105 | 181 | |
106 | - GtkWidget * dialog = gtk_dialog_new_with_buttons( | |
107 | - (options & LIB3270_FT_OPTION_RECEIVE) ? _( "Receiving file" ) : _( "Sending file" ), | |
108 | - GTK_WINDOW(gtk_widget_get_toplevel(widget)), | |
109 | - GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT, | |
110 | - _( "_Close" ), GTK_RESPONSE_CANCEL, | |
182 | + GtkWidget * dialog = gtk_dialog_new(); | |
183 | + | |
184 | + gtk_window_set_title(GTK_WINDOW(dialog), title); | |
185 | + gtk_window_set_deletable(GTK_WINDOW(dialog),FALSE); | |
186 | + | |
187 | + gtk_box_set_spacing( | |
188 | + GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))), | |
189 | + 18 | |
190 | + ); | |
191 | + | |
192 | + gtk_dialog_add_buttons( | |
193 | + GTK_DIALOG (dialog), | |
194 | + _("_Close"), GTK_RESPONSE_CANCEL, | |
111 | 195 | NULL |
112 | 196 | ); |
113 | 197 | |
114 | 198 | #endif // GTK(3,12,0) |
115 | 199 | |
200 | + if(save_button) | |
201 | + { | |
202 | + gtk_widget_set_tooltip_markup(save_button,_("Save transfer information to file")); | |
203 | + g_signal_connect(save_button,"clicked",G_CALLBACK(save_activity_clicked),activity); | |
204 | + } | |
205 | + | |
116 | 206 | gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(gtk_widget_get_toplevel(widget))); |
117 | 207 | gtk_window_set_modal(GTK_WINDOW(dialog), TRUE); |
118 | 208 | gtk_window_set_destroy_with_parent(GTK_WINDOW(dialog), TRUE); |
119 | 209 | |
120 | - gtk_container_set_border_width(GTK_CONTAINER(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),18); | |
121 | - | |
122 | 210 | gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),worker,TRUE,TRUE,2); |
123 | 211 | |
124 | 212 | // Start transfer |
125 | - g_signal_connect(worker,"failed",G_CALLBACK(transfer_failed), dialog); | |
213 | + // g_signal_connect(worker,"failed",G_CALLBACK(transfer_failed), dialog); | |
126 | 214 | g_signal_connect(worker,"success",G_CALLBACK(transfer_success), dialog); |
127 | 215 | v3270_ft_worker_start(worker); |
128 | 216 | ... | ... |
src/filetransfer/activity.c
... | ... | @@ -350,3 +350,33 @@ |
350 | 350 | ); |
351 | 351 | |
352 | 352 | } |
353 | + | |
354 | + LIB3270_EXPORT void v3270_ft_activity_xml_encode(GObject *object, GString *str) | |
355 | + { | |
356 | + g_return_if_fail(G_IS_V3270_FT_ACTIVITY(object)); | |
357 | + | |
358 | + size_t ix; | |
359 | + V3270FTActivity * activity = G_V3270_FT_ACTIVITY(object); | |
360 | + | |
361 | + g_string_append_printf( | |
362 | + str, | |
363 | + "\t<entry>\n\t\t<file type=\'local\' path=\'%s\' />\n\t\t<file type=\'remote\' path=\'%s\' />\n", | |
364 | + activity->file.local, | |
365 | + activity->file.remote | |
366 | + ); | |
367 | + | |
368 | + for(ix = 0; v3270_activity_list_options[ix].name; ix++) | |
369 | + { | |
370 | + if((activity->options & v3270_activity_list_options[ix].option) == v3270_activity_list_options[ix].option) | |
371 | + g_string_append_printf(str,"\t\t<option name=\'%s\' value=\'%s\' />\n",v3270_activity_list_options[ix].name,v3270_activity_list_options[ix].value); | |
372 | + } | |
373 | + | |
374 | + for(ix=0;ix<LIB3270_FT_VALUE_COUNT;ix++) | |
375 | + { | |
376 | + g_string_append_printf(str,"\t\t<parameter name=\"%s\" value=\"%u\"/>\n",ft_value[ix].name,activity->values[ix]); | |
377 | + } | |
378 | + | |
379 | + g_string_append(str,"\t</entry>\n"); | |
380 | + | |
381 | + } | |
382 | + | ... | ... |
src/filetransfer/activitylist.c
... | ... | @@ -295,7 +295,6 @@ |
295 | 295 | V3270FTActivityList * list = GTK_V3270_FT_ACTIVITY_LIST(widget); |
296 | 296 | GString * str = g_string_new("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<filelist>\n"); |
297 | 297 | GError * error = NULL; |
298 | - size_t ix; | |
299 | 298 | |
300 | 299 | debug("%s",__FUNCTION__); |
301 | 300 | |
... | ... | @@ -310,6 +309,9 @@ |
310 | 309 | GObject * activity = NULL; |
311 | 310 | gtk_tree_model_get(model, &iter, 0, &activity, -1); |
312 | 311 | |
312 | + v3270_ft_activity_xml_encode(activity,str); | |
313 | + | |
314 | + /* | |
313 | 315 | if(activity) |
314 | 316 | { |
315 | 317 | g_string_append(str,"\t<entry>\n"); |
... | ... | @@ -331,6 +333,7 @@ |
331 | 333 | |
332 | 334 | g_string_append(str,"\t</entry>\n"); |
333 | 335 | } |
336 | + */ | |
334 | 337 | |
335 | 338 | } |
336 | 339 | while(gtk_tree_model_iter_next(model,&iter)); | ... | ... |
src/include/internals.h
... | ... | @@ -56,6 +56,9 @@ |
56 | 56 | |
57 | 57 | #if GTK_CHECK_VERSION(3,12,0) |
58 | 58 | G_GNUC_INTERNAL GtkHeaderBar * v3270_dialog_get_header_bar(GtkWidget * widget); |
59 | + G_GNUC_INTERNAL void v3270_dialog_cancel(GtkButton G_GNUC_UNUSED(*button), GtkWidget *dialog); | |
60 | + G_GNUC_INTERNAL void v3270_dialog_apply(GtkButton G_GNUC_UNUSED(*button), GtkWidget *dialog); | |
61 | + G_GNUC_INTERNAL GtkWidget * v3270_dialog_button_new(GtkWidget *dialog, const gchar *mnemonic, GCallback callback); | |
59 | 62 | #endif // ! GTK 3.12 |
60 | 63 | |
61 | 64 | // Activity list widget. | ... | ... |
src/include/v3270/filetransfer.h
... | ... | @@ -128,6 +128,7 @@ |
128 | 128 | LIB3270_EXPORT void v3270_ft_activity_set_options(GObject * object, LIB3270_FT_OPTION options); |
129 | 129 | LIB3270_EXPORT void v3270_ft_activity_set_value(GObject * object, LIB3270_FT_VALUE id, guint value); |
130 | 130 | LIB3270_EXPORT H3270FT * v3270_ft_activity_begin_transfer(GObject * object, H3270 *hSession, const char **message); |
131 | + LIB3270_EXPORT void v3270_ft_activity_xml_encode(GObject *object, GString *str); | |
131 | 132 | |
132 | 133 | // FT Dialog widget |
133 | 134 | #define GTK_TYPE_V3270_FT_DIALOG (V3270FTSettingsDialog_get_type ()) | ... | ... |