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