summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Dirk Hohndel <dirk@hohndel.org>2011-09-20 21:29:09 -0700
committerGravatar Dirk Hohndel <dirk@hohndel.org>2011-09-21 11:28:36 -0700
commitf459c2ec22839a4a208ea833bdb1e0b87a6799b4 (patch)
tree88c9a0b217c6e6e1975b91bd421845ccd31c2830
parentb4c4a29a11ff82dacfe3a145fe4eedaae2341151 (diff)
downloadsubsurface-f459c2ec22839a4a208ea833bdb1e0b87a6799b4.tar.gz
Simplistic first attempt to get changes saved when quitting subsurface
Track whether things changed in the global dive_list So far this actually works if changing dive info (but only if dive selected was changed after the dive info was changed). We are not tracking changes to the cylinder information, yet. also remove the duplicate static dive_list Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
-rw-r--r--divelist.c18
-rw-r--r--divelist.h2
-rw-r--r--gtk-gui.c28
-rw-r--r--info.c37
4 files changed, 73 insertions, 12 deletions
diff --git a/divelist.c b/divelist.c
index 88825dd89..e84e3a10d 100644
--- a/divelist.c
+++ b/divelist.c
@@ -7,6 +7,8 @@
* void dive_list_update_dives(void)
* void update_dive_list_units(void)
* void set_divelist_font(const char *font)
+ * void mark_divelist_changed(int changed)
+ * int unsaved_changes()
*/
#include <stdio.h>
#include <stdlib.h>
@@ -24,6 +26,7 @@ struct DiveList {
GtkListStore *model;
GtkTreeViewColumn *date, *depth, *duration, *location;
GtkTreeViewColumn *temperature, *cylinder, *nitrox, *sac;
+ int changed;
};
static struct DiveList dive_list;
@@ -45,9 +48,6 @@ enum {
DIVELIST_COLUMNS
};
-/* the global dive list that we maintain */
-static struct DiveList dive_list;
-
static void selection_cb(GtkTreeSelection *selection, GtkTreeModel *model)
{
GtkTreeIter iter;
@@ -492,5 +492,17 @@ GtkWidget *dive_list_create(void)
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
gtk_container_add(GTK_CONTAINER(dive_list.container_widget), dive_list.tree_view);
+ dive_list.changed = 0;
+
return dive_list.container_widget;
}
+
+void mark_divelist_changed(int changed)
+{
+ dive_list.changed = changed;
+}
+
+int unsaved_changes()
+{
+ return dive_list.changed;
+}
diff --git a/divelist.h b/divelist.h
index 7684a72d3..3151a69db 100644
--- a/divelist.h
+++ b/divelist.h
@@ -7,4 +7,6 @@ extern void dive_list_update_dives(void);
extern void update_dive_list_units(void);
extern void flush_divelist(struct dive *);
+extern void mark_divelist_changed(int);
+extern int unsaved_changes(void);
#endif
diff --git a/gtk-gui.c b/gtk-gui.c
index f60df9bf1..71762f535 100644
--- a/gtk-gui.c
+++ b/gtk-gui.c
@@ -31,11 +31,6 @@ struct units output_units;
#define GCONF_NAME(x) "/apps/subsurface/" #x
-void on_destroy(GtkWidget* w, gpointer data)
-{
- gtk_main_quit();
-}
-
static GtkWidget *dive_profile;
void repaint_dive(void)
@@ -146,10 +141,33 @@ static void file_save(GtkWidget *w, gpointer data)
filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
save_dives(filename);
g_free(filename);
+ mark_divelist_changed(TRUE);
}
gtk_widget_destroy(dialog);
}
+static void ask_save_changes()
+{
+ GtkWidget *dialog;
+ dialog = gtk_dialog_new_with_buttons("Save Changes?",
+ GTK_WINDOW(main_window), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
+ GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
+ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+ NULL);
+
+ if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) {
+ file_save(NULL,NULL);
+ }
+ gtk_widget_destroy(dialog);
+}
+
+void on_destroy(GtkWidget* w, gpointer data)
+{
+ if (unsaved_changes())
+ ask_save_changes();
+ gtk_main_quit();
+}
+
static void quit(GtkWidget *w, gpointer data)
{
gtk_main_quit();
diff --git a/info.c b/info.c
index 9e061970d..e79a80b38 100644
--- a/info.c
+++ b/info.c
@@ -33,30 +33,59 @@ static char *get_text(GtkTextBuffer *buffer)
return gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
}
+/* old is NULL or a valid string, new is a valid string
+ * NOTW: NULL and "" need to be treated as "unchanged" */
+static int text_changed(char *old, char *new)
+{
+ return ((old && strcmp(old,new)) ||
+ (!old && strcmp("",new)));
+}
+
void flush_dive_info_changes(struct dive *dive)
{
+ char *old_text;
+ int changed = 0;
+
if (!dive)
return;
if (location_changed) {
- g_free(dive->location);
+ old_text = dive->location;
dive->location = gtk_editable_get_chars(GTK_EDITABLE(location), 0, -1);
+ if (text_changed(old_text,dive->location))
+ changed = 1;
+ if (old_text)
+ g_free(old_text);
}
if (divemaster_changed) {
- g_free(dive->divemaster);
+ old_text = dive->divemaster;
dive->divemaster = gtk_editable_get_chars(GTK_EDITABLE(divemaster), 0, -1);
+ if (text_changed(old_text,dive->divemaster))
+ changed = 1;
+ if (old_text)
+ g_free(old_text);
}
if (buddy_changed) {
- g_free(dive->buddy);
+ old_text = dive->buddy;
dive->buddy = gtk_editable_get_chars(GTK_EDITABLE(buddy), 0, -1);
+ if (text_changed(old_text,dive->buddy))
+ changed = 1;
+ if (old_text)
+ g_free(old_text);
}
if (notes_changed) {
- g_free(dive->notes);
+ old_text = dive->notes;
dive->notes = get_text(notes);
+ if (text_changed(old_text,dive->notes))
+ changed = 1;
+ if (old_text)
+ g_free(old_text);
}
+ if (changed)
+ mark_divelist_changed(TRUE);
}
#define SET_TEXT_ENTRY(x) \