Languages

Menu
Sites
Language
more option 관련해서...

안녕하세요... 

BasicUIApplication sample 에서

more option 과 rotary 를 혼합하여 테스트 중 입니다.

1) more option 을 누르기 전 : 베젤을 좌,우로 움직이면 eext_rotary_object_event_callback_add 에서

                                                 정의된 Eext_Rotary_Event_Cb로 이벤트를 받을 수 있었습니다.

2) more option 을 누른 후 : back 버튼 누른 후 다시 1번과 동일하게 베젤을 좌,우로 이동 시 정의된 Eext_Rotary_Event_Cb로 이벤트가  오지않으며,

                                                 오직,,,more option 상태에서만 Eext_Rotary_Event_Cb로 이벤트가 받아지고 있습니다.

위 같이  eext_more_option_add 와 eext_rotary_object_event_callback_add 을 같이 사용하여,

more option을 누른 후에도 more option의 item을 베젤을 통해 이벤트를 받고 싶으며,

또한, more option이 아닌 경우에도 베젤을 통해 이벤트를 받고 싶습니다.  방법 좀 부탁드립니다.....

혹여, 제가 테스트 했던 소스를 붙여 보도록 하겠습니다.

static void
create_base_gui(appdata_s *ad)
{
 char edj_path[PATH_MAX] = {0, };

 /* Window */
 ad->win = elm_win_util_standard_add(PACKAGE, PACKAGE);
 elm_win_conformant_set(ad->win, EINA_TRUE);
 elm_win_autodel_set(ad->win, EINA_TRUE);

 if (elm_win_wm_rotation_supported_get(ad->win)) {
  int rots[4] = { 0, 90, 180, 270 };
  elm_win_wm_rotation_available_rotations_set(ad->win, (const int *)(&rots), 4);
 }

 evas_object_smart_callback_add(ad->win, "delete,request", win_delete_request_cb, NULL);

 /* Conformant */
 ad->conform = elm_conformant_add(ad->win);
 elm_win_indicator_mode_set(ad->win, ELM_WIN_INDICATOR_SHOW);
 elm_win_indicator_opacity_set(ad->win, ELM_WIN_INDICATOR_OPAQUE);
 evas_object_size_hint_weight_set(ad->conform, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
 elm_win_resize_object_add(ad->win, ad->conform);
 evas_object_show(ad->conform);
 evas_object_show(ad->win);

 ad->circle_surface = eext_circle_surface_conformant_add(ad->conform);
 ad->layout = elm_layout_add(ad->conform);
 elm_layout_theme_set(ad->layout, "layout", "application", "default");
 evas_object_size_hint_weight_set(ad->layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
 evas_object_show(ad->layout);
 elm_object_content_set(ad->conform, ad->layout);

 ad->nf = elm_naviframe_add(ad->layout);
 elm_object_part_content_set(ad->layout, "elm.swallow.content", ad->nf);
 evas_object_show(ad->nf);

 app_get_resource(EDJ_FILE, edj_path, (int)PATH_MAX);
 ad->layout = elm_layout_add(ad->win);
 elm_layout_file_set(ad->layout, edj_path, "main");
 evas_object_size_hint_weight_set(ad->layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
 eext_object_event_callback_add(ad->layout, EEXT_CALLBACK_BACK, layout_back_cb, ad);
 evas_object_show(ad->layout);
 elm_object_part_text_set(ad->layout, "main.view.title", "Hello EFL");
 elm_object_content_set(ad->layout, ad->nf);

 Evas_Object *more_option = eext_more_option_add(ad->layout);
 for (int i = 0; i < 16; ++i) {
  if (i == 0)
   _creat_page(more_option, i);
  else
   _creat_page(more_option, i);
 }
 elm_object_part_content_set(ad->layout, "main.view.more", more_option);
 elm_naviframe_item_push(ad->nf , "More Option Demo", NULL, NULL, ad->layout, "empty");

 rotary_init(ad);
}

void
rotary_init(appdata_s *ad)
{
 eext_rotary_object_event_callback_add(ad->layout, _rotary_cb, ad);

 eext_rotary_object_event_activated_set(ad->layout, EINA_TRUE);
}

Edited by: na on 10 Mar, 2016

Responses

2 Replies
woochan lee

안녕하세요.

 

more_option 이 open된 상태에서 Back동작을 수행하여 이전 화면으로 전환시

rotary event callback이 전달되지 않는 이유는 more_option내부에서 rotary event 동작을 하였기 때문입니다.

 

위에 코드에서 최초 roatry event를 받는 주체가 된다고 명시하실때 사용하신 API ( eext_rotary_object_event_activated_set(ad->layout, EINA_TRUE);)

를 more option이 close 되는 시점에 다시 호출해주시면 정상 동작 할 것으로 보입니다.

 

evas_object_smart_callback_add(more_option, "more,option,closed", _more_option_close_cb, ad);

위와 같은 callback을 등록하여 more option이 close 되는 시점을 알 수 있습니다.

 

콜백 함수는 아래와 같이 구현하시면 될 것 같네요.

static void
_more_option_close_cb(void *data, Evas_Object *obj, void *event_info)
{
    appdata_s *ad = data;
    eext_rotary_object_event_activated_set(ad->layout, EINA_TRUE);
}

 

아 그리고 코드에서 몇가지 의도하지 않으신것 같은 내용이 보이는데요.

 ad->layout = elm_layout_add(ad->conform);

 ad->layout = elm_layout_add(ad->win);

첫번째 layout은 base_layout으로 이름이 변경되어야 할 것 같습니다.

 

 elm_object_part_content_set(ad->layout, "elm.swallow.content", ad->nf);

 elm_object_content_set(ad->layout, ad->nf);

첫번째 layout에 naviframe을 넣고 두번째 layout에도 naviframe을 넣는다는 구현인데 어색합니다.

두번째 content_set API의 인자 순서가 바뀐건 아닌지...  행여나 의도하신 내용이라도 

나중에 복잡한 앱이 되었을때 디버깅에 고생하시는 일이 발생 할 수도 있어 첨언 드립니다. 

na

정상적으로 동작되는것을 확인하였습니다.

바쁘신 와중에서도 좋은 답변 주셔서 감사합니다.