ajwillia-ms pushed a commit to branch master.

http://git.enlightenment.org/tools/edi.git/commit/?id=9d0db1a1a55a9f8269603f415770baca3c73e072

commit 9d0db1a1a55a9f8269603f415770baca3c73e072
Author: Andy Williams <[email protected]>
Date:   Mon Jul 24 23:28:48 2017 +0100

    config: Save the current tab of each panel
    
    This needed a refactor to do properly so your open tabs
    will be forgotten, sorry :(
---
 src/bin/edi_config.c                  | 110 ++++++++++++++++++++++++++--------
 src/bin/edi_config.h                  |  17 ++++--
 src/bin/edi_main.c                    |  73 +++++++++++++---------
 src/bin/mainview/edi_mainview.c       |  20 ++++++-
 src/bin/mainview/edi_mainview.h       |   2 +
 src/bin/mainview/edi_mainview_panel.c |   7 ++-
 6 files changed, 168 insertions(+), 61 deletions(-)

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,22 +527,55 @@ _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_add(const char *path, const char *type,
-                            Eina_Bool windowed, int panel_id)
+_edi_project_config_tab_current_set(int panel_id, int tab_id)
 {
-   Edi_Project_Config_Tab *tab;
-   Eina_List *list, *next;
+   Edi_Project_Config_Panel *panel;
 
-   EINA_LIST_FOREACH_SAFE(_edi_project_config->tabs, list, next, tab)
+   panel = eina_list_nth(_edi_project_config->panels, panel_id);
+   while (!panel)
      {
-        if (!strncmp(tab->path, path, strlen(tab->path)))
-          _edi_project_config->tabs = 
eina_list_remove_list(_edi_project_config->tabs, list);
+        _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 **tabs;
+
    tab = malloc(sizeof(*tab));
 
    // let's keep paths relative
@@ -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();
      }
 

-- 


Reply via email to