sky: projection - initial alt-az projection started.
[nova.git] / src / sky / legend.c
blob8592e1a49826be856bfd4aec382dca028846eb33
1 /*
2 * Copyright (C) 2008 Liam Girdwood
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330,
17 * Boston, MA 02111-1307, USA.
20 #include <math.h>
21 #include <time.h>
22 #include <gtk/gtk.h>
23 #include <gdk/gdkkeysyms.h>
24 #include <libnova/utility.h>
25 #include <libnova/transform.h>
26 #include <libnova/julian_day.h>
27 #include <libnova/ln_types.h>
28 #include <libastrodb/astrodb.h>
29 #include "legend.h"
30 #include "render.h"
31 #include "star.h"
32 #include "tile.h"
33 #include "db.h"
35 #define RA_BASE 5.0
36 #define RA_TEXT (RA_BASE + 40.0)
37 #define RA_SIZE 120
38 #define DEC_BASE (RA_BASE + RA_SIZE)
39 #define DEC_TEXT (DEC_BASE + 40.0)
40 #define DEC_SIZE 130
41 #define AZ_BASE (DEC_BASE + DEC_SIZE)
42 #define AZ_TEXT (AZ_BASE + 40.0)
43 #define AZ_SIZE 120
44 #define ALT_BASE (AZ_BASE + AZ_SIZE)
45 #define ALT_TEXT (ALT_BASE + 40.0)
46 #define ALT_SIZE 130
47 #define FOV_BASE (ALT_BASE + ALT_SIZE)
48 #define FOV_TEXT (FOV_BASE + 40.0)
49 #define FOV_SIZE 110
50 #define MAG_BASE (FOV_BASE + FOV_SIZE)
51 #define MAG_TEXT (MAG_BASE + 80.0)
52 #define MAG_SIZE 100
53 #define OBJECT_BASE (MAG_BASE + MAG_SIZE)
54 #define OBJECT_TEXT OBJECT_BASE + 80
55 #define OBJECT_SIZE 100
57 #define NOVA_LEGEND_GET_PRIVATE(obj) \
58 (G_TYPE_INSTANCE_GET_PRIVATE ((obj), NOVA_TYPE_LEGEND, Legend))
60 G_DEFINE_TYPE (GtkLegend, legend, GTK_TYPE_DRAWING_AREA);
62 static gboolean legend_expose (GtkWidget *legend_widget,
63 GdkEventExpose *event);
65 static void legend_class_init (GtkLegendClass *class)
67 GObjectClass *obj_class;
68 GtkWidgetClass *widget_class;
70 obj_class = G_OBJECT_CLASS (class);
71 widget_class = GTK_WIDGET_CLASS (class);
73 widget_class->expose_event = legend_expose;
75 g_type_class_add_private (obj_class, sizeof(Legend));
78 static void legend_init (GtkLegend *gtk_legend)
80 Legend *legend;
82 legend = NOVA_LEGEND_GET_PRIVATE(gtk_legend);
83 legend->fov = 180.0;
86 static void render_pointer_position(Legend *legend, cairo_t *cr)
88 struct ln_hms hms;
89 struct ln_dms dms;
90 struct ln_hrz_posn posn;
91 gchar text[32], sign;
93 cairo_move_to(cr, RA_BASE, 15.0);
94 cairo_show_text(cr, "RA:");
95 cairo_move_to(cr, DEC_BASE, 15.0);
96 cairo_show_text(cr, "DEC:");
97 cairo_move_to(cr, AZ_BASE, 15.0);
98 cairo_show_text(cr, "AZ:");
99 cairo_move_to(cr, ALT_BASE, 15.0);
100 cairo_show_text(cr, "ALT:");
101 cairo_move_to(cr, FOV_BASE, 15.0);
102 cairo_show_text(cr, "FOV:");
104 /* RA */
105 ln_deg_to_hms(legend->pointer_pos.ra, &hms);
106 sprintf(text, "%2.2dh%2.2dm%2.0fs", hms.hours, hms.minutes,
107 hms.seconds);
108 cairo_move_to(cr, RA_TEXT, 15.0);
109 cairo_show_text(cr, text);
111 /* DEC */
112 ln_deg_to_dms(legend->pointer_pos.dec, &dms);
113 if (dms.neg)
114 sign = '-';
115 else
116 sign = '+';
117 sprintf(text, "%c%2.2dº%2.2dm%2.0fs", sign, dms.degrees,
118 dms.minutes, dms.seconds);
119 cairo_move_to(cr, DEC_TEXT, 15.0);
120 cairo_show_text(cr, text);
122 /* AZ */
123 ln_get_hrz_from_equ(&legend->pointer_pos, &legend->observer->posn,
124 legend->observer->JD, &posn);
125 ln_deg_to_hms(posn.az, &hms);
126 sprintf(text, "%2.2dh%2.2dm%2.0fs", hms.hours, hms.minutes,
127 hms.seconds);
128 cairo_move_to(cr, AZ_TEXT, 15.0);
129 cairo_show_text(cr, text);
131 /* ALT */
132 ln_deg_to_dms(posn.alt, &dms);
133 if (dms.neg)
134 sign = '-';
135 else
136 sign = '+';
137 sprintf(text, "%c%2.2dº%2.2dm%2.0fs", sign, dms.degrees,
138 dms.minutes, dms.seconds);
139 cairo_move_to(cr, ALT_TEXT, 15.0);
140 cairo_show_text(cr, text);
142 /* FOV */
143 sprintf(text, "%2.2fº", legend->fov);
144 cairo_move_to(cr, FOV_TEXT, 15.0);
145 cairo_show_text(cr, text);
148 static void render_legend_magnitude(Legend *legend, cairo_t *cr)
150 gchar text[32];
152 cairo_move_to(cr, MAG_BASE, 15.0);
153 cairo_show_text(cr, "Max Mag:");
155 sprintf(text, "%2.0f", legend->faint_mag);
157 cairo_move_to(cr, MAG_TEXT, 15.0);
158 cairo_show_text(cr, text);
161 static void render_legend_object(Legend *legend, cairo_t *cr)
163 gchar text[32];
164 struct astrodb_object *object = legend->object;
166 cairo_move_to(cr, OBJECT_BASE, 15.0);
167 cairo_show_text(cr, "Object:");
169 if (object == NULL)
170 return;
172 /* TODO: do this per type */
173 sprintf(text, "%s %s", object->id, object->name);
175 cairo_move_to(cr, OBJECT_TEXT, 15.0);
176 cairo_show_text(cr, text);
179 static void legend_draw(GtkWidget *legend_widget, cairo_t *cr)
181 Legend *legend;
183 legend = NOVA_LEGEND_GET_PRIVATE(legend_widget);
185 cairo_set_source_rgba(cr, 0, 0.35, 0.55, 1.0);
186 cairo_set_font_size (cr, 13.0);
187 cairo_move_to(cr, 0.0, 0.0);
188 cairo_line_to(cr, legend_widget->allocation.width, 0.0);
189 cairo_stroke(cr);
191 render_pointer_position(legend, cr);
192 render_legend_magnitude(legend, cr);
193 render_legend_object(legend, cr);
194 cairo_restore(cr);
197 static gboolean legend_expose(GtkWidget *legend_widget,
198 GdkEventExpose *event)
200 cairo_t *cr;
202 /* get a cairo_t */
203 cr = gdk_cairo_create(legend_widget->window);
205 /* draw night legend background */
206 cairo_rectangle(cr,event->area.x, event->area.y,
207 event->area.width, event->area.height);
208 cairo_clip(cr);
209 cairo_set_source_rgb(cr, 0, 0, 0);
210 cairo_paint(cr);
212 /* render_object legend objects */
213 legend_draw(legend_widget, cr);
214 cairo_destroy(cr);
216 return FALSE;
219 GtkWidget *legend_new (void)
221 return g_object_new(NOVA_TYPE_LEGEND, NULL);
224 void legend_update_pointer(GtkWidget *gtk_legend, gdouble ra, gdouble dec)
226 Legend *legend;
228 legend = NOVA_LEGEND_GET_PRIVATE(gtk_legend);
229 legend->pointer_pos.ra = ra;
230 legend->pointer_pos.dec = dec;
231 gtk_widget_queue_draw(gtk_legend);
234 void legend_update_fov(GtkWidget *gtk_legend, gdouble fov, gdouble faint_mag)
236 Legend *legend;
238 legend = NOVA_LEGEND_GET_PRIVATE(gtk_legend);
239 legend->fov = fov;
240 legend->faint_mag = faint_mag;
241 gtk_widget_queue_draw(gtk_legend);
244 void legend_set_object(GtkWidget *gtk_legend, struct astrodb_object *object)
246 Legend *legend;
248 legend = NOVA_LEGEND_GET_PRIVATE(gtk_legend);
249 legend->object = object;
250 gtk_widget_queue_draw(gtk_legend);
253 void legend_set_observer(GtkWidget *gtk_legend, struct observer_info *observer)
255 Legend *legend;
257 legend = NOVA_LEGEND_GET_PRIVATE(gtk_legend);
258 legend->observer = observer;