Index: src/cmenu.c =================================================================== --- src/cmenu.c (revision 6) +++ src/cmenu.c (revision 7) @@ -262,13 +262,43 @@ } static gboolean +add_poi_at_unit_xy(gint x, gint y) +{ + static gint poi_cat = -1; + gint poi_id; + PoiInfo poi; + printf("%s()\n", __PRETTY_FUNCTION__); + + poi_id = poi_get_next_id(); + + poi.poi_id = -1; + poi.cat_id = poi_cat; + unit2latlon(x, y, poi.lat, poi.lon); + if (poi_id != -1) + poi.label = g_strdup_printf("Point%06d", poi_id); /* TODO: l10n */ + else + poi.label = g_strdup(""); + poi.desc = g_strdup(""); + poi.clabel = NULL; + + poi_dialog(_window, &poi, TRUE); + poi_cat = poi.cat_id; + + g_free(poi.label); + g_free(poi.desc); + g_free(poi.clabel); + + vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); +} + +static gboolean cmenu_cb_loc_add_poi(GtkMenuItem *item) { gint unitx, unity; printf("%s()\n", __PRETTY_FUNCTION__); screen2unit(_cmenu_position_x, _cmenu_position_y, unitx, unity); - poi_add_dialog(_window, unitx, unity); + add_poi_at_unit_xy(unitx, unity); vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; @@ -533,7 +563,7 @@ screen2unit(_cmenu_position_x, _cmenu_position_y, unitx, unity); if((way = find_nearest_waypoint(unitx, unity))) - poi_add_dialog(_window, way->point->unitx, way->point->unity); + add_poi_at_unit_xy(way->point->unitx, way->point->unity); else { MACRO_BANNER_SHOW_INFO(_window, _("There are no waypoints.")); @@ -626,19 +656,16 @@ gint unitx, unity; printf("%s()\n", __PRETTY_FUNCTION__); - memset(&poi, 0, sizeof(poi)); screen2unit(_cmenu_position_x, _cmenu_position_y, unitx, unity); if(!select_poi(unitx, unity, &poi, FALSE)) /* FALSE = not quick */ return FALSE; - poi_view_dialog(_window, &poi); - if(poi.label) - g_free(poi.label); - if(poi.desc) - g_free(poi.desc); - if(poi.clabel) - g_free(poi.clabel); + poi_dialog(_window, &poi, FALSE); + g_free(poi.label); + g_free(poi.desc); + g_free(poi.clabel); + vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return TRUE; } Index: src/poi.c =================================================================== --- src/poi.c (revision 6) +++ src/poi.c (revision 7) @@ -1144,446 +1144,176 @@ } gboolean -poi_add_dialog(GtkWidget *parent, gint unitx, gint unity) +poi_dialog(GtkWidget *parent, PoiInfo *poi, gboolean is_add_dialog) { - static PoiInfo poi; - static GtkWidget *dialog; - static GtkWidget *table; - static GtkWidget *label; - static GtkWidget *txt_label; - static GtkWidget *txt_lat; - static GtkWidget *txt_lon; - static GtkWidget *cmb_category; - static GtkWidget *txt_desc; - static GtkWidget *btn_catedit; - static GtkWidget *hbox; - static GtkWidget *txt_scroll; - static GtkTextBuffer *desc_txt; - static GtkTextIter begin, end; - static DeletePOI dpoi = {NULL, NULL, 0}; - static PoiCategoryEditInfo pcedit; static int last_deg_format = 0; + GtkTreeIter iter; + GtkWidget *dialog; + GtkWidget *table; + GtkWidget *label; + GtkWidget *txt_label; + GtkWidget *txt_lat; + GtkWidget *txt_lon; + GtkWidget *cmb_category; + GtkWidget *txt_desc; + GtkWidget *btn_delete; + GtkWidget *btn_catedit; + GtkWidget *hbox; + GtkWidget *txt_scroll; + GtkTextBuffer *desc_txt; + GtkTextIter begin, end; + DeletePOI dpoi; + PoiCategoryEditInfo pcedit; + + gchar tmp1[LL_FMT_LEN], tmp2[LL_FMT_LEN]; printf("%s()\n", __PRETTY_FUNCTION__); - - unit2latlon(unitx, unity, poi.lat, poi.lon); - gint fallback_deg_format = _degformat; - if(!coord_system_check_lat_lon (poi.lat, poi.lon, &fallback_deg_format)) + if(!coord_system_check_lat_lon(poi->lat, poi->lon, &fallback_deg_format)) { last_deg_format = _degformat; _degformat = fallback_deg_format; - - if(dialog != NULL) gtk_widget_destroy(dialog); - dialog = NULL; } else if(_degformat != last_deg_format) - { last_deg_format = _degformat; - - if(dialog != NULL) gtk_widget_destroy(dialog); - dialog = NULL; - } - - - - if(dialog == NULL) + if (is_add_dialog) { dialog = gtk_dialog_new_with_buttons(_("Add POI"), - GTK_WINDOW(parent), GTK_DIALOG_MODAL, - GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, - GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, - NULL); - - /* Set the lat/lon strings. */ - gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), - table = gtk_table_new(6, 4, FALSE), TRUE, TRUE, 0); - - gtk_table_attach(GTK_TABLE(table), - label = gtk_label_new(DEG_FORMAT_ENUM_TEXT[_degformat].short_field_1), - 0, 1, 0, 1, GTK_FILL, 0, 2, 0); - gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f); - gtk_table_attach(GTK_TABLE(table), - txt_lat = gtk_entry_new(), - 1, (DEG_FORMAT_ENUM_TEXT[_degformat].field_2_in_use ? 2 : 4), - 0, 1, GTK_FILL, 0, 2, 0); - - if(DEG_FORMAT_ENUM_TEXT[_degformat].field_2_in_use ) - { - gtk_table_attach(GTK_TABLE(table), - label = gtk_label_new(DEG_FORMAT_ENUM_TEXT[_degformat].short_field_2), - 2, 3, 0, 1, GTK_FILL, 0, 2, 0); - gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f); - gtk_table_attach(GTK_TABLE(table), - txt_lon = gtk_entry_new(), - 3, 4, 0, 1, GTK_FILL, 0, 2, 0); - } - - gtk_table_attach(GTK_TABLE(table), - label = gtk_label_new(_("Label")), - 0, 1, 1, 2, GTK_FILL, 0, 2, 0); - gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f); - gtk_table_attach(GTK_TABLE(table), - txt_label = gtk_entry_new(), - 1, 4, 1, 2, GTK_EXPAND | GTK_FILL, 0, 2, 0); - - gtk_table_attach(GTK_TABLE(table), - label = gtk_label_new(_("Category")), - 0, 1, 3, 4, GTK_FILL, 0, 2, 0); - gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f); - gtk_table_attach(GTK_TABLE(table), - hbox = gtk_hbox_new(FALSE, 4), - 1, 4, 3, 4, GTK_EXPAND | GTK_FILL, 0, 2, 0); - gtk_box_pack_start(GTK_BOX(hbox), - cmb_category = poi_create_cat_combo(), - FALSE, FALSE, 0); - - gtk_box_pack_start(GTK_BOX(hbox), - btn_catedit = gtk_button_new_with_label( - _("Edit Categories...")), - FALSE, FALSE, 0); - - gtk_table_attach(GTK_TABLE(table), - label = gtk_label_new(_("Description")), - 0, 1, 5, 6, GTK_FILL, GTK_FILL, 2, 0); - gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.0f); - - txt_scroll = gtk_scrolled_window_new(NULL, NULL); - gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(txt_scroll), - GTK_SHADOW_IN); - gtk_table_attach(GTK_TABLE(table), - txt_scroll, - 1, 4, 5, 6, GTK_EXPAND | GTK_FILL, 0, 2, 0); - - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(txt_scroll), - GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - - txt_desc = gtk_text_view_new (); - gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(txt_desc), GTK_WRAP_WORD); - - gtk_container_add(GTK_CONTAINER(txt_scroll), txt_desc); - gtk_widget_set_size_request(GTK_WIDGET(txt_scroll), 550, 120); - - desc_txt = gtk_text_view_get_buffer(GTK_TEXT_VIEW (txt_desc)); - - g_signal_connect(G_OBJECT(btn_catedit), "clicked", - G_CALLBACK(poi_edit_cat), &pcedit); + GTK_WINDOW(parent), GTK_DIALOG_MODAL, + GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, + GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT, + NULL); } - - poi.poi_id = -1; - poi.cat_id = -1; - poi.clabel = NULL; - poi.desc = g_strdup(""); - - /* Lat/Lon */ - { - gchar tmp1[LL_FMT_LEN], tmp2[LL_FMT_LEN]; - - format_lat_lon(poi.lat, poi.lon, tmp1, tmp2); - //lat_format(poi.lat, tmp1); - //lon_format(poi.lon, tmp2); - - gtk_entry_set_text(GTK_ENTRY(txt_lat), tmp1); - - if(txt_lon != NULL) - gtk_entry_set_text(GTK_ENTRY(txt_lon), tmp2); - } - - /* Label */ - if(SQLITE_ROW == sqlite3_step(_stmt_nextlabel_poi)) - poi.label = g_strdup_printf("Point%06d", - sqlite3_column_int(_stmt_nextlabel_poi, 0)); else - poi.label = g_strdup(""); - sqlite3_reset(_stmt_nextlabel_poi); - gtk_entry_set_text(GTK_ENTRY(txt_label), poi.label); - - /* POI Desc. */ - gtk_text_buffer_set_text(desc_txt, "", -1); - - /* Category. */ { - GtkTreeIter iter; - gint cat_id = -1; - gboolean had_cat_id = FALSE; - - if(gtk_combo_box_get_active_iter( - GTK_COMBO_BOX(cmb_category), &iter)) - { - gtk_tree_model_get( - gtk_combo_box_get_model(GTK_COMBO_BOX(cmb_category)),&iter, - 0, &cat_id, - -1); - had_cat_id = TRUE; - } - gtk_list_store_clear(GTK_LIST_STORE(gtk_combo_box_get_model( - GTK_COMBO_BOX(cmb_category)))); - if(poi_populate_categories(GTK_LIST_STORE(gtk_combo_box_get_model( - GTK_COMBO_BOX(cmb_category))), cat_id, &iter) - && had_cat_id) - { - gtk_combo_box_set_active_iter(GTK_COMBO_BOX(cmb_category), &iter); - } - } - - pcedit.dialog = dialog; - pcedit.cmb_category = cmb_category; - pcedit.cat_id = poi.cat_id; - - gtk_widget_show_all(dialog); - - while(GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog))) - { - GtkTreeIter iter; - const gchar *lat, *lon = NULL; - - lat = gtk_entry_get_text(GTK_ENTRY(txt_lat)); - - if(txt_lon != NULL) - lon = gtk_entry_get_text(GTK_ENTRY(txt_lon)); - - if(!parse_coords(lat, lon, &poi.lat, &poi.lon)) - { - popup_error(dialog, _("Invalid Coordinate specified")); - continue; - } - - if(strlen(gtk_entry_get_text(GTK_ENTRY(txt_label)))) - { - if(poi.label) - g_free(poi.label); - poi.label = g_strdup(gtk_entry_get_text(GTK_ENTRY(txt_label))); - } - else - { - popup_error(dialog, _("Please specify a name.")); - continue; - } - - if(!gtk_combo_box_get_active_iter( - GTK_COMBO_BOX(cmb_category), &iter)) - { - popup_error(dialog, _("Please specify a category.")); - continue; - } - - gtk_text_buffer_get_iter_at_offset(desc_txt, &begin,0 ); - gtk_text_buffer_get_end_iter (desc_txt, &end); - if(poi.desc) - g_free(poi.desc); - poi.desc = gtk_text_buffer_get_text(desc_txt, &begin, &end, TRUE); - - if(poi.clabel) - g_free(poi.clabel); - gtk_tree_model_get( - gtk_combo_box_get_model(GTK_COMBO_BOX(cmb_category)), &iter, - 0, &poi.cat_id, - 1, &poi.clabel, - -1); - - /* add poi */ - if(SQLITE_OK != sqlite3_bind_double(_stmt_insert_poi, 1, poi.lat) - || SQLITE_OK != sqlite3_bind_double(_stmt_insert_poi, 2, poi.lon) - || SQLITE_OK != sqlite3_bind_text(_stmt_insert_poi, 3, poi.label, - -1, SQLITE_STATIC) - || SQLITE_OK != sqlite3_bind_text(_stmt_insert_poi, 4, poi.desc, - -1, SQLITE_STATIC) - || SQLITE_OK != sqlite3_bind_int(_stmt_insert_poi, 5, poi.cat_id) - || SQLITE_DONE != sqlite3_step(_stmt_insert_poi)) - { - MACRO_BANNER_SHOW_INFO(parent, _("Error adding POI")); - } - - sqlite3_reset(_stmt_insert_poi); - - /* We're done. */ - break; - } - - g_free(poi.label); - g_free(poi.desc); - g_free(dpoi.txt_label); - - map_force_redraw(); - - gtk_widget_hide(dialog); - - _degformat = last_deg_format; - - vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); - return !dpoi.deleted; -} - -gboolean -poi_view_dialog(GtkWidget *parent, PoiInfo *poi) -{ - GtkTreeIter iter; - static GtkWidget *dialog; - static GtkWidget *table; - static GtkWidget *label; - static GtkWidget *txt_label; - static GtkWidget *txt_lat; - static GtkWidget *txt_lon; - static GtkWidget *cmb_category; - static GtkWidget *txt_desc; - static GtkWidget *btn_delete = NULL; - static GtkWidget *btn_catedit; - static GtkWidget *hbox; - static GtkWidget *txt_scroll; - static GtkTextBuffer *desc_txt; - static GtkTextIter begin, end; - static DeletePOI dpoi = {NULL, NULL, 0}; - static PoiCategoryEditInfo pcedit; - static int last_deg_format = 0; - - printf("%s()\n", __PRETTY_FUNCTION__); - - gint fallback_deg_format = _degformat; - - if(!coord_system_check_lat_lon (poi->lat, poi->lon, &fallback_deg_format)) - { - last_deg_format = _degformat; - _degformat = fallback_deg_format; - - if(dialog != NULL) gtk_widget_destroy(dialog); - dialog = NULL; - } - else if(_degformat != last_deg_format) - { - last_deg_format = _degformat; - - if(dialog != NULL) gtk_widget_destroy(dialog); - dialog = NULL; - } - - if(dialog == NULL) - { dialog = gtk_dialog_new_with_buttons(_("Edit POI"), - GTK_WINDOW(parent), GTK_DIALOG_MODAL, - GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, - NULL); + GTK_WINDOW(parent), GTK_DIALOG_MODAL, + GTK_STOCK_OK, GTK_RESPONSE_ACCEPT, + NULL); gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->action_area), btn_delete = gtk_button_new_with_label(_("Delete..."))); gtk_dialog_add_button(GTK_DIALOG(dialog), GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT); + } - /* Set the lat/lon strings. */ - gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), - table = gtk_table_new(6, 4, FALSE), TRUE, TRUE, 0); + /* Set the lat/lon strings. */ + gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), + table = gtk_table_new(6, 4, FALSE), TRUE, TRUE, 0); - gtk_table_attach(GTK_TABLE(table), - label = gtk_label_new(DEG_FORMAT_ENUM_TEXT[_degformat].short_field_1), - 0, 1, 0, 1, GTK_FILL, 0, 2, 0); - gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f); - gtk_table_attach(GTK_TABLE(table), - txt_lat = gtk_entry_new(), - 1, 2, 0, 1, GTK_FILL, 0, 2, 0); + gtk_table_attach(GTK_TABLE(table), + label = gtk_label_new(DEG_FORMAT_ENUM_TEXT[_degformat] + .short_field_1), + 0, 1, 0, 1, GTK_FILL, 0, 2, 0); + gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f); + gtk_table_attach(GTK_TABLE(table), + txt_lat = gtk_entry_new(), + 1, (DEG_FORMAT_ENUM_TEXT[_degformat].field_2_in_use ? 2 : 4), + 0, 1, GTK_FILL, 0, 2, 0); - if(DEG_FORMAT_ENUM_TEXT[_degformat].field_2_in_use) - { - gtk_table_attach(GTK_TABLE(table), - label = gtk_label_new(DEG_FORMAT_ENUM_TEXT[_degformat].short_field_2), - 2, 3, 0, 1, GTK_FILL, 0, 2, 0); - gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f); - gtk_table_attach(GTK_TABLE(table), - txt_lon = gtk_entry_new(), - 3, 4, 0, 1, GTK_FILL, 0, 2, 0); - } - + if(DEG_FORMAT_ENUM_TEXT[_degformat].field_2_in_use) + { gtk_table_attach(GTK_TABLE(table), - label = gtk_label_new(_("Label")), - 0, 1, 1, 2, GTK_FILL, 0, 2, 0); + label = gtk_label_new(DEG_FORMAT_ENUM_TEXT[_degformat] + .short_field_2), + 2, 3, 0, 1, GTK_FILL, 0, 2, 0); gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f); gtk_table_attach(GTK_TABLE(table), - txt_label = gtk_entry_new(), - 1, 4, 1, 2, GTK_EXPAND | GTK_FILL, 0, 2, 0); + txt_lon = gtk_entry_new(), + 3, 4, 0, 1, GTK_FILL, 0, 2, 0); + } - gtk_table_attach(GTK_TABLE(table), - label = gtk_label_new(_("Category")), - 0, 1, 3, 4, GTK_FILL, 0, 2, 0); - gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f); - gtk_table_attach(GTK_TABLE(table), - hbox = gtk_hbox_new(FALSE, 4), - 1, 4, 3, 4, GTK_EXPAND | GTK_FILL, 0, 2, 0); - gtk_box_pack_start(GTK_BOX(hbox), - cmb_category = poi_create_cat_combo(), - FALSE, FALSE, 0); + gtk_table_attach(GTK_TABLE(table), + label = gtk_label_new(_("Label")), + 0, 1, 1, 2, GTK_FILL, 0, 2, 0); + gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f); + gtk_table_attach(GTK_TABLE(table), + txt_label = gtk_entry_new(), + 1, 4, 1, 2, GTK_EXPAND | GTK_FILL, 0, 2, 0); - gtk_box_pack_start(GTK_BOX(hbox), - btn_catedit = gtk_button_new_with_label( - _("Edit Categories...")), - FALSE, FALSE, 0); + gtk_table_attach(GTK_TABLE(table), + label = gtk_label_new(_("Category")), + 0, 1, 3, 4, GTK_FILL, 0, 2, 0); + gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f); + gtk_table_attach(GTK_TABLE(table), + hbox = gtk_hbox_new(FALSE, 4), + 1, 4, 3, 4, GTK_EXPAND | GTK_FILL, 0, 2, 0); + gtk_box_pack_start(GTK_BOX(hbox), + cmb_category = poi_create_cat_combo(), + FALSE, FALSE, 0); - gtk_table_attach(GTK_TABLE(table), - label = gtk_label_new(_("Description")), - 0, 1, 5, 6, GTK_FILL, GTK_FILL, 2, 0); - gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.0f); + gtk_box_pack_start(GTK_BOX(hbox), + btn_catedit = gtk_button_new_with_label( + _("Edit Categories...")), + FALSE, FALSE, 0); - txt_scroll = gtk_scrolled_window_new(NULL, NULL); - gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(txt_scroll), - GTK_SHADOW_IN); - gtk_table_attach(GTK_TABLE(table), - txt_scroll, - 1, 4, 5, 6, GTK_EXPAND | GTK_FILL, 0, 2, 0); + gtk_table_attach(GTK_TABLE(table), + label = gtk_label_new(_("Description")), + 0, 1, 5, 6, GTK_FILL, GTK_FILL, 2, 0); + gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.0f); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(txt_scroll), - GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + txt_scroll = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(txt_scroll), + GTK_SHADOW_IN); + gtk_table_attach(GTK_TABLE(table), + txt_scroll, + 1, 4, 5, 6, GTK_EXPAND | GTK_FILL, 0, 2, 0); - txt_desc = gtk_text_view_new (); - gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(txt_desc), GTK_WRAP_WORD); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(txt_scroll), + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - gtk_container_add(GTK_CONTAINER(txt_scroll), txt_desc); - gtk_widget_set_size_request(GTK_WIDGET(txt_scroll), 550, 120); + txt_desc = gtk_text_view_new(); + gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(txt_desc), GTK_WRAP_WORD); - desc_txt = gtk_text_view_get_buffer (GTK_TEXT_VIEW (txt_desc)); + gtk_container_add(GTK_CONTAINER(txt_scroll), txt_desc); + gtk_widget_set_size_request(GTK_WIDGET(txt_scroll), 550, 120); - g_signal_connect(G_OBJECT(btn_delete), "clicked", - G_CALLBACK(poi_delete), &dpoi); + desc_txt = gtk_text_view_get_buffer(GTK_TEXT_VIEW (txt_desc)); - g_signal_connect(G_OBJECT(btn_catedit), "clicked", - G_CALLBACK(poi_edit_cat), &pcedit); - } + g_signal_connect(G_OBJECT(btn_catedit), "clicked", + G_CALLBACK(poi_edit_cat), &pcedit); - dpoi.dialog = dialog; - dpoi.txt_label = g_strdup(poi->label); - dpoi.id = poi->poi_id; + dpoi.txt_label = NULL; dpoi.deleted = FALSE; - - /* Lat/Lon */ + if (!is_add_dialog) { - gchar tmp1[LL_FMT_LEN], tmp2[LL_FMT_LEN]; + dpoi.dialog = dialog; + dpoi.txt_label = g_strdup(poi->label); + dpoi.id = poi->poi_id; - format_lat_lon(poi->lat, poi->lon, tmp1, tmp2); - //lat_format(poi->lat, tmp1); - //lon_format(poi->lon, tmp2); + g_signal_connect(G_OBJECT(btn_delete), "clicked", + G_CALLBACK(poi_delete), &dpoi); + } - gtk_entry_set_text(GTK_ENTRY(txt_lat), tmp1); + /* Lat/Lon */ + format_lat_lon(poi->lat, poi->lon, tmp1, tmp2); + //lat_format(poi->lat, tmp1); + //lon_format(poi->lon, tmp2); + + gtk_entry_set_text(GTK_ENTRY(txt_lat), tmp1); - if(DEG_FORMAT_ENUM_TEXT[_degformat].field_2_in_use) - gtk_entry_set_text(GTK_ENTRY(txt_lon), tmp2); - else - gtk_entry_set_text(GTK_ENTRY(txt_lon), g_strdup("")); - } + if(DEG_FORMAT_ENUM_TEXT[_degformat].field_2_in_use) + gtk_entry_set_text(GTK_ENTRY(txt_lon), tmp2); + else + gtk_entry_set_text(GTK_ENTRY(txt_lon), ""); - /* label */ + /* Label */ gtk_entry_set_text(GTK_ENTRY(txt_label), poi->label); - /* poi_desc */ + /* Poi_desc */ gtk_text_buffer_set_text(desc_txt, poi->desc, -1); /* Category. */ gtk_list_store_clear(GTK_LIST_STORE(gtk_combo_box_get_model( GTK_COMBO_BOX(cmb_category)))); if(poi_populate_categories(GTK_LIST_STORE(gtk_combo_box_get_model( - GTK_COMBO_BOX(cmb_category))), poi->cat_id, &iter)) + GTK_COMBO_BOX(cmb_category))), poi->cat_id, &iter)) gtk_combo_box_set_active_iter(GTK_COMBO_BOX(cmb_category), &iter); - /* Connect Signals */ pcedit.dialog = dialog; pcedit.cmb_category = cmb_category; pcedit.cat_id = poi->cat_id; @@ -1592,22 +1322,22 @@ while(GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog))) { - const gchar *text_lat, *text_lon; + GtkTreeIter iter; + const gchar *lat, *lon = NULL; - text_lat = gtk_entry_get_text(GTK_ENTRY(txt_lat)); - text_lon = gtk_entry_get_text(GTK_ENTRY(txt_lon)); - - if(!parse_coords(text_lat, text_lon, &poi->lat, &poi->lon)) + lat = gtk_entry_get_text(GTK_ENTRY(txt_lat)); + if(txt_lon != NULL) + lon = gtk_entry_get_text(GTK_ENTRY(txt_lon)); + + if(!parse_coords(lat, lon, &poi->lat, &poi->lon)) { - popup_error(dialog, _("Invalid coordinate specified")); - continue; + popup_error(dialog, _("Invalid Coordinate specified")); + continue; } - if(strlen(gtk_entry_get_text(GTK_ENTRY(txt_label)))) { - if(poi->label) - g_free(poi->label); + g_free(poi->label); poi->label = g_strdup(gtk_entry_get_text(GTK_ENTRY(txt_label))); } else @@ -1617,62 +1347,80 @@ } if(!gtk_combo_box_get_active_iter( - GTK_COMBO_BOX(cmb_category), &iter)) + GTK_COMBO_BOX(cmb_category), &iter)) { popup_error(dialog, _("Please specify a category.")); continue; } - gtk_text_buffer_get_iter_at_offset(desc_txt, &begin,0 ); - gtk_text_buffer_get_end_iter (desc_txt, &end); - if(poi->desc) - g_free(poi->desc); + gtk_text_buffer_get_iter_at_offset(desc_txt, &begin, 0); + gtk_text_buffer_get_end_iter(desc_txt, &end); + g_free(poi->desc); poi->desc = gtk_text_buffer_get_text(desc_txt, &begin, &end, TRUE); - if(poi->clabel) - g_free(poi->clabel); + g_free(poi->clabel); gtk_tree_model_get( gtk_combo_box_get_model(GTK_COMBO_BOX(cmb_category)), &iter, 0, &poi->cat_id, 1, &poi->clabel, -1); - /* edit poi */ - if(SQLITE_OK != sqlite3_bind_double( - _stmt_update_poi, 1, poi->lat) || - SQLITE_OK != sqlite3_bind_double( - _stmt_update_poi, 2, poi->lon) || - SQLITE_OK != sqlite3_bind_text(_stmt_update_poi, 3, poi->label, - -1, SQLITE_STATIC) || - SQLITE_OK != sqlite3_bind_text(_stmt_update_poi, 4, poi->desc, - -1, SQLITE_STATIC) || - SQLITE_OK != sqlite3_bind_int( - _stmt_update_poi, 5, poi->cat_id) || - SQLITE_OK != sqlite3_bind_int( - _stmt_update_poi, 6, poi->poi_id) || - SQLITE_DONE != sqlite3_step(_stmt_update_poi)) + if (is_add_dialog) { - MACRO_BANNER_SHOW_INFO(parent, _("Error updating POI")); + if(SQLITE_OK != sqlite3_bind_double(_stmt_insert_poi, 1, poi->lat) + || SQLITE_OK != sqlite3_bind_double(_stmt_insert_poi, 2, poi->lon) + || SQLITE_OK != sqlite3_bind_text(_stmt_insert_poi, 3, poi->label, + -1, SQLITE_STATIC) + || SQLITE_OK != sqlite3_bind_text(_stmt_insert_poi, 4, poi->desc, + -1, SQLITE_STATIC) + || SQLITE_OK != sqlite3_bind_int(_stmt_insert_poi, 5, poi->cat_id) + || SQLITE_DONE != sqlite3_step(_stmt_insert_poi)) + { + MACRO_BANNER_SHOW_INFO(parent, _("Error adding POI")); + } + sqlite3_reset(_stmt_insert_poi); } - - sqlite3_reset(_stmt_update_poi); - - /* We're done. */ + else + { + if(SQLITE_OK != sqlite3_bind_double(_stmt_update_poi, 1, poi->lat) + || SQLITE_OK != sqlite3_bind_double(_stmt_update_poi, 2, poi->lon) + || SQLITE_OK != sqlite3_bind_text(_stmt_update_poi, 3, poi->label, + -1, SQLITE_STATIC) + || SQLITE_OK != sqlite3_bind_text(_stmt_update_poi, 4, poi->desc, + -1, SQLITE_STATIC) + || SQLITE_OK != sqlite3_bind_int(_stmt_update_poi, 5, poi->cat_id) + || SQLITE_OK != sqlite3_bind_int(_stmt_update_poi, 6, poi->poi_id) + || SQLITE_DONE != sqlite3_step(_stmt_update_poi)) + { + MACRO_BANNER_SHOW_INFO(parent, _("Error updating POI")); + } + sqlite3_reset(_stmt_update_poi); + } break; } g_free(dpoi.txt_label); - map_force_redraw(); + _degformat = last_deg_format; - gtk_widget_hide(dialog); /* Destroying causes a crash.... ??? */ + gtk_widget_destroy(dialog); - _degformat = last_deg_format; - vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); return !dpoi.deleted; } +gint +poi_get_next_id() +{ + gint id; + if(SQLITE_ROW == sqlite3_step(_stmt_nextlabel_poi)) + id = sqlite3_column_int(_stmt_nextlabel_poi, 0); + else + id = -1; + sqlite3_reset(_stmt_nextlabel_poi); + return id; +} + static gint poi_list_insert(GtkWidget *parent, GList *poi_list, GtkComboBox *cmb_category) { @@ -2014,7 +1762,7 @@ POI_CLABEL, &(poi.clabel), -1); - if(poi_view_dialog(pli->dialog, &poi)) + if(poi_dialog(pli->dialog, &poi, FALSE)) { gtk_list_store_set(store, &iter, POI_POIID, poi.poi_id, @@ -2031,6 +1779,9 @@ /* POI was deleted. */ gtk_list_store_remove(store, &iter); } + g_free(poi.label); + g_free(poi.desc); + g_free(poi.clabel); } vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__); Index: src/poi.h =================================================================== --- src/poi.h (revision 6) +++ src/poi.h (revision 7) @@ -32,12 +32,13 @@ gboolean category_list_dialog(GtkWidget *parent); -gboolean poi_add_dialog(GtkWidget *parent, gint unitx, gint unity); -gboolean poi_view_dialog(GtkWidget *parent, PoiInfo *poi); +gboolean poi_dialog(GtkWidget *parent, PoiInfo *poi, gboolean is_add_dialog); gboolean poi_import_dialog(gint unitx, gint unity); gboolean poi_download_dialog(gint unitx, gint unity); gboolean poi_browse_dialog(gint unitx, gint unity); +gint poi_get_next_id(); + void map_render_poi(void); void poi_destroy(void);