rimmed pushed a commit to branch master. http://git.enlightenment.org/tools/eflete.git/commit/?id=b96b6c0429c337136f22aee02bc6217917dd759a
commit b96b6c0429c337136f22aee02bc6217917dd759a Author: Vyacheslav Reutskiy <[email protected]> Date: Mon Nov 23 16:20:34 2015 +0200 groupedit: improve table calculation Change-Id: Icfbc8a42582f53b23665f7aefce5e682dca9ccd9 --- data/themes/default/widgets/layout.edc | 2 - src/bin/ui/workspace/groupedit_calc.c | 345 ++++++++++++------------------- src/bin/ui/workspace/groupedit_private.h | 2 + 3 files changed, 133 insertions(+), 216 deletions(-) diff --git a/data/themes/default/widgets/layout.edc b/data/themes/default/widgets/layout.edc index 12329ed..8c317b5 100644 --- a/data/themes/default/widgets/layout.edc +++ b/data/themes/default/widgets/layout.edc @@ -3447,7 +3447,6 @@ group { name: "elm/layout/groupview/default"; image: "bg_group.png" COMP; image: "bg_table.png" COMP; image: "bg_box.png" COMP; - image: "bg_part_item.png" COMP; } part { name: "bg"; type: IMAGE; @@ -3471,7 +3470,6 @@ group { name: "elm/layout/groupview/default"; BG(group, bg_group.png) BG(table, bg_table.png) BG(box, bg_box.png) - BG(part_item, bg_part_item.png) #undef BG } part { name: "border"; diff --git a/src/bin/ui/workspace/groupedit_calc.c b/src/bin/ui/workspace/groupedit_calc.c index 36559f6..0cdd56a 100644 --- a/src/bin/ui/workspace/groupedit_calc.c +++ b/src/bin/ui/workspace/groupedit_calc.c @@ -537,6 +537,114 @@ _part_select(void *data, (void *)gp->part); } +static void +_part_table_add(Ws_Groupedit_Smart_Data *sd, Groupedit_Part *gp) +{ + + Eina_List *l; + Eina_Stringshare *str; + int span_c, span_r, col, row, i, j; + const Evas_Object *table; + + assert(gp->container == NULL); + + gp->container = evas_object_table_add(sd->e); + elm_box_pack_end(gp->draw, gp->container); + evas_object_show(gp->container); + + table = edje_object_part_object_get(sd->group->edit_object, gp->part->name); + evas_object_table_col_row_size_get(table, &col, &row); + fprintf(stdout, "%5d %5d\n", col, row); + gp->items_draw = (Eina_Stringshare ***)mem_calloc(1, sizeof(Eina_Stringshare **) * col); + for (i = 0; i < col; i++) + gp->items_draw[i] = (Eina_Stringshare **)mem_calloc(1, sizeof(Eina_Stringshare *) * row); + fprintf(stdout, "groupedit %p\n", gp->part->items); + EINA_LIST_FOREACH(gp->part->items, l, str) + { + col = edje_edit_part_item_position_col_get(sd->group->edit_object, gp->part->name, str); + row = edje_edit_part_item_position_row_get(sd->group->edit_object, gp->part->name, str); + span_c = edje_edit_part_item_span_col_get(sd->group->edit_object, gp->part->name, str); + span_r = edje_edit_part_item_span_row_get(sd->group->edit_object, gp->part->name, str); + + for (i = col; i < (col + span_c); i++) + { + for (j = row; j < (row + span_r); j++) + gp->items_draw[i][j] = (Eina_Stringshare *) -1; + } + gp->items_draw[col][row] = eina_stringshare_add(str); + } +} + +static void +_part_table_items_add(Ws_Groupedit_Smart_Data *sd, Groupedit_Part *gp) +{ + const Evas_Object *table; + Evas_Object *cell; + Eina_Stringshare *item_name, *item_source; + int w, h; /* Geometry values */ + int min_w, max_w, min_h, max_h; /* Hints values */ + int i, k, col, row; + unsigned char span_col, span_row; + + assert(gp->container != NULL); + + table = edje_object_part_object_get(sd->group->edit_object, gp->part->name); + evas_object_table_col_row_size_get(table, &col, &row); + evas_object_table_clear(gp->container, true); + + for (i = 0; i < col; i++) + { + for (k = 0; k < row; k++) + { + if (gp->items_draw[i][k] == (Eina_Stringshare *) -1) continue; + + span_col = 1; + span_row = 1; + + if (gp->items_draw[i][k] != NULL) + { + item_name = gp->items_draw[i][k]; + span_col = edje_edit_part_item_span_col_get(sd->group->edit_object, gp->part->name, item_name); + span_row = edje_edit_part_item_span_row_get(sd->group->edit_object, gp->part->name, item_name); + + cell = edje_object_add(sd->e); + item_source = edje_edit_part_item_source_get(sd->group->edit_object, gp->part->name, item_name); + edje_object_file_set(cell, ap.project->dev, item_source); + /* hide this object, it need only for calculate cell size */ + evas_object_hide(cell); + + min_w = edje_edit_part_item_min_w_get(sd->group->edit_object, gp->part->name, item_name); + min_h = edje_edit_part_item_min_h_get(sd->group->edit_object, gp->part->name, item_name); + + // Calculation according to box/table item implementation in efl 1.13 at edje_load.c + if ((min_w <= 0) && (min_h <= 0)) + { + edje_object_size_min_get(cell, &w, &h); + if ((w <= 0) && (h <= 0)) + edje_object_size_min_calc(cell, &w, &h); + } + if (((min_w <= 0) && (min_h <= 0)) && ((w > 0) || (h > 0))) + evas_object_size_hint_min_set(cell, w, h); + else + evas_object_size_hint_min_set(cell, min_w, min_h); + + max_w = edje_edit_part_item_max_w_get(sd->group->edit_object, gp->part->name, item_name); + max_h = edje_edit_part_item_max_h_get(sd->group->edit_object, gp->part->name, item_name); + evas_object_size_hint_max_set(cell, max_w, max_h); + evas_object_table_pack(gp->container, cell, i, k, span_col, span_row); + } + cell = elm_layout_add(sd->parent); + evas_object_size_hint_align_set(cell, EVAS_HINT_FILL, EVAS_HINT_FILL); + + elm_layout_theme_set(cell, "layout", "groupview", "default"); + evas_object_show(cell); + elm_object_signal_emit(cell, "border,part_item", "eflete"); + + evas_object_table_pack(gp->container, cell, i, k, span_col, span_row); + } + } +} + #define GP_GEOMETRY_SET \ if (gp->bg) \ { \ @@ -619,6 +727,10 @@ _part_recalc_apply(Ws_Groupedit_Smart_Data *sd, evas_object_size_hint_min_set(gp->layout, w, h); evas_object_size_hint_max_set(gp->layout, w, h); + evas_object_resize(gp->container, w, h); + evas_object_move(gp->container, (x * sd->zoom_factor + xe + offset_x), + (y * sd->zoom_factor + ye + offset_y)); + /* set the proxy part size */ ro = edje_object_part_object_get(sd->group->edit_object, gp->part->name); evas_object_geometry_get(ro, NULL, NULL, &ro_w, &ro_h); @@ -774,6 +886,7 @@ _parts_recalc(Ws_Groupedit_Smart_Data *sd) break; case EDJE_PART_TYPE_TABLE: _table_param_update(sd, gp); + _common_param_update(gp, sd->group->edit_object); _part_recalc_apply(sd, gp, offset_x, offset_y); break; case EDJE_PART_TYPE_BOX: @@ -821,7 +934,6 @@ _part_draw_add(Ws_Groupedit_Smart_Data *sd, Part_ *part) gp = mem_calloc(1, sizeof(Groupedit_Part)); gp->part = part; - //gp->border = NULL; gp->item = NULL; @@ -839,10 +951,9 @@ _part_draw_add(Ws_Groupedit_Smart_Data *sd, Part_ *part) #define PART_VIEW_PROXY_SET() \ gp->proxy_part = evas_object_image_filled_add(sd->e); \ - elm_box_pack_start(gp->draw, gp->proxy_part); \ + elm_box_pack_end(gp->draw, gp->proxy_part); \ evas_object_show(gp->proxy_part); \ - switch (part->type) { case EDJE_PART_TYPE_RECTANGLE: @@ -879,8 +990,11 @@ _part_draw_add(Ws_Groupedit_Smart_Data *sd, Part_ *part) elm_object_signal_emit(gp->layout, "border,group", "eflete"); break; case EDJE_PART_TYPE_TABLE: - IMAGE_ADD_NEW(sd->obj, gp->bg, "bg", "table") - gp->draw = _part_container_add(sd, part, &(gp->items)); + PART_VIEW_ADD() + PART_VIEW_PROXY_SET() + elm_object_signal_emit(gp->layout, "border,table", "eflete"); + _part_table_add(sd, gp); + _part_table_items_add(sd, gp); break; case EDJE_PART_TYPE_BOX: IMAGE_ADD_NEW(sd->obj, gp->bg, "bg", "box") @@ -1258,223 +1372,26 @@ _common_param_update(Groupedit_Part *gp, Evas_Object *edit_obj) static void _table_param_update(Ws_Groupedit_Smart_Data *sd, Groupedit_Part *gp) { - Groupedit_Item *ge_item = NULL, *spread_item = NULL; - Eina_List *l_items, *l_n_items; - Eina_Stringshare *part = gp->part->name; - Eina_Stringshare *item_source = NULL; - - Evas_Object *child = NULL; - int w, h; /* Geometry values */ - int min_w, max_w, prefer_w, min_h, max_h, prefer_h; /* Hints values */ - int spread_col, spread_row; /* Position values */ - - short unsigned int pos_col = 0, pos_row = 0; - unsigned char span_col = 0, span_row = 0, homogeneous = 0; - Evas_Aspect_Control aspect = EVAS_ASPECT_CONTROL_NONE; - int aspect_x, aspect_y; - double align_x = 0, align_y = 0, weight_x = 0, weight_y = 0; /* Align object in cell */ - int pad_l = 0, pad_r = 0, pad_t = 0, pad_b = 0; - int old_spread_row = 0, spread_pos_col = 0, spread_pos_row = 0; - int r = 0, g = 0, b = 0, a = 0; - - /* fake_init - how much fake items, already created. - * fake_count - how much fake items needed for filling empty cells. - * fake_diff - deifference beetween fake_count and fake_init - */ - int fake_init = 0, fake_count = 0, fake_diff = 0; - Eina_List *fake_l; - int i, k, col, row; /* counters for filling empty cells with fake items*/ + double align_x = 0, align_y = 0; + int pad_x, pad_y; + unsigned char homogeneous; assert(sd != NULL); assert(gp != NULL); - TODO("get TABLE attributes from edje object, after implementing functions" - "in edje_edit libs. Until that time will be used default values.") - PART_STATE_GET(sd->group->edit_object, part) - homogeneous = edje_edit_state_table_homogeneous_get(sd->group->edit_object, part, state, value); - evas_object_table_homogeneous_set(gp->draw, homogeneous); + PART_STATE_GET(sd->group->edit_object, gp->part->name) + homogeneous = edje_edit_state_table_homogeneous_get(sd->group->edit_object, gp->part->name, state, value); + evas_object_table_homogeneous_set(gp->container, homogeneous); - align_x = edje_edit_state_container_align_x_get(sd->group->edit_object, part, state, value); - align_y = edje_edit_state_container_align_y_get(sd->group->edit_object, part, state, value); - evas_object_table_align_set(gp->draw, align_x, align_y); + align_x = edje_edit_state_container_align_x_get(sd->group->edit_object, gp->part->name, state, value); + align_y = edje_edit_state_container_align_y_get(sd->group->edit_object, gp->part->name, state, value); + evas_object_table_align_set(gp->container, align_x, align_y); - pad_l = edje_edit_state_container_padding_x_get(sd->group->edit_object, part, state, value); - pad_r = edje_edit_state_container_padding_y_get(sd->group->edit_object, part, state, value); - evas_object_table_padding_set(gp->draw, pad_l, pad_r); + pad_x = edje_edit_state_container_padding_x_get(sd->group->edit_object, gp->part->name, state, value); + pad_y = edje_edit_state_container_padding_y_get(sd->group->edit_object, gp->part->name, state, value); + evas_object_table_padding_set(gp->container, pad_x, pad_y); - _colors_get(gp, sd->group->edit_object, state, value, &r, &g, &b, &a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL); PART_STATE_FREE - - /* Unpack all fake items, before pack real */ - fake_init = eina_list_count(gp->fake_items); - EINA_LIST_FOREACH(gp->fake_items, fake_l, ge_item) - { - evas_object_table_unpack(gp->draw, ge_item->border); - evas_object_table_unpack(gp->draw, ge_item->highlight); - } - - EINA_LIST_FOREACH_SAFE(gp->items, l_items, l_n_items, ge_item) - { - item_source = edje_edit_part_item_source_get(sd->group->edit_object, part, ge_item->name); - edje_object_file_set(ge_item->draw, ap.project->dev, item_source); - - pos_col = edje_edit_part_item_position_col_get(sd->group->edit_object, part, ge_item->name); - pos_row = edje_edit_part_item_position_row_get(sd->group->edit_object, part, ge_item->name); - span_col = edje_edit_part_item_span_col_get(sd->group->edit_object, part, ge_item->name); - span_row = edje_edit_part_item_span_row_get(sd->group->edit_object, part, ge_item->name); - - min_w = edje_edit_part_item_min_w_get(sd->group->edit_object, part, ge_item->name); - min_h = edje_edit_part_item_min_h_get(sd->group->edit_object, part, ge_item->name); - -/* Calculation according to box/table item implementation in efl 1.13 at edje_load.c */ - if ((min_w <= 0) && (min_h <= 0)) - { - edje_object_size_min_get(ge_item->draw, &w, &h); - if ((w <= 0) && (h <= 0)) - edje_object_size_min_calc(ge_item->draw, &w, &h); - } - if (((min_w <= 0) && (min_h <= 0)) && ((w > 0) || (h > 0))) - evas_object_size_hint_min_set(ge_item->draw, w, h); - else - { - w = min_w; - h = min_h; - evas_object_size_hint_min_set(ge_item->draw, min_w, min_h); - } - max_w = edje_edit_part_item_max_w_get(sd->group->edit_object, part, ge_item->name); - max_h = edje_edit_part_item_max_h_get(sd->group->edit_object, part, ge_item->name); - evas_object_size_hint_max_set(ge_item->draw, max_w, max_h); - prefer_w = edje_edit_part_item_prefer_w_get(sd->group->edit_object, part, ge_item->name); - prefer_h = edje_edit_part_item_prefer_h_get(sd->group->edit_object, part, ge_item->name); - evas_object_size_hint_request_set(ge_item->draw, prefer_w, prefer_h); - edje_edit_part_item_padding_get(sd->group->edit_object, part, ge_item->name, &pad_l, &pad_r, &pad_t, &pad_b); - evas_object_size_hint_padding_set(ge_item->draw, pad_l, pad_r, pad_t, pad_b); - align_x = edje_edit_part_item_align_x_get(sd->group->edit_object, part, ge_item->name); - align_y = edje_edit_part_item_align_y_get(sd->group->edit_object, part, ge_item->name); - evas_object_size_hint_align_set(ge_item->draw, align_x, align_y); - weight_x = edje_edit_part_item_weight_x_get(sd->group->edit_object, part, ge_item->name); - weight_y = edje_edit_part_item_weight_y_get(sd->group->edit_object, part, ge_item->name); - evas_object_size_hint_weight_set(ge_item->draw, weight_x, weight_y); - switch(edje_edit_part_item_aspect_mode_get(sd->group->edit_object, part, ge_item->name)) - { - case EDJE_ASPECT_CONTROL_NONE: aspect = EVAS_ASPECT_CONTROL_NONE; break; - case EDJE_ASPECT_CONTROL_NEITHER: aspect = EVAS_ASPECT_CONTROL_NEITHER; break; - case EDJE_ASPECT_CONTROL_HORIZONTAL: aspect = EVAS_ASPECT_CONTROL_HORIZONTAL; break; - case EDJE_ASPECT_CONTROL_VERTICAL: aspect = EVAS_ASPECT_CONTROL_VERTICAL; break; - case EDJE_ASPECT_CONTROL_BOTH: aspect = EVAS_ASPECT_CONTROL_BOTH; break; - } - aspect_x = edje_edit_part_item_aspect_w_get(sd->group->edit_object, part, ge_item->name); - aspect_y = edje_edit_part_item_aspect_h_get(sd->group->edit_object, part, ge_item->name); - evas_object_size_hint_aspect_set(ge_item->draw, aspect, aspect_x, aspect_y); - evas_object_color_set(ge_item->draw, r, g, b, a); - - evas_object_table_pack(gp->draw, ge_item->border, pos_col, - pos_row, span_col, span_row); - evas_object_table_pack(gp->draw, ge_item->draw, pos_col, pos_row, span_col, span_row); - evas_object_table_pack(gp->draw, ge_item->highlight, pos_col, - pos_row, span_col, span_row); - - spread_col = edje_edit_part_item_spread_w_get(sd->group->edit_object, part, ge_item->name); - spread_row = edje_edit_part_item_spread_h_get(sd->group->edit_object, part, ge_item->name); - - EINA_LIST_FREE(ge_item->spread, spread_item) - { - evas_object_table_unpack(gp->draw, spread_item->draw); - evas_object_smart_member_del(spread_item->border); - evas_object_smart_member_del(spread_item->draw); - evas_object_smart_member_del(spread_item->highlight); - evas_object_del(spread_item->border); - evas_object_del(spread_item->draw); - evas_object_del(spread_item->highlight); - free(spread_item); - } - - old_spread_row = spread_row; - - while((spread_col > 1) || (spread_row > 1)) - { - spread_pos_col = pos_col + spread_col - 1 ; - spread_pos_row = pos_row + spread_row - 1; - - spread_item = (Groupedit_Item *)mem_calloc(1, sizeof(Groupedit_Item)); - - spread_item->draw = edje_object_add(sd->e); - edje_object_file_set(spread_item->draw, ap.project->dev, item_source); - ge_item->spread = eina_list_append(ge_item->spread, spread_item); - evas_object_size_hint_max_set(spread_item->draw, max_w, max_h); - evas_object_size_hint_request_set(spread_item->draw, prefer_w, prefer_h); - evas_object_size_hint_min_set(spread_item->draw, min_w, min_h); - evas_object_size_hint_padding_set(spread_item->draw, pad_l, pad_r, pad_t, pad_b); - evas_object_size_hint_align_set(spread_item->draw, align_x, align_y); - evas_object_size_hint_weight_set(spread_item->draw, weight_x, weight_y); - evas_object_size_hint_aspect_set(spread_item->draw, aspect, aspect_x, aspect_y); - - evas_object_table_pack(gp->draw, spread_item->draw, spread_pos_col, - spread_pos_row, span_col, span_row); - - - evas_object_show(spread_item->draw); - evas_object_smart_member_add(spread_item->draw, gp->draw); - if (spread_row > 1) spread_row--; - else if (spread_col > 1) {spread_col--; spread_row = old_spread_row; } - evas_object_color_set(spread_item->draw, r, g, b, a); - } - - evas_object_smart_member_add(ge_item->border, gp->draw); - evas_object_smart_member_add(ge_item->draw, gp->draw); - evas_object_smart_member_add(ge_item->highlight, gp->draw); - } - - /* Fill empty cells with fake items */ - evas_object_table_col_row_size_get(gp->draw, &col, &row); - Eina_List *fake_queue = gp->fake_items; - Groupedit_Item *fake = NULL; - for (i = 0; i < col; i++) - { - for (k = 0; k < row; k++) - { - child = evas_object_table_child_get(gp->draw, i, k); - if (!child) - { - fake = eina_list_data_get(fake_queue); - fake_queue = eina_list_next(fake_queue); - if (!fake) - { - /* If there are no already created fakes items, then create new */ - fake = (Groupedit_Item *)mem_calloc(1, sizeof(Groupedit_Item)); - IMAGE_ADD_NEW(sd->obj, fake->border, "bg", "part_item") - evas_object_show(fake->border); - evas_object_size_hint_min_set(fake->border, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_size_hint_align_set(fake->border, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_size_hint_weight_set(fake->border, EVAS_HINT_FILL, EVAS_HINT_FILL); - IMAGE_ADD_NEW(sd->obj, fake->highlight, "border", "1px"); - evas_object_size_hint_min_set(fake->highlight, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_size_hint_align_set(fake->highlight, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_size_hint_weight_set(fake->highlight, EVAS_HINT_FILL, EVAS_HINT_FILL); - evas_object_color_set(fake->highlight, 49, 140, 141, 255); - evas_object_show(fake->highlight); - gp->fake_items = eina_list_append(gp->fake_items, fake); - } - evas_object_table_pack(gp->draw, fake->border, i, k, 1, 1); - evas_object_table_pack(gp->draw, fake->highlight, i, k, 1, 1); - fake_count++; - } - } - } - fake_diff = fake_count - fake_init; - EINA_LIST_REVERSE_FOREACH(gp->fake_items, fake_l, fake) - { - if (fake_diff < 0) - { - evas_object_del(fake->border); - evas_object_del(fake->highlight); - free(fake); - gp->fake_items = eina_list_remove_list(gp->fake_items, fake_l); - fake_diff++; - } - else break; - } - evas_object_smart_calculate(gp->draw); } static Evas_Object_Box_Layout diff --git a/src/bin/ui/workspace/groupedit_private.h b/src/bin/ui/workspace/groupedit_private.h index be91e69..a194329 100644 --- a/src/bin/ui/workspace/groupedit_private.h +++ b/src/bin/ui/workspace/groupedit_private.h @@ -143,6 +143,8 @@ struct _Groupedit_Part text and textblock.*/ Evas_Object *proxy_part; Evas_Object *layout; + Evas_Object *container; /**< Used for box/table parts */ + Eina_Stringshare ***items_draw; Evas_Object *item; /**< The object border in the separete mode */ Eina_List *items; /**< The items, for TABLE, BOX part types */ Eina_List *fake_items; /**< The items, for TABLE, BOX part types */ --
