Enable dragging of indicator bar (drop not complete yet).
authorChristopher Michael <cpmichael1@comcast.net>
Tue, 15 Dec 2009 07:53:35 +0000 (07:53 +0000)
committerChristopher Michael <cpmichael1@comcast.net>
Tue, 15 Dec 2009 07:53:35 +0000 (07:53 +0000)
SVN revision: 44473

src/modules/illume-indicator/e_mod_main.h
src/modules/illume-indicator/e_mod_win.c

index a0405fd..6dc9f32 100644 (file)
@@ -13,6 +13,12 @@ struct _Il_Ind_Win
    E_Menu *menu;
    E_Gadcon *gadcon;
    Evas_Object *o_base, *o_event;
+   struct 
+     {
+        unsigned char start : 1;
+        unsigned char dnd : 1;
+        int x, y;
+     } drag;
 };
 
 EAPI extern E_Module_Api e_modapi;
index b641f7d..326e150 100644 (file)
@@ -7,6 +7,8 @@
 static void _il_ind_win_cb_free(Il_Ind_Win *iwin);
 static void _il_ind_win_cb_resize(E_Win *ewin);
 static void _il_ind_win_cb_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *event);
+static void _il_ind_win_cb_mouse_up(void *data, Evas *evas, Evas_Object *obj, void *event);
+static void _il_ind_win_cb_mouse_move(void *data, Evas *evas, Evas_Object *obj, void *event);
 static int _il_ind_win_gadcon_client_add(void *data, const E_Gadcon_Client_Class *cc);
 static void _il_ind_win_gadcon_client_del(void *data, E_Gadcon_Client *gcc);
 static void _il_ind_win_gadcon_min_size_request(void *data, E_Gadcon *gc, Evas_Coord w, Evas_Coord h);
@@ -72,6 +74,10 @@ e_mod_ind_win_new(void)
    evas_object_resize(iwin->o_event, zone->w, 32);
    evas_object_event_callback_add(iwin->o_event, EVAS_CALLBACK_MOUSE_DOWN, 
                                   _il_ind_win_cb_mouse_down, iwin);
+   evas_object_event_callback_add(iwin->o_event, EVAS_CALLBACK_MOUSE_UP, 
+                                  _il_ind_win_cb_mouse_up, iwin);
+   evas_object_event_callback_add(iwin->o_event, EVAS_CALLBACK_MOUSE_MOVE, 
+                                  _il_ind_win_cb_mouse_move, iwin);
    evas_object_show(iwin->o_event);
    evas_object_layer_set(iwin->o_event, 200);
 
@@ -153,7 +159,14 @@ _il_ind_win_cb_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *event)
 
    if (!(iwin = data)) return;
    ev = event;
-   if (ev->button == 3) 
+   if (ev->button == 1) 
+     {
+        iwin->drag.x = ev->output.x;
+        iwin->drag.y = ev->output.y;
+        iwin->drag.start = 1;
+        iwin->drag.dnd = 0;
+     }
+   else if (ev->button == 3) 
      {
         E_Menu *mn;
         E_Zone *zone;
@@ -173,6 +186,71 @@ _il_ind_win_cb_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *event)
 }
 
 static void 
+_il_ind_win_cb_mouse_up(void *data, Evas *evas, Evas_Object *obj, void *event) 
+{
+   Il_Ind_Win *iwin;
+   Evas_Event_Mouse_Up *ev;
+
+   if (!(iwin = data)) return;
+   ev = event;
+   if ((ev->button == 1) && (!iwin->drag.dnd)) 
+     {
+        iwin->drag.start = 0;
+        iwin->drag.dnd = 0;
+     }
+}
+
+static void 
+_il_ind_win_cb_mouse_move(void *data, Evas *evas, Evas_Object *obj, void *event) 
+{
+   Il_Ind_Win *iwin;
+   Evas_Event_Mouse_Move *ev;
+   int dx, dy;
+
+   if (!(iwin = data)) return;
+   ev = event;
+   if (!iwin->drag.start) return;
+   dx = ev->cur.output.x - iwin->drag.x;
+   dy = ev->cur.output.y - iwin->drag.y;
+   if (((dx * dx) + (dy * dy)) >
+       (e_config->drag_resist * e_config->drag_resist)) 
+     {
+        E_Drag *d;
+        Evas *evas;
+        Evas_Object *o;
+        int x, y, w, h;
+        const char *drag_types[] = { "illume/indicator" };
+
+        iwin->drag.dnd = 1;
+        iwin->drag.start = 0;
+        x = iwin->win->x;
+        y = iwin->win->y;
+        w = iwin->win->w;
+        h = iwin->win->h;
+
+        d = e_drag_new(iwin->win->container, x, y, drag_types, 
+                       1, iwin->win, -1, NULL, NULL);
+
+        evas = e_drag_evas_get(d);
+        o = edje_object_add(evas);
+        if (!e_theme_edje_object_set(o, "base/theme/modules/illume-indicator", 
+                                     "modules/illume-indicator/shelf")) 
+          {
+             char buff[PATH_MAX];
+
+             snprintf(buff, sizeof(buff), "%s/e-module-illume-indicator.edj", 
+                      il_ind_cfg->mod_dir);
+             edje_object_file_set(o, buff, "modules/illume-indicator/shelf");
+          }
+        evas_object_show(o);
+
+        e_drag_object_set(d, o);
+        e_drag_resize(d, w, h);
+        e_drag_start(d, iwin->drag.x, iwin->drag.y);
+     }
+}
+
+static void 
 _il_ind_win_cb_menu_post(void *data, E_Menu *m) 
 {
    Il_Ind_Win *iwin;