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 \
((EDI_CONFIG_FILE_EPOCH << 16) | EDI_CONFIG_FILE_GENERATION)
# define EDI_PROJECT_CONFIG_FILE_EPOCH 0x0001
# define EDI_PROJECT_CONFIG_FILE_GENERATION 0x0003
# define EDI_PROJECT_CONFIG_FILE_EPOCH 0x0002
# define EDI_PROJECT_CONFIG_FILE_GENERATION 0x0004
# define EDI_PROJECT_CONFIG_FILE_VERSION \
((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_tab_edd = NULL;
static Edi_Project_Config_DD *_edi_proj_cfg_panel_edd = NULL;
/* external variables */
Edi_Config *_edi_config = NULL;
@ -124,12 +125,23 @@ _edi_config_cb_free(void)
static void
_edi_project_config_cb_free(void)
{
Edi_Project_Config_Panel *panel;
Edi_Project_Config_Tab *tab;
if (!_edi_project_config)
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->type) eina_stringshare_del(tab->type);
@ -233,8 +245,14 @@ _edi_config_init(void)
#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_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);
#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.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);
EDI_CONFIG_VAL(D, T, user_fullname, 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();
return EINA_TRUE;
@ -414,6 +432,17 @@ _edi_config_mime_search(const char *mime)
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
_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.tabstop = 8;
_edi_project_config->gui.toolbar_hidden = EINA_FALSE;
_edi_project_config->tabs = NULL;
IFPCFGEND;
IFPCFG(0x0002);
@ -500,21 +527,54 @@ _edi_project_config_load()
_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();
}
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
_edi_project_config_tab_add(const char *path, const char *type,
Eina_Bool windowed, int panel_id)
{
Edi_Project_Config_Tab *tab;
Eina_List *list, *next;
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);
}
Eina_List **tabs;
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);
else
tab->path = eina_stringshare_add(path);
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();
}
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;
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)))
break;
@ -547,7 +607,7 @@ _edi_project_config_tab_remove(const char *path)
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();
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_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_Launch Edi_Project_Config_Launch;
@ -45,12 +46,16 @@ struct _Edi_Config
Eina_List *mime_assocs;
};
struct _Edi_Project_Config_Panel
{
Eina_List *tabs;
unsigned int current_tab;
};
struct _Edi_Project_Config_Tab
{
const char *path;
const char *type;
Eina_Bool windowed;
int panel_id;
};
struct _Edi_Project_Config_Launch
@ -82,11 +87,12 @@ struct _Edi_Project_Config
Eina_Bool tab_inserts_spaces;
} gui;
Eina_List *tabs;
unsigned int current_tab;
Edi_Project_Config_Launch launch;
Eina_Stringshare *user_fullname;
Eina_Stringshare *user_email;
Eina_List *panels;
Eina_List *windows;
};
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,
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
}

View File

@ -1307,14 +1307,54 @@ _edi_file_saved(void *data EINA_UNUSED, int type EINA_UNUSED, void *event EINA_U
void
_edi_open_tabs()
{
Edi_Project_Config_Panel *panel;
Edi_Project_Config_Tab *tab;
Edi_Path_Options *options;
Eina_List *tabs, *list;
Edi_Mainview_Panel *panel;
Eina_List *tabs, *panels, *list, *sublist;
Edi_Mainview_Panel *panel_obj;
char *path;
unsigned int tab_id = 0, panel_id = 0;
tabs = _edi_project_config->tabs;
_edi_project_config->tabs = NULL;
panels = _edi_project_config->panels;
_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)
{
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->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);
}
EINA_LIST_FREE(tabs, tab)
{
free(tab);
}
if (_edi_project_config->current_tab != 0)
edi_mainview_tab_select(_edi_project_config->current_tab);
}
static void

View File

@ -89,6 +89,24 @@ edi_mainview_panel_for_item_get(Edi_Mainview_Item *item)
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
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");
_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);
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();
unsigned int edi_mainview_panel_index_get(Edi_Mainview_Panel *panel);
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);
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);
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);
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();
}