From d9c5fe08b960d9933112da1f20b38b9453a9a75e Mon Sep 17 00:00:00 2001 From: Andy Williams Date: Fri, 5 Dec 2014 09:20:11 -0600 Subject: [PATCH] Add a cursor to the view. Create a backing data structure to start tracking more useful widget information --- elm_code/bin/elm_code_test_main.c | 2 ++ elm_code/lib/elm_code_common.h | 1 + elm_code/lib/elm_code_widget.c | 36 ++++++++++++++++++++++++++----- elm_code/lib/elm_code_widget.h | 31 ++++++++++++++++++++++++-- 4 files changed, 63 insertions(+), 7 deletions(-) diff --git a/elm_code/bin/elm_code_test_main.c b/elm_code/bin/elm_code_test_main.c index 698e411..bfb13bb 100644 --- a/elm_code/bin/elm_code_test_main.c +++ b/elm_code/bin/elm_code_test_main.c @@ -40,6 +40,8 @@ _elm_code_test_welcome_setup(Evas_Object *parent) code = elm_code_create(); widget = elm_code_widget_add(parent, code); elm_code_widget_font_size_set(widget, 14); + elm_code_widget_editable_set(widget, EINA_TRUE); + _append_line(code->file, "Hello World, Elm Code!"); elm_code_file_line_token_add(code->file, 1, 14, 21, ELM_CODE_TOKEN_TYPE_COMMENT); _append_line(code->file, ""); diff --git a/elm_code/lib/elm_code_common.h b/elm_code/lib/elm_code_common.h index 79f5d6c..2520356 100644 --- a/elm_code/lib/elm_code_common.h +++ b/elm_code/lib/elm_code_common.h @@ -33,6 +33,7 @@ typedef enum { ELM_CODE_TOKEN_TYPE_REMOVED, ELM_CODE_TOKEN_TYPE_CHANGED, + ELM_CODE_TOKEN_TYPE_CURSOR, // a pseudo type used for styling but may not be set on a cell ELM_CODE_TOKEN_TYPE_COUNT } Elm_Code_Token_Type; diff --git a/elm_code/lib/elm_code_widget.c b/elm_code/lib/elm_code_widget.c index 24a70d6..2b633e8 100644 --- a/elm_code/lib/elm_code_widget.c +++ b/elm_code/lib/elm_code_widget.c @@ -45,7 +45,7 @@ static void _elm_code_widget_fill_line_token(Evas_Textgrid_Cell *cells, int coun } } -EAPI void elm_code_widget_fill_line_tokens(Evas_Textgrid_Cell *cells, int count, Elm_Code_Line *line) +EAPI void elm_code_widget_fill_line_tokens(Evas_Textgrid_Cell *cells, unsigned int count, Elm_Code_Line *line) { Eina_List *item; Elm_Code_Token *token; @@ -73,6 +73,7 @@ static void _elm_code_widget_fill_line(Evas_Object *o, Evas_Textgrid_Cell *cells char *chr; unsigned int length, x; int w; + ELM_CODE_WIDGET_DATA_GET(o, widget); if (!_elm_code_widget_resize(o)) return; @@ -103,6 +104,11 @@ static void _elm_code_widget_fill_line(Evas_Object *o, Evas_Textgrid_Cell *cells } elm_code_widget_fill_line_tokens(cells, w, line); + if (widget->editable && widget->cursor_line == line->number) + { + if (widget->cursor_col < (unsigned int) w) + cells[widget->cursor_col].bg = ELM_CODE_TOKEN_TYPE_CURSOR; + } evas_object_textgrid_update_add(o, 0, line->number - 1, w, 1); } @@ -180,11 +186,10 @@ _elm_code_widget_resize_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, EAPI Evas_Object *elm_code_widget_add(Evas_Object *parent, Elm_Code *code) { Evas_Object *o; + Elm_Code_Widget *widget; o = evas_object_textgrid_add(parent); - elm_code_widget_font_size_set(o, 10); - // setup status colors evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_STATUS_TYPE_DEFAULT, 36, 36, 36, 255); @@ -216,17 +221,38 @@ EAPI Evas_Object *elm_code_widget_add(Evas_Object *parent, Elm_Code *code) evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_TOKEN_TYPE_CHANGED, 54, 54, 255, 255); + // the style for a cursor - this is a special token and will be applied to the background + evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_TOKEN_TYPE_CURSOR, + 205, 205, 54, 255); evas_object_event_callback_add(o, EVAS_CALLBACK_RESIZE, _elm_code_widget_resize_cb, code); eo_do(o,eo_event_callback_add(&ELM_CODE_EVENT_LINE_SET_DONE, _elm_code_widget_line_cb, code)); eo_do(o,eo_event_callback_add(&ELM_CODE_EVENT_FILE_LOAD_DONE, _elm_code_widget_file_cb, code)); + widget = calloc(1, sizeof(*widget)); + widget->code = code; + widget->cursor_line = 1; + widget->cursor_col = 1; + evas_object_data_set(o, ELM_CODE_WIDGET_DATA_KEY, widget); code->widgets = eina_list_append(code->widgets, o); + + elm_code_widget_font_size_set(o, 10); return o; } -EAPI void elm_code_widget_font_size_set(Evas_Object *widget, int size) +EAPI void elm_code_widget_font_size_set(Evas_Object *obj, Evas_Font_Size size) { - evas_object_textgrid_font_set(widget, "Mono", size * elm_config_scale_get()); + ELM_CODE_WIDGET_DATA_GET(obj, widget); + + widget->font_size = size; + evas_object_textgrid_font_set(obj, "Mono", size * elm_config_scale_get()); } +EAPI void elm_code_widget_editable_set(Evas_Object *obj, Eina_Bool editable) +{ + ELM_CODE_WIDGET_DATA_GET(obj, widget); + + widget->editable = editable; +} + + diff --git a/elm_code/lib/elm_code_widget.h b/elm_code/lib/elm_code_widget.h index 2302914..286fcab 100644 --- a/elm_code/lib/elm_code_widget.h +++ b/elm_code/lib/elm_code_widget.h @@ -13,6 +13,31 @@ extern "C" { * @brief These routines are used for rendering instances of Elm Code. */ +typedef struct _Elm_Code_Widget +{ + Elm_Code *code; + + Evas_Font_Size font_size; + unsigned int cursor_line, cursor_col; + Eina_Bool editable; + +} Elm_Code_Widget; + +#define ELM_CODE_WIDGET_DATA_KEY "Elm_Code_Widget" +#define ELM_CODE_WIDGET_DATA_GET(o, ptr, ...) \ + Elm_Code_Widget *ptr; \ + ptr = evas_object_data_get(o, ELM_CODE_WIDGET_DATA_KEY); + +#define ELM_CODE_WIDGET_DATA_GET_OR_RETURN(o, ptr, ...) \ + Elm_Code_Widget *ptr; \ + ptr = evas_object_data_get(o, ELM_CODE_WIDGET_DATA_KEY);\ + if (EINA_UNLIKELY(!ptr)) \ + { \ + CRI("no widget data for object %p (%s)", \ + o, evas_object_type_get(o)); \ + return __VA_ARGS__; \ + } + /** * @brief UI Loading functions. * @defgroup Init Creating a widget to render an Elm Code backend @@ -25,11 +50,13 @@ extern "C" { EAPI Evas_Object *elm_code_widget_add(Evas_Object *parent, Elm_Code *code); -EAPI void elm_code_widget_font_size_set(Evas_Object *widget, int size); +EAPI void elm_code_widget_font_size_set(Evas_Object *widget, Evas_Font_Size size); + +EAPI void elm_code_widget_editable_set(Evas_Object *widget, Eina_Bool editable); EAPI void elm_code_widget_fill(Evas_Object *o, Elm_Code *code); -EAPI void elm_code_widget_fill_line_tokens(Evas_Textgrid_Cell *cells, int count, Elm_Code_Line *line); +EAPI void elm_code_widget_fill_line_tokens(Evas_Textgrid_Cell *cells, unsigned int count, Elm_Code_Line *line); /** * @}