From 096111684e791075ba987f926d67b25a0cd4d343 Mon Sep 17 00:00:00 2001 From: "Gergely Polonkai (W00d5t0ck)" Date: Fri, 4 Oct 2013 00:16:55 +0200 Subject: [PATCH 01/25] Updated for SWE-GLib 2.0 API --- configure.ac | 2 +- src/ag-app.c | 7 +++- src/ag-chart.c | 110 +++++++++++++++++++++++++++---------------------- 3 files changed, 67 insertions(+), 52 deletions(-) diff --git a/configure.ac b/configure.ac index 42e52bd..de65e9d 100644 --- a/configure.ac +++ b/configure.ac @@ -33,7 +33,7 @@ PKG_CHECK_MODULES([GTK], [gtk+-3.0 >= 3.8]) PKG_CHECK_MODULES([LIBXML], [libxml-2.0]) PKG_CHECK_MODULES([LIBXSLT], [libexslt]) PKG_CHECK_MODULES([WEBKIT], [webkitgtk-3.0]) -PKG_CHECK_MODULES([SWE_GLIB], [swe-glib]) +PKG_CHECK_MODULES([SWE_GLIB], [swe-glib >= 2.0.0]) LIBGD_INIT([ header-bar diff --git a/src/ag-app.c b/src/ag-app.c index d7299f2..665c207 100644 --- a/src/ag-app.c +++ b/src/ag-app.c @@ -112,7 +112,12 @@ ag_app_open_chart(AgApp *app, GFile *file) GError *err = NULL; gchar *uri; - chart = ag_chart_load_from_file(file, &err); + if ((chart = ag_chart_load_from_file(file, &err)) == NULL) { + g_print("Error: '%s'\n", err->message); + + return; + } + window = ag_app_create_window(app); ag_window_set_chart(AG_WINDOW(window), chart); ag_window_update_from_chart(AG_WINDOW(window)); diff --git a/src/ag-chart.c b/src/ag-chart.c index 2a133c2..fbf35b3 100644 --- a/src/ag-chart.c +++ b/src/ag-chart.c @@ -611,37 +611,37 @@ ag_chart_save_to_file(AgChart *chart, GFile *file, GError **err) gchar * ag_chart_create_svg(AgChart *chart, GError **err) { - xmlDocPtr doc = create_save_doc(chart); - xmlDocPtr xslt_doc; - xmlDocPtr svg_doc; - xmlNodePtr root_node = NULL; - xmlNodePtr ascmcs_node = NULL; - xmlNodePtr houses_node = NULL; - xmlNodePtr bodies_node = NULL; - xmlNodePtr aspects_node = NULL; - xmlNodePtr antiscia_node = NULL; - xmlNodePtr node = NULL; - gchar *value; - gchar *stylesheet_path; - gchar *css_path; - gchar *save_content = NULL; - gchar *css_uri; - gchar *css_final_uri; - gchar **params; - GList *houses; - GList *house; - GList *planet; - GList *aspect; - GList *antiscion; - const GswePlanetData *planet_data; - const GsweAspectData *aspect_data; - GEnumClass *planets_class; - GEnumClass *aspects_class; - GEnumClass *antiscia_class; - gint save_length; - GFile *css_file; - xsltStylesheetPtr xslt_proc; - locale_t current_locale; + xmlDocPtr doc = create_save_doc(chart); + xmlDocPtr xslt_doc; + xmlDocPtr svg_doc; + xmlNodePtr root_node = NULL; + xmlNodePtr ascmcs_node = NULL; + xmlNodePtr houses_node = NULL; + xmlNodePtr bodies_node = NULL; + xmlNodePtr aspects_node = NULL; + xmlNodePtr antiscia_node = NULL; + xmlNodePtr node = NULL; + gchar *value; + gchar *stylesheet_path; + gchar *css_path; + gchar *save_content = NULL; + gchar *css_uri; + gchar *css_final_uri; + gchar **params; + GList *houses; + GList *house; + GList *planet; + GList *aspect; + GList *antiscion; + GswePlanetData *planet_data; + GsweAspectData *aspect_data; + GEnumClass *planets_class; + GEnumClass *aspects_class; + GEnumClass *antiscia_class; + gint save_length; + GFile *css_file; + xsltStylesheetPtr xslt_proc; + locale_t current_locale; root_node = xmlDocGetRootElement(doc); @@ -654,9 +654,9 @@ ag_chart_create_svg(AgChart *chart, GError **err) node = xmlNewChild(ascmcs_node, NULL, BAD_CAST "ascendant", NULL); - planet_data = gswe_moment_get_planet(GSWE_MOMENT(chart), GSWE_PLANET_ASCENDENT, NULL); + planet_data = gswe_moment_get_planet(GSWE_MOMENT(chart), GSWE_PLANET_ASCENDANT, NULL); value = g_malloc0(12); - g_ascii_dtostr(value, 12, planet_data->position); + g_ascii_dtostr(value, 12, gswe_planet_data_get_position(planet_data)); xmlNewProp(node, BAD_CAST "degree_ut", BAD_CAST value); g_free(value); @@ -664,7 +664,7 @@ ag_chart_create_svg(AgChart *chart, GError **err) planet_data = gswe_moment_get_planet(GSWE_MOMENT(chart), GSWE_PLANET_MC, NULL); value = g_malloc0(12); - g_ascii_dtostr(value, 12, planet_data->position); + g_ascii_dtostr(value, 12, gswe_planet_data_get_position(planet_data)); xmlNewProp(node, BAD_CAST "degree_ut", BAD_CAST value); g_free(value); @@ -672,7 +672,7 @@ ag_chart_create_svg(AgChart *chart, GError **err) planet_data = gswe_moment_get_planet(GSWE_MOMENT(chart), GSWE_PLANET_VERTEX, NULL); value = g_malloc0(12); - g_ascii_dtostr(value, 12, planet_data->position); + g_ascii_dtostr(value, 12, gswe_planet_data_get_position(planet_data)); xmlNewProp(node, BAD_CAST "degree_ut", BAD_CAST value); g_free(value); @@ -686,12 +686,12 @@ ag_chart_create_svg(AgChart *chart, GError **err) node = xmlNewChild(houses_node, NULL, BAD_CAST "house", NULL); value = g_malloc0(3); - g_ascii_dtostr(value, 3, house_data->house); + g_ascii_dtostr(value, 3, gswe_house_data_get_house(house_data)); xmlNewProp(node, BAD_CAST "number", BAD_CAST value); g_free(value); value = g_malloc0(12); - g_ascii_dtostr(value, 12, house_data->cusp_position); + g_ascii_dtostr(value, 12, gswe_house_data_get_cusp_position(house_data)); xmlNewProp(node, BAD_CAST "degree", BAD_CAST value); g_free(value); } @@ -707,20 +707,20 @@ ag_chart_create_svg(AgChart *chart, GError **err) GEnumValue *enum_value; if ( - (planet_data->planet_id == GSWE_PLANET_ASCENDENT) || - (planet_data->planet_id == GSWE_PLANET_MC) || - (planet_data->planet_id == GSWE_PLANET_VERTEX) + (gswe_planet_data_get_planet(planet_data) == GSWE_PLANET_ASCENDANT) || + (gswe_planet_data_get_planet(planet_data) == GSWE_PLANET_MC) || + (gswe_planet_data_get_planet(planet_data) == GSWE_PLANET_VERTEX) ) { continue; } node = xmlNewChild(bodies_node, NULL, BAD_CAST "body", NULL); - enum_value = g_enum_get_value(G_ENUM_CLASS(planets_class), planet_data->planet_id); + enum_value = g_enum_get_value(G_ENUM_CLASS(planets_class), gswe_planet_data_get_planet(planet_data)); xmlNewProp(node, BAD_CAST "name", BAD_CAST enum_value->value_name); value = g_malloc0(12); - g_ascii_dtostr(value, 12, planet_data->position); + g_ascii_dtostr(value, 12, gswe_planet_data_get_position(planet_data)); xmlNewProp(node, BAD_CAST "degree", BAD_CAST value); g_free(value); } @@ -732,22 +732,27 @@ ag_chart_create_svg(AgChart *chart, GError **err) aspects_class = g_type_class_ref(GSWE_TYPE_ASPECT); for (aspect = gswe_moment_get_all_aspects(GSWE_MOMENT(chart)); aspect; aspect = g_list_next(aspect)) { + GswePlanetData *planet_data; GEnumValue *enum_value; aspect_data = aspect->data; - if (aspect_data->aspect == GSWE_ASPECT_NONE) { + if (gswe_aspect_data_get_aspect(aspect_data) == GSWE_ASPECT_NONE) { continue; } node = xmlNewChild(aspects_node, NULL, BAD_CAST "aspect", NULL); - enum_value = g_enum_get_value(G_ENUM_CLASS(planets_class), aspect_data->planet1->planet_id); + planet_data = gswe_aspect_data_get_planet1(aspect_data); + enum_value = g_enum_get_value(G_ENUM_CLASS(planets_class), gswe_planet_data_get_planet(planet_data)); xmlNewProp(node, BAD_CAST "body1", BAD_CAST enum_value->value_name); + gswe_planet_data_unref(planet_data); - enum_value = g_enum_get_value(G_ENUM_CLASS(planets_class), aspect_data->planet2->planet_id); + planet_data = gswe_aspect_data_get_planet2(aspect_data); + enum_value = g_enum_get_value(G_ENUM_CLASS(planets_class), gswe_planet_data_get_planet(planet_data)); xmlNewProp(node, BAD_CAST "body2", BAD_CAST enum_value->value_name); + gswe_planet_data_unref(planet_data); - enum_value = g_enum_get_value(G_ENUM_CLASS(aspects_class), aspect_data->aspect); + enum_value = g_enum_get_value(G_ENUM_CLASS(aspects_class), gswe_aspect_data_get_aspect(aspect_data)); xmlNewProp(node, BAD_CAST "type", BAD_CAST enum_value->value_name); } @@ -759,22 +764,27 @@ ag_chart_create_svg(AgChart *chart, GError **err) antiscia_class = g_type_class_ref(GSWE_TYPE_ANTISCION_AXIS); for (antiscion = gswe_moment_get_all_antiscia(GSWE_MOMENT(chart)); antiscion; antiscion = g_list_next(antiscion)) { + GswePlanetData *planet_data; GsweAntiscionData *antiscion_data = antiscion->data; GEnumValue *enum_value; - if (antiscion_data->axis == GSWE_ANTISCION_AXIS_NONE) { + if (gswe_antiscion_data_get_axis(antiscion_data) == GSWE_ANTISCION_AXIS_NONE) { continue; } node = xmlNewChild(antiscia_node, NULL, BAD_CAST "antiscia", NULL); - enum_value = g_enum_get_value(G_ENUM_CLASS(planets_class), antiscion_data->planet1->planet_id); + planet_data = gswe_antiscion_data_get_planet1(antiscion_data); + enum_value = g_enum_get_value(G_ENUM_CLASS(planets_class), gswe_planet_data_get_planet(planet_data)); xmlNewProp(node, BAD_CAST "body1", BAD_CAST enum_value->value_name); + gswe_planet_data_unref(planet_data); - enum_value = g_enum_get_value(G_ENUM_CLASS(planets_class), antiscion_data->planet2->planet_id); + planet_data = gswe_antiscion_data_get_planet2(antiscion_data); + enum_value = g_enum_get_value(G_ENUM_CLASS(planets_class), gswe_planet_data_get_planet(planet_data)); xmlNewProp(node, BAD_CAST "body2", BAD_CAST enum_value->value_name); + gswe_planet_data_unref(planet_data); - enum_value = g_enum_get_value(G_ENUM_CLASS(antiscia_class), antiscion_data->axis); + enum_value = g_enum_get_value(G_ENUM_CLASS(antiscia_class), gswe_antiscion_data_get_axis(antiscion_data)); xmlNewProp(node, BAD_CAST "axis", BAD_CAST enum_value->value_name); } From f7e4c451b40ee29c7c6fec178da89eeabb8a2a4f Mon Sep 17 00:00:00 2001 From: Gergely Polonkai Date: Sat, 5 Oct 2013 03:23:38 +0200 Subject: [PATCH 02/25] Make get_by_xpath() string return value a maybe-string --- src/ag-chart.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/ag-chart.c b/src/ag-chart.c index fbf35b3..7bb7c1f 100644 --- a/src/ag-chart.c +++ b/src/ag-chart.c @@ -293,7 +293,7 @@ get_by_xpath(xmlXPathContextPtr xpath_context, const gchar *uri, const gchar *xp switch (type) { case XML_CONVERT_STRING: - ret = g_variant_new_string(text); + ret = g_variant_new("ms", text); break; @@ -334,9 +334,10 @@ ag_chart_load_from_file(GFile *file, GError **err) AgChart *chart = NULL; gchar *uri; gchar *xml = NULL; + gchar *name; gchar *country_name; gchar *city_name; - guint length; + gsize length; xmlDocPtr doc; xmlXPathContextPtr xpath_context; GVariant *chart_name; @@ -477,8 +478,10 @@ ag_chart_load_from_file(GFile *file, GError **err) g_variant_unref(latitude); g_variant_unref(altitude); - ag_chart_set_name(chart, g_variant_get_string(chart_name, NULL)); + g_variant_get(chart_name, "ms", &name); g_variant_unref(chart_name); + ag_chart_set_name(chart, name); + g_free(name); g_variant_get(country, "ms", &country_name); g_variant_unref(country); From aa339f5863f16b052fab796e065a23685034fe4c Mon Sep 17 00:00:00 2001 From: Gergely Polonkai Date: Tue, 25 Feb 2014 22:32:54 +0100 Subject: [PATCH 03/25] Remove references and calls to libgd in favour of Gtk 3.10 calls --- .gitmodules | 3 --- Makefile.am | 2 +- autogen.sh | 3 --- configure.ac | 7 ------- libgd | 1 - src/Makefile.am | 4 ++-- src/ag-window.c | 34 ++++++++++++++++------------------ src/astrognome.c | 4 ++-- 8 files changed, 21 insertions(+), 37 deletions(-) delete mode 160000 libgd diff --git a/.gitmodules b/.gitmodules index bfd964e..e69de29 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +0,0 @@ -[submodule "libgd"] - path = libgd - url = git://git.gnome.org/libgd diff --git a/Makefile.am b/Makefile.am index 28a1ae9..3583957 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,5 +1,5 @@ ACLOCAL_AMFLAGS = -I m4 -SUBDIRS = libgd src po data help +SUBDIRS = src po data help EXTRA_DIST = config.rpath ChangeLog diff --git a/autogen.sh b/autogen.sh index 542315b..d88fb6f 100755 --- a/autogen.sh +++ b/autogen.sh @@ -5,7 +5,6 @@ srcdir=`dirname $0` test -z "$srcdir" && srcdir=. PKG_NAME="astrognome" -ACLOCAL_FLAGS="-I libgd $ACLOCAL_FLAGS" (test -f $srcdir/configure.ac \ && test -f $srcdir/src/astrognome.c) || { @@ -19,7 +18,5 @@ which gnome-autogen.sh || { exit 1 } -git submodule update --init --recursive - REQUIRED_AUTOMAKE_VERSION=1.9 . gnome-autogen.sh diff --git a/configure.ac b/configure.ac index de65e9d..10558e6 100644 --- a/configure.ac +++ b/configure.ac @@ -35,15 +35,8 @@ PKG_CHECK_MODULES([LIBXSLT], [libexslt]) PKG_CHECK_MODULES([WEBKIT], [webkitgtk-3.0]) PKG_CHECK_MODULES([SWE_GLIB], [swe-glib >= 2.0.0]) -LIBGD_INIT([ - header-bar - stack - static -]) - AC_CONFIG_FILES([ Makefile - libgd/Makefile src/Makefile help/Makefile po/Makefile.in diff --git a/libgd b/libgd deleted file mode 160000 index 62f9b8b..0000000 --- a/libgd +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 62f9b8b92599b38d986bd26d5780edd400d318c9 diff --git a/src/Makefile.am b/src/Makefile.am index 91dcdc2..7f0e672 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -28,9 +28,9 @@ AM_CPPFLAGS = -DG_LOG_DOMAIN=\"Astrognome\" -DLOCALEDIR=\"$(localedir)\" -DPKGDA bin_PROGRAMS = astrognome astrognome_SOURCES = $(astrognome_source_files) $(BUILT_SOURCES) -astrognome_LDADD = $(SWE_GLIB_LIBS) $(GTK_LIBS) $(LIBXML_LIBS) $(LIBXSLT_LIBS) $(WEBKIT_LIBS) $(top_builddir)/libgd/libgd.la +astrognome_LDADD = $(SWE_GLIB_LIBS) $(GTK_LIBS) $(LIBXML_LIBS) $(LIBXSLT_LIBS) $(WEBKIT_LIBS) astrognome_LDFLAGS = -rdynamic -astrognome_CFLAGS = $(SWE_GLIB_CFLAGS) $(CFLAGS) $(GTK_CFLAGS) $(LIBXML_CFLAGS) $(LIBXSLT_CFLAGS) $(WEBKIT_CFLAGS) -Wall -I$(top_srcdir)/libgd +astrognome_CFLAGS = $(SWE_GLIB_CFLAGS) $(CFLAGS) $(GTK_CFLAGS) $(LIBXML_CFLAGS) $(LIBXSLT_CFLAGS) $(WEBKIT_CFLAGS) -Wall guidir = $(pkgdatadir) gui_DATA = astrognome.ui diff --git a/src/ag-window.c b/src/ag-window.c index 4880cfa..9f079c7 100644 --- a/src/ag-window.c +++ b/src/ag-window.c @@ -1,6 +1,5 @@ #include #include -#include #include #include #include @@ -254,9 +253,9 @@ recalculate_chart(AgWindow *window) } static void -tab_changed_cb(GdStack *stack, GParamSpec *pspec, AgWindow *window) +tab_changed_cb(GtkStack *stack, GParamSpec *pspec, AgWindow *window) { - const gchar *active_tab_name = gd_stack_get_visible_child_name(stack); + const gchar *active_tab_name = gtk_stack_get_visible_child_name(stack); GtkWidget *active_tab; g_debug("Active tab changed: %s", active_tab_name); @@ -265,7 +264,7 @@ tab_changed_cb(GdStack *stack, GParamSpec *pspec, AgWindow *window) return; } - active_tab = gd_stack_get_visible_child(stack); + active_tab = gtk_stack_get_visible_child(stack); if (strcmp("chart", active_tab_name) == 0) { gtk_widget_set_size_request(active_tab, 600, 600); @@ -285,7 +284,7 @@ ag_window_change_tab_action(GSimpleAction *action, GVariant *parameter, gpointer AgWindow *window = user_data; const gchar *target_tab = g_variant_get_string(parameter, NULL); - gd_stack_set_visible_child_name(GD_STACK(window->priv->stack), target_tab); + gtk_stack_set_visible_child_name(GTK_STACK(window->priv->stack), target_tab); g_action_change_state(G_ACTION(action), parameter); } @@ -460,34 +459,33 @@ window_populate(AgWindow *window) GtkWidget *scroll; GObject *menu; - priv->header_bar = gd_header_bar_new(); + priv->header_bar = gtk_header_bar_new(); gtk_widget_set_hexpand(priv->header_bar, TRUE); - menu_button = gd_header_menu_button_new(); - gd_header_button_set_symbolic_icon_name(GD_HEADER_BUTTON(menu_button), "emblem-system-symbolic"); + menu_button = gtk_menu_button_new(); gtk_actionable_set_action_name(GTK_ACTIONABLE(menu_button), "win.gear-menu"); - gd_header_bar_pack_end(GD_HEADER_BAR(priv->header_bar), menu_button); + gtk_header_bar_pack_end(GTK_HEADER_BAR(priv->header_bar), menu_button); gtk_grid_attach(GTK_GRID(priv->grid), priv->header_bar, 0, 0, 1, 1); menu = gtk_builder_get_object(priv->builder, "window-menu"); gtk_menu_button_set_menu_model(GTK_MENU_BUTTON(menu_button), G_MENU_MODEL(menu)); - priv->stack = gd_stack_new(); + priv->stack = gtk_stack_new(); gtk_widget_set_hexpand(priv->stack, TRUE); gtk_widget_set_vexpand(priv->stack, TRUE); gtk_grid_attach(GTK_GRID(priv->grid), priv->stack, 0, 1, 1, 1); g_signal_connect(priv->stack, "notify::visible-child", G_CALLBACK(tab_changed_cb), window); - priv->stack_switcher = gd_stack_switcher_new(); - gd_stack_switcher_set_stack(GD_STACK_SWITCHER(priv->stack_switcher), GD_STACK(priv->stack)); + priv->stack_switcher = gtk_stack_switcher_new(); + gtk_stack_switcher_set_stack(GTK_STACK_SWITCHER(priv->stack_switcher), GTK_STACK(priv->stack)); priv->tab_edit = notebook_edit(window); - gd_stack_add_titled(GD_STACK(priv->stack), priv->tab_edit, "edit", _("Edit")); + gtk_stack_add_titled(GTK_STACK(priv->stack), priv->tab_edit, "edit", _("Edit")); scroll = gtk_scrolled_window_new(NULL, NULL); g_object_set(scroll, "shadow-type", GTK_SHADOW_IN, NULL); - gd_stack_add_titled(GD_STACK(priv->stack), scroll, "chart", _("Chart")); + gtk_stack_add_titled(GTK_STACK(priv->stack), scroll, "chart", _("Chart")); priv->tab_chart = webkit_web_view_new(); g_signal_connect(priv->tab_chart, "context-menu", G_CALLBACK(ag_window_chart_context_cb), NULL); @@ -496,16 +494,16 @@ window_populate(AgWindow *window) gtk_widget_set_size_request(priv->tab_chart, 600, 600); priv->tab_aspects = gtk_label_new("PLACEHOLDER FOR THE ASPECTS TABLE"); - gd_stack_add_titled(GD_STACK(priv->stack), priv->tab_aspects, "aspects", _("Aspects")); + gtk_stack_add_titled(GTK_STACK(priv->stack), priv->tab_aspects, "aspects", _("Aspects")); priv->tab_points = gtk_label_new("PLACEHOLDER FOR THE POINTS TABLES"); - gd_stack_add_titled(GD_STACK(priv->stack), priv->tab_points, "points", _("Points")); + gtk_stack_add_titled(GTK_STACK(priv->stack), priv->tab_points, "points", _("Points")); /* TODO: change to the Chart tab if we are opening an existing chart! */ - gd_stack_set_visible_child_name(GD_STACK(priv->stack), "edit"); + gtk_stack_set_visible_child_name(GTK_STACK(priv->stack), "edit"); priv->current_tab = priv->tab_edit; - gd_header_bar_set_custom_title(GD_HEADER_BAR(priv->header_bar), priv->stack_switcher); + gtk_header_bar_set_custom_title(GTK_HEADER_BAR(priv->header_bar), priv->stack_switcher); gtk_widget_show_all(priv->grid); } diff --git a/src/astrognome.c b/src/astrognome.c index 6154c0a..44be5ee 100644 --- a/src/astrognome.c +++ b/src/astrognome.c @@ -8,10 +8,10 @@ #include #include -#include - #include +#include "config.h" + #include "ag-app.h" #include "ag-window.h" From dda57dff57ffc65cc82f5b1de8f452e82ed02a0a Mon Sep 17 00:00:00 2001 From: Gergely Polonkai Date: Sun, 9 Mar 2014 00:24:47 +0100 Subject: [PATCH 04/25] Fix typo in chart XSL --- data/chart.xsl | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/data/chart.xsl b/data/chart.xsl index 108b415..3a15447 100644 --- a/data/chart.xsl +++ b/data/chart.xsl @@ -523,7 +523,7 @@ - + @@ -597,7 +597,7 @@ - + @@ -618,7 +618,7 @@ - + @@ -650,7 +650,7 @@ - + @@ -671,7 +671,7 @@ - + From 3105ae299856f5ed7e45ab740adf7292048b56c9 Mon Sep 17 00:00:00 2001 From: Gergely Polonkai Date: Sun, 30 Mar 2014 09:31:53 +0200 Subject: [PATCH 05/25] Update README.md with some up-to-date information --- README.md | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 514b4f4..6993dc3 100644 --- a/README.md +++ b/README.md @@ -43,13 +43,9 @@ Astrognome was originally created by Jean-André Santoni, and was hosted on [Goo ## Hacking -The project is currently hosted on [GitHub](https://github.com/gergelypolonkai/astrognome). Just fork the repo, make your changes and issue a pull request. Don't like GitHub? That's fine with me; in this case, clone the repo, and send your changes, and send me your modifications at gergely@polonkai.eu as a git-bundle or a patch (in this latter case, you should also mention which commit is your base). +The project is currently hosted on [GitHub](https://github.com/gergelypolonkai/astrognome). Just fork the repo, make your changes and issue a pull request. Don’t like GitHub? That’s fine with me; in this case, clone the repo, and send your changes, and send me your modifications at gergely@polonkai.eu as a git-bundle or a patch (in this latter case, you should also mention which commit is your base). -The entire project is written in C, utilizing GTK+ (3.8 currently, but the final version may come only with 3.10) and SWE-GLib (which is used for the calculations part). +The entire project is written in C, utilizing GTK+ 3.10 (or anything later in the 3.x series) and SWE-GLib 2.0 (which is used for the calculations part). I’m testing my code under Fedora, so even testers from other distributions are welcome! Astrognome follows a well-defined coding style. If you contribute, please follow that by looking at existing sources, or use [Uncrustify](http://uncrustify.sourceforge.net/) with the config file under docs/. The only thing it messes up currently is the alignment of object type #definitions. -## !!!WARNING!!! -------------- - -The code is a bit messy yet, and displays calculated data only in a textual form. Graphics will be added later. From 306584ff702fabe4213d044424f33c04781d87ee Mon Sep 17 00:00:00 2001 From: Gergely Polonkai Date: Sun, 30 Mar 2014 09:32:49 +0200 Subject: [PATCH 06/25] Remove unnecessary gswe_planet_data_unref() calls This introduced an ugly bug when changing from the Edit tab to Chart view for the second time. --- src/ag-chart.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/ag-chart.c b/src/ag-chart.c index 7bb7c1f..6c14b01 100644 --- a/src/ag-chart.c +++ b/src/ag-chart.c @@ -748,12 +748,10 @@ ag_chart_create_svg(AgChart *chart, GError **err) planet_data = gswe_aspect_data_get_planet1(aspect_data); enum_value = g_enum_get_value(G_ENUM_CLASS(planets_class), gswe_planet_data_get_planet(planet_data)); xmlNewProp(node, BAD_CAST "body1", BAD_CAST enum_value->value_name); - gswe_planet_data_unref(planet_data); planet_data = gswe_aspect_data_get_planet2(aspect_data); enum_value = g_enum_get_value(G_ENUM_CLASS(planets_class), gswe_planet_data_get_planet(planet_data)); xmlNewProp(node, BAD_CAST "body2", BAD_CAST enum_value->value_name); - gswe_planet_data_unref(planet_data); enum_value = g_enum_get_value(G_ENUM_CLASS(aspects_class), gswe_aspect_data_get_aspect(aspect_data)); xmlNewProp(node, BAD_CAST "type", BAD_CAST enum_value->value_name); @@ -780,12 +778,10 @@ ag_chart_create_svg(AgChart *chart, GError **err) planet_data = gswe_antiscion_data_get_planet1(antiscion_data); enum_value = g_enum_get_value(G_ENUM_CLASS(planets_class), gswe_planet_data_get_planet(planet_data)); xmlNewProp(node, BAD_CAST "body1", BAD_CAST enum_value->value_name); - gswe_planet_data_unref(planet_data); planet_data = gswe_antiscion_data_get_planet2(antiscion_data); enum_value = g_enum_get_value(G_ENUM_CLASS(planets_class), gswe_planet_data_get_planet(planet_data)); xmlNewProp(node, BAD_CAST "body2", BAD_CAST enum_value->value_name); - gswe_planet_data_unref(planet_data); enum_value = g_enum_get_value(G_ENUM_CLASS(antiscia_class), gswe_antiscion_data_get_axis(antiscion_data)); xmlNewProp(node, BAD_CAST "axis", BAD_CAST enum_value->value_name); From 8b25c69251375e6ea01c9fb83665e9dcb0601627 Mon Sep 17 00:00:00 2001 From: Gergely Polonkai Date: Sun, 30 Mar 2014 09:34:04 +0200 Subject: [PATCH 07/25] Add .a files to .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 3c780ef..af8b61f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ .deps/ .libs/ *~ +*.a *.o *.lo *.la From 84528f29709572825c83ab29c889cdfe78fbbcc0 Mon Sep 17 00:00:00 2001 From: Gergely Polonkai Date: Sun, 30 Mar 2014 09:34:41 +0200 Subject: [PATCH 08/25] Move ag_window_redraw_chart() to a more appropriate place --- src/ag-window.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ag-window.c b/src/ag-window.c index 9f079c7..f61320a 100644 --- a/src/ag-window.c +++ b/src/ag-window.c @@ -243,13 +243,13 @@ recalculate_chart(AgWindow *window) // TODO: make house system configurable window->priv->chart = ag_chart_new_full(timestamp, longitude, latitude, 380.0, GSWE_HOUSE_SYSTEM_PLACIDUS); g_signal_connect(window->priv->chart, "changed", G_CALLBACK(chart_changed), window); + ag_window_redraw_chart(window); } else { timestamp = gswe_moment_get_timestamp(GSWE_MOMENT(window->priv->chart)); gswe_timestamp_set_gregorian_full(timestamp, year, month, day, hour, minute, second, 0, 1.0, NULL); } ag_chart_set_name(window->priv->chart, gtk_entry_get_text(GTK_ENTRY(window->priv->name))); - ag_window_redraw_chart(window); } static void @@ -270,6 +270,7 @@ tab_changed_cb(GtkStack *stack, GParamSpec *pspec, AgWindow *window) gtk_widget_set_size_request(active_tab, 600, 600); } + // If we are coming from the Edit tab, let’s assume the chart data has changed // Note that priv->current_tab is actually the previously selected tab, not the real active one! if (window->priv->current_tab == window->priv->tab_edit) { recalculate_chart(window); From 847e1c419e24c43c49a9b7886eaa66da922a1dff Mon Sep 17 00:00:00 2001 From: Gergely Polonkai Date: Sun, 30 Mar 2014 09:47:21 +0200 Subject: [PATCH 09/25] Change deprecated GTK stock items to actual values --- po/hu.po | 13 +++++++++++++ src/ag-app.c | 4 ++-- src/ag-window.c | 4 ++-- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/po/hu.po b/po/hu.po index 9f2c9a6..86d8cf7 100644 --- a/po/hu.po +++ b/po/hu.po @@ -46,6 +46,15 @@ msgstr "Asztrológiai szoftver a GNOME-hoz" msgid "Astrognome Website" msgstr "Astrognome weboldal" +#: ../src/ag-app.c:139 +#: ../src/ag-window.c:105 +msgid "_Cancel" +msgstr "_Mégsem" + +#: ../src/ag-app.c:140 +msgid "_Open" +msgstr "M_egnyitás" + #: ../src/ag-app.c:131 msgid "Select charts" msgstr "Válasszon ki mentett képleteket" @@ -54,6 +63,10 @@ msgstr "Válasszon ki mentett képleteket" msgid "Save Chart" msgstr "Képlet mentése" +#: ../src/ag-window.c:105 +msgid "_Save" +msgstr "M_entés" + #: ../src/ag-window.c:363 msgid "Name" msgstr "Név" diff --git a/src/ag-app.c b/src/ag-app.c index 665c207..1384176 100644 --- a/src/ag-app.c +++ b/src/ag-app.c @@ -136,8 +136,8 @@ open_cb(GSimpleAction *action, GVariant *parameter, gpointer user_data) fs = gtk_file_chooser_dialog_new(_("Select charts"), NULL, GTK_FILE_CHOOSER_ACTION_OPEN, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, + _("_Cancel"), GTK_RESPONSE_CANCEL, + _("_Open"), GTK_RESPONSE_ACCEPT, NULL); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(fs), filter_all); gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(fs), filter_chart); diff --git a/src/ag-window.c b/src/ag-window.c index f61320a..2cf8e61 100644 --- a/src/ag-window.c +++ b/src/ag-window.c @@ -102,8 +102,8 @@ ag_window_save_as(AgWindow *window, GError **err) fs = gtk_file_chooser_dialog_new(_("Save Chart"), GTK_WINDOW(window), GTK_FILE_CHOOSER_ACTION_SAVE, - GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, - GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, + _("_Cancel"), GTK_RESPONSE_CANCEL, + _("_Save"), GTK_RESPONSE_ACCEPT, NULL); gtk_dialog_set_default_response(GTK_DIALOG(fs), GTK_RESPONSE_ACCEPT); gtk_file_chooser_set_local_only(GTK_FILE_CHOOSER(fs), FALSE); From a4f1b17a7613f52b82c9e4a11b159bdf35b5ba2e Mon Sep 17 00:00:00 2001 From: Gergely Polonkai Date: Sun, 30 Mar 2014 11:33:48 +0200 Subject: [PATCH 10/25] Add message dialogs to indicate save errors --- src/ag-window.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/ag-window.c b/src/ag-window.c index 2cf8e61..8c6e053 100644 --- a/src/ag-window.c +++ b/src/ag-window.c @@ -82,6 +82,11 @@ ag_window_save_as(AgWindow *window, GError **err) // We should never enter here, but who knows... if (window->priv->chart == NULL) { + GtkWidget *dialog; + + dialog = gtk_message_dialog_new(GTK_WINDOW(window), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("Chart cannot be calculated.")); + gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); g_set_error(err, AG_WINDOW_ERROR, AG_WINDOW_ERROR_EMPTY_CHART, "Chart is empty"); return; @@ -90,7 +95,13 @@ ag_window_save_as(AgWindow *window, GError **err) name = ag_chart_get_name(window->priv->chart); if ((name == NULL) || (*name == 0)) { + GtkWidget *dialog; + g_free(name); + + dialog = gtk_message_dialog_new(GTK_WINDOW(window), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("You must enter a name before saving a chart.")); + gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); g_set_error(err, AG_WINDOW_ERROR, AG_WINDOW_ERROR_NO_NAME, "No name specified"); return; From 83782a92ff287eb97b8cebcc54c163177bdbddfe Mon Sep 17 00:00:00 2001 From: Gergely Polonkai Date: Sun, 30 Mar 2014 16:51:45 +0200 Subject: [PATCH 11/25] Set southern latitude/western longitude if saved chart has negative values Fix #16 --- src/ag-window.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/ag-window.c b/src/ag-window.c index 8c6e053..71376e8 100644 --- a/src/ag-window.c +++ b/src/ag-window.c @@ -1,3 +1,4 @@ +#include #include #include #include @@ -199,8 +200,18 @@ ag_window_update_from_chart(AgWindow *window) gtk_spin_button_set_value(GTK_SPIN_BUTTON(window->priv->hour), gswe_timestamp_get_gregorian_hour(timestamp, NULL)); gtk_spin_button_set_value(GTK_SPIN_BUTTON(window->priv->minute), gswe_timestamp_get_gregorian_minute(timestamp, NULL)); gtk_spin_button_set_value(GTK_SPIN_BUTTON(window->priv->second), gswe_timestamp_get_gregorian_second(timestamp, NULL)); - gtk_spin_button_set_value(GTK_SPIN_BUTTON(window->priv->longitude), coordinates->longitude); - gtk_spin_button_set_value(GTK_SPIN_BUTTON(window->priv->latitude), coordinates->latitude); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(window->priv->longitude), fabs(coordinates->longitude)); + + if (coordinates->longitude < 0.0) { + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->priv->west_long), TRUE); + } + + gtk_spin_button_set_value(GTK_SPIN_BUTTON(window->priv->latitude), fabs(coordinates->latitude)); + + if (coordinates->latitude < 0.0) { + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(window->priv->south_lat), TRUE); + } + gtk_entry_set_text(GTK_ENTRY(window->priv->name), ag_chart_get_name(window->priv->chart)); g_free(coordinates); From d648a140343993cbaf227dd6583dcef07199be08 Mon Sep 17 00:00:00 2001 From: Gergely Polonkai Date: Sun, 30 Mar 2014 17:31:43 +0200 Subject: [PATCH 12/25] Update po file for Hungarian translation --- po/hu.po | 57 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 28 insertions(+), 29 deletions(-) diff --git a/po/hu.po b/po/hu.po index 86d8cf7..5b85968 100644 --- a/po/hu.po +++ b/po/hu.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: astrognome master\n" "Report-Msgid-Bugs-To: gergely@polonkai.eu\n" -"POT-Creation-Date: 2013-09-21 22:17+0200\n" +"POT-Creation-Date: 2014-03-30 17:25+0200\n" "PO-Revision-Date: 2013-09-21 20:17+0200\n" "Last-Translator: Gergely Polonkai \n" "Language-Team: Hungarian \n" @@ -18,7 +18,7 @@ msgstr "" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. i18n: Please don't translate "Astrognome" (it's marked as translatable for transliteration only -#: ../data/astrognome.desktop.in.in.h:1 ../src/ag-app.c:85 ../src/ag-app.c:273 +#: ../data/astrognome.desktop.in.in.h:1 ../src/ag-app.c:85 ../src/ag-app.c:312 msgid "Astrognome" msgstr "Astrognome" @@ -46,8 +46,11 @@ msgstr "Asztrológiai szoftver a GNOME-hoz" msgid "Astrognome Website" msgstr "Astrognome weboldal" -#: ../src/ag-app.c:139 -#: ../src/ag-window.c:105 +#: ../src/ag-app.c:136 +msgid "Select charts" +msgstr "Válasszon ki mentett képleteket" + +#: ../src/ag-app.c:139 ../src/ag-window.c:118 msgid "_Cancel" msgstr "_Mégsem" @@ -55,91 +58,87 @@ msgstr "_Mégsem" msgid "_Open" msgstr "M_egnyitás" -#: ../src/ag-app.c:131 -msgid "Select charts" -msgstr "Válasszon ki mentett képleteket" - -#: ../src/ag-window.c:103 +#: ../src/ag-window.c:115 msgid "Save Chart" msgstr "Képlet mentése" -#: ../src/ag-window.c:105 +#: ../src/ag-window.c:119 msgid "_Save" msgstr "M_entés" -#: ../src/ag-window.c:363 +#: ../src/ag-window.c:386 msgid "Name" msgstr "Név" -#: ../src/ag-window.c:369 +#: ../src/ag-window.c:392 msgid "Country" msgstr "Ország" -#: ../src/ag-window.c:372 +#: ../src/ag-window.c:395 msgid "City" msgstr "Város" -#: ../src/ag-window.c:375 +#: ../src/ag-window.c:398 msgid "Latitude" msgstr "Szélességi fok" -#: ../src/ag-window.c:378 +#: ../src/ag-window.c:401 msgid "North" msgstr "Észak" -#: ../src/ag-window.c:381 +#: ../src/ag-window.c:404 msgid "South" msgstr "Dél" -#: ../src/ag-window.c:388 +#: ../src/ag-window.c:411 msgid "Longitude" msgstr "Hosszúsági fok" -#: ../src/ag-window.c:391 +#: ../src/ag-window.c:414 msgid "East" msgstr "Kelet" -#: ../src/ag-window.c:394 +#: ../src/ag-window.c:417 msgid "West" msgstr "Nyugat" -#: ../src/ag-window.c:401 +#: ../src/ag-window.c:424 msgid "Year" msgstr "Év" -#: ../src/ag-window.c:409 +#: ../src/ag-window.c:432 msgid "Month" msgstr "Hónap" -#: ../src/ag-window.c:416 +#: ../src/ag-window.c:439 msgid "Day" msgstr "Nap" -#: ../src/ag-window.c:423 +#: ../src/ag-window.c:446 msgid "Hour" msgstr "Óra" -#: ../src/ag-window.c:430 +#: ../src/ag-window.c:453 msgid "Minute" msgstr "Perc" -#: ../src/ag-window.c:437 +#: ../src/ag-window.c:460 msgid "Second" msgstr "Másodperc" -#: ../src/ag-window.c:480 +#: ../src/ag-window.c:516 msgid "Edit" msgstr "Szerkesztés" -#: ../src/ag-window.c:484 +#: ../src/ag-window.c:520 msgid "Chart" msgstr "Képlet" -#: ../src/ag-window.c:492 +#: ../src/ag-window.c:529 msgid "Aspects" msgstr "Fényszögek" -#: ../src/ag-window.c:495 +#: ../src/ag-window.c:532 msgid "Points" msgstr "Pont-táblázatok" From d6a4a8e004327351360ad8145af8be8a521a7e3b Mon Sep 17 00:00:00 2001 From: Gergely Polonkai Date: Sun, 30 Mar 2014 17:32:55 +0200 Subject: [PATCH 13/25] Add Hungarian translation for new error messages --- po/hu.po | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/po/hu.po b/po/hu.po index 5b85968..6b854bd 100644 --- a/po/hu.po +++ b/po/hu.po @@ -58,6 +58,14 @@ msgstr "_Mégsem" msgid "_Open" msgstr "M_egnyitás" +#: ../src/ag-window.c:89 +msgid "Chart cannot be calculated." +msgstr "" + +#: ../src/ag-window.c:104 +msgid "You must enter a name before saving a chart." +msgstr "" + #: ../src/ag-window.c:115 msgid "Save Chart" msgstr "Képlet mentése" From 85fb8be73be832ec6ba567306d371db30b8d8068 Mon Sep 17 00:00:00 2001 From: Gergely Polonkai Date: Sun, 30 Mar 2014 17:41:11 +0200 Subject: [PATCH 14/25] Add timezone control to edit tab Fix #15 --- po/hu.po | 4 ++++ src/ag-window.c | 10 ++++++++++ 2 files changed, 14 insertions(+) diff --git a/po/hu.po b/po/hu.po index 6b854bd..2baf811 100644 --- a/po/hu.po +++ b/po/hu.po @@ -134,6 +134,10 @@ msgstr "Perc" msgid "Second" msgstr "Másodperc" +#: ../src/ag-window.c:467 +msgid "Timezone" +msgstr "" + #: ../src/ag-window.c:516 msgid "Edit" msgstr "Szerkesztés" diff --git a/src/ag-window.c b/src/ag-window.c index 71376e8..fee60f6 100644 --- a/src/ag-window.c +++ b/src/ag-window.c @@ -30,6 +30,7 @@ struct _AgWindowPrivate { GtkWidget *hour; GtkWidget *minute; GtkWidget *second; + GtkWidget *timezone; GtkBuilder *builder; GtkWidget *tab_chart; @@ -200,6 +201,7 @@ ag_window_update_from_chart(AgWindow *window) gtk_spin_button_set_value(GTK_SPIN_BUTTON(window->priv->hour), gswe_timestamp_get_gregorian_hour(timestamp, NULL)); gtk_spin_button_set_value(GTK_SPIN_BUTTON(window->priv->minute), gswe_timestamp_get_gregorian_minute(timestamp, NULL)); gtk_spin_button_set_value(GTK_SPIN_BUTTON(window->priv->second), gswe_timestamp_get_gregorian_second(timestamp, NULL)); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(window->priv->timezone), gswe_timestamp_get_gregorian_timezone(timestamp)); gtk_spin_button_set_value(GTK_SPIN_BUTTON(window->priv->longitude), fabs(coordinates->longitude)); if (coordinates->longitude < 0.0) { @@ -463,6 +465,14 @@ notebook_edit(AgWindow *window) gtk_spin_button_set_digits(GTK_SPIN_BUTTON(priv->second), 0); gtk_grid_attach(GTK_GRID(grid), priv->second, 6, 4, 1, 1); + label = gtk_label_new(_("Timezone")); + gtk_grid_attach(GTK_GRID(grid), label, 4, 5, 1, 1); + + priv->timezone = gtk_spin_button_new_with_range(-12.0, 12.0, 1.0); + gtk_spin_button_set_digits(GTK_SPIN_BUTTON(priv->timezone), 1); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(priv->timezone), 0.0); + gtk_grid_attach(GTK_GRID(grid), priv->timezone, 5, 5, 1, 1); + gtk_widget_show_all(grid); return grid; From cc7aed38c190a4e6d91be7c5954611d208c8dbe2 Mon Sep 17 00:00:00 2001 From: Gergely Polonkai Date: Sun, 30 Mar 2014 17:52:57 +0200 Subject: [PATCH 15/25] Add GTK message dialogs instead of g_warning() calls. This is to enhance UX. Fix #9 --- src/ag-app.c | 6 +++++- src/ag-window.c | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/ag-app.c b/src/ag-app.c index 1384176..0581cd0 100644 --- a/src/ag-app.c +++ b/src/ag-app.c @@ -201,7 +201,11 @@ show_help(const gchar *topic, GtkWindow *parent) } if (!gtk_show_uri(screen, uri, gtk_get_current_event_time(), &err)) { - g_warning("Unable to display help: %s", err->message); + GtkWidget *dialog; + + dialog = gtk_message_dialog_new(parent, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, "Unable to display help: %s", err->message); + gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); } g_free(uri); diff --git a/src/ag-window.c b/src/ag-window.c index fee60f6..28c69a5 100644 --- a/src/ag-window.c +++ b/src/ag-window.c @@ -179,7 +179,11 @@ ag_window_redraw_chart(AgWindow *window) svg_content = ag_chart_create_svg(window->priv->chart, &err); if (svg_content == NULL) { - g_warning("%s", err->message); + GtkWidget *dialog; + + dialog = gtk_message_dialog_new(GTK_WINDOW(window), 0, GTK_MESSAGE_WARNING, GTK_BUTTONS_OK, "Unable to draw chart: %s", err->message); + gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); } else { webkit_web_view_load_string(WEBKIT_WEB_VIEW(window->priv->tab_chart), svg_content, "image/svg+xml", "UTF-8", "file://"); g_free(svg_content); From f6e3f9e03368221a67f9f9039d484f6ff8d60da5 Mon Sep 17 00:00:00 2001 From: Gergely Polonkai Date: Fri, 27 Jun 2014 16:51:56 +0200 Subject: [PATCH 16/25] Change ag_chart_create_svg() to return the length of the SVG document This is needed later for SVG export --- src/ag-chart.c | 6 +++++- src/ag-chart.h | 1 + src/ag-window.c | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/ag-chart.c b/src/ag-chart.c index 6c14b01..e2c2dd0 100644 --- a/src/ag-chart.c +++ b/src/ag-chart.c @@ -612,7 +612,7 @@ ag_chart_save_to_file(AgChart *chart, GFile *file, GError **err) } gchar * -ag_chart_create_svg(AgChart *chart, GError **err) +ag_chart_create_svg(AgChart *chart, gsize *length, GError **err) { xmlDocPtr doc = create_save_doc(chart); xmlDocPtr xslt_doc; @@ -851,6 +851,10 @@ ag_chart_create_svg(AgChart *chart, GError **err) xmlDocDumpFormatMemoryEnc(svg_doc, (xmlChar **)&save_content, &save_length, "UTF-8", 1); xmlFreeDoc(svg_doc); + if (length != NULL) { + *length = save_length; + } + return save_content; } diff --git a/src/ag-chart.h b/src/ag-chart.h index 1399644..9724b56 100644 --- a/src/ag-chart.h +++ b/src/ag-chart.h @@ -53,6 +53,7 @@ void ag_chart_set_city(AgChart *chart, const gchar *city); gchar *ag_chart_get_city(AgChart *chart); gchar *ag_chart_create_svg(AgChart *chart, + gsize *length, GError **err); #define AG_CHART_ERROR (ag_chart_error_quark()) diff --git a/src/ag-window.c b/src/ag-window.c index 28c69a5..0f8c0b6 100644 --- a/src/ag-window.c +++ b/src/ag-window.c @@ -176,7 +176,7 @@ ag_window_redraw_chart(AgWindow *window) GError *err = NULL; gchar *svg_content; - svg_content = ag_chart_create_svg(window->priv->chart, &err); + svg_content = ag_chart_create_svg(window->priv->chart, NULL, &err); if (svg_content == NULL) { GtkWidget *dialog; From c34ba055bc1a9c6264186be295ee045c4b4c0ce6 Mon Sep 17 00:00:00 2001 From: Gergely Polonkai Date: Fri, 27 Jun 2014 16:52:52 +0200 Subject: [PATCH 17/25] Add SVG export functionality --- src/ag-chart.c | 12 ++++++++ src/ag-chart.h | 4 +++ src/ag-window.c | 76 +++++++++++++++++++++++++++++++++++++++++++++++ src/astrognome.ui | 6 ++++ 4 files changed, 98 insertions(+) diff --git a/src/ag-chart.c b/src/ag-chart.c index e2c2dd0..4d98478 100644 --- a/src/ag-chart.c +++ b/src/ag-chart.c @@ -858,3 +858,15 @@ ag_chart_create_svg(AgChart *chart, gsize *length, GError **err) return save_content; } +void +ag_chart_export_svg_to_file(AgChart *chart, GFile *file, GError **err) +{ + gchar *svg; + gsize length; + + if ((svg = ag_chart_create_svg(chart, &length, err)) == NULL) { + return; + } + + g_file_replace_contents(file, (const gchar *)svg, length, NULL, FALSE, G_FILE_CREATE_NONE, NULL, NULL, err); +} diff --git a/src/ag-chart.h b/src/ag-chart.h index 9724b56..758474f 100644 --- a/src/ag-chart.h +++ b/src/ag-chart.h @@ -43,6 +43,10 @@ void ag_chart_save_to_file(AgChart *chart, GFile *file, GError **err); +void ag_chart_export_svg_to_file(AgChart *chart, + GFile *file, + GError **err); + void ag_chart_set_name(AgChart *chart, const gchar *name); gchar *ag_chart_get_name(AgChart *chart); diff --git a/src/ag-window.c b/src/ag-window.c index 0f8c0b6..71a1d23 100644 --- a/src/ag-window.c +++ b/src/ag-window.c @@ -170,6 +170,81 @@ ag_window_save_as_action(GSimpleAction *action, GVariant *parameter, gpointer us // TODO: Check err! } +static void +ag_window_export_svg(AgWindow *window, GError **err) +{ + gchar *name; + gchar *file_name; + GtkWidget *fs; + gint response; + + recalculate_chart(window); + + // We should never enter here, but who knows... + if (window->priv->chart == NULL) { + GtkWidget *dialog; + + dialog = gtk_message_dialog_new(GTK_WINDOW(window), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("Chart cannot be calculated.")); + gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); + g_set_error(err, AG_WINDOW_ERROR, AG_WINDOW_ERROR_EMPTY_CHART, "Chart is empty"); + + return; + } + + name = ag_chart_get_name(window->priv->chart); + + if ((name == NULL) || (*name == 0)) { + GtkWidget *dialog; + + g_free(name); + + dialog = gtk_message_dialog_new(GTK_WINDOW(window), GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("You must enter a name before saving a chart.")); + gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_destroy(dialog); + g_set_error(err, AG_WINDOW_ERROR, AG_WINDOW_ERROR_NO_NAME, "No name specified"); + + return; + } + + file_name = g_strdup_printf("%s.svg", name); + g_free(name); + + fs = gtk_file_chooser_dialog_new(_("Export Chart as SVG"), + GTK_WINDOW(window), + GTK_FILE_CHOOSER_ACTION_SAVE, + _("_Cancel"), GTK_RESPONSE_CANCEL, + _("_Save"), GTK_RESPONSE_ACCEPT, + NULL); + gtk_dialog_set_default_response(GTK_DIALOG(fs), GTK_RESPONSE_ACCEPT); + gtk_file_chooser_set_local_only(GTK_FILE_CHOOSER(fs), FALSE); + gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(fs), TRUE); + gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(fs), file_name); + g_free(file_name); + + response = gtk_dialog_run(GTK_DIALOG(fs)); + gtk_widget_hide(fs); + + if (response == GTK_RESPONSE_ACCEPT) { + GFile *file = gtk_file_chooser_get_file(GTK_FILE_CHOOSER(fs)); + + ag_chart_export_svg_to_file(window->priv->chart, file, err); + } + + gtk_widget_destroy(fs); +} + +static void +ag_window_export_svg_action(GSimpleAction *action, GVariant *parameter, gpointer user_data) +{ + AgWindow *window = AG_WINDOW(user_data); + GError *err = NULL; + + ag_window_export_svg(window, &err); + + // TODO: Check err! +} + void ag_window_redraw_chart(AgWindow *window) { @@ -321,6 +396,7 @@ static GActionEntry win_entries[] = { { "close", ag_window_close_action, NULL, NULL, NULL }, { "save", ag_window_save_action, NULL, NULL, NULL }, { "save-as", ag_window_save_as_action, NULL, NULL, NULL }, + { "export-svg", ag_window_export_svg_action, NULL, NULL, NULL }, { "gear-menu", ag_window_gear_menu_action, NULL, "false", NULL }, { "change-tab", ag_window_change_tab_action, "s", "'edit'", NULL }, }; diff --git a/src/astrognome.ui b/src/astrognome.ui index e23ec2e..2989172 100644 --- a/src/astrognome.ui +++ b/src/astrognome.ui @@ -46,6 +46,12 @@ <Primary><Shift>s +
+ + Export as SVG + win.export-svg + +
Close From 172518f47206bd71126e979b8941219a882e940d Mon Sep 17 00:00:00 2001 From: Gergely Polonkai Date: Tue, 24 Jun 2014 09:38:49 +0200 Subject: [PATCH 18/25] Uncrustified sources --- src/ag-chart.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/ag-chart.c b/src/ag-chart.c index 4d98478..89e39af 100644 --- a/src/ag-chart.c +++ b/src/ag-chart.c @@ -736,7 +736,8 @@ ag_chart_create_svg(AgChart *chart, gsize *length, GError **err) for (aspect = gswe_moment_get_all_aspects(GSWE_MOMENT(chart)); aspect; aspect = g_list_next(aspect)) { GswePlanetData *planet_data; - GEnumValue *enum_value; + GEnumValue *enum_value; + aspect_data = aspect->data; if (gswe_aspect_data_get_aspect(aspect_data) == GSWE_ASPECT_NONE) { @@ -746,11 +747,11 @@ ag_chart_create_svg(AgChart *chart, gsize *length, GError **err) node = xmlNewChild(aspects_node, NULL, BAD_CAST "aspect", NULL); planet_data = gswe_aspect_data_get_planet1(aspect_data); - enum_value = g_enum_get_value(G_ENUM_CLASS(planets_class), gswe_planet_data_get_planet(planet_data)); + enum_value = g_enum_get_value(G_ENUM_CLASS(planets_class), gswe_planet_data_get_planet(planet_data)); xmlNewProp(node, BAD_CAST "body1", BAD_CAST enum_value->value_name); planet_data = gswe_aspect_data_get_planet2(aspect_data); - enum_value = g_enum_get_value(G_ENUM_CLASS(planets_class), gswe_planet_data_get_planet(planet_data)); + enum_value = g_enum_get_value(G_ENUM_CLASS(planets_class), gswe_planet_data_get_planet(planet_data)); xmlNewProp(node, BAD_CAST "body2", BAD_CAST enum_value->value_name); enum_value = g_enum_get_value(G_ENUM_CLASS(aspects_class), gswe_aspect_data_get_aspect(aspect_data)); @@ -765,7 +766,7 @@ ag_chart_create_svg(AgChart *chart, gsize *length, GError **err) antiscia_class = g_type_class_ref(GSWE_TYPE_ANTISCION_AXIS); for (antiscion = gswe_moment_get_all_antiscia(GSWE_MOMENT(chart)); antiscion; antiscion = g_list_next(antiscion)) { - GswePlanetData *planet_data; + GswePlanetData *planet_data; GsweAntiscionData *antiscion_data = antiscion->data; GEnumValue *enum_value; @@ -776,11 +777,11 @@ ag_chart_create_svg(AgChart *chart, gsize *length, GError **err) node = xmlNewChild(antiscia_node, NULL, BAD_CAST "antiscia", NULL); planet_data = gswe_antiscion_data_get_planet1(antiscion_data); - enum_value = g_enum_get_value(G_ENUM_CLASS(planets_class), gswe_planet_data_get_planet(planet_data)); + enum_value = g_enum_get_value(G_ENUM_CLASS(planets_class), gswe_planet_data_get_planet(planet_data)); xmlNewProp(node, BAD_CAST "body1", BAD_CAST enum_value->value_name); planet_data = gswe_antiscion_data_get_planet2(antiscion_data); - enum_value = g_enum_get_value(G_ENUM_CLASS(planets_class), gswe_planet_data_get_planet(planet_data)); + enum_value = g_enum_get_value(G_ENUM_CLASS(planets_class), gswe_planet_data_get_planet(planet_data)); xmlNewProp(node, BAD_CAST "body2", BAD_CAST enum_value->value_name); enum_value = g_enum_get_value(G_ENUM_CLASS(antiscia_class), gswe_antiscion_data_get_axis(antiscion_data)); From f744cb0150e21028616ae387d9c96d3939b8a216 Mon Sep 17 00:00:00 2001 From: Gergely Polonkai Date: Sun, 29 Jun 2014 16:53:52 +0200 Subject: [PATCH 19/25] Upgrade GLib dependency to 2.38 --- configure.ac | 2 +- src/ag-app.c | 3 --- src/ag-app.h | 2 -- src/ag-chart.c | 7 ++----- src/ag-settings.c | 9 +++------ src/ag-window.c | 7 ++----- 6 files changed, 8 insertions(+), 22 deletions(-) diff --git a/configure.ac b/configure.ac index 10558e6..ada3c9d 100644 --- a/configure.ac +++ b/configure.ac @@ -27,7 +27,7 @@ GTK_DOC_CHECK([1.19], [--flavour no-tmpl]) PKG_PROG_PKG_CONFIG GLIB_GSETTINGS AC_PATH_PROG([GLIB_MKENUMS], [glib-mkenums]) -PKG_CHECK_MODULES([GLIB], [glib-2.0 >= 2.30]) +PKG_CHECK_MODULES([GLIB], [glib-2.0 >= 2.38]) PKG_CHECK_MODULES([GOBJECT], [gobject-2.0]) PKG_CHECK_MODULES([GTK], [gtk+-3.0 >= 3.8]) PKG_CHECK_MODULES([LIBXML], [libxml-2.0]) diff --git a/src/ag-app.c b/src/ag-app.c index 0581cd0..b010f4d 100644 --- a/src/ag-app.c +++ b/src/ag-app.c @@ -5,9 +5,6 @@ #include "config.h" #include "astrognome.h" -struct _AgAppPrivate { -}; - G_DEFINE_TYPE(AgApp, ag_app, GTK_TYPE_APPLICATION); GtkWindow * diff --git a/src/ag-app.h b/src/ag-app.h index 15590b3..c5f363d 100644 --- a/src/ag-app.h +++ b/src/ag-app.h @@ -16,11 +16,9 @@ G_BEGIN_DECLS typedef struct _AgApp AgApp; typedef struct _AgAppClass AgAppClass; -typedef struct _AgAppPrivate AgAppPrivate; struct _AgApp { GtkApplication parent_instance; - AgAppPrivate *priv; }; struct _AgAppClass { diff --git a/src/ag-chart.c b/src/ag-chart.c index 89e39af..08227a2 100644 --- a/src/ag-chart.c +++ b/src/ag-chart.c @@ -33,9 +33,8 @@ typedef enum { G_DEFINE_QUARK(ag_chart_error_quark, ag_chart_error); -G_DEFINE_TYPE(AgChart, ag_chart, GSWE_TYPE_MOMENT); +G_DEFINE_TYPE_WITH_PRIVATE(AgChart, ag_chart, GSWE_TYPE_MOMENT); -#define GET_PRIVATE(instance) (G_TYPE_INSTANCE_GET_PRIVATE((instance), AG_TYPE_CHART, AgChartPrivate)) #define ag_g_variant_unref(v) \ if ((v) != NULL) { \ g_variant_unref((v)); \ @@ -56,8 +55,6 @@ ag_chart_class_init(AgChartClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); - g_type_class_add_private(klass, sizeof(AgChartPrivate)); - gobject_class->set_property = ag_chart_set_property; gobject_class->get_property = ag_chart_get_property; gobject_class->finalize = ag_chart_finalize; @@ -70,7 +67,7 @@ ag_chart_class_init(AgChartClass *klass) static void ag_chart_init(AgChart *chart) { - chart->priv = GET_PRIVATE(chart); + chart->priv = ag_chart_get_instance_private(chart); chart->priv->name = NULL; chart->priv->country = NULL; chart->priv->city = NULL; diff --git a/src/ag-settings.c b/src/ag-settings.c index 4873d23..b19f281 100644 --- a/src/ag-settings.c +++ b/src/ag-settings.c @@ -1,9 +1,5 @@ #include "ag-settings.h" -G_DEFINE_TYPE(AgSettings, ag_settings, G_TYPE_OBJECT); - -#define AG_SETTINGS_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), AG_TYPE_SETTINGS, AgSettingsPrivate)) - #define SETTINGS_SCHEMA_ID_WINDOW "eu.polonkai.gergely.Astrognome.state.window" #define SETTINGS_SCHEMA_ID_CHART "eu.polonkai.gergely.Astrognome.state.chart" @@ -14,10 +10,12 @@ struct _AgSettingsPrivate { GSettings *settings_chart; }; +G_DEFINE_TYPE_WITH_PRIVATE(AgSettings, ag_settings, G_TYPE_OBJECT); + static void ag_settings_init(AgSettings *settings) { - settings->priv = AG_SETTINGS_GET_PRIVATE(settings); + settings->priv = ag_settings_get_instance_private(settings); settings->priv->settings_window = g_settings_new(SETTINGS_SCHEMA_ID_WINDOW); settings->priv->settings_chart = g_settings_new(SETTINGS_SCHEMA_ID_CHART); } @@ -45,7 +43,6 @@ ag_settings_class_init(AgSettingsClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); - g_type_class_add_private(gobject_class, sizeof(AgSettingsPrivate)); gobject_class->dispose = ag_settings_dispose; gobject_class->finalize = ag_settings_finalize; } diff --git a/src/ag-window.c b/src/ag-window.c index 71a1d23..8d9ee81 100644 --- a/src/ag-window.c +++ b/src/ag-window.c @@ -46,9 +46,7 @@ struct _AgWindowPrivate { G_DEFINE_QUARK(ag_window_error_quark, ag_window_error); -G_DEFINE_TYPE(AgWindow, ag_window, GTK_TYPE_APPLICATION_WINDOW); - -#define GET_PRIVATE(instance) (G_TYPE_INSTANCE_GET_PRIVATE((instance), AG_TYPE_WINDOW, AgWindowPrivate)) +G_DEFINE_TYPE_WITH_PRIVATE(AgWindow, ag_window, GTK_TYPE_APPLICATION_WINDOW); static void recalculate_chart(AgWindow *window); @@ -408,7 +406,7 @@ ag_window_init(AgWindow *window) GtkAccelGroup *accel_group; GError *err = NULL; - window->priv = priv = GET_PRIVATE(window); + window->priv = priv = ag_window_get_instance_private(window); priv->chart = NULL; priv->uri = NULL; @@ -451,7 +449,6 @@ ag_window_class_init(AgWindowClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS(klass); - g_type_class_add_private(klass, sizeof(AgWindowPrivate)); gobject_class->dispose = ag_window_dispose; } From 170fca314a72ef4e9e91f169a234365d0d7cca72 Mon Sep 17 00:00:00 2001 From: Gergely Polonkai Date: Mon, 30 Jun 2014 11:23:49 +0200 Subject: [PATCH 20/25] Add some remark about a translatable string --- src/ag-window.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ag-window.c b/src/ag-window.c index 8d9ee81..90c4716 100644 --- a/src/ag-window.c +++ b/src/ag-window.c @@ -600,6 +600,7 @@ window_populate(AgWindow *window) priv->tab_chart = webkit_web_view_new(); g_signal_connect(priv->tab_chart, "context-menu", G_CALLBACK(ag_window_chart_context_cb), NULL); gtk_container_add(GTK_CONTAINER(scroll), priv->tab_chart); + // TODO: Although this is never shown to the user, it should be translatable! webkit_web_view_load_string(WEBKIT_WEB_VIEW(priv->tab_chart), "No Chart

No Chart

No chart is loaded. Create one on the edit view, or open one from the application menu!

", "text/html", "UTF-8", NULL); gtk_widget_set_size_request(priv->tab_chart, 600, 600); From 8f51a27292c9f65f7a37ab8465d60b025a26088c Mon Sep 17 00:00:00 2001 From: Gergely Polonkai Date: Mon, 30 Jun 2014 14:13:35 +0200 Subject: [PATCH 21/25] Add Anjuta project related files to .gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index af8b61f..2859ab9 100644 --- a/.gitignore +++ b/.gitignore @@ -74,6 +74,9 @@ Makefile.in /help/*/*.page !/help/C/*.page +/.anjuta* +/*.anjuta + #Documentation related files /docs/reference/*/*.args /docs/reference/*/*.hierarchy From 259302a7c2628aae505ffcffedc419e30cefa5f3 Mon Sep 17 00:00:00 2001 From: Gergely Polonkai Date: Sun, 15 Jun 2014 10:02:01 +0200 Subject: [PATCH 22/25] Update note in tab_changed_cb() --- src/ag-window.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/ag-window.c b/src/ag-window.c index 90c4716..3343691 100644 --- a/src/ag-window.c +++ b/src/ag-window.c @@ -371,8 +371,12 @@ tab_changed_cb(GtkStack *stack, GParamSpec *pspec, AgWindow *window) gtk_widget_set_size_request(active_tab, 600, 600); } - // If we are coming from the Edit tab, let’s assume the chart data has changed - // Note that priv->current_tab is actually the previously selected tab, not the real active one! + // If we are coming from the Edit tab, let’s assume the chart data has + // changed. This is a bad idea, though, it should be checked instead! + // (TODO) + + // Note that priv->current_tab is actually the previously selected tab, not + // the real active one! if (window->priv->current_tab == window->priv->tab_edit) { recalculate_chart(window); } From a6a5eff641b5e8c3ba0f1a2551f298f94a41aef0 Mon Sep 17 00:00:00 2001 From: Gergely Polonkai Date: Tue, 24 Jun 2014 09:40:48 +0200 Subject: [PATCH 23/25] Add function ag_chart_add_planets() to add all known planets to the chart This is required for a readable aspect table --- src/ag-chart.c | 77 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 76 insertions(+), 1 deletion(-) diff --git a/src/ag-chart.c b/src/ag-chart.c index 08227a2..46f7902 100644 --- a/src/ag-chart.c +++ b/src/ag-chart.c @@ -16,6 +16,7 @@ struct _AgChartPrivate { gchar *country; gchar *city; gchar *save_buffer; + GList *planet_list; }; enum { @@ -72,6 +73,7 @@ ag_chart_init(AgChart *chart) chart->priv->country = NULL; chart->priv->city = NULL; chart->priv->save_buffer = NULL; + chart->priv->planet_list = NULL; } static void @@ -139,6 +141,79 @@ ag_chart_finalize(GObject *gobject) } } +void +ag_chart_add_planets(AgChart *chart) +{ + gswe_moment_add_planet(GSWE_MOMENT(chart), GSWE_PLANET_CHARIKLO, NULL); + chart->priv->planet_list = g_list_prepend(chart->priv->planet_list, GINT_TO_POINTER(GSWE_PLANET_CHARIKLO)); + + gswe_moment_add_planet(GSWE_MOMENT(chart), GSWE_PLANET_VESTA, NULL); + chart->priv->planet_list = g_list_prepend(chart->priv->planet_list, GINT_TO_POINTER(GSWE_PLANET_VESTA)); + + gswe_moment_add_planet(GSWE_MOMENT(chart), GSWE_PLANET_JUNO, NULL); + chart->priv->planet_list = g_list_prepend(chart->priv->planet_list, GINT_TO_POINTER(GSWE_PLANET_JUNO)); + + gswe_moment_add_planet(GSWE_MOMENT(chart), GSWE_PLANET_PALLAS, NULL); + chart->priv->planet_list = g_list_prepend(chart->priv->planet_list, GINT_TO_POINTER(GSWE_PLANET_PALLAS)); + + gswe_moment_add_planet(GSWE_MOMENT(chart), GSWE_PLANET_CERES, NULL); + chart->priv->planet_list = g_list_prepend(chart->priv->planet_list, GINT_TO_POINTER(GSWE_PLANET_CERES)); + + gswe_moment_add_planet(GSWE_MOMENT(chart), GSWE_PLANET_NESSUS, NULL); + chart->priv->planet_list = g_list_prepend(chart->priv->planet_list, GINT_TO_POINTER(GSWE_PLANET_NESSUS)); + + gswe_moment_add_planet(GSWE_MOMENT(chart), GSWE_PLANET_PHOLUS, NULL); + chart->priv->planet_list = g_list_prepend(chart->priv->planet_list, GINT_TO_POINTER(GSWE_PLANET_PHOLUS)); + + gswe_moment_add_planet(GSWE_MOMENT(chart), GSWE_PLANET_CHIRON, NULL); + chart->priv->planet_list = g_list_prepend(chart->priv->planet_list, GINT_TO_POINTER(GSWE_PLANET_CHIRON)); + + gswe_moment_add_planet(GSWE_MOMENT(chart), GSWE_PLANET_MOON_APOGEE, NULL); + chart->priv->planet_list = g_list_prepend(chart->priv->planet_list, GINT_TO_POINTER(GSWE_PLANET_MOON_APOGEE)); + + gswe_moment_add_planet(GSWE_MOMENT(chart), GSWE_PLANET_MOON_NODE, NULL); + chart->priv->planet_list = g_list_prepend(chart->priv->planet_list, GINT_TO_POINTER(GSWE_PLANET_MOON_NODE)); + + gswe_moment_add_planet(GSWE_MOMENT(chart), GSWE_PLANET_PLUTO, NULL); + chart->priv->planet_list = g_list_prepend(chart->priv->planet_list, GINT_TO_POINTER(GSWE_PLANET_PLUTO)); + + gswe_moment_add_planet(GSWE_MOMENT(chart), GSWE_PLANET_NEPTUNE, NULL); + chart->priv->planet_list = g_list_prepend(chart->priv->planet_list, GINT_TO_POINTER(GSWE_PLANET_NEPTUNE)); + + gswe_moment_add_planet(GSWE_MOMENT(chart), GSWE_PLANET_URANUS, NULL); + chart->priv->planet_list = g_list_prepend(chart->priv->planet_list, GINT_TO_POINTER(GSWE_PLANET_URANUS)); + + gswe_moment_add_planet(GSWE_MOMENT(chart), GSWE_PLANET_SATURN, NULL); + chart->priv->planet_list = g_list_prepend(chart->priv->planet_list, GINT_TO_POINTER(GSWE_PLANET_SATURN)); + + gswe_moment_add_planet(GSWE_MOMENT(chart), GSWE_PLANET_JUPITER, NULL); + chart->priv->planet_list = g_list_prepend(chart->priv->planet_list, GINT_TO_POINTER(GSWE_PLANET_JUPITER)); + + gswe_moment_add_planet(GSWE_MOMENT(chart), GSWE_PLANET_MARS, NULL); + chart->priv->planet_list = g_list_prepend(chart->priv->planet_list, GINT_TO_POINTER(GSWE_PLANET_MARS)); + + gswe_moment_add_planet(GSWE_MOMENT(chart), GSWE_PLANET_VENUS, NULL); + chart->priv->planet_list = g_list_prepend(chart->priv->planet_list, GINT_TO_POINTER(GSWE_PLANET_VENUS)); + + gswe_moment_add_planet(GSWE_MOMENT(chart), GSWE_PLANET_MERCURY, NULL); + chart->priv->planet_list = g_list_prepend(chart->priv->planet_list, GINT_TO_POINTER(GSWE_PLANET_MERCURY)); + + gswe_moment_add_planet(GSWE_MOMENT(chart), GSWE_PLANET_MOON, NULL); + chart->priv->planet_list = g_list_prepend(chart->priv->planet_list, GINT_TO_POINTER(GSWE_PLANET_MOON)); + + gswe_moment_add_planet(GSWE_MOMENT(chart), GSWE_PLANET_SUN, NULL); + chart->priv->planet_list = g_list_prepend(chart->priv->planet_list, GINT_TO_POINTER(GSWE_PLANET_SUN)); + + gswe_moment_add_planet(GSWE_MOMENT(chart), GSWE_PLANET_VERTEX, NULL); + chart->priv->planet_list = g_list_prepend(chart->priv->planet_list, GINT_TO_POINTER(GSWE_PLANET_VERTEX)); + + gswe_moment_add_planet(GSWE_MOMENT(chart), GSWE_PLANET_ASCENDANT, NULL); + chart->priv->planet_list = g_list_prepend(chart->priv->planet_list, GINT_TO_POINTER(GSWE_PLANET_ASCENDANT)); + + gswe_moment_add_planet(GSWE_MOMENT(chart), GSWE_PLANET_MC, NULL); + chart->priv->planet_list = g_list_prepend(chart->priv->planet_list, GINT_TO_POINTER(GSWE_PLANET_MC)); +} + AgChart * ag_chart_new_full(GsweTimestamp *timestamp, gdouble longitude, gdouble latitude, gdouble altitude, GsweHouseSystem house_system) { @@ -157,7 +232,7 @@ ag_chart_new_full(GsweTimestamp *timestamp, gdouble longitude, gdouble latitude, g_free(coords); - gswe_moment_add_all_planets(GSWE_MOMENT(chart)); + ag_chart_add_planets(chart); return chart; } From 70d38a379da84d9e2202d8e6e497d84b7a32bebc Mon Sep 17 00:00:00 2001 From: Gergely Polonkai Date: Sun, 15 Jun 2014 10:00:07 +0200 Subject: [PATCH 24/25] Add function ag_chart_get_planets() --- src/ag-chart.c | 6 ++++++ src/ag-chart.h | 1 + 2 files changed, 7 insertions(+) diff --git a/src/ag-chart.c b/src/ag-chart.c index 46f7902..0cf0a2e 100644 --- a/src/ag-chart.c +++ b/src/ag-chart.c @@ -931,6 +931,12 @@ ag_chart_create_svg(AgChart *chart, gsize *length, GError **err) return save_content; } +GList * +ag_chart_get_planets(AgChart *chart) +{ + return chart->priv->planet_list; +} + void ag_chart_export_svg_to_file(AgChart *chart, GFile *file, GError **err) { diff --git a/src/ag-chart.h b/src/ag-chart.h index 758474f..833d574 100644 --- a/src/ag-chart.h +++ b/src/ag-chart.h @@ -59,6 +59,7 @@ gchar *ag_chart_get_city(AgChart *chart); gchar *ag_chart_create_svg(AgChart *chart, gsize *length, GError **err); +GList *ag_chart_get_planets(AgChart *chart); #define AG_CHART_ERROR (ag_chart_error_quark()) GQuark ag_chart_error_quark(void); From 78d127afec7696e1e034c47dc3e86d37cca17154 Mon Sep 17 00:00:00 2001 From: Gergely Polonkai Date: Fri, 27 Jun 2014 21:10:27 +0200 Subject: [PATCH 25/25] Create GtkGrid for aspect table This is a textual representation only. Icons are still on their way. --- src/ag-window.c | 85 ++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 81 insertions(+), 4 deletions(-) diff --git a/src/ag-window.c b/src/ag-window.c index 3343691..4003f54 100644 --- a/src/ag-window.c +++ b/src/ag-window.c @@ -42,6 +42,7 @@ struct _AgWindowPrivate { AgSettings *settings; AgChart *chart; gchar *uri; + gboolean aspect_table_populated; }; G_DEFINE_QUARK(ag_window_error_quark, ag_window_error); @@ -248,6 +249,11 @@ ag_window_redraw_chart(AgWindow *window) { GError *err = NULL; gchar *svg_content; + GList *planet_list, + *planet1, + *planet2; + guint i, + j; svg_content = ag_chart_create_svg(window->priv->chart, NULL, &err); @@ -261,6 +267,73 @@ ag_window_redraw_chart(AgWindow *window) webkit_web_view_load_string(WEBKIT_WEB_VIEW(window->priv->tab_chart), svg_content, "image/svg+xml", "UTF-8", "file://"); g_free(svg_content); } + + planet_list = ag_chart_get_planets(window->priv->chart); + + if (window->priv->aspect_table_populated == FALSE) { + GList *planet; + guint i; + + for (planet = planet_list, i = 0; planet; planet = g_list_next(planet), i++) { + GtkWidget *label_hor, + *label_ver; + GswePlanet planet_id; + GswePlanetData *planet_data; + GswePlanetInfo *planet_info; + + planet_id = GPOINTER_TO_INT(planet->data); + planet_data = gswe_moment_get_planet(GSWE_MOMENT(window->priv->chart), planet_id, NULL); + planet_info = gswe_planet_data_get_planet_info(planet_data); + + label_hor = gtk_label_new(gswe_planet_info_get_name(planet_info)); + gtk_grid_attach(GTK_GRID(window->priv->tab_aspects), label_hor, i + 1, i, 1, 1); + + if (i > 0) { + label_ver = gtk_label_new(gswe_planet_info_get_name(planet_info)); + gtk_grid_attach(GTK_GRID(window->priv->tab_aspects), label_ver, 0, i, 1, 1); + } + } + + window->priv->aspect_table_populated = TRUE; + } + + for (planet1 = planet_list, i = 0; planet1; planet1 = g_list_next(planet1), i++) { + for (planet2 = planet_list, j = 0; planet2; planet2 = g_list_next(planet2), j++) { + GsweAspectData *aspect; + GError *err = NULL; + + if (GPOINTER_TO_INT(planet1->data) == GPOINTER_TO_INT(planet2->data)) { + break; + } + + if ((aspect = gswe_moment_get_aspect_by_planets(GSWE_MOMENT(window->priv->chart), GPOINTER_TO_INT(planet1->data), GPOINTER_TO_INT(planet2->data), &err)) != NULL) { + GsweAspectInfo *aspect_info; + GtkWidget *aspect_label; + + aspect_info = gswe_aspect_data_get_aspect_info(aspect); + aspect_label = gtk_grid_get_child_at(GTK_GRID(window->priv->tab_aspects), j + 1, i); + + if (gswe_aspect_data_get_aspect(aspect) == GSWE_ASPECT_NONE) { + if (aspect_label != NULL) { + gtk_container_remove(GTK_CONTAINER(window->priv->tab_aspects), aspect_label); + } + } else { + if (aspect_label == NULL) { + aspect_label = gtk_label_new(gswe_aspect_info_get_name(aspect_info)); + gtk_grid_attach(GTK_GRID(window->priv->tab_aspects), aspect_label, j + 1, i, 1, 1); + } else { + gtk_label_set_label(GTK_LABEL(aspect_label), gswe_aspect_info_get_name(aspect_info)); + } + } + } else if (err) { + g_warning("%s\n", err->message); + } else { + g_error("No aspect is returned between two planets. This is a bug in SWE-GLib!\n"); + } + } + } + + gtk_widget_show_all(window->priv->tab_aspects); } void @@ -569,8 +642,8 @@ static void window_populate(AgWindow *window) { AgWindowPrivate *priv = window->priv; - GtkWidget *menu_button; - GtkWidget *scroll; + GtkWidget *menu_button, + *scroll; GObject *menu; priv->header_bar = gtk_header_bar_new(); @@ -608,8 +681,12 @@ window_populate(AgWindow *window) webkit_web_view_load_string(WEBKIT_WEB_VIEW(priv->tab_chart), "No Chart

No Chart

No chart is loaded. Create one on the edit view, or open one from the application menu!

", "text/html", "UTF-8", NULL); gtk_widget_set_size_request(priv->tab_chart, 600, 600); - priv->tab_aspects = gtk_label_new("PLACEHOLDER FOR THE ASPECTS TABLE"); - gtk_stack_add_titled(GTK_STACK(priv->stack), priv->tab_aspects, "aspects", _("Aspects")); + scroll = gtk_scrolled_window_new(NULL, NULL); + g_object_set(scroll, "shadow-type", GTK_SHADOW_NONE, NULL); + gtk_stack_add_titled(GTK_STACK(priv->stack), scroll, "aspects", _("Aspects")); + + priv->tab_aspects = gtk_grid_new(); + gtk_container_add(GTK_CONTAINER(scroll), priv->tab_aspects); priv->tab_points = gtk_label_new("PLACEHOLDER FOR THE POINTS TABLES"); gtk_stack_add_titled(GTK_STACK(priv->stack), priv->tab_points, "points", _("Points"));