raster pushed a commit to branch master.

http://git.enlightenment.org/core/elementary.git/commit/?id=56a2c96ea7a731d6066aa7cb0964a633c5bed35c

commit 56a2c96ea7a731d6066aa7cb0964a633c5bed35c
Author: nirajkr <niraj...@samsung.com>
Date:   Sun Feb 9 22:55:38 2014 +0900

    label : Added the API to match the speed of label to different label
    
    Summary:
    Currently we do not set the speed of two label same
             This patch fetch the information of the previous
             label to set it to the next label to match the speed
             of the previous label
    
    Reviewers: seoz, raster
    
    Reviewed By: raster
    
    CC: singh.amitesh
    
    Differential Revision: https://phab.enlightenment.org/D531
---
 src/bin/test_label.c       | 47 ++++++++++++++++++++++++++++++++
 src/lib/elm_label.c        | 68 +++++++++++++++++++++++++++++++++++++++++++---
 src/lib/elm_label_eo.h     | 32 ++++++++++++++++++++++
 src/lib/elm_label_legacy.h | 32 ++++++++++++++++++++++
 src/lib/elm_widget_label.h |  5 ++++
 5 files changed, 180 insertions(+), 4 deletions(-)

diff --git a/src/bin/test_label.c b/src/bin/test_label.c
index 7e6a73d..d5e7898 100644
--- a/src/bin/test_label.c
+++ b/src/bin/test_label.c
@@ -113,6 +113,8 @@ void
 test_label2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void 
*event_info EINA_UNUSED)
 {
    Evas_Object *win, *gd, *rect, *lb, *rd, *rdg, *sl;
+   double duration;
+   Evas_Coord textlen;
 
    win = elm_win_util_standard_add("label2", "Label 2");
    elm_win_autodel_set(win, EINA_TRUE);
@@ -212,6 +214,51 @@ test_label2(void *data EINA_UNUSED, Evas_Object *obj 
EINA_UNUSED, void *event_in
    elm_grid_pack(gd, sl, 5, 60, 90, 10);
    evas_object_show(sl);
 
+   /*Test label slide speed */
+   lb = elm_label_add(win);
+   elm_object_text_set(lb, "Test Label Slide Speed:");
+   elm_label_slide_mode_set(lb, ELM_LABEL_SLIDE_MODE_ALWAYS);
+   elm_label_slide_go(lb);
+   elm_grid_pack(gd, lb, 5, 70, 90, 10);
+   evas_object_show(lb);
+
+   rect = evas_object_rectangle_add(evas_object_evas_get(win));
+   elm_grid_pack(gd, rect, 5, 80, 90, 10);
+   evas_object_color_set(rect, 255, 125, 125, 255);
+   evas_object_show(rect);
+
+   lb = elm_label_add(win);
+   elm_object_style_set(lb, "slide_long");
+   elm_object_text_set(lb,
+                       "This is a label set to slide and this will"
+                       " test the speed of label with the below label."
+                       " This label has few extra char to test");
+   elm_label_slide_duration_set(lb, 8.0);
+   elm_label_slide_mode_set(lb,  ELM_LABEL_SLIDE_MODE_ALWAYS);
+   elm_label_slide_go(lb);
+   elm_grid_pack(gd, lb, 5, 80, 90, 10);
+   evas_object_show(lb);
+
+   //Get the required parameter of the previous label
+   duration = elm_label_slide_duration_get(lb);
+   textlen = elm_label_slide_text_length_get(lb);
+
+   rect = evas_object_rectangle_add(evas_object_evas_get(win));
+   elm_grid_pack(gd, rect, 5, 90, 90, 10);
+   evas_object_color_set(rect, 255, 125, 125, 255);
+   evas_object_show(rect);
+
+   lb = elm_label_add(win);
+   elm_object_style_set(lb, "slide_long");
+   elm_object_text_set(lb,
+                       "This is a label set to slide and this will"
+                       " match the speed of the upper label.");
+   elm_label_slide_mode_set(lb,  ELM_LABEL_SLIDE_MODE_ALWAYS);
+   elm_label_slide_speed_match(lb, duration, textlen);
+   elm_label_slide_go(lb);
+   elm_grid_pack(gd, lb, 5, 90, 90, 10);
+   evas_object_show(lb);
+
    evas_object_resize(win, 320, 320);
    evas_object_show(win);
 }
diff --git a/src/lib/elm_label.c b/src/lib/elm_label.c
index 976b186..a46badf 100644
--- a/src/lib/elm_label.c
+++ b/src/lib/elm_label.c
@@ -78,7 +78,9 @@ static void
 _label_slide_change(Evas_Object *obj)
 {
    Evas_Object *tb;
+   Evas_Coord   lw;
    char *plaintxt;
+   double speed;
    int plainlen = 0;
 
    ELM_LABEL_DATA_GET(obj, sd);
@@ -138,6 +140,17 @@ _label_slide_change(Evas_Object *obj)
         Edje_Message_Float_Set *msg =
           alloca(sizeof(Edje_Message_Float_Set) + (sizeof(double)));
 
+        evas_object_geometry_get(wd->resize_obj,
+                                  NULL, NULL, &lw, NULL);
+        if ((sd->slide_duration_recalc) &&
+            (lw > 0) &&
+            (sd->matchslide_duration > 0))
+          {
+             speed = (sd->matchslide_textlen + lw) / (sd->matchslide_duration);
+             sd->slide_duration = (sd->text_formatted_length + lw) / (speed);
+             sd->slide_duration_recalc = EINA_FALSE;
+          }
+
         msg->count = 1;
         msg->val[0] = sd->slide_duration;
 
@@ -214,9 +227,10 @@ _on_label_resize(void *data,
                  Evas_Object *obj EINA_UNUSED,
                  void *event_info EINA_UNUSED)
 {
-   ELM_LABEL_DATA_GET(data, sd);
+  ELM_LABEL_DATA_GET(data, sd);
 
-   if (sd->linewrap) elm_layout_sizing_eval(data);
+  if (sd->slide_duration_recalc) _label_slide_change(data);
+  if (sd->linewrap) elm_layout_sizing_eval(data);
 }
 
 static int
@@ -324,6 +338,8 @@ _stringshare_key_value_replace(const char **srcstring,
 static void
 _elm_label_smart_text_set(Eo *obj, void *_pd, va_list *list)
 {
+   Evas_Object *tb;
+
    Elm_Label_Smart_Data *sd = _pd;
    ELM_WIDGET_DATA_GET_OR_RETURN(obj, wd);
    const char *part = va_arg(*list, const char *);
@@ -341,6 +357,11 @@ _elm_label_smart_text_set(Eo *obj, void *_pd, va_list 
*list)
         sd->lastw = 0;
         eo_do(obj, elm_obj_layout_sizing_eval());
      }
+
+   tb = (Evas_Object *)edje_object_part_object_get(wd->resize_obj,
+                                                   "elm.text");
+   evas_object_textblock_size_formatted_get(tb, &sd->text_formatted_length, 
NULL);
+
    if (ret) *ret = int_ret;
 }
 
@@ -674,6 +695,41 @@ elm_label_slide_duration_get(const Evas_Object *obj)
 }
 
 EAPI void
+elm_label_slide_speed_match(Evas_Object *obj, double duration, Evas_Coord 
textlen)
+{
+   ELM_LABEL_CHECK(obj);
+   eo_do(obj, elm_obj_label_slide_speed_match(duration, textlen));
+}
+
+static void
+_slide_speed_match(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
+{
+   double duration = va_arg(*list, double);
+   Evas_Coord textlen = va_arg(*list, Evas_Coord);
+   Elm_Label_Smart_Data *sd = _pd;
+   sd->matchslide_duration = duration;
+   sd->matchslide_textlen = textlen;
+   sd->slide_duration_recalc = EINA_TRUE;
+}
+
+EAPI Evas_Coord
+elm_label_slide_text_length_get(const Evas_Object *obj)
+{
+   ELM_LABEL_CHECK(obj) 0;
+   Evas_Coord ret = 0;
+   eo_do((Eo *) obj, elm_obj_label_slide_text_length_get(&ret));
+   return ret;
+}
+
+static void
+_slide_textlen_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
+{
+   Evas_Coord *ret = va_arg(*list, Evas_Coord *);
+   Elm_Label_Smart_Data *sd = _pd;
+   *ret = sd->text_formatted_length;
+}
+
+EAPI void
 elm_label_slide_go(Evas_Object *obj)
 {
    ELM_LABEL_CHECK(obj);
@@ -743,6 +799,8 @@ _class_constructor(Eo_Class *klass)
         EO_OP_FUNC(ELM_OBJ_LABEL_ID(ELM_OBJ_LABEL_SUB_ID_SLIDE_DURATION_SET), 
_slide_duration_set),
         EO_OP_FUNC(ELM_OBJ_LABEL_ID(ELM_OBJ_LABEL_SUB_ID_SLIDE_DURATION_GET), 
_slide_duration_get),
         EO_OP_FUNC(ELM_OBJ_LABEL_ID(ELM_OBJ_LABEL_SUB_ID_SLIDE_GO), _slide_go),
+        EO_OP_FUNC(ELM_OBJ_LABEL_ID(ELM_OBJ_LABEL_SUB_ID_SLIDE_SPEED_MATCH), 
_slide_speed_match),
+        EO_OP_FUNC(ELM_OBJ_LABEL_ID(ELM_OBJ_LABEL_SUB_ID_TEXT_LENGTH_GET), 
_slide_textlen_get),
         EO_OP_FUNC_SENTINEL
    };
    eo_class_funcs_set(klass, func_desc);
@@ -758,9 +816,11 @@ static const Eo_Op_Description op_desc[] = {
      EO_OP_DESCRIPTION(ELM_OBJ_LABEL_SUB_ID_ELLIPSIS_GET, "Get the ellipsis 
behavior of the label."),
      EO_OP_DESCRIPTION(ELM_OBJ_LABEL_SUB_ID_SLIDE_MODE_SET, "Set slide effect 
mode of label widget."),
      EO_OP_DESCRIPTION(ELM_OBJ_LABEL_SUB_ID_SLIDE_MODE_GET, "Get current slide 
effect mode."),
-     EO_OP_DESCRIPTION(ELM_OBJ_LABEL_SUB_ID_SLIDE_DURATION_SET, "Set the slide 
duration (speed) of the label."),
-     EO_OP_DESCRIPTION(ELM_OBJ_LABEL_SUB_ID_SLIDE_DURATION_GET, "Get the slide 
duration(speed) of the label."),
+     EO_OP_DESCRIPTION(ELM_OBJ_LABEL_SUB_ID_SLIDE_DURATION_SET, "Set the slide 
duration  of the label."),
+     EO_OP_DESCRIPTION(ELM_OBJ_LABEL_SUB_ID_SLIDE_DURATION_GET, "Get the slide 
duration of the label."),
      EO_OP_DESCRIPTION(ELM_OBJ_LABEL_SUB_ID_SLIDE_GO, "Start slide effect."),
+     EO_OP_DESCRIPTION(ELM_OBJ_LABEL_SUB_ID_SLIDE_SPEED_MATCH, "Set the 
required parameter to match slide speed."),
+     EO_OP_DESCRIPTION(ELM_OBJ_LABEL_SUB_ID_TEXT_LENGTH_GET, "Get the text 
length of the label."),
      EO_OP_DESCRIPTION_SENTINEL
 };
 static const Eo_Class_Description class_desc = {
diff --git a/src/lib/elm_label_eo.h b/src/lib/elm_label_eo.h
index f79cb95..efd4013 100644
--- a/src/lib/elm_label_eo.h
+++ b/src/lib/elm_label_eo.h
@@ -22,6 +22,8 @@ enum
    ELM_OBJ_LABEL_SUB_ID_SLIDE_DURATION_SET,
    ELM_OBJ_LABEL_SUB_ID_SLIDE_DURATION_GET,
    ELM_OBJ_LABEL_SUB_ID_SLIDE_GO,
+   ELM_OBJ_LABEL_SUB_ID_SLIDE_SPEED_MATCH,
+   ELM_OBJ_LABEL_SUB_ID_TEXT_LENGTH_GET,
    ELM_OBJ_LABEL_SUB_ID_LAST
 };
 
@@ -179,6 +181,36 @@ enum
  * @ingroup Label
  */
 #define elm_obj_label_slide_go() 
ELM_OBJ_LABEL_ID(ELM_OBJ_LABEL_SUB_ID_SLIDE_GO)
+
+/**
+ * @def elm_obj_label_slide_speed_match
+ * @since 1.9
+ *
+ * @brief Set the required parameter to set the same speed of the label
+ *
+ * @param[in] duration
+ * @param[in] textlen
+ *
+ * @see elm_label_slide_duration_set
+ *
+ * @ingroup Label
+ */
+#define elm_obj_label_slide_speed_match(duration, textlen) 
ELM_OBJ_LABEL_ID(ELM_OBJ_LABEL_SUB_ID_SLIDE_SPEED_MATCH), EO_TYPECHECK(double, 
duration), EO_TYPECHECK(Evas_Coord, textlen)
+
+/**
+ * @def elm_obj_label_slide_text_length_get
+ * @since 1.9
+ *
+ * @brief Get the text label length
+ *
+ * @param[out] ret
+ *
+ * @see elm_object_text_set
+ *
+ * @ingroup Label
+ */
+#define elm_obj_label_slide_text_length_get(ret) 
ELM_OBJ_LABEL_ID(ELM_OBJ_LABEL_SUB_ID_TEXT_LENGTH_GET), EO_TYPECHECK(Evas_Coord 
* , ret)
+
 /**
  * @}
  */
diff --git a/src/lib/elm_label_legacy.h b/src/lib/elm_label_legacy.h
index b3222b8..04cfc7e 100644
--- a/src/lib/elm_label_legacy.h
+++ b/src/lib/elm_label_legacy.h
@@ -162,3 +162,35 @@ EAPI double                      
elm_label_slide_duration_get(const Evas_Object
  * @ingroup Label
  */
 EAPI void                        elm_label_slide_go(Evas_Object *obj);
+
+/**
+ * @brief Set the required parameter to set the same speed of the label
+ *
+ * @param obj The label object
+ * @param duration The duration of the previous slide label 
+ * @param duration The textlen of the previous slide label text
+ *
+ * @note If this API is called then it is not required to set the 
+ * duration of the label. Internally it will calcuate the duration
+ * which will match the speed of the previous label. If the duration
+ * is explicitly set it will override these parameters.
+ *
+ * @see elm_label_slide_duration_set()
+ * @since 1.9
+ *
+ * @ingroup Label
+ */
+EAPI void                        elm_label_slide_speed_match(Evas_Object *obj, 
double duration, Evas_Coord textlen);
+
+/**
+ * @brief Get the text length of the label
+ *
+ * @param obj The label object
+ * @return The text length of the label
+ *
+ * @see elm_object_text_set()
+ * @since 1.9
+ *
+ * @ingroup Label
+ */
+EAPI Evas_Coord                  elm_label_slide_text_length_get(const 
Evas_Object *obj);
diff --git a/src/lib/elm_widget_label.h b/src/lib/elm_widget_label.h
index 4e2ac72..4464e76 100644
--- a/src/lib/elm_widget_label.h
+++ b/src/lib/elm_widget_label.h
@@ -13,13 +13,18 @@ struct _Elm_Label_Smart_Data
 {
    const char           *format;
    double                slide_duration;
+   double                matchslide_duration;
+
    Evas_Coord            lastw;
    Evas_Coord            wrap_w;
+   Evas_Coord            text_formatted_length;
+   Evas_Coord            matchslide_textlen;
    Elm_Wrap_Type         linewrap;
    Elm_Label_Slide_Mode  slide_mode;
 
    Eina_Bool             ellipsis : 1;
    Eina_Bool             slide_ellipsis : 1;
+   Eina_Bool             slide_duration_recalc : 1;
 };
 
 #define ELM_LABEL_DATA_GET(o, sd) \

-- 


Reply via email to