Diff of /trunk/src/geomath.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 222 by harbaum, Mon Nov 30 21:28:04 2009 UTC revision 223 by harbaum, Tue Dec 1 20:03:51 2009 UTC
# Line 33  typedef struct { Line 33  typedef struct {
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) {
# Line 41  static gboolean mark(GtkWidget *widget, Line 40  static gboolean mark(GtkWidget *widget,
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;
# Line 59  static GtkWidget *gtk_red_label_new(char Line 49  static GtkWidget *gtk_red_label_new(char
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;
# Line 114  static void on_calc_clicked(GtkButton *b Line 67  static void on_calc_clicked(GtkButton *b
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 ------------------- */
# Line 212  void geomath_dialog(appdata_t *appdata) Line 165  void geomath_dialog(appdata_t *appdata)
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);
# Line 226  void geomath_dialog(appdata_t *appdata) Line 183  void geomath_dialog(appdata_t *appdata)
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    
# Line 237  void geomath_dialog(appdata_t *appdata) Line 194  void geomath_dialog(appdata_t *appdata)
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);
# Line 287  void geomath_dialog(appdata_t *appdata) Line 244  void geomath_dialog(appdata_t *appdata)
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  }  }

Legend:
Removed from v.222  
changed lines
  Added in v.223