From a10c4aacb664e6cec0bb6cf6a09a833151ef1caf Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Thu, 8 Jun 2017 18:31:45 -0700 Subject: [PATCH] ui: Speed up screen load and remember current tab This is a pretty simple type of backgrounding - only load files for tabs as they become visible :) --- src/bin/edi_config.c | 9 ++- src/bin/edi_config.h | 5 +- src/bin/edi_main.c | 11 ++- src/bin/editor/edi_editor.c | 4 +- src/bin/mainview/edi_mainview.c | 101 +++++++++++++++++++++------ src/bin/mainview/edi_mainview.h | 2 + src/bin/mainview/edi_mainview_item.h | 3 +- src/lib/edi_path.h | 1 + 8 files changed, 109 insertions(+), 27 deletions(-) diff --git a/src/bin/edi_config.c b/src/bin/edi_config.c index 20ef53c..93339bd 100644 --- a/src/bin/edi_config.c +++ b/src/bin/edi_config.c @@ -132,6 +132,7 @@ _edi_project_config_cb_free(void) EINA_LIST_FREE(_edi_project_config->tabs, tab) { if (tab->path) eina_stringshare_del(tab->path); + if (tab->type) eina_stringshare_del(tab->type); free(tab); } @@ -231,6 +232,7 @@ _edi_config_init(void) #define T Edi_Project_Config_Tab #define D _edi_proj_cfg_tab_edd EDI_CONFIG_VAL(D, T, path, EET_T_STRING); + EDI_CONFIG_VAL(D, T, type, EET_T_STRING); EDI_CONFIG_VAL(D, T, windowed, EET_T_UCHAR); _edi_proj_cfg_edd = EDI_CONFIG_DD_NEW("Project_Config", Edi_Project_Config); @@ -256,6 +258,7 @@ _edi_config_init(void) EDI_CONFIG_VAL(D, T, gui.tab_inserts_spaces, EET_T_UCHAR); EDI_CONFIG_LIST(D, T, tabs, _edi_proj_cfg_tab_edd); + EDI_CONFIG_VAL(D, T, current_tab, EET_T_UINT); EDI_CONFIG_VAL(D, T, launch.path, EET_T_STRING); EDI_CONFIG_VAL(D, T, launch.args, EET_T_STRING); @@ -499,7 +502,8 @@ _edi_project_config_save() } void -_edi_project_config_tab_add(const char *path, Eina_Bool windowed) +_edi_project_config_tab_add(const char *path, const char *type, + Eina_Bool windowed) { Edi_Project_Config_Tab *tab; Eina_List *list, *next; @@ -518,6 +522,7 @@ _edi_project_config_tab_add(const char *path, Eina_Bool windowed) else tab->path = eina_stringshare_add(path); + tab->type = eina_stringshare_add(type); tab->windowed = windowed; _edi_project_config->tabs = eina_list_append(_edi_project_config->tabs, tab); _edi_project_config_save_no_notify(); @@ -542,5 +547,7 @@ _edi_project_config_tab_remove(const char *path) _edi_project_config_save_no_notify(); eina_stringshare_del(tab->path); + if (tab->type) + eina_stringshare_del(tab->type); free(tab); } diff --git a/src/bin/edi_config.h b/src/bin/edi_config.h index b8e42cd..249f0b6 100644 --- a/src/bin/edi_config.h +++ b/src/bin/edi_config.h @@ -48,6 +48,7 @@ struct _Edi_Config struct _Edi_Project_Config_Tab { const char *path; + const char *type; Eina_Bool windowed; }; @@ -81,6 +82,7 @@ struct _Edi_Project_Config } gui; Eina_List *tabs; + unsigned int current_tab; Edi_Project_Config_Launch launch; Eina_Stringshare *user_fullname; Eina_Stringshare *user_email; @@ -111,7 +113,8 @@ const char* _edi_config_mime_search(const char *mime); void _edi_project_config_load(void); void _edi_project_config_save(void); -void _edi_project_config_tab_add(const char *path, Eina_Bool windowed); +void _edi_project_config_tab_add(const char *path, const char *type, + Eina_Bool windowed); void _edi_project_config_tab_remove(const char *path); #ifdef __cplusplus diff --git a/src/bin/edi_main.c b/src/bin/edi_main.c index cb66905..6f3a6fd 100644 --- a/src/bin/edi_main.c +++ b/src/bin/edi_main.c @@ -1262,6 +1262,7 @@ void _edi_open_tabs() { Edi_Project_Config_Tab *tab; + Edi_Path_Options *options; Eina_List *tabs, *list; char *path; @@ -1274,10 +1275,13 @@ _edi_open_tabs() else path = edi_path_append(edi_project_get(), tab->path); + options = edi_path_options_create(path); + options->type = eina_stringshare_add(tab->type); + options->background = EINA_TRUE; if (tab->windowed) - edi_mainview_open_window_path(eina_stringshare_add(path)); + edi_mainview_open_window(options); else - edi_mainview_open_path(eina_stringshare_add(path)); + edi_mainview_open(options); free(path); } @@ -1285,6 +1289,9 @@ _edi_open_tabs() { free(tab); } + + if (_edi_project_config->current_tab != 0) + edi_mainview_tab_select(_edi_project_config->current_tab); } static void diff --git a/src/bin/editor/edi_editor.c b/src/bin/editor/edi_editor.c index afab1c5..d7a8e10 100644 --- a/src/bin/editor/edi_editor.c +++ b/src/bin/editor/edi_editor.c @@ -1159,9 +1159,9 @@ edi_editor_add(Evas_Object *parent, Edi_Mainview_Item *item) (void)!evas_object_key_grab(widget, "g", ctrl, shift | alt, 1); (void)!evas_object_key_grab(widget, "space", ctrl, shift | alt, 1); - evas_object_data_set(vbox, "editor", editor); + evas_object_data_set(item->view, "editor", editor); ev_handler = ecore_event_handler_add(EDI_EVENT_CONFIG_CHANGED, _edi_editor_config_changed, widget); - evas_object_event_callback_add(vbox, EVAS_CALLBACK_DEL, _editor_del_cb, ev_handler); + evas_object_event_callback_add(item->view, EVAS_CALLBACK_DEL, _editor_del_cb, ev_handler); if (edi_language_provider_has(editor)) { diff --git a/src/bin/mainview/edi_mainview.c b/src/bin/mainview/edi_mainview.c index 6652376..c088435 100644 --- a/src/bin/mainview/edi_mainview.c +++ b/src/bin/mainview/edi_mainview.c @@ -37,14 +37,30 @@ edi_mainview_item_current_get() EINA_LIST_FOREACH(_edi_mainview_items, item, it) { if (it && it->view == _current_view) - { - return it; - } + return it; } return NULL; } +unsigned int +edi_mainview_item_current_tab_get() +{ + Eina_List *item; + Edi_Mainview_Item *it; + unsigned int i = 0; + + EINA_LIST_FOREACH(_edi_mainview_items, item, it) + { + if (!it->win) + i++; + if (it && it->view == _current_view) + break; + } + + return i; +} + static void _edi_mainview_view_show(Evas_Object *view) { @@ -101,7 +117,6 @@ edi_mainview_item_next() EINA_LIST_FOREACH(_edi_mainview_items, item, it) { - if (it && open_next) { edi_mainview_item_select(it); @@ -113,6 +128,44 @@ edi_mainview_item_next() } } +void +edi_mainview_tab_select(unsigned int id) +{ + Eina_List *item; + Edi_Mainview_Item *it; + unsigned int i = 0; + + EINA_LIST_FOREACH(_edi_mainview_items, item, it) + { + if (!it->win) + i++; + if (i == id) + edi_mainview_item_select(it); + } +} + +static void +_content_load(Edi_Mainview_Item *item) +{ + Edi_Content_Provider *provider; + Evas_Object *child; + + provider = edi_content_provider_for_id_get(item->editortype); + if (!provider) + { + ERR("No content provider found for type %s", item->editortype); + return; + } + child = provider->content_ui_add(item->container, item); + + evas_object_size_hint_weight_set(child, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(child, EVAS_HINT_FILL, EVAS_HINT_FILL); + elm_box_pack_end(item->container, child); + evas_object_show(child); + + item->loaded = EINA_TRUE; +} + void edi_mainview_item_select(Edi_Mainview_Item *item) { @@ -134,11 +187,16 @@ edi_mainview_item_select(Edi_Mainview_Item *item) total_w += w; } + if (!item->loaded) + _content_load(item); + _edi_mainview_view_show(item->view); elm_object_signal_emit(item->tab, "mouse,down,1", "base"); evas_object_geometry_get(item->tab, NULL, NULL, &tabw, NULL); elm_scroller_region_bring_in(_tab_scroller, region_x, 0, tabw, 0); + _edi_project_config->current_tab = edi_mainview_item_current_tab_get(); + _edi_project_config_save(); } ecore_event_add(EDI_EVENT_TAB_CHANGED, NULL, NULL, NULL); @@ -193,7 +251,7 @@ _get_item_for_path(const char *path) } static Edi_Mainview_Item * -_edi_mainview_item_add(Edi_Path_Options *path, const char *mime, Elm_Object_Item *tab, Elm_Object_Item *view, +_edi_mainview_item_add(Edi_Path_Options *path, const char *mime, Elm_Object_Item *tab, Evas_Object *win) { Edi_Mainview_Item *item; @@ -203,7 +261,6 @@ _edi_mainview_item_add(Edi_Path_Options *path, const char *mime, Elm_Object_Item item->editortype = path->type; item->mimetype = mime; item->tab = tab; - item->view = view; item->win = win; _edi_mainview_items = eina_list_append(_edi_mainview_items, item); @@ -214,13 +271,17 @@ _edi_mainview_item_add(Edi_Path_Options *path, const char *mime, Elm_Object_Item static Evas_Object * _edi_mainview_content_create(Edi_Mainview_Item *item, Evas_Object *parent) { - Edi_Content_Provider *provider; + Evas_Object *container; - provider = edi_content_provider_for_id_get(item->editortype); - if (!provider) - return NULL; + container = elm_box_add(parent); + evas_object_size_hint_weight_set(container, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(container, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(container); - return provider->content_ui_add(parent, item); + item->loaded = EINA_FALSE; + item->container = container; + + return container; } static void @@ -229,12 +290,9 @@ _edi_mainview_item_tab_add(Edi_Path_Options *options, const char *mime) Evas_Object *content, *tab;//, *icon; Edi_Mainview_Item *item; Edi_Editor *editor; -// Edi_Content_Provider *provider; - item = _edi_mainview_item_add(options, mime, NULL, NULL, NULL); -// provider = edi_content_provider_for_id_get(item->editortype); + item = _edi_mainview_item_add(options, mime, NULL, NULL); content = _edi_mainview_content_create(item, _content_frame); - _edi_mainview_view_show(content); item->view = content; @@ -256,7 +314,9 @@ _edi_mainview_item_tab_add(Edi_Path_Options *options, const char *mime) evas_object_show(tab); elm_box_recalculate(tb); item->tab = tab; - edi_mainview_item_select(item); + + if (!options->background) + edi_mainview_item_select(item); // Set focus on the newly opening window so that one can just start typing editor = (Edi_Editor *)evas_object_data_get(content, "editor"); @@ -266,7 +326,7 @@ _edi_mainview_item_tab_add(Edi_Path_Options *options, const char *mime) if (options->line) edi_mainview_goto(options->line); - _edi_project_config_tab_add(options->path, EINA_FALSE); + _edi_project_config_tab_add(options->path, options->type, EINA_FALSE); } static void @@ -311,11 +371,12 @@ _edi_mainview_item_win_add(Edi_Path_Options *options, const char *mime) elm_win_focus_highlight_enabled_set(win, EINA_TRUE); evas_object_smart_callback_add(win, "delete,request", _edi_mainview_win_exit, NULL); - item = _edi_mainview_item_add(options, mime, NULL, NULL, win); + item = _edi_mainview_item_add(options, mime, NULL, win); evas_object_data_set(win, "edi_mainview_item", item); content = _edi_mainview_content_create(item, win); elm_win_resize_object_add(win, content); + _content_load(item); // Set focus on the newly opening window so that one can just start typing editor = (Edi_Editor *)evas_object_data_get(content, "editor"); @@ -325,7 +386,7 @@ _edi_mainview_item_win_add(Edi_Path_Options *options, const char *mime) evas_object_resize(win, 380 * elm_config_scale_get(), 260 * elm_config_scale_get()); evas_object_show(win); - _edi_project_config_tab_add(options->path, EINA_TRUE); + _edi_project_config_tab_add(options->path, options->type, EINA_TRUE); } static void @@ -803,7 +864,7 @@ edi_mainview_project_search_popup_show(void) input = elm_entry_add(box); elm_entry_single_line_set(input, EINA_TRUE); evas_object_event_callback_add(input, EVAS_CALLBACK_KEY_UP, _edi_mainview_goto_popup_key_up_cb, NULL); - evas_object_size_hint_weight_set(input, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_size_hint_weight_set(input, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(input, EVAS_HINT_FILL, EVAS_HINT_FILL); evas_object_show(input); elm_box_pack_end(box, input); diff --git a/src/bin/mainview/edi_mainview.h b/src/bin/mainview/edi_mainview.h index d98b601..e268b45 100644 --- a/src/bin/mainview/edi_mainview.h +++ b/src/bin/mainview/edi_mainview.h @@ -267,6 +267,8 @@ void edi_mainview_item_prev(); */ void edi_mainview_item_next(); +void edi_mainview_tab_select(unsigned int id); + /** * @} * diff --git a/src/bin/mainview/edi_mainview_item.h b/src/bin/mainview/edi_mainview_item.h index 0fde7ef..2cc5d5b 100644 --- a/src/bin/mainview/edi_mainview_item.h +++ b/src/bin/mainview/edi_mainview_item.h @@ -32,7 +32,8 @@ typedef struct _Edi_Mainview_Item /* Private */ - /* Add new members here. */ + Evas_Object *container; /**< The visual container that the item will display within */ + Eina_Bool loaded; } Edi_Mainview_Item; #ifdef __cplusplus diff --git a/src/lib/edi_path.h b/src/lib/edi_path.h index a11251e..d2840f9 100644 --- a/src/lib/edi_path.h +++ b/src/lib/edi_path.h @@ -15,6 +15,7 @@ typedef struct _Edi_Path_Options const char *path; const char *type; int line, character; + Eina_Bool background; } Edi_Path_Options; /**