elm_code: support line insertion

in our widget call a line insertion on enter pressed
This commit is contained in:
Andy Williams 2015-02-28 14:20:32 +00:00
parent 40a6d3b3fd
commit 91b426d93e
3 changed files with 60 additions and 6 deletions

View File

@ -21,9 +21,10 @@ static Elm_Code_Line *_elm_code_file_line_blank_create(Elm_Code_File *file, int
return ecl;
}
static void _elm_code_file_line_append_data(Elm_Code_File *file, const char *content, int length, int row, Eina_Bool mapped, void *data)
static void _elm_code_file_line_insert_data(Elm_Code_File *file, const char *content, int length,
unsigned int row, Eina_Bool mapped, void *data)
{
Elm_Code_Line *line;
Elm_Code_Line *line, *after;
line = _elm_code_file_line_blank_create(file, row, data);
if (!line) return;
@ -41,7 +42,15 @@ static void _elm_code_file_line_append_data(Elm_Code_File *file, const char *con
line->length = length;
}
file->lines = eina_list_append(file->lines, line);
if (row == 1)
file->lines = eina_list_prepend(file->lines, line);
else if (row == eina_list_count(file->lines) + 1)
file->lines = eina_list_append(file->lines, line);
else
{
after = eina_list_nth(file->lines, row - 2);
file->lines = eina_list_append_relative(file->lines, line, after);
}
if (file->parent)
{
@ -92,7 +101,7 @@ EAPI Elm_Code_File *elm_code_file_open(Elm_Code *code, const char *path)
ret->lines = eina_list_append(ret->lines, ecl);
}
_elm_code_file_line_append_data(ret, line->start, line->length, lastindex = line->index, EINA_TRUE, NULL);
_elm_code_file_line_insert_data(ret, line->start, line->length, lastindex = line->index, EINA_TRUE, NULL);
}
eina_iterator_free(it);
@ -166,8 +175,29 @@ EAPI void elm_code_file_line_append(Elm_Code_File *file, const char *line, int l
{
int row;
row = elm_code_file_lines_get(file);
return _elm_code_file_line_append_data(file, line, length, row+1, EINA_FALSE, data);
row = elm_code_file_lines_get(file) + 1;
_elm_code_file_line_insert_data(file, line, length, row, EINA_FALSE, data);
}
EAPI void elm_code_file_line_insert(Elm_Code_File *file, unsigned int row, const char *line, int length, void *data)
{
Eina_List *item;
Elm_Code_Line *line_item;
unsigned int r;
_elm_code_file_line_insert_data(file, line, length, row, EINA_FALSE, data);
r = row;
EINA_LIST_FOREACH(file->lines, item, line_item)
{
if (line_item->number < row)
continue;
line_item->number = r++;
if (file->parent)
elm_code_callback_fire(file->parent, &ELM_CODE_EVENT_LINE_LOAD_DONE, line_item);
}
}
EAPI Elm_Code_Line *elm_code_file_line_get(Elm_Code_File *file, unsigned int number)

View File

@ -60,6 +60,8 @@ EAPI unsigned int elm_code_file_lines_get(Elm_Code_File *file);
EAPI void elm_code_file_line_append(Elm_Code_File *file, const char *line, int length, void *data);
EAPI void elm_code_file_line_insert(Elm_Code_File *file, unsigned int row, const char *line, int length, void *data);
EAPI Elm_Code_Line *elm_code_file_line_get(Elm_Code_File *file, unsigned int line);
/**

View File

@ -580,6 +580,24 @@ _elm_code_widget_text_at_cursor_insert(Elm_Code_Widget *widget, const char *text
elm_code_widget_cursor_position_set(col + length, row));
}
static void
_elm_code_widget_newline(Elm_Code_Widget *widget)
{
Elm_Code *code;
Elm_Code_Line *line;
unsigned int row, col;
eo_do(widget,
code = elm_code_widget_code_get(),
elm_code_widget_cursor_position_get(&col, &row));
line = elm_code_file_line_get(code->file, row);
elm_code_file_line_insert(code->file, line->number + 1, "", 0, NULL);
eo_do(widget,
elm_code_widget_cursor_position_set(1, row + 1));
}
static void
_elm_code_widget_key_down_cb(void *data, Evas *evas EINA_UNUSED,
Evas_Object *obj EINA_UNUSED, void *event_info)
@ -605,6 +623,10 @@ _elm_code_widget_key_down_cb(void *data, Evas *evas EINA_UNUSED,
_elm_code_widget_cursor_move_left(widget);
else if (!strcmp(ev->key, "Right"))
_elm_code_widget_cursor_move_right(widget);
else if (!strcmp(ev->key, "KP_Enter") || !strcmp(ev->key, "Return"))
_elm_code_widget_newline(widget);
else if (ev->string && strlen(ev->string) == 1)
_elm_code_widget_text_at_cursor_insert(widget, ev->string, 1);
else