diff --git a/src/bin/edi_config.c b/src/bin/edi_config.c index d108830..d7f39b8 100644 --- a/src/bin/edi_config.c +++ b/src/bin/edi_config.c @@ -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); diff --git a/src/bin/edi_config.h b/src/bin/edi_config.h index d5d709e..f2bf278 100644 --- a/src/bin/edi_config.h +++ b/src/bin/edi_config.h @@ -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 } diff --git a/src/bin/edi_main.c b/src/bin/edi_main.c index c962a52..c83d08c 100644 --- a/src/bin/edi_main.c +++ b/src/bin/edi_main.c @@ -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 diff --git a/src/bin/mainview/edi_mainview.c b/src/bin/mainview/edi_mainview.c index 3608577..0068e2c 100644 --- a/src/bin/mainview/edi_mainview.c +++ b/src/bin/mainview/edi_mainview.c @@ -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()) diff --git a/src/bin/mainview/edi_mainview.h b/src/bin/mainview/edi_mainview.h index 39237ef..cc6b57b 100644 --- a/src/bin/mainview/edi_mainview.h +++ b/src/bin/mainview/edi_mainview.h @@ -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); /** diff --git a/src/bin/mainview/edi_mainview_panel.c b/src/bin/mainview/edi_mainview_panel.c index f97d2a5..17bbb57 100644 --- a/src/bin/mainview/edi_mainview_panel.c +++ b/src/bin/mainview/edi_mainview_panel.c @@ -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(); }