Enlightenment CVS committal

Author  : dj2
Project : e17
Module  : libs/ewl

Dir     : e17/libs/ewl/src/lib


Modified Files:
        ewl_paned.c ewl_tree2.c 


Log Message:
- fix selection in tree2

===================================================================
RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_paned.c,v
retrieving revision 1.40
retrieving revision 1.41
diff -u -3 -r1.40 -r1.41
--- ewl_paned.c 9 Jan 2007 06:11:40 -0000       1.40
+++ ewl_paned.c 14 Jan 2007 23:11:03 -0000      1.41
@@ -708,15 +708,28 @@
 }
 
 static void
-ewl_paned_grabber_cb_mouse_down(Ewl_Widget *w, void *ev __UNUSED__,
+ewl_paned_grabber_cb_mouse_down(Ewl_Widget *w, void *ev,
                                                void *data __UNUSED__)
 {
+       Ewl_Paned *p;
+       Ewl_Event_Mouse_Down *event;
+       int ds;
+
        DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR("w", w);
        DCHECK_TYPE("w", w, EWL_WIDGET_TYPE);
 
+       event = ev;
+       p = EWL_PANED(w->parent);
+
+       if (ewl_paned_orientation_get(p) == EWL_ORIENTATION_HORIZONTAL)
+               ds = CURRENT_X(w) - event->x;
+       else
+               ds = CURRENT_Y(w) - event->y;
+       
        ewl_callback_append(w, EWL_CALLBACK_MOUSE_MOVE,
-                               ewl_paned_grabber_cb_mouse_move, NULL);
+                               ewl_paned_grabber_cb_mouse_move, 
+                               (void *) ds);
        ewl_widget_state_set(w, "selected", EWL_STATE_PERSISTENT);
 
        DLEAVE_FUNCTION(DLEVEL_STABLE);
@@ -738,19 +751,20 @@
 }
 
 static void
-ewl_paned_grabber_cb_mouse_move(Ewl_Widget *w, void *ev,
-                                               void *data __UNUSED__)
+ewl_paned_grabber_cb_mouse_move(Ewl_Widget *w, void *ev, void *data)
 {
        Ewl_Event_Mouse_Move *e;
        Ewl_Paned_Grabber *stop_grabber = NULL;
-       Ewl_Widget *shrink = NULL, *grow = NULL, *child;
+       Ewl_Widget *child;
        Ewl_Container *c;
        Ewl_Paned *p;
-       int cur_pos, amt, block_pos, grab_size, pos, cur_size = 0;
-       int new_size, left, min, shrink_size, move_pos;
-       int pane_pos, pane_size, pane_position;
-       void *(*give_to)(Ecore_DList *list);
-       void *(*take_from)(Ecore_DList *list);
+       Ewl_Widget *left_pane = NULL, *right_pane = NULL;
+
+       int paned_pos, paned_size;
+       int left_grabber_pos, right_grabber_pos;
+       int grabber_pos, grabber_size;
+       int mouse_pos, mouse_vec, mouse_offset;
+       int grabber_pos_new;
        
        DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR("w", w);
@@ -760,49 +774,41 @@
        e = ev;
        p = EWL_PANED(w->parent);
        c = EWL_CONTAINER(p);
+       mouse_offset = (int) data;
 
        if (ewl_paned_orientation_get(p) == EWL_ORIENTATION_HORIZONTAL)
        {
                layout = horizontal_layout;
-               move_pos = e->x;
-               pane_position = CURRENT_X(p);
-               pane_size = CURRENT_W(p);
+               mouse_pos = e->x;
+               paned_pos = CURRENT_X(p);
+               paned_size = CURRENT_W(p);
        }
        else
        {
                layout = vertical_layout;
-               move_pos = e->y;
-               pane_position = CURRENT_Y(p);
-               pane_size = CURRENT_H(p);
+               mouse_pos = e->y;
+               paned_pos = CURRENT_Y(p);
+               paned_size = CURRENT_H(p);
        }
 
-       cur_pos = layout->current_position(EWL_OBJECT(w));
-
-       /* shifting left */
-       if ((cur_pos - move_pos) > 0)
-       {
-               give_to = ecore_dlist_next;
-               take_from = ecore_dlist_previous;
-               amt = cur_pos - move_pos;
-               left = 1;
-       }
-       else if ((cur_pos - move_pos) < 0)
-       {
-               give_to = ecore_dlist_previous;
-               take_from = ecore_dlist_next;
-               amt = move_pos - cur_pos;
-               left = 0;
-       }
-       else
+       grabber_pos = layout->current_position(EWL_OBJECT(w));
+       grabber_size = layout->current_size(EWL_OBJECT(w));
+
+       /* 
+        * this is the vector pointing from the left edge of the grabber
+        * to the mouse position, so is it neagtive the grabber will
+        * be moved to the left side and is it positiv to the right
+        */
+       mouse_vec = mouse_pos - grabber_pos + mouse_offset;
+       if (mouse_vec == 0)
                DRETURN(DLEVEL_STABLE);
 
-       /* find the pane we are shifting into and the grabber
-        * blockign us */
+       /* find the left grabber that is blocking us */
        ecore_dlist_goto(c->children, w);
 
        /* move past the selected grabber */
-       take_from(c->children);
-       while ((child = take_from(c->children)))
+       ecore_dlist_previous(c->children);
+       while ((child = ecore_dlist_previous(c->children)))
        {
                if (!VISIBLE(child)) continue;
 
@@ -812,94 +818,104 @@
                        break;
                }
                else
-                       shrink = child;
+                       left_pane = child;
        }
 
-       /* find the pane we are giving space too */
+       /* if we didn't find a left grabber set the paned position instead */
+       if (stop_grabber)
+               left_grabber_pos = 
+                       layout->current_position(EWL_OBJECT(stop_grabber))
+                       + grabber_size;
+       else
+               left_grabber_pos = paned_pos;
+
+       /* and now find the right pane */
        ecore_dlist_goto(c->children, w);
+       stop_grabber = NULL;
 
        /* move past the selected grabber */
-       give_to(c->children);
-       while ((child = give_to(c->children)))
+       ecore_dlist_next(c->children);
+       while ((child = ecore_list_next(c->children)))
        {
                if (!VISIBLE(child)) continue;
 
-               if (ewl_widget_type_is(child, EWL_PANED_GRABBER_TYPE))
-                       printf("ERROR found grabber instead of child?\n");
-               else
-               {
-                       grow = child;
+               if (ewl_widget_type_is(child, EWL_PANED_GRABBER_TYPE)) {
+                       stop_grabber = EWL_PANED_GRABBER(child);
                        break;
                }
-       }
-
-       /* make sure the grabber dosen't move past the grabber before it or
-        * the edges of the paned */
-       grab_size = layout->current_size(EWL_OBJECT(w));
-       if (stop_grabber)
-               block_pos = layout->current_position(EWL_OBJECT(stop_grabber));
-       else if (left)
-               block_pos = pane_position;
-       else
-               block_pos = pane_position + pane_size;
-
-       min = layout->minimum_size(EWL_OBJECT(shrink));
-       cur_size = layout->current_size(EWL_OBJECT(shrink));
-       if (left)
-       {
-               if ((cur_pos - amt) < (block_pos + grab_size + min))
-                       pos = block_pos + grab_size + min;
                else
-                       pos = cur_pos - amt;
-
-               amt = cur_pos - pos;
-
-               /* don't have to shrink free space */
-               if ((cur_pos - amt) < (block_pos + grab_size + cur_size))
-                       shrink_size = amt - (cur_pos - cur_size - block_pos - 
grab_size);
-               else
-                       shrink_size = 0;
-
-               /* move the right pane */
-               pane_pos = layout->current_position(EWL_OBJECT(grow));
-               layout->position_request(EWL_OBJECT(grow), pane_pos - amt);
+                       right_pane = child;
        }
+       
+       /* if we didn't find a left grabber set the paned position instead */
+       if (stop_grabber)
+               right_grabber_pos = 
+                       layout->current_position(EWL_OBJECT(stop_grabber));
        else
-       {
-               if ((cur_pos + amt + grab_size + min) > block_pos)
-                       pos = block_pos - min - grab_size;
-               else
-                       pos = cur_pos + amt;
-
-               amt = pos - cur_pos;
+               right_grabber_pos = paned_pos + paned_size;
 
-               /* don't have to shrink free space */
-               if ((cur_pos + amt + grab_size + cur_size) > block_pos)
-                       shrink_size = amt - (block_pos - cur_pos - cur_size);
-               else
-                       shrink_size = 0;
-
-               /* move the right pane */
-               pane_pos = layout->current_position(EWL_OBJECT(shrink));
-               layout->position_request(EWL_OBJECT(shrink), pane_pos + amt);
+       /*
+        * now we have collected enought data to place the grabber
+        * and the panes on their new places
+        */
+       /* we don't want to shrink the panes more that it is allowed */
+       if (mouse_vec < 0) {
+               /* the left side get shrinked */
+               int pane_min = layout->minimum_size(EWL_OBJECT(left_pane));
+               if (grabber_pos + mouse_vec - left_grabber_pos < pane_min)
+                       grabber_pos_new = left_grabber_pos + pane_min;
+               else
+                       /* note that mouse_vec is here negative! */
+                       grabber_pos_new = grabber_pos + mouse_vec;
+       }
+       else {
+               /* the right side get shrinked */
+               int pane_min = layout->minimum_size(EWL_OBJECT(right_pane));
+               if (right_grabber_pos - (grabber_pos + mouse_vec + grabber_size)
+                               < pane_min)
+                       grabber_pos_new = 
+                               right_grabber_pos - pane_min - grabber_size;
+               else
+                       grabber_pos_new = grabber_pos + mouse_vec;
+       }
+
+       /*
+        * finally we can place the stuff 
+        */
+       if (ewl_paned_orientation_get(p) == EWL_ORIENTATION_HORIZONTAL) {
+               ewl_object_place(EWL_OBJECT(left_pane), left_grabber_pos,
+                                       CURRENT_Y(p),
+                                       grabber_pos_new - left_grabber_pos,
+                                       CURRENT_H(p));
+               ewl_object_place(EWL_OBJECT(w), grabber_pos_new,
+                                       CURRENT_Y(p),
+                                       grabber_size,
+                                       CURRENT_H(p));
+               ewl_object_place(EWL_OBJECT(right_pane), 
+                                       grabber_pos_new + grabber_size,
+                                       CURRENT_Y(p),
+                                       right_grabber_pos - grabber_pos_new
+                                       - grabber_size,
+                                       CURRENT_H(p));
+       }
+       else {
+               ewl_object_place(EWL_OBJECT(left_pane), 
+                                       CURRENT_X(p),
+                                       left_grabber_pos,
+                                       CURRENT_W(p),
+                                       grabber_pos_new - left_grabber_pos);
+               ewl_object_place(EWL_OBJECT(w), 
+                                       CURRENT_X(p),
+                                       grabber_pos_new,
+                                       CURRENT_W(p),
+                                       grabber_size);
+               ewl_object_place(EWL_OBJECT(right_pane), 
+                                       CURRENT_X(p),
+                                       grabber_pos_new + grabber_size,
+                                       CURRENT_W(p),
+                                       right_grabber_pos - grabber_pos_new
+                                       - grabber_size);
        }
-
-       cur_size = layout->current_size(EWL_OBJECT(shrink));
-       layout->variable_request(EWL_OBJECT(shrink), cur_size - shrink_size);
-       new_size = layout->current_size(EWL_OBJECT(shrink));
-
-       /* XXX didn't shirnk the entire amount do something ... */
-       if ((cur_size - new_size) != shrink_size)
-       {
-               printf("ERROR, didn't shrink the entire amount ...?.\n");
-       }
-
-       cur_size = layout->current_size(EWL_OBJECT(grow));
-       layout->variable_request(EWL_OBJECT(grow), cur_size + amt);
-       new_size = layout->current_size(EWL_OBJECT(grow));
-
-       /* place the grabber */
-       layout->position_request(EWL_OBJECT(w), pos);
 
        /* send a value_changed callback to signal something moved */
        ewl_callback_call(EWL_WIDGET(p), EWL_CALLBACK_VALUE_CHANGED);
===================================================================
RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_tree2.c,v
retrieving revision 1.48
retrieving revision 1.49
diff -u -3 -r1.48 -r1.49
--- ewl_tree2.c 12 Jan 2007 10:31:22 -0000      1.48
+++ ewl_tree2.c 14 Jan 2007 23:11:03 -0000      1.49
@@ -691,7 +691,8 @@
 }
 
 static void
-ewl_tree2_column_build(Ewl_Row *row, Ewl_Tree2_Column *col, void *mvc_data, 
int r, int c)
+ewl_tree2_column_build(Ewl_Row *row, Ewl_Tree2_Column *col, void *mvc_data, 
+                                               int r, int c, Ewl_Widget *node)
 {
        Ewl_Widget *cell;
        Ewl_Widget *child;
@@ -707,7 +708,7 @@
        ewl_container_child_append(EWL_CONTAINER(row), cell);
        ewl_attach_widget_association_set(cell, row);
        ewl_callback_append(cell, EWL_CALLBACK_CLICKED,
-                               ewl_tree2_cb_cell_clicked, NULL);
+                               ewl_tree2_cb_cell_clicked, node);
        ewl_widget_show(cell);
 
        val = col->model->fetch(mvc_data, r, c);
@@ -795,7 +796,7 @@
                ewl_container_child_append(EWL_CONTAINER(node), row);
                ewl_attach_widget_association_set(row, tree);
                ewl_callback_append(row, EWL_CALLBACK_CLICKED,  
-                                       ewl_tree2_cb_row_clicked, NULL);
+                                       ewl_tree2_cb_row_clicked, node);
                EWL_TREE2_NODE(node)->row = row;
                ewl_widget_show(row);
 
@@ -810,7 +811,8 @@
                ecore_list_goto_first(tree->columns);
                while((col = ecore_list_next(tree->columns)))
                {
-                       ewl_tree2_column_build(EWL_ROW(row), col, 
curbranch->data, i, column);
+                       ewl_tree2_column_build(EWL_ROW(row), col, 
+                                       curbranch->data, i, column, node);
                        column ++;
                }
 
@@ -890,8 +892,7 @@
 }
 
 static void
-ewl_tree2_cb_row_clicked(Ewl_Widget *w, void *ev __UNUSED__, 
-                                       void *data __UNUSED__)
+ewl_tree2_cb_row_clicked(Ewl_Widget *w, void *ev __UNUSED__, void *data)
 {
        Ewl_Tree2 *tree;
        int row;
@@ -904,15 +905,15 @@
        if (tree->type != EWL_TREE_SELECTION_TYPE_ROW)
                DRETURN(DLEVEL_STABLE);
 
-       row = ewl_container_child_index_get(EWL_CONTAINER(tree->rows), w);
+       row = ewl_container_child_index_get(EWL_CONTAINER(tree->rows), 
+                                                       EWL_WIDGET(data));
        ewl_mvc_handle_click(EWL_MVC(tree), row, -1);
 
        DLEAVE_FUNCTION(DLEVEL_STABLE);
 }
 
 static void
-ewl_tree2_cb_cell_clicked(Ewl_Widget *w, void *ev __UNUSED__, 
-                                       void *data __UNUSED__)
+ewl_tree2_cb_cell_clicked(Ewl_Widget *w, void *ev __UNUSED__, void *data)
 {
        Ewl_Row *row;
        Ewl_Tree2 *tree;
@@ -928,7 +929,7 @@
                DRETURN(DLEVEL_STABLE);
 
        r = ewl_container_child_index_get(EWL_CONTAINER(tree->rows), 
-                                               EWL_WIDGET(row));
+                                               EWL_WIDGET(data));
        column = ewl_container_child_index_get(EWL_CONTAINER(row), w);
 
        ewl_mvc_handle_click(EWL_MVC(tree), r, column);



-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to