Label: add 2 new api for setting the slide animation speed.
authordavemds <dave@gurumeditation.it>
Sun, 9 Feb 2014 23:13:03 +0000 (00:13 +0100)
committerdavemds <dave@gurumeditation.it>
Sun, 9 Feb 2014 23:13:03 +0000 (00:13 +0100)
Added API:
void elm_label_slide_speed_set(Evas_Object *obj, double speed);
double elm_label_slide_speed_get(const Evas_Object *obj);

This work is based on the previous reverted commit by nirajkr, thanks!
I hope this will fullfill his requirement, please let me know of
any problems.

src/bin/test_label.c
src/lib/elm_label.c
src/lib/elm_label_eo.h
src/lib/elm_label_legacy.h
src/lib/elm_widget_label.h

index 7e6a73d..abaf837 100644 (file)
@@ -100,19 +100,35 @@ _cb_size_radio_changed(void *data, Evas_Object *obj, void *event EINA_UNUSED)
 }
 
 static void
-_change_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+_duration_change_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
 {
    Evas_Object *lb = (Evas_Object *)data;
    double val = elm_slider_value_get(obj);
+
    elm_label_slide_duration_set(lb, val);
-   elm_label_slide_mode_set(lb, ELM_LABEL_SLIDE_MODE_ALWAYS);
    elm_label_slide_go(lb);
+
+   Evas_Object *sl = evas_object_data_get(lb, "speed_slider");
+   elm_slider_value_set(sl, elm_label_slide_speed_get(lb));
+}
+
+static void
+_speed_change_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+   Evas_Object *lb = (Evas_Object *)data;
+   double val = elm_slider_value_get(obj);
+
+   elm_label_slide_speed_set(lb, val);
+   elm_label_slide_go(lb);
+
+   Evas_Object *sl = evas_object_data_get(lb, "duration_slider");
+   elm_slider_value_set(sl, elm_label_slide_duration_get(lb));
 }
 
 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;
+   Evas_Object *win, *gd, *rect, *lb, *lb1, *lb2, *rd, *rdg, *sl;
 
    win = elm_win_util_standard_add("label2", "Label 2");
    elm_win_autodel_set(win, EINA_TRUE);
@@ -126,13 +142,11 @@ test_label2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_in
    /* Test Label Ellipsis */
    lb = elm_label_add(win);
    elm_object_text_set(lb, "Test Label Ellipsis:");
-   elm_label_slide_mode_set(lb, ELM_LABEL_SLIDE_MODE_ALWAYS);
-   elm_label_slide_go(lb);
-   elm_grid_pack(gd, lb, 5, 5, 90, 10);
+   elm_grid_pack(gd, lb, 5, 0, 90, 10);
    evas_object_show(lb);
 
    rect = evas_object_rectangle_add(evas_object_evas_get(win));
-   elm_grid_pack(gd, rect, 5, 15, 90, 10);
+   elm_grid_pack(gd, rect, 5, 10, 90, 10);
    evas_object_color_set(rect, 255, 125, 125, 255);
    evas_object_show(rect);
 
@@ -144,19 +158,17 @@ test_label2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_in
                        "at the end of the widget."
                        );
    elm_label_ellipsis_set(lb, EINA_TRUE);
-   elm_grid_pack(gd, lb, 5, 15, 90, 10);
+   elm_grid_pack(gd, lb, 5, 10, 90, 10);
    evas_object_show(lb);
 
    /* Test Label Slide */
    lb = elm_label_add(win);
    elm_object_text_set(lb, "Test Label Slide:");
-   elm_label_slide_mode_set(lb, ELM_LABEL_SLIDE_MODE_ALWAYS);
-   elm_label_slide_go(lb);
-   elm_grid_pack(gd, lb, 5, 30, 90, 10);
+   elm_grid_pack(gd, lb, 5, 20, 90, 10);
    evas_object_show(lb);
 
    rect = evas_object_rectangle_add(evas_object_evas_get(win));
-   elm_grid_pack(gd, rect, 5, 40, 90, 10);
+   elm_grid_pack(gd, rect, 5, 30, 90, 10);
    evas_object_color_set(rect, 255, 125, 125, 255);
    evas_object_show(rect);
 
@@ -169,9 +181,10 @@ test_label2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_in
                        "This only works with the themes \"slide_short\", "
                        "\"slide_long\" and \"slide_bounce\"."
                        );
-   elm_label_slide_mode_set(lb, ELM_LABEL_SLIDE_MODE_ALWAYS);
+   elm_label_slide_mode_set(lb, ELM_LABEL_SLIDE_MODE_AUTO);
+   elm_label_slide_speed_set(lb, 40.0);
    elm_label_slide_go(lb);
-   elm_grid_pack(gd, lb, 5, 40, 90, 10);
+   elm_grid_pack(gd, lb, 5, 30, 90, 10);
    evas_object_show(lb);
 
    rd = elm_radio_add(win);
@@ -179,7 +192,7 @@ test_label2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_in
    elm_object_text_set(rd, "slide_short");
    evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_FILL);
    evas_object_smart_callback_add(rd, "changed", _cb_size_radio_changed, lb);
-   elm_grid_pack(gd, rd, 5, 50, 30, 10);
+   elm_grid_pack(gd, rd, 5, 40, 30, 10);
    evas_object_show(rd);
    rdg = rd;
 
@@ -189,7 +202,7 @@ test_label2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_in
    elm_object_text_set(rd, "slide_long");
    evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_FILL);
    evas_object_smart_callback_add(rd, "changed", _cb_size_radio_changed, lb);
-   elm_grid_pack(gd, rd, 35, 50, 30, 10);
+   elm_grid_pack(gd, rd, 35, 40, 30, 10);
    evas_object_show(rd);
 
    rd = elm_radio_add(win);
@@ -198,20 +211,65 @@ test_label2(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_in
    elm_object_text_set(rd, "slide_bounce");
    evas_object_size_hint_weight_set(rd, EVAS_HINT_EXPAND, EVAS_HINT_FILL);
    evas_object_smart_callback_add(rd, "changed", _cb_size_radio_changed, lb);
-   elm_grid_pack(gd, rd, 65, 50, 30, 10);
+   elm_grid_pack(gd, rd, 65, 40, 30, 10);
    evas_object_show(rd);
 
    sl = elm_slider_add(win);
    elm_object_text_set(sl, "Slide Duration");
-   elm_slider_unit_format_set(sl, "%1.1f units");
-   elm_slider_min_max_set(sl, 1, 20);
-   elm_slider_value_set(sl, 10);
+   elm_slider_unit_format_set(sl, "%1.1f sec");
+   elm_slider_min_max_set(sl, 3, 30);
+   elm_slider_value_set(sl, elm_label_slide_duration_get(lb));
    evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
    evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
-   evas_object_smart_callback_add(sl, "changed", _change_cb, lb);
+   evas_object_smart_callback_add(sl, "changed", _duration_change_cb, lb);
+   evas_object_data_set(lb, "duration_slider", sl);
+   elm_grid_pack(gd, sl, 5, 50, 90, 10);
+   evas_object_show(sl);
+
+   sl = elm_slider_add(win);
+   elm_object_text_set(sl, "Slide Speed");
+   elm_slider_unit_format_set(sl, "%1.1f px/sec");
+   elm_slider_min_max_set(sl, 40, 300);
+   elm_slider_value_set(sl, elm_label_slide_speed_get(lb));
+   evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
+   evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_smart_callback_add(sl, "changed", _speed_change_cb, lb);
+   evas_object_data_set(lb, "speed_slider", sl);
    elm_grid_pack(gd, sl, 5, 60, 90, 10);
    evas_object_show(sl);
 
+   /* Test 2 label at the same speed */
+   lb = elm_label_add(win);
+   elm_object_text_set(lb, "Test 2 label with the same speed:");
+   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, 20);
+   evas_object_color_set(rect, 255, 125, 125, 255);
+   evas_object_show(rect);
+  
+   lb1 = elm_label_add(win);
+   elm_object_style_set(lb1, "slide_long");
+   elm_object_text_set(lb1, "This is a label set to slide with a fixed speed,"
+                            " should match the speed with the below label."
+                            " This label has few extra char for testing.");
+   elm_label_slide_mode_set(lb1, ELM_LABEL_SLIDE_MODE_ALWAYS);
+   elm_label_slide_speed_set(lb1, 40.0);
+   elm_label_slide_go(lb1);
+   elm_grid_pack(gd, lb1, 5, 80, 90, 10);
+   evas_object_show(lb1);
+
+   lb2 = elm_label_add(win);
+   elm_object_style_set(lb2, "slide_long");
+   elm_object_text_set(lb2, "This is a label set to slide and will"
+                            " match the speed of the upper label.");
+   elm_label_slide_mode_set(lb2, ELM_LABEL_SLIDE_MODE_ALWAYS);
+   elm_label_slide_speed_set(lb2, 40.0);
+   elm_label_slide_go(lb2);
+   elm_grid_pack(gd, lb2, 5, 90, 90, 10);
+   evas_object_show(lb2);
+
    evas_object_resize(win, 320, 320);
    evas_object_show(win);
 }
index 976b186..10d4c6a 100644 (file)
@@ -77,7 +77,7 @@ _label_format_set(Evas_Object *obj,
 static void
 _label_slide_change(Evas_Object *obj)
 {
-   Evas_Object *tb;
+   const Evas_Object *tb;
    char *plaintxt;
    int plainlen = 0;
 
@@ -106,6 +106,12 @@ _label_slide_change(Evas_Object *obj)
    //has slide effect.
    if (sd->slide_mode != ELM_LABEL_SLIDE_MODE_NONE)
      {
+        Evas_Coord w, tb_w;
+
+        tb = edje_object_part_object_get(wd->resize_obj, "elm.text");
+        evas_object_textblock_size_native_get(tb, &tb_w, NULL);
+        evas_object_geometry_get(wd->resize_obj, NULL, NULL, &w, NULL);
+
         if (sd->ellipsis)
           {
              sd->slide_ellipsis = EINA_TRUE;
@@ -115,26 +121,29 @@ _label_slide_change(Evas_Object *obj)
         //slide only if the slide area is smaller than text width size.
         if (sd->slide_mode == ELM_LABEL_SLIDE_MODE_AUTO)
           {
-             tb = (Evas_Object *) edje_object_part_object_get(wd->resize_obj,
-                                                              "elm.text");
-             if (tb)
-               {
-                  Evas_Coord w, tb_w;
-
-                  evas_object_textblock_size_formatted_get(tb, &tb_w, NULL);
-                  evas_object_geometry_get(wd->resize_obj,
-                                           NULL, NULL, &w, NULL);
-                  if ((tb_w > 0) && (tb_w < w))
-                    {
-                       if (sd->slide_ellipsis)
-                         {
-                            sd->slide_ellipsis = EINA_FALSE;
-                            elm_label_ellipsis_set(obj, EINA_TRUE);
-                         }
-                       return;
-                    }
-               }
+            if ((tb_w > 0) && (tb_w < w))
+              {
+                if (sd->slide_ellipsis)
+                  {
+                     sd->slide_ellipsis = EINA_FALSE;
+                     elm_label_ellipsis_set(obj, EINA_TRUE);
+                  }
+                return;
+              }
+          }
+
+        // calculate speed or duration
+        if (sd->use_slide_speed)
+          {
+             if (sd->slide_speed <= 0) sd->slide_speed = 1;
+             sd->slide_duration = (tb_w + w) / sd->slide_speed;
+          }
+        else
+          {
+             if (sd->slide_duration <= 0) sd->slide_duration = 1;
+             sd->slide_speed = (tb_w + w) / sd->slide_duration;
           }
+
         Edje_Message_Float_Set *msg =
           alloca(sizeof(Edje_Message_Float_Set) + (sizeof(double)));
 
@@ -216,6 +225,7 @@ _on_label_resize(void *data,
 {
    ELM_LABEL_DATA_GET(data, sd);
 
+   if (sd->slide_mode != ELM_LABEL_SLIDE_MODE_NONE) _label_slide_change(data);
    if (sd->linewrap) elm_layout_sizing_eval(data);
 }
 
@@ -662,6 +672,7 @@ _slide_duration_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
    double duration = va_arg(*list, double);
    Elm_Label_Smart_Data *sd = _pd;
    sd->slide_duration = duration;
+   sd->use_slide_speed = EINA_FALSE;
 }
 
 EAPI double
@@ -674,6 +685,39 @@ elm_label_slide_duration_get(const Evas_Object *obj)
 }
 
 EAPI void
+elm_label_slide_speed_set(Evas_Object *obj, double speed)
+{
+   ELM_LABEL_CHECK(obj);
+   eo_do(obj, elm_obj_label_slide_speed_set(speed));
+}
+
+static void
+_slide_speed_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
+{
+   double speed = va_arg(*list, double);
+   Elm_Label_Smart_Data *sd = _pd;
+   sd->slide_speed = speed;
+   sd->use_slide_speed = EINA_TRUE;
+}
+
+EAPI double
+elm_label_slide_speed_get(const Evas_Object *obj)
+{
+   ELM_LABEL_CHECK(obj) 0.0;
+   double ret = 0.0;
+   eo_do((Eo *) obj, elm_obj_label_slide_speed_get(&ret));
+   return ret;
+}
+
+static void
+_slide_speed_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
+{
+   double *ret = va_arg(*list, double *);
+   Elm_Label_Smart_Data *sd = _pd;
+   *ret = sd->slide_speed;
+}
+
+EAPI void
 elm_label_slide_go(Evas_Object *obj)
 {
    ELM_LABEL_CHECK(obj);
@@ -743,6 +787,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_SET), _slide_speed_set),
+        EO_OP_FUNC(ELM_OBJ_LABEL_ID(ELM_OBJ_LABEL_SUB_ID_SLIDE_SPEED_GET), _slide_speed_get),
         EO_OP_FUNC_SENTINEL
    };
    eo_class_funcs_set(klass, func_desc);
@@ -758,9 +804,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_SET, "Set the slide speed of the label."),
+     EO_OP_DESCRIPTION(ELM_OBJ_LABEL_SUB_ID_SLIDE_SPEED_GET, "Get the slide speed of the label."),
      EO_OP_DESCRIPTION_SENTINEL
 };
 static const Eo_Class_Description class_desc = {
index f79cb95..fa87c10 100644 (file)
@@ -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_SET,
+   ELM_OBJ_LABEL_SUB_ID_SLIDE_SPEED_GET,
    ELM_OBJ_LABEL_SUB_ID_LAST
 };
 
@@ -144,7 +146,7 @@ enum
  * @def elm_obj_label_slide_duration_set
  * @since 1.8
  *
- * @brief Set the slide duration (speed) of the label
+ * @brief Set the slide duration of the label
  *
  * @param[in] duration
  *
@@ -158,7 +160,7 @@ enum
  * @def elm_obj_label_slide_duration_get
  * @since 1.8
  *
- * @brief Get the slide duration(speed) of the label
+ * @brief Get the slide duration of the label
  *
  * @param[out] ret
  *
@@ -169,6 +171,34 @@ enum
 #define elm_obj_label_slide_duration_get(ret) ELM_OBJ_LABEL_ID(ELM_OBJ_LABEL_SUB_ID_SLIDE_DURATION_GET), EO_TYPECHECK(double *, ret)
 
 /**
+ * @def elm_obj_label_slide_speed_set
+ * @since 1.9
+ *
+ * @brief Set the slide speed of the label
+ *
+ * @param[in] speed
+ *
+ * @see elm_label_slide_speed_set
+ *
+ * @ingroup Label
+ */
+#define elm_obj_label_slide_speed_set(speed) ELM_OBJ_LABEL_ID(ELM_OBJ_LABEL_SUB_ID_SLIDE_SPEED_SET), EO_TYPECHECK(double, speed)
+
+/**
+ * @def elm_obj_label_slide_speed_get
+ * @since 1.9
+ *
+ * @brief Get the slide speed of the label
+ *
+ * @param[out] ret
+ *
+ * @see elm_label_slide_speed_get
+ *
+ * @ingroup Label
+ */
+#define elm_obj_label_slide_speed_get(ret) ELM_OBJ_LABEL_ID(ELM_OBJ_LABEL_SUB_ID_SLIDE_SPEED_GET), EO_TYPECHECK(double *, ret)
+
+/**
  * @def elm_obj_label_slide_go
  * @since 1.8
  *
index b3222b8..f4e7ba2 100644 (file)
@@ -128,8 +128,9 @@ EAPI void                        elm_label_slide_mode_set(Evas_Object *obj, Elm_
  * @ingroup Label
  */
 EAPI Elm_Label_Slide_Mode        elm_label_slide_mode_get(const Evas_Object *obj);
+
 /**
- * @brief Set the slide duration (speed) of the label
+ * @brief Set the slide duration of the label
  *
  * @param obj The label object
  * @param duration The duration in seconds in moving text from slide begin position
@@ -140,7 +141,7 @@ EAPI Elm_Label_Slide_Mode        elm_label_slide_mode_get(const Evas_Object *obj
 EAPI void                        elm_label_slide_duration_set(Evas_Object *obj, double duration);
 
 /**
- * @brief Get the slide duration(speed) of the label
+ * @brief Get the slide duration of the label
  *
  * @param obj The label object
  * @return The duration time in moving text from slide begin position to slide end position
@@ -152,6 +153,28 @@ EAPI void                        elm_label_slide_duration_set(Evas_Object *obj,
 EAPI double                      elm_label_slide_duration_get(const Evas_Object *obj);
 
 /**
+ * @brief Set the slide speed of the label
+ *
+ * @param obj The label object
+ * @param speed The speed of the slide animation in px per seconds
+ *
+ * @ingroup Label
+ */
+EAPI void                        elm_label_slide_speed_set(Evas_Object *obj, double speed);
+
+/**
+ * @brief Get the slide speed of the label
+ *
+ * @param obj The label object
+ * @return The slide animation speed in px per seconds 
+ *
+ * @see elm_label_slide_speed_set()
+ *
+ * @ingroup Label
+ */
+EAPI double                      elm_label_slide_speed_get(const Evas_Object *obj);
+
+/**
  * @brief Start slide effect.
  *
  * @param obj The label object
index 4e2ac72..399e774 100644 (file)
@@ -13,6 +13,7 @@ struct _Elm_Label_Smart_Data
 {
    const char           *format;
    double                slide_duration;
+   double                slide_speed;
    Evas_Coord            lastw;
    Evas_Coord            wrap_w;
    Elm_Wrap_Type         linewrap;
@@ -20,6 +21,7 @@ struct _Elm_Label_Smart_Data
 
    Eina_Bool             ellipsis : 1;
    Eina_Bool             slide_ellipsis : 1;
+   Eina_Bool             use_slide_speed : 1;
 };
 
 #define ELM_LABEL_DATA_GET(o, sd) \