Diff of /trunk/src/main.c

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

revision 241 by harbaum, Thu Jul 23 19:23:22 2009 UTC revision 242 by harbaum, Fri Jul 24 09:48:42 2009 UTC
# Line 269  cb_menu_undo_changes(GtkMenuItem *item, Line 269  cb_menu_undo_changes(GtkMenuItem *item,
269    appdata_t *appdata = (appdata_t*)data;    appdata_t *appdata = (appdata_t*)data;
270    
271    if(!yes_no_f(GTK_WIDGET(appdata->window), NULL, 0, 0,    if(!yes_no_f(GTK_WIDGET(appdata->window), NULL, 0, 0,
272                 _("Discard local changes?"),                 _("Undo all changes?"),
273                 _("Throw away all the changes you've not "                 _("Throw away all the changes you've not "
274                   "uploaded yet? This can't be undone.")))                   "uploaded yet? This can't be undone.")))
275      return;      return;
# Line 282  cb_menu_undo_changes(GtkMenuItem *item, Line 282  cb_menu_undo_changes(GtkMenuItem *item,
282    map_paint(appdata);    map_paint(appdata);
283    banner_busy_stop(appdata);  //"Redrawing"    banner_busy_stop(appdata);  //"Redrawing"
284    
285    banner_show_info(appdata, _("Discarded local changes"));    banner_show_info(appdata, _("Undo all changes"));
286  }  }
287    
288  static void  static void
# Line 761  void menu_create(appdata_t *appdata) { Line 761  void menu_create(appdata_t *appdata) {
761    );    );
762    
763    appdata->menu_item_map_undo_changes = menu_append_new_item(    appdata->menu_item_map_undo_changes = menu_append_new_item(
764      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_undo_changes), _("Disca_rd local changes"),      appdata, submenu, GTK_SIGNAL_FUNC(cb_menu_undo_changes), _("Undo _all"),
765      GTK_STOCK_DELETE, "<OSM2Go-Main>/Map/DiscardChanges",      GTK_STOCK_DELETE, "<OSM2Go-Main>/Map/UndoAll",
766      0, 0, TRUE, FALSE, FALSE      0, 0, TRUE, FALSE, FALSE
767    );    );
768    
# Line 902  typedef struct { Line 902  typedef struct {
902    GtkSignalFunc activate_cb;    GtkSignalFunc activate_cb;
903  } menu_entry_t;  } menu_entry_t;
904    
905    typedef struct {
906      const char *title;
907      const menu_entry_t *menu;
908      int len;
909    } submenu_t;
910    
911  static gboolean no_icon_get_toggle(appdata_t *appdata) {  static gboolean no_icon_get_toggle(appdata_t *appdata) {
912    if(!appdata)           return FALSE;    if(!appdata)           return FALSE;
913    if(!appdata->settings) return FALSE;    if(!appdata->settings) return FALSE;
# Line 960  static GtkWidget *app_menu_create(appdat Line 966  static GtkWidget *app_menu_create(appdat
966    return GTK_WIDGET(menu);    return GTK_WIDGET(menu);
967  }  }
968    
969    #ifdef MAEMO5_SUBMENU_POPUP
970    static GtkWidget *app_submenu_create(appdata_t *appdata,
971                                         const submenu_t *submenu) {
972      return app_menu_create(appdata, submenu->menu);
973    }
974    
975  static void submenu_popup(GtkWidget *menu) {  static void submenu_popup(GtkWidget *menu) {
976    GtkWidget *top = hildon_window_stack_peek(hildon_window_stack_get_default());    GtkWidget *top = hildon_window_stack_peek(hildon_window_stack_get_default());
977    
978  #if 1  #if 0 // nasty workaround for race condition in hildonappmenu
979    int start, end;    int start, end;
980    GTimeVal tv;    GTimeVal tv;
981    g_get_current_time(&tv);    g_get_current_time(&tv);
# Line 982  static void submenu_popup(GtkWidget *men Line 994  static void submenu_popup(GtkWidget *men
994    } while(end-start < 500);    } while(end-start < 500);
995  #endif  #endif
996    
997      hildon_app_menu_popup(HILDON_APP_MENU(menu), GTK_WINDOW(top));
998    }
999    
1000    static void submenu_cleanup(GtkWidget *menu) {
1001      g_object_unref(menu);
1002    }
1003    #else
1004    #define COLUMNS  2
1005    
1006    void on_submenu_entry_clicked(GtkButton *button, GtkWidget *menu) {
1007    
1008      /* force closing of submenu dialog */
1009      gtk_dialog_response(GTK_DIALOG(menu), GTK_RESPONSE_NONE);
1010      gtk_widget_hide(menu);
1011    
1012      /* let gtk clean up */
1013      while(gtk_events_pending())
1014        gtk_main_iteration();
1015    }
1016    
1017    hildon_app_menu_popup(HILDON_APP_MENU(menu), GTK_WINDOW(top));  /* use standard dialog boxes for fremantle submenues */
1018    static GtkWidget *app_submenu_create(appdata_t *appdata,
1019                                         const submenu_t *submenu) {
1020    
1021      /* create a oridinary dialog box */
1022      GtkWidget *dialog = misc_dialog_new(MISC_DIALOG_SMALL, _(submenu->title),
1023                                          GTK_WINDOW(appdata->window), NULL);
1024    
1025      gtk_dialog_set_has_separator(GTK_DIALOG(dialog), FALSE);
1026    
1027      GtkWidget *table = gtk_table_new(submenu->len/COLUMNS, COLUMNS, TRUE);
1028      int x = 0, y = 0;
1029    
1030      const menu_entry_t *menu_entries = submenu->menu;
1031      while(menu_entries->label) {
1032        GtkWidget *button = NULL;
1033    
1034        if(!menu_entries->toggle) {
1035          button = hildon_button_new_with_text(
1036                HILDON_SIZE_FINGER_HEIGHT | HILDON_SIZE_AUTO_WIDTH,
1037                HILDON_BUTTON_ARRANGEMENT_VERTICAL,
1038                _(menu_entries->label), _(menu_entries->value));
1039    
1040          g_signal_connect(button, "clicked",
1041                           G_CALLBACK(on_submenu_entry_clicked), dialog);
1042    
1043          g_signal_connect(button, "clicked",
1044                           menu_entries->activate_cb, appdata);
1045        } else {
1046          button = hildon_check_button_new(HILDON_SIZE_AUTO);
1047          gtk_button_set_label(GTK_BUTTON(button), _(menu_entries->label));
1048          printf("requesting check for %s: %p\n", menu_entries->label,
1049                 menu_entries->toggle);
1050          hildon_check_button_set_active(HILDON_CHECK_BUTTON(button),
1051                                         menu_entries->toggle(appdata));
1052    
1053          g_signal_connect(button, "clicked",
1054                           G_CALLBACK(on_submenu_entry_clicked), dialog);
1055    
1056          g_signal_connect(button, "toggled",
1057                           menu_entries->activate_cb, appdata);
1058        }
1059    
1060        /* offset to GtkWidget pointer was given -> store pointer */
1061        if(menu_entries->offset)
1062          *(GtkWidget**)(((void*)appdata)+menu_entries->offset) = button;
1063    
1064        gtk_widget_set_sensitive(button, menu_entries->enabled);
1065    
1066        gtk_table_attach_defaults(GTK_TABLE(table),  button, x, x+1, y, y+1);
1067    
1068        x++;
1069        if(x == COLUMNS) { x = 0; y++; }
1070    
1071        menu_entries++;
1072      }
1073    
1074    
1075      gtk_box_pack_start_defaults(GTK_BOX(GTK_DIALOG(dialog)->vbox), table);
1076    
1077      return dialog;
1078  }  }
1079    
1080    /* popup the dialog shaped submenu */
1081    static void submenu_popup(GtkWidget *menu) {
1082      gtk_widget_show_all(menu);
1083      gtk_dialog_run(GTK_DIALOG(menu));
1084      gtk_widget_hide(menu);
1085    }
1086    
1087    static void submenu_cleanup(GtkWidget *menu) {
1088      gtk_widget_destroy(menu);
1089    }
1090    #endif
1091    
1092  /* the view submenu */  /* the view submenu */
1093  void on_submenu_view_clicked(GtkButton *button, appdata_t *appdata) {  void on_submenu_view_clicked(GtkButton *button, appdata_t *appdata) {
1094    submenu_popup(appdata->app_menu_view);    submenu_popup(appdata->app_menu_view);
# Line 1016  void on_submenu_track_clicked(GtkButton Line 1118  void on_submenu_track_clicked(GtkButton
1118  #define LAST_ENTRY            { NULL, NULL, FALSE, NULL, 0, NULL }  #define LAST_ENTRY            { NULL, NULL, FALSE, NULL, 0, NULL }
1119    
1120  /* -- the view submenu -- */  /* -- the view submenu -- */
1121  static const menu_entry_t submenu_view[] = {  static const menu_entry_t submenu_view_entries[] = {
1122  #ifndef ZOOM_BUTTONS  #ifndef ZOOM_BUTTONS
1123    SIMPLE_ENTRY("Zoom in",         cb_menu_zoomin),    SIMPLE_ENTRY("Zoom in",         cb_menu_zoomin),
1124    SIMPLE_ENTRY("Zoom out",        cb_menu_zoomout),    SIMPLE_ENTRY("Zoom out",        cb_menu_zoomout),
# Line 1036  static const menu_entry_t submenu_view[] Line 1138  static const menu_entry_t submenu_view[]
1138    LAST_ENTRY    LAST_ENTRY
1139  };  };
1140    
1141    static const submenu_t submenu_view = {
1142      "View", submenu_view_entries, sizeof(submenu_view_entries)/sizeof(menu_entry_t)
1143    };
1144    
1145  /* -- the map submenu -- */  /* -- the map submenu -- */
1146  static const menu_entry_t submenu_map[] = {  static const menu_entry_t submenu_map_entries[] = {
1147    ENABLED_ENTRY("Upload",                cb_menu_upload, menu_item_map_upload),    ENABLED_ENTRY("Upload",                cb_menu_upload, menu_item_map_upload),
1148    SIMPLE_ENTRY("Download",               cb_menu_download),    SIMPLE_ENTRY("Download",               cb_menu_download),
1149    ENABLED_ENTRY("Save local changes",    cb_menu_save_changes,    ENABLED_ENTRY("Save changes",          cb_menu_save_changes,
1150                                             menu_item_map_save_changes),                  menu_item_map_save_changes),
1151    ENABLED_ENTRY("Discard local changes", cb_menu_undo_changes,    ENABLED_ENTRY("Undo all",              cb_menu_undo_changes,
1152                                             menu_item_map_undo_changes),                  menu_item_map_undo_changes),
1153    ENABLED_ENTRY("Relations",             cb_menu_osm_relations,    ENABLED_ENTRY("Relations",             cb_menu_osm_relations,
1154                                             menu_item_map_relations),                  menu_item_map_relations),
1155    
1156    LAST_ENTRY    LAST_ENTRY
1157  };  };
1158    
1159    static const submenu_t submenu_map = {
1160      "Map", submenu_map_entries, sizeof(submenu_map_entries)/sizeof(menu_entry_t)
1161    };
1162    
1163  /* -- the wms submenu -- */  /* -- the wms submenu -- */
1164  static const menu_entry_t submenu_wms[] = {  static const menu_entry_t submenu_wms_entries[] = {
1165    SIMPLE_ENTRY("Import",   cb_menu_wms_import),    SIMPLE_ENTRY("Import",   cb_menu_wms_import),
1166    DISABLED_ENTRY("Clear",  cb_menu_wms_clear, menu_item_wms_clear),    DISABLED_ENTRY("Clear",  cb_menu_wms_clear, menu_item_wms_clear),
1167    DISABLED_ENTRY("Adjust", cb_menu_wms_adjust, menu_item_wms_adjust),    DISABLED_ENTRY("Adjust", cb_menu_wms_adjust, menu_item_wms_adjust),
# Line 1059  static const menu_entry_t submenu_wms[] Line 1169  static const menu_entry_t submenu_wms[]
1169    LAST_ENTRY    LAST_ENTRY
1170  };  };
1171    
1172    static const submenu_t submenu_wms = {
1173      "WMS", submenu_wms_entries, sizeof(submenu_wms_entries)/sizeof(menu_entry_t)
1174    };
1175    
1176  /* -- the track submenu -- */  /* -- the track submenu -- */
1177  static const menu_entry_t submenu_track[] = {  static const menu_entry_t submenu_track_entries[] = {
1178    ENABLED_ENTRY("Import",  cb_menu_track_import, track.menu_item_track_import),    ENABLED_ENTRY("Import",  cb_menu_track_import, track.menu_item_track_import),
1179    DISABLED_ENTRY("Export", cb_menu_track_export, track.menu_item_track_export),    DISABLED_ENTRY("Export", cb_menu_track_export, track.menu_item_track_export),
1180    DISABLED_ENTRY("Clear",  cb_menu_track_clear, track.menu_item_track_clear),    DISABLED_ENTRY("Clear",  cb_menu_track_clear, track.menu_item_track_clear),
# Line 1072  static const menu_entry_t submenu_track[ Line 1186  static const menu_entry_t submenu_track[
1186    LAST_ENTRY    LAST_ENTRY
1187  };  };
1188    
1189    static const submenu_t submenu_track = {
1190      "Track", submenu_track_entries, sizeof(submenu_track_entries)/sizeof(menu_entry_t)
1191    };
1192    
1193    
1194  /* -- the applications main menu -- */  /* -- the applications main menu -- */
1195  static const menu_entry_t main_menu[] = {  static const menu_entry_t main_menu[] = {
# Line 1090  void menu_create(appdata_t *appdata) { Line 1208  void menu_create(appdata_t *appdata) {
1208    
1209    /* build menu/submenus */    /* build menu/submenus */
1210    menu = HILDON_APP_MENU(app_menu_create(appdata, main_menu));    menu = HILDON_APP_MENU(app_menu_create(appdata, main_menu));
1211    appdata->app_menu_wms   = app_menu_create(appdata, submenu_wms);    appdata->app_menu_wms   = app_submenu_create(appdata, &submenu_wms);
1212    g_object_ref(appdata->app_menu_wms);    g_object_ref(appdata->app_menu_wms);
1213    appdata->app_menu_map   = app_menu_create(appdata, submenu_map);    appdata->app_menu_map   = app_submenu_create(appdata, &submenu_map);
1214    g_object_ref(appdata->app_menu_map);    g_object_ref(appdata->app_menu_map);
1215    appdata->app_menu_view  = app_menu_create(appdata, submenu_view);    appdata->app_menu_view  = app_submenu_create(appdata, &submenu_view);
1216    g_object_ref(appdata->app_menu_view);    g_object_ref(appdata->app_menu_view);
1217    appdata->app_menu_track = app_menu_create(appdata, submenu_track);    appdata->app_menu_track = app_submenu_create(appdata, &submenu_track);
1218    g_object_ref(appdata->app_menu_track);    g_object_ref(appdata->app_menu_track);
1219    
1220    /* enable/disable some entries according to settings */    /* enable/disable some entries according to settings */
# Line 1106  void menu_create(appdata_t *appdata) { Line 1224  void menu_create(appdata_t *appdata) {
1224    
1225    hildon_window_set_app_menu(HILDON_WINDOW(appdata->window), menu);    hildon_window_set_app_menu(HILDON_WINDOW(appdata->window), menu);
1226  }  }
1227    
1228    void menu_cleanup(appdata_t *appdata) {
1229      submenu_cleanup(appdata->app_menu_view);
1230      submenu_cleanup(appdata->app_menu_map);
1231      submenu_cleanup(appdata->app_menu_wms);
1232      submenu_cleanup(appdata->app_menu_track);
1233    }
1234  #endif  #endif
1235    
1236  /********************* end of menu **********************/  /********************* end of menu **********************/
# Line 1181  void cleanup(appdata_t *appdata) { Line 1306  void cleanup(appdata_t *appdata) {
1306    if(appdata->menu_item_map_undo)    if(appdata->menu_item_map_undo)
1307      undo_free(appdata->osm, appdata->undo.state);      undo_free(appdata->osm, appdata->undo.state);
1308    
1309      menu_cleanup(appdata);
1310    
1311    puts("everything is gone");    puts("everything is gone");
1312  }  }
1313    
# Line 1276  int main(int argc, char *argv[]) { Line 1403  int main(int argc, char *argv[]) {
1403  #endif  #endif
1404    hildon_program_add_window(appdata.program, appdata.window);    hildon_program_add_window(appdata.program, appdata.window);
1405    
1406  #if MAEMO_VERSION_MAJOR == 5  #if MAEMO_VERSION_MAJOR == 6
1407    unsigned long val = False;    unsigned long val = False;
1408    XChangeProperty(GDK_DISPLAY(),    XChangeProperty(GDK_DISPLAY(),
1409                    GDK_WINDOW_XID(GTK_WIDGET(appdata.window)->window),                    GDK_WINDOW_XID(GTK_WIDGET(appdata.window)->window),

Legend:
Removed from v.241  
changed lines
  Added in v.242