netstar pushed a commit to branch master.

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

commit be53c4df18efeac9c32234c972e00e2e12d178db
Author: Al Poole <nets...@gmail.com>
Date:   Fri Sep 29 21:37:21 2017 +0100

    scm: Create edi_scm binary for commit dialogue and use elsewhere.
    
    This removes the existing popup code. The edi_scm executable should
    run in any git tree giving the status of the repository. The Edi
    UI calls this for the commit dialogue also.
---
 src/bin/Makefile.am                                |  11 +-
 src/bin/edi_main.c                                 |  22 +-
 src/bin/edi_scm_main.c                             |  60 +++
 .../{screens/edi_scm_screens.c => edi_scm_ui.c}    | 445 ++++++++++++---------
 src/bin/edi_scm_ui.h                               |  44 ++
 src/bin/screens/edi_scm_screens.h                  |  61 ---
 src/bin/screens/edi_screens.c                      |  26 ++
 src/bin/screens/edi_screens.h                      |  10 +
 src/lib/edi_scm.c                                  |  16 +-
 src/lib/edi_scm.h                                  |   8 +
 10 files changed, 453 insertions(+), 250 deletions(-)

diff --git a/src/bin/Makefile.am b/src/bin/Makefile.am
index 1c23023..aa32e74 100644
--- a/src/bin/Makefile.am
+++ b/src/bin/Makefile.am
@@ -1,7 +1,7 @@
 MAINTAINERCLEANFILES = Makefile.in
 AUTOMAKE_OPTIONS = subdir-objects
 
-bin_PROGRAMS = edi edi_build
+bin_PROGRAMS = edi edi_build edi_scm
 efl_cflags_safe = '@EFL_CFLAGS@'
 clang_include = '$(CLANG_INCLUDE)'
 
@@ -27,9 +27,9 @@ editor/edi_editor.h \
 edi_content_provider.h \
 screens/edi_screens.h \
 screens/edi_file_screens.h \
-screens/edi_scm_screens.h \
 edi_filepanel.h \
 edi_file.h \
+edi_scm_ui.h \
 edi_logpanel.h \
 edi_searchpanel.h \
 edi_consolepanel.h \
@@ -50,10 +50,10 @@ screens/edi_about.c \
 screens/edi_settings_font.c \
 screens/edi_settings.c \
 screens/edi_file_screens.c \
-screens/edi_scm_screens.c \
 screens/edi_screens.c \
 edi_filepanel.c \
 edi_file.c \
+edi_scm_ui.c \
 edi_logpanel.c \
 edi_searchpanel.c \
 edi_consolepanel.c \
@@ -73,6 +73,9 @@ edi_LDADD = @EFL_LIBS@ $(top_builddir)/src/lib/libedi.la 
$(LTLIBINTL)
 
 edi_build_SOURCES = \
 edi_build_main.c
-
 edi_build_LDADD = @EFL_LIBS@ $(top_builddir)/src/lib/libedi.la
 
+edi_scm_SOURCES = \
+edi_scm_ui.c \
+edi_scm_main.c
+edi_scm_LDADD = @EFL_LIBS@ $(top_builddir)/src/lib/libedi.la
diff --git a/src/bin/edi_main.c b/src/bin/edi_main.c
index f7d8da5..62f6a26 100644
--- a/src/bin/edi_main.c
+++ b/src/bin/edi_main.c
@@ -22,7 +22,6 @@
 #include "mainview/edi_mainview.h"
 #include "screens/edi_screens.h"
 #include "screens/edi_file_screens.h"
-#include "screens/edi_scm_screens.h"
 #include "screens/edi_screens.h"
 
 #include "edi_private.h"
@@ -1017,7 +1016,7 @@ _edi_menu_scm_init_cb(void *data EINA_UNUSED, Evas_Object 
*obj EINA_UNUSED,
 
    if (!ecore_file_app_installed("git"))
      {
-        edi_scm_screens_binary_missing(_edi_main_win, "git");
+        edi_screens_scm_binary_missing(_edi_main_win, "git");
         return;
      }
 
@@ -1031,9 +1030,17 @@ _edi_menu_scm_init_cb(void *data EINA_UNUSED, 
Evas_Object *obj EINA_UNUSED,
 }
 
 static void
+_edi_scm_program_exited_cb(int status EINA_UNUSED, void *data EINA_UNUSED)
+{
+   edi_filepanel_status_refresh();
+}
+
+static void
 _edi_menu_scm_commit_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
                         void *event_info EINA_UNUSED)
 {
+   char *workdir = getcwd(NULL, PATH_MAX);
+
    if (!_edi_project_credentials_check())
      {
         _edi_project_credentials_missing();
@@ -1041,7 +1048,16 @@ _edi_menu_scm_commit_cb(void *data EINA_UNUSED, 
Evas_Object *obj EINA_UNUSED,
      }
 
    edi_scm_credentials_set(_edi_project_config->user_fullname, 
_edi_project_config->user_email);
-   edi_scm_screens_commit(_edi_main_win);
+
+   chdir(edi_project_get());
+
+   /* when program terminates update the filepanel */
+   if (edi_exe_notify_handle("edi_scm_status", _edi_scm_program_exited_cb, 
NULL))
+     edi_exe_notify("edi_scm_status", "edi_scm");
+
+   chdir(workdir);
+
+   free(workdir);
 }
 
 static void
diff --git a/src/bin/edi_scm_main.c b/src/bin/edi_scm_main.c
new file mode 100644
index 0000000..40bcddc
--- /dev/null
+++ b/src/bin/edi_scm_main.c
@@ -0,0 +1,60 @@
+#include <Edi.h>
+#include "edi_scm_ui.h"
+
+#define DEFAULT_WIDTH  460
+#define DEFAULT_HEIGHT 280
+
+static void
+_win_del_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info 
EINA_UNUSED)
+{
+   evas_object_del(obj);
+   ecore_main_loop_quit();
+}
+
+static Evas_Object *
+_setup_win(void)
+{
+   Evas_Object *win, *icon;
+   Eina_Strbuf *title;
+   char *cwd;
+
+   cwd = getcwd(NULL, PATH_MAX);
+
+   title = eina_strbuf_new();
+   eina_strbuf_append_printf(title, "Edi Source Control :: %s", cwd);
+
+   elm_policy_set(ELM_POLICY_QUIT, ELM_POLICY_QUIT_LAST_WINDOW_CLOSED);
+
+   win = elm_win_util_standard_add(eina_strbuf_string_get(title), 
ELM_WIN_BASIC);
+   icon = elm_icon_add(win);
+   elm_icon_standard_set(icon, "edi");
+   elm_win_icon_object_set(win, icon);
+
+   evas_object_resize(win, DEFAULT_WIDTH * elm_config_scale_get(), 
DEFAULT_HEIGHT * elm_config_scale_get());
+   evas_object_smart_callback_add(win, "delete,request", _win_del_cb, NULL);
+   evas_object_show(win);
+
+   eina_strbuf_free(title);
+   free(cwd);
+
+   return win;
+}
+
+int main(int argc, char **argv)
+{
+   Evas_Object *win;
+
+   ecore_init();
+   elm_init(argc, argv);
+
+   win = _setup_win();
+   edi_scm_ui_add(win);
+   elm_win_center(win, EINA_TRUE, EINA_TRUE);
+
+   ecore_main_loop_begin();
+
+   ecore_shutdown();
+   elm_shutdown();
+
+   return EXIT_SUCCESS;
+}
diff --git a/src/bin/screens/edi_scm_screens.c b/src/bin/edi_scm_ui.c
similarity index 58%
rename from src/bin/screens/edi_scm_screens.c
rename to src/bin/edi_scm_ui.c
index e10b33c..8dd41fe 100644
--- a/src/bin/screens/edi_scm_screens.c
+++ b/src/bin/edi_scm_ui.c
@@ -3,52 +3,107 @@
 #endif
 
 #include "Edi.h"
-#include "mainview/edi_mainview.h"
-#include "edi_config.h"
-#include "edi_filepanel.h"
-#include "edi_file.h"
-#include "edi_consolepanel.h"
-#include "edi_scm_screens.h"
+#include "edi_scm_ui.h"
 #include "edi_private.h"
 
-static Evas_Object *_parent_obj, *_popup, *_edi_scm_screens_message_popup;
+static Evas_Object *_parent_obj, *_popup, *_edi_scm_ui_screens_message_popup;
+static Evas_Object *_list, *_check;
+static Evas_Object *_commit_button, *_commit_entry;
+static Elm_Code *_code;
+
+static Eina_Bool scm_configured = EINA_FALSE;
+static Eina_Bool results_full = EINA_FALSE;
+
+static void _edi_scm_ui_refresh(void);
+
+const char *
+_edi_scm_ui_avatar_cache_path_get(const char *email)
+{
+   return eina_stringshare_printf("%s/%s/avatars/%s.jpeg", 
efreet_cache_home_get(),
+                                  PACKAGE_NAME, email);
+}
+
+void _edi_scm_ui_screens_avatar_download_complete(void *data, const char *file,
+                                               int status)
+{
+   Evas_Object *image = data;
+
+   if (status != 200)
+     {
+        ecore_file_remove(file);
+        return;
+     }
+
+   elm_image_file_set(image, file, NULL);
+}
+
+static void
+_edi_scm_ui_screens_avatar_load(Evas_Object *image, const char *email)
+{
+   const char *tmp, *cache, *cachedir, *cacheparentdir;
+
+   cache = _edi_scm_ui_avatar_cache_path_get(email);
+   if (ecore_file_exists(cache))
+     {
+        elm_image_file_set(image, cache, NULL);
+        return;
+     }
+
+   tmp = dirname((char *) cache);
+   cachedir = strdup(tmp);
+   cacheparentdir = dirname((char *) tmp);
+   if (!ecore_file_exists(cacheparentdir) && !ecore_file_mkdir(cacheparentdir))
+     goto clear;
+
+   if (!ecore_file_exists(cachedir) && !ecore_file_mkdir(cachedir))
+     goto clear;
+
+   ecore_file_download(edi_scm_avatar_url_get(email), cache,
+                       _edi_scm_ui_screens_avatar_download_complete, NULL,
+                       image, NULL);
+
+clear:
+   free((char *)cachedir);
+}
 
 static void
-_edi_scm_screens_message_close_cb(void *data EINA_UNUSED,
+_edi_scm_ui_screens_message_close_cb(void *data EINA_UNUSED,
                      Evas_Object *obj EINA_UNUSED,
                      void *event_info EINA_UNUSED)
 {
    Evas_Object *popup = data;
+
    evas_object_del(popup);
+   elm_exit();
 }
 
 static void
-_edi_scm_screens_message_open(const char *message)
+_edi_scm_ui_screens_message_open(const char *message)
 {
    Evas_Object *popup, *button;
 
-   _edi_scm_screens_message_popup = popup = elm_popup_add(_parent_obj);
+   _edi_scm_ui_screens_message_popup = popup = elm_popup_add(_parent_obj);
    elm_object_part_text_set(popup, "title,text",
-                           message);
+                            message);
 
    button = elm_button_add(popup);
    elm_object_text_set(button, _("OK"));
    elm_object_part_content_set(popup, "button1", button);
    evas_object_smart_callback_add(button, "clicked",
-                                 _edi_scm_screens_message_close_cb, popup);
+                                  _edi_scm_ui_screens_message_close_cb, popup);
 
    evas_object_show(popup);
 }
 
 static void
-_edi_scm_screens_popup_cancel_cb(void *data, Evas_Object *obj EINA_UNUSED,
+_edi_scm_ui_screens_popup_cancel_cb(void *data, Evas_Object *obj EINA_UNUSED,
                      void *event_info EINA_UNUSED)
 {
-   evas_object_del((Evas_Object *)data);
+   evas_object_del((Evas_Object *) data);
 }
 
 static void
-_edi_scm_screens_commit_cb(void *data,
+_edi_scm_ui_screens_commit_cb(void *data,
                            Evas_Object *obj EINA_UNUSED,
                            void *event_info EINA_UNUSED)
 {
@@ -64,19 +119,17 @@ _edi_scm_screens_commit_cb(void *data,
    text = elm_object_text_get((Evas_Object *) data);
    if (!text || !text[0])
      {
-        _edi_scm_screens_message_open(_("Please enter a valid commit 
message."));
+        _edi_scm_ui_screens_message_open(_("Please enter a valid commit 
message."));
         return;
      }
 
    message = elm_entry_markup_to_utf8(text);
-
-   edi_consolepanel_clear();
-   edi_consolepanel_show();
    edi_scm_commit(message);
-   edi_filepanel_status_refresh();
-   evas_object_del(_popup);
 
+   evas_object_del(_popup);
    free(message);
+
+   elm_exit();
 }
 
 static void
@@ -137,7 +190,7 @@ _icon_status(Edi_Scm_Status_Code code)
 }
 
 static void
-_edi_scm_status_free(Edi_Scm_Status *status)
+_edi_scm_ui_status_free(Edi_Scm_Status *status)
 {
    eina_stringshare_del(status->fullpath);
    eina_stringshare_del(status->path);
@@ -149,17 +202,17 @@ _edi_scm_status_free(Edi_Scm_Status *status)
 static void
 _content_del(void *data, Evas_Object *obj EINA_UNUSED)
 {
-   Edi_Scm_Status *status = data;
+   Edi_Scm_Status *status = (Edi_Scm_Status *) data;
 
-   _edi_scm_status_free(status);
+   _edi_scm_ui_status_free(status);
 }
 
 static Evas_Object *
 _content_get(void *data, Evas_Object *obj, const char *source)
 {
    Evas_Object *box, *lbox, *mbox, *rbox, *label, *ic;
+   const char *text, *icon_name, *icon_status, *mime;
    Edi_Scm_Status *status;
-   const char *text, *icon_name, *icon_status;
 
    if (strcmp(source, "elm.swallow.content"))
      return NULL;
@@ -168,7 +221,12 @@ _content_get(void *data, Evas_Object *obj, const char 
*source)
 
    icon_status = _icon_status(status->change);
 
-   icon_name = "dialog-information";
+   mime = efreet_mime_type_get(status->fullpath);
+   if (mime)
+     icon_name = efreet_mime_type_icon_get(mime, elm_config_icon_theme_get(), 
32);
+ 
+   if (!icon_name)
+     icon_name = "dialog-information";
 
    box = elm_box_add(obj);
    elm_box_horizontal_set(box, EINA_TRUE);
@@ -242,12 +300,12 @@ _content_get(void *data, Evas_Object *obj, const char 
*source)
 }
 
 static Eina_Bool
-_file_status_list_fill(Evas_Object *list)
+_edi_scm_ui_status_list_fill(Evas_Object *list)
 {
+   Elm_Genlist_Item_Class *itc;
+   Edi_Scm_Status *status;
    Edi_Scm_Engine *e;
    Eina_List *l;
-   Edi_Scm_Status *status;
-   Elm_Genlist_Item_Class *itc;
    Eina_Bool staged = EINA_FALSE;
 
    e = edi_scm_engine_get();
@@ -265,16 +323,20 @@ _file_status_list_fill(Evas_Object *list)
      {
         EINA_LIST_FOREACH(e->statuses, l, status)
           {
-             if (status->staged)
+             if (results_full)
                {
                   elm_genlist_item_append(list, itc, status, NULL, 
ELM_GENLIST_ITEM_NONE, NULL, NULL);
-                  staged = EINA_TRUE;
                }
              else
                {
-                  _edi_scm_status_free(status);
+                  if (status->staged)
+                    elm_genlist_item_append(list, itc, status, NULL, 
ELM_GENLIST_ITEM_NONE, NULL, NULL);
+                  else
+                    _edi_scm_ui_status_free(status);
                }
-
+          
+             if (status->staged)
+               staged = EINA_TRUE;
           }
      }
 
@@ -289,42 +351,88 @@ _file_status_list_fill(Evas_Object *list)
    return staged;
 }
 
+static void
+_edi_scm_ui_refresh(void)
+{
+   char *text;
+   Eina_Bool staged;
+   Evas_Object *check = _check;
+
+   results_full = elm_check_state_get(check);
+
+   elm_genlist_clear(_list);
+   elm_code_file_clear(_code->file);
+
+   staged = _edi_scm_ui_status_list_fill(_list);
+
+   if (!scm_configured)
+     {
+        elm_object_disabled_set(_commit_button, EINA_TRUE);
+        elm_entry_editable_set(_commit_entry, EINA_FALSE);
+     }
+   else
+     {
+       elm_object_disabled_set(_commit_button, !staged);
+       elm_entry_editable_set(_commit_entry, staged);
+     }
+
+   elm_genlist_realized_items_update(_list); 
+
+   text = edi_scm_diff(!results_full);
+   _entry_lines_append(_code, text);
+   free(text); 
+}
+
+static void
+_edi_scm_ui_refresh_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, 
void *event_info EINA_UNUSED)
+{
+   _edi_scm_ui_refresh();
+}
+
 void
-edi_scm_screens_commit(Evas_Object *parent)
+edi_scm_ui_add(Evas_Object *parent)
 {
-   Evas_Object *popup, *box, *frame, *hbox, *cbox, *label, *avatar, *input, 
*button;
-   Evas_Object *table, *rect, *list;
+   Evas_Object *box, *frame, *hbox, *cbox, *label, *avatar, *input, *button;
+   Evas_Object *table, *rect, *list, *pbox, *check;
    Elm_Code_Widget *entry;
    Elm_Code *code;
    Eina_Strbuf *string;
    Edi_Scm_Engine *engine;
+   const char *remote_name, *remote_email;
    char *text;
    Eina_Bool staged_changes;
 
-   engine= edi_scm_engine_get();
+   _parent_obj = parent;
+
+   if (!edi_scm_generic_init())
+     {
+       exit(1 << 2); 
+//       _edi_scm_ui_screens_message_open(_("SCM is not available at this 
location."));
+       return;
+     }
+
+   engine = edi_scm_engine_get();
    if (!engine)
      {
-        _edi_scm_screens_message_open(_("SCM engine is not available."));
+        exit(1 << 3);
+ //       _edi_scm_ui_screens_message_open(_("SCM engine is not available."));
         return;
      }
 
-   _parent_obj = parent;
-   _popup = popup = elm_popup_add(parent);
-   evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
-   evas_object_size_hint_align_set(popup, EVAS_HINT_FILL, EVAS_HINT_FILL);
-
-   box = elm_box_add(popup);
+   box = elm_box_add(parent);
    elm_box_horizontal_set(box, EINA_FALSE);
    evas_object_size_hint_weight_set(box, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    evas_object_size_hint_align_set(box, EVAS_HINT_FILL, EVAS_HINT_FILL);
-   elm_object_content_set(popup, box);
-
-   hbox = elm_box_add(popup);
+   elm_object_content_set(parent, box);
+   evas_object_show(box);
+  
+   hbox = elm_box_add(parent);
    elm_box_horizontal_set(hbox, EINA_TRUE);
    evas_object_size_hint_weight_set(hbox, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    evas_object_size_hint_align_set(hbox, EVAS_HINT_FILL, EVAS_HINT_FILL);
    evas_object_show(hbox);
 
+   /* General information*/
    frame = elm_frame_add(hbox);
    elm_object_text_set(frame, _("Summary"));
    evas_object_size_hint_weight_set(frame, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
@@ -339,21 +447,62 @@ edi_scm_screens_commit(Evas_Object *parent)
    evas_object_show(label);
    elm_box_pack_end(hbox, label);
 
+   remote_name = engine->remote_name_get();
+   remote_email = engine->remote_email_get();
+
    string = eina_strbuf_new();
-   eina_strbuf_append_printf(string, "%s:<br><b>%s</b><br>&lt;%s&gt;", 
_("Author"),
-                             engine->remote_name_get(), 
engine->remote_email_get());
+
+   if (!remote_name[0] && !remote_email[0])
+     {
+        eina_strbuf_append(string, _("<hilight>Unable to obtain user 
information.</hilight>"));
+     }
+   else
+     {
+        eina_strbuf_append_printf(string, "%s:<br><b>%s</b><br>&lt;%s&gt;", 
_("Author"),
+                                  engine->remote_name_get(), 
engine->remote_email_get());
+        avatar = elm_image_add(hbox);
+        _edi_scm_ui_screens_avatar_load(avatar, engine->remote_email_get());
+        evas_object_size_hint_min_set(avatar, 48 * elm_config_scale_get(), 48 
* elm_config_scale_get());
+        evas_object_size_hint_weight_set(avatar, 0.1, EVAS_HINT_EXPAND);
+        evas_object_size_hint_align_set(avatar, 1.0, EVAS_HINT_FILL);
+        evas_object_show(avatar);
+        elm_box_pack_end(hbox, avatar);
+   
+        scm_configured = EINA_TRUE;
+     }
+
    elm_object_text_set(label, eina_strbuf_string_get(string));
    eina_strbuf_free(string);
 
-   avatar = elm_image_add(hbox);
-   edi_scm_screens_avatar_load(avatar, engine->remote_email_get());
-   evas_object_size_hint_min_set(avatar, 48 * elm_config_scale_get(), 48 * 
elm_config_scale_get());
-   evas_object_size_hint_weight_set(avatar, 0.1, EVAS_HINT_EXPAND);
-   evas_object_size_hint_align_set(avatar, 1.0, EVAS_HINT_FILL);
-   evas_object_show(avatar);
-   elm_box_pack_end(hbox, avatar);
+   /* Options */
+   hbox = elm_box_add(parent);
+   evas_object_size_hint_weight_set(hbox, EVAS_HINT_EXPAND, 0.0);
+   evas_object_size_hint_align_set(hbox, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   elm_box_horizontal_set(hbox, EINA_TRUE);
+   _check = check = elm_check_add(parent);
+   elm_object_text_set(check, _("Show all changes?"));
+   elm_check_state_set(check, EINA_FALSE);
+   evas_object_show(check);
+   elm_box_pack_end(hbox, check);
+   pbox = elm_box_add(parent);
+   evas_object_size_hint_weight_set(pbox, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(pbox, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   evas_object_show(pbox);
+   elm_box_pack_end(hbox, pbox); 
+   evas_object_show(hbox);
+   evas_object_smart_callback_add(check, "changed",
+                                  _edi_scm_ui_refresh_cb, NULL);
+
+   frame = elm_frame_add(parent);
+   elm_object_text_set(frame, _("Options"));
+   elm_object_content_set(frame, hbox);
+   evas_object_size_hint_weight_set(frame, EVAS_HINT_EXPAND, 0.0);
+   evas_object_size_hint_align_set(frame, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   evas_object_show(frame);
+   elm_box_pack_end(box, frame);
 
-   list = elm_genlist_add(box);
+   /* File listting */
+   _list = list = elm_genlist_add(box);
    elm_genlist_mode_set(list, ELM_LIST_SCROLL);
    elm_list_select_mode_set(list, ELM_OBJECT_SELECT_MODE_NONE);
    elm_scroller_bounce_set(list, EINA_TRUE, EINA_TRUE);
@@ -362,8 +511,7 @@ edi_scm_screens_commit(Evas_Object *parent)
    evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL);
    evas_object_show(list);
 
-    // Start of trick
-   table = elm_table_add(popup);
+   table = elm_table_add(parent);
    evas_object_size_hint_weight_set(table, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    evas_object_size_hint_align_set(table, EVAS_HINT_FILL, EVAS_HINT_FILL);
    rect = evas_object_rectangle_add(table);
@@ -373,7 +521,7 @@ edi_scm_screens_commit(Evas_Object *parent)
    elm_table_pack(table, rect, 0, 0, 1, 1);
    evas_object_show(table);
 
-   frame = elm_frame_add(popup);
+   frame = elm_frame_add(parent);
    evas_object_size_hint_weight_set(frame, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    evas_object_size_hint_align_set(frame, EVAS_HINT_FILL, EVAS_HINT_FILL);
    elm_object_text_set(frame, _("File changes"));
@@ -382,12 +530,11 @@ edi_scm_screens_commit(Evas_Object *parent)
    elm_table_pack(table, list, 0, 0, 1, 1);
    elm_object_content_set(frame, table);
    elm_box_pack_end(box, frame);
-   // End of Trick
 
-   staged_changes = _file_status_list_fill(list);
+   staged_changes = _edi_scm_ui_status_list_fill(list);
 
-   // Start of trick
-   table = elm_table_add(popup);
+   /* Commit entry */
+   table = elm_table_add(parent);
    evas_object_size_hint_weight_set(table, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    evas_object_size_hint_align_set(table, EVAS_HINT_FILL, EVAS_HINT_FILL);
    rect = evas_object_rectangle_add(table);
@@ -397,14 +544,14 @@ edi_scm_screens_commit(Evas_Object *parent)
    elm_table_pack(table, rect, 0, 0, 1, 1);
    evas_object_show(table);
 
-   frame = elm_frame_add(popup);
+   frame = elm_frame_add(parent);
    evas_object_size_hint_weight_set(frame, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    evas_object_size_hint_align_set(frame, EVAS_HINT_FILL, EVAS_HINT_FILL);
    elm_object_text_set(frame, _("Commit message"));
    evas_object_show(frame);
    elm_object_content_set(frame, table);
 
-   input = elm_entry_add(box);
+   _commit_entry = input = elm_entry_add(box);
    elm_object_text_set(input, _("Enter commit summary<br><br>And change 
details<br>"));
    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);
@@ -418,134 +565,70 @@ edi_scm_screens_commit(Evas_Object *parent)
 
    elm_object_content_set(frame, table);
    elm_box_pack_end(box, frame);
-   // End of Trick
 
-   text = edi_scm_diff(EINA_TRUE);
-   if (text[0] && text[1])
-     {
-        frame = elm_frame_add(popup);
-        evas_object_size_hint_weight_set(frame, EVAS_HINT_EXPAND, 
EVAS_HINT_EXPAND);
-        evas_object_size_hint_align_set(frame, EVAS_HINT_FILL, EVAS_HINT_FILL);
-        elm_object_text_set(frame, _("Committed changes"));
-        evas_object_show(frame);
-
-        cbox = elm_box_add(popup);
-        evas_object_size_hint_weight_set(cbox, EVAS_HINT_EXPAND, 
EVAS_HINT_EXPAND);
-        evas_object_size_hint_align_set(cbox, EVAS_HINT_FILL, EVAS_HINT_FILL);
-        evas_object_size_hint_min_set(cbox, 500 * elm_config_scale_get(), 250 
* elm_config_scale_get());
-        evas_object_show(cbox);
-        elm_object_content_set(frame, cbox);
-        elm_box_pack_end(box, frame);
-
-        code = elm_code_create();
-        entry = elm_code_widget_add(box, code);
-        elm_code_parser_standard_add(code, ELM_CODE_PARSER_STANDARD_DIFF);
-        elm_obj_code_widget_font_set(entry, _edi_project_config->font.name, 
_edi_project_config->font.size);
-        elm_obj_code_widget_gravity_set(entry, 0.0, 1.0);
-        elm_obj_code_widget_editable_set(entry, EINA_FALSE);
-        elm_obj_code_widget_line_numbers_set(entry, EINA_FALSE);
-        evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, 
EVAS_HINT_EXPAND);
-        evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
-        evas_object_show(entry);
-        elm_box_pack_end(cbox, entry);
-
-        _entry_lines_append(code, text);
-     }
+   /* Start of elm_code diff widget */
+   frame = elm_frame_add(parent);
+   evas_object_size_hint_weight_set(frame, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(frame, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   elm_object_text_set(frame, _("Source changes"));
+   evas_object_show(frame);
+
+   cbox = elm_box_add(parent);
+   evas_object_size_hint_weight_set(cbox, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(cbox, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   evas_object_size_hint_min_set(cbox, 350 * elm_config_scale_get(), 250 * 
elm_config_scale_get());
+   evas_object_show(cbox);
+   elm_object_content_set(frame, cbox);
+   elm_box_pack_end(box, frame);
 
+   _code = code = elm_code_create();
+   entry = elm_code_widget_add(box, code);
+   elm_code_parser_standard_add(code, ELM_CODE_PARSER_STANDARD_DIFF);
+   elm_obj_code_widget_gravity_set(entry, 0.0, 1.0);
+   elm_obj_code_widget_editable_set(entry, EINA_FALSE);
+   elm_obj_code_widget_line_numbers_set(entry, EINA_FALSE);
+   evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   evas_object_show(entry);
+   elm_box_pack_end(cbox, entry);
+
+   text = edi_scm_diff(EINA_TRUE);
+   _entry_lines_append(code, text);
    free(text);
 
-   button = elm_button_add(popup);
+   /* Start of confirm and cancel buttons */
+   hbox = elm_box_add(parent);
+   evas_object_size_hint_weight_set(hbox, EVAS_HINT_EXPAND, 0.0);
+   evas_object_size_hint_align_set(hbox, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   elm_box_horizontal_set(hbox, EINA_TRUE);
+   evas_object_show(hbox);
+   
+   button = elm_button_add(parent);
+   evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, 
EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(button, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   evas_object_show(button);
    elm_object_text_set(button, _("Cancel"));
-   elm_object_part_content_set(popup, "button1", button);
    evas_object_smart_callback_add(button, "clicked",
-                                  _edi_scm_screens_popup_cancel_cb, popup);
+                                  _edi_scm_ui_screens_popup_cancel_cb, parent);
+   elm_box_pack_end(hbox, button);
 
-   button = elm_button_add(popup);
+   _commit_button = button = elm_button_add(parent);
+   evas_object_size_hint_weight_set(button, EVAS_HINT_EXPAND, 
EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(button, EVAS_HINT_FILL, EVAS_HINT_FILL);
    evas_object_data_set(button, "input", input);
+   evas_object_show(button);
    elm_object_text_set(button, _("Commit"));
    elm_object_disabled_set(button, !staged_changes);
-   elm_object_part_content_set(popup, "button2", button);
    evas_object_smart_callback_add(button, "clicked",
-                                  _edi_scm_screens_commit_cb, input);
-   if (staged_changes)
-     elm_entry_select_all(input);
-
-   elm_object_focus_set(input, EINA_TRUE);
-
-   evas_object_show(popup);
-}
-
-void
-edi_scm_screens_binary_missing(Evas_Object *parent, const char *binary)
-{
-   Evas_Object *popup, *label, *button;
-   Eina_Strbuf *text = eina_strbuf_new();
-
-   eina_strbuf_append_printf(text, _("No %s binary found, please install 
%s."), binary, binary);
-
-   popup = elm_popup_add(parent);
-   elm_object_part_text_set(popup, "title,text", _("Unable to launch SCM 
binary"));
-   label = elm_label_add(popup);
-   elm_object_text_set(label, eina_strbuf_string_get(text));
-   evas_object_show(label);
-   elm_object_content_set(popup, label);
-
-   eina_strbuf_free(text);
-
-   button = elm_button_add(popup);
-   elm_object_text_set(button, _("OK"));
-   elm_object_part_content_set(popup, "button1", button);
-   evas_object_smart_callback_add(button, "clicked", 
_edi_scm_screens_popup_cancel_cb, popup);
-
-   evas_object_show(popup);
-}
-
-const char *
-_edi_scm_avatar_cache_path_get(const char *email)
-{
-   return eina_stringshare_printf("%s/%s/avatars/%s.jpeg", 
efreet_cache_home_get(),
-                                  PACKAGE_NAME, email);
-}
-
-void _edi_scm_screens_avatar_download_complete(void *data, const char *file,
-                                               int status)
-{
-   Evas_Object *image = data;
-
-   if (status != 200)
-     {
-        ecore_file_remove(file);
-        return;
-     }
-
-   elm_image_file_set(image, file, NULL);
-}
-
-void edi_scm_screens_avatar_load(Evas_Object *image, const char *email)
-{
-   const char *tmp, *cache, *cachedir, *cacheparentdir;
+                                  _edi_scm_ui_screens_commit_cb, input);
 
-   cache = _edi_scm_avatar_cache_path_get(email);
-   if (ecore_file_exists(cache))
+   elm_box_pack_end(hbox, button);
+   elm_box_pack_end(box, hbox);
+ 
+   if (staged_changes && scm_configured)
      {
-        elm_image_file_set(image, cache, NULL);
-        return;
+        elm_entry_select_all(input);
+        elm_object_focus_set(input, EINA_TRUE);
      }
-
-   tmp = dirname((char *) cache);
-   cachedir = strdup(tmp);
-   cacheparentdir = dirname((char *) tmp);
-   if (!ecore_file_exists(cacheparentdir) && !ecore_file_mkdir(cacheparentdir))
-     goto clear;
-
-   if (!ecore_file_exists(cachedir) && !ecore_file_mkdir(cachedir))
-     goto clear;
-
-   ecore_file_download(edi_scm_avatar_url_get(email), cache,
-                       _edi_scm_screens_avatar_download_complete, NULL,
-                       image, NULL);
-
-clear:
-   free((char *)cachedir);
 }
 
diff --git a/src/bin/edi_scm_ui.h b/src/bin/edi_scm_ui.h
new file mode 100644
index 0000000..ac394fd
--- /dev/null
+++ b/src/bin/edi_scm_ui.h
@@ -0,0 +1,44 @@
+#ifndef __EDI_SCM_UI_H__
+#define __EDI_SCM_UI_H__
+
+#include <Elementary.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @file
+ * @brief These routines used for managing Edi SCM UI actions.
+ */
+
+/**
+ * @brief SCM management functions.
+ * @defgroup SCM
+ *
+ * @{
+ *
+ * Management of SCM UI actions. 
+ *
+ */
+
+/**
+ * Check the path is not hidden according to project rules.
+ * 
+ * @param path The file path to check.
+ * @ingroup Lookup
+ */
+void edi_scm_ui_add(Evas_Object *parent);
+
+/**
+ * @}
+ */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+
+#endif
diff --git a/src/bin/screens/edi_scm_screens.h 
b/src/bin/screens/edi_scm_screens.h
deleted file mode 100644
index c8f9614..0000000
--- a/src/bin/screens/edi_scm_screens.h
+++ /dev/null
@@ -1,61 +0,0 @@
-#ifndef __EDI_SCM_SCREENS_H__
-#define __EDI_SCM_SCREENS_H__
-
-#include <Elementary.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @file
- * @brief These routines used for managing Edi SCM actions from UI.
- */
-
-/**
- * @brief Scm management functions.
- * @defgroup Scm
- *
- * @{
- *
- * Management of SCM with the UI
- *
- */
-
-/**
- * Create a SCM commit dialogue in the parent obj.
- *
- * @param parent The object into which the UI will load.
- * @ingroup Scm
- */
-void edi_scm_screens_commit(Evas_Object *parent);
-
-/**
- * SCM binary is not installed, show dialogue.
- *
- * @param parent The object into which the UI will load.
- * @param binary The name of the missing binary.
- *
- * @ingroup Scm
- */
-void edi_scm_screens_binary_missing(Evas_Object *parent, const char *binary);
-
-/**
- * Load an avatar image to a given elm_image object.
- *
- * @ingroup Scm
- */
-void edi_scm_screens_avatar_load(Evas_Object *image, const char *email);
-
-/**
- * @}
- */
-
-
-#ifdef __cplusplus
-}
-#endif
-
-
-
-#endif
diff --git a/src/bin/screens/edi_screens.c b/src/bin/screens/edi_screens.c
index 7e3dbcb..b825577 100644
--- a/src/bin/screens/edi_screens.c
+++ b/src/bin/screens/edi_screens.c
@@ -140,3 +140,29 @@ void edi_screens_desktop_notify(const char *title, const 
char *message)
 
    eina_strbuf_free(command);
 }
+
+void
+edi_screens_scm_binary_missing(Evas_Object *parent, const char *binary)
+{
+   Evas_Object *popup, *label, *button;
+   Eina_Strbuf *text = eina_strbuf_new();
+
+   eina_strbuf_append_printf(text, _("No %s binary found, please install 
%s."), binary, binary);
+
+   popup = elm_popup_add(parent);
+   elm_object_part_text_set(popup, "title,text", _("Unable to launch SCM 
binary"));
+   label = elm_label_add(popup);
+   elm_object_text_set(label, eina_strbuf_string_get(text));
+   evas_object_show(label);
+   elm_object_content_set(popup, label);
+
+   eina_strbuf_free(text);
+
+   button = elm_button_add(popup);
+   elm_object_text_set(button, _("OK"));
+   elm_object_part_content_set(popup, "button1", button);
+   evas_object_smart_callback_add(button, "clicked", 
_edi_screens_popup_cancel_cb, popup);
+
+   evas_object_show(popup);
+}
+
diff --git a/src/bin/screens/edi_screens.h b/src/bin/screens/edi_screens.h
index fb4906e..9ffa571 100644
--- a/src/bin/screens/edi_screens.h
+++ b/src/bin/screens/edi_screens.h
@@ -94,6 +94,16 @@ void edi_screens_message(Evas_Object *parent, const char 
*title, const char *mes
 void edi_screens_desktop_notify(const char *title, const char *message);
 
 /**
+ * SCM binary is not installed, show dialogue.
+ *
+ * @param parent The object into which the UI will load.
+ * @param binary The name of the missing binary.
+ *
+ * @ingroup Scm
+ */
+void edi_screens_scm_binary_missing(Evas_Object *parent, const char *binary);
+
+/**
  * @}
  */
 
diff --git a/src/lib/edi_scm.c b/src/lib/edi_scm.c
index 466dd44..46eae75 100644
--- a/src/lib/edi_scm.c
+++ b/src/lib/edi_scm.c
@@ -217,7 +217,7 @@ _parse_line(char *line)
 
    esc_path = ecore_file_escape_name(path);
    status->path = eina_stringshare_add(esc_path);
-   fullpath = edi_path_append(edi_project_get(), esc_path);
+   fullpath = edi_path_append(edi_scm_engine_get()->workdir, esc_path);
    status->fullpath = eina_stringshare_add(fullpath);
    status->unescaped = eina_stringshare_add(path);
 
@@ -740,12 +740,26 @@ _edi_scm_git_init()
    engine->credentials_set = _edi_scm_git_credentials_set;
    engine->status_get = _edi_scm_git_status_get;
 
+   if (edi_project_get())
+     engine->workdir = (char *) edi_project_get();
+   else
+     engine->workdir = getcwd(NULL, PATH_MAX);
+
    engine->initialized = EINA_TRUE;
 
    return engine;
 }
 
 EAPI Edi_Scm_Engine *
+edi_scm_generic_init(void)
+{
+   if (ecore_file_exists(".git"))
+     return _edi_scm_git_init();
+
+   return NULL;
+}
+
+EAPI Edi_Scm_Engine *
 edi_scm_init(void)
 {
    if (edi_project_file_exists(".git"))
diff --git a/src/lib/edi_scm.h b/src/lib/edi_scm.h
index 0f14865..71ccdda 100644
--- a/src/lib/edi_scm.h
+++ b/src/lib/edi_scm.h
@@ -57,6 +57,7 @@ typedef struct _Edi_Scm_Engine
    const char     *name;
    const char     *directory;
    const char     *path;
+   char           *workdir;
    Eina_List      *statuses;
 
    scm_fn_add         *file_add;
@@ -98,6 +99,13 @@ typedef struct _Edi_Scm_Engine
 Edi_Scm_Engine *edi_scm_init();
 
 /**
+ * Init the SCM system.
+ *
+ * @ingroup Scm
+ */
+EAPI Edi_Scm_Engine *edi_scm_generic_init(void);
+
+/**
  * Shutdown and free memory in use by SCM system.
  *
  * @ingroup Scm

-- 


Reply via email to