[PULL REQUEST] Some dialog changes and a potential issue in gtk-gui.c

Lubomir I. Ivanov neolit123 at gmail.com
Fri Sep 21 12:44:26 PDT 2012


  Only select last dive by default if no other dives are selected (2012-09-20 15:35:43 -0700)

are available in the git repository at:

  git at github.com:neolit123/subsurface.git import

for you to fetch changes up to a045caa80d7e0474dbf27e110cbd08b1535b54be:

  Make sure windows behind forward dialogs are truly inactive (2012-09-21 22:09:48 +0300)

----------------------------------------------------------------
Lubomir I. Ivanov (3):
      Keep the "OK" button in "Import" disabled until a DC is selected
      More cosmetic changes in the "Import" dialog
      Make sure windows behind forward dialogs are truly inactive

 gtk-gui.c | 56 +++++++++++++++++++++++++++++++++++++++-----------------
 1 file changed, 39 insertions(+), 17 deletions(-)

diff --git a/gtk-gui.c b/gtk-gui.c
index 167517e..e15f72a 100644
--- a/gtk-gui.c
+++ b/gtk-gui.c
@@ -485,7 +485,7 @@ static void event_toggle(GtkWidget *w, gpointer _data)
 
 static void pick_default_file(GtkWidget *w, GtkButton *button)
 {
-	GtkWidget *fs_dialog, *preferences;
+	GtkWidget *fs_dialog, *parent;
 	const char *current_default;
 	char *current_def_file, *current_def_dir;
 	GtkFileFilter *filter;
@@ -497,8 +497,10 @@ static void pick_default_file(GtkWidget *w, GtkButton *button)
 		GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
 		GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
 		NULL);
-	preferences = gtk_widget_get_ancestor(w, GTK_TYPE_DIALOG);
-	gtk_window_set_accept_focus(GTK_WINDOW(preferences), FALSE);
+	parent = gtk_widget_get_ancestor(w, GTK_TYPE_DIALOG);
+	gtk_widget_set_sensitive(parent, FALSE);
+	gtk_window_set_decorated(GTK_WINDOW(parent), FALSE);
+	gtk_window_set_transient_for(GTK_WINDOW(fs_dialog), GTK_WINDOW(parent));
 
 	current_default = subsurface_default_filename();
 	current_def_dir = g_path_get_dirname(current_default);
@@ -528,7 +530,9 @@ static void pick_default_file(GtkWidget *w, GtkButton *button)
 	free(current_def_file);
 	free((void *)current_default);
 	gtk_widget_destroy(fs_dialog);
-	gtk_window_set_accept_focus(GTK_WINDOW(preferences), TRUE);
+
+	gtk_widget_set_sensitive(parent, TRUE);
+	gtk_window_set_decorated(GTK_WINDOW(parent), TRUE);
 }
 
 static void preferences_dialog(GtkWidget *w, gpointer data)
@@ -1240,6 +1244,14 @@ void render_dive_computer(GtkCellLayout *cell,
 	g_object_set(renderer, "text", buffer, NULL);
 }
 
+static void dive_computer_selector_changed(GtkWidget *combo, gpointer data)
+{
+	GtkWidget *import, *button;
+
+	import = gtk_widget_get_ancestor(combo, GTK_TYPE_DIALOG);
+	button = gtk_dialog_get_widget_for_response(GTK_DIALOG(import), GTK_RESPONSE_ACCEPT);
+	gtk_widget_set_sensitive(button, TRUE);
+}
 
 static GtkComboBox *dive_computer_selector(GtkWidget *vbox)
 {
@@ -1258,6 +1270,7 @@ static GtkComboBox *dive_computer_selector(GtkWidget *vbox)
 	gtk_box_pack_start(GTK_BOX(hbox), frame, FALSE, TRUE, 3);
 
 	combo_box = gtk_combo_box_new_with_model(GTK_TREE_MODEL(model));
+	g_signal_connect(G_OBJECT(combo_box), "changed", G_CALLBACK(dive_computer_selector_changed), NULL);
 	gtk_container_add(GTK_CONTAINER(frame), combo_box);
 
 	renderer = gtk_cell_renderer_text_new();
@@ -1296,21 +1309,23 @@ static GtkEntry *dive_computer_device(GtkWidget *vbox)
 
 static void pick_import_files(GtkWidget *w, GSList **filelist)
 {
-	GtkWidget *fs_dialog, *import;
+	GtkWidget *fs_dialog, *parent;
 	const char *current_default;
 	char *current_def_dir;
 	GtkFileFilter *filter;
 	struct stat sb;
 
 	*filelist = NULL;
-	fs_dialog = gtk_file_chooser_dialog_new("Choose Files to import",
+	fs_dialog = gtk_file_chooser_dialog_new("Choose Files To Import",
 		GTK_WINDOW(main_window),
 		GTK_FILE_CHOOSER_ACTION_OPEN,
 		GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
 		GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
 		NULL);
-	import = gtk_widget_get_ancestor(w, GTK_TYPE_DIALOG);
-	gtk_window_set_accept_focus(GTK_WINDOW(import), FALSE);
+	parent = gtk_widget_get_ancestor(w, GTK_TYPE_DIALOG);
+	gtk_widget_set_sensitive(parent, FALSE);
+	gtk_window_set_decorated(GTK_WINDOW(parent), FALSE);
+	gtk_window_set_transient_for(GTK_WINDOW(fs_dialog), GTK_WINDOW(parent));
 
 	/* I'm not sure what the best default path should be... */
 	if (existing_filename) {
@@ -1335,10 +1350,13 @@ static void pick_import_files(GtkWidget *w, GSList **filelist)
 		*filelist = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(fs_dialog));
 	free(current_def_dir);
 	gtk_widget_destroy(fs_dialog);
-	gtk_window_set_accept_focus(GTK_WINDOW(import), TRUE);
+
+	gtk_widget_set_sensitive(parent, TRUE);
+	gtk_window_set_decorated(GTK_WINDOW(parent), TRUE);
+
 	/* if we selected one or more files, pretent that we clicked OK in the import dialog */
 	if (*filelist != NULL)
-		gtk_dialog_response(GTK_DIALOG(import), GTK_RESPONSE_ACCEPT);
+		gtk_dialog_response(GTK_DIALOG(parent), GTK_RESPONSE_ACCEPT);
 }
 
 static void xml_file_selector(GtkWidget *vbox, GtkWidget *main_dialog, GSList **list)
@@ -1348,12 +1366,12 @@ static void xml_file_selector(GtkWidget *vbox, GtkWidget *main_dialog, GSList **
 	hbox = gtk_hbox_new(FALSE, 6);
 	gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 3);
 
-	frame = gtk_frame_new("XML file name");
+	frame = gtk_frame_new("XML files");
 	gtk_box_pack_start(GTK_BOX(hbox), frame, FALSE, TRUE, 3);
 
 	box = gtk_hbox_new(FALSE, 6);
 	gtk_container_add(GTK_CONTAINER(frame), box);
-	chooser = gtk_button_new_with_label("Pick XML file to import");
+	chooser = gtk_button_new_with_label("Choose Files To Import");
 	g_signal_connect(G_OBJECT(chooser), "clicked", G_CALLBACK(pick_import_files), list);
 	gtk_box_pack_start(GTK_BOX(box), chooser, FALSE, FALSE, 6);
 }
@@ -1397,9 +1415,10 @@ static GtkWidget *import_dive_computer(device_data_t *data, GtkDialog *dialog)
 void import_dialog(GtkWidget *w, gpointer data)
 {
 	int result;
-	GtkWidget *dialog, *hbox, *vbox, *label, *info = NULL;
+	GtkWidget *dialog, *button, *hbox, *vbox, *label, *info = NULL;
 	GSList *filenames = NULL;
 	GtkComboBox *computer;
+	GtkTreeIter iter;
 	GtkEntry *device;
 	device_data_t devicedata = {
 		.devname = NULL,
@@ -1413,7 +1432,7 @@ void import_dialog(GtkWidget *w, gpointer data)
 		NULL);
 
 	vbox = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
-	label = gtk_label_new("Load XML file or import directly from dive computer");
+	label = gtk_label_new("Choose what to import:");
 	gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, TRUE, 3);
 	xml_file_selector(vbox, dialog, &filenames);
 	computer = dive_computer_selector(vbox);
@@ -1423,12 +1442,15 @@ void import_dialog(GtkWidget *w, gpointer data)
 	devicedata.progress.bar = gtk_progress_bar_new();
 	gtk_container_add(GTK_CONTAINER(hbox), devicedata.progress.bar);
 
+	button = gtk_dialog_get_widget_for_response(GTK_DIALOG(dialog), GTK_RESPONSE_ACCEPT);
+	if (!gtk_combo_box_get_active_iter(computer, &iter))
+		gtk_widget_set_sensitive(button, FALSE);
+
 repeat:
 	gtk_widget_show_all(dialog);
 	result = gtk_dialog_run(GTK_DIALOG(dialog));
 	switch (result) {
 		dc_descriptor_t *descriptor;
-		GtkTreeIter iter;
 		GtkTreeModel *model;
 
 	case GTK_RESPONSE_ACCEPT:
@@ -1441,6 +1463,7 @@ repeat:
 
 			if (!gtk_combo_box_get_active_iter(computer, &iter))
 				break;
+
 			model = gtk_combo_box_get_model(computer);
 			gtk_tree_model_get(model, &iter,
 					0, &descriptor,
@@ -1462,13 +1485,12 @@ repeat:
 			g_slist_foreach(filenames,do_import_file,NULL);
 			g_slist_free(filenames);
 		}
+		report_dives(TRUE);
 		break;
 	default:
 		break;
 	}
 	gtk_widget_destroy(dialog);
-
-	report_dives(TRUE);
 }
 
 void update_progressbar(progressbar_t *progress, double value)


More information about the subsurface mailing list