summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Williams <andy@andywilliams.me>2016-02-25 15:50:34 +0000
committerAndy Williams <andy@andywilliams.me>2016-02-25 21:12:51 +0000
commit87f719e83b02919fed4502294f54a7ebac3548b0 (patch)
tree5143f28800ce45a6e3598abaed70756963aad736
parentb61b460c997a5850e5c3b9d524a9b11864d6b19f (diff)
downloadefl-87f719e83b02919fed4502294f54a7ebac3548b0.tar.gz
[editor] a bunch of optimisations for redraw
Avoid drawing too much in many common scenarios
-rw-r--r--legacy/elm_code/src/lib/widget/elm_code_widget.c78
-rw-r--r--legacy/elm_code/src/lib/widget/elm_code_widget_selection.c5
2 files changed, 64 insertions, 19 deletions
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 203c1d1be4..10aa690bbd 100644
--- a/legacy/elm_code/src/lib/widget/elm_code_widget.c
+++ b/legacy/elm_code/src/lib/widget/elm_code_widget.c
@@ -415,19 +415,19 @@ _elm_code_widget_empty_line(Elm_Code_Widget *widget, unsigned int number)
}
static void
-_elm_code_widget_fill(Elm_Code_Widget *widget)
+_elm_code_widget_fill_range(Elm_Code_Widget *widget, unsigned int first_row, unsigned int last_row)
{
Elm_Code_Line *line;
- int w, h;
+ 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);
- evas_object_textgrid_size_get(pd->grid, &w, &h);
+ h = elm_code_widget_lines_visible_get(widget);
- for (y = 1; y <= (unsigned int) h && y <= elm_code_file_lines_get(pd->code->file); y++)
+ for (y = first_row; y <= last_row; y++)
{
line = elm_code_file_line_get(pd->code->file, y);
@@ -439,6 +439,38 @@ _elm_code_widget_fill(Elm_Code_Widget *widget)
}
}
+static void
+_elm_code_widget_refresh(Elm_Code_Widget *widget)
+{
+ Evas_Coord scroll_y, scroll_h, ch;
+ unsigned int first_row, last_row;
+
+ Elm_Code_Widget_Data *pd;
+
+ pd = eo_data_scope_get(widget, ELM_CODE_WIDGET_CLASS);
+
+ evas_object_textgrid_cell_size_get(pd->grid, NULL, &ch);
+ elm_scroller_region_get(pd->scroller, NULL, &scroll_y, NULL, &scroll_h);
+
+ first_row = scroll_y / ch + 1;
+ last_row = (scroll_y + scroll_h) / ch + 1;
+
+ if (last_row > elm_code_file_lines_get(pd->code->file))
+ last_row = elm_code_file_lines_get(pd->code->file);
+
+ _elm_code_widget_fill_range(widget, first_row, last_row);
+}
+
+static void
+_elm_code_widget_fill(Elm_Code_Widget *widget)
+{
+ Elm_Code_Widget_Data *pd;
+
+ pd = eo_data_scope_get(widget, ELM_CODE_WIDGET_CLASS);
+
+ _elm_code_widget_fill_range(widget, 1, elm_code_file_lines_get(pd->code->file));
+}
+
static Eina_Bool
_elm_code_widget_line_cb(void *data, Eo *obj EINA_UNUSED,
const Eo_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED)
@@ -455,7 +487,7 @@ _elm_code_widget_line_cb(void *data, Eo *obj EINA_UNUSED,
return EO_CALLBACK_CONTINUE;
// FIXME refresh just the row unless we have resized (by being the result of a row append)
- _elm_code_widget_fill(widget);
+ _elm_code_widget_refresh(widget);
return EO_CALLBACK_CONTINUE;
}
@@ -480,6 +512,18 @@ _elm_code_widget_selection_cb(void *data, Eo *obj EINA_UNUSED, const Eo_Event_De
widget = (Elm_Code_Widget *)data;
+ _elm_code_widget_refresh(widget);
+ return EO_CALLBACK_CONTINUE;
+}
+
+static Eina_Bool
+_elm_code_widget_selection_clear_cb(void *data, Eo *obj EINA_UNUSED, const Eo_Event_Description *desc EINA_UNUSED,
+ void *event_info EINA_UNUSED)
+{
+ Elm_Code_Widget *widget;
+
+ widget = (Elm_Code_Widget *)data;
+
_elm_code_widget_fill(widget);
return EO_CALLBACK_CONTINUE;
}
@@ -492,7 +536,7 @@ _elm_code_widget_resize_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EIN
widget = (Elm_Code_Widget *)data;
- _elm_code_widget_fill(widget);
+ _elm_code_widget_refresh(widget);
}
static Eina_Bool
@@ -703,11 +747,8 @@ _elm_code_widget_mouse_down_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj
return;
}
- if (!pd->editable)
- return;
-
- if (col > 0 && row <= elm_code_file_lines_get(pd->code->file))
- elm_code_widget_selection_start(widget, row, col);
+ if (pd->editable)
+ _elm_code_widget_clicked_editable_cb(widget, row, (unsigned int) col);
}
static void
@@ -735,9 +776,12 @@ _elm_code_widget_mouse_move_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj
_elm_code_widget_tooltip_text_set(widget, line->status_text);
}
- if (!pd->editable || !pd->selection || !event->buttons)
+ if (!pd->editable || !event->buttons)
return;
+ if (!pd->selection)
+ if (col > 0 && row <= elm_code_file_lines_get(pd->code->file))
+ elm_code_widget_selection_start(widget, row, col);
elm_code_widget_selection_end(widget, row, col);
}
@@ -1328,7 +1372,7 @@ _elm_code_widget_focused_event_cb(void *data, Evas_Object *obj,
pd->focussed = EINA_TRUE;
_elm_code_widget_update_focus_directions(widget);
- _elm_code_widget_fill(obj);
+ _elm_code_widget_refresh(obj);
}
static void
@@ -1342,7 +1386,7 @@ _elm_code_widget_unfocused_event_cb(void *data, Evas_Object *obj,
pd = eo_data_scope_get(widget, ELM_CODE_WIDGET_CLASS);
pd->focussed = EINA_FALSE;
- _elm_code_widget_fill(obj);
+ _elm_code_widget_refresh(obj);
}
EOLIAN static Eina_Bool
@@ -1539,10 +1583,10 @@ _elm_code_widget_show_whitespace_get(Eo *obj EINA_UNUSED, Elm_Code_Widget_Data *
}
EOLIAN static void
-_elm_code_widget_tab_inserts_spaces_set(Eo *obj, Elm_Code_Widget_Data *pd, Eina_Bool spaces)
+_elm_code_widget_tab_inserts_spaces_set(Eo *obj EINA_UNUSED, Elm_Code_Widget_Data *pd,
+ Eina_Bool spaces)
{
pd->tab_inserts_spaces = spaces;
- _elm_code_widget_fill(obj);
}
EOLIAN static Eina_Bool
@@ -1685,7 +1729,7 @@ _elm_code_widget_evas_object_smart_add(Eo *obj, Elm_Code_Widget_Data *pd)
eo_event_callback_add(&ELM_CODE_EVENT_LINE_LOAD_DONE, _elm_code_widget_line_cb, obj),
eo_event_callback_add(&ELM_CODE_EVENT_FILE_LOAD_DONE, _elm_code_widget_file_cb, obj),
eo_event_callback_add(ELM_CODE_WIDGET_EVENT_SELECTION_CHANGED, _elm_code_widget_selection_cb, obj),
- eo_event_callback_add(ELM_CODE_WIDGET_EVENT_SELECTION_CLEARED, _elm_code_widget_selection_cb, obj));
+ eo_event_callback_add(ELM_CODE_WIDGET_EVENT_SELECTION_CLEARED, _elm_code_widget_selection_clear_cb, obj));
_elm_code_widget_font_set(obj, pd, NULL, 10);
}
diff --git a/legacy/elm_code/src/lib/widget/elm_code_widget_selection.c b/legacy/elm_code/src/lib/widget/elm_code_widget_selection.c
index d4d214241b..ad7f7c46d8 100644
--- a/legacy/elm_code/src/lib/widget/elm_code_widget_selection.c
+++ b/legacy/elm_code/src/lib/widget/elm_code_widget_selection.c
@@ -140,9 +140,10 @@ elm_code_widget_selection_clear(Evas_Object *widget)
pd = eo_data_scope_get(widget, ELM_CODE_WIDGET_CLASS);
- if (pd->selection)
- free(pd->selection);
+ if (!pd->selection)
+ return;
+ free(pd->selection);
pd->selection = NULL;
eo_do(widget, eo_event_callback_call(ELM_CODE_WIDGET_EVENT_SELECTION_CLEARED, widget));
}