config: Save the current tab of each panel

This needed a refactor to do properly so your open tabs
will be forgotten, sorry :(
This commit is contained in:
Andy Williams 2017-07-24 23:28:48 +01:00
parent 804d14cef3
commit 9d0db1a1a5
6 changed files with 168 additions and 61 deletions

View File

@ -41,8 +41,8 @@
# define EDI_CONFIG_FILE_VERSION \ # define EDI_CONFIG_FILE_VERSION \
((EDI_CONFIG_FILE_EPOCH << 16) | EDI_CONFIG_FILE_GENERATION) ((EDI_CONFIG_FILE_EPOCH << 16) | EDI_CONFIG_FILE_GENERATION)
# define EDI_PROJECT_CONFIG_FILE_EPOCH 0x0001 # define EDI_PROJECT_CONFIG_FILE_EPOCH 0x0002
# define EDI_PROJECT_CONFIG_FILE_GENERATION 0x0003 # define EDI_PROJECT_CONFIG_FILE_GENERATION 0x0004
# define EDI_PROJECT_CONFIG_FILE_VERSION \ # define EDI_PROJECT_CONFIG_FILE_VERSION \
((EDI_PROJECT_CONFIG_FILE_EPOCH << 16) | EDI_PROJECT_CONFIG_FILE_GENERATION) ((EDI_PROJECT_CONFIG_FILE_EPOCH << 16) | EDI_PROJECT_CONFIG_FILE_GENERATION)
@ -56,6 +56,7 @@ static Edi_Config_DD *_edi_cfg_mime_edd = NULL;
static Edi_Project_Config_DD *_edi_proj_cfg_edd = NULL; static Edi_Project_Config_DD *_edi_proj_cfg_edd = NULL;
static Edi_Project_Config_DD *_edi_proj_cfg_tab_edd = NULL; static Edi_Project_Config_DD *_edi_proj_cfg_tab_edd = NULL;
static Edi_Project_Config_DD *_edi_proj_cfg_panel_edd = NULL;
/* external variables */ /* external variables */
Edi_Config *_edi_config = NULL; Edi_Config *_edi_config = NULL;
@ -124,12 +125,23 @@ _edi_config_cb_free(void)
static void static void
_edi_project_config_cb_free(void) _edi_project_config_cb_free(void)
{ {
Edi_Project_Config_Panel *panel;
Edi_Project_Config_Tab *tab; Edi_Project_Config_Tab *tab;
if (!_edi_project_config) if (!_edi_project_config)
return; return;
EINA_LIST_FREE(_edi_project_config->tabs, tab) EINA_LIST_FREE(_edi_project_config->panels, panel)
{
EINA_LIST_FREE(panel->tabs, tab)
{
if (tab->path) eina_stringshare_del(tab->path);
if (tab->type) eina_stringshare_del(tab->type);
free(tab);
}
}
EINA_LIST_FREE(_edi_project_config->windows, tab)
{ {
if (tab->path) eina_stringshare_del(tab->path); if (tab->path) eina_stringshare_del(tab->path);
if (tab->type) eina_stringshare_del(tab->type); if (tab->type) eina_stringshare_del(tab->type);
@ -233,8 +245,14 @@ _edi_config_init(void)
#define D _edi_proj_cfg_tab_edd #define D _edi_proj_cfg_tab_edd
EDI_CONFIG_VAL(D, T, path, EET_T_STRING); EDI_CONFIG_VAL(D, T, path, EET_T_STRING);
EDI_CONFIG_VAL(D, T, type, EET_T_STRING); EDI_CONFIG_VAL(D, T, type, EET_T_STRING);
EDI_CONFIG_VAL(D, T, windowed, EET_T_UCHAR);
EDI_CONFIG_VAL(D, T, panel_id, EET_T_INT); _edi_proj_cfg_panel_edd = EDI_CONFIG_DD_NEW("Project_Config_Panel", Edi_Project_Config_Panel);
#undef T
#undef D
#define T Edi_Project_Config_Panel
#define D _edi_proj_cfg_panel_edd
EDI_CONFIG_LIST(D, T, tabs, _edi_proj_cfg_tab_edd);
EDI_CONFIG_VAL(D, T, current_tab, EET_T_UINT);
_edi_proj_cfg_edd = EDI_CONFIG_DD_NEW("Project_Config", Edi_Project_Config); _edi_proj_cfg_edd = EDI_CONFIG_DD_NEW("Project_Config", Edi_Project_Config);
#undef T #undef T
@ -258,14 +276,14 @@ _edi_config_init(void)
EDI_CONFIG_VAL(D, T, gui.toolbar_hidden, EET_T_UCHAR); EDI_CONFIG_VAL(D, T, gui.toolbar_hidden, EET_T_UCHAR);
EDI_CONFIG_VAL(D, T, gui.tab_inserts_spaces, EET_T_UCHAR); 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.path, EET_T_STRING);
EDI_CONFIG_VAL(D, T, launch.args, EET_T_STRING); EDI_CONFIG_VAL(D, T, launch.args, EET_T_STRING);
EDI_CONFIG_VAL(D, T, user_fullname, EET_T_STRING); EDI_CONFIG_VAL(D, T, user_fullname, EET_T_STRING);
EDI_CONFIG_VAL(D, T, user_email, EET_T_STRING); EDI_CONFIG_VAL(D, T, user_email, EET_T_STRING);
EDI_CONFIG_LIST(D, T, panels, _edi_proj_cfg_panel_edd);
EDI_CONFIG_LIST(D, T, windows, _edi_proj_cfg_tab_edd);
_edi_config_load(); _edi_config_load();
return EINA_TRUE; return EINA_TRUE;
@ -414,6 +432,17 @@ _edi_config_mime_search(const char *mime)
return NULL; return NULL;
} }
static Edi_Project_Config_Panel *
_panel_add()
{
Edi_Project_Config_Panel *panel;
panel = calloc(1, sizeof(Edi_Project_Config_Panel));
_edi_project_config->panels = eina_list_append(_edi_project_config->panels, panel);
return panel;
}
Eina_Bool Eina_Bool
_edi_project_config_save_no_notify() _edi_project_config_save_no_notify()
{ {
@ -477,8 +506,6 @@ _edi_project_config_load()
_edi_project_config->gui.width_marker = 80; _edi_project_config->gui.width_marker = 80;
_edi_project_config->gui.tabstop = 8; _edi_project_config->gui.tabstop = 8;
_edi_project_config->gui.toolbar_hidden = EINA_FALSE; _edi_project_config->gui.toolbar_hidden = EINA_FALSE;
_edi_project_config->tabs = NULL;
IFPCFGEND; IFPCFGEND;
IFPCFG(0x0002); IFPCFG(0x0002);
@ -500,21 +527,54 @@ _edi_project_config_load()
_edi_project_config->version = EDI_PROJECT_CONFIG_FILE_VERSION; _edi_project_config->version = EDI_PROJECT_CONFIG_FILE_VERSION;
IFPCFG(0x0004);
_edi_project_config->panels = NULL;
_panel_add();
_edi_project_config->windows = NULL;
IFPCFGEND;
if (save) _edi_project_config_save_no_notify(); if (save) _edi_project_config_save_no_notify();
} }
Eina_List **
_tablist_get(Eina_Bool windowed, int panel_id)
{
Edi_Project_Config_Panel *panel;
if (windowed)
return &_edi_project_config->windows;
panel = eina_list_nth(_edi_project_config->panels, panel_id);
while (!panel)
{
_panel_add();
panel = eina_list_nth(_edi_project_config->panels, panel_id);
}
return &panel->tabs;
}
void
_edi_project_config_tab_current_set(int panel_id, int tab_id)
{
Edi_Project_Config_Panel *panel;
panel = eina_list_nth(_edi_project_config->panels, panel_id);
while (!panel)
{
_panel_add();
panel = eina_list_nth(_edi_project_config->panels, panel_id);
}
panel->current_tab = tab_id;
}
void void
_edi_project_config_tab_add(const char *path, const char *type, _edi_project_config_tab_add(const char *path, const char *type,
Eina_Bool windowed, int panel_id) Eina_Bool windowed, int panel_id)
{ {
Edi_Project_Config_Tab *tab; Edi_Project_Config_Tab *tab;
Eina_List *list, *next; Eina_List **tabs;
EINA_LIST_FOREACH_SAFE(_edi_project_config->tabs, list, next, tab)
{
if (!strncmp(tab->path, path, strlen(tab->path)))
_edi_project_config->tabs = eina_list_remove_list(_edi_project_config->tabs, list);
}
tab = malloc(sizeof(*tab)); tab = malloc(sizeof(*tab));
@ -523,22 +583,22 @@ _edi_project_config_tab_add(const char *path, const char *type,
tab->path = eina_stringshare_add(path + strlen(edi_project_get()) + 1); tab->path = eina_stringshare_add(path + strlen(edi_project_get()) + 1);
else else
tab->path = eina_stringshare_add(path); tab->path = eina_stringshare_add(path);
tab->type = eina_stringshare_add(type); tab->type = eina_stringshare_add(type);
tab->windowed = windowed;
tab->panel_id = panel_id;
_edi_project_config->tabs = eina_list_append(_edi_project_config->tabs, tab); tabs = _tablist_get(windowed, panel_id);
*tabs = eina_list_append(*tabs, tab);
_edi_project_config_save_no_notify(); _edi_project_config_save_no_notify();
} }
void void
_edi_project_config_tab_remove(const char *path) _edi_project_config_tab_remove(const char *path, Eina_Bool windowed, int panel_id)
{ {
Edi_Project_Config_Tab *tab; Edi_Project_Config_Tab *tab;
Eina_List *list, *next; Eina_List *list, *next, **tabs;
EINA_LIST_FOREACH_SAFE(_edi_project_config->tabs, list, next, tab) tabs = _tablist_get(windowed, panel_id);
EINA_LIST_FOREACH_SAFE(*tabs, list, next, tab)
{ {
if (!strncmp(tab->path, path, strlen(tab->path))) if (!strncmp(tab->path, path, strlen(tab->path)))
break; break;
@ -547,7 +607,7 @@ _edi_project_config_tab_remove(const char *path)
break; break;
} }
_edi_project_config->tabs = eina_list_remove(_edi_project_config->tabs, tab); *tabs = eina_list_remove(*tabs, tab);
_edi_project_config_save_no_notify(); _edi_project_config_save_no_notify();
eina_stringshare_del(tab->path); eina_stringshare_del(tab->path);

View File

@ -19,6 +19,7 @@ typedef struct _Edi_Config_Mime_Association Edi_Config_Mime_Association;
typedef struct _Edi_Config Edi_Config; typedef struct _Edi_Config Edi_Config;
typedef struct _Edi_Project_Config Edi_Project_Config; typedef struct _Edi_Project_Config Edi_Project_Config;
typedef struct _Edi_Project_Config_Panel Edi_Project_Config_Panel;
typedef struct _Edi_Project_Config_Tab Edi_Project_Config_Tab; typedef struct _Edi_Project_Config_Tab Edi_Project_Config_Tab;
typedef struct _Edi_Project_Config_Launch Edi_Project_Config_Launch; typedef struct _Edi_Project_Config_Launch Edi_Project_Config_Launch;
@ -45,12 +46,16 @@ struct _Edi_Config
Eina_List *mime_assocs; Eina_List *mime_assocs;
}; };
struct _Edi_Project_Config_Panel
{
Eina_List *tabs;
unsigned int current_tab;
};
struct _Edi_Project_Config_Tab struct _Edi_Project_Config_Tab
{ {
const char *path; const char *path;
const char *type; const char *type;
Eina_Bool windowed;
int panel_id;
}; };
struct _Edi_Project_Config_Launch struct _Edi_Project_Config_Launch
@ -82,11 +87,12 @@ struct _Edi_Project_Config
Eina_Bool tab_inserts_spaces; Eina_Bool tab_inserts_spaces;
} gui; } gui;
Eina_List *tabs;
unsigned int current_tab;
Edi_Project_Config_Launch launch; Edi_Project_Config_Launch launch;
Eina_Stringshare *user_fullname; Eina_Stringshare *user_fullname;
Eina_Stringshare *user_email; Eina_Stringshare *user_email;
Eina_List *panels;
Eina_List *windows;
}; };
extern Edi_Config *_edi_config; extern Edi_Config *_edi_config;
@ -116,7 +122,8 @@ void _edi_project_config_save(void);
void _edi_project_config_tab_add(const char *path, const char *type, void _edi_project_config_tab_add(const char *path, const char *type,
Eina_Bool windowed, int panel_id); Eina_Bool windowed, int panel_id);
void _edi_project_config_tab_remove(const char *path); void _edi_project_config_tab_remove(const char *path, Eina_Bool windowed, int panel_id);
void _edi_project_config_tab_current_set(int panel_id, int tab_id);
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -1307,14 +1307,54 @@ _edi_file_saved(void *data EINA_UNUSED, int type EINA_UNUSED, void *event EINA_U
void void
_edi_open_tabs() _edi_open_tabs()
{ {
Edi_Project_Config_Panel *panel;
Edi_Project_Config_Tab *tab; Edi_Project_Config_Tab *tab;
Edi_Path_Options *options; Edi_Path_Options *options;
Eina_List *tabs, *list; Eina_List *tabs, *panels, *list, *sublist;
Edi_Mainview_Panel *panel; Edi_Mainview_Panel *panel_obj;
char *path; char *path;
unsigned int tab_id = 0, panel_id = 0;
tabs = _edi_project_config->tabs; panels = _edi_project_config->panels;
_edi_project_config->tabs = NULL; _edi_project_config->panels = NULL;
EINA_LIST_FOREACH(panels, list, panel)
{
if (panel_id != 0)
/* Make sure we have enough panels */
edi_mainview_panel_append();
panel_obj = edi_mainview_panel_by_index(panel_id);
tabs = panel->tabs;
panel->tabs = NULL;
tab_id = 0;
EINA_LIST_FOREACH(tabs, sublist, tab)
{
if (!strncmp(tab->path, edi_project_get(), strlen(edi_project_get())))
path = strdup(tab->path);
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 = tab_id != panel->current_tab;
edi_mainview_panel_open(panel_obj, options);
tab_id++;
free(path);
}
edi_mainview_panel_tab_select(panel_obj, panel->current_tab);
panel_id++;
EINA_LIST_FREE(tabs, tab)
{
free(tab);
}
}
tabs = _edi_project_config->windows;
_edi_project_config->windows = NULL;
EINA_LIST_FOREACH(tabs, list, tab) EINA_LIST_FOREACH(tabs, list, tab)
{ {
if (!strncmp(tab->path, edi_project_get(), strlen(edi_project_get()))) if (!strncmp(tab->path, edi_project_get(), strlen(edi_project_get())))
@ -1324,37 +1364,14 @@ _edi_open_tabs()
options = edi_path_options_create(path); options = edi_path_options_create(path);
options->type = eina_stringshare_add(tab->type); options->type = eina_stringshare_add(tab->type);
options->background = EINA_TRUE;
if (tab->panel_id == 0)
{
if (tab->windowed)
edi_mainview_open_window(options);
else
edi_mainview_open(options);
}
else
{
while (edi_mainview_panel_count() <= tab->panel_id)
{
/* Make sure we have enough panels */
edi_mainview_panel_append();
}
panel = edi_mainview_panel_by_index(tab->panel_id);
options = edi_path_options_create(path);
edi_mainview_panel_open(panel, options);
}
edi_mainview_open_window(options);
free(path); free(path);
} }
EINA_LIST_FREE(tabs, tab) EINA_LIST_FREE(tabs, tab)
{ {
free(tab); free(tab);
} }
if (_edi_project_config->current_tab != 0)
edi_mainview_tab_select(_edi_project_config->current_tab);
} }
static void static void

View File

@ -89,6 +89,24 @@ edi_mainview_panel_for_item_get(Edi_Mainview_Item *item)
return NULL; return NULL;
} }
unsigned int
edi_mainview_panel_index_get(Edi_Mainview_Panel *panel)
{
Eina_List *it;
Edi_Mainview_Panel *panel2;
unsigned int i = 0;
EINA_LIST_FOREACH(_edi_mainview_panels, it, panel2)
{
if (panel == panel2)
break;
i++;
}
return i;
}
void void
edi_mainview_item_prev() edi_mainview_item_prev()
{ {
@ -117,7 +135,7 @@ _edi_mainview_win_exit(void *data EINA_UNUSED, Evas_Object *obj, void *event_inf
it = evas_object_data_get(obj, "edi_mainview_item"); it = evas_object_data_get(obj, "edi_mainview_item");
_edi_mainview_wins = eina_list_remove(_edi_mainview_wins, it); _edi_mainview_wins = eina_list_remove(_edi_mainview_wins, it);
_edi_project_config_tab_remove(it->path); _edi_project_config_tab_remove(it->path, EINA_TRUE, 0);
eina_stringshare_del(it->path); eina_stringshare_del(it->path);
if (edi_noproject()) if (edi_noproject())

View File

@ -254,6 +254,8 @@ Edi_Mainview_Item *edi_mainview_item_current_get();
Edi_Mainview_Panel *edi_mainview_panel_current_get(); Edi_Mainview_Panel *edi_mainview_panel_current_get();
unsigned int edi_mainview_panel_index_get(Edi_Mainview_Panel *panel);
void edi_mainview_tab_select(unsigned int id); void edi_mainview_tab_select(unsigned int id);
/** /**

View File

@ -204,7 +204,8 @@ edi_mainview_panel_item_close(Edi_Mainview_Panel *panel, Edi_Mainview_Item *item
evas_object_del(item->tab); evas_object_del(item->tab);
panel->items = eina_list_remove(panel->items, item); panel->items = eina_list_remove(panel->items, item);
_edi_project_config_tab_remove(item->path); _edi_project_config_tab_remove(item->path, EINA_FALSE,
edi_mainview_panel_index_get(panel));
eina_stringshare_del(item->path); eina_stringshare_del(item->path);
free(item); free(item);
@ -241,7 +242,9 @@ edi_mainview_panel_item_select(Edi_Mainview_Panel *panel, Edi_Mainview_Item *ite
evas_object_geometry_get(item->tab, NULL, NULL, &tabw, NULL); evas_object_geometry_get(item->tab, NULL, NULL, &tabw, NULL);
elm_scroller_region_bring_in(panel->tabs, region_x, 0, tabw, 0); elm_scroller_region_bring_in(panel->tabs, region_x, 0, tabw, 0);
_edi_project_config->current_tab = edi_mainview_panel_item_current_tab_get(panel);
_edi_project_config_tab_current_set(edi_mainview_panel_index_get(panel),
edi_mainview_panel_item_current_tab_get(panel));
_edi_project_config_save_no_notify(); _edi_project_config_save_no_notify();
} }