rimmed pushed a commit to branch master. http://git.enlightenment.org/tools/eflete.git/commit/?id=49b53dbecf3b8129e318639258b207bfbcb36411
commit 49b53dbecf3b8129e318639258b207bfbcb36411 Author: Mykyta Biliavskyi <[email protected]> Date: Wed Oct 26 09:44:13 2016 +0300 Main window: support ability to change default shortcuts. --- src/bin/ui/main_window.c | 243 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 174 insertions(+), 69 deletions(-) diff --git a/src/bin/ui/main_window.c b/src/bin/ui/main_window.c index f906466..f90ec20 100644 --- a/src/bin/ui/main_window.c +++ b/src/bin/ui/main_window.c @@ -159,18 +159,18 @@ ui_main_window_add(void) ap.property.demo = property_add(ap.win, PROPERTY_MODE_DEMO); elm_object_part_content_set(ap.panes.right, "right", ap.property.group); - ap.menu = ui_menu_add(); - - #ifdef HAVE_ENVENTOR - ap.enventor= enventor_object_init(ap.win); - #endif /* HAVE_ENVENTOR */ - if (!shortcuts_init()) { CRIT("Can't initialize the shortcut module"); return false; } + ap.menu = ui_menu_add(); + + #ifdef HAVE_ENVENTOR + ap.enventor= enventor_object_init(ap.win); + #endif /* HAVE_ENVENTOR */ + elm_config_window_auto_focus_enable_set(false); return true; } @@ -311,60 +311,163 @@ shortcuts_window_add(void) return NULL; } #else + +typedef struct { + const char *combination; + const char *description; + Shortcut_Type type; +} Shortcut_Data; + +static void +_shortcut_change_request(void *data, + Evas *e __UNUSED__, + Evas_Object *obj, + void *event) +{ + Evas_Event_Key_Up *ev = (Evas_Event_Key_Up *)event; + Shortcut_Data *sc = (Shortcut_Data *)data; + Eina_Bool result = false; + + result = shortcuts_shortcut_new_set(sc->type, ev); + if (result) + { + elm_layout_signal_emit(obj, "hover,hide", "eflete"); + } + else + { + elm_layout_text_set(obj, "elm.text", _("Sequence already binded.")); + elm_layout_signal_emit(obj, "hover,wrong", "eflete"); + } + Evas_Object *genlist = elm_layout_content_get(obj, "elm.swallow.content"); + elm_genlist_realized_items_update(genlist); + evas_object_event_callback_del(obj, EVAS_CALLBACK_KEY_UP, _shortcut_change_request); + shortcuts_disabled_set(false); +} + +static void +_change_shortcut(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Shortcut_Data *sc = (Shortcut_Data *)data; + Evas_Object *layout = evas_object_data_get(obj, "layout"); + + shortcuts_disabled_set(true); + elm_layout_signal_emit(layout, "hover,show", "eflete"); + elm_layout_text_set(layout, "elm.text", _("Please press key sequence")); + evas_object_event_callback_add(layout, EVAS_CALLBACK_KEY_UP, _shortcut_change_request, sc); + +} + +static void +_reset_shortcut(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) +{ + Popup_Button btn_res = (Popup_Button) event_info; + if (btn_res == BTN_RESET) + { + shortcuts_shortcut_reset(); + } +} + static char * _label_get(void *data, Evas_Object *obj __UNUSED__, const char *pr __UNUSED__) { - return strdup((char *)data); + if (!pr) return strdup(" "); + if (!strcmp(pr, "combination.text")) + { + Shortcut_Data *sc = (Shortcut_Data *)data; + const char *text = shortcuts_shortcut_combination_get(sc->type); + return text != NULL ? strdup(text) : strdup("NONE"); + } + else if (!strcmp(pr, "description.text")) + { + Shortcut_Data *sc = (Shortcut_Data *)data; + return strdup(sc->description); + return sc->description != NULL ? strdup(sc->description) : strdup("NONE"); + } + else if (!strcmp(pr, "elm.text")) + { + return data != NULL ? strdup((char *)data) : strdup(" "); + } + return strdup(" "); } + static Evas_Object * -_shortcuts_window_content_get(void *data, Evas_Object *popup __UNUSED__, Evas_Object **to_focus __UNUSED__) +_content_get(void *data __UNUSED__, Evas_Object *obj, const char *pr __UNUSED__) { - Evas_Object *box = data; - static const char *global_hotkeys[] = { - "F1 - show shortcuts list (this dialog)", - "F2 - normal mode", - "F3 - code mode", - "F4 - demo mode", - "F7 - open image manager", - "F8 - open sound manager", - "F9 - open style manager", - "F10 - open colorclass manager", - "ctrl + q - quit", - NULL}; - static const char *workspace_hotkeys[] = { - "ctrl + s - save", - "ctrl + z - undo", - "ctrl + y - redo", - "ctrl + n - add new group", - "q - add new part", - "w - add new state", - "e - add new item", - "r - add new program", - "t - add new data item", - "del - delete selected part/state/item/etc", - "s - select next state of active part", - "z - select prev part", - "x - select next part", - "ESC - unselect", - "o - show/hide object area", - "ctrl + wheel_up/KP_ADD - zoom in", - "ctrl + wheel_down/KP_SUB - zoom out", - "KP_DIV - set zoom to 100%", - NULL}; - static const char *tabs_hotkeys[] = { - "ctrl + w - close tab", - "ctrl + num - switch to tab 1-10", - "tab/ctrl + pg_down - switch to next tab", - "shift + tab / ctrl + pg_up - switch to prev tab", - NULL}; - - static const char *popup_hotkeys[] = { - "Enter - OK", - "ESC - cancel", - NULL}; + if (!pr) return NULL; + if (!strcmp(pr, "change.button")) + { + Evas_Object *change_button = elm_button_add(obj); + Evas_Object *layout = efl_parent_get(obj); + evas_object_data_set(change_button, "layout", layout); + elm_object_style_set(change_button, "edit"); + evas_object_smart_callback_add(change_button, "clicked", _change_shortcut, data); + return change_button; + } + return NULL; +} +static const Shortcut_Data global_hotkeys[] = { + {NULL, "Show shortcuts list", SHORTCUT_TYPE_HELP}, + {NULL, "Normal mode", SHORTCUT_TYPE_MODE_NORMAL}, + {NULL, "Code mode", SHORTCUT_TYPE_MODE_CODE}, + {NULL, "Demo mode", SHORTCUT_TYPE_MODE_DEMO}, + {NULL, "Open image manager", SHORTCUT_TYPE_TAB_IMAGE_MANAGER}, + {NULL, "Open sound manager", SHORTCUT_TYPE_TAB_SOUND_MANAGER}, + {NULL, "Open style manager", SHORTCUT_TYPE_TAB_STYLE_MANAGER}, + {NULL, "Open colorclass manager", SHORTCUT_TYPE_TAB_COLOR_CLASS_MANAGER}, + {NULL, "Quit", SHORTCUT_TYPE_QUIT}, + {NULL, NULL, SHORTCUT_TYPE_NONE} +}; +static const Shortcut_Data workspace_hotkeys[] = { + {NULL, "Save", SHORTCUT_TYPE_SAVE}, + {NULL, "Undo", SHORTCUT_TYPE_UNDO}, + {NULL, "Redo", SHORTCUT_TYPE_REDO}, + {NULL, "Add new group",SHORTCUT_TYPE_ADD_GROUP}, + {NULL, "Add new part", SHORTCUT_TYPE_ADD_PART}, + {NULL, "Add new state",SHORTCUT_TYPE_ADD_STATE}, + {NULL, "Add new item", SHORTCUT_TYPE_ADD_ITEM}, + {NULL, "Add new program", SHORTCUT_TYPE_ADD_PROGRAM}, + {NULL, "Add new data item",SHORTCUT_TYPE_ADD_DATA_ITEM}, + {NULL, "Delete selected part/state/item/etc",SHORTCUT_TYPE_DEL}, + {NULL, "Select next state of active part", SHORTCUT_TYPE_STATE_NEXT}, + {NULL, "Select prev part",SHORTCUT_TYPE_PART_PREV}, + {NULL, "Select next part", SHORTCUT_TYPE_PART_NEXT}, + {NULL, "Unselect", SHORTCUT_TYPE_CANCEL}, + {NULL, "Show/hide object area", SHORTCUT_TYPE_OBJECT_AREA}, + {NULL, "Zoom in", SHORTCUT_TYPE_ZOOM_IN}, + {NULL, "Zoom out", SHORTCUT_TYPE_ZOOM_OUT}, + {NULL, "Set zoom to 100%", SHORTCUT_TYPE_ZOOM_RESET}, + {NULL, NULL, SHORTCUT_TYPE_NONE} +}; + +static const Shortcut_Data tabs_hotkeys[] = { + {NULL,"Close tab", SHORTCUT_TYPE_TAB_CLOSE}, + {NULL,"Switch to tab 1 ", SHORTCUT_TYPE_TAB_NUM1 }, + {NULL,"Switch to tab 2 ", SHORTCUT_TYPE_TAB_NUM2 }, + {NULL,"Switch to tab 3 ", SHORTCUT_TYPE_TAB_NUM3 }, + {NULL,"Switch to tab 4 ", SHORTCUT_TYPE_TAB_NUM4 }, + {NULL,"Switch to tab 5 ", SHORTCUT_TYPE_TAB_NUM5 }, + {NULL,"Switch to tab 6 ", SHORTCUT_TYPE_TAB_NUM6 }, + {NULL,"Switch to tab 7 ", SHORTCUT_TYPE_TAB_NUM7 }, + {NULL,"Switch to tab 8 ", SHORTCUT_TYPE_TAB_NUM8 }, + {NULL,"Switch to tab 9 ", SHORTCUT_TYPE_TAB_NUM9 }, + {NULL,"Switch to tab 10", SHORTCUT_TYPE_TAB_NUM10}, + {NULL,"Switch to next tab", SHORTCUT_TYPE_TAB_NEXT}, + {NULL,"Switch to prev tab", SHORTCUT_TYPE_TAB_PREV}, + {NULL, NULL, SHORTCUT_TYPE_NONE} +}; + +static const Shortcut_Data popup_hotkeys[] = { + {NULL,"Ok", SHORTCUT_TYPE_DONE}, + {NULL,"Cancel", SHORTCUT_TYPE_CANCEL }, + {NULL, NULL, SHORTCUT_TYPE_NONE} +}; +static Evas_Object * +_shortcuts_window_content_get(void *data, Evas_Object *popup __UNUSED__, Evas_Object **to_focus __UNUSED__) +{ + Evas_Object *box = data; Evas_Object *genlist = elm_genlist_add(ap.win); Elm_Genlist_Item_Class *group_itc = elm_genlist_item_class_new(); group_itc->item_style = "group_index"; @@ -373,54 +476,54 @@ _shortcuts_window_content_get(void *data, Evas_Object *popup __UNUSED__, Evas_Ob Elm_Genlist_Item_Class *shortcut_itc = elm_genlist_item_class_new(); shortcut_itc->item_style = "shortcuts"; shortcut_itc->func.text_get = _label_get; + shortcut_itc->func.content_get = _content_get; Elm_Genlist_Item_Class *empty_itc = elm_genlist_item_class_new(); empty_itc->item_style = "empty"; int i = 0; Elm_Object_Item *global_group = elm_genlist_item_append(genlist, group_itc, strdup("Global"), - NULL, ELM_GENLIST_ITEM_GROUP, NULL, NULL); - for (i = 0; global_hotkeys[i] != NULL; i++) + NULL, ELM_GENLIST_ITEM_GROUP, NULL, NULL); + for (i = 0; global_hotkeys[i].type != SHORTCUT_TYPE_NONE; i++) { - elm_genlist_item_append(genlist, shortcut_itc, global_hotkeys[i], - global_group , ELM_GENLIST_ITEM_NONE, NULL, NULL); + elm_genlist_item_append(genlist, shortcut_itc, &global_hotkeys[i], + global_group , ELM_GENLIST_ITEM_NONE, NULL, NULL); } elm_genlist_item_append(genlist, empty_itc, NULL, global_group , ELM_GENLIST_ITEM_NONE, NULL, NULL); Elm_Object_Item *workspace_group = elm_genlist_item_append(genlist, group_itc, strdup("Workspace"), - NULL, ELM_GENLIST_ITEM_GROUP, NULL, NULL); - for (i = 0; workspace_hotkeys[i] != NULL; i++) + NULL, ELM_GENLIST_ITEM_GROUP, NULL, NULL); + for (i = 0; workspace_hotkeys[i].type != SHORTCUT_TYPE_NONE; i++) { - elm_genlist_item_append(genlist, shortcut_itc, workspace_hotkeys[i], - workspace_group, ELM_GENLIST_ITEM_NONE, NULL, NULL); + elm_genlist_item_append(genlist, shortcut_itc, &workspace_hotkeys[i], + workspace_group, ELM_GENLIST_ITEM_NONE, NULL, NULL); } elm_genlist_item_append(genlist, empty_itc, NULL, workspace_group , ELM_GENLIST_ITEM_NONE, NULL, NULL); Elm_Object_Item *tabs_group = elm_genlist_item_append(genlist, group_itc, strdup("Tabs"), - NULL, ELM_GENLIST_ITEM_GROUP, NULL, NULL); - for (i = 0; tabs_hotkeys[i] != NULL; i++) + NULL, ELM_GENLIST_ITEM_GROUP, NULL, NULL); + for (i = 0; tabs_hotkeys[i].type != SHORTCUT_TYPE_NONE; i++) { - elm_genlist_item_append(genlist, shortcut_itc, tabs_hotkeys[i], - tabs_group, ELM_GENLIST_ITEM_NONE, NULL, NULL); + elm_genlist_item_append(genlist, shortcut_itc, &tabs_hotkeys[i], + tabs_group, ELM_GENLIST_ITEM_NONE, NULL, NULL); } elm_genlist_item_append(genlist, empty_itc, NULL, tabs_group , ELM_GENLIST_ITEM_NONE, NULL, NULL); Elm_Object_Item *popup_group = elm_genlist_item_append(genlist, group_itc, strdup("Popup"), - NULL, ELM_GENLIST_ITEM_GROUP, NULL, NULL); - for (i = 0; popup_hotkeys[i] != NULL; i++) + NULL, ELM_GENLIST_ITEM_GROUP, NULL, NULL); + for (i = 0; popup_hotkeys[i].type != SHORTCUT_TYPE_NONE; i++) { - elm_genlist_item_append(genlist, shortcut_itc, popup_hotkeys[i], - popup_group, ELM_GENLIST_ITEM_NONE, NULL, NULL); + elm_genlist_item_append(genlist, shortcut_itc, &popup_hotkeys[i], + popup_group, ELM_GENLIST_ITEM_NONE, NULL, NULL); } elm_genlist_item_append(genlist, empty_itc, NULL, popup_group , ELM_GENLIST_ITEM_NONE, NULL, NULL); - evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_show(genlist); @@ -437,10 +540,12 @@ Evas_Object * shortcuts_window_add(void) { Evas_Object *content = elm_box_add(ap.win); + Evas_Object *popup = NULL; evas_object_size_hint_min_set(content, 400, 460); - popup_add(_("Help: shortcuts"), NULL, BTN_OK, _shortcuts_window_content_get, content); + popup = popup_add(_("Help: shortcuts"), NULL, BTN_OK | BTN_RESET, _shortcuts_window_content_get, content); + evas_object_smart_callback_add(popup, POPUP_CLOSE_CB, _reset_shortcut, NULL); return NULL; } #endif --
