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.
This commit is contained in:
parent
01b818c5b0
commit
b847348699
|
@ -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");
|
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);
|
evas_object_geometry_get(widget, NULL, &oy, NULL, &oh);
|
||||||
|
|
||||||
if ((cy < oy) || (cy > (oy + oh - ch)))
|
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);
|
w = elm_code_widget_columns_get(widget);
|
||||||
grid = eina_list_nth(pd->grids, line->number - 1);
|
grid = eina_list_nth(pd->grids, line->number - 1);
|
||||||
cells = evas_object_textgrid_cellrow_get(grid, 0);
|
cells = evas_object_textgrid_cellrow_get(grid, 0);
|
||||||
|
|
||||||
length = elm_code_widget_line_text_column_width_get(widget, line);
|
length = elm_code_widget_line_text_column_width_get(widget, line);
|
||||||
chrpos = 0;
|
chrpos = 0;
|
||||||
chr = (char *)elm_code_line_text_get(line, NULL);
|
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 *code;
|
||||||
Elm_Code_Line *line_obj;
|
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;
|
const char *text;
|
||||||
|
|
||||||
oldrow = pd->cursor_line;
|
oldrow = pd->cursor_line;
|
||||||
|
|
||||||
pd->cursor_col = col;
|
pd->cursor_col = col;
|
||||||
pd->cursor_line = line;
|
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;
|
code = pd->code;
|
||||||
line_obj = elm_code_file_line_get(code->file, line);
|
line_obj = elm_code_file_line_get(code->file, line);
|
||||||
position = elm_code_widget_line_text_position_for_column_get(widget, line_obj, col);
|
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");
|
elm_layout_signal_emit(pd->cursor_rect, "elm,action,show,cursor", "elm");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
EOLIAN static Eina_Bool
|
EOLIAN static Eina_Bool
|
||||||
_elm_code_widget_position_at_coordinates_get(Eo *obj, Elm_Code_Widget_Data *pd,
|
_elm_code_widget_position_at_coordinates_get(Eo *obj, Elm_Code_Widget_Data *pd,
|
||||||
Evas_Coord x, Evas_Coord y,
|
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);
|
gutter = efl_ui_code_widget_text_left_gutter_width_get(widget);
|
||||||
|
|
||||||
grid = eina_list_nth(pd->grids, row - 1);
|
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);
|
evas_object_geometry_get(grid, x, y, NULL, NULL);
|
||||||
|
|
||||||
if (x)
|
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());
|
evas_object_textgrid_font_set(grid, pd->font_name, pd->font_size * elm_config_scale_get());
|
||||||
}
|
}
|
||||||
|
|
||||||
elm_box_recalculate(pd->gridbox);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_elm_code_widget_resize(Elm_Code_Widget *widget, Elm_Code_Line *newline)
|
_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;
|
Elm_Code_Line *line;
|
||||||
Eina_List *item;
|
|
||||||
Evas_Object *grid;
|
Evas_Object *grid;
|
||||||
Evas_Coord ww, wh, old_width, old_height;
|
Evas_Coord ww, wh, old_width, old_height;
|
||||||
int w, h, cw = 0, ch = 0, gutter;
|
int w = 0, h, cw = 0, ch = 0, gutter;
|
||||||
unsigned int line_width;
|
unsigned int i, n, line_width, first_row = 1, last_row = 256;
|
||||||
Elm_Code_Widget_Data *pd;
|
Eina_Bool viewport = EINA_FALSE;
|
||||||
|
|
||||||
pd = efl_data_scope_get(widget, ELM_CODE_WIDGET_CLASS);
|
pd = efl_data_scope_get(widget, ELM_CODE_WIDGET_CLASS);
|
||||||
gutter = efl_ui_code_widget_text_left_gutter_width_get(widget);
|
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_width = ww;
|
||||||
old_height = wh;
|
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);
|
line_width = elm_code_widget_line_text_column_width_get(widget, line);
|
||||||
|
|
||||||
if ((int) line_width + gutter + 1 > w)
|
if ((int) line_width + gutter + 1 > w)
|
||||||
w = (int) line_width + gutter + 1;
|
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);
|
_elm_code_widget_cell_size_get(widget, &cw, &ch);
|
||||||
|
|
||||||
if (w*cw > ww)
|
if (w*cw > ww)
|
||||||
ww = w*cw;
|
ww = w*cw;
|
||||||
if (h*ch > wh)
|
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);
|
evas_object_size_hint_min_set(grid, ww, ch);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!newline)
|
/* 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)
|
||||||
{
|
{
|
||||||
unsigned int first_row, last_row;
|
/* 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);
|
||||||
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);
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2089,7 +2113,6 @@ _elm_code_widget_resize(Elm_Code_Widget *widget, Elm_Code_Line *newline)
|
||||||
_elm_code_widget_scroll_by(widget,
|
_elm_code_widget_scroll_by(widget,
|
||||||
(pd->gravity_x == 1.0 && ww > old_width) ? ww - old_width : 0,
|
(pd->gravity_x == 1.0 && ww > old_width) ? ww - old_width : 0,
|
||||||
(pd->gravity_y == 1.0 && wh > old_height) ? wh - old_height : 0);
|
(pd->gravity_y == 1.0 && wh > old_height) ? wh - old_height : 0);
|
||||||
elm_box_recalculate(pd->gridbox);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EOAPI void
|
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);
|
elm_object_content_set(scroller, gridrows);
|
||||||
pd->gridbox = 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);
|
_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);
|
evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE, _elm_code_widget_resize_cb, obj);
|
||||||
|
|
|
@ -24,6 +24,7 @@ typedef struct
|
||||||
Eina_List *grids;
|
Eina_List *grids;
|
||||||
unsigned int col_count;
|
unsigned int col_count;
|
||||||
Evas_Object *scroller, *gridbox, *background;
|
Evas_Object *scroller, *gridbox, *background;
|
||||||
|
Evas_Object *expander;
|
||||||
|
|
||||||
const char *font_name;
|
const char *font_name;
|
||||||
Evas_Font_Size font_size;
|
Evas_Font_Size font_size;
|
||||||
|
|
Loading…
Reference in New Issue