elementary: updated slider widget with vector ux. 11/43111/1
authorSubhransu Mohanty <sub.mohanty@samsung.com>
Fri, 29 May 2015 06:06:41 +0000 (15:06 +0900)
committerSubhransu Mohanty <sub.mohanty@samsung.com>
Wed, 8 Jul 2015 01:19:07 +0000 (10:19 +0900)
Change-Id: Ib2b246aba384c7457c08f66732e619a90bb76887

src/lib/elm_priv.h
src/lib/elm_slider.c
src/lib/tizen_vector.c

index 85d9a820c0a4252ea1444e32a1cae2a9e7d1a3a9..71095114967c3d9b35b4cc2c4f5b4a4f79c9d54e 100644 (file)
@@ -575,6 +575,7 @@ void tizen_vg_button_set(Elm_Button *obj);
 void tizen_vg_check_set(Elm_Check *obj);
 void tizen_vg_radio_set(Elm_Radio *obj);
 void tizen_vg_progressbar_set(Elm_Button *obj);
+void tizen_vg_slider_set(Elm_Slider *obj);
 #endif
 
 
index 533503a1e31b376d9772d3c4a8f8c508f1866992..9c6f296d966018e7c6c80cb475e0725c8cfe042c 100644 (file)
@@ -556,6 +556,10 @@ _elm_slider_elm_widget_theme_apply(Eo *obj, Elm_Slider_Data *sd)
    eo_do_super(obj, MY_CLASS, int_ret = elm_obj_widget_theme_apply());
    if (!int_ret) return EINA_FALSE;
 
+#ifdef TIZEN_VECTOR_UX
+   tizen_vg_slider_set(obj);
+#endif
+
    if (sd->popup)
      edje_object_scale_set(sd->popup, elm_widget_scale_get(obj) *
                            elm_config_scale_get());
@@ -871,6 +875,10 @@ _elm_slider_evas_object_smart_add(Eo *obj, Elm_Slider_Data *priv)
    evas_object_pass_events_set(priv->spacer, EINA_TRUE);
    elm_layout_content_set(obj, "elm.swallow.bar", priv->spacer);
 
+#ifdef TIZEN_VECTOR_UX
+   tizen_vg_slider_set(obj);
+#endif
+
    _popup_add(priv, obj);
 
    evas_object_event_callback_add
index 497e8b5ec03986c551bb51274b62f06229a2e2d9..821c3a6f5a891106d4d28df497ba226ac587f8b5 100644 (file)
@@ -1596,4 +1596,218 @@ tizen_vg_progressbar_set(Elm_Progressbar *obj)
      }
 }
 
+/////////////////////////////////////////////////////////////////////////
+/* Slider */
+/////////////////////////////////////////////////////////////////////////
+
+typedef struct vg_slider_s
+{
+   Evas_Object *vg[7];
+   Efl_VG_Shape *shape[7];
+   Evas_Object *obj;
+   Eina_Stringshare *style;
+} vg_slider;
+
+static int slider_base = 0;
+static int slider_level = 1;
+static int slider_level2 = 2;
+static int slider_level_rest = 3;
+static int slider_center = 4;
+static int slider_handle = 5;
+static int slider_handle_pressed = 6;
+
+static void
+slider_del_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj,
+              void *event_info EINA_UNUSED)
+{
+   vg_slider *vd = evas_object_data_get(obj, vg_key);
+   if (vd)
+     {
+        evas_object_data_set(obj, vg_key, NULL);
+        free(vd);
+     }
+}
+
+static void
+_append_circle(Efl_VG *shape, int w, int h)
+{
+   Evas_Coord center_x = (w / 2);
+   Evas_Coord center_y = (h / 2);
+   double radius = ELM_SCALE_SIZE((center_x > center_y ? center_x : center_y) - 2);
+   evas_vg_shape_shape_reset(shape);
+   evas_vg_shape_shape_append_circle(shape, center_x, center_y, radius);
+}
+
+static void
+_append_round_rect(Efl_VG *shape, int w, int h)
+{
+   double radius = w/2 > h/2 ? h/2 : w/2;
+   evas_vg_shape_shape_reset(shape);
+   evas_vg_shape_shape_append_rect(shape, 0, 0, w, h, radius, radius);
+}
+
+static void
+slider_vg_handle_normal_resize_cb(void *data , Evas *e EINA_UNUSED,
+                                  Evas_Object *obj EINA_UNUSED,
+                                  void *event_info EINA_UNUSED)
+{
+   Evas_Coord w, h;
+   vg_slider *vd = data;
+   evas_object_geometry_get(vd->vg[slider_handle], NULL, NULL, &w, &h);
+   _append_circle(vd->shape[slider_handle], w, h);
+}
+
+static void
+slider_vg_handle_pressed_resize_cb(void *data , Evas *e EINA_UNUSED,
+                            Evas_Object *obj EINA_UNUSED,
+                            void *event_info EINA_UNUSED)
+{
+   Evas_Coord w, h;
+   vg_slider *vd = data;
+   evas_object_geometry_get(vd->vg[slider_handle_pressed], NULL, NULL, &w, &h);
+   if (w == h)
+     _append_circle(vd->shape[slider_handle_pressed], w, h);
+   else
+     _append_round_rect(vd->shape[slider_handle_pressed], w, h);
+}
+
+static void
+slider_base_resize_cb(void *data , Evas *e EINA_UNUSED,
+                            Evas_Object *obj EINA_UNUSED,
+                            void *event_info EINA_UNUSED)
+{
+   Evas_Coord w, h;
+   vg_slider *vd = data;
+   evas_object_geometry_get(vd->vg[slider_base], NULL, NULL, &w, &h);
+   _append_round_rect(vd->shape[slider_base], w, h);
+}
+
+static void
+slider_center_resize_cb(void *data , Evas *e EINA_UNUSED,
+                            Evas_Object *obj EINA_UNUSED,
+                            void *event_info EINA_UNUSED)
+{
+   Evas_Coord w, h;
+   vg_slider *vd = data;
+   evas_object_geometry_get(vd->vg[slider_center], NULL, NULL, &w, &h);
+   _append_round_rect(vd->shape[slider_center], w, h);
+}
+
+static void
+slider_level_resize_cb(void *data , Evas *e EINA_UNUSED,
+                            Evas_Object *obj EINA_UNUSED,
+                            void *event_info EINA_UNUSED)
+{
+   Evas_Coord w, h;
+   vg_slider *vd = data;
+   evas_object_geometry_get(vd->vg[slider_level], NULL, NULL, &w, &h);
+   _append_round_rect(vd->shape[slider_level], w, h);
+}
+
+static void
+slider_level2_resize_cb(void *data , Evas *e EINA_UNUSED,
+                            Evas_Object *obj EINA_UNUSED,
+                            void *event_info EINA_UNUSED)
+{
+   Evas_Coord w, h;
+   vg_slider *vd = data;
+   evas_object_geometry_get(vd->vg[slider_level2], NULL, NULL, &w, &h);
+   _append_round_rect(vd->shape[slider_level2], w, h);
+}
+
+static void
+slider_level_rest_resize_cb(void *data , Evas *e EINA_UNUSED,
+                            Evas_Object *obj EINA_UNUSED,
+                            void *event_info EINA_UNUSED)
+{
+   Evas_Coord w, h;
+   vg_slider *vd = data;
+   evas_object_geometry_get(vd->vg[slider_level_rest], NULL, NULL, &w, &h);
+   _append_round_rect(vd->shape[slider_level_rest], w, h);
+}
+
+static void
+_slider_create_handle(vg_slider *vd)
+{
+   Efl_VG *root;
+   int i;
+   Evas *e = evas_object_evas_get(vd->obj);
+   for(i=0; i < 7; i++)
+     {
+        vd->vg[i] = evas_object_vg_add(e);
+        root = evas_object_vg_root_node_get(vd->vg[i]);
+        vd->shape[i] = evas_vg_shape_add(root);
+        evas_vg_node_color_set(vd->shape[i], 255, 255, 255, 255);
+
+     }
+   // slider base
+   evas_object_event_callback_add(vd->vg[slider_base], EVAS_CALLBACK_RESIZE,
+                                  slider_base_resize_cb, vd);
+   elm_object_part_content_set(vd->obj, "elm.swallow.tizen_vg_shape1", vd->vg[slider_base]);
+
+   // level
+   evas_object_event_callback_add(vd->vg[slider_level], EVAS_CALLBACK_RESIZE,
+                                  slider_level_resize_cb, vd);
+   elm_object_part_content_set(vd->obj, "elm.swallow.tizen_vg_shape2", vd->vg[slider_level]);
+
+   // level2
+   evas_object_event_callback_add(vd->vg[slider_level2], EVAS_CALLBACK_RESIZE,
+                                  slider_level2_resize_cb, vd);
+   elm_object_part_content_set(vd->obj, "elm.swallow.tizen_vg_shape3", vd->vg[slider_level2]);
+
+   // level rest only for warning type
+   evas_object_event_callback_add(vd->vg[slider_level_rest], EVAS_CALLBACK_RESIZE,
+                                  slider_level_rest_resize_cb, vd);
+   elm_object_part_content_set(vd->obj, "elm.swallow.tizen_vg_shape4", vd->vg[slider_level_rest]);
+
+   // center point
+   evas_object_event_callback_add(vd->vg[slider_center], EVAS_CALLBACK_RESIZE,
+                                  slider_center_resize_cb, vd);
+   elm_object_part_content_set(vd->obj, "elm.swallow.tizen_vg_shape5", vd->vg[slider_center]);
+
+   // slider handle
+   evas_object_event_callback_add(vd->vg[slider_handle], EVAS_CALLBACK_RESIZE,
+                                  slider_vg_handle_normal_resize_cb, vd);
+   evas_object_event_callback_add(vd->vg[slider_handle_pressed], EVAS_CALLBACK_RESIZE,
+                                  slider_vg_handle_pressed_resize_cb, vd);
+   elm_object_part_content_set(vd->obj, "elm.dragable.slider:elm.swallow.tizen_vg_shape1", vd->vg[slider_handle]);
+   elm_object_part_content_set(vd->obj, "elm.dragable.slider:elm.swallow.tizen_vg_shape2", vd->vg[slider_handle_pressed]);
+}
+
+void
+tizen_vg_slider_set(Elm_Slider *obj)
+{
+   EINA_LOG_CRIT("slider VG creation");
+   vg_slider *vd = evas_object_data_get(obj, vg_key);
+   if (vd)
+     {
+        int i;
+        for(i=0; i < 7; i++)
+          if (vd->vg[i]) evas_object_del(vd->vg[i]);
+        eina_stringshare_del(vd->style);
+     }
+
+   //Apply vector ux only theme has "vector_ux" "on"
+   const char *str = elm_layout_data_get(obj, "vector_ux");
+   if (!str) return;
+
+   if (!vd)
+     {
+        vd = calloc(1, sizeof(vg_slider));
+        evas_object_data_set(obj, vg_key, vd);
+        vd->obj = obj;
+        // callback to free vd data
+        evas_object_event_callback_add(vd->obj, EVAS_CALLBACK_DEL,
+                                       slider_del_cb, NULL);
+     }
+   if (!vd)
+     {
+        ERR("Failed to allocate vector graphics data memory");
+        return;
+     }
+
+   vd->style = eina_stringshare_add(str);
+
+   _slider_create_handle(vd);
+}
 #endif