X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=info.c;h=5a620e751694a40ea8f1569a894ed6af4af6812a;hb=70f903c457a3b82cdaa62e232124cdbba5c11bc5;hp=1c7b6a9ac7d57bf7f8fd73e134e91eb27eeee1b1;hpb=9b72217f79f29313d30c87c55f533cc606da6a8f;p=ext%2Fsubsurface.git diff --git a/info.c b/info.c index 1c7b6a9..5a620e7 100644 --- a/info.c +++ b/info.c @@ -43,16 +43,49 @@ static int text_changed(const char *old, const char *new) (!old && strcmp("",new)); } -static char *get_combo_box_entry_text(GtkComboBoxEntry *combo_box, char **textp) +static char *skip_space(char *str) +{ + if (str) { + while (isspace(*str)) + str++; + if (!*str) + str = NULL; + } + return str; +} + +/* + * Get the string from a combo box. + * + * The "master" string is the string of the current dive - we only consider it + * changed if the old string is either empty, or matches that master string. + */ +static char *get_combo_box_entry_text(GtkComboBoxEntry *combo_box, char **textp, char *master) { char *old = *textp; const gchar *new; GtkEntry *entry; + old = skip_space(old); + master = skip_space(master); + + /* + * If we had a master string, and it doesn't match our old + * string, we will always pick the old value (it means that + * we're editing another dive's info that already had a + * valid value). + */ + if (master && old) + if (strcmp(master, old)) + return NULL; + entry = GTK_ENTRY(gtk_bin_get_child(GTK_BIN(combo_box))); new = gtk_entry_get_text(entry); while (isspace(*new)) new++; + /* If the master string didn't change, don't change other dives either! */ + if (!text_changed(master,new)) + return NULL; if (!text_changed(old,new)) return NULL; free(old); @@ -132,11 +165,12 @@ static int delete_dive_info(struct dive *dive) static void info_menu_edit_cb(GtkMenuItem *menuitem, gpointer user_data) { - edit_dive_info(current_dive); + edit_multi_dive_info(amount_selected, selectiontracker); } static void info_menu_delete_cb(GtkMenuItem *menuitem, gpointer user_data) { + /* this needs to delete all the selected dives as well, I guess? */ delete_dive_info(current_dive); } @@ -320,38 +354,38 @@ struct dive_info { GtkTextView *notes; }; -static void save_dive_info_changes(struct dive *dive, struct dive_info *info) +static void save_dive_info_changes(struct dive *dive, struct dive *master, struct dive_info *info) { char *old_text, *new_text; char *rating_string; int changed = 0; - new_text = get_combo_box_entry_text(info->location, &dive->location); + new_text = get_combo_box_entry_text(info->location, &dive->location, master->location); if (new_text) { add_location(new_text); changed = 1; } - new_text = get_combo_box_entry_text(info->divemaster, &dive->divemaster); + new_text = get_combo_box_entry_text(info->divemaster, &dive->divemaster, master->divemaster); if (new_text) { add_people(new_text); changed = 1; } - new_text = get_combo_box_entry_text(info->buddy, &dive->buddy); + new_text = get_combo_box_entry_text(info->buddy, &dive->buddy, master->buddy); if (new_text) { add_people(new_text); changed = 1; } - new_text = get_combo_box_entry_text(info->suit, &dive->suit); + new_text = get_combo_box_entry_text(info->suit, &dive->suit, master->suit); if (new_text) { add_suit(new_text); changed = 1; } rating_string = strdup(star_strings[dive->rating]); - new_text = get_combo_box_entry_text(info->rating, &rating_string); + new_text = get_combo_box_entry_text(info->rating, &rating_string, star_strings[master->rating]); if (new_text) { dive->rating = get_rating(rating_string); free(rating_string); @@ -443,7 +477,7 @@ int edit_multi_dive_info(int nr, int *indices) int success, i; GtkWidget *dialog, *vbox; struct dive_info info; - struct dive *dive; + struct dive *master; if (!nr) return 0; @@ -462,22 +496,34 @@ int edit_multi_dive_info(int nr, int *indices) * data is used as the starting point for all selected dives * I think it would be better to somehow collect and combine * info from all the selected dives */ - dive = current_dive; - dive_info_widget(vbox, dive, &info, (nr > 1)); - show_dive_equipment(dive, W_IDX_SECONDARY); - save_equipment_data(dive); + master = current_dive; + dive_info_widget(vbox, master, &info, (nr > 1)); + show_dive_equipment(master, W_IDX_SECONDARY); + save_equipment_data(master); gtk_widget_show_all(dialog); success = gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT; - if (success) + if (success) { + /* Update the other non-current dives first */ for (i = 0; i < nr; i++) { + int idx = indices[i]; + struct dive *dive = get_dive(idx); + + if (!dive || dive == master) + continue; /* copy all "info" fields */ - save_dive_info_changes(get_dive(indices[i]), &info); + save_dive_info_changes(dive, master, &info); /* copy the cylinders / weightsystems */ - update_equipment_data(get_dive(indices[i]), dive); + update_equipment_data(dive, master); /* this is extremely inefficient... it loops through all dives to find the right one - but we KNOW the index already */ - flush_divelist(get_dive(indices[i])); + flush_divelist(dive); } + + /* Update the master dive last! */ + save_dive_info_changes(master, master, &info); + update_equipment_data(master, master); + flush_divelist(master); + } gtk_widget_destroy(dialog); return success;