ami pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=0ca98280d4b041e277d071ecfbcbc77db2eaa7cd

commit 0ca98280d4b041e277d071ecfbcbc77db2eaa7cd
Author: Amitesh Singh <amitesh...@samsung.com>
Date:   Tue Aug 8 17:22:05 2017 +0900

    Efl.Ui.Panes: allow panes to respect the min size of its content
    
    refer T5359
---
 src/bin/elementary/test.c                 |   3 +-
 src/bin/elementary/test_panes.c           |  41 ++++++++++++
 src/lib/elementary/efl_ui_panes.c         | 104 +++++++++++++++++++++++++++++-
 src/lib/elementary/efl_ui_panes_private.h |   2 +
 4 files changed, 147 insertions(+), 3 deletions(-)

diff --git a/src/bin/elementary/test.c b/src/bin/elementary/test.c
index ddfa3a70b4..579387ff48 100644
--- a/src/bin/elementary/test.c
+++ b/src/bin/elementary/test.c
@@ -194,6 +194,7 @@ void test_menu2(void *data, Evas_Object *obj, void 
*event_info);
 void test_panel(void *data, Evas_Object *obj, void *event_info);
 void test_panel2(void *data, Evas_Object *obj, void *event_info);
 void test_panes(void *data, Evas_Object *obj, void *event_info);
+void test_panes_minsize(void *data, Evas_Object *obj, void *event_info);
 void test_calendar(void *data, Evas_Object *obj, void *event_info);
 void test_calendar2(void *data, Evas_Object *obj, void *event_info);
 void test_calendar3(void *data, Evas_Object *obj, void *event_info);
@@ -1000,7 +1001,7 @@ add_tests:
    ADD_TEST(NULL, "Dividers", "Panel", test_panel);
    ADD_TEST(NULL, "Dividers", "Panel Scrollable", test_panel2);
    ADD_TEST(NULL, "Dividers", "Panes", test_panes);
-
+   ADD_TEST(NULL, "Dividers", "Panes minsize", test_panes_minsize);
    //------------------------------//
    ADD_TEST(NULL, "Standardization", "Conformant", test_conformant);
    ADD_TEST(NULL, "Standardization", "Conformant 2", test_conformant2);
diff --git a/src/bin/elementary/test_panes.c b/src/bin/elementary/test_panes.c
index 27d9535045..da7255c15b 100644
--- a/src/bin/elementary/test_panes.c
+++ b/src/bin/elementary/test_panes.c
@@ -103,3 +103,44 @@ test_panes(void *data EINA_UNUSED, Evas_Object *obj 
EINA_UNUSED, void *event_inf
    evas_object_resize(win, 320, 400);
    evas_object_show(win);
 }
+
+void
+test_panes_minsize(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void 
*event_info EINA_UNUSED)
+{
+   Eo *win, *panes, *panes_h;
+
+   win = efl_add(EFL_UI_WIN_CLASS, NULL,
+                 efl_ui_win_type_set(efl_added, EFL_UI_WIN_BASIC),
+                 efl_text_set(efl_added, "Panes Minsize"),
+                 efl_ui_win_autodel_set(efl_added, EINA_TRUE)
+                );
+
+   panes = efl_add(EFL_UI_PANES_CLASS, win,
+                   efl_gfx_size_hint_weight_set(efl_added, 
EFL_GFX_SIZE_HINT_EXPAND, EFL_GFX_SIZE_HINT_EXPAND),
+                   efl_content_set(win, efl_added)
+                  );
+
+   efl_add(EFL_UI_BUTTON_CLASS, win,
+           efl_text_set(efl_added, "Left - min size 110, 110"),
+           efl_gfx_size_hint_min_set(efl_added, 110, 110),
+           efl_content_set(efl_part(panes, "first"), efl_added)
+          );
+
+   panes_h = efl_add(EFL_UI_PANES_CLASS, win,
+                     efl_orientation_set(efl_added, EFL_ORIENT_HORIZONTAL),
+                     efl_content_set(efl_part(panes, "second"), efl_added)
+                    );
+   efl_add(EFL_UI_BUTTON_CLASS, win,
+           efl_text_set(efl_added, "Up - no min size"),
+           efl_content_set(efl_part(panes_h, "first"), efl_added)
+          );
+
+   efl_add(EFL_UI_BUTTON_CLASS, win,
+           efl_text_set(efl_added, "Down - min size 50 40"),
+           efl_gfx_size_hint_min_set(efl_added, 50, 40),
+           efl_content_set(efl_part(panes_h, "second"), efl_added)
+          );
+
+   efl_gfx_size_set(win, 320, 400);
+}
+
diff --git a/src/lib/elementary/efl_ui_panes.c 
b/src/lib/elementary/efl_ui_panes.c
index dde24ce678..3e7954fcfd 100644
--- a/src/lib/elementary/efl_ui_panes.c
+++ b/src/lib/elementary/efl_ui_panes.c
@@ -47,6 +47,8 @@ static const Elm_Layout_Part_Alias_Description 
_content_aliases[] =
    {NULL, NULL}
 };
 
+static void _set_min_size_new(void *data);
+
 EOLIAN static Efl_Ui_Theme_Apply
 _efl_ui_panes_elm_widget_theme_apply(Eo *obj, Efl_Ui_Panes_Data *sd)
 {
@@ -173,6 +175,99 @@ _on_unpressed(void *data,
      }
 }
 
+EOLIAN static void
+_efl_ui_panes_elm_layout_sizing_eval(Eo *obj, Efl_Ui_Panes_Data *sd)
+{
+   ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
+
+   Eo *first_content, *second_content;
+   int minw, minh;
+
+   first_content = efl_content_get(efl_part(obj, "first"));
+   second_content = efl_content_get(efl_part(obj, "second"));
+
+   if (first_content)
+     efl_gfx_size_hint_combined_min_get(first_content, &sd->first_minw, 
&sd->first_minh);
+     //TODO: use this for allow cropping?
+     //efl_gfx_size_hint_min_get(first_content, &sd->first_minw, 
&sd->first_minh);
+   if (second_content)
+     efl_gfx_size_hint_combined_min_get(second_content, &sd->second_minw, 
&sd->second_minh);
+     //TODO: use this for allow cropping
+     //efl_gfx_size_hint_min_get(second_content, &sd->second_minw, 
&sd->second_minh);
+
+   if (sd->orientation == EFL_ORIENT_HORIZONTAL)
+     {
+        edje_object_size_min_restricted_calc(wd->resize_obj, &minw, &minh,
+                                             MAX(sd->first_minw, 
sd->second_minw),
+                                             sd->first_minh + sd->second_minh);
+     }
+   else
+     {
+        edje_object_size_min_restricted_calc(wd->resize_obj, &minw, &minh,
+                                             sd->first_minw + sd->second_minw,
+                                             MAX(sd->first_minh, 
sd->second_minh));
+     }
+
+   efl_gfx_size_hint_min_set(obj, minw, minh);
+   _set_min_size_new(obj);
+}
+
+static void
+_set_min_size_new(void *data)
+{
+   Eo *obj = data;
+   EFL_UI_PANES_DATA_GET(obj, sd);
+   ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
+
+   int first_minw = sd->first_minw, first_minh = sd->first_minh;
+   int second_minw = sd->second_minw, second_minh = sd->second_minh;
+   int w, h;
+   double first_min_relative_size = 0.0, second_min_relative_size = 0.0;
+
+   evas_object_geometry_get(wd->resize_obj, NULL, NULL, &w, &h);
+
+   if (sd->orientation == EFL_ORIENT_HORIZONTAL)
+     {
+        if (first_minh + second_minh > h)
+          {
+             first_min_relative_size = first_minh/(first_minh + second_minh);
+             second_min_relative_size = second_minh/(first_minh + second_minh);
+          }
+        else
+          {
+             if (h > 0)
+               {
+                  first_min_relative_size = first_minh/(double)h;
+                  second_min_relative_size = second_minh/(double)h;
+               }
+          }
+        edje_object_part_drag_value_set(wd->resize_obj, "right_constraint",
+                                        0.0, 1.0 - second_min_relative_size);
+        edje_object_part_drag_value_set(wd->resize_obj, "left_constraint",
+                                        0.0, first_min_relative_size);
+     }
+   else
+     {
+        if (first_minw + second_minw > w)
+          {
+             first_min_relative_size = first_minw/(first_minw + second_minw);
+             second_min_relative_size = second_minw/(first_minw + second_minw);
+          }
+        else
+          {
+             if (w > 0)
+               {
+                  first_min_relative_size = first_minw/(double)w;
+                  second_min_relative_size = second_minw/(double)w;
+               }
+          }
+        edje_object_part_drag_value_set(wd->resize_obj, "right_constraint",
+                                        1.0 - second_min_relative_size, 0.0);
+        edje_object_part_drag_value_set(wd->resize_obj, "left_constraint",
+                                        first_min_relative_size, 0.0);
+     }
+}
+
 static void
 _set_min_size(void *data)
 {
@@ -203,6 +298,7 @@ _set_min_size(void *data)
      }
 }
 
+//TODO: call this in legacy api implementation
 static void
 _update_fixed_sides(void *data)
 {
@@ -242,6 +338,7 @@ _update_fixed_sides(void *data)
         if (sd->orientation == EFL_ORIENT_VERTICAL && (w > 0))
            sd->left_min_relative_size = sd->left_min_size / (double)w;
      }
+
    _set_min_size(data);
 }
 
@@ -251,7 +348,9 @@ _on_resize(void *data,
            Evas_Object *obj EINA_UNUSED,
            void *event_info EINA_UNUSED)
 {
-  _update_fixed_sides(data);
+   //TODO: needs a flag to enable the old behaviour
+  //_update_fixed_sides(data);
+   _set_min_size_new(data);
 }
 
 EOLIAN static void
@@ -562,7 +661,8 @@ ELM_LAYOUT_CONTENT_ALIASES_IMPLEMENT(MY_CLASS_PFX);
 
 #define EFL_UI_PANES_EXTRA_OPS \
    EFL_CANVAS_GROUP_ADD_OPS(efl_ui_panes), \
-   ELM_LAYOUT_CONTENT_ALIASES_OPS(MY_CLASS_PFX)
+   ELM_LAYOUT_CONTENT_ALIASES_OPS(MY_CLASS_PFX), \
+   ELM_LAYOUT_SIZING_EVAL_OPS(efl_ui_panes)
 
 
 #include "efl_ui_panes.eo.c"
diff --git a/src/lib/elementary/efl_ui_panes_private.h 
b/src/lib/elementary/efl_ui_panes_private.h
index d82bdc48a4..f8822f4cd6 100644
--- a/src/lib/elementary/efl_ui_panes_private.h
+++ b/src/lib/elementary/efl_ui_panes_private.h
@@ -37,6 +37,8 @@ struct _Efl_Ui_Panes_Data
    Efl_Orient            orientation;
    double                left_min_relative_size;
    double                right_min_relative_size;
+   int                   first_minw, first_minh;
+   int                   second_minw, second_minh;
    Evas_Coord            left_min_size;
    Evas_Coord            right_min_size;
    Eina_Bool             double_clicked : 1;

-- 


Reply via email to