Merge branch 'master' into settings
This commit is contained in:
commit
1cee8bf38c
4
.gitignore
vendored
4
.gitignore
vendored
@ -1,6 +1,7 @@
|
||||
.deps/
|
||||
.libs/
|
||||
*~
|
||||
*.a
|
||||
*.o
|
||||
*.lo
|
||||
*.la
|
||||
@ -73,6 +74,9 @@ Makefile.in
|
||||
/help/*/*.page
|
||||
!/help/C/*.page
|
||||
|
||||
/.anjuta*
|
||||
/*.anjuta
|
||||
|
||||
#Documentation related files
|
||||
/docs/reference/*/*.args
|
||||
/docs/reference/*/*.hierarchy
|
||||
|
3
.gitmodules
vendored
3
.gitmodules
vendored
@ -1,3 +0,0 @@
|
||||
[submodule "libgd"]
|
||||
path = libgd
|
||||
url = git://git.gnome.org/libgd
|
@ -1,5 +1,5 @@
|
||||
ACLOCAL_AMFLAGS = -I m4
|
||||
SUBDIRS = libgd src po data help
|
||||
SUBDIRS = src po data help
|
||||
|
||||
EXTRA_DIST = config.rpath ChangeLog
|
||||
|
||||
|
@ -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.
|
||||
|
@ -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
|
||||
|
||||
|
11
configure.ac
11
configure.ac
@ -27,23 +27,16 @@ 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])
|
||||
PKG_CHECK_MODULES([LIBXSLT], [libexslt])
|
||||
PKG_CHECK_MODULES([WEBKIT], [webkitgtk-3.0])
|
||||
PKG_CHECK_MODULES([SWE_GLIB], [swe-glib])
|
||||
|
||||
LIBGD_INIT([
|
||||
header-bar
|
||||
stack
|
||||
static
|
||||
])
|
||||
PKG_CHECK_MODULES([SWE_GLIB], [swe-glib >= 2.0.0])
|
||||
|
||||
AC_CONFIG_FILES([
|
||||
Makefile
|
||||
libgd/Makefile
|
||||
src/Makefile
|
||||
help/Makefile
|
||||
po/Makefile.in
|
||||
|
@ -523,7 +523,7 @@
|
||||
<line id="descendent" x1="-320" y1="0" x2="-50" y2="0" transform="rotate(-103.432962,0,0)" class="axis">
|
||||
<xsl:attribute name="transform"><xsl:value-of select="concat('rotate(-', $asc, ')')" /></xsl:attribute>
|
||||
</line>
|
||||
<line id="ascendent" x1="50" y1="0" x2="320" y2="0" class="axis axis-end">
|
||||
<line id="ascendant" x1="50" y1="0" x2="320" y2="0" class="axis axis-end">
|
||||
<xsl:attribute name="transform"><xsl:value-of select="concat('rotate(-', $asc, ')')" /></xsl:attribute>
|
||||
</line>
|
||||
<xsl:variable name="mc" select="chartinfo/ascmcs/mc/@degree_ut"/>
|
||||
@ -597,7 +597,7 @@
|
||||
<xsl:variable name="planet1" select="@body1"/>
|
||||
<xsl:variable name="deg1">
|
||||
<xsl:choose>
|
||||
<xsl:when test="$planet1='GSWE_PLANET_ASCENDENT'">
|
||||
<xsl:when test="$planet1='GSWE_PLANET_ASCENDANT'">
|
||||
<xsl:value-of select="/chartinfo/ascmcs/ascendant/@degree_ut" />
|
||||
</xsl:when>
|
||||
<xsl:when test="$planet1='GSWE_PLANET_MC'">
|
||||
@ -618,7 +618,7 @@
|
||||
<xsl:variable name="planet2" select="@body2"/>
|
||||
<xsl:variable name="deg2">
|
||||
<xsl:choose>
|
||||
<xsl:when test="$planet2='GSWE_PLANET_ASCENDENT'">
|
||||
<xsl:when test="$planet2='GSWE_PLANET_ASCENDANT'">
|
||||
<xsl:value-of select="/chartinfo/ascmcs/ascendant/@degree_ut" />
|
||||
</xsl:when>
|
||||
<xsl:when test="$planet2='GSWE_PLANET_MC'">
|
||||
@ -650,7 +650,7 @@
|
||||
<xsl:variable name="planet1" select="@body1"/>
|
||||
<xsl:variable name="deg1">
|
||||
<xsl:choose>
|
||||
<xsl:when test="$planet1='GSWE_PLANET_ASCENDENT'">
|
||||
<xsl:when test="$planet1='GSWE_PLANET_ASCENDANT'">
|
||||
<xsl:value-of select="/chartinfo/ascmcs/ascendant/@degree_ut" />
|
||||
</xsl:when>
|
||||
<xsl:when test="$planet1='GSWE_PLANET_MC'">
|
||||
@ -671,7 +671,7 @@
|
||||
<xsl:variable name="planet2" select="@body2"/>
|
||||
<xsl:variable name="deg2">
|
||||
<xsl:choose>
|
||||
<xsl:when test="$planet2='GSWE_PLANET_ASCENDENT'">
|
||||
<xsl:when test="$planet2='GSWE_PLANET_ASCENDANT'">
|
||||
<xsl:value-of select="/chartinfo/ascmcs/ascendant/@degree_ut" />
|
||||
</xsl:when>
|
||||
<xsl:when test="$planet2='GSWE_PLANET_MC'">
|
||||
|
1
libgd
1
libgd
@ -1 +0,0 @@
|
||||
Subproject commit 62f9b8b92599b38d986bd26d5780edd400d318c9
|
70
po/hu.po
70
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 <gergely@polonkai.eu>\n"
|
||||
"Language-Team: Hungarian <gergely@polonkai.eu>\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,87 +46,111 @@ msgstr "Asztrológiai szoftver a GNOME-hoz"
|
||||
msgid "Astrognome Website"
|
||||
msgstr "Astrognome weboldal"
|
||||
|
||||
#: ../src/ag-app.c:131
|
||||
#: ../src/ag-app.c:136
|
||||
msgid "Select charts"
|
||||
msgstr "Válasszon ki mentett képleteket"
|
||||
|
||||
#: ../src/ag-window.c:103
|
||||
#: ../src/ag-app.c:139 ../src/ag-window.c:118
|
||||
msgid "_Cancel"
|
||||
msgstr "_Mégsem"
|
||||
|
||||
#: ../src/ag-app.c:140
|
||||
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"
|
||||
|
||||
#: ../src/ag-window.c:363
|
||||
#: ../src/ag-window.c:119
|
||||
msgid "_Save"
|
||||
msgstr "M_entés"
|
||||
|
||||
#: ../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:467
|
||||
msgid "Timezone"
|
||||
msgstr ""
|
||||
|
||||
#: ../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"
|
||||
|
||||
|
@ -29,9 +29,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
|
||||
|
20
src/ag-app.c
20
src/ag-app.c
@ -6,9 +6,6 @@
|
||||
#include "config.h"
|
||||
#include "astrognome.h"
|
||||
|
||||
struct _AgAppPrivate {
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE(AgApp, ag_app, GTK_TYPE_APPLICATION);
|
||||
|
||||
GtkWindow *
|
||||
@ -113,7 +110,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));
|
||||
@ -132,8 +134,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);
|
||||
@ -197,7 +199,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);
|
||||
|
@ -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 {
|
||||
|
226
src/ag-chart.c
226
src/ag-chart.c
@ -16,6 +16,7 @@ struct _AgChartPrivate {
|
||||
gchar *country;
|
||||
gchar *city;
|
||||
gchar *save_buffer;
|
||||
GList *planet_list;
|
||||
};
|
||||
|
||||
enum {
|
||||
@ -33,9 +34,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 +56,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,11 +68,12 @@ 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;
|
||||
chart->priv->save_buffer = NULL;
|
||||
chart->priv->planet_list = NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
@ -142,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)
|
||||
{
|
||||
@ -160,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;
|
||||
}
|
||||
@ -293,7 +365,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 +406,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 +550,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);
|
||||
@ -609,39 +684,39 @@ 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;
|
||||
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 +729,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 +739,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 +747,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 +761,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 +782,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 +807,26 @@ 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)) {
|
||||
GEnumValue *enum_value;
|
||||
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);
|
||||
|
||||
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);
|
||||
|
||||
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 +838,25 @@ 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);
|
||||
|
||||
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);
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
@ -842,6 +924,28 @@ 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;
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
@ -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);
|
||||
@ -53,7 +57,9 @@ 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);
|
||||
GList *ag_chart_get_planets(AgChart *chart);
|
||||
|
||||
#define AG_CHART_ERROR (ag_chart_error_quark())
|
||||
GQuark ag_chart_error_quark(void);
|
||||
|
@ -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;
|
||||
}
|
||||
|
258
src/ag-window.c
258
src/ag-window.c
@ -1,6 +1,6 @@
|
||||
#include <math.h>
|
||||
#include <string.h>
|
||||
#include <glib/gi18n.h>
|
||||
#include <libgd/gd.h>
|
||||
#include <libxml/parser.h>
|
||||
#include <libxml/tree.h>
|
||||
#include <webkit/webkit.h>
|
||||
@ -30,6 +30,7 @@ struct _AgWindowPrivate {
|
||||
GtkWidget *hour;
|
||||
GtkWidget *minute;
|
||||
GtkWidget *second;
|
||||
GtkWidget *timezone;
|
||||
GtkBuilder *builder;
|
||||
|
||||
GtkWidget *tab_chart;
|
||||
@ -41,13 +42,12 @@ struct _AgWindowPrivate {
|
||||
AgSettings *settings;
|
||||
AgChart *chart;
|
||||
gchar *uri;
|
||||
gboolean aspect_table_populated;
|
||||
};
|
||||
|
||||
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);
|
||||
|
||||
@ -83,6 +83,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;
|
||||
@ -91,7 +96,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;
|
||||
@ -103,8 +114,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);
|
||||
@ -158,20 +169,171 @@ 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)
|
||||
{
|
||||
GError *err = NULL;
|
||||
gchar *svg_content;
|
||||
GList *planet_list,
|
||||
*planet1,
|
||||
*planet2;
|
||||
guint i,
|
||||
j;
|
||||
|
||||
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) {
|
||||
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);
|
||||
}
|
||||
|
||||
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
|
||||
@ -189,8 +351,19 @@ 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->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) {
|
||||
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);
|
||||
@ -244,19 +417,19 @@ 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
|
||||
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,13 +438,18 @@ 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);
|
||||
}
|
||||
|
||||
// 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);
|
||||
}
|
||||
@ -285,7 +463,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);
|
||||
}
|
||||
|
||||
@ -293,6 +471,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 },
|
||||
};
|
||||
@ -304,7 +483,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;
|
||||
@ -347,7 +526,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;
|
||||
}
|
||||
|
||||
@ -441,6 +619,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;
|
||||
@ -456,56 +642,60 @@ static void
|
||||
window_populate(AgWindow *window)
|
||||
{
|
||||
AgWindowPrivate *priv = window->priv;
|
||||
GtkWidget *menu_button;
|
||||
GtkWidget *scroll;
|
||||
GtkWidget *menu_button,
|
||||
*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);
|
||||
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), "<html><head><title>No Chart</title></head><body><h1>No Chart</h1><p>No chart is loaded. Create one on the edit view, or open one from the application menu!</p></body></html>", "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");
|
||||
gd_stack_add_titled(GD_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");
|
||||
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);
|
||||
}
|
||||
|
@ -8,10 +8,10 @@
|
||||
#include <libxslt/transform.h>
|
||||
#include <libexslt/exslt.h>
|
||||
|
||||
#include <libgd/gd.h>
|
||||
|
||||
#include <swe-glib.h>
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include "ag-app.h"
|
||||
#include "ag-window.h"
|
||||
|
||||
|
@ -46,6 +46,12 @@
|
||||
<attribute name="accel"><Primary><Shift>s</attribute>
|
||||
</item>
|
||||
</section>
|
||||
<section>
|
||||
<item>
|
||||
<attribute name="label" translatable="yes">Export as SVG</attribute>
|
||||
<attribute name="action">win.export-svg</attribute>
|
||||
</item>
|
||||
</section>
|
||||
<section>
|
||||
<item>
|
||||
<attribute name="label" translatable="yes">Close</attribute>
|
||||
|
Loading…
Reference in New Issue
Block a user