Commit 6ca8c69cfe8a4d7ad6345bbb531b0f09eef5aba6
1 parent
ed47edc8
Exists in
master
and in
2 other branches
Refactoring 'save session properties' action.
Showing
5 changed files
with
116 additions
and
43 deletions
Show diff stats
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
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 |
ui/window.xml
@@ -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> |