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 :)
This commit is contained in:
Andy Williams 2017-06-08 18:31:45 -07:00
parent 294e2d4000
commit a10c4aacb6
8 changed files with 109 additions and 27 deletions

View File

@ -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);
}

View File

@ -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

View File

@ -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

View File

@ -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))
{

View File

@ -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);

View File

@ -267,6 +267,8 @@ void edi_mainview_item_prev();
*/
void edi_mainview_item_next();
void edi_mainview_tab_select(unsigned int id);
/**
* @}
*

View File

@ -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

View File

@ -15,6 +15,7 @@ typedef struct _Edi_Path_Options
const char *path;
const char *type;
int line, character;
Eina_Bool background;
} Edi_Path_Options;
/**