summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlastair Poole <netstar@gmail.com>2020-03-04 01:41:43 +0000
committerAlastair Poole <netstar@gmail.com>2020-03-04 01:41:43 +0000
commitb8473486990846faf9c0828853f7615cce81aff9 (patch)
treeb921854d692372729ce76ee2bb3e096e7a61482c
parent01b818c5b0833360ecd2f1af3b92f5d8981410e3 (diff)
downloadefl-b8473486990846faf9c0828853f7615cce81aff9.tar.gz
elm_code: Improve efficiency of the widget.
For now, only create textgrids when needed. Also improve other regions of the widget. This will improve large file support and also some rendering of the widget. This improves performance 1-2 times. However, there must be a reasonable redesign regarding the current use of textgrids.
-rw-r--r--src/lib/elementary/elm_code_widget.c74
-rw-r--r--src/lib/elementary/elm_code_widget_private.h1
2 files changed, 51 insertions, 24 deletions
diff --git a/src/lib/elementary/elm_code_widget.c b/src/lib/elementary/elm_code_widget.c
index 9b488caaba..292a902d77 100644
--- a/src/lib/elementary/elm_code_widget.c
+++ b/src/lib/elementary/elm_code_widget.c
@@ -325,6 +325,8 @@ _elm_code_widget_cursor_update(Elm_Code_Widget *widget, Elm_Code_Widget_Data *pd
elm_layout_signal_emit(pd->cursor_rect, "elm,action,focus", "elm");
}
+ evas_object_smart_calculate(pd->scroller);
+ evas_object_smart_calculate(pd->gridbox);
evas_object_geometry_get(widget, NULL, &oy, NULL, &oh);
if ((cy < oy) || (cy > (oy + oh - ch)))
@@ -412,7 +414,6 @@ _elm_code_widget_fill_line(Elm_Code_Widget *widget, Elm_Code_Widget_Data *pd, El
w = elm_code_widget_columns_get(widget);
grid = eina_list_nth(pd->grids, line->number - 1);
cells = evas_object_textgrid_cellrow_get(grid, 0);
-
length = elm_code_widget_line_text_column_width_get(widget, line);
chrpos = 0;
chr = (char *)elm_code_line_text_get(line, NULL);
@@ -701,13 +702,24 @@ _elm_code_widget_cursor_move(Elm_Code_Widget *widget, Elm_Code_Widget_Data *pd,
{
Elm_Code *code;
Elm_Code_Line *line_obj;
- unsigned int oldrow, position, length;
+ unsigned int oldrow, position, length, first_row, last_row;
+ int cw, ch;
const char *text;
oldrow = pd->cursor_line;
+
pd->cursor_col = col;
pd->cursor_line = line;
+ if (line > eina_list_count(pd->grids) && !pd->selection && !pd->selection->in_progress)
+ {
+ if (_elm_code_widget_viewport_get(widget, pd, &first_row, &last_row))
+ {
+ _elm_code_widget_cell_size_get(widget, &cw, &ch);
+ _elm_code_widget_scroll_by(widget, 0, ch * (line - last_row));
+ }
+ }
+
code = pd->code;
line_obj = elm_code_file_line_get(code->file, line);
position = elm_code_widget_line_text_position_for_column_get(widget, line_obj, col);
@@ -727,7 +739,6 @@ _elm_code_widget_cursor_move(Elm_Code_Widget *widget, Elm_Code_Widget_Data *pd,
elm_layout_signal_emit(pd->cursor_rect, "elm,action,show,cursor", "elm");
}
-
EOLIAN static Eina_Bool
_elm_code_widget_position_at_coordinates_get(Eo *obj, Elm_Code_Widget_Data *pd,
Evas_Coord x, Evas_Coord y,
@@ -808,8 +819,6 @@ _elm_code_widget_geometry_for_position_get(Elm_Code_Widget *widget, Elm_Code_Wid
gutter = efl_ui_code_widget_text_left_gutter_width_get(widget);
grid = eina_list_nth(pd->grids, row - 1);
- evas_object_smart_calculate(pd->scroller);
- evas_object_smart_calculate(pd->gridbox);
evas_object_geometry_get(grid, x, y, NULL, NULL);
if (x)
@@ -2017,20 +2026,19 @@ _elm_code_widget_ensure_n_grid_rows(Elm_Code_Widget *widget, int rows)
evas_object_textgrid_font_set(grid, pd->font_name, pd->font_size * elm_config_scale_get());
}
-
- elm_box_recalculate(pd->gridbox);
}
static void
_elm_code_widget_resize(Elm_Code_Widget *widget, Elm_Code_Line *newline)
{
+ Eina_List *item, *lines;
+ Elm_Code_Widget_Data *pd;
Elm_Code_Line *line;
- Eina_List *item;
Evas_Object *grid;
Evas_Coord ww, wh, old_width, old_height;
- int w, h, cw = 0, ch = 0, gutter;
- unsigned int line_width;
- Elm_Code_Widget_Data *pd;
+ int w = 0, h, cw = 0, ch = 0, gutter;
+ unsigned int i, n, line_width, first_row = 1, last_row = 256;
+ Eina_Bool viewport = EINA_FALSE;
pd = efl_data_scope_get(widget, ELM_CODE_WIDGET_CLASS);
gutter = efl_ui_code_widget_text_left_gutter_width_get(widget);
@@ -2045,18 +2053,34 @@ _elm_code_widget_resize(Elm_Code_Widget *widget, Elm_Code_Line *newline)
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)
+ n = h = elm_code_file_lines_get(pd->code->file);
+
+ if (_elm_code_widget_viewport_get(widget, pd, &first_row, &last_row))
+ viewport = EINA_TRUE;
+
+ /* Grow by one page at a time where possible. */
+ n = (last_row + (last_row - first_row)) < n ?
+ last_row + (last_row - first_row) : n;
+
+ /* Calculate the maximum width of our lines. */
+
+ lines = eina_list_nth_list(pd->code->file->lines, first_row - 1);
+ for (i = 0; i < n; i++)
{
+ line = eina_list_data_get(lines);
+ if (!line) break;
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;
+
+ lines = eina_list_next(lines);
}
- _elm_code_widget_ensure_n_grid_rows(widget, h);
+ _elm_code_widget_ensure_n_grid_rows(widget, n);
_elm_code_widget_cell_size_get(widget, &cw, &ch);
+
if (w*cw > ww)
ww = w*cw;
if (h*ch > wh)
@@ -2073,15 +2097,15 @@ _elm_code_widget_resize(Elm_Code_Widget *widget, Elm_Code_Line *newline)
evas_object_size_hint_min_set(grid, ww, ch);
}
- if (!newline)
- {
- unsigned int first_row, last_row;
-
- if (!_elm_code_widget_viewport_get(widget, pd, &first_row, &last_row))
- return ;
-
- _elm_code_widget_fill_range(widget, pd, first_row, last_row, NULL);
+ /* Here we expand our scroller when there are less grids than lines of text. */
+ elm_box_unpack(pd->gridbox, pd->expander);
+ evas_object_size_hint_min_set(pd->expander, ww, (h * ch) - (eina_list_count(pd->grids) * ch));
+ elm_box_pack_end(pd->gridbox, pd->expander);
+ if (!newline && viewport)
+ {
+ /* Where possible render additional lines to the viewport. */
+ _elm_code_widget_fill_range(widget, pd, first_row, last_row + 64 < (unsigned int) h ? last_row + 64 : last_row, NULL);
return;
}
@@ -2089,7 +2113,6 @@ _elm_code_widget_resize(Elm_Code_Widget *widget, Elm_Code_Line *newline)
_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_box_recalculate(pd->gridbox);
}
EOAPI void
@@ -2430,6 +2453,9 @@ _elm_code_widget_efl_canvas_group_group_add(Eo *obj, Elm_Code_Widget_Data *pd)
elm_object_content_set(scroller, gridrows);
pd->gridbox = gridrows;
+ pd->expander = evas_object_rectangle_add(evas_object_evas_get(scroller));
+ elm_box_pack_end(pd->gridbox, pd->expander);
+
_elm_code_widget_efl_ui_widget_theme_apply(obj, pd);
evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE, _elm_code_widget_resize_cb, obj);
diff --git a/src/lib/elementary/elm_code_widget_private.h b/src/lib/elementary/elm_code_widget_private.h
index 3398ad370f..d64e5d67c7 100644
--- a/src/lib/elementary/elm_code_widget_private.h
+++ b/src/lib/elementary/elm_code_widget_private.h
@@ -24,6 +24,7 @@ typedef struct
Eina_List *grids;
unsigned int col_count;
Evas_Object *scroller, *gridbox, *background;
+ Evas_Object *expander;
const char *font_name;
Evas_Font_Size font_size;