From a00421a2f470a6490fe75bc372287b3dbdd9e588 Mon Sep 17 00:00:00 2001 From: gouache Date: Wed, 4 May 2011 15:01:07 +0000 Subject: [PATCH] Elementary map: add elm_menu to test_map git-svn-id: https://svn.enlightenment.org/svn/e/trunk/elementary@59193 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- src/bin/test_map.c | 358 ++++++++++++++++++++++------------------------------- src/lib/elm_map.c | 18 ++- 2 files changed, 158 insertions(+), 218 deletions(-) diff --git a/src/bin/test_map.c b/src/bin/test_map.c index 0564a86..07ab3d9 100644 --- a/src/bin/test_map.c +++ b/src/bin/test_map.c @@ -4,6 +4,7 @@ #endif #ifndef ELM_LIB_QUICKLAUNCH +#define SOURCE_MAX 10 #define MARKER_MAX 1000 #define NAME_ENTRY_TEXT "Enter freeform address" @@ -12,17 +13,25 @@ typedef struct Marker_Data const char *file; } Marker_Data; +typedef struct Map_Source +{ + Evas_Object *map; + char *source_name; +} Map_Source; static Elm_Map_Marker_Class *itc1, *itc2, *itc_parking; static Elm_Map_Group_Class *itc_group1, *itc_group2, *itc_group_parking; -static Evas_Object *rect; +static Evas_Object *rect, *menu; static int nb_elts; static Elm_Map_Marker *markers[MARKER_MAX]; static Elm_Map_Marker *route_from, *route_to; static Elm_Map_Route *route; static Elm_Map_Name *name; static const char **source_names = NULL; +static Evas_Coord old_x, old_y; +static Evas_Coord old_d; +static Map_Source ms[SOURCE_MAX]; Marker_Data data1 = {PACKAGE_DATA_DIR"/images/logo.png"}; Marker_Data data2 = {PACKAGE_DATA_DIR"/images/logo_small.png"}; @@ -252,35 +261,41 @@ my_map_name_loaded(void *data, Evas_Object *obj __UNUSED__, void *event_info __U } static void -my_bt_show_reg(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +map_zoom_in(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) { - Eina_Bool b = elm_map_paused_get(data); - elm_map_paused_set(data, EINA_TRUE); + double zoom; + + zoom = elm_map_zoom_get(data); + zoom += 1; elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_MANUAL); - elm_map_geo_region_show(data, 126.977969, 37.566535); - elm_map_zoom_set(data, 18); - elm_map_paused_set(data, b); + if (zoom >= (1.0 / 32.0)) elm_map_zoom_set(data, zoom); } static void -my_bt_bring_reg(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +map_zoom_out(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) { - elm_map_geo_region_bring_in(data, 126.977969, 37.566535); + double zoom; + + zoom = elm_map_zoom_get(data); + zoom -= 1; + elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_MANUAL); + if (zoom <= 256.0) elm_map_zoom_set(data, zoom); } static void -my_bt_zoom_in(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +map_zoom_fit(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) { - double zoom; + elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_AUTO_FIT); +} - zoom = elm_map_zoom_get(data); - zoom += 1; - elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_MANUAL); - if (zoom >= (1.0 / 32.0)) elm_map_zoom_set(data, zoom); +static void +map_zoom_fill(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_AUTO_FILL); } static void -my_bt_rotate_cw(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +map_rotate_cw(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) { double d; Evas_Coord x, y, w, h; @@ -295,7 +310,7 @@ my_bt_rotate_cw(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUS } static void -my_bt_rotate_ccw(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +map_rotate_ccw(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) { double d; Evas_Coord x, y, w, h; @@ -310,51 +325,28 @@ my_bt_rotate_ccw(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNU } static void -my_bt_zoom_out(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) -{ - double zoom; - - zoom = elm_map_zoom_get(data); - zoom -= 1; - elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_MANUAL); - if (zoom <= 256.0) elm_map_zoom_set(data, zoom); -} - -static void -my_bt_pause(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) -{ - elm_map_paused_set(data, !elm_map_paused_get(data)); -} - -static void -my_bt_markers_pause(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) -{ - elm_map_paused_markers_set(data, !elm_map_paused_markers_get(data)); -} - -static void -my_bt_zoom_fit(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +map_rotate_reset(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) { - elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_AUTO_FIT); -} + Evas_Coord x, y, w, h; + float half_w, half_h; + evas_object_geometry_get(data, &x, &y, &w, &h); + half_w = (float)w * 0.5; + half_h = (float)h * 0.5; -static void -my_bt_zoom_fill(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) -{ - elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_AUTO_FILL); + elm_map_rotate_set(data, 0.0, x + half_w, y + half_h); } static void -my_bt_source(void *data, Evas_Object *obj __UNUSED__, void *event_info) +map_source(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) { - Elm_Flipselector_Item *it; + Map_Source *ms = data; - it = event_info; - elm_map_source_name_set(data, elm_flipselector_item_label_get(it)); + if (!ms) return; + elm_map_source_name_set(ms->map, ms->source_name); } static void -my_bt_add(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +map_marker_add(void *data) { int i; Elm_Map_Group_Class *g_clas; @@ -394,7 +386,7 @@ my_bt_add(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) } static void -my_bt_remove(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +map_marker_remove(void *data __UNUSED__) { int i; @@ -495,10 +487,109 @@ _map_move_resize_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, evas_object_move(rect,x,y); } +static void +_populate(void *data, Elm_Menu_Item *item) +{ + int idx; + + if (!ms) return; + if ((!data) || (!item) || (!source_names)) return; + for (idx = 0; source_names[idx]; idx++) + { + if (idx >= SOURCE_MAX) break; + ms[idx].map = data; + ms[idx].source_name = strdup(source_names[idx]); + elm_menu_item_add(menu, item, "", source_names[idx], map_source, &ms[idx]); + } +} + +static void +_map_mouse_down(void *data, Evas *evas __UNUSED__, Evas_Object *obj, void *event_info) +{ + Evas_Event_Mouse_Down *down = event_info; + Elm_Menu_Item *item; + if (!down) return; + + if (down->button == 2) + { + old_x = down->output.x; + old_y = down->output.y; + old_d = 0.0; + } + else if (down->button == 3) + { + menu = elm_menu_add(obj); + item = elm_menu_item_add(menu, NULL, NULL, "Source", NULL, NULL); + _populate(data, item); + elm_menu_item_add(menu, NULL, NULL, "Zoom +", map_zoom_in, data); + elm_menu_item_add(menu, NULL, NULL, "Zoom -", map_zoom_out, data); + elm_menu_item_add(menu, NULL, NULL, "Zoom Fit", map_zoom_fit, data); + elm_menu_item_add(menu, NULL, NULL, "Zoom Fill", map_zoom_fill, data); + elm_menu_item_add(menu, NULL, NULL, "Add Marker", NULL, NULL); + elm_menu_item_add(menu, NULL, NULL, "Rotate CW", map_rotate_cw, data); + elm_menu_item_add(menu, NULL, NULL, "Rotate CCW", map_rotate_ccw, data); + elm_menu_item_add(menu, NULL, NULL, "Reset Rotate", map_rotate_reset, data); + + elm_menu_move(menu, down->canvas.x, down->canvas.y); + evas_object_show(menu); + } +} + +static void +_map_mouse_move(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) +{ + Evas_Event_Mouse_Move *move = event_info; + Evas_Coord x, y, w, h; + float half_w, half_h; + int d, d_diff; + double cur_d; + if (!move) return; + + if (move->buttons == 2) + { + evas_object_geometry_get(data, &x, &y, &w, &h); + half_w = (float)w * 0.5; + half_h = (float)h * 0.5; + elm_map_rotate_get(data, &cur_d, NULL, NULL); + + d = move->cur.output.x - old_x; + if (!old_d) old_d = d; + else + { + d_diff = old_d - d; + if (d_diff > 0) + { + old_d --; + cur_d += 1.0; + } + else if (d_diff < 0) + { + old_d ++; + cur_d -= 1.0; + } + old_d = d; + elm_map_rotate_set(data, cur_d, x + half_w, y + half_h); + } + } +} + +static void +_map_mouse_up(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) +{ + Evas_Event_Mouse_Up *up = event_info; + if (!up) return; + + if (up->button == 2) + { + old_x = 0; + old_y = 0; + } +} + void test_map(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) { - Evas_Object *win, *bg, *map, *tb2, *bt, *bx, *en; + Evas_Object *win, *bg, *map; int idx = 0; win = elm_win_add(NULL, "map", ELM_WIN_BASIC); @@ -568,6 +659,12 @@ test_map(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __ _map_move_resize_cb, map); evas_object_event_callback_add(map, EVAS_CALLBACK_MOVE, _map_move_resize_cb, map); + evas_object_event_callback_add(map, EVAS_CALLBACK_MOUSE_DOWN, + _map_mouse_down, map); + evas_object_event_callback_add(map, EVAS_CALLBACK_MOUSE_MOVE, + _map_mouse_move, map); + evas_object_event_callback_add(map, EVAS_CALLBACK_MOUSE_UP, + _map_mouse_up, map); elm_map_marker_add(map, 2.352, 48.857, itc1, itc_group1, &data1); elm_map_marker_add(map, 2.355, 48.857, itc1, itc_group1, &data3); @@ -607,159 +704,6 @@ test_map(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __ evas_object_smart_callback_add(map, "name,loaded", my_map_name_loaded, map); evas_object_show(map); - - tb2 = elm_table_add(win); - evas_object_size_hint_weight_set(tb2, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - elm_win_resize_object_add(win, tb2); - - bt = elm_button_add(win); - elm_button_label_set(bt, "Z -"); - evas_object_smart_callback_add(bt, "clicked", my_bt_zoom_out, map); - evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(bt, 0.1, 0.1); - elm_table_pack(tb2, bt, 0, 0, 1, 1); - evas_object_show(bt); - - bt = elm_button_add(win); - elm_button_label_set(bt, "Z +"); - evas_object_smart_callback_add(bt, "clicked", my_bt_zoom_in, map); - evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(bt, 0.9, 0.1); - elm_table_pack(tb2, bt, 2, 0, 1, 1); - evas_object_show(bt); - - bx = elm_box_add(win); - evas_object_show(bx); - evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(bx, 0.5, 0.1); - elm_table_pack(tb2, bx, 1, 0, 1, 1); - - // - en = elm_scrolled_entry_add(win); - evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND, 0.0); - evas_object_size_hint_align_set(en, EVAS_HINT_FILL, 0.5); - elm_scrolled_entry_scrollbar_policy_set(en, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF); - elm_scrolled_entry_entry_set(en, NAME_ENTRY_TEXT); - elm_scrolled_entry_single_line_set(en, 1); - elm_box_pack_end(bx, en); - evas_object_smart_callback_add(en, "focused", my_map_entry_focused, win); - evas_object_smart_callback_add(en, "activated", my_map_entry_activated, map); - evas_object_show(en); - - // - bt = elm_button_add(win); - elm_button_label_set(bt, "Add 1000 markers"); - evas_object_smart_callback_add(bt, "clicked", my_bt_add, map); - evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(bt, 0.5, 0.1); - evas_object_show(bt); - elm_box_pack_end(bx, bt); - - bt = elm_button_add(win); - elm_button_label_set(bt, "remove 1000 markers"); - evas_object_smart_callback_add(bt, "clicked", my_bt_remove, map); - evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(bt, 0.5, 0.1); - evas_object_show(bt); - elm_box_pack_end(bx, bt); - // - - bt = elm_button_add(win); - elm_button_label_set(bt, "Show Seoul"); - evas_object_smart_callback_add(bt, "clicked", my_bt_show_reg, map); - evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(bt, 0.1, 0.5); - elm_table_pack(tb2, bt, 0, 1, 1, 1); - evas_object_show(bt); - - bt = elm_button_add(win); - elm_button_label_set(bt, "Bring Seoul"); - evas_object_smart_callback_add(bt, "clicked", my_bt_bring_reg, map); - evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(bt, 0.9, 0.5); - elm_table_pack(tb2, bt, 2, 1, 1, 1); - evas_object_show(bt); - - // - bx = elm_box_add(win); - evas_object_show(bx); - evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(bx, 0.1, 0.9); - elm_table_pack(tb2, bx, 0, 2, 1, 1); - - bt = elm_button_add(win); - elm_button_label_set(bt, "Pause On/Off"); - evas_object_smart_callback_add(bt, "clicked", my_bt_pause, map); - evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(bt, 0.1, 0.9); - evas_object_show(bt); - elm_box_pack_end(bx, bt); - - bt = elm_button_add(win); - elm_button_label_set(bt, "Markers pause On/Off"); - evas_object_smart_callback_add(bt, "clicked", my_bt_markers_pause, map); - evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(bt, 0.1, 0.9); - evas_object_show(bt); - elm_box_pack_end(bx, bt); - - bt = elm_button_add(win); - elm_button_label_set(bt, "R +"); - evas_object_smart_callback_add(bt, "clicked", my_bt_rotate_cw, map); - evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(bt, 0.1, 0.9); - evas_object_show(bt); - elm_box_pack_end(bx, bt); - - bt = elm_button_add(win); - elm_button_label_set(bt, "R -"); - evas_object_smart_callback_add(bt, "clicked", my_bt_rotate_ccw, map); - evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(bt, 0.1, 0.9); - evas_object_show(bt); - elm_box_pack_end(bx, bt); - // - - // - bx = elm_box_add(win); - evas_object_show(bx); - evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(bx, 0.5, 0.9); - elm_table_pack(tb2, bx, 1, 2, 1, 1); - - bt = elm_button_add(win); - elm_button_label_set(bt, "Fit"); - evas_object_smart_callback_add(bt, "clicked", my_bt_zoom_fit, map); - evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(bt, 0.5, 0.9); - evas_object_show(bt); - elm_box_pack_end(bx, bt); - - bt = elm_button_add(win); - elm_button_label_set(bt, "Fill"); - evas_object_smart_callback_add(bt, "clicked", my_bt_zoom_fill, map); - evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(bt, 0.5, 0.9); - evas_object_show(bt); - elm_box_pack_end(bx, bt); - // - - // - bx = elm_box_add(win); - evas_object_show(bx); - evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(bx, 1.0, 0.9); - elm_table_pack(tb2, bx, 2, 2, 1, 1); - - bt = elm_flipselector_add(win); - evas_object_size_hint_weight_set(bt, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - for (idx = 0; source_names[idx] ; idx++) - elm_flipselector_item_append(bt, source_names[idx], my_bt_source, map); - evas_object_show(bt); - elm_box_pack_end(bx, bt); - // - - evas_object_show(tb2); } evas_object_resize(win, 800, 800); diff --git a/src/lib/elm_map.c b/src/lib/elm_map.c index 84623b1..35a50f6 100644 --- a/src/lib/elm_map.c +++ b/src/lib/elm_map.c @@ -92,8 +92,8 @@ typedef struct _Name_Dump Name_Dump; #define NOMINATIM_ATTR_LON "lon" #define NOMINATIM_ATTR_LAT "lat" -#define PINCH_ZOOM_MIN 0.25 -#define PINCH_ZOOM_MAX 3.0 +#define PINCH_ZOOM_MIN 0.1 +#define PINCH_ZOOM_MAX 5.0 // Map sources // Currently the size of a tile must be 256*256 @@ -1625,13 +1625,6 @@ _mouse_down(void *data, Evas *evas __UNUSED__, Evas_Object *obj, void *event_inf Event *ev0; if (!wd) return; - if (ev->button == 2) - { - if (wd->wheel_timer) ecore_timer_del(wd->wheel_timer); - wd->wheel_timer = ecore_timer_add(0.35, _wheel_timer_cb, data); - return; - } - ev0 = get_event_object(data, 0); if (ev0) return; ev0 = create_event_object(data, obj, 0); @@ -1894,13 +1887,13 @@ _mouse_wheel_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, voi if (ev->z > 0) { wd->zoom_method = ZOOM_METHOD_OUT; - wd->wheel_zoom -= 0.1; + wd->wheel_zoom -= 0.05; if (wd->wheel_zoom <= PINCH_ZOOM_MIN) wd->wheel_zoom = PINCH_ZOOM_MIN; } else { wd->zoom_method = ZOOM_METHOD_IN; - wd->wheel_zoom += 0.1; + wd->wheel_zoom += 0.2; if (wd->wheel_zoom >= PINCH_ZOOM_MAX) wd->wheel_zoom = PINCH_ZOOM_MAX; } @@ -1909,6 +1902,9 @@ _mouse_wheel_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, voi wd->pinch.cy = y + half_h; if (wd->calc_job) ecore_job_del(wd->calc_job); wd->calc_job = ecore_job_add(_calc_job, wd); + + if (wd->wheel_timer) ecore_timer_del(wd->wheel_timer); + wd->wheel_timer = ecore_timer_add(0.35, _wheel_timer_cb, data); } -- 2.7.4