]> git.tdb.fi Git - ext/subsurface.git/commitdiff
Add the ugliest 'delete dive' model ever
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 3 Apr 2012 02:19:01 +0000 (19:19 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 3 Apr 2012 02:19:01 +0000 (19:19 -0700)
This interface works the same way the "edit dive" menu item does: it's a
text entry meny item on the dive text entries (ie buddy/divemaster/notes
sections).  Except you pick the "Delete" entry rather than the "Edit"
entry.

It kind of works, but it really is a pretty horrible interface.  I'll
need to add a top-level dive menu entry for just deleting all selected
dives instead.  And it would be good to be able to get a drop-down menu
from the divelist instead of having to do it from the dive text entries,
which is just insane.

But that requires gtk work.  I'm not quite ready to get back into that.
Thus the "exact same insane interface as the explicit 'Edit' mode".

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
dive.h
info.c
parse-xml.c

diff --git a/dive.h b/dive.h
index 39f203738833519c594c50032146d13f867c49a2..89f790122fa4d4312a2aca694ab1c75ef2b5b5e7 100644 (file)
--- a/dive.h
+++ b/dive.h
@@ -299,6 +299,7 @@ extern time_t utc_mktime(struct tm *tm);
 
 extern struct dive *alloc_dive(void);
 extern void record_dive(struct dive *dive);
+extern void delete_dive(struct dive *dive);
 
 extern struct sample *prepare_sample(struct dive **divep);
 extern void finish_sample(struct dive *dive);
diff --git a/info.c b/info.c
index 6a4a296b004013d7b77ba9bb746b79225385f6d7..f1afc0574eb36476a616d987e726a712cdf3918b 100644 (file)
--- a/info.c
+++ b/info.c
@@ -100,19 +100,58 @@ void show_dive_info(struct dive *dive)
                dive && dive->notes ? dive->notes : "", -1);
 }
 
+static int delete_dive_info(struct dive *dive)
+{
+       int success;
+       GtkWidget *dialog;
+
+       if (!dive)
+               return 0;
+
+       dialog = gtk_dialog_new_with_buttons("Delete Dive",
+               GTK_WINDOW(main_window),
+               GTK_DIALOG_DESTROY_WITH_PARENT,
+               GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
+               GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
+               NULL);
+
+       gtk_widget_show_all(dialog);
+       success = gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT;
+       if (success) {
+               delete_dive(dive);
+               mark_divelist_changed(TRUE);
+               dive_list_update_dives();
+       }
+
+       gtk_widget_destroy(dialog);
+
+       return success;
+}
+
 static void info_menu_edit_cb(GtkMenuItem *menuitem, gpointer user_data)
 {
        edit_dive_info(current_dive);
 }
 
-static void populate_popup_cb(GtkTextView *entry, GtkMenu *menu, gpointer user_data)
+static void info_menu_delete_cb(GtkMenuItem *menuitem, gpointer user_data)
 {
-       GtkWidget *item = gtk_menu_item_new_with_label("Edit");
-       g_signal_connect(item, "activate", G_CALLBACK(info_menu_edit_cb), NULL);
+       delete_dive_info(current_dive);
+}
+
+static void add_menu_item(GtkMenu *menu, const char *label, void (*cb)(GtkMenuItem *, gpointer))
+{
+       GtkWidget *item = gtk_menu_item_new_with_label(label);
+       g_signal_connect(item, "activate", G_CALLBACK(cb), NULL);
        gtk_widget_show(item); /* Yes, really */
        gtk_menu_prepend(menu, item);
 }
 
+static void populate_popup_cb(GtkTextView *entry, GtkMenu *menu, gpointer user_data)
+{
+       add_menu_item(menu, "Delete", info_menu_delete_cb);
+       add_menu_item(menu, "Edit", info_menu_edit_cb);
+}
+
 static GtkEntry *text_value(GtkWidget *box, const char *label)
 {
        GtkWidget *widget;
index e920a11f6f0d798b18900ccb23317c95c8ec5162..552786b7aa58e3f780e08ce45bd87e80f1cfbbcf 100644 (file)
@@ -39,6 +39,29 @@ void record_dive(struct dive *dive)
        dive_table.nr = nr+1;
 }
 
+/*
+ * Remove a dive from the dive_table array
+ */
+void delete_dive(struct dive *dive)
+{
+       int nr = dive_table.nr, i;
+       struct dive **dives = dive_table.dives;
+
+       /*
+        * Stupid. We know the dive table is sorted by date,
+        * we could do a binary lookup. Sue me.
+        */
+       for (i = 0; i < nr; i++) {
+               struct dive *d = dives[i];
+               if (d != dive)
+                       continue;
+               memmove(dives+i, dives+i+1, sizeof(struct dive *)*(nr-i-1));
+               dives[nr] = NULL;
+               dive_table.nr = nr-1;
+               break;
+       }
+}
+
 static void start_match(const char *type, const char *name, char *buffer)
 {
        if (verbose > 2)