live_edit: revise the code

This commit is contained in:
ChunEon Park 2014-08-11 16:32:35 +09:00
parent 71c3db0766
commit f6fe9b7955
17 changed files with 166 additions and 203 deletions

1
README
View File

@ -49,6 +49,7 @@ Ctrl+Right = On/Off Full Live View
Ctrl+Top = On/Off Full Console View
Ctrl+Bottom = On/Off Full Editors View
Ctrl+T = Insert Defaut Template Code
Ctrl+M = On/Off Live View Edit Mode
Ctrl+Mouse Wheel Up = View Scale Up / Font Size Up
Ctrl+Mouse Wheel Down = View Scale Down / Font Size Down
Ctrl+Shift+B = Insert Part Template Code: Textblock

View File

@ -55,4 +55,5 @@ EXTRA_DIST = \
goto.png \
downlight_glow_left.png \
downlight_glow_right.png \
alarm_highlight.png
alarm_highlight.png \
disabler.png

View File

@ -2140,19 +2140,20 @@ group { name: "edit_layout";
color: 0 0 0 0;
}
description { state: "disabled" 0.0;
color: 0 0 0 160;
color: 0 0 0 75;
}
}
part { name: "disabler_decorations";
mouse_events: 0;
description { state: "default" 0.0;
image.normal: "disabler.png";
fill.type: TILE;
color: 155 155 155 0;
visible: 0;
}
description { state: "disabled" 0.0;
inherit: "default" 0.0;
color: 55 55 77 200;
visible: 1;
}
}
}
@ -2173,19 +2174,17 @@ group { name: "edit_layout";
programs {
program { name: "layout_disable";
signal: "elm,state,disabled";
source: "editor";
action: STATE_SET "disabled" 0.0;
target: "disabler_bg";
target: "disabler_decorations";
transition: DECELERATE 0.35;
transition: DECELERATE 0.125;
}
program { name: "layout_enable";
signal: "elm,state,enabled";
source: "editor";
action: STATE_SET "default" 0.0;
target: "disabler_bg";
target: "disabler_decorations";
transition: DECELERATE 0.35;
transition: DECELERATE 0.125;
}
}
}

View File

@ -623,13 +623,12 @@ config_live_edit_get(void)
}
void
config_live_edit_set(Eina_Bool enabled)
config_live_edit_set(Eina_Bool live_edit)
{
config_data *cd = g_cd;
cd->live_edit = enabled;
cd->live_edit = live_edit;
}
void
config_auto_complete_set(Eina_Bool auto_complete)
{

View File

@ -1188,14 +1188,13 @@ edit_redoundo_region_push(edit_data *ed, int cursor_pos1, int cursor_pos2)
}
void
edit_disabled_set(edit_data *ed, Eina_Bool disable)
edit_disabled_set(edit_data *ed, Eina_Bool disabled)
{
elm_object_disabled_set(ed->layout, disable);
elm_object_focus_allow_set(ed->layout, disable);
evas_object_freeze_events_set (ed->layout, disable);
elm_object_disabled_set(ed->layout, disabled);
elm_object_focus_allow_set(ed->layout, disabled);
if (disable)
elm_object_signal_emit(ed->layout, "elm,state,disabled", "editor");
if (disabled)
elm_object_signal_emit(ed->layout, "elm,state,disabled", "");
else
elm_object_signal_emit(ed->layout, "elm,state,enabled", "editor");
elm_object_signal_emit(ed->layout, "elm,state,enabled", "");
}

View File

@ -936,10 +936,8 @@ end_of_parts_block_find(const char *pos)
while (*pos)
{
if (*pos == '{') level++;
else if (*pos == '}')
{
level--;
}
else if (*pos == '}') level--;
if (!level) return --pos;
pos++;
}
@ -949,11 +947,12 @@ end_of_parts_block_find(const char *pos)
static const char *
group_beginning_pos_get(const char* source, const char *group_name)
{
const char* group_block_name = "group";
const char* GROUP_SYNTAX_NAME = "group";
const int quot_len = QUOT_LEN;
const char *quot = QUOT;
const char *pos = strstr(source, group_block_name);
const char *pos = strstr(source, GROUP_SYNTAX_NAME);
//TODO: Process comments and quotes.
while (pos)
{
@ -963,17 +962,17 @@ group_beginning_pos_get(const char* source, const char *group_name)
if (!pos) return NULL;
if (!strncmp(name, group_name, strlen(group_name)))
return pos;
pos = strstr(++pos, group_block_name);
pos = strstr(++pos, GROUP_SYNTAX_NAME);
}
return NULL;
}
Evas_Coord
parser_end_of_parts_block_pos_get(const Evas_Object *entry, const char *group_name)
int
parser_end_of_parts_block_pos_get(const Evas_Object *entry,
const char *group_name)
{
if (!group_name)
return -1;
if (!group_name) return -1;
const char *text = elm_entry_entry_get(entry);
if (!text) return -1;
@ -982,45 +981,61 @@ parser_end_of_parts_block_pos_get(const Evas_Object *entry, const char *group_na
if (!utf8) return -1;
const char *pos = group_beginning_pos_get(utf8, group_name);
if (!pos) return -1;
if (!pos)
{
free(utf8);
return -1;
}
pos = end_of_parts_block_find(++pos);
if (pos) return pos - utf8 + 1;
return -1;
if (!pos)
{
free(utf8);
return - 1;
}
int ret = (pos - utf8) + 1;
free(utf8);
return ret;
}
Eina_Bool
parser_images_pos_get(const Evas_Object *entry, Evas_Coord *res_position)
parser_images_pos_get(const Evas_Object *entry, int *ret)
{
if (!res_position) return EINA_FALSE;
const char* GROUP_SYNTAX_NAME = "group";
const char* IMAGES_BLOCK_NAME = "images";
const int IMAGES_BLOCK_NAME_LEN = 6; //strlen of "images"
const char* group_block_name = "group";
const char* images_block_name = "images";
Evas_Coord images_block_name_len = 6; //strlen of "images"
if (!ret) return EINA_FALSE;
*ret = -1;
*res_position = -1;
const char *text = elm_entry_entry_get(entry);
if (!text) return EINA_FALSE;
char *utf8 = elm_entry_markup_to_utf8(text);
if (!utf8) return EINA_FALSE;
const char *pos = strstr(utf8, images_block_name);
const char *pos = strstr(utf8, IMAGES_BLOCK_NAME);
if (pos)
{
// TODO: Remove this check and process lines of the form "images.image: "logo.png" COMP;"
if (*(pos + images_block_name_len + 1) == '.')
/* TODO: Remove this check and process lines of the form
"images.image: "logo.png" COMP;" */
if (*(pos + IMAGES_BLOCK_NAME_LEN + 1) == '.')
return EINA_FALSE;
pos = strstr(pos, "{\n");
if (!pos) return EINA_FALSE;
*res_position = pos - utf8 + 2;
*ret = pos - utf8 + 2;
return EINA_TRUE;
}
pos = strstr(utf8, group_block_name);
pos = strstr(utf8, GROUP_SYNTAX_NAME);
if (pos)
{
*res_position = pos - utf8;
*ret = pos - utf8;
return EINA_FALSE;
}
return EINA_FALSE;

View File

@ -10,6 +10,7 @@ struct viewer_s
Evas_Object *parent;
Evas_Object *layout;
Evas_Object *scroller;
Evas_Object *event_rect;
Evas_Object *part_obj;
Evas_Object *part_highlight;
@ -199,6 +200,8 @@ event_layer_set(view_data *vd)
layout_del_cb, rect);
evas_object_event_callback_add(rect, EVAS_CALLBACK_MOUSE_MOVE,
rect_mouse_move_cb, vd);
vd->event_rect = rect;
}
static Evas_Object *
@ -318,12 +321,6 @@ view_obj_get(view_data *vd)
return vd->scroller;
}
Evas_Object *
view_layout_get(view_data *vd)
{
return vd->layout;
}
void
view_program_run(view_data *vd, const char *program)
{

View File

@ -1,156 +1,137 @@
#include <Elementary.h>
#include "common.h"
struct live_editor_s
typedef struct menu_data_s
{
const char *name;
int type;
} menu_data;
typedef struct live_editor_s
{
Evas_Object *menu;
edit_data *ed;
} live_data;
const int MENU_ITEMS_NUM = 6;
static const menu_data MENU_ITEMS[] =
{
{"RECT", EDJE_PART_TYPE_RECTANGLE},
{"IMAGE", EDJE_PART_TYPE_IMAGE},
{"SPACER", EDJE_PART_TYPE_SPACER},
{"SWALLOW", EDJE_PART_TYPE_SWALLOW},
{"TEXT", EDJE_PART_TYPE_TEXT},
{"TEXTBLOCK", EDJE_PART_TYPE_TEXTBLOCK}
};
#define LIVE_EDIT_ITEMS_NUM 6
static const char *LIVE_EDIT_MENU_LABELS[LIVE_EDIT_ITEMS_NUM] =
{
"RECT",
"IMAGE",
"SPACER",
"SWALLOW",
"TEXT",
"TEXTBLOCK"
};
static live_data *g_ld = NULL;
static Eina_Bool
live_edit_part_insert(live_edit_data *led, unsigned int part_type,
Eina_Stringshare *group_name)
static void
menu_it_selected_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
{
Edje_Part_Type type;
switch (part_type)
{
case 0:
{
type = EDJE_PART_TYPE_RECTANGLE;
break;
}
case 1:
{
type = EDJE_PART_TYPE_IMAGE;
break;
}
case 2:
{
type = EDJE_PART_TYPE_SPACER;
break;
}
case 3:
{
type = EDJE_PART_TYPE_SWALLOW;
break;
}
case 4:
{
type = EDJE_PART_TYPE_TEXT;
break;
}
case 5:
{
type = EDJE_PART_TYPE_TEXTBLOCK;
break;
}
}
template_live_edit_part_insert(led->ed, type, group_name);
return EINA_TRUE;
}
live_edit_data*
live_edit_init(edit_data *ed)
{
live_edit_data *led = calloc(1, sizeof(live_edit_data));
if (!led)
{
EINA_LOG_ERR("Failed to allocate Memory!");
return NULL;
}
led->ed = ed;
return led;
live_data *ld = data;
const Elm_Object_Item *it = event_info;
unsigned int idx = elm_menu_item_index_get(it);
template_live_edit_part_insert(ld->ed, MENU_ITEMS[idx].type,
view_group_name_get(VIEW_DATA));
evas_object_del(ld->menu);
ld->menu = NULL;
}
static void
live_edit_menu_item_selected_cb(void *data, Evas_Object *obj, void *event_info)
menu_dismissed_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
{
live_edit_data *led = data;
const Elm_Object_Item *it = event_info;
unsigned int part_type = elm_menu_item_index_get(it);
live_edit_part_insert(led, part_type, view_group_name_get(VIEW_DATA));
live_data *ld = data;
evas_object_del(ld->menu);
ld->menu = NULL;
}
static Evas_Object *
live_edit_menu_create(Evas_Object *parent, live_edit_data *led)
menu_create(Evas_Object *parent, live_data *ld)
{
long int i;
int i;
Evas_Object* icon;
Elm_Object_Item *it;
Evas_Object *menu = elm_menu_add(parent);
for (i = 0; i < LIVE_EDIT_ITEMS_NUM; i++)
for (i = 0; i < MENU_ITEMS_NUM; i++)
{
it = elm_menu_item_add(menu, NULL, NULL,
LIVE_EDIT_MENU_LABELS[i],
live_edit_menu_item_selected_cb, led);
it = elm_menu_item_add(menu, NULL, NULL, MENU_ITEMS[i].name,
menu_it_selected_cb, ld);
icon = elm_image_add(menu);
elm_image_file_set(icon, EDJE_PATH, LIVE_EDIT_MENU_LABELS[i]);
elm_image_file_set(icon, EDJE_PATH, MENU_ITEMS[i].name);
elm_object_item_part_content_set(it, NULL, icon);
}
evas_object_smart_callback_add(menu, "dismissed", menu_dismissed_cb, ld);
return menu;
}
static void
live_edit_menu_show_cb(void *data, Evas *e EINA_UNUSED,
Evas_Object *obj EINA_UNUSED, void *event_info)
layout_mouse_up_cb(void *data, Evas *e EINA_UNUSED,
Evas_Object *obj EINA_UNUSED, void *event_info)
{
Evas_Event_Mouse_Up *ev = event_info;
live_edit_data *led = data;
live_data *ld = data;
// Check if the right button is pressed
if (ev->button != 3) return;
if (!led->menu)
led->menu = live_edit_menu_create(obj, led);
ld->menu = menu_create(obj, ld);
elm_menu_move(led->menu, ev->canvas.x, ev->canvas.y);
evas_object_show(led->menu);
elm_menu_move(ld->menu, ev->canvas.x, ev->canvas.y);
evas_object_show(ld->menu);
}
void
live_edit_toggle(live_edit_data* led, Eina_Bool is_on)
live_edit_toggle(void)
{
if (VIEW_DATA)
{
Evas_Object *view_layout = view_layout_get(VIEW_DATA);
live_data *ld = g_ld;
Eina_Bool on = !config_live_edit_get();
if (is_on)
evas_object_event_callback_add(view_layout, EVAS_CALLBACK_MOUSE_UP,
live_edit_menu_show_cb, led);
else
evas_object_event_callback_del(view_layout, EVAS_CALLBACK_MOUSE_UP,
live_edit_menu_show_cb);
Evas_Object *event_obj = view_obj_get(VIEW_DATA);
if (!event_obj) return;
if (on)
{
evas_object_event_callback_add(event_obj, EVAS_CALLBACK_MOUSE_UP,
layout_mouse_up_cb, ld);
}
else
{
evas_object_event_callback_del(event_obj, EVAS_CALLBACK_MOUSE_UP,
layout_mouse_up_cb);
}
edit_disabled_set(led->ed, is_on);
if (is_on)
stats_info_msg_update("Enabled Live View Edit Mode");
else
stats_info_msg_update("Disabled Live View Edit Mode");
edit_disabled_set(ld->ed, on);
if (on) stats_info_msg_update("Enabled Live View Edit Mode.");
else stats_info_msg_update("Disabled Live View Edit Mode.");
config_live_edit_set(on);
}
void
live_edit_term(live_edit_data* led)
live_edit_init(edit_data *ed)
{
if (led->menu)
evas_object_del(led->menu);
free(led);
live_data *ld = calloc(1, sizeof(live_data));
if (!ld)
{
EINA_LOG_ERR("Faild to allocate Memory!");
return;
}
g_ld = ld;
ld->ed = ed;
}
#undef LIVE_EDIT_ITEMS_NUM
void
live_edit_term()
{
live_data *ld = g_ld;
if (ld->menu) evas_object_del(ld->menu);
free(ld);
g_ld = NULL;
}

View File

@ -6,7 +6,6 @@
typedef struct app_s
{
edit_data *ed;
live_edit_data *led;
Eio_Monitor *edc_monitor;
@ -193,9 +192,7 @@ ctrl_func(app_data *ad, const char *key)
//Live Edit
if (!strcmp(key, "m") || !strcmp(key, "M"))
{
Eina_Bool is_on = !config_live_edit_get();
config_live_edit_set(is_on);
live_edit_toggle(ad->led, is_on);
live_edit_toggle();
return ECORE_CALLBACK_DONE;
}
@ -392,14 +389,6 @@ edc_edit_set(app_data *ad)
ad->ed = ed;
}
static void
live_edit_set(app_data *ad)
{
ad->led = live_edit_init(ad->ed);
Eina_Bool is_on = config_live_edit_get();
live_edit_toggle(ad->led, is_on);
}
static void
statusbar_set()
{
@ -422,7 +411,6 @@ config_update_cb(void *data)
base_statusbar_toggle(EINA_FALSE);
edit_part_highlight_toggle(ad->ed, EINA_FALSE);
view_dummy_toggle(VIEW_DATA, EINA_FALSE);
live_edit_toggle(ad->led, config_live_edit_get());
//previous build was failed, Need to rebuild then reload the edj.
if (edj_mgr_reload_need_get())
@ -545,9 +533,9 @@ edj_mgr_set()
}
static void
tools_set(edit_data *ed, live_edit_data *led)
tools_set(edit_data *ed)
{
Evas_Object *tools = tools_create(base_layout_get(), ed, led);
Evas_Object *tools = tools_create(base_layout_get(), ed);
base_tools_set(tools);
}
@ -572,10 +560,10 @@ init(app_data *ad, int argc, char **argv)
edj_mgr_set();
statusbar_set();
edc_edit_set(ad);
live_edit_set(ad);
edc_view_set(stats_group_name_get());
menu_init(ad->ed);
tools_set(ad->ed, ad->led);
tools_set(ad->ed);
live_edit_init(ad->ed);
base_gui_show();
@ -593,7 +581,7 @@ term(app_data *ad)
build_term();
menu_term();
edit_term(ad->ed);
live_edit_term(ad->led);
live_edit_term();
edj_mgr_term();
stats_term();
base_gui_term();

View File

@ -19,7 +19,6 @@ struct setting_s
Evas_Object *toggle_swallow;
Evas_Object *toggle_indent;
Evas_Object *toggle_autocomp;
Evas_Object *toggle_live_edit;
};
typedef struct setting_s setting_data;
@ -116,7 +115,6 @@ setting_apply_btn_cb(void *data, Evas_Object *obj EINA_UNUSED,
config_dummy_swallow_set(elm_check_state_get(sd->toggle_swallow));
config_auto_indent_set(elm_check_state_get(sd->toggle_indent));
config_auto_complete_set(elm_check_state_get(sd->toggle_autocomp));
config_live_edit_set(elm_check_state_get(sd->toggle_live_edit));
config_apply();
@ -156,7 +154,6 @@ setting_reset_btn_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
elm_check_state_set(sd->toggle_swallow, config_dummy_swallow_get());
elm_check_state_set(sd->toggle_indent, config_auto_indent_get());
elm_check_state_set(sd->toggle_autocomp, config_auto_complete_get());
elm_check_state_set(sd->toggle_live_edit, config_live_edit_get());
}
static Evas_Object *
@ -354,11 +351,6 @@ setting_open(void)
Evas_Object *toggle_autocomp = toggle_create(box, "Auto Completion",
config_auto_complete_get());
elm_box_pack_end(box, toggle_autocomp);
//Toggle (Live Edit)
Evas_Object *toggle_live_edit = toggle_create(box, "Live Edit",
config_live_edit_get());
elm_box_pack_end(box, toggle_live_edit);
Evas_Object *btn;
@ -396,7 +388,6 @@ setting_open(void)
sd->toggle_swallow = toggle_swallow;
sd->toggle_indent = toggle_indent;
sd->toggle_autocomp = toggle_autocomp;
sd->toggle_live_edit = toggle_live_edit;
menu_activate_request();
}

View File

@ -14,12 +14,11 @@ static const char *
template_part_first_line_get(void)
{
static char buf[40];
char name[9];
char name[8];
int i;
for (i = 0; i < 8; i++)
name[i] = NAME_SEED[(rand() % NAME_SEED_LEN)];
name[8] = '\0';
snprintf(buf, sizeof(buf), "part { name: \"%s\";<br/>", name);
@ -257,8 +256,7 @@ internal_template_part_insert(edit_data *ed,
}
void
template_live_edit_part_insert(edit_data *ed,
Edje_Part_Type type,
template_live_edit_part_insert(edit_data *ed, Edje_Part_Type type,
const Eina_Stringshare *group_name)
{
internal_template_part_insert(ed, type, TEMPLATE_PART_INSERT_LIVE_EDIT,
@ -266,8 +264,7 @@ template_live_edit_part_insert(edit_data *ed,
}
void
template_part_insert(edit_data *ed,
Edje_Part_Type type)
template_part_insert(edit_data *ed, Edje_Part_Type type)
{
internal_template_part_insert(ed, type,
TEMPLATE_PART_INSERT_DEFAULT, NULL);

View File

@ -103,15 +103,12 @@ console_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
static void
live_edit_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
{
live_edit_data *led = data;
Eina_Bool is_on = !config_live_edit_get();
config_live_edit_set(is_on);
live_edit_toggle(led, is_on);
live_edit_toggle();
item_unselect((Elm_Object_Item *)event_info);
}
Evas_Object *
tools_create(Evas_Object *parent, edit_data *ed, live_edit_data *led)
tools_create(Evas_Object *parent, edit_data *ed)
{
Evas_Object *toolbar = elm_toolbar_add(parent);
elm_object_style_set(toolbar, "item_horizontal");
@ -136,6 +133,8 @@ tools_create(Evas_Object *parent, edit_data *ed, live_edit_data *led)
elm_toolbar_item_icon_file_set(it, EDJE_PATH, "highlight");
it = elm_toolbar_item_append(toolbar, NULL, "Swallow", swallow_cb, NULL);
elm_toolbar_item_icon_file_set(it, EDJE_PATH, "swallow_s");
it = elm_toolbar_item_append(toolbar, NULL, "LiveEdit", live_edit_cb, NULL);
elm_toolbar_item_icon_file_set(it, EDJE_PATH, "live-edit");
it = elm_toolbar_item_append(toolbar, NULL, "Lines", lines_cb, ed);
elm_toolbar_item_icon_file_set(it, EDJE_PATH, "lines");
it = elm_toolbar_item_append(toolbar, NULL, "Find", find_cb, ed);
@ -146,8 +145,6 @@ tools_create(Evas_Object *parent, edit_data *ed, live_edit_data *led)
elm_toolbar_item_icon_file_set(it, EDJE_PATH, "status");
it = elm_toolbar_item_append(toolbar, NULL, "Console", console_cb, NULL);
elm_toolbar_item_icon_file_set(it, EDJE_PATH, "console");
it = elm_toolbar_item_append(toolbar, NULL, "LiveEdit", live_edit_cb, led);
elm_toolbar_item_icon_file_set(it, EDJE_PATH, "live-edit");
return toolbar;
}

View File

@ -4,7 +4,6 @@
typedef struct viewer_s view_data;
typedef struct statusbar_s stats_data;
typedef struct editor_s edit_data;
typedef struct live_editor_s live_edit_data;
typedef struct syntax_color_s color_data;
typedef struct parser_s parser_data;
typedef struct attr_value_s attr_value;

View File

@ -19,5 +19,5 @@ char *parser_name_get(parser_data *pd, const char *cur);
void parser_cancel(parser_data *pd);
int parser_line_cnt_get(parser_data *pd EINA_UNUSED, const char *src);
Eina_List *parser_states_filtered_name_get(Eina_List *states);
Evas_Coord parser_end_of_parts_block_pos_get(const Evas_Object *entry, const char *group_name);
Eina_Bool parser_images_pos_get(const Evas_Object *entry, Evas_Coord *res_position);
int parser_end_of_parts_block_pos_get(const Evas_Object *entry, const char *group_name);
Eina_Bool parser_images_pos_get(const Evas_Object *entry, int *pos);

View File

@ -2,7 +2,6 @@ view_data * view_init(Evas_Object *parent, const char *group,
void (*del_cb)(void *data), void *data);
void view_term(view_data *vd);
Evas_Object *view_obj_get(view_data *vd);
Evas_Object *view_layout_get(view_data *vd);
void view_new(view_data *vd, const char *group);
void view_part_highlight_set(view_data *vd, const char *part_name);
void view_dummy_toggle(view_data *vd, Eina_Bool msg);

View File

@ -1,3 +1,3 @@
live_edit_data* live_edit_init(edit_data *ed);
void live_edit_toggle(live_edit_data* led, Eina_Bool is_on);
void live_edit_term(live_edit_data* led);
void live_edit_init(edit_data *ed);
void live_edit_term(void);
void live_edit_toggle(void);

View File

@ -1,2 +1,2 @@
Evas_Object *tools_create(Evas_Object *parent, edit_data *ed, live_edit_data *led);
Evas_Object *tools_create(Evas_Object *parent, edit_data *ed);