forked from enlightenment/edi
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:
parent
294e2d4000
commit
a10c4aacb6
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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))
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -267,6 +267,8 @@ void edi_mainview_item_prev();
|
|||
*/
|
||||
void edi_mainview_item_next();
|
||||
|
||||
void edi_mainview_tab_select(unsigned int id);
|
||||
|
||||
/**
|
||||
* @}
|
||||
*
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -15,6 +15,7 @@ typedef struct _Edi_Path_Options
|
|||
const char *path;
|
||||
const char *type;
|
||||
int line, character;
|
||||
Eina_Bool background;
|
||||
} Edi_Path_Options;
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue