From c22cf61c29b5536eef33b037c050053ab2817de9 Mon Sep 17 00:00:00 2001 From: Zwarf Date: Sat, 30 Apr 2022 22:58:05 +0200 Subject: [PATCH] Show positon of sun, moon and milky way on the map with the help of the new draw layer --- src/map/draw-layer.c | 15 +- src/window/overview-page/overview-view.c | 270 ++++++++++++++++++++--- src/window/overview-page/overview-view.h | 17 ++ src/window/picplanner-window.c | 57 ++++- 4 files changed, 318 insertions(+), 41 deletions(-) diff --git a/src/map/draw-layer.c b/src/map/draw-layer.c index 122cba7..d70cd80 100644 --- a/src/map/draw-layer.c +++ b/src/map/draw-layer.c @@ -168,6 +168,11 @@ picplanner_draw_layer_snapshot (GtkWidget *widget, PicplannerDrawLayerPrivate *priv = picplanner_draw_layer_get_instance_private (self); int width, height; cairo_t *cr; + GtkWidget *child; + + /* + * Draw the lines given by the coordinates. + */ width = gtk_widget_get_allocated_width (widget); height = gtk_widget_get_allocated_height (widget); @@ -184,7 +189,6 @@ picplanner_draw_layer_snapshot (GtkWidget *widget, double x, y; x = priv->nodes_coordinates[i*2]; y = priv->nodes_coordinates[i*2+1]; - g_print ("x: %f,y: %f\n",x,y); cairo_line_to (cr, x, y); } @@ -197,12 +201,15 @@ picplanner_draw_layer_snapshot (GtkWidget *widget, cairo_destroy (cr); - GtkWidget *child; - + /* + * Draw the children added to the layer. + */ for (child = gtk_widget_get_first_child (widget); child != NULL; child = gtk_widget_get_next_sibling (child)) - gtk_widget_snapshot_child (widget, child, snapshot); + { + gtk_widget_snapshot_child (widget, child, snapshot); + } } static void diff --git a/src/window/overview-page/overview-view.c b/src/window/overview-page/overview-view.c index a8c2231..453d60f 100644 --- a/src/window/overview-page/overview-view.c +++ b/src/window/overview-page/overview-view.c @@ -13,8 +13,11 @@ #include "map/marker.h" #define LENGTH_SCALE_FACTOR 0.38 +#define ICON_SIZE_SMALL 32 +#define ICON_SIZE_LARGE 48 static guint signal_input_changed; +static guint signal_ui_changed; struct _PicplannerOverview { @@ -39,15 +42,21 @@ struct _PicplannerOverview ShumateSimpleMap *map; ShumateViewport *viewport; - PicplannerDrawLayer *pp_layer_center; - PicplannerDrawLayer *pp_layer_sun; - PicplannerDrawLayer *pp_layer_moon; - PicplannerDrawLayer *pp_layer_milkyway; - PicplannerMarker *pp_marker_center; + PicplannerDrawLayer *pp_layer_center; + PicplannerMarker *pp_marker_sun; + PicplannerDrawLayer *pp_layer_sun; + PicplannerDrawLayer *pp_layer_sun_rise_set; + PicplannerMarker *pp_marker_moon; - PicplannerMarker *pp_marker_milkyway; + PicplannerDrawLayer *pp_layer_moon; + PicplannerDrawLayer *pp_layer_moon_rise_set; + + PicplannerMarker *pp_marker_milky_way; + PicplannerDrawLayer *pp_layer_milky_way; + PicplannerDrawLayer *pp_layer_milky_way_rise_set; + GDateTime *date_time; @@ -59,18 +68,22 @@ G_DEFINE_TYPE (PicplannerOverview, picplanner_overview, GTK_TYPE_BOX) static void -emit_signal_input_changed (GtkWidget *self, +emit_signal_changed (GtkWidget *self, gpointer overview_user_input, gpointer overview_view_size_change) { (void) self; PicplannerOverview *overview; if (PICPLANNER_IS_OVERVIEW (overview_user_input)) - overview = PICPLANNER_OVERVIEW (overview_user_input); + { + overview = PICPLANNER_OVERVIEW (overview_user_input); + g_signal_emit (overview, signal_input_changed, 0, NULL); + } else - overview = PICPLANNER_OVERVIEW (overview_view_size_change); - - g_signal_emit (overview, signal_input_changed, 0, NULL); + { + overview = PICPLANNER_OVERVIEW (overview_view_size_change); + g_signal_emit (overview, signal_ui_changed, 0, NULL); + } } /* @@ -172,6 +185,17 @@ picplanner_overview_set_current_coordinates_milky_way (PicplannerOverview *overv g_free (char_milky_way_set); } +void +picplanner_overview_remove_map_content (PicplannerOverview *overview) +{ + picplanner_draw_layer_remove_all (overview->pp_layer_sun); + picplanner_draw_layer_remove_all (overview->pp_layer_sun_rise_set); + picplanner_draw_layer_remove_all (overview->pp_layer_moon); + picplanner_draw_layer_remove_all (overview->pp_layer_moon_rise_set); + picplanner_draw_layer_remove_all (overview->pp_layer_milky_way); + picplanner_draw_layer_remove_all (overview->pp_layer_milky_way_rise_set); +} + void picplanner_overview_update_map_center (PicplannerOverview *overview, double latitude, @@ -183,14 +207,14 @@ picplanner_overview_update_map_center (PicplannerOverview *overview, picplanner_draw_layer_remove_all (overview->pp_layer_center); image_center = gtk_image_new_from_icon_name ("location-icon-symbolic-red"); - gtk_image_set_icon_size (GTK_IMAGE (image_center), GTK_ICON_SIZE_LARGE); + gtk_image_set_pixel_size (GTK_IMAGE (image_center), ICON_SIZE_SMALL); shumate_viewport_location_to_widget_coords (overview->viewport, GTK_WIDGET (overview->map), latitude, longitude, &x, &y); - picplanner_marker_set_location (overview->pp_marker_center, x, y); + picplanner_marker_set_location (overview->pp_marker_center, x, y-ICON_SIZE_SMALL/2); picplanner_marker_set_child (overview->pp_marker_center, image_center); picplanner_draw_layer_add_marker (overview->pp_layer_center, overview->pp_marker_center); } @@ -202,6 +226,10 @@ picplanner_overview_update_map_sun (PicplannerOverview *overview, double *array_coordinates_sun, int *rise_upper_set_sun) { + int sun_stroke_width = 6; + static GdkRGBA sun_color = {1., 0.9, 0., 0.8}; + static GdkRGBA sun_rise_set_color = {1., 0.8, 0., 0.5}; + int width, height, min_size; double x, y; @@ -211,15 +239,15 @@ picplanner_overview_update_map_sun (PicplannerOverview *overview, double azimuth_sun, azimuth_sunrise, azimuth_sunset; gboolean visible_sun = TRUE; - GtkWidget *image_sun; picplanner_draw_layer_remove_all (overview->pp_layer_sun); + picplanner_draw_layer_remove_all (overview->pp_layer_sun_rise_set); if (array_coordinates_sun[NUM_DATA_POINTS+1]<0) visible_sun = FALSE; image_sun = gtk_image_new_from_icon_name ("sun"); - gtk_image_set_icon_size (GTK_IMAGE (image_sun), GTK_ICON_SIZE_LARGE); + gtk_image_set_pixel_size (GTK_IMAGE (image_sun), ICON_SIZE_LARGE); gtk_widget_set_visible (image_sun, visible_sun); shumate_viewport_location_to_widget_coords (overview->viewport, @@ -241,23 +269,178 @@ picplanner_overview_update_map_sun (PicplannerOverview *overview, azimuth_sunrise = array_coordinates_sun[rise_upper_set_sun[0]*2]; x_sunrise = x + sin(calc_deg_to_rad (azimuth_sunrise)) * min_size * LENGTH_SCALE_FACTOR; y_sunrise = y - cos(calc_deg_to_rad (azimuth_sunrise)) * min_size * LENGTH_SCALE_FACTOR; - + g_print("Index Sunrise: %d", rise_upper_set_sun[0]); azimuth_sunset = array_coordinates_sun[rise_upper_set_sun[2]*2]; x_sunset = x + sin(calc_deg_to_rad (azimuth_sunset)) * min_size * LENGTH_SCALE_FACTOR; y_sunset = y - cos(calc_deg_to_rad (azimuth_sunset)) * min_size * LENGTH_SCALE_FACTOR; + picplanner_marker_set_location (overview->pp_marker_sun, x_sun, y_sun); + picplanner_marker_set_child (overview->pp_marker_sun, image_sun); + picplanner_draw_layer_add_marker (overview->pp_layer_sun, overview->pp_marker_sun); - picplanner_draw_layer_add_node_coordinates (overview->pp_layer_sun, x_sunrise, y_sunrise); picplanner_draw_layer_add_node_coordinates (overview->pp_layer_sun, x, y); - picplanner_draw_layer_add_node_coordinates (overview->pp_layer_sun, x_sunset, y_sunset); + picplanner_draw_layer_add_node_coordinates (overview->pp_layer_sun, x_sun, y_sun); + picplanner_draw_layer_set_stroke_color (overview->pp_layer_sun, &sun_color); + picplanner_draw_layer_set_stroke_width (overview->pp_layer_sun, sun_stroke_width); + picplanner_draw_layer_set_stroke (overview->pp_layer_sun, visible_sun); - /* - * TODO: - * - Add *location pointer to draw-layer - * - Only add x,y via Function - */ + if (rise_upper_set_sun[0]!=-1) + picplanner_draw_layer_add_node_coordinates (overview->pp_layer_sun_rise_set, x_sunrise, y_sunrise); + picplanner_draw_layer_add_node_coordinates (overview->pp_layer_sun_rise_set, x, y); + if (rise_upper_set_sun[2]!=-1) + picplanner_draw_layer_add_node_coordinates (overview->pp_layer_sun_rise_set, x_sunset, y_sunset); + picplanner_draw_layer_set_stroke_color (overview->pp_layer_sun_rise_set, &sun_rise_set_color); + picplanner_draw_layer_set_stroke_width (overview->pp_layer_sun_rise_set, sun_stroke_width); } +void +picplanner_overview_update_map_moon (PicplannerOverview *overview, + double latitude, + double longitude, + double *array_coordinates_moon, + int *rise_upper_set_moon) +{ + int moon_stroke_width = 6; + static GdkRGBA moon_color = {0.8, 0.8, 0.8, 0.8}; + static GdkRGBA moon_rise_set_color = {0.5, 0.5, 0.5, 0.5}; + + int width, height, min_size; + + double x, y; + double x_moon, y_moon; + double x_moonrise, y_moonrise; + double x_moonset, y_moonset; + double azimuth_moon, azimuth_moonrise, azimuth_moonset; + + gboolean visible_moon = TRUE; + GtkWidget *image_moon; + + picplanner_draw_layer_remove_all (overview->pp_layer_moon); + picplanner_draw_layer_remove_all (overview->pp_layer_moon_rise_set); + + if (array_coordinates_moon[NUM_DATA_POINTS+1]<0) + visible_moon = FALSE; + image_moon = gtk_image_new_from_icon_name ("fcitx-fullwidth-inactive-symbolic"); + gtk_image_set_pixel_size (GTK_IMAGE (image_moon), ICON_SIZE_LARGE); + gtk_widget_set_visible (image_moon, visible_moon); + + shumate_viewport_location_to_widget_coords (overview->viewport, + GTK_WIDGET (overview->map), + latitude, longitude, + &x, &y); + + width = gtk_widget_get_allocated_width (GTK_WIDGET (overview->map)); + height = gtk_widget_get_allocated_height (GTK_WIDGET (overview->map)); + if (widthpp_marker_moon, x_moon, y_moon); + picplanner_marker_set_child (overview->pp_marker_moon, image_moon); + picplanner_draw_layer_add_marker (overview->pp_layer_moon, overview->pp_marker_moon); + + picplanner_draw_layer_add_node_coordinates (overview->pp_layer_moon, x, y); + picplanner_draw_layer_add_node_coordinates (overview->pp_layer_moon, x_moon, y_moon); + picplanner_draw_layer_set_stroke_color (overview->pp_layer_moon, &moon_color); + picplanner_draw_layer_set_stroke_width (overview->pp_layer_moon, moon_stroke_width); + picplanner_draw_layer_set_stroke (overview->pp_layer_moon, visible_moon); + + if (rise_upper_set_moon[0]!=-1) + picplanner_draw_layer_add_node_coordinates (overview->pp_layer_moon_rise_set, x_moonrise, y_moonrise); + picplanner_draw_layer_add_node_coordinates (overview->pp_layer_moon_rise_set, x, y); + if (rise_upper_set_moon[2]!=-1) + picplanner_draw_layer_add_node_coordinates (overview->pp_layer_moon_rise_set, x_moonset, y_moonset); + picplanner_draw_layer_set_stroke_color (overview->pp_layer_moon_rise_set, &moon_rise_set_color); + picplanner_draw_layer_set_stroke_width (overview->pp_layer_moon_rise_set, moon_stroke_width); +} + + +void +picplanner_overview_update_map_milky_way (PicplannerOverview *overview, + double latitude, + double longitude, + double *array_coordinates_milky_way, + int *rise_upper_set_milky_way) +{ + int milky_way_stroke_width = 6; + static GdkRGBA milky_way_color = {0.2, 0.2, 0.7, 0.8}; + static GdkRGBA milky_way_rise_set_color = {0.0, 0.0, 0.4, 0.5}; + + int width, height, min_size; + + double x, y; + double x_milky_way, y_milky_way; + double x_milky_way_rise, y_milky_way_rise; + double x_milky_way_set, y_milky_way_set; + double azimuth_milky_way, azimuth_milky_way_rise, azimuth_milky_way_set; + + gboolean visible_milky_way = TRUE; + GtkWidget *image_milky_way; + + picplanner_draw_layer_remove_all (overview->pp_layer_milky_way); + picplanner_draw_layer_remove_all (overview->pp_layer_milky_way_rise_set); + + if (array_coordinates_milky_way[NUM_DATA_POINTS+1]<0) + visible_milky_way = FALSE; + image_milky_way = gtk_image_new_from_icon_name ("milky-way-symbolic"); + gtk_image_set_pixel_size (GTK_IMAGE (image_milky_way), ICON_SIZE_LARGE); + gtk_widget_set_visible (image_milky_way, visible_milky_way); + + shumate_viewport_location_to_widget_coords (overview->viewport, + GTK_WIDGET (overview->map), + latitude, longitude, + &x, &y); + + width = gtk_widget_get_allocated_width (GTK_WIDGET (overview->map)); + height = gtk_widget_get_allocated_height (GTK_WIDGET (overview->map)); + if (widthpp_marker_milky_way, x_milky_way, y_milky_way); + picplanner_marker_set_child (overview->pp_marker_milky_way, image_milky_way); + picplanner_draw_layer_add_marker (overview->pp_layer_milky_way, overview->pp_marker_milky_way); + + picplanner_draw_layer_add_node_coordinates (overview->pp_layer_milky_way, x, y); + picplanner_draw_layer_add_node_coordinates (overview->pp_layer_milky_way, x_milky_way, y_milky_way); + picplanner_draw_layer_set_stroke_color (overview->pp_layer_milky_way, &milky_way_color); + picplanner_draw_layer_set_stroke_width (overview->pp_layer_milky_way, milky_way_stroke_width); + picplanner_draw_layer_set_stroke (overview->pp_layer_milky_way, visible_milky_way); + + if (rise_upper_set_milky_way[0]!=-1) + picplanner_draw_layer_add_node_coordinates (overview->pp_layer_milky_way_rise_set, x_milky_way_rise, y_milky_way_rise); + picplanner_draw_layer_add_node_coordinates (overview->pp_layer_milky_way_rise_set, x, y); + if (rise_upper_set_milky_way[2]!=-1) + picplanner_draw_layer_add_node_coordinates (overview->pp_layer_milky_way_rise_set, x_milky_way_set, y_milky_way_set); + picplanner_draw_layer_set_stroke_color (overview->pp_layer_milky_way_rise_set, &milky_way_rise_set_color); + picplanner_draw_layer_set_stroke_width (overview->pp_layer_milky_way_rise_set, milky_way_stroke_width); +} /* * Changing the date_time variable after a user input was recognized. @@ -299,7 +482,7 @@ change_date_time (GtkWidget *widget, /* * Emit a signal that the user changed the input. */ - emit_signal_input_changed (widget, user_data, NULL); + emit_signal_changed (widget, user_data, NULL); } @@ -427,14 +610,34 @@ picplanner_overview_init (PicplannerOverview *overview) shumate_simple_map_set_map_source (overview->map, map_source); - // TODO + // Initialise drawing layers for the map overview->pp_marker_center = picplanner_marker_new (); g_object_ref (overview->pp_marker_center); - overview->pp_layer_center = picplanner_draw_layer_new (overview->viewport); - shumate_simple_map_add_overlay_layer (overview->map, SHUMATE_LAYER (overview->pp_layer_center)); + + overview->pp_marker_milky_way = picplanner_marker_new (); + g_object_ref (overview->pp_marker_milky_way); + overview->pp_layer_milky_way = picplanner_draw_layer_new (overview->viewport); + shumate_simple_map_add_overlay_layer (overview->map, SHUMATE_LAYER (overview->pp_layer_milky_way)); + overview->pp_layer_milky_way_rise_set = picplanner_draw_layer_new (overview->viewport); + shumate_simple_map_add_overlay_layer (overview->map, SHUMATE_LAYER (overview->pp_layer_milky_way_rise_set)); + + overview->pp_marker_moon = picplanner_marker_new (); + g_object_ref (overview->pp_marker_moon); + overview->pp_layer_moon = picplanner_draw_layer_new (overview->viewport); + shumate_simple_map_add_overlay_layer (overview->map, SHUMATE_LAYER (overview->pp_layer_moon)); + overview->pp_layer_moon_rise_set = picplanner_draw_layer_new (overview->viewport); + shumate_simple_map_add_overlay_layer (overview->map, SHUMATE_LAYER (overview->pp_layer_moon_rise_set)); + + overview->pp_marker_sun = picplanner_marker_new (); + g_object_ref (overview->pp_marker_sun); + overview->pp_layer_sun_rise_set = picplanner_draw_layer_new (overview->viewport); + shumate_simple_map_add_overlay_layer (overview->map, SHUMATE_LAYER (overview->pp_layer_sun_rise_set)); overview->pp_layer_sun = picplanner_draw_layer_new (overview->viewport); shumate_simple_map_add_overlay_layer (overview->map, SHUMATE_LAYER (overview->pp_layer_sun)); + overview->pp_layer_center = picplanner_draw_layer_new (overview->viewport); + shumate_simple_map_add_overlay_layer (overview->map, SHUMATE_LAYER (overview->pp_layer_center)); + /* @@ -477,17 +680,17 @@ picplanner_overview_init (PicplannerOverview *overview) g_signal_connect (G_OBJECT (overview->viewport), "notify::zoom-level", - G_CALLBACK (emit_signal_input_changed), + G_CALLBACK (emit_signal_changed), overview); g_signal_connect (G_OBJECT (overview->expander_date_time), "notify::expanded", - G_CALLBACK (emit_signal_input_changed), + G_CALLBACK (emit_signal_changed), overview); g_signal_connect (G_OBJECT (overview->expander_basic_information), "notify::expanded", - G_CALLBACK (emit_signal_input_changed), + G_CALLBACK (emit_signal_changed), overview); g_signal_connect (G_OBJECT (overview->settings), @@ -538,6 +741,13 @@ picplanner_overview_class_init (PicplannerOverviewClass *class) 0, NULL, NULL, NULL, G_TYPE_NONE, 0); + + signal_ui_changed = g_signal_new ("ui-changed", + G_OBJECT_CLASS_TYPE (class), + G_SIGNAL_RUN_LAST, + 0, NULL, NULL, NULL, + G_TYPE_NONE, + 0); } PicplannerOverview * diff --git a/src/window/overview-page/overview-view.h b/src/window/overview-page/overview-view.h index 13ea5b2..26920c7 100644 --- a/src/window/overview-page/overview-view.h +++ b/src/window/overview-page/overview-view.h @@ -24,6 +24,9 @@ void picplanner_overview_set_current_coordinates_milky_way (PicplannerOverview *overview, int *rise_upper_set_index); +void +picplanner_overview_remove_map_content (PicplannerOverview *overview); + void picplanner_overview_update_map_center (PicplannerOverview *overview, double latitude, @@ -36,4 +39,18 @@ picplanner_overview_update_map_sun (PicplannerOverview *overview, double *array_coordinates_sun, int *rise_upper_set_sun); +void +picplanner_overview_update_map_moon (PicplannerOverview *overview, + double latitude, + double longitude, + double *array_coordinates_moon, + int *rise_upper_set_moon); + +void +picplanner_overview_update_map_milky_way (PicplannerOverview *overview, + double latitude, + double longitude, + double *array_coordinates_milky_way, + int *rise_upper_set_milky_way); + G_END_DECLS diff --git a/src/window/picplanner-window.c b/src/window/picplanner-window.c index 4e26ea1..46c8133 100644 --- a/src/window/picplanner-window.c +++ b/src/window/picplanner-window.c @@ -31,7 +31,7 @@ * The time of no input of map movement that has to pass until a calculation of the positions * of sun, moon or milky way starts. */ -#define INPUT_CHANGED_TIMEOUT_LENGTH 150 +#define INPUT_CHANGED_TIMEOUT_LENGTH 200 struct _PicplannerWindow @@ -305,6 +305,18 @@ calculate_positions (PicplannerWindow *window) array_coordinates_sun, rise_upper_set_index_sun); + picplanner_overview_update_map_moon (PICPLANNER_OVERVIEW (window->overview_box), + latitude, + longitude, + array_coordinates_moon, + rise_upper_set_index_moon); + + picplanner_overview_update_map_milky_way (PICPLANNER_OVERVIEW (window->overview_box), + latitude, + longitude, + array_coordinates_milky_way, + rise_upper_set_index_milky_way); + g_free (rise_upper_set_index_sun); g_free (rise_upper_set_index_moon); @@ -351,11 +363,16 @@ input_changed (GtkWidget *self, { (void) self; PicplannerWindow *window; + double longitude, latitude; + if (PICPLANNER_IS_WINDOW (data_map_move)) window = PICPLANNER_WINDOW (data_map_move); else window = PICPLANNER_WINDOW (data_window_change); + longitude = gtk_spin_button_get_value (GTK_SPIN_BUTTON (window->east_entry)); + latitude = gtk_spin_button_get_value (GTK_SPIN_BUTTON (window->north_entry)); + if (window->input_new) { window->input_new = FALSE; @@ -363,8 +380,29 @@ input_changed (GtkWidget *self, input_timeout_signal, window); } + + picplanner_overview_update_map_center (PICPLANNER_OVERVIEW (window->overview_box), latitude, longitude); + window->input_count++; } +static void +input_changed_remove_content (GtkWidget *self, + gpointer data_map_move, + gpointer data_window_change) +{ + (void) self; + PicplannerWindow *window; + + if (PICPLANNER_IS_WINDOW (data_map_move)) + window = PICPLANNER_WINDOW (data_map_move); + else + window = PICPLANNER_WINDOW (data_window_change); + + if (window->input_new) + picplanner_overview_remove_map_content (PICPLANNER_OVERVIEW (window->overview_box)); + + input_changed (self, data_map_move, data_window_change); +} static void @@ -418,12 +456,12 @@ picplanner_window_init (PicplannerWindow *window) g_signal_connect (G_OBJECT (window->north_entry), "value-changed", - G_CALLBACK (input_changed), + G_CALLBACK (input_changed_remove_content), window); g_signal_connect (G_OBJECT (window->east_entry), "value-changed", - G_CALLBACK (input_changed), + G_CALLBACK (input_changed_remove_content), window); g_signal_connect (G_OBJECT (window->overview_box), @@ -431,9 +469,14 @@ picplanner_window_init (PicplannerWindow *window) G_CALLBACK (input_changed), window); + g_signal_connect (G_OBJECT (window->overview_box), + "ui-changed", + G_CALLBACK (input_changed_remove_content), + window); + g_signal_connect (G_OBJECT (window->search_bar), "notify::search-mode-enabled", - G_CALLBACK (input_changed), + G_CALLBACK (input_changed_remove_content), window); g_signal_connect (G_OBJECT (window->search_result_box), @@ -443,17 +486,17 @@ picplanner_window_init (PicplannerWindow *window) g_signal_connect (G_OBJECT (window), "notify::maximized", - G_CALLBACK (input_changed), + G_CALLBACK (input_changed_remove_content), window); g_signal_connect (G_OBJECT (window), "notify::default-width", - G_CALLBACK (input_changed), + G_CALLBACK (input_changed_remove_content), window); g_signal_connect (G_OBJECT (window), "notify::default-height", - G_CALLBACK (input_changed), + G_CALLBACK (input_changed_remove_content), window);