Commit 6ca8c69cfe8a4d7ad6345bbb531b0f09eef5aba6

Authored by Perry Werneck
1 parent ed47edc8

Refactoring 'save session properties' action.

src/objects/actions/save.c
@@ -37,19 +37,44 @@ @@ -37,19 +37,44 @@
37 #include <v3270/keyfile.h> 37 #include <v3270/keyfile.h>
38 #include <pw3270.h> 38 #include <pw3270.h>
39 #include <pw3270/application.h> 39 #include <pw3270/application.h>
40 - 40 + #include <pw3270/tools.h>
  41 + #include <v3270/settings.h>
41 42
42 static GtkWidget * factory(V3270SimpleAction *action, GtkWidget *terminal); 43 static GtkWidget * factory(V3270SimpleAction *action, GtkWidget *terminal);
43 static void response(GtkWidget *dialog, gint response_id, GtkWidget *terminal); 44 static void response(GtkWidget *dialog, gint response_id, GtkWidget *terminal);
44 45
45 - GAction * pw3270_action_save_session_as_new(void) { 46 + static const struct Entry {
  47 +
  48 + const gchar *label;
  49 + const gchar *tooltip;
  50 + const gint width;
  51 +
  52 + } entries[] = {
  53 +
  54 + // 0 = Session name
  55 + {
  56 + .label = N_("Session name"),
  57 + .tooltip = N_("The session name used in the window/tab title (empty for default)"),
  58 + .width = 15,
  59 + },
  60 +
  61 + // 1 = Session file
  62 + {
  63 + .label = N_("Session file"),
  64 + .tooltip = N_("The file to save the current session preferences"),
  65 + .width = 40,
  66 + }
  67 +
  68 + };
  69 +
  70 + GAction * pw3270_action_save_session_preferences_new(void) {
46 71
47 V3270SimpleAction * action = v3270_dialog_action_new(factory); 72 V3270SimpleAction * action = v3270_dialog_action_new(factory);
48 73
49 - action->name = "save.session.as";  
50 - action->label = _("Save As"); 74 + action->name = "save.session.preferences";
  75 + action->label = _("Save session preferences");
51 action->icon_name = "document-save-as"; 76 action->icon_name = "document-save-as";
52 - action->tooltip = _("Save session preferences"); 77 + action->tooltip = _("Save current session preferences to file");
53 78
54 return G_ACTION(action); 79 return G_ACTION(action);
55 80
@@ -57,64 +82,113 @@ @@ -57,64 +82,113 @@
57 82
58 GtkWidget * factory(V3270SimpleAction *action, GtkWidget *terminal) { 83 GtkWidget * factory(V3270SimpleAction *action, GtkWidget *terminal) {
59 84
  85 + // Create dialog
  86 + gboolean use_header;
  87 + g_object_get(gtk_settings_get_default(), "gtk-dialogs-use-header", &use_header, NULL);
  88 +
60 GtkWidget * dialog = 89 GtkWidget * dialog =
61 - gtk_file_chooser_dialog_new(  
62 - action->tooltip,  
63 - GTK_WINDOW(gtk_widget_get_toplevel(terminal)),  
64 - GTK_FILE_CHOOSER_ACTION_SAVE,  
65 - _("Save"), GTK_RESPONSE_OK,  
66 - _("Cancel"),GTK_RESPONSE_CANCEL,  
67 - NULL  
68 - ); 90 + GTK_WIDGET(g_object_new(
  91 + GTK_TYPE_DIALOG,
  92 + "use-header-bar", (use_header ? 1 : 0),
  93 + NULL
  94 + ));
  95 +
69 96
70 gtk_window_set_modal(GTK_WINDOW(dialog),TRUE); 97 gtk_window_set_modal(GTK_WINDOW(dialog),TRUE);
71 - gtk_file_chooser_set_pw3270_filters(GTK_FILE_CHOOSER(dialog)); 98 + gtk_window_set_title(GTK_WINDOW(dialog),action->label);
  99 +
  100 + gtk_dialog_add_buttons(
  101 + GTK_DIALOG(dialog),
  102 + _("_Cancel"), GTK_RESPONSE_CANCEL,
  103 + _("_Save"), GTK_RESPONSE_APPLY,
  104 + NULL
  105 + );
  106 +
  107 +
  108 + // Create entry fields
  109 + GtkWidget ** inputs = g_new0(GtkWidget *,G_N_ELEMENTS(entries));
  110 + g_object_set_data_full(G_OBJECT(dialog),"inputs",inputs,g_free);
  111 + debug("Dialog=%p inputs=%p",dialog,inputs);
  112 +
  113 + GtkGrid * grid = GTK_GRID(gtk_grid_new());
  114 +
  115 + gtk_box_pack_start(GTK_BOX(gtk_dialog_get_content_area(GTK_DIALOG(dialog))),GTK_WIDGET(grid),TRUE,TRUE,0);
  116 +
  117 + // https://developer.gnome.org/hig/stable/visual-layout.html.en
  118 + gtk_container_set_border_width(GTK_CONTAINER(grid),18);
  119 + gtk_grid_set_row_spacing(GTK_GRID(grid),6);
  120 + gtk_grid_set_column_spacing(GTK_GRID(grid),12);
  121 +
  122 + // https://developer.gnome.org/hig/stable/visual-layout.html.en
  123 + // gtk_box_set_spacing(GTK_BOX(content_area),18);
  124 +
  125 + size_t ix;
  126 + for(ix = 0; ix < G_N_ELEMENTS(entries); ix++) {
  127 +
  128 + GtkWidget * label = gtk_label_new(gettext(entries[ix].label));
  129 + gtk_label_set_xalign(GTK_LABEL(label),1);
  130 + gtk_grid_attach(grid,label,0,ix,1,1);
  131 +
  132 + inputs[ix] = gtk_entry_new();
  133 +
  134 + if(entries[ix].tooltip) {
  135 + gtk_widget_set_tooltip_markup(GTK_WIDGET(inputs[ix]),gettext(entries[ix].tooltip));
  136 + }
  137 +
  138 + gtk_entry_set_width_chars(GTK_ENTRY(inputs[ix]),entries[ix].width);
  139 + gtk_widget_set_hexpand(inputs[ix],FALSE);
  140 + gtk_widget_set_vexpand(inputs[ix],FALSE);
  141 +
  142 + gtk_grid_attach(grid,inputs[ix],1,ix,entries[ix].width,1);
72 143
73 - if(terminal) {  
74 - g_autofree gchar * filename = v3270_key_file_build_filename(terminal);  
75 - gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog),filename);  
76 } 144 }
77 145
  146 + gtk_entry_bind_to_filechooser(
  147 + inputs[1],
  148 + GTK_FILE_CHOOSER_ACTION_SAVE,
  149 + _("Save session preferences"),
  150 + NULL,
  151 + "*.3270",
  152 + _("3270 session files")
  153 + );
  154 +
78 g_signal_connect(dialog,"response",G_CALLBACK(response),terminal); 155 g_signal_connect(dialog,"response",G_CALLBACK(response),terminal);
79 156
80 - gtk_widget_show_all(dialog); 157 + gtk_widget_show_all(GTK_WIDGET(grid));
81 return dialog; 158 return dialog;
  159 +
82 } 160 }
83 161
84 void response(GtkWidget *dialog, gint response_id, GtkWidget *terminal) { 162 void response(GtkWidget *dialog, gint response_id, GtkWidget *terminal) {
85 163
86 - debug("%s(%d)",__FUNCTION__,response_id);  
87 -  
88 - g_autofree gchar * filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); 164 + if(response_id == GTK_RESPONSE_APPLY) {
89 165
90 - gtk_widget_destroy(dialog); 166 + GtkWidget ** inputs = g_object_get_data(G_OBJECT(dialog),"inputs");
  167 + gtk_widget_hide(dialog);
91 168
92 - if(response_id == GTK_RESPONSE_OK) {  
93 GError * error = NULL; 169 GError * error = NULL;
94 - v3270_key_file_open(terminal,filename,&error); 170 + v3270_key_file_save_to_file(
  171 + terminal,
  172 + gtk_entry_get_text(GTK_ENTRY(inputs[1])),
  173 + &error
  174 + );
95 175
96 if(error) { 176 if(error) {
97 177
98 - GtkWidget * dialog = gtk_message_dialog_new_with_markup(  
99 - GTK_WINDOW(gtk_widget_get_toplevel(terminal)),  
100 - GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,  
101 - GTK_MESSAGE_ERROR,  
102 - GTK_BUTTONS_CANCEL,  
103 - _("Can't open \"%s\""),filename  
104 - );  
105 -  
106 - gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),"%s",error->message);  
107 -  
108 - gtk_window_set_title(GTK_WINDOW(dialog),_("Can't load session file")); 178 + g_message("%s",error->message);
  179 + g_error_free(error);
109 180
110 - gtk_widget_show_all(dialog); 181 + } else {
111 182
112 - g_signal_connect(dialog,"close",G_CALLBACK(gtk_widget_destroy),NULL);  
113 - g_signal_connect(dialog,"response",G_CALLBACK(gtk_widget_destroy),NULL); 183 + // Set session name (after save to avoid changes on the old session file).
  184 + v3270_set_session_name(terminal,gtk_entry_get_text(GTK_ENTRY(inputs[0])));
  185 + v3270_emit_save_settings(terminal,NULL);
114 186
115 - g_error_free(error);  
116 } 187 }
117 188
118 } 189 }
119 190
  191 +
  192 + gtk_widget_destroy(dialog);
  193 +
120 } 194 }
src/objects/os/linux/savedesktopicon.c
@@ -358,7 +358,6 @@ @@ -358,7 +358,6 @@
358 358
359 } 359 }
360 360
361 -  
362 } 361 }
363 362
364 void response(GtkWidget *dialog, gint response_id, GtkWidget *terminal) { 363 void response(GtkWidget *dialog, gint response_id, GtkWidget *terminal) {
src/objects/window/private.h
@@ -90,7 +90,7 @@ @@ -90,7 +90,7 @@
90 G_GNUC_INTERNAL GAction * pw3270_file_transfer_action_new(void); 90 G_GNUC_INTERNAL GAction * pw3270_file_transfer_action_new(void);
91 G_GNUC_INTERNAL GAction * pw3270_action_window_close_new(void); 91 G_GNUC_INTERNAL GAction * pw3270_action_window_close_new(void);
92 G_GNUC_INTERNAL GAction * pw3270_action_connect_new(void); 92 G_GNUC_INTERNAL GAction * pw3270_action_connect_new(void);
93 - G_GNUC_INTERNAL GAction * pw3270_action_save_session_as_new(void); 93 + G_GNUC_INTERNAL GAction * pw3270_action_save_session_preferences_new(void);
94 G_GNUC_INTERNAL GAction * pw3270_action_save_desktop_icon_new(void); 94 G_GNUC_INTERNAL GAction * pw3270_action_save_desktop_icon_new(void);
95 95
96 GAction * pw3270_action_session_properties_new(void); 96 GAction * pw3270_action_session_properties_new(void);
src/objects/window/window.c
@@ -465,7 +465,7 @@ @@ -465,7 +465,7 @@
465 pw3270_action_session_properties_new(), 465 pw3270_action_session_properties_new(),
466 pw3270_set_color_action_new(), 466 pw3270_set_color_action_new(),
467 467
468 - pw3270_action_save_session_as_new(), 468 + pw3270_action_save_session_preferences_new(),
469 469
470 pw3270_file_transfer_action_new(), 470 pw3270_file_transfer_action_new(),
471 471
@@ -96,7 +96,7 @@ @@ -96,7 +96,7 @@
96 96
97 <item> 97 <item>
98 <attribute name="label" translatable="yes">Session preferences</attribute> 98 <attribute name="label" translatable="yes">Session preferences</attribute>
99 - <attribute name="action">win.save.session.as</attribute> 99 + <attribute name="action">win.save.session.preferences</attribute>
100 </item> 100 </item>
101 101
102 </section> 102 </section>