diff --git a/src/ag-chart.c b/src/ag-chart.c index f2619d6..af6d591 100644 --- a/src/ag-chart.c +++ b/src/ag-chart.c @@ -10,6 +10,7 @@ #include #include +#include "ag-db.h" #include "ag-chart.h" typedef struct _AgChartPrivate { @@ -1538,3 +1539,74 @@ const gchar *ag_chart_get_note(AgChart *chart) return priv->note; } +gboolean +ag_chart_save_to_db(AgChart *chart, AgDbSave **old_save, GtkWidget *window) +{ + GsweCoordinates *coords; + AgDb *db = ag_db_get(); + AgChartPrivate *priv = ag_chart_get_instance_private(chart); + AgDbSave *save_data = g_new0(AgDbSave, 1); + GError *err = NULL; + GsweTimestamp *timestamp = gswe_moment_get_timestamp(GSWE_MOMENT(chart)); + GEnumClass *house_system_class; + GEnumValue *house_system_enum; + gboolean ret; + + if (old_save && *old_save) { + save_data->db_id = (*old_save)->db_id; + } else { + save_data->db_id = -1; + } + + save_data->name = g_strdup(priv->name); + save_data->country = g_strdup(priv->country); + save_data->city = g_strdup(priv->city); + coords = gswe_moment_get_coordinates(GSWE_MOMENT(chart)); + save_data->longitude = coords->longitude; + save_data->latitude = coords->latitude; + save_data->altitude = coords->altitude; + g_free(coords); + save_data->year = gswe_timestamp_get_gregorian_year( + timestamp, + NULL + ); + save_data->month = gswe_timestamp_get_gregorian_month( + timestamp, + NULL + ); + save_data->day = gswe_timestamp_get_gregorian_day(timestamp, NULL); + save_data->hour = gswe_timestamp_get_gregorian_hour( + timestamp, + NULL + ); + save_data->minute = gswe_timestamp_get_gregorian_minute( + timestamp, + NULL + ); + save_data->second = gswe_timestamp_get_gregorian_second( + timestamp, + NULL + ); + save_data->timezone = gswe_timestamp_get_gregorian_timezone(timestamp); + house_system_class = g_type_class_ref(GSWE_TYPE_HOUSE_SYSTEM); + house_system_enum = g_enum_get_value( + house_system_class, + gswe_moment_get_house_system(GSWE_MOMENT(chart)) + ); + save_data->house_system = g_strdup(house_system_enum->value_nick); + g_type_class_unref(house_system_class); + save_data->note = g_strdup(priv->note); + + if ( + (!old_save || !*old_save) + || !ag_db_save_identical(*old_save, save_data) + ) { + ret = ag_db_save_chart(db, save_data, window, &err); + } else { + ret = TRUE; + } + + ag_db_save_data_free(save_data); + + return ret; +} diff --git a/src/ag-chart.h b/src/ag-chart.h index ab6ac3e..f17bc8a 100644 --- a/src/ag-chart.h +++ b/src/ag-chart.h @@ -2,6 +2,7 @@ #define __AG_CHART_H__ #include +#include #include #include "ag-db.h" @@ -85,6 +86,10 @@ void ag_chart_set_note(AgChart *chart, const gchar *note); const gchar *ag_chart_get_note(AgChart *chart); +gboolean ag_chart_save_to_db(AgChart *chart, + AgDbSave **old_save, + GtkWidget *window); + #define AG_CHART_ERROR (ag_chart_error_quark()) GQuark ag_chart_error_quark(void); diff --git a/src/ag-window.c b/src/ag-window.c index 2c194c5..b82082c 100644 --- a/src/ag-window.c +++ b/src/ag-window.c @@ -178,30 +178,12 @@ ag_window_save_action(GSimpleAction *action, GVariant *parameter, gpointer user_data) { - gchar *uri; AgWindow *window = AG_WINDOW(user_data); - GError *err = NULL; AgWindowPrivate *priv = ag_window_get_instance_private(window); recalculate_chart(window); - uri = ag_window_get_uri(window); - if (uri != NULL) { - GFile *file = g_file_new_for_uri(uri); - g_free(uri); - - ag_chart_save_to_file(priv->chart, file, &err); - } else { - ag_window_save_as(window, &err); - } - - if (err) { - ag_app_message_dialog( - GTK_WIDGET(window), - GTK_MESSAGE_ERROR, - "%s", err->message - ); - } + ag_chart_save_to_db(priv->chart, &(priv->saved_data), GTK_WIDGET(window)); } static void