1 /*
2     Gpredict: Real-time satellite tracking and orbit prediction program
3 
4     Copyright (C)  2001-2017  Alexandru Csete, OZ9AEC.
5 
6     Comments, questions and bugreports should be submitted via
7     http://sourceforge.net/projects/gpredict/
8     More details can be found at the project home page:
9 
10             http://gpredict.oz9aec.net/
11 
12     This program is free software; you can redistribute it and/or modify
13     it under the terms of the GNU General Public License as published by
14     the Free Software Foundation; either version 2 of the License, or
15     (at your option) any later version.
16 
17     This program is distributed in the hope that it will be useful,
18     but WITHOUT ANY WARRANTY; without even the implied warranty of
19     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20     GNU General Public License for more details.
21 
22     You should have received a copy of the GNU General Public License
23     along with this program; if not, visit http://www.fsf.org/
24 */
25 #ifdef HAVE_CONFIG_H
26 #include <build-config.h>
27 #endif
28 
29 #include <glib/gi18n.h>
30 #include <goocanvas.h>
31 #include <gtk/gtk.h>
32 
33 #include "config-keys.h"
34 #include "gtk-polar-view.h"
35 #include "gtk-polar-view-popup.h"
36 #include "gtk-sat-popup-common.h"
37 #include "mod-cfg-get-param.h"
38 #include "orbit-tools.h"
39 #include "predict-tools.h"
40 #include "sat-cfg.h"
41 #include "sat-info.h"
42 #include "sat-log.h"
43 #include "sat-pass-dialogs.h"
44 #include "sgpsdp/sgp4sdp4.h"
45 #include "time-tools.h"
46 
47 
48 static void     track_toggled(GtkCheckMenuItem * item, gpointer data);
49 
50 /* static void target_toggled (GtkCheckMenuItem *item, gpointer data); */
51 
52 /**
53  * Show satellite popup menu.
54  *
55  * @param sat Pointer to the satellite data.
56  * @param qth The current location.
57  * @param pview The GtkPolarView widget.
58  * @param event The mouse-click related event info
59  * @param toplevel The toplevel window or NULL.
60  */
gtk_polar_view_popup_exec(sat_t * sat,qth_t * qth,GtkPolarView * pview,GdkEventButton * event,GtkWidget * toplevel)61 void gtk_polar_view_popup_exec(sat_t * sat, qth_t * qth, GtkPolarView * pview,
62                                GdkEventButton * event, GtkWidget * toplevel)
63 {
64     GtkWidget      *menu;
65     GtkWidget      *menuitem;
66     sat_obj_t      *obj = NULL;
67     gint           *catnum;
68 
69     menu = gtk_menu_new();
70 
71     /* first menu item is the satellite name, centered */
72     menuitem = gtk_menu_item_new();
73     gtk_menu_item_set_label(GTK_MENU_ITEM(menuitem), _("Satellite info"));
74 
75     /* attach data to menuitem and connect callback */
76     g_object_set_data(G_OBJECT(menuitem), "sat", sat);
77     g_object_set_data(G_OBJECT(menuitem), "qth", qth);
78     g_signal_connect(menuitem, "activate", G_CALLBACK(show_sat_info_menu_cb),
79                      toplevel);
80 
81     gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
82 
83     /* separator */
84     menuitem = gtk_separator_menu_item_new();
85     gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
86 
87     /* add the menu items for current,next, and future passes. */
88     add_pass_menu_items(menu, sat, qth, &pview->tstamp, GTK_WIDGET(pview));
89 
90     /* separator */
91     menuitem = gtk_separator_menu_item_new();
92     gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
93 
94     /* get sat obj since we'll need it for the remaining items */
95     catnum = g_new0(gint, 1);
96     *catnum = sat->tle.catnr;
97     obj = SAT_OBJ(g_hash_table_lookup(pview->obj, catnum));
98     g_free(catnum);
99 
100     /* show track */
101     menuitem = gtk_check_menu_item_new_with_label(_("Sky track"));
102     g_object_set_data(G_OBJECT(menuitem), "sat", sat);
103     g_object_set_data(G_OBJECT(menuitem), "qth", qth);
104     g_object_set_data(G_OBJECT(menuitem), "obj", obj);
105     gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
106     gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
107                                    obj->showtrack);
108     g_signal_connect(menuitem, "activate", G_CALLBACK(track_toggled), pview);
109 
110     /* disable menu item if satellite is geostationary */
111     if (sat->otype == ORBIT_TYPE_GEO)
112         gtk_widget_set_sensitive(menuitem, FALSE);
113 
114     /* target */
115     /*      menuitem = gtk_check_menu_item_new_with_label (_("Set as target")); */
116     /*      g_object_set_data (G_OBJECT (menuitem), "sat", sat); */
117     /*      g_object_set_data (G_OBJECT (menuitem), "qth", qth); */
118     /*      g_object_set_data (G_OBJECT (menuitem), "obj", obj); */
119     /*      gtk_menu_shell_append (GTK_MENU_SHELL(menu), menuitem); */
120     /*      gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menuitem), obj->istarget); */
121     /*      g_signal_connect (menuitem, "activate", G_CALLBACK (target_toggled), pview); */
122 
123     gtk_widget_show_all(menu);
124 
125     /* Note: event can be NULL here when called from view_onPopupMenu;
126      *  gdk_event_get_time() accepts a NULL argument */
127     gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL,
128                    (event != NULL) ? event->button : 0,
129                    gdk_event_get_time((GdkEvent *) event));
130 }
131 
132 /**
133  * Manage toggling of Ground Track.
134  *
135  * @param item The menu item that was toggled.
136  * @param data Pointer to the GtkPolarView structure.
137  *
138  */
track_toggled(GtkCheckMenuItem * item,gpointer data)139 static void track_toggled(GtkCheckMenuItem * item, gpointer data)
140 {
141     GtkPolarView   *pv = GTK_POLAR_VIEW(data);
142     sat_obj_t      *obj = NULL;
143     sat_t          *sat;
144 
145     /* qth_t              *qth; Unused */
146     gint           *catnum;
147 
148     /* get satellite object */
149     obj = SAT_OBJ(g_object_get_data(G_OBJECT(item), "obj"));
150     sat = SAT(g_object_get_data(G_OBJECT(item), "sat"));
151     /*qth = (qth_t *)(g_object_get_data (G_OBJECT (item), "qth")); */
152 
153     if (obj == NULL)
154     {
155         sat_log_log(SAT_LOG_LEVEL_ERROR,
156                     _("%s:%d: Failed to get satellite object."),
157                     __FILE__, __LINE__);
158         return;
159     }
160 
161     /* toggle flag */
162     obj->showtrack = !obj->showtrack;
163     gtk_check_menu_item_set_active(item, obj->showtrack);
164 
165     catnum = g_new0(gint, 1);
166     *catnum = sat->tle.catnr;
167 
168     if (obj->showtrack)
169     {
170         /* add sky track */
171 
172         /* add it to the storage structure */
173         g_hash_table_insert(pv->showtracks_on, catnum, NULL);
174         /* remove it from the don't show */
175         g_hash_table_remove(pv->showtracks_off, catnum);
176 
177         gtk_polar_view_create_track(pv, obj, sat);
178     }
179     else
180     {
181         /* add it to the hide */
182         g_hash_table_insert(pv->showtracks_off, catnum, NULL);
183         /* remove it from the show */
184         g_hash_table_remove(pv->showtracks_on, catnum);
185 
186         /* delete sky track */
187         gtk_polar_view_delete_track(pv, obj, sat);
188     }
189 }
190 
191 #if 0
192 /**
193  * Manage toggling of Set Target.
194  *
195  * @param item The menu item that was toggled.
196  * @param data Pointer to the GtkPolarView structure.
197  *
198  */
199 static void target_toggled(GtkCheckMenuItem * item, gpointer data)
200 {
201     sat_obj_t      *obj = NULL;
202 
203     /* get satellite object */
204     obj = SAT_OBJ(g_object_get_data(G_OBJECT(item), "obj"));
205 
206     if (obj == NULL)
207     {
208         sat_log_log(SAT_LOG_LEVEL_ERROR,
209                     _("%s:%d: Failed to get satellite object."),
210                     __FILE__, __LINE__);
211         return;
212     }
213 
214     /* toggle flag */
215     obj->istarget = !obj->istarget;
216     gtk_check_menu_item_set_active(item, obj->istarget);
217 }
218 #endif
219