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; |
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 |
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 |
|
|
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; |
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); |
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); |
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), |
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), |
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), |
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[] = { |
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 */ |
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 **********************/ |
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 |
|
|
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), |