mirror of
https://github.com/subsurface/subsurface.git
synced 2025-02-19 22:16:15 +00:00
Allow manual entry of GPS coordinates
This implementation gives the user the ability to add GPS coordinates to the dive location. It works as expected in multi-dive edit scenarios. It has two major flaws: - it only support WGS84 style coordinates - it should instead be intelligent enough to parse the common formats, at least using NSEW instead of sign and understanding minutes and seconds instead of decimal degrees - but in reality, it really needs to support a map picker Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
This commit is contained in:
parent
3f261f56f3
commit
1cbffeaaf5
1 changed files with 39 additions and 1 deletions
40
info.c
40
info.c
|
@ -394,15 +394,43 @@ static int get_rating(const char *string)
|
||||||
return rating_val;
|
return rating_val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean gps_changed(struct dive *dive, struct dive *master, const char *gps_text)
|
||||||
|
{
|
||||||
|
double latitude, longitude;
|
||||||
|
int latudeg, longudeg;
|
||||||
|
|
||||||
|
/* if we have a master and the dive's gps address is different from it,
|
||||||
|
* don't change the dive */
|
||||||
|
if (master && (master->latitude.udeg != dive->latitude.udeg ||
|
||||||
|
master->longitude.udeg != dive->longitude.udeg))
|
||||||
|
return FALSE;
|
||||||
|
if (sscanf(gps_text, "%lf,%lf", &latitude, &longitude) != 2)
|
||||||
|
return FALSE;
|
||||||
|
latudeg = 1000000 * latitude + 0.5;
|
||||||
|
longudeg = 1000000 * longitude + 0.5;
|
||||||
|
|
||||||
|
/* if master gps didn't change, don't change dive */
|
||||||
|
if (master && master->latitude.udeg == latudeg && master->longitude.udeg == longudeg)
|
||||||
|
return FALSE;
|
||||||
|
/* if dive gps didn't change, nothing changed */
|
||||||
|
if (dive->latitude.udeg == latudeg && dive->longitude.udeg == longudeg)
|
||||||
|
return FALSE;
|
||||||
|
/* ok, update the dive and mark things changed */
|
||||||
|
dive->latitude.udeg = latudeg;
|
||||||
|
dive->longitude.udeg = longudeg;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
struct dive_info {
|
struct dive_info {
|
||||||
GtkComboBoxEntry *location, *divemaster, *buddy, *rating, *suit, *viz;
|
GtkComboBoxEntry *location, *divemaster, *buddy, *rating, *suit, *viz;
|
||||||
GtkEntry *airtemp;
|
GtkEntry *airtemp, *gps;
|
||||||
GtkTextView *notes;
|
GtkTextView *notes;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void save_dive_info_changes(struct dive *dive, struct dive *master, 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 *old_text, *new_text;
|
||||||
|
const char *gps_text;
|
||||||
char *rating_string;
|
char *rating_string;
|
||||||
double newtemp;
|
double newtemp;
|
||||||
int changed = 0;
|
int changed = 0;
|
||||||
|
@ -413,6 +441,10 @@ static void save_dive_info_changes(struct dive *dive, struct dive *master, struc
|
||||||
changed = 1;
|
changed = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gps_text = gtk_entry_get_text(info->gps);
|
||||||
|
if (gps_changed(dive, master, gps_text))
|
||||||
|
changed = 1;
|
||||||
|
|
||||||
new_text = get_combo_box_entry_text(info->divemaster, &dive->divemaster, master->divemaster);
|
new_text = get_combo_box_entry_text(info->divemaster, &dive->divemaster, master->divemaster);
|
||||||
if (new_text) {
|
if (new_text) {
|
||||||
add_people(new_text);
|
add_people(new_text);
|
||||||
|
@ -503,6 +535,7 @@ static void dive_info_widget(GtkWidget *box, struct dive *dive, struct dive_info
|
||||||
GtkWidget *hbox, *label, *frame, *equipment;
|
GtkWidget *hbox, *label, *frame, *equipment;
|
||||||
char buffer[128];
|
char buffer[128];
|
||||||
char airtemp[6];
|
char airtemp[6];
|
||||||
|
char gps_text[25] = "";
|
||||||
const char *unit;
|
const char *unit;
|
||||||
double value;
|
double value;
|
||||||
|
|
||||||
|
@ -515,6 +548,11 @@ static void dive_info_widget(GtkWidget *box, struct dive *dive, struct dive_info
|
||||||
|
|
||||||
info->location = text_entry(box, _("Location"), location_list, dive->location);
|
info->location = text_entry(box, _("Location"), location_list, dive->location);
|
||||||
|
|
||||||
|
if (dive_has_location(dive))
|
||||||
|
snprintf(gps_text, sizeof(gps_text), "%3.5lf,%3.5lf", dive->latitude.udeg / 1000000.0,
|
||||||
|
dive->longitude.udeg / 1000000.0);
|
||||||
|
info->gps = single_text_entry(box, _("GPS"), gps_text);
|
||||||
|
|
||||||
hbox = gtk_hbox_new(FALSE, 3);
|
hbox = gtk_hbox_new(FALSE, 3);
|
||||||
gtk_box_pack_start(GTK_BOX(box), hbox, FALSE, TRUE, 0);
|
gtk_box_pack_start(GTK_BOX(box), hbox, FALSE, TRUE, 0);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue