hermet pushed a commit to branch master. http://git.enlightenment.org/tools/enventor.git/commit/?id=8c68bc9981ce02f1c7efd3d050646c57afb90cf5
commit 8c68bc9981ce02f1c7efd3d050646c57afb90cf5 Author: Jaehyun Cho <[email protected]> Date: Fri Oct 24 13:21:10 2014 +0900 file_mgr: Support that an edc is opened by different processes. Summary: file_mgr: Support that an edc is opened by different processes. Open warning window to synchronize or ignore the edc changes. Reviewers: Hermet Reviewed By: Hermet Differential Revision: https://phab.enlightenment.org/D1561 --- data/themes/default/layout_common.edc | 16 ++-- src/bin/Makefile.am | 3 +- src/bin/file_mgr.c | 153 ++++++++++++++++++++++++++++++++++ src/bin/main.c | 2 + src/bin/menu.c | 20 +++-- src/include/Makefile.am | 3 +- src/include/common.h | 1 + src/include/file_mgr.h | 2 + 8 files changed, 181 insertions(+), 19 deletions(-) diff --git a/data/themes/default/layout_common.edc b/data/themes/default/layout_common.edc index ffa3517..0a51b8e 100644 --- a/data/themes/default/layout_common.edc +++ b/data/themes/default/layout_common.edc @@ -613,7 +613,6 @@ group { name: "warning_layout"; description { rel1 { to: "elm.text.title"; relative: 0.5 1; offset: 0 10; } rel2 { to: "elm.text.title"; relative: 0.5 1; } - text.text: "Without save, you will lose last changes!"; text { font: FN; size: 11; @@ -632,7 +631,6 @@ group { name: "warning_layout"; description { rel1 { to: "elm.text.desc"; relative: 0.5 1; } rel2 { to: "elm.text.desc"; relative: 0.5 1; } - text.text: "Are you sure you want to do this?"; text { font: FN; size: 11; @@ -644,13 +642,13 @@ group { name: "warning_layout"; fixed: 1 1; } } - part { name: "elm.swallow.save"; + part { name: "elm.swallow.btn1"; type: SWALLOW; clip_to: "clipper"; scale: 1; description { - rel1.to: "elm.swallow.yes"; - rel2.to: "elm.swallow.yes"; + rel1.to: "elm.swallow.btn2"; + rel2.to: "elm.swallow.btn2"; rel1.relative: 0 0; rel2.relative: 0 1; rel2.offset: -10 -1; @@ -659,7 +657,7 @@ group { name: "warning_layout"; fixed: 1 1; } } - part { name: "elm.swallow.yes"; + part { name: "elm.swallow.btn2"; type: SWALLOW; clip_to: "clipper"; scale: 1; @@ -673,13 +671,13 @@ group { name: "warning_layout"; fixed: 1 1; } } - part { name: "elm.swallow.no"; + part { name: "elm.swallow.btn3"; type: SWALLOW; clip_to: "clipper"; scale: 1; description { - rel1.to: "elm.swallow.yes"; - rel2.to: "elm.swallow.yes"; + rel1.to: "elm.swallow.btn2"; + rel2.to: "elm.swallow.btn2"; rel1.relative: 1 0; rel2.relative: 1 1; rel1.offset: 10 0; diff --git a/src/bin/Makefile.am b/src/bin/Makefile.am index e353761..dc77060 100644 --- a/src/bin/Makefile.am +++ b/src/bin/Makefile.am @@ -23,7 +23,8 @@ enventor_SOURCES = \ setting.c \ globals.c \ live_edit.c \ - console.c + console.c \ + file_mgr.c enventor_LDADD = \ $(top_builddir)/src/lib/libenventor.la \ diff --git a/src/bin/file_mgr.c b/src/bin/file_mgr.c new file mode 100644 index 0000000..1212377 --- /dev/null +++ b/src/bin/file_mgr.c @@ -0,0 +1,153 @@ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#define ENVENTOR_BETA_API_SUPPORT 1 + +#include <Eio.h> +#include <Enventor.h> +#include "common.h" + +typedef struct file_mgr_s { + Evas_Object *enventor; + Evas_Object *warning_layout; + + Eina_Bool edc_modified : 1; +} file_mgr_data; + +static file_mgr_data *g_fmd = NULL; + +static void +warning_dismiss_done(void *data, Evas_Object *obj EINA_UNUSED, + const char *emission EINA_UNUSED, + const char *source EINA_UNUSED) +{ + file_mgr_data *fmd = data; + evas_object_del(fmd->warning_layout); + fmd->warning_layout = NULL; +} + +static void +warning_close(file_mgr_data *fmd) +{ + elm_object_signal_emit(fmd->warning_layout, "elm,state,dismiss", ""); +} + +static void +warning_skip_btn_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + file_mgr_data *fmd = data; + enventor_object_modified_set(fmd->enventor, EINA_TRUE); + warning_close(fmd); +} + +static void +warning_save_btn_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + file_mgr_data *fmd = data; + enventor_object_modified_set(fmd->enventor, EINA_TRUE); + menu_edc_save(); + warning_close(fmd); +} + +static void +warning_load_btn_cb(void *data, Evas_Object *obj EINA_UNUSED, + void *event_info EINA_UNUSED) +{ + file_mgr_data *fmd = data; + enventor_object_file_set(fmd->enventor, config_edc_path_get()); + enventor_object_modified_set(fmd->enventor, EINA_FALSE); + warning_close(fmd); +} + +static void +warning_open(file_mgr_data *fmd, Evas_Smart_Cb skip_cb, + Evas_Smart_Cb save_cb, Evas_Smart_Cb load_cb) +{ + if (fmd->warning_layout) return; + + //Layout + Evas_Object *layout = elm_layout_add(base_win_get()); + elm_layout_file_set(layout, EDJE_PATH, "warning_layout"); + elm_object_part_text_set(layout, "elm.text.desc", + "Another program has changed the same EDC!"); + elm_object_part_text_set(layout, "elm.text.question", + "Are you sure you want to do this?"); + elm_object_signal_callback_add(layout, "elm,state,dismiss,done", "", + warning_dismiss_done, fmd); + evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_show(layout); + base_win_resize_object_add(layout); + + Evas_Object *btn; + + //Skip Button + btn = elm_button_add(layout); + elm_object_text_set(btn, "Skip"); + evas_object_smart_callback_add(btn, "clicked", skip_cb, fmd); + elm_object_part_content_set(layout, "elm.swallow.btn1", btn); + + //Save Button + btn = elm_button_add(layout); + elm_object_text_set(btn, "Save"); + evas_object_smart_callback_add(btn, "clicked", save_cb, fmd); + elm_object_part_content_set(layout, "elm.swallow.btn2", btn); + + //Load Button + btn = elm_button_add(layout); + elm_object_text_set(btn, "Load"); + evas_object_smart_callback_add(btn, "clicked", load_cb, fmd); + elm_object_part_content_set(layout, "elm.swallow.btn3", btn); + + fmd->warning_layout = layout; +} + +static Eina_Bool +enventor_edc_modified_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event) +{ + file_mgr_data *fmd = g_fmd; + Enventor_EDC_Modified *modified = event; + + if (modified->self_changed) + { + fmd->edc_modified = EINA_FALSE; + return ECORE_CALLBACK_DONE; + } + + if (!fmd->edc_modified) + { + fmd->edc_modified = EINA_TRUE; + return ECORE_CALLBACK_DONE; + } + + warning_open(fmd, warning_skip_btn_cb, warning_save_btn_cb, + warning_load_btn_cb); + fmd->edc_modified = EINA_FALSE; + return ECORE_CALLBACK_DONE; +} + +void +file_mgr_init(Evas_Object *enventor) +{ + file_mgr_data *fmd = calloc(1, sizeof(file_mgr_data)); + if (!fmd) + { + EINA_LOG_ERR("Failed to allocate Memory!"); + return; + } + g_fmd = fmd; + + fmd->enventor = enventor; + + evas_object_smart_callback_add(enventor, "edc,modified", + enventor_edc_modified_cb, fmd); +} + +void +file_mgr_term(void) +{ + file_mgr_data *fmd = g_fmd; + free(fmd); +} diff --git a/src/bin/main.c b/src/bin/main.c index 53ea6ad..29bd801 100644 --- a/src/bin/main.c +++ b/src/bin/main.c @@ -776,6 +776,7 @@ init(app_data *ad, int argc, char **argv) base_gui_init(); statusbar_set(); enventor_setup(ad); + file_mgr_init(ad->enventor); tools_set(ad->enventor); base_gui_show(); @@ -799,6 +800,7 @@ term(app_data *ad EINA_UNUSED) #endif stats_term(); base_gui_term(); + file_mgr_term(); config_term(); enventor_shutdown(); } diff --git a/src/bin/menu.c b/src/bin/menu.c index e43ec6f..396d2ed 100644 --- a/src/bin/menu.c +++ b/src/bin/menu.c @@ -177,6 +177,10 @@ warning_open(menu_data *md, Evas_Smart_Cb yes_cb, Evas_Smart_Cb save_cb) //Layout Evas_Object *layout = elm_layout_add(base_win_get()); elm_layout_file_set(layout, EDJE_PATH, "warning_layout"); + elm_object_part_text_set(layout, "elm.text.desc", + "Without save, you will lose last changes!"); + elm_object_part_text_set(layout, "elm.text.question", + "Are you sure you want to do this?"); elm_object_signal_callback_add(layout, "elm,state,dismiss,done", "", warning_dismiss_done, md); evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); @@ -191,19 +195,19 @@ warning_open(menu_data *md, Evas_Smart_Cb yes_cb, Evas_Smart_Cb save_cb) evas_object_smart_callback_add(btn, "clicked", save_cb, md); evas_object_show(btn); elm_object_focus_set(btn, EINA_TRUE); - elm_object_part_content_set(layout, "elm.swallow.save", btn); - - //No Button - btn = elm_button_add(layout); - elm_object_text_set(btn, "No"); - evas_object_smart_callback_add(btn, "clicked", warning_no_btn_cb, md); - elm_object_part_content_set(layout, "elm.swallow.no", btn); + elm_object_part_content_set(layout, "elm.swallow.btn1", btn); //Yes Button btn = elm_button_add(layout); elm_object_text_set(btn, "Yes"); evas_object_smart_callback_add(btn, "clicked", yes_cb, md); - elm_object_part_content_set(layout, "elm.swallow.yes", btn); + elm_object_part_content_set(layout, "elm.swallow.btn2", btn); + + //No Button + btn = elm_button_add(layout); + elm_object_text_set(btn, "No"); + evas_object_smart_callback_add(btn, "clicked", warning_no_btn_cb, md); + elm_object_part_content_set(layout, "elm.swallow.btn3", btn); md->warning_layout = layout; menu_activate_request(); diff --git a/src/include/Makefile.am b/src/include/Makefile.am index 9a64c9e..6e9cdf2 100644 --- a/src/include/Makefile.am +++ b/src/include/Makefile.am @@ -15,4 +15,5 @@ EXTRA_DIST = common.h \ setting.h \ search.h \ live_edit.h \ - console.h + console.h \ + file_mgr.h diff --git a/src/include/common.h b/src/include/common.h index 7185261..85f8795 100644 --- a/src/include/common.h +++ b/src/include/common.h @@ -22,5 +22,6 @@ typedef struct statusbar_s stats_data; #include "setting.h" #include "live_edit.h" #include "console.h" +#include "file_mgr.h" #endif diff --git a/src/include/file_mgr.h b/src/include/file_mgr.h new file mode 100644 index 0000000..0e48d1a --- /dev/null +++ b/src/include/file_mgr.h @@ -0,0 +1,2 @@ +void file_mgr_init(Evas_Object *enventor); +void file_mgr_term(void); --
