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.
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>
36 #define RA_TEXT (RA_BASE + 40.0)
38 #define DEC_BASE (RA_BASE + RA_SIZE)
39 #define DEC_TEXT (DEC_BASE + 40.0)
41 #define AZ_BASE (DEC_BASE + DEC_SIZE)
42 #define AZ_TEXT (AZ_BASE + 40.0)
44 #define ALT_BASE (AZ_BASE + AZ_SIZE)
45 #define ALT_TEXT (ALT_BASE + 40.0)
47 #define FOV_BASE (ALT_BASE + ALT_SIZE)
48 #define FOV_TEXT (FOV_BASE + 40.0)
50 #define MAG_BASE (FOV_BASE + FOV_SIZE)
51 #define MAG_TEXT (MAG_BASE + 80.0)
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
)
82 legend
= NOVA_LEGEND_GET_PRIVATE(gtk_legend
);
86 static void render_pointer_position(Legend
*legend
, cairo_t
*cr
)
90 struct ln_hrz_posn posn
;
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:");
105 ln_deg_to_hms(legend
->pointer_pos
.ra
, &hms
);
106 sprintf(text
, "%2.2dh%2.2dm%2.0fs", hms
.hours
, hms
.minutes
,
108 cairo_move_to(cr
, RA_TEXT
, 15.0);
109 cairo_show_text(cr
, text
);
112 ln_deg_to_dms(legend
->pointer_pos
.dec
, &dms
);
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
);
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
,
128 cairo_move_to(cr
, AZ_TEXT
, 15.0);
129 cairo_show_text(cr
, text
);
132 ln_deg_to_dms(posn
.alt
, &dms
);
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
);
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
)
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
)
164 struct astrodb_object
*object
= legend
->object
;
166 cairo_move_to(cr
, OBJECT_BASE
, 15.0);
167 cairo_show_text(cr
, "Object:");
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
)
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);
191 render_pointer_position(legend
, cr
);
192 render_legend_magnitude(legend
, cr
);
193 render_legend_object(legend
, cr
);
197 static gboolean
legend_expose(GtkWidget
*legend_widget
,
198 GdkEventExpose
*event
)
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
);
209 cairo_set_source_rgb(cr
, 0, 0, 0);
212 /* render_object legend objects */
213 legend_draw(legend_widget
, cr
);
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
)
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
)
238 legend
= NOVA_LEGEND_GET_PRIVATE(gtk_legend
);
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
)
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
)
257 legend
= NOVA_LEGEND_GET_PRIVATE(gtk_legend
);
258 legend
->observer
= observer
;