X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2FMoreOption.cpp;h=39bc951df20a2f594de5a94409b7b9dcc3d12165;hb=24f5f31a600ec6887592f2e6291e73c8a2161304;hp=7550d755d93398ad4ca8fc4619d17075c196a514;hpb=5798b48ceb06da18d6331298eb37cb41a39cbc1f;p=platform%2Fcore%2Fuifw%2Finputdelegator.git diff --git a/src/MoreOption.cpp b/src/MoreOption.cpp index 7550d75..39bc951 100755 --- a/src/MoreOption.cpp +++ b/src/MoreOption.cpp @@ -32,21 +32,145 @@ using namespace std; extern Evas_Object *g_setting_window; +static bool voice_input_back_agree = false; + +static void +popup_hide_cb(void *data, Evas_Object *obj, void *event_info) +{ + if (!obj) return; + elm_popup_dismiss(obj); +} + +static void +popup_hide_finished_cb(void *data, Evas_Object *obj, void *event_info) +{ + if (!obj) return; + evas_object_del(obj); +} + +static void voice_input_back_disagree_cb(void *data, Evas_Object *obj, void *event_info) +{ + if(!obj) return; + if(!data) return; + + VoiceData *voicedata = (VoiceData *)data; + Evas_Object *popup = (Evas_Object *)evas_object_data_get(obj, "popup"); + + voicedata->mo->discard_popup_opened = EINA_FALSE; + + if (popup) + elm_popup_dismiss(popup); +} + +static void voice_input_back_agree_cb(void *data, Evas_Object *obj, void *event_info) +{ + if(!obj) return; + if(!data) return; + + VoiceData *voicedata = (VoiceData *)data; + Evas_Object *popup = (Evas_Object *)evas_object_data_get(obj, "popup"); + + voicedata->mo->discard_popup_opened = EINA_FALSE; + + if (popup) + elm_popup_dismiss(popup); + + if(voicedata->naviframe){ + voice_input_back_agree = true; + + if(voicedata->disclaimer == 1){ + voicedata->disclaimer = 0; + elm_naviframe_item_pop_to(elm_naviframe_bottom_item_get(voicedata->naviframe)); + } else { + elm_naviframe_item_pop(voicedata->naviframe); + } + } +} + +static void show_discard_popup(void *data) +{ + if(!data) return; + + VoiceData *voicedata = (VoiceData *)data; + + Evas_Object *popup = NULL; + Evas_Object *layout = NULL; + Evas_Object *btn_popup = NULL; + Evas_Object *icon = NULL; + + std::string path = get_resource_path(); + + popup = elm_popup_add(voicedata->naviframe); + elm_object_style_set(popup, "circle"); +// uxt_popup_set_rotary_event_enabled(popup, EINA_TRUE); + eext_object_event_callback_add(popup, EEXT_CALLBACK_BACK, popup_hide_cb, NULL); + evas_object_smart_callback_add(popup, "dismissed", popup_hide_finished_cb, NULL); + evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + + layout = elm_layout_add(popup); + elm_layout_theme_set(layout, "layout", "popup", "content/circle/buttons2"); + elm_object_domain_translatable_part_text_set(layout, "elm.text", PACKAGE, "IDS_ST_SK_OK"); + elm_object_content_set(popup, layout); + evas_object_show(layout); + + btn_popup = elm_button_add(popup); + elm_object_style_set(btn_popup, "popup/circle/left"); + elm_object_part_content_set(popup, "button1", btn_popup); + elm_access_info_set(btn_popup, ELM_ACCESS_INFO, dgettext(PACKAGE, "IDS_ST_SK_OK")); + evas_object_smart_callback_add(btn_popup, "clicked", voice_input_back_disagree_cb, voicedata); + evas_object_data_set(btn_popup, "popup", popup); + evas_object_show(btn_popup); + + std::string path_ic_left = path + "/images/tw_ic_popup_btn_delete.png"; + icon = elm_image_add(btn_popup); + elm_image_file_set(icon, path_ic_left.c_str(), NULL); + evas_object_size_hint_weight_set(icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_part_content_set(btn_popup, "elm.swallow.content", icon); + evas_object_show(icon); + + btn_popup = elm_button_add(popup); + elm_object_style_set(btn_popup, "popup/circle/right"); + elm_access_info_set(btn_popup, ELM_ACCESS_INFO, dgettext(PACKAGE, "IDS_ST_SK_OK")); + elm_object_part_content_set(popup, "button2", btn_popup); + evas_object_smart_callback_add(btn_popup, "clicked", voice_input_back_agree_cb, voicedata); + evas_object_data_set(btn_popup, "popup", popup); + evas_object_show(btn_popup); + + std::string path_ic_right = path + "/images/tw_ic_popup_btn_check.png"; + icon = elm_image_add(btn_popup); + elm_image_file_set(icon, path_ic_right.c_str(), NULL); + evas_object_size_hint_weight_set(icon, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + elm_object_part_content_set(btn_popup, "elm.swallow.content", icon); + evas_object_show(icon); + + evas_object_show(popup); + + voicedata->mo->discard_popup_opened = EINA_TRUE; +} MoreOption::MoreOption(Evas_Object *naviframe, void* voicedata) : nf(naviframe) , more_option_layout(NULL) , item(NULL) , option_opened(EINA_FALSE) + , discard_popup_opened(EINA_FALSE) , voicedata(voicedata) { /** todo. implement constructor */ + voice_input_back_agree = false; } MoreOption::~MoreOption() { /** todo. implement destructor */ -// if(more_option_layout) -// evas_object_del(more_option_layout); + if(more_option_layout) + { + PRINTFUNC(DLOG_DEBUG, "del callbacks"); + evas_object_smart_callback_del(more_option_layout, "item,clicked", moreItemClicked); + evas_object_smart_callback_del(more_option_layout, "item,selected", moreItemSelected); + + evas_object_smart_callback_del(more_option_layout, "more,option,opened", moreOptionOpened); + evas_object_smart_callback_del(more_option_layout, "more,option,closed", moreOptionClosed); + } } void MoreOption::Create() { @@ -68,45 +192,15 @@ void MoreOption::AddLayout() { /** add layout */ more_option_layout = eext_more_option_add(nf); - if(!more_option_layout) + if(!more_option_layout){ PRINTFUNC(DLOG_ERROR, "It's failed to create layout"); + return; + } - evas_object_smart_callback_add(more_option_layout, "more,option,opened", - [](void *data, Evas_Object *obj, void *event_info){ - PRINTFUNC(DLOG_DEBUG, "more option is opened!!! \n"); - - if(!data) return; - - /** - * if more option is completed, stt have to be stopped. - * - */ - MoreOption *opt = (MoreOption *)data; - VoiceData *vd = (VoiceData *) opt->voicedata; - try { - if (vd->sttmanager->GetCurrent() == STT_STATE_RECORDING || - vd->sttmanager->GetCurrent() == STT_STATE_PROCESSING) { - vd->sttmanager->Cancel(); - } - } - catch(is::stt::SttException &e) { - PRINTFUNC(DLOG_ERROR, "%s", e.what()); - } - - opt->option_opened = EINA_TRUE; - }, this); - - evas_object_smart_callback_add(more_option_layout, "more,option,closed", - [](void *data, Evas_Object *obj, void *event_info){ - PRINTFUNC(DLOG_DEBUG, "more option is closed!!! \n"); - - MoreOption *opt = (MoreOption *)data; - VoiceData *vd = (VoiceData *) opt->voicedata; - - activate_circle_scroller_for_stt_textbox(vd, EINA_TRUE); + evas_object_smart_callback_add(more_option_layout, "more,option,opened", moreOptionOpened, this); + evas_object_smart_callback_add(more_option_layout, "more,option,closed", moreOptionClosed, this); - opt->option_opened = EINA_FALSE; - }, this); + hideCue(); evas_object_show(more_option_layout); } @@ -142,17 +236,8 @@ void MoreOption::SetContentLayout(Evas_Object *content) { vd->sttmanager->GetCurrent() == STT_STATE_READY) { PRINTFUNC(DLOG_DEBUG, "STT_STATE_CREATED || STT_STATE_READY\n"); - } else if (vd->sttmanager->GetCurrent() == STT_STATE_RECORDING) { - PRINTFUNC(DLOG_DEBUG, "STT_STATE_RECORDING\n"); - vd->effector->Stop(); - try{ - vd->sttmanager->Stop(); - }catch(is::stt::SttException &e){ - PRINTFUNC(DLOG_ERROR, "reason : %s", e.what()); - } - - } else if (vd->sttmanager->GetCurrent() == STT_STATE_PROCESSING) { - PRINTFUNC(DLOG_DEBUG, "STT_STATE_RECORDING\n"); + } else if (vd->sttmanager->GetCurrent() == STT_STATE_RECORDING || vd->sttmanager->GetCurrent() == STT_STATE_PROCESSING) { + PRINTFUNC(DLOG_DEBUG, "STT_STATE_RECORDING or STT_STATE_PROCESSING\n"); try{ vd->sttmanager->Cancel(); }catch(is::stt::SttException &e){ @@ -162,6 +247,10 @@ void MoreOption::SetContentLayout(Evas_Object *content) { } } + if (voice_input_back_agree == false && !is_textblock_empty(vd)){ + show_discard_popup(vd); + return EINA_FALSE; + } elm_naviframe_item_pop_to(elm_naviframe_bottom_item_get(vd->naviframe)); vd->disclaimer = 0; @@ -169,44 +258,37 @@ void MoreOption::SetContentLayout(Evas_Object *content) { powerUnlock(); _back_to_genlist_for_selector(); + destroy_voice(); + return EINA_TRUE; } - if(opt->option_opened == EINA_FALSE){ + if (opt->option_opened == EINA_FALSE){ PRINTFUNC(DLOG_DEBUG, "pop_cb called in STT view\n"); - if(vd->sttmanager){ + if (vd->sttmanager){ if (vd->sttmanager->GetCurrent() == STT_STATE_CREATED || vd->sttmanager->GetCurrent() == STT_STATE_READY) { PRINTFUNC(DLOG_DEBUG, "STT_STATE_CREATED || STT_STATE_READY\n"); - } else if (vd->sttmanager->GetCurrent() == STT_STATE_RECORDING) { - PRINTFUNC(DLOG_DEBUG, "STT_STATE_RECORDING\n"); - vd->effector->Stop(); - try{ - vd->sttmanager->Stop(); - }catch(is::stt::SttException &e){ - PRINTFUNC(DLOG_ERROR, "reason : %s", e.what()); - } - - } else if (vd->sttmanager->GetCurrent() == STT_STATE_PROCESSING) { - PRINTFUNC(DLOG_DEBUG, "STT_STATE_RECORDING\n"); + } else if (vd->sttmanager->GetCurrent() == STT_STATE_RECORDING || vd->sttmanager->GetCurrent() == STT_STATE_PROCESSING) { + PRINTFUNC(DLOG_DEBUG, "STT_STATE_RECORDING or STT_STATE_PROCESSING\n"); try{ vd->sttmanager->Cancel(); }catch(is::stt::SttException &e){ PRINTFUNC(DLOG_ERROR, "reason : %s", e.what()); } } + } - _back_to_genlist_for_selector(); - - destroy_voice(); - - return EINA_TRUE; - } else { - PRINTFUNC(DLOG_DEBUG, "naviframe transition, not finished\n"); + if (voice_input_back_agree == false && !is_textblock_empty(vd)){ + show_discard_popup(vd); return EINA_FALSE; } + + _back_to_genlist_for_selector(); + destroy_voice(); + return EINA_TRUE; } return EINA_FALSE; }, this); @@ -219,6 +301,8 @@ void MoreOption::Update() const char* display_lang = get_lang_label(lang); eext_more_option_item_part_text_set(item, "selector,sub_text", display_lang); + + showCue(); } Evas_Object* MoreOption::AddLanguageIcon(Evas_Object *parent) { @@ -257,18 +341,139 @@ void MoreOption::AddMorePage() { eext_more_option_item_part_content_set(item, "item,icon", img); - evas_object_smart_callback_add(more_option_layout, "item,clicked", - [](void *data, Evas_Object *obj, void *event_info) - { - PRINTFUNC(DLOG_DEBUG, "item,clicked"); - if(g_setting_window == NULL) - create_setting_window(obj); - }, NULL); + evas_object_smart_callback_add(more_option_layout, "item,clicked", moreItemClicked, NULL); + evas_object_smart_callback_add(more_option_layout, "item,selected", moreItemSelected , NULL); +} + +void MoreOption::moreOptionOpened(void *data, Evas_Object * obj, void *event_info) +{ + PRINTFUNC(DLOG_DEBUG, "more option is opened!!! \n"); + + if(!data) return; + + /** + * if more option is completed, stt have to be stopped. + * + */ + MoreOption *opt = (MoreOption *)data; + VoiceData *vd = (VoiceData *) opt->voicedata; + + if(vd && vd->setup_timer){ + ecore_timer_del(vd->setup_timer); + vd->setup_timer = NULL; + } - evas_object_smart_callback_add(more_option_layout, "item,selected", - [](void *data, Evas_Object *obj, void *event_info) + try { + if (vd && vd->sttmanager && (vd->sttmanager->GetCurrent() == STT_STATE_RECORDING || + vd->sttmanager->GetCurrent() == STT_STATE_PROCESSING)) { + vd->sttmanager->Cancel(); + } + } + catch(is::stt::SttException &e) { + PRINTFUNC(DLOG_ERROR, "%s", e.what()); + } + + // Clear guide text + if(vd && vd->layout_main){ + elm_object_signal_emit((Evas_Object *)vd->layout_main, "idle,state,text,hidden", "elm"); + } + + opt->option_opened = EINA_TRUE; +} + +void MoreOption::moreOptionClosed(void *data, Evas_Object * obj, void *event_info) +{ + PRINTFUNC(DLOG_DEBUG, "more option is closed!!! \n"); + + if (!data) return; + + MoreOption *opt = (MoreOption *)data; + VoiceData *vd = (VoiceData *) opt->voicedata; + + if (opt->option_opened == EINA_TRUE && is_textblock_empty(vd)) { + restart_listening(2.0); + } + + if (vd) + activate_circle_scroller_for_stt_textbox(vd, EINA_TRUE); + + opt->option_opened = EINA_FALSE; +} + +void MoreOption::moreItemClicked(void *data, Evas_Object * obj, void *event_info) +{ + PRINTFUNC(DLOG_DEBUG, "item,clicked"); + if(g_setting_window == NULL) + create_setting_window(obj); +} + +void MoreOption::moreItemSelected(void *data, Evas_Object * obj, void *event_info) +{ + PRINTFUNC(DLOG_DEBUG, "item,selected"); + if(!obj) return; + + Eext_Object_Item *selected_item = (Eext_Object_Item *)event_info; + + //for custom accessibility + if (elm_config_access_get()) { - PRINTFUNC(DLOG_DEBUG, "item,selected"); - }, NULL); + Evas_Object *panel = elm_object_part_content_get(obj, "elm.swallow.right"); + if (!panel) return; + + Evas_Object *rotary_selector = elm_object_content_get(panel); + if (!rotary_selector) return; + + Evas_Object *content = (Evas_Object *)edje_object_part_object_get(elm_layout_edje_get(rotary_selector), "content"); + if (!content) return; + + Evas_Object *content_access = elm_access_object_get(content); + if (!content_access) return; + + if (eext_more_option_item_part_text_get(selected_item, "selector,main_text")) + { + std::string text; + text = text + std::string(gettext("WDS_IME_HEADER_INPUT_LANGUAGES_ABB")) + " "; + + if(eext_more_option_item_part_text_get(selected_item, "selector,sub_text")) + text = text + std::string(eext_more_option_item_part_text_get(selected_item, "selector,sub_text")); + + elm_access_info_set(content_access, ELM_ACCESS_INFO, text.c_str()); + } + } +} + +void MoreOption::hideCue() +{ + Evas_Object *panel_right = NULL; + if (!more_option_layout) { + PRINTFUNC(DLOG_ERROR, "more_option_layout == NULL"); + return; + } + + panel_right = elm_object_part_content_get(more_option_layout, "elm.swallow.right"); + if (!panel_right) { + PRINTFUNC(DLOG_ERROR, "panel_right == NULL"); + return; + } + + elm_object_signal_emit(panel_right, "cue,hide", "elm"); +} + +void MoreOption::showCue() +{ + Evas_Object *panel_right = NULL; + + if (!more_option_layout) { + PRINTFUNC(DLOG_ERROR, "more_option_layout == NULL"); + return; + } + + panel_right = elm_object_part_content_get(more_option_layout, "elm.swallow.right"); + if (!panel_right) { + PRINTFUNC(DLOG_ERROR, "panel_right == NULL"); + return; + } + + elm_object_signal_emit(panel_right, "cue,show", "elm"); }