Enlightenment CVS committal

Author  : codewarrior
Project : e17
Module  : proto

Dir     : e17/proto/etk/src/lib


Modified Files:
        etk_drag.c etk_tree.c etk_widget.c etk_widget.h 


Log Message:
- add ability for trees to have drags started from them. now we can drop to and 
drag from an Etk_Tree.

===================================================================
RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_drag.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -3 -r1.2 -r1.3
--- etk_drag.c  16 Feb 2006 01:40:16 -0000      1.2
+++ etk_drag.c  20 Feb 2006 10:31:28 -0000      1.3
@@ -84,6 +84,7 @@
 {
    _etk_drag_widget = drag;
    
+   etk_widget_drag_begin(drag->widget);
    etk_widget_show_all(ETK_WIDGET(drag));   
    ecore_evas_ignore_events_set((ETK_WINDOW(drag))->ecore_evas, 1);
    ecore_x_dnd_types_set((ETK_WINDOW(drag))->x_window, drag->types, 
drag->num_types);
===================================================================
RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_tree.c,v
retrieving revision 1.35
retrieving revision 1.36
diff -u -3 -r1.35 -r1.36
--- etk_tree.c  20 Feb 2006 02:44:51 -0000      1.35
+++ etk_tree.c  20 Feb 2006 10:31:29 -0000      1.36
@@ -114,6 +114,7 @@
 static void _etk_tree_expander_clicked_cb(void *data, Evas *e, Evas_Object 
*obj, void *event_info);
 static void _etk_tree_row_pressed_cb(void *data, Evas *e, Evas_Object *obj, 
void *event_info);
 static void _etk_tree_row_clicked_cb(void *data, Evas *e, Evas_Object *obj, 
void *event_info);
+static void _etk_tree_row_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, 
void *event_info);
 static void _etk_tree_focus_cb(Etk_Object *object, void *event, void *data);
 static void _etk_tree_unfocus_cb(Etk_Object *object, void *event, void *data);
 static void _etk_tree_key_down_cb(Etk_Object *object, void *event, void *data);
@@ -123,7 +124,7 @@
 static void _etk_tree_header_mouse_in_cb(Etk_Object *object, void *event, void 
*data);
 static void _etk_tree_header_mouse_out_cb(Etk_Object *object, void *event, 
void *data);
 static void _etk_tree_drag_drop_cb(Etk_Object *object, void *event, void 
*data);
-
+static void _etk_tree_drag_end_cb(Etk_Object *object, void *data);
 
 static void _etk_tree_update(Etk_Tree *tree);
 static int _etk_tree_rows_draw(Etk_Tree *tree, Etk_Tree_Row *first_row, 
Evas_List **items_objects,
@@ -145,6 +146,7 @@
 static Etk_Tree_Row *_etk_tree_last_clicked_row = NULL;
 static Etk_Signal *_etk_tree_signals[ETK_TREE_NUM_SIGNALS];
 static Etk_Signal *_etk_tree_col_signals[ETK_TREE_COL_NUM_SIGNALS];
+static Etk_Bool    _etk_tree_drag_start = ETK_TRUE;
 
 /**************************
  *
@@ -179,7 +181,7 @@
       etk_type_property_add(tree_type, "row_height", 
ETK_TREE_ROW_HEIGHT_PROPERTY, ETK_PROPERTY_INT, ETK_PROPERTY_READABLE_WRITABLE, 
 etk_property_value_int(24));
       
       tree_type->property_set = _etk_tree_property_set;
-      tree_type->property_get = _etk_tree_property_get;
+      tree_type->property_get = _etk_tree_property_get;      
    }
 
    return tree_type;
@@ -1536,13 +1538,17 @@
    tree->dnd_event = ETK_FALSE;
    
    ETK_WIDGET(tree)->size_allocate = _etk_tree_size_allocate;
+   etk_widget_dnd_internal_set(ETK_WIDGET(tree), ETK_TRUE);   
+   (ETK_WIDGET(tree))->drag = etk_drag_new(ETK_WIDGET(tree));   
    
    etk_signal_connect("realize", ETK_OBJECT(tree), 
ETK_CALLBACK(_etk_tree_realize_cb), NULL);
    etk_signal_connect("unrealize", ETK_OBJECT(tree), 
ETK_CALLBACK(_etk_tree_unrealize_cb), NULL);
    etk_signal_connect("focus", ETK_OBJECT(tree), 
ETK_CALLBACK(_etk_tree_focus_cb), NULL);
    etk_signal_connect("unfocus", ETK_OBJECT(tree), 
ETK_CALLBACK(_etk_tree_unfocus_cb), NULL);
    etk_signal_connect("key_down", ETK_OBJECT(tree), 
ETK_CALLBACK(_etk_tree_key_down_cb), NULL);
-   etk_signal_connect("drag_drop", ETK_OBJECT(tree), 
ETK_CALLBACK(_etk_tree_drag_drop_cb), NULL);   
+   etk_signal_connect("drag_drop", ETK_OBJECT(tree), 
ETK_CALLBACK(_etk_tree_drag_drop_cb), NULL);
+   etk_signal_connect("drag_end", ETK_OBJECT((ETK_WIDGET(tree))->drag), 
ETK_CALLBACK(_etk_tree_drag_end_cb), NULL);
+   
 }
 
 /* Destroys the tree */
@@ -1949,6 +1955,26 @@
    }
 }
 
+/* Called when the mouse moves over a row */
+static void _etk_tree_row_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, 
void *event_info)
+{
+   Etk_Event_Mouse_Move *ev;
+   Etk_Tree_Row_Objects *row_objects;
+   
+   ev = event_info;
+   if (!(row_objects = data) || !row_objects->row)
+     return;   
+   
+   if(ev->buttons & 0x001 && _etk_tree_drag_start)
+   {
+      Etk_Drag *drag;
+      
+      _etk_tree_drag_start = ETK_FALSE;      
+      drag = (ETK_WIDGET(row_objects->row->tree))->drag;      
+      etk_drag_begin(drag);      
+   }
+}
+
 /* Called when the tree is focused */
 static void _etk_tree_focus_cb(Etk_Object *object, void *event, void *data)
 {
@@ -2515,6 +2541,7 @@
    evas_object_clip_set(new_row_objects->background, 
ETK_TREE_GRID(tree->grid)->clip);
    evas_object_event_callback_add(new_row_objects->background, 
EVAS_CALLBACK_MOUSE_DOWN, _etk_tree_row_pressed_cb, new_row_objects);
    evas_object_event_callback_add(new_row_objects->background, 
EVAS_CALLBACK_MOUSE_UP, _etk_tree_row_clicked_cb, new_row_objects);
+   evas_object_event_callback_add(new_row_objects->background, 
EVAS_CALLBACK_MOUSE_MOVE, _etk_tree_row_mouse_move_cb, new_row_objects);
    etk_widget_member_object_add(tree->grid, new_row_objects->background);
    
    /* Creates the expander of the row */
@@ -2813,3 +2840,7 @@
 #endif   
 }
   
+static void _etk_tree_drag_end_cb(Etk_Object *object, void *data)
+{
+   _etk_tree_drag_start = ETK_TRUE;
+}
===================================================================
RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_widget.c,v
retrieving revision 1.37
retrieving revision 1.38
diff -u -3 -r1.37 -r1.38
--- etk_widget.c        16 Feb 2006 01:40:16 -0000      1.37
+++ etk_widget.c        20 Feb 2006 10:31:30 -0000      1.38
@@ -59,7 +59,8 @@
    ETK_WIDGET_DRAG_DROP_SIGNAL,
    ETK_WIDGET_DRAG_ENTER_SIGNAL,     
    ETK_WIDGET_DRAG_MOTION_SIGNAL,
-   ETK_WIDGET_DRAG_LEAVE_SIGNAL,  
+   ETK_WIDGET_DRAG_LEAVE_SIGNAL,
+   ETK_WIDGET_DRAG_BEGIN_SIGNAL,     
    ETK_WIDGET_DRAG_END_SIGNAL,
    ETK_WIDGET_SELECTION_RECEIVED_SIGNAL,
    ETK_WIDGET_CLIPBOARD_RECEIVED_SIGNAL,
@@ -98,6 +99,7 @@
 static void _etk_widget_drag_motion_handler(Etk_Widget *widget);
 static void _etk_widget_drag_enter_handler(Etk_Widget *widget);
 static void _etk_widget_drag_leave_handler(Etk_Widget *widget);
+static void _etk_widget_drag_begin_handler(Etk_Widget *widget);
 static void _etk_widget_drag_end_handler(Etk_Widget *widget);
 
 static void _etk_widget_mouse_in_cb(void *data, Evas *evas, Evas_Object 
*object, void *event_info);
@@ -191,6 +193,7 @@
       _etk_widget_signals[ETK_WIDGET_DRAG_MOTION_SIGNAL] =   
etk_signal_new("drag_motion",   widget_type, ETK_MEMBER_OFFSET(Etk_Widget, 
drag_motion), etk_marshaller_VOID__VOID, NULL, NULL);
       _etk_widget_signals[ETK_WIDGET_DRAG_ENTER_SIGNAL] =    
etk_signal_new("drag_enter",    widget_type, ETK_MEMBER_OFFSET(Etk_Widget, 
drag_enter),  etk_marshaller_VOID__VOID, NULL, NULL);
       _etk_widget_signals[ETK_WIDGET_DRAG_LEAVE_SIGNAL] =    
etk_signal_new("drag_leave",    widget_type, ETK_MEMBER_OFFSET(Etk_Widget, 
drag_leave),  etk_marshaller_VOID__VOID, NULL, NULL);
+      _etk_widget_signals[ETK_WIDGET_DRAG_BEGIN_SIGNAL] =    
etk_signal_new("drag_begin",    widget_type,   ETK_MEMBER_OFFSET(Etk_Widget, 
drag_begin),    etk_marshaller_VOID__VOID, NULL, NULL);
       _etk_widget_signals[ETK_WIDGET_DRAG_END_SIGNAL] =      
etk_signal_new("drag_end",    widget_type,   ETK_MEMBER_OFFSET(Etk_Widget, 
drag_end),    etk_marshaller_VOID__VOID, NULL, NULL);
       _etk_widget_signals[ETK_WIDGET_SELECTION_RECEIVED_SIGNAL] = 
etk_signal_new("selection_received", widget_type, -1,                           
etk_marshaller_VOID__POINTER, NULL, NULL);
       _etk_widget_signals[ETK_WIDGET_CLIPBOARD_RECEIVED_SIGNAL] = 
etk_signal_new("clipboard_received", widget_type, -1,                           
etk_marshaller_VOID__POINTER, NULL, NULL);
@@ -1325,18 +1328,29 @@
    
    if (on)
    {      
+      
       widget->accepts_dnd = ETK_TRUE;
       widget->dnd_source = ETK_TRUE;      
       _etk_widget_dnd_source_widgets = 
evas_list_append(_etk_widget_dnd_source_widgets, widget);
-      widget->drag = etk_drag_new(widget);
-      etk_signal_connect("mouse_move", ETK_OBJECT(widget), 
ETK_CALLBACK(_etk_widget_dnd_drag_mouse_move_cb), NULL);
-      etk_signal_connect("drag_end", ETK_OBJECT(widget->drag), 
ETK_CALLBACK(_etk_widget_dnd_drag_end_cb), NULL);
+      
+      if(!widget->dnd_internal)
+      {
+        widget->drag = etk_drag_new(widget);
+        etk_signal_connect("mouse_move", ETK_OBJECT(widget), 
ETK_CALLBACK(_etk_widget_dnd_drag_mouse_move_cb), NULL);
+        etk_signal_connect("drag_end", ETK_OBJECT(widget->drag), 
ETK_CALLBACK(_etk_widget_dnd_drag_end_cb), NULL);
+      }
    }
    else
    {
       widget->accepts_dnd = ETK_FALSE;
-      widget->dnd_source = ETK_TRUE;      
+      widget->dnd_source = ETK_FALSE;
       _etk_widget_dnd_source_widgets = 
evas_list_remove(_etk_widget_dnd_source_widgets, widget);
+      
+      if(!widget->dnd_internal)
+      {
+        etk_signal_disconnect("mouse_move", ETK_OBJECT(widget), 
ETK_CALLBACK(_etk_widget_dnd_drag_mouse_move_cb));
+        etk_signal_disconnect("drag_end", ETK_OBJECT(widget->drag), 
ETK_CALLBACK(_etk_widget_dnd_drag_end_cb));
+      }
    }
 }
 
@@ -1353,6 +1367,30 @@
 }
 
 /**
+ * @brief Set whether the widget wants to handle its own dnd or not
+ * @param widget a widget
+ * @parab on ETK_TRUE if the widget handles its own dnd, ETK_FALSE otherwise
+ */
+void etk_widget_dnd_internal_set(Etk_Widget *widget, Etk_Bool on)
+{
+   if (!widget)
+      return ETK_FALSE;
+   widget->dnd_internal = on;
+}
+
+/**
+ * @brief Checks whether the widget wants to handle its own dnd or not
+ * @param widget a widget
+ * @return Returns ETK_TRUE if the widget handles its own dnd, ETK_FALSE 
otherwise
+ */
+Etk_Bool etk_widget_dnd_internal_get(Etk_Widget *widget)
+{
+   if (!widget)
+      return ETK_FALSE;
+   return (widget->dnd_internal);
+}
+
+/**
  * @brief Sets the visual data for the drag (the widget to be displayed)
  * @param widget a widget
  * @param drag_widget the widget that will appear in the drag window
@@ -1485,6 +1523,17 @@
 }
 
 /**
+ * @brief Sends the "drag_begin" signal
+ * @param widget a widget
+ */
+void etk_widget_drag_begin(Etk_Widget *widget)
+{
+   if (!widget)
+      return;
+   etk_signal_emit(_etk_widget_signals[ETK_WIDGET_DRAG_BEGIN_SIGNAL], 
ETK_OBJECT(widget), NULL);
+}
+
+/**
  * @brief Sends the "drag_end" signal
  * @param widget a widget
  */
@@ -1555,7 +1604,8 @@
    widget->drag_motion = _etk_widget_drag_motion_handler;
    widget->drag_enter = _etk_widget_drag_enter_handler;   
    widget->drag_leave = _etk_widget_drag_leave_handler;
-   widget->drag_end = _etk_widget_drag_end_handler;   
+   widget->drag_begin = _etk_widget_drag_begin_handler;   
+   widget->drag_end = _etk_widget_drag_end_handler;
 
    widget->left_inset = 0;
    widget->right_inset = 0;
@@ -1589,6 +1639,7 @@
    widget->need_theme_min_size_recalc = ETK_FALSE;
    widget->swallowed = ETK_FALSE;
    widget->accepts_dnd = ETK_FALSE;
+   widget->dnd_internal = ETK_FALSE;
    widget->dnd_source = ETK_FALSE;
    widget->dnd_dest = ETK_FALSE;
    widget->dnd_types = NULL;
@@ -1820,6 +1871,14 @@
    etk_widget_theme_object_signal_emit(widget, "drag_leave");
 }
 
+/* Default handler for the "drag_begin" signal */
+static void _etk_widget_drag_begin_handler(Etk_Widget *widget)
+{
+   if (!widget)
+      return;
+   etk_widget_theme_object_signal_emit(widget, "drag_begin");
+}
+
 /* Default handler for the "drag_end" signal */
 static void _etk_widget_drag_end_handler(Etk_Widget *widget)
 {
@@ -2701,24 +2760,24 @@
    ev = event;
 
    if(ev->buttons & 0x001 && _etk_dnd_drag_start)
-     {
-       const char **types;
-       unsigned int num_types;
-       char *data;
-       Etk_Drag *drag;
-       
-       drag = (ETK_WIDGET(object))->drag;
-       
-       _etk_dnd_drag_start = ETK_FALSE;
-       types = calloc(1, sizeof(char*));
-       num_types = 1;
-       types[0] = strdup("text/plain");
-       data = strdup("This is the drag data!");
-       
-//     etk_drag_types_set(drag, types, num_types);
-//     etk_drag_data_set(drag, data, strlen(data) + 1);
-       etk_drag_begin(drag);
-     }
+   {
+      const char **types;
+      unsigned int num_types;
+      char *data;
+      Etk_Drag *drag;
+      
+      drag = (ETK_WIDGET(object))->drag;
+      
+      _etk_dnd_drag_start = ETK_FALSE;
+      types = calloc(1, sizeof(char*));
+      num_types = 1;
+      types[0] = strdup("text/plain");
+      data = strdup("This is the drag data!");
+      
+      //etk_drag_types_set(drag, types, num_types);
+      //etk_drag_data_set(drag, data, strlen(data) + 1);
+      etk_drag_begin(drag);
+   }
 }
 
 static void _etk_widget_dnd_drag_end_cb(Etk_Object *object, void *data)
===================================================================
RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_widget.h,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -3 -r1.23 -r1.24
--- etk_widget.h        15 Feb 2006 15:03:17 -0000      1.23
+++ etk_widget.h        20 Feb 2006 10:31:30 -0000      1.24
@@ -177,7 +177,8 @@
    void (*drag_motion)(Etk_Widget *widget);
    void (*drag_enter)(Etk_Widget *widget);   
    void (*drag_leave)(Etk_Widget *widget);
-   void (*drag_end)(Etk_Widget *widget);   
+   void (*drag_begin)(Etk_Widget *widget);   
+   void (*drag_end)(Etk_Widget *widget);
 
    unsigned char realized : 1;
    unsigned char swallowed : 1;
@@ -193,7 +194,8 @@
    unsigned char need_theme_min_size_recalc : 1;
    unsigned char accepts_dnd : 1;
    unsigned char dnd_source : 1;
-   unsigned char dnd_dest : 1;   
+   unsigned char dnd_dest : 1;
+   unsigned char dnd_internal: 1;
 
    Etk_Drag *drag;
    char    **dnd_types;
@@ -278,11 +280,14 @@
 const char **etk_widget_dnd_files_get(Etk_Widget *e, int *num_files);
 void         etk_widget_dnd_types_set(Etk_Widget *widget, char **types, int 
num);
 const char **etk_widget_dnd_types_get(Etk_Widget *widget, int *num);
-    
+Etk_Bool     etk_widget_dnd_internal_get(Etk_Widget *widget);
+void         etk_widget_dnd_internal_set(Etk_Widget *widget, Etk_Bool on);
+  
 void etk_widget_drag_drop(Etk_Widget *widget, Etk_Event_Selection_Request 
*event);
 void etk_widget_drag_motion(Etk_Widget *widget);
 void etk_widget_drag_enter(Etk_Widget *widget);
 void etk_widget_drag_leave(Etk_Widget *widget);
+void etk_widget_drag_begin(Etk_Widget *widget);
 void etk_widget_drag_end(Etk_Widget *widget);
 
 void etk_widget_selection_received(Etk_Widget *widget, 
Etk_Event_Selection_Request *event);




-------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc. Do you grep through log files
for problems?  Stop!  Download the new AJAX search engine that makes
searching your log files as easy as surfing the  web.  DOWNLOAD SPLUNK!
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=103432&bid=230486&dat=121642
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to