X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=info.c;h=842a150014505b1c31e00164efacac964908874f;hb=7cf0f6d5e19f57449078901a3730f9e40de3a012;hp=10a31f55813dd57160d5c796b02aace0323e73d6;hpb=e3bdfc2dc357e362a695632a3e0ee24095bb5b5a;p=ext%2Fsubsurface.git diff --git a/info.c b/info.c index 10a31f5..842a150 100644 --- a/info.c +++ b/info.c @@ -12,6 +12,7 @@ #include #include #include +#include #include "dive.h" #include "display.h" @@ -343,25 +344,27 @@ static void save_dive_info_changes(struct dive *dive, struct dive_info *info) changed =1; } - old_text = dive->notes; - dive->notes = get_text(info->notes); - if (text_changed(old_text,dive->notes)) - changed = 1; - if (old_text) - g_free(old_text); - + if (info->notes) { + old_text = dive->notes; + dive->notes = get_text(info->notes); + if (text_changed(old_text,dive->notes)) + changed = 1; + if (old_text) + g_free(old_text); + } if (changed) { mark_divelist_changed(TRUE); update_dive(dive); } } -static void dive_info_widget(GtkWidget *box, struct dive *dive, struct dive_info *info) +static void dive_info_widget(GtkWidget *box, struct dive *dive, struct dive_info *info, gboolean multi) { - GtkWidget *hbox, *label, *cylinder, *frame; - char buffer[80]; + GtkWidget *hbox, *label, *frame, *equipment; + char buffer[80] = "Edit multiple dives"; - divename(buffer, sizeof(buffer), dive); + if (!multi) + divename(buffer, sizeof(buffer), dive); label = gtk_label_new(buffer); gtk_box_pack_start(GTK_BOX(box), label, FALSE, TRUE, 0); @@ -378,28 +381,57 @@ static void dive_info_widget(GtkWidget *box, struct dive *dive, struct dive_info info->rating = text_entry(hbox, "Rating", star_list, star_strings[dive->rating]); - info->notes = text_view(box, "Notes", READ_WRITE); - if (dive->notes && *dive->notes) - gtk_text_buffer_set_text(gtk_text_view_get_buffer(info->notes), dive->notes, -1); - + /* only show notes if editing a single dive */ + if (multi) { + info->notes = NULL; + } else { + info->notes = text_view(box, "Notes", READ_WRITE); + if (dive->notes && *dive->notes) + gtk_text_buffer_set_text(gtk_text_view_get_buffer(info->notes), dive->notes, -1); + } hbox = gtk_hbox_new(FALSE, 3); gtk_box_pack_start(GTK_BOX(box), hbox, FALSE, TRUE, 0); - frame = gtk_frame_new("Cylinder"); - cylinder = cylinder_list_widget(); - gtk_container_add(GTK_CONTAINER(frame), cylinder); + /* create a secondary Equipment widget */ + frame = gtk_frame_new("Equipment"); + equipment = equipment_widget(W_IDX_SECONDARY); + gtk_container_add(GTK_CONTAINER(frame), equipment); gtk_box_pack_start(GTK_BOX(hbox), frame, FALSE, TRUE, 0); } -int edit_dive_info(struct dive *dive) +/* we use these to find out if we edited the cylinder or weightsystem entries */ +static cylinder_t remember_cyl[MAX_CYLINDERS]; +static weightsystem_t remember_ws[MAX_WEIGHTSYSTEMS]; + +void save_equipment_data(struct dive *dive) { - int success; + if (dive) { + memcpy(remember_cyl, dive->cylinder, sizeof(cylinder_t) * MAX_CYLINDERS); + memcpy(remember_ws, dive->weightsystem, sizeof(weightsystem_t) * MAX_WEIGHTSYSTEMS); + } +} + +void update_equipment_data(struct dive *dive, struct dive *master) +{ + if (dive == master) + return; + if (memcmp(remember_cyl, master->cylinder, sizeof(cylinder_t) * MAX_CYLINDERS)) { + memcpy(dive->cylinder, master->cylinder, sizeof(cylinder_t) * MAX_CYLINDERS); + } + if (memcmp(remember_ws, master->weightsystem, sizeof(weightsystem_t) * MAX_WEIGHTSYSTEMS)) { + memcpy(dive->weightsystem, master->weightsystem, sizeof(weightsystem_t) * MAX_WEIGHTSYSTEMS); + } +} + +int edit_multi_dive_info(int nr, int *indices) +{ + int success, i; GtkWidget *dialog, *vbox; struct dive_info info; + struct dive *dive; - if (!dive) + if (!nr) return 0; - dialog = gtk_dialog_new_with_buttons("Dive Info", GTK_WINDOW(main_window), GTK_DIALOG_DESTROY_WITH_PARENT, @@ -408,29 +440,75 @@ int edit_dive_info(struct dive *dive) NULL); vbox = gtk_dialog_get_content_area(GTK_DIALOG(dialog)); - dive_info_widget(vbox, dive, &info); - + /* SCARY STUFF - IS THIS THE BEST WAY TO DO THIS??? + * + * current_dive is one of our selected dives - and that is + * the one that is used to pre-fill the edit widget. Its + * 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); gtk_widget_show_all(dialog); success = gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT; if (success) - save_dive_info_changes(dive, &info); - + for (i = 0; i < nr; i++) { + /* copy all "info" fields */ + save_dive_info_changes(get_dive(indices[i]), &info); + /* copy the cylinders / weightsystems */ + update_equipment_data(get_dive(indices[i]), dive); + /* 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])); + } gtk_widget_destroy(dialog); return success; } +int edit_dive_info(struct dive *dive) +{ + int idx; + + if (!dive) + return 0; + idx = dive->number; + return edit_multi_dive_info(1, &idx); +} + +static GtkWidget *frame_box(GtkWidget *vbox, const char *fmt, ...) +{ + va_list ap; + char buffer[64]; + GtkWidget *frame, *hbox; + + va_start(ap, fmt); + vsnprintf(buffer, sizeof(buffer), fmt, ap); + va_end(ap); + + frame = gtk_frame_new(buffer); + gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, TRUE, 0); + hbox = gtk_hbox_new(0, 3); + gtk_container_add(GTK_CONTAINER(frame), hbox); + return hbox; +} + /* Fixme - should do at least depths too - a dive without a depth is kind of pointless */ static time_t dive_time_widget(struct dive *dive) { GtkWidget *dialog; - GtkWidget *cal, *hbox, *vbox; + GtkWidget *cal, *hbox, *vbox, *box; GtkWidget *h, *m; - GtkWidget *duration; + GtkWidget *duration, *depth; GtkWidget *label; guint yval, mval, dval; - struct tm tm; + struct tm tm, *tmp; + struct timeval tv; + time_t time; int success; + double depthinterval, val; dialog = gtk_dialog_new_with_buttons("Date and Time", GTK_WINDOW(main_window), @@ -442,33 +520,49 @@ static time_t dive_time_widget(struct dive *dive) vbox = gtk_dialog_get_content_area(GTK_DIALOG(dialog)); /* Calendar hbox */ - hbox = gtk_hbox_new(0, 3); - gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0); - + hbox = frame_box(vbox, "Date:"); cal = gtk_calendar_new(); gtk_box_pack_start(GTK_BOX(hbox), cal, FALSE, TRUE, 0); - /* Time/duration hbox */ - hbox = gtk_hbox_new(0, 3); - gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0); + /* Time hbox */ + hbox = frame_box(vbox, "Time"); h = gtk_spin_button_new_with_range (0.0, 23.0, 1.0); m = gtk_spin_button_new_with_range (0.0, 59.0, 1.0); + gettimeofday(&tv, NULL); + time = tv.tv_sec; + tmp = localtime(&time); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(h), tmp->tm_hour); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(m), (tmp->tm_min / 5)*5); + gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(h), TRUE); gtk_spin_button_set_wrap(GTK_SPIN_BUTTON(m), TRUE); - duration = gtk_spin_button_new_with_range (0.0, 1000.0, 1.0); - - gtk_box_pack_start(GTK_BOX(hbox), h, FALSE, FALSE, 0); + gtk_box_pack_end(GTK_BOX(hbox), m, FALSE, FALSE, 0); label = gtk_label_new(":"); - gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); - gtk_box_pack_start(GTK_BOX(hbox), m, FALSE, FALSE, 0); + gtk_box_pack_end(GTK_BOX(hbox), label, FALSE, FALSE, 0); + gtk_box_pack_end(GTK_BOX(hbox), h, FALSE, FALSE, 0); + + hbox = gtk_hbox_new(TRUE, 3); + gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); - label = gtk_label_new(" Duration:"); - gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); - gtk_box_pack_start(GTK_BOX(hbox), duration, FALSE, FALSE, 0); + /* Duration hbox */ + box = frame_box(hbox, "Duration (min)"); + duration = gtk_spin_button_new_with_range (0.0, 1000.0, 1.0); + gtk_box_pack_end(GTK_BOX(box), duration, FALSE, FALSE, 0); + /* Depth box */ + box = frame_box(hbox, "Depth (%s):", output_units.length == FEET ? "ft" : "m"); + if (output_units.length == FEET) { + depthinterval = 1.0; + } else { + depthinterval = 0.1; + } + depth = gtk_spin_button_new_with_range (0.0, 1000.0, depthinterval); + gtk_box_pack_end(GTK_BOX(box), depth, FALSE, FALSE, 0); + + /* All done, show it and wait for editing */ gtk_widget_show_all(dialog); success = gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT; if (!success) { @@ -485,6 +579,13 @@ static time_t dive_time_widget(struct dive *dive) tm.tm_hour = gtk_spin_button_get_value(GTK_SPIN_BUTTON(h)); tm.tm_min = gtk_spin_button_get_value(GTK_SPIN_BUTTON(m)); + val = gtk_spin_button_get_value(GTK_SPIN_BUTTON(depth)); + if (output_units.length == FEET) { + dive->maxdepth.mm = feet_to_mm(val); + } else { + dive->maxdepth.mm = val * 1000 + 0.5; + } + dive->duration.seconds = gtk_spin_button_get_value(GTK_SPIN_BUTTON(duration))*60; gtk_widget_destroy(dialog);