okra pushed a commit to branch master.

http://git.enlightenment.org/apps/ephoto.git/commit/?id=1acaef0e10aa1d6b990d7c711e8a2f179e1c7a0c

commit 1acaef0e10aa1d6b990d7c711e8a2f179e1c7a0c
Author: Stephen Houston <smhousto...@gmail.com>
Date:   Tue Oct 27 16:55:45 2015 -0500

    Ephoto: Fix cropper slider math.
---
 src/bin/ephoto_cropper.c | 141 +++++++++++++++++++++++++----------------------
 1 file changed, 76 insertions(+), 65 deletions(-)

diff --git a/src/bin/ephoto_cropper.c b/src/bin/ephoto_cropper.c
index f66ada5..4b0b307 100644
--- a/src/bin/ephoto_cropper.c
+++ b/src/bin/ephoto_cropper.c
@@ -18,119 +18,130 @@ struct _Ephoto_Cropper
    int offsetx;
    int offsety;
    int resizing; 
-   int sliding;
 };
 
 static void
 _calculate_cropper_size(void *data, Evas_Object *obj EINA_UNUSED, const char 
*emission EINA_UNUSED, const char *source EINA_UNUSED)
 {
    Ephoto_Cropper *ec = data;
+   Edje_Message_Int_Set *msg;
+   char buf[PATH_MAX];
+   int w, h, cw, ch, iw, ih, nw, nh;
+   double scalew, scaleh;
 
-   if (!ec->sliding)
-     {
-        Edje_Message_Int_Set *msg;
-        char buf[PATH_MAX];
-        int w, h, cw, ch, iw, ih, nw, nh;
-        double scalew, scaleh;
-
-        evas_object_geometry_get(ec->layout, 0, 0, &w, &h);
-        edje_object_part_geometry_get(elm_layout_edje_get(ec->layout),
+   evas_object_geometry_get(ec->layout, 0, 0, &w, &h);
+   edje_object_part_geometry_get(elm_layout_edje_get(ec->layout),
                                       "ephoto.swallow.cropper", 0, 0, &cw, 
&ch);
-        evas_object_image_size_get(elm_image_object_get(ec->image), &iw, &ih);
+   evas_object_image_size_get(elm_image_object_get(ec->image), &iw, &ih);
 
-        scalew = (double)cw/(double)w;
-        scaleh = (double)ch/(double)h;
+   scalew = (double)cw/(double)w;
+   scaleh = (double)ch/(double)h;
 
-        nw = iw*scalew;
-        nh = ih*scaleh;
+   nw = iw*scalew;
+   nh = ih*scaleh;
 
-        elm_slider_value_set(ec->cropw, nw);
-        elm_slider_value_set(ec->croph, nh); 
+   elm_slider_value_set(ec->cropw, nw);
+   elm_slider_value_set(ec->croph, nh); 
 
-        msg = alloca(sizeof(Edje_Message_Int_Set) + (3*sizeof(int)));
-        msg->count = 3;
-        msg->val[0] = 11;
-        msg->val[1] = nw;
-        msg->val[2] = nh;
-        edje_object_message_send(elm_layout_edje_get(ec->layout), 
EDJE_MESSAGE_INT_SET, 1, msg);
-     }
+   msg = alloca(sizeof(Edje_Message_Int_Set) + (3*sizeof(int)));
+   msg->count = 3;
+   msg->val[0] = 11;
+   msg->val[1] = nw;
+   msg->val[2] = nh;
+   edje_object_message_send(elm_layout_edje_get(ec->layout), 
EDJE_MESSAGE_INT_SET, 1, msg);
 }
 
 static void
 _cropper_changed_width(void *data, Evas_Object *obj EINA_UNUSED, void 
*event_info EINA_UNUSED)
 {
    Ephoto_Cropper *ec = data;
-   Edje_Message_Int_Set *msg;
-   int mw, cx, cw, ch, nw, nh, lx, lw, iw;
+   Edje_Message_Int_Set *msgl, *msgr;
+   int mw, cx, cw, nw, lx, lw, iw, left, right;
    double scalew;
 
-   ec->sliding = 1;
-
    mw = elm_slider_value_get(ec->cropw);
 
-   evas_object_geometry_get(ec->cropper, &cx, 0, &cw, &ch);
    evas_object_geometry_get(ec->layout, &lx, 0, &lw, 0);
+   evas_object_geometry_get(ec->cropper, &cx, 0, &cw, 0);
    evas_object_image_size_get(elm_image_object_get(ec->image), &iw, 0);
 
-   scalew = (double)lw/(double)iw;
-   nw = mw * scalew;
-   nh = ch;
+   scalew = (double)mw/(double)iw;
 
-   msg = alloca(sizeof(Edje_Message_Int_Set) + (3*sizeof(int)));
-   msg->count = 3;
-   if ((nw+cx) >= (lx+lw))
+   nw = lw*scalew;
+   left = (nw-cw)/2;
+   right = (nw-cw)/2;
+
+   if ((cx+cw+right) >= (lx+lw))
      {
-        msg->val[0] = 8;
-        nw = cw-nw;
+        right = (lx+lw)-(cx+cw);
+        left += left - right;
      }
-   else
+   else if ((cx-left) <= lx)
      {
-        msg->val[0] = 4;
-        nw -= cw;
+        left = cx-lx;
+        right += right - left;
      }
-   msg->val[1] = nw;
-   msg->val[2] = 0;
-   edje_object_message_send(elm_layout_edje_get(ec->layout), 
EDJE_MESSAGE_INT_SET, 1, msg);
-
-   ec->sliding = 0;
+   left *= -1;
+
+   msgl = alloca(sizeof(Edje_Message_Int_Set) + (3*sizeof(int)));
+   msgl->count = 3;
+   msgl->val[0] = 8;
+   msgl->val[1] = left;
+   msgl->val[2] = 0;
+   edje_object_message_send(elm_layout_edje_get(ec->layout), 
EDJE_MESSAGE_INT_SET, 1, msgl);
+
+   msgr = alloca(sizeof(Edje_Message_Int_Set) + (3*sizeof(int)));
+   msgr->count = 3;
+   msgr->val[0] = 4;
+   msgr->val[1] = right;
+   msgr->val[2] = 0;
+   edje_object_message_send(elm_layout_edje_get(ec->layout), 
EDJE_MESSAGE_INT_SET, 1, msgr);
 }
 
 static void
 _cropper_changed_height(void *data, Evas_Object *obj EINA_UNUSED, void 
*event_info EINA_UNUSED)
 {
    Ephoto_Cropper *ec = data;
-   Edje_Message_Int_Set *msg;
-   int mh, ch, cy, nh, lh, ly, ih;
+   Edje_Message_Int_Set *msgt, *msgb;
+   int mh, ch, cy, nh, lh, ly, ih, left, top, bottom;
    double scaleh;
 
-   ec->sliding = 1;
-
    mh = elm_slider_value_get(ec->croph);
 
-   evas_object_geometry_get(ec->cropper, 0, &cy, 0, &ch);
    evas_object_geometry_get(ec->layout, 0, &ly, 0, &lh);
+   evas_object_geometry_get(ec->cropper, 0, &cy, 0, &ch);
    evas_object_image_size_get(elm_image_object_get(ec->image), 0, &ih);
 
-   scaleh = (double)lh/(double)ih;
-   nh = mh * scaleh;
+   scaleh = (double)mh/(double)ih;
+   nh = lh*scaleh;
+   top = (nh-ch)/2;
+   bottom = (nh-ch)/2;
 
-   msg = alloca(sizeof(Edje_Message_Int_Set) + (3*sizeof(int)));
-   msg->count = 3;
-   if ((nh+cy) >= (ly+lh))
+   if ((cy+ch+bottom) >= (ly+lh))
      {
-        msg->val[0] = 2;
-        nh = ch-nh;
+        bottom = (ly+lh)-(cy+ch);
+        top += top - bottom;
      }
-   else
+   else if ((cy-top) <= ly)
      {
-        msg->val[0] = 6;
-        nh -= ch;
+        top = cy-ly;
+        bottom += bottom - top;
      }
-   msg->val[1] = 0;
-   msg->val[2] = nh;
-   edje_object_message_send(elm_layout_edje_get(ec->layout), 
EDJE_MESSAGE_INT_SET, 1, msg);
-
-   ec->sliding = 0;
+   top *= -1;
+
+   msgt = alloca(sizeof(Edje_Message_Int_Set) + (3*sizeof(int)));
+   msgt->count = 3;
+   msgt->val[0] = 2;
+   msgt->val[1] = 0;
+   msgt->val[2] = top;
+   edje_object_message_send(elm_layout_edje_get(ec->layout), 
EDJE_MESSAGE_INT_SET, 1, msgt);
+
+   msgb = alloca(sizeof(Edje_Message_Int_Set) + (3*sizeof(int)));
+   msgb->count = 3;
+   msgb->val[0] = 6;
+   msgb->val[1] = 0;
+   msgb->val[2] = bottom;
+   edje_object_message_send(elm_layout_edje_get(ec->layout), 
EDJE_MESSAGE_INT_SET, 1, msgb);
 }
 
 static void

-- 


Reply via email to