Looks good and better :) Please check warnings though. Thanks. Daniel Juyung Seo (SeoZ)
On Thu, May 5, 2011 at 12:01 AM, Enlightenment SVN < no-re...@enlightenment.org> wrote: > Log: > Elementary map: add elm_menu to test_map > > > Author: gouache > Date: 2011-05-04 08:01:07 -0700 (Wed, 04 May 2011) > New Revision: 59193 > Trac: http://trac.enlightenment.org/e/changeset/59193 > > Modified: > trunk/elementary/src/bin/test_map.c trunk/elementary/src/lib/elm_map.c > > Modified: trunk/elementary/src/bin/test_map.c > =================================================================== > --- trunk/elementary/src/bin/test_map.c 2011-05-04 14:11:12 UTC (rev 59192) > +++ trunk/elementary/src/bin/test_map.c 2011-05-04 15:01:07 UTC (rev 59193) > @@ -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 @@ > 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 @@ > } > > 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 @@ > } > > 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,52 +325,29 @@ > } > > static void > -my_bt_zoom_out(void *data, Evas_Object *obj __UNUSED__, void *event_info > __UNUSED__) > +map_rotate_reset(void *data, Evas_Object *obj __UNUSED__, void *event_info > __UNUSED__) > { > - double zoom; > + 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; > > - 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); > + elm_map_rotate_set(data, 0.0, x + half_w, y + half_h); > } > > static void > -my_bt_pause(void *data, Evas_Object *obj __UNUSED__, void *event_info > __UNUSED__) > +map_source(void *data, Evas_Object *obj __UNUSED__, void *event_info > __UNUSED__) > { > - elm_map_paused_set(data, !elm_map_paused_get(data)); > -} > + Map_Source *ms = 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)); > + if (!ms) return; > + elm_map_source_name_set(ms->map, ms->source_name); > } > > static void > -my_bt_zoom_fit(void *data, Evas_Object *obj __UNUSED__, void *event_info > __UNUSED__) > +map_marker_add(void *data) > { > - elm_map_zoom_mode_set(data, ELM_MAP_ZOOM_MODE_AUTO_FIT); > -} > - > -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); > -} > - > -static void > -my_bt_source(void *data, Evas_Object *obj __UNUSED__, void *event_info) > -{ > - Elm_Flipselector_Item *it; > - > - it = event_info; > - elm_map_source_name_set(data, elm_flipselector_item_label_get(it)); > -} > - > -static void > -my_bt_add(void *data, Evas_Object *obj __UNUSED__, void *event_info > __UNUSED__) > -{ > int i; > Elm_Map_Group_Class *g_clas; > Elm_Map_Marker_Class *m_clas; > @@ -394,7 +386,7 @@ > } > > 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 @@ > 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 @@ > _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 @@ > 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); > > Modified: trunk/elementary/src/lib/elm_map.c > =================================================================== > --- trunk/elementary/src/lib/elm_map.c 2011-05-04 14:11:12 UTC (rev 59192) > +++ trunk/elementary/src/lib/elm_map.c 2011-05-04 15:01:07 UTC (rev 59193) > @@ -92,8 +92,8 @@ > #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 @@ > 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 @@ > 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 @@ > 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); > } > > > > > > ------------------------------------------------------------------------------ > WhatsUp Gold - Download Free Network Management Software > The most intuitive, comprehensive, and cost-effective network > management toolset available today. Delivers lowest initial > acquisition cost and overall TCO of any competing solution. > http://p.sf.net/sfu/whatsupgold-sd > _______________________________________________ > enlightenment-svn mailing list > enlightenment-...@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/enlightenment-svn > ------------------------------------------------------------------------------ WhatsUp Gold - Download Free Network Management Software The most intuitive, comprehensive, and cost-effective network management toolset available today. Delivers lowest initial acquisition cost and overall TCO of any competing solution. http://p.sf.net/sfu/whatsupgold-sd _______________________________________________ enlightenment-devel mailing list enlightenment-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-devel