33 |
GtkWidget *lon2, *lat2; |
GtkWidget *lon2, *lat2; |
34 |
|
|
35 |
GtkWidget *distance, *proj_lat, *proj_lon; |
GtkWidget *distance, *proj_lat, *proj_lon; |
|
GtkWidget *middle_lat, *middle_lon; |
|
36 |
} math_dialog_state_t; |
} math_dialog_state_t; |
37 |
|
|
38 |
static gboolean mark(GtkWidget *widget, gboolean valid) { |
static gboolean mark(GtkWidget *widget, gboolean valid) { |
40 |
return valid; |
return valid; |
41 |
} |
} |
42 |
|
|
|
/* a entry that is colored red when being "active" */ |
|
|
static GtkWidget *gtk_red_entry_new(void) { |
|
|
GdkColor color; |
|
|
GtkWidget *widget = entry_new(); |
|
|
gdk_color_parse("#ff0000", &color); |
|
|
gtk_widget_modify_text(widget, TAG_STATE, &color); |
|
|
return widget; |
|
|
} |
|
|
|
|
43 |
/* a label that is colored red when being "active" */ |
/* a label that is colored red when being "active" */ |
44 |
static GtkWidget *gtk_red_label_new(char *str) { |
static GtkWidget *gtk_red_label_new(char *str) { |
45 |
GdkColor color; |
GdkColor color; |
49 |
return widget; |
return widget; |
50 |
} |
} |
51 |
|
|
|
static GtkWidget *gtk_dir_entry_new(float val) { |
|
|
char str[16]; |
|
|
GtkWidget *w = gtk_red_entry_new(); |
|
|
|
|
|
snprintf(str, sizeof(str), _("%.1f°"), val); |
|
|
gtk_entry_set_text(GTK_ENTRY(w), str); |
|
|
|
|
|
return w; |
|
|
} |
|
|
|
|
|
float pos_lat_eval_combo(GtkWidget *widget) { |
|
|
char *p = (char*)gtk_combo_box_get_active_text(GTK_COMBO_BOX(widget)); |
|
|
float val = pos_parse_lat(p); |
|
|
mark(widget, !isnan(val)); |
|
|
|
|
|
return val; |
|
|
} |
|
|
|
|
|
static float distance_eval(GtkWidget *widget, math_dialog_state_t *state) { |
|
|
char *p = (char*)gtk_entry_get_text(GTK_ENTRY(widget)); |
|
|
float val = distance_parse(p, state->appdata->imperial); |
|
|
mark(widget, !isnan(val)); |
|
|
|
|
|
return val; |
|
|
} |
|
|
|
|
|
float direction_eval(GtkWidget *widget) { |
|
|
char *p = (char*)gtk_entry_get_text(GTK_ENTRY(widget)); |
|
|
float val; |
|
|
if(sscanf(p, _("%f°"), &val) != 1) |
|
|
val = NAN; |
|
|
|
|
|
mark(widget, !isnan(val)); |
|
|
|
|
|
return val; |
|
|
} |
|
|
|
|
52 |
static void on_calc_clicked(GtkButton *button, gpointer user_data) { |
static void on_calc_clicked(GtkButton *button, gpointer user_data) { |
53 |
math_dialog_state_t *state = (math_dialog_state_t*)user_data; |
math_dialog_state_t *state = (math_dialog_state_t*)user_data; |
54 |
pos_t pos1, pos2; |
pos_t pos1, pos2; |
67 |
pos2.lon = lon_entry_get(state->lon2); |
pos2.lon = lon_entry_get(state->lon2); |
68 |
if(!isnan(pos2.lat) && !isnan(pos2.lon)) pos2_ok = TRUE; |
if(!isnan(pos2.lat) && !isnan(pos2.lon)) pos2_ok = TRUE; |
69 |
|
|
70 |
dist1 = distance_eval(state->dist1, state); |
dist1 = dist_entry_get(state->dist1, state->appdata->imperial); |
71 |
if(!isnan(dist1)) dist1_ok = TRUE; |
if(!isnan(dist1)) dist1_ok = TRUE; |
72 |
|
|
73 |
dir1 = direction_eval(state->dir1); |
dir1 = angle_entry_get(state->dir1); |
74 |
if(!isnan(dir1)) dir1_ok = TRUE; |
if(!isnan(dir1)) dir1_ok = TRUE; |
75 |
|
|
76 |
/* ------------------- do all calculations ------------------- */ |
/* ------------------- do all calculations ------------------- */ |
165 |
gtk_table_attach_defaults(GTK_TABLE(table), left_label_new(_("Latitude:")), 0, 1, 1, 2); |
gtk_table_attach_defaults(GTK_TABLE(table), left_label_new(_("Latitude:")), 0, 1, 1, 2); |
166 |
gtk_table_attach_defaults(GTK_TABLE(table), left_label_new(_("Longitude:")), 0, 1, 2, 3); |
gtk_table_attach_defaults(GTK_TABLE(table), left_label_new(_("Longitude:")), 0, 1, 2, 3); |
167 |
|
|
168 |
|
#ifdef FREMANTLE |
169 |
gtk_table_attach_defaults(GTK_TABLE(table), left_label_new(_("Coordinate 1")), 1, 3, 0, 1); |
gtk_table_attach_defaults(GTK_TABLE(table), left_label_new(_("Coordinate 1")), 1, 3, 0, 1); |
170 |
|
#endif |
171 |
gtk_table_attach_defaults(GTK_TABLE(table), state.lat1 = lat_entry_new(pos1.lat), 1, 2, 1, 2); |
gtk_table_attach_defaults(GTK_TABLE(table), state.lat1 = lat_entry_new(pos1.lat), 1, 2, 1, 2); |
172 |
gtk_table_attach_defaults(GTK_TABLE(table), state.lon1 = lon_entry_new(pos1.lon), 1, 2, 2, 3); |
gtk_table_attach_defaults(GTK_TABLE(table), state.lon1 = lon_entry_new(pos1.lon), 1, 2, 2, 3); |
173 |
gtk_table_attach_defaults(GTK_TABLE(table), preset_coordinate_picker(appdata, state.lat1, state.lon1), 2, 3, 1, 2); |
gtk_table_attach_defaults(GTK_TABLE(table), preset_coordinate_picker(appdata, state.lat1, state.lon1), 2, 3, 1, 2); |
174 |
|
|
175 |
|
#ifdef FREMANTLE |
176 |
gtk_table_attach_defaults(GTK_TABLE(table), left_label_new(_("Coordinate 2")), 3, 5, 0, 1); |
gtk_table_attach_defaults(GTK_TABLE(table), left_label_new(_("Coordinate 2")), 3, 5, 0, 1); |
177 |
|
#endif |
178 |
gtk_table_attach_defaults(GTK_TABLE(table), state.lat2 = lat_entry_new(pos2.lat), 3, 4, 1, 2); |
gtk_table_attach_defaults(GTK_TABLE(table), state.lat2 = lat_entry_new(pos2.lat), 3, 4, 1, 2); |
179 |
gtk_table_attach_defaults(GTK_TABLE(table), state.lon2 = lon_entry_new(pos2.lon), 3, 4, 2, 3); |
gtk_table_attach_defaults(GTK_TABLE(table), state.lon2 = lon_entry_new(pos2.lon), 3, 4, 2, 3); |
180 |
gtk_table_attach_defaults(GTK_TABLE(table), preset_coordinate_picker(appdata, state.lat2, state.lon2), 4, 5, 1, 2); |
gtk_table_attach_defaults(GTK_TABLE(table), preset_coordinate_picker(appdata, state.lat2, state.lon2), 4, 5, 1, 2); |
183 |
gtk_table_attach_defaults(GTK_TABLE(table), state.dist1 = dist_entry_new(dist1, appdata->imperial), 1, 3, 3, 4); |
gtk_table_attach_defaults(GTK_TABLE(table), state.dist1 = dist_entry_new(dist1, appdata->imperial), 1, 3, 3, 4); |
184 |
|
|
185 |
gtk_table_attach_defaults(GTK_TABLE(table), left_label_new(_("Direction:")), 0, 1, 4, 5); |
gtk_table_attach_defaults(GTK_TABLE(table), left_label_new(_("Direction:")), 0, 1, 4, 5); |
186 |
gtk_table_attach_defaults(GTK_TABLE(table), state.dir1 = gtk_dir_entry_new(dir1), 1, 3, 4, 5); |
gtk_table_attach_defaults(GTK_TABLE(table), state.dir1 = angle_entry_new(dir1), 1, 3, 4, 5); |
187 |
|
|
188 |
gtk_box_pack_start(GTK_BOX(hbox), table, TRUE, TRUE, 0); |
gtk_box_pack_start(GTK_BOX(hbox), table, TRUE, TRUE, 0); |
189 |
|
|
194 |
GtkWidget *button = gtk_button_new_with_label(_("Calculate!")); |
GtkWidget *button = gtk_button_new_with_label(_("Calculate!")); |
195 |
g_signal_connect(button, "clicked", (GCallback)on_calc_clicked, &state); |
g_signal_connect(button, "clicked", (GCallback)on_calc_clicked, &state); |
196 |
|
|
197 |
#if defined(USE_MAEMO) && (MAEMO_VERSION_MAJOR == 5) |
#ifdef FREMANTLE |
198 |
hildon_gtk_widget_set_theme_size(button, |
hildon_gtk_widget_set_theme_size(button, |
199 |
(HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH)); |
(HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH)); |
200 |
gtk_table_attach(GTK_TABLE(table), button, 3,5,3,5, GTK_EXPAND, GTK_EXPAND, 0, 0); |
gtk_table_attach(GTK_TABLE(table), button, 3,5,3,5, GTK_EXPAND, GTK_EXPAND, 0, 0); |
244 |
pos1.lon = lon_entry_get(state.lon1); if(isnan(pos1.lon)) pos1.lon=0; |
pos1.lon = lon_entry_get(state.lon1); if(isnan(pos1.lon)) pos1.lon=0; |
245 |
pos2.lat = lat_entry_get(state.lat2); if(isnan(pos2.lat)) pos2.lat=0; |
pos2.lat = lat_entry_get(state.lat2); if(isnan(pos2.lat)) pos2.lat=0; |
246 |
pos2.lon = lon_entry_get(state.lon2); if(isnan(pos2.lon)) pos2.lon=0; |
pos2.lon = lon_entry_get(state.lon2); if(isnan(pos2.lon)) pos2.lon=0; |
247 |
dist1 = distance_eval(state.dist1, &state); if(isnan(dist1)) dist1=0; |
dist1 = dist_entry_get(state.dist1, state.appdata->imperial); |
248 |
dir1 = direction_eval(state.dir1); if(isnan(dir1)) dir1=0; |
if(isnan(dist1)) dist1=0; |
249 |
|
dir1 = angle_entry_get(state.dir1); if(isnan(dir1)) dir1=0; |
250 |
|
|
251 |
gtk_widget_destroy(dialog); |
gtk_widget_destroy(dialog); |
252 |
} |
} |