diff options
author | Andy Williams <andy@andywilliams.me> | 2016-03-31 15:42:30 +0100 |
---|---|---|
committer | Andy Williams <andy@andywilliams.me> | 2016-03-31 15:42:30 +0100 |
commit | a1a9064a1663ea15db6f26d6c7f08164c82ff8d2 (patch) | |
tree | d59ffa7df8c2125397a5973e62b4bf957610bace | |
parent | bf0a5ae4f541314f2a08739cf202f69e8f4fbe27 (diff) | |
parent | c9fb87d551f3f0186e3d987a97bfce7f8a8113a3 (diff) | |
download | efl-a1a9064a1663ea15db6f26d6c7f08164c82ff8d2.tar.gz |
[editor] Split out lines from a standard grid in rendering
Move errors to inline within the editor.
-rw-r--r-- | legacy/elm_code/src/lib/Makefile.am | 1 | ||||
-rw-r--r-- | legacy/elm_code/src/lib/widget/elm_code_widget.c | 482 | ||||
-rw-r--r-- | legacy/elm_code/src/lib/widget/elm_code_widget.eo | 10 | ||||
-rw-r--r-- | legacy/elm_code/src/lib/widget/elm_code_widget_private.h | 7 | ||||
-rw-r--r-- | legacy/elm_code/src/lib/widget/elm_code_widget_tooltip.c | 47 | ||||
-rw-r--r-- | legacy/elm_code/src/tests/widget/elm_code_test_widget.c | 1 |
6 files changed, 295 insertions, 253 deletions
diff --git a/legacy/elm_code/src/lib/Makefile.am b/legacy/elm_code/src/lib/Makefile.am index 08efd7aaee..91bf637d34 100644 --- a/legacy/elm_code/src/lib/Makefile.am +++ b/legacy/elm_code/src/lib/Makefile.am @@ -41,7 +41,6 @@ elm_code_line.c \ elm_code_text.c \ elm_code_file.c \ elm_code_parse.c \ -widget/elm_code_widget_tooltip.c \ widget/elm_code_widget_selection.c \ widget/elm_code_widget.c \ elm_code_diff_widget.c \ diff --git a/legacy/elm_code/src/lib/widget/elm_code_widget.c b/legacy/elm_code/src/lib/widget/elm_code_widget.c index 1b91391f05..a5ca616f3d 100644 --- a/legacy/elm_code/src/lib/widget/elm_code_widget.c +++ b/legacy/elm_code/src/lib/widget/elm_code_widget.c @@ -50,6 +50,8 @@ Eina_Unicode status_icons[] = { } \ } while (0) +static void _elm_code_widget_resize(Elm_Code_Widget *widget); + EAPI Evas_Object * elm_code_widget_add(Evas_Object *parent, Elm_Code *code) { @@ -90,62 +92,36 @@ _elm_code_widget_class_constructor(Eo_Class *klass EINA_UNUSED) } -static void -_elm_code_widget_scroll_by(Elm_Code_Widget *widget, int by_x, int by_y) +void +_elm_code_widget_cell_size_get(Elm_Code_Widget *widget, Evas_Coord *width, Evas_Coord *height) { Elm_Code_Widget_Data *pd; - Evas_Coord x, y, w, h; + Evas_Object *grid; + Evas_Coord w, h; pd = eo_data_scope_get(widget, ELM_CODE_WIDGET_CLASS); - elm_scroller_region_get(pd->scroller, &x, &y, &w, &h); - x += by_x; - y += by_y; - elm_scroller_region_show(pd->scroller, x, y, w, h); + grid = eina_list_nth(pd->grids, 0); + evas_object_textgrid_cell_size_get(grid, &w, &h); + if (w == 0) w = 5; + if (h == 0) h = 10; + + if (width) *width = w; + if (height) *height = h; } static void -_elm_code_widget_resize(Elm_Code_Widget *widget) +_elm_code_widget_scroll_by(Elm_Code_Widget *widget, int by_x, int by_y) { - Elm_Code_Line *line; - Eina_List *item; - Evas_Coord ww, wh, old_width, old_height; - int w, h, cw, ch, gutter; - unsigned int line_width; Elm_Code_Widget_Data *pd; + Evas_Coord x, y, w, h; pd = eo_data_scope_get(widget, ELM_CODE_WIDGET_CLASS); - gutter = elm_obj_code_widget_text_left_gutter_width_get(widget); - - if (!pd->code) - return; - - evas_object_geometry_get(widget, NULL, NULL, &ww, &wh); - evas_object_textgrid_cell_size_get(pd->grid, &cw, &ch); - old_width = ww; - old_height = wh; - - w = 0; - h = elm_code_file_lines_get(pd->code->file); - EINA_LIST_FOREACH(pd->code->file->lines, item, line) - { - line_width = elm_code_widget_line_text_column_width_get(widget, line); - if ((int) line_width + gutter + 1 > w) - w = (int) line_width + gutter + 1; - } - - if (w*cw > ww) - ww = w*cw; - if (h*ch > wh) - wh = h*ch; - evas_object_textgrid_size_set(pd->grid, ww/cw+1, wh/ch+1); - evas_object_size_hint_min_set(pd->grid, w*cw, h*ch); - - if (pd->gravity_x == 1.0 || pd->gravity_y == 1.0) - _elm_code_widget_scroll_by(widget, - (pd->gravity_x == 1.0 && ww > old_width) ? ww - old_width : 0, - (pd->gravity_y == 1.0 && wh > old_height) ? wh - old_height : 0); + elm_scroller_region_get(pd->scroller, &x, &y, &w, &h); + x += by_x; + y += by_y; + elm_scroller_region_show(pd->scroller, x, y, w, h); } static void @@ -216,7 +192,7 @@ _elm_code_widget_fill_gutter(Elm_Code_Widget *widget, Evas_Textgrid_Cell *cells, int width, Elm_Code_Status_Type status, int line) { char *number = NULL; - int w, gutter, g; + int gutter, g; Elm_Code_Widget_Data *pd; pd = eo_data_scope_get(widget, ELM_CODE_WIDGET_CLASS); @@ -224,7 +200,6 @@ _elm_code_widget_fill_gutter(Elm_Code_Widget *widget, Evas_Textgrid_Cell *cells, if (width < gutter) return; - evas_object_textgrid_size_get(pd->grid, &w, NULL); cells[gutter-1].codepoint = status_icons[status]; cells[gutter-1].bold = 1; @@ -336,16 +311,20 @@ _elm_code_widget_fill_line(Elm_Code_Widget *widget, Elm_Code_Line *line) { char *chr; Eina_Unicode unichr; - unsigned int length, x, charwidth, i; - int w, chrpos, gutter; + unsigned int length, x, charwidth, i, w; + int chrpos, gutter; + Evas_Object *grid, *status; Evas_Textgrid_Cell *cells; Elm_Code_Widget_Data *pd; pd = eo_data_scope_get(widget, ELM_CODE_WIDGET_CLASS); gutter = elm_obj_code_widget_text_left_gutter_width_get(widget); + if (eina_list_count(pd->grids) < line->number) + return; - evas_object_textgrid_size_get(pd->grid, &w, NULL); - cells = evas_object_textgrid_cellrow_get(pd->grid, line->number - 1); + w = elm_code_widget_columns_get(widget); + grid = eina_list_nth(pd->grids, line->number - 1); + cells = evas_object_textgrid_cellrow_get(grid, 0); _elm_code_widget_fill_gutter(widget, cells, w, line->status, line->number); _elm_code_widget_fill_line_tokens(widget, cells, w, line); @@ -383,51 +362,41 @@ _elm_code_widget_fill_line(Elm_Code_Widget *widget, Elm_Code_Line *line) if (line->number < elm_code_file_lines_get(line->file)) _elm_code_widget_fill_whitespace(widget, '\n', &cells[length + gutter]); - evas_object_textgrid_update_add(pd->grid, 0, line->number - 1, w, 1); -} - -static void -_elm_code_widget_empty_line(Elm_Code_Widget *widget, unsigned int number) -{ - unsigned int x; - int w, gutter; - Evas_Textgrid_Cell *cells; - Elm_Code_Widget_Data *pd; + evas_object_textgrid_update_add(grid, 0, 0, w, 1); - pd = eo_data_scope_get(widget, ELM_CODE_WIDGET_CLASS); - gutter = elm_obj_code_widget_text_left_gutter_width_get(widget); - - evas_object_textgrid_size_get(pd->grid, &w, NULL); - cells = evas_object_textgrid_cellrow_get(pd->grid, number - 1); - _elm_code_widget_fill_gutter(widget, cells, w, ELM_CODE_STATUS_TYPE_DEFAULT, 0); + // add a status below the line if needed (and remove those no longer needed) + status = evas_object_data_get(grid, "status"); + if (line->status_text) + { + if (!status) + { + status = elm_label_add(pd->gridbox); + evas_object_size_hint_weight_set(status, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(status, 0.05, EVAS_HINT_FILL); + evas_object_show(status); - for (x = gutter; x < (unsigned int) w; x++) + elm_box_pack_after(pd->gridbox, status, grid); + evas_object_data_set(grid, "status", status); + } + elm_object_text_set(status, line->status_text); + } + else if (status) { - cells[x].codepoint = 0; - if (pd->editable && pd->focussed && pd->cursor_line == number) - cells[x].bg = ELM_CODE_STATUS_TYPE_CURRENT; - else if (pd->line_width_marker == x - gutter + 1) - cells[x].bg = ELM_CODE_WIDGET_COLOR_GUTTER_BG; - else - cells[x].bg = ELM_CODE_STATUS_TYPE_DEFAULT; + elm_box_unpack(pd->gridbox, status); + evas_object_hide(status); + evas_object_data_set(grid, "status", NULL); } - - _elm_code_widget_fill_cursor(widget, number, cells, gutter, w); - evas_object_textgrid_update_add(pd->grid, 0, number - 1, w, 1); } static void _elm_code_widget_fill_range(Elm_Code_Widget *widget, unsigned int first_row, unsigned int last_row) { Elm_Code_Line *line; - int h; unsigned int y; Elm_Code_Widget_Data *pd; pd = eo_data_scope_get(widget, ELM_CODE_WIDGET_CLASS); - _elm_code_widget_resize(widget); - h = elm_code_widget_lines_visible_get(widget); for (y = first_row; y <= last_row; y++) { @@ -435,10 +404,6 @@ _elm_code_widget_fill_range(Elm_Code_Widget *widget, unsigned int first_row, uns _elm_code_widget_fill_line(widget, line); } - for (; y <= (unsigned int) h; y++) - { - _elm_code_widget_empty_line(widget, y); - } } static void @@ -451,7 +416,7 @@ _elm_code_widget_refresh(Elm_Code_Widget *widget) pd = eo_data_scope_get(widget, ELM_CODE_WIDGET_CLASS); - evas_object_textgrid_cell_size_get(pd->grid, NULL, &ch); + _elm_code_widget_cell_size_get(widget, NULL, &ch); elm_scroller_region_get(pd->scroller, NULL, &scroll_y, NULL, &scroll_h); first_row = scroll_y / ch + 1; @@ -600,7 +565,7 @@ _elm_code_widget_cursor_ensure_visible(Elm_Code_Widget *widget) pd = eo_data_scope_get(widget, ELM_CODE_WIDGET_CLASS); elm_scroller_region_get(pd->scroller, &viewx, &viewy, &vieww, &viewh); - evas_object_textgrid_cell_size_get(pd->grid, &cellw, &cellh); + _elm_code_widget_cell_size_get(widget, &cellw, &cellh); gutter = elm_obj_code_widget_text_left_gutter_width_get(widget); curx = (pd->cursor_col + gutter - 1) * cellw; @@ -634,8 +599,6 @@ _elm_code_widget_cursor_move(Elm_Code_Widget *widget, Elm_Code_Widget_Data *pd, code = pd->code; if (oldrow <= elm_code_file_lines_get(code->file)) _elm_code_widget_fill_line(widget, elm_code_file_line_get(pd->code->file, oldrow)); - else - _elm_code_widget_empty_line(widget, oldrow); } _elm_code_widget_fill_line(widget, elm_code_file_line_get(pd->code->file, pd->cursor_line)); } @@ -645,19 +608,37 @@ _elm_code_widget_position_at_coordinates_get(Elm_Code_Widget *widget, Elm_Code_W Evas_Coord x, Evas_Coord y, unsigned int *row, int *col) { + Eina_List *item; Elm_Code_Line *line; - Evas_Coord ox, oy, sx, sy; + Evas_Coord ox, oy, sx, sy, rowy; + Evas_Object *grid; int cw, ch, gutter; - unsigned int number; + unsigned int guess, number; evas_object_geometry_get(widget, &ox, &oy, NULL, NULL); elm_scroller_region_get(pd->scroller, &sx, &sy, NULL, NULL); x = x + sx - ox; y = y + sy - oy; - evas_object_textgrid_cell_size_get(pd->grid, &cw, &ch); + _elm_code_widget_cell_size_get(widget, &cw, &ch); gutter = elm_obj_code_widget_text_left_gutter_width_get(widget); - number = ((double) y / ch) + 1; + + guess = ((double) y / ch) + 1; + number = guess; + + // unfortunately EINA_LIST_REVERSE_FOREACH skips to the end of the list... + for (item = eina_list_nth_list(pd->grids, guess - 1), grid = eina_list_data_get(item); + item; + item = eina_list_prev(item), grid = eina_list_data_get(item)) + { + evas_object_geometry_get(grid, NULL, &rowy, NULL, NULL); + + if (rowy - oy < y) + break; + + number--; + } + if (col) *col = ((double) x / cw) - gutter + 1; if (row) @@ -755,24 +736,15 @@ _elm_code_widget_mouse_move_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj { Elm_Code_Widget *widget; Elm_Code_Widget_Data *pd; - Elm_Code_Line *line; Evas_Event_Mouse_Move *event; unsigned int row; int col; - Eina_Bool hasline; widget = (Elm_Code_Widget *)data; pd = eo_data_scope_get(widget, ELM_CODE_WIDGET_CLASS); event = (Evas_Event_Mouse_Move *)event_info; - hasline = _elm_code_widget_position_at_coordinates_get(widget, pd, event->cur.canvas.x, event->cur.canvas.y, &row, &col); - if (!hasline) - _elm_code_widget_tooltip_text_set(widget, NULL); - else - { - line = elm_code_file_line_get(pd->code->file, row); - _elm_code_widget_tooltip_text_set(widget, line->status_text); - } + _elm_code_widget_position_at_coordinates_get(widget, pd, event->cur.canvas.x, event->cur.canvas.y, &row, &col); if (!pd->editable || !event->buttons) return; @@ -1406,6 +1378,182 @@ _elm_code_widget_elm_widget_focus_direction_manager_is(Eo *obj EINA_UNUSED, return EINA_TRUE; } +static void +_elm_code_widget_setup_palette(Evas_Object *o) +{ + double feint = 0.5; + + // setup status colors + evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_STATUS_TYPE_DEFAULT, + 36, 36, 36, 255); + evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_STATUS_TYPE_CURRENT, + 12, 12, 12, 255); + evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_STATUS_TYPE_IGNORED, + 36, 36, 36, 255); + evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_STATUS_TYPE_NOTE, + 255, 153, 0, 255); + evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_STATUS_TYPE_WARNING, + 255, 153, 0, 255); + evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_STATUS_TYPE_ERROR, + 205, 54, 54, 255); + evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_STATUS_TYPE_FATAL, + 205, 54, 54, 255); + + evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_STATUS_TYPE_ADDED, + 36, 96, 36, 255); + evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_STATUS_TYPE_REMOVED, + 96, 36, 36, 255); + evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_STATUS_TYPE_CHANGED, + 36, 36, 96, 255); + + evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_STATUS_TYPE_PASSED, + 54, 96, 54, 255); + evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_STATUS_TYPE_FAILED, + 96, 54, 54, 255); + + evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_STATUS_TYPE_TODO, + 54, 54, 96, 255); + + // setup token colors + evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_TOKEN_TYPE_DEFAULT, + 205, 205, 205, 255); + evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_TOKEN_TYPE_COMMENT, + 51, 153, 255, 255); + evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_TOKEN_TYPE_STRING, + 255, 90, 53, 255); + evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_TOKEN_TYPE_NUMBER, + 212, 212, 42, 255); + evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_TOKEN_TYPE_BRACE, + 101, 101, 101, 255); + evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_TOKEN_TYPE_TYPE, + 51, 153, 255, 255); + evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_TOKEN_TYPE_CLASS, + 114, 170, 212, 255); + evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_TOKEN_TYPE_FUNCTION, + 114, 170, 212, 255); + evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_TOKEN_TYPE_PARAM, + 255, 255, 255, 255); + evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_TOKEN_TYPE_KEYWORD, + 255, 153, 0, 255); + evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_TOKEN_TYPE_PREPROCESSOR, + 0, 176, 0, 255); + + evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_TOKEN_TYPE_ADDED, + 54, 255, 54, 255); + evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_TOKEN_TYPE_REMOVED, + 255, 54, 54, 255); + evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_TOKEN_TYPE_CHANGED, + 54, 54, 255, 255); + + // other styles that the widget uses + evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_WIDGET_COLOR_CURSOR, + 205, 205, 54, 255); + evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_WIDGET_COLOR_SELECTION, + 51, 153, 255, 255); + evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_WIDGET_COLOR_GUTTER_BG, + 75, 75, 75, 255); + evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_WIDGET_COLOR_GUTTER_FG, + 139, 139, 139, 255); + evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_WIDGET_COLOR_WHITESPACE, + 101 * feint, 101 * feint, 101 * feint, 255 * feint); +} + +static void +_elm_code_widget_ensure_n_grid_rows(Elm_Code_Widget *widget, int rows) +{ + Evas_Object *grid; + int existing, i; + Elm_Code_Widget_Data *pd; + + pd = eo_data_scope_get(widget, ELM_CODE_WIDGET_CLASS); + existing = eina_list_count(pd->grids); + + // trim unneeded rows in our rendering + if (rows < existing) + { + for (i = existing - rows; i > 0; i--) + { + grid = eina_list_data_get(eina_list_last(pd->grids)); + evas_object_hide(grid); + elm_box_unpack(pd->gridbox, grid); + pd->grids = eina_list_remove_list(pd->grids, eina_list_last(pd->grids)); + } + rows = existing; + } + + if (rows == existing) + return; + + for (int i = existing; i < rows; i++) + { + grid = evas_object_textgrid_add(pd->gridbox); + evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(grid, EVAS_HINT_FILL, 0.0); + evas_object_show(grid); + _elm_code_widget_setup_palette(grid); + + elm_box_pack_end(pd->gridbox, grid); + pd->grids = eina_list_append(pd->grids, grid); + + evas_object_event_callback_add(grid, EVAS_CALLBACK_MOUSE_DOWN, _elm_code_widget_mouse_down_cb, widget); + evas_object_event_callback_add(grid, EVAS_CALLBACK_MOUSE_MOVE, _elm_code_widget_mouse_move_cb, widget); + evas_object_event_callback_add(grid, EVAS_CALLBACK_MOUSE_UP, _elm_code_widget_mouse_up_cb, widget); + + evas_object_textgrid_font_set(grid, pd->font_name, pd->font_size * elm_config_scale_get()); + } +} + +static void +_elm_code_widget_resize(Elm_Code_Widget *widget) +{ + Elm_Code_Line *line; + Eina_List *item; + Evas_Object *grid; + Evas_Coord ww, wh, old_width, old_height; + int w, h, cw, ch, gutter; + unsigned int line_width; + Elm_Code_Widget_Data *pd; + + pd = eo_data_scope_get(widget, ELM_CODE_WIDGET_CLASS); + gutter = elm_obj_code_widget_text_left_gutter_width_get(widget); + + if (!pd->code) + return; + + evas_object_geometry_get(widget, NULL, NULL, &ww, &wh); + + old_width = ww; + old_height = wh; + + w = 0; + h = elm_code_file_lines_get(pd->code->file); + EINA_LIST_FOREACH(pd->code->file->lines, item, line) + { + line_width = elm_code_widget_line_text_column_width_get(widget, line); + if ((int) line_width + gutter + 1 > w) + w = (int) line_width + gutter + 1; + } + + _elm_code_widget_ensure_n_grid_rows(widget, h); + _elm_code_widget_cell_size_get(widget, &cw, &ch); + if (w*cw > ww) + ww = w*cw; + if (h*ch > wh) + wh = h*ch; + pd->col_count = ww/cw + 1; + + EINA_LIST_FOREACH(pd->grids, item, grid) + { + evas_object_textgrid_size_set(grid, pd->col_count, 1); + evas_object_size_hint_min_set(grid, w*cw, ch); + } + + if (pd->gravity_x == 1.0 || pd->gravity_y == 1.0) + _elm_code_widget_scroll_by(widget, + (pd->gravity_x == 1.0 && ww > old_width) ? ww - old_width : 0, + (pd->gravity_y == 1.0 && wh > old_height) ? wh - old_height : 0); +} + EOAPI void _elm_code_widget_line_refresh(Eo *obj, Elm_Code_Widget_Data *pd EINA_UNUSED, Elm_Code_Line *line) { @@ -1413,12 +1561,12 @@ _elm_code_widget_line_refresh(Eo *obj, Elm_Code_Widget_Data *pd EINA_UNUSED, Elm } EOAPI Eina_Bool -_elm_code_widget_line_visible_get(Eo *obj EINA_UNUSED, Elm_Code_Widget_Data *pd, Elm_Code_Line *line) +_elm_code_widget_line_visible_get(Eo *obj, Elm_Code_Widget_Data *pd, Elm_Code_Line *line) { Evas_Coord cellh, viewy, viewh; elm_scroller_region_get(pd->scroller, NULL, &viewy, NULL, &viewh); - evas_object_textgrid_cell_size_get(pd->grid, NULL, &cellh); + _elm_code_widget_cell_size_get(obj, NULL, &cellh); if (((int)line->number - 1) * cellh > viewy + viewh || (int)line->number * cellh < viewy) return EINA_FALSE; @@ -1427,25 +1575,31 @@ _elm_code_widget_line_visible_get(Eo *obj EINA_UNUSED, Elm_Code_Widget_Data *pd, } EOAPI unsigned int -_elm_code_widget_lines_visible_get(Eo *obj EINA_UNUSED, Elm_Code_Widget_Data *pd) +_elm_code_widget_lines_visible_get(Eo *obj, Elm_Code_Widget_Data *pd) { Evas_Coord cellh, viewh; elm_scroller_region_get(pd->scroller, NULL, NULL, NULL, &viewh); - evas_object_textgrid_cell_size_get(pd->grid, NULL, &cellh); + _elm_code_widget_cell_size_get(obj, NULL, &cellh); - return viewh / cellh; + return viewh / cellh + 1; } EOLIAN static void _elm_code_widget_font_set(Eo *obj EINA_UNUSED, Elm_Code_Widget_Data *pd, const char *name, Evas_Font_Size size) { + Eina_List *item; + Evas_Object *grid; + const char *face = name; if (!face) face = "Mono"; - evas_object_textgrid_font_set(pd->grid, face, size * elm_config_scale_get()); + EINA_LIST_FOREACH(pd->grids, item, grid) + { + evas_object_textgrid_font_set(grid, face, size * elm_config_scale_get()); + } if (pd->font_name) eina_stringshare_del((char *)pd->font_name); pd->font_name = eina_stringshare_add(face); @@ -1462,6 +1616,12 @@ _elm_code_widget_font_get(Eo *obj EINA_UNUSED, Elm_Code_Widget_Data *pd, *size = pd->font_size; } +EOLIAN static unsigned int +_elm_code_widget_columns_get(Eo *obj EINA_UNUSED, Elm_Code_Widget_Data *pd) +{ + return pd->col_count; +} + EOLIAN static void _elm_code_widget_code_set(Eo *obj, Elm_Code_Widget_Data *pd, Elm_Code *code) { @@ -1594,91 +1754,10 @@ _elm_code_widget_cursor_position_get(Eo *obj EINA_UNUSED, Elm_Code_Widget_Data * *line = pd->cursor_line; } -static void -_elm_code_widget_setup_palette(Evas_Object *o) -{ - double feint = 0.5; - - // setup status colors - evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_STATUS_TYPE_DEFAULT, - 36, 36, 36, 255); - evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_STATUS_TYPE_CURRENT, - 12, 12, 12, 255); - evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_STATUS_TYPE_IGNORED, - 36, 36, 36, 255); - evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_STATUS_TYPE_NOTE, - 255, 153, 0, 255); - evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_STATUS_TYPE_WARNING, - 255, 153, 0, 255); - evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_STATUS_TYPE_ERROR, - 205, 54, 54, 255); - evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_STATUS_TYPE_FATAL, - 205, 54, 54, 255); - - evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_STATUS_TYPE_ADDED, - 36, 96, 36, 255); - evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_STATUS_TYPE_REMOVED, - 96, 36, 36, 255); - evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_STATUS_TYPE_CHANGED, - 36, 36, 96, 255); - - evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_STATUS_TYPE_PASSED, - 54, 96, 54, 255); - evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_STATUS_TYPE_FAILED, - 96, 54, 54, 255); - - evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_STATUS_TYPE_TODO, - 54, 54, 96, 255); - - // setup token colors - evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_TOKEN_TYPE_DEFAULT, - 205, 205, 205, 255); - evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_TOKEN_TYPE_COMMENT, - 51, 153, 255, 255); - evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_TOKEN_TYPE_STRING, - 255, 90, 53, 255); - evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_TOKEN_TYPE_NUMBER, - 212, 212, 42, 255); - evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_TOKEN_TYPE_BRACE, - 101, 101, 101, 255); - evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_TOKEN_TYPE_TYPE, - 51, 153, 255, 255); - evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_TOKEN_TYPE_CLASS, - 114, 170, 212, 255); - evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_TOKEN_TYPE_FUNCTION, - 114, 170, 212, 255); - evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_TOKEN_TYPE_PARAM, - 255, 255, 255, 255); - evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_TOKEN_TYPE_KEYWORD, - 255, 153, 0, 255); - evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_TOKEN_TYPE_PREPROCESSOR, - 0, 176, 0, 255); - - - evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_TOKEN_TYPE_ADDED, - 54, 255, 54, 255); - evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_TOKEN_TYPE_REMOVED, - 255, 54, 54, 255); - evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_TOKEN_TYPE_CHANGED, - 54, 54, 255, 255); - - // other styles that the widget uses - evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_WIDGET_COLOR_CURSOR, - 205, 205, 54, 255); - evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_WIDGET_COLOR_SELECTION, - 51, 153, 255, 255); - evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_WIDGET_COLOR_GUTTER_BG, - 75, 75, 75, 255); - evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_WIDGET_COLOR_GUTTER_FG, - 139, 139, 139, 255); - evas_object_textgrid_palette_set(o, EVAS_TEXTGRID_PALETTE_STANDARD, ELM_CODE_WIDGET_COLOR_WHITESPACE, - 101 * feint, 101 * feint, 101 * feint, 255 * feint); -} - EOLIAN static void _elm_code_widget_evas_object_smart_add(Eo *obj, Elm_Code_Widget_Data *pd) { - Evas_Object *grid, *scroller; + Evas_Object *background, *gridrows, *scroller; evas_obj_smart_add(eo_super(obj, ELM_CODE_WIDGET_CLASS)); elm_object_focus_allow_set(obj, EINA_TRUE); @@ -1693,19 +1772,20 @@ _elm_code_widget_evas_object_smart_add(Eo *obj, Elm_Code_Widget_Data *pd) elm_object_focus_allow_set(scroller, EINA_FALSE); pd->scroller = scroller; - grid = evas_object_textgrid_add(obj); - evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); - evas_object_size_hint_align_set(grid, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_show(grid); - _elm_code_widget_tooltip_add(obj); - elm_object_content_set(scroller, grid); - pd->grid = grid; - _elm_code_widget_setup_palette(grid); + background = elm_bg_add(scroller); + evas_object_color_set(background, 145, 145, 145, 255); + evas_object_size_hint_weight_set(background, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); + evas_object_size_hint_align_set(background, EVAS_HINT_FILL, EVAS_HINT_FILL); + evas_object_show(background); + elm_object_part_content_set(scroller, "elm.swallow.background", background); + + gridrows = elm_box_add(scroller); + evas_object_size_hint_weight_set(gridrows, EVAS_HINT_EXPAND, 0.0); + evas_object_size_hint_align_set(gridrows, EVAS_HINT_FILL, 0.0); + elm_object_content_set(scroller, gridrows); + pd->gridbox = gridrows; evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE, _elm_code_widget_resize_cb, obj); - evas_object_event_callback_add(grid, EVAS_CALLBACK_MOUSE_DOWN, _elm_code_widget_mouse_down_cb, obj); - evas_object_event_callback_add(grid, EVAS_CALLBACK_MOUSE_MOVE, _elm_code_widget_mouse_move_cb, obj); - evas_object_event_callback_add(grid, EVAS_CALLBACK_MOUSE_UP, _elm_code_widget_mouse_up_cb, obj); evas_object_event_callback_add(obj, EVAS_CALLBACK_KEY_DOWN, _elm_code_widget_key_down_cb, obj); evas_object_smart_callback_add(obj, "focused", _elm_code_widget_focused_event_cb, obj); @@ -1715,8 +1795,6 @@ _elm_code_widget_evas_object_smart_add(Eo *obj, Elm_Code_Widget_Data *pd) eo_event_callback_add(obj, &ELM_CODE_EVENT_FILE_LOAD_DONE, _elm_code_widget_file_cb, obj); eo_event_callback_add(obj, ELM_CODE_WIDGET_EVENT_SELECTION_CHANGED, _elm_code_widget_selection_cb, obj); eo_event_callback_add(obj, ELM_CODE_WIDGET_EVENT_SELECTION_CLEARED, _elm_code_widget_selection_clear_cb, obj); - - _elm_code_widget_font_set(obj, pd, NULL, 10); } #include "elm_code_widget_text.c" diff --git a/legacy/elm_code/src/lib/widget/elm_code_widget.eo b/legacy/elm_code/src/lib/widget/elm_code_widget.eo index ace043a764..b55b2fc04d 100644 --- a/legacy/elm_code/src/lib/widget/elm_code_widget.eo +++ b/legacy/elm_code/src/lib/widget/elm_code_widget.eo @@ -30,6 +30,16 @@ class Elm.Code_Widget (Elm.Layout, Elm.Interface_Atspi_Text) size: Evas_Font_Size; [[The font size for the widget]] } } + @property columns { + get { + [[Get the number of columns in the widget currently. + This will be the max of the number of columns to represent the longest line and + the minimum required to fill the visible widget width.]] + } + values { + columns: uint; [[The number of columns required to render the widget]] + } + } @property gravity { set { [[Set how this widget's scroller should respond to new lines being added. diff --git a/legacy/elm_code/src/lib/widget/elm_code_widget_private.h b/legacy/elm_code/src/lib/widget/elm_code_widget_private.h index b4e19007b0..09c5003994 100644 --- a/legacy/elm_code/src/lib/widget/elm_code_widget_private.h +++ b/legacy/elm_code/src/lib/widget/elm_code_widget_private.h @@ -13,7 +13,9 @@ typedef struct typedef struct { Elm_Code *code; - Evas_Object *grid, *scroller; + Eina_List *grids; + unsigned int col_count; + Evas_Object *scroller, *gridbox; const char *font_name; Evas_Font_Size font_size; @@ -26,7 +28,6 @@ typedef struct Eina_Bool show_whitespace, tab_inserts_spaces; Elm_Code_Widget_Selection_Data *selection; - Evas_Object *tooltip; /* Undo stack */ Eina_List *undo_stack; @@ -44,6 +45,8 @@ typedef struct /* Private widget methods */ +void _elm_code_widget_cell_size_get(Elm_Code_Widget *widget, Evas_Coord *width, Evas_Coord *height); + void _elm_code_widget_text_at_cursor_insert(Elm_Code_Widget *widget, const char *text, int length); void _elm_code_widget_newline(Elm_Code_Widget *widget); diff --git a/legacy/elm_code/src/lib/widget/elm_code_widget_tooltip.c b/legacy/elm_code/src/lib/widget/elm_code_widget_tooltip.c deleted file mode 100644 index 44abe9168a..0000000000 --- a/legacy/elm_code/src/lib/widget/elm_code_widget_tooltip.c +++ /dev/null @@ -1,47 +0,0 @@ -#ifdef HAVE_CONFIG -# include "config.h" -#endif - -#include "Elm_Code.h" - -#include "elm_code_widget_private.h" - -void -_elm_code_widget_tooltip_text_set(Evas_Object *widget, const char *text) -{ - Elm_Code_Widget_Data *pd; - - pd = eo_data_scope_get(widget, ELM_CODE_WIDGET_CLASS); - - if (!text) - { - elm_object_tooltip_hide(widget); - return; - } - - elm_object_tooltip_show(widget); - - if (pd->tooltip) // will have been created by the callback below... - elm_object_text_set(pd->tooltip, text); -} - -static Evas_Object * -_elm_code_widget_tooltip_cb(void *data EINA_UNUSED, Evas_Object *obj, Evas_Object *tooltip) -{ - Elm_Code_Widget_Data *pd; - Evas_Object *label; - - pd = eo_data_scope_get(obj, ELM_CODE_WIDGET_CLASS); - - label = elm_label_add(tooltip); - pd->tooltip = label; - - return label; -} - -void -_elm_code_widget_tooltip_add(Evas_Object *widget) -{ - elm_object_tooltip_content_cb_set(widget, _elm_code_widget_tooltip_cb, NULL, NULL); -} - diff --git a/legacy/elm_code/src/tests/widget/elm_code_test_widget.c b/legacy/elm_code/src/tests/widget/elm_code_test_widget.c index 3471e3ca2a..7f2303ff4d 100644 --- a/legacy/elm_code/src/tests/widget/elm_code_test_widget.c +++ b/legacy/elm_code/src/tests/widget/elm_code_test_widget.c @@ -5,7 +5,6 @@ #include "elm_code_suite.h" #include "widget/elm_code_widget.c" -#include "widget/elm_code_widget_tooltip.c" static void _assert_cell_type(Evas_Textgrid_Cell cell, Elm_Code_Token_Type type, int id) { |