Added o_delete() as replacement for individual object deletion
function. Adapted o_delete_selected() accordingly.
---
 gschem/include/prototype.h |    5 +-
 gschem/src/i_callbacks.c   |    1 +
 gschem/src/o_delete.c      |  312 +++++++-------------------------------------
 gschem/src/o_move.c        |    4 +-
 gschem/src/x_autonumber.c  |    2 +-
 gschem/src/x_multiattrib.c |    2 +-
 6 files changed, 51 insertions(+), 275 deletions(-)

diff --git a/gschem/include/prototype.h b/gschem/include/prototype.h
index 1bdc549..c8c4185 100644
--- a/gschem/include/prototype.h
+++ b/gschem/include/prototype.h
@@ -566,10 +566,7 @@ void o_cue_draw_list(GSCHEM_TOPLEVEL *w_current, GList 
*object_list);
 void o_cue_undraw_list(GSCHEM_TOPLEVEL *w_current, GList *object_list);
 void o_cue_undraw_objects(GSCHEM_TOPLEVEL *w_current, OBJECT *list);
 /* o_delete.c */
-void o_delete_net(GSCHEM_TOPLEVEL *w_current, OBJECT *obj);
-void o_delete_bus(GSCHEM_TOPLEVEL *w_current, OBJECT *obj);
-void o_delete_complex(GSCHEM_TOPLEVEL *w_current, OBJECT *obj);
-void o_delete_text(GSCHEM_TOPLEVEL *w_current, OBJECT *obj);
+void o_delete(GSCHEM_TOPLEVEL *w_current, OBJECT *object);
 void o_delete_selected(GSCHEM_TOPLEVEL *w_current);
 /* o_find.c */
 gboolean o_find_object(GSCHEM_TOPLEVEL *w_current, int x, int y,
diff --git a/gschem/src/i_callbacks.c b/gschem/src/i_callbacks.c
index a11fef1..d2c2553 100644
--- a/gschem/src/i_callbacks.c
+++ b/gschem/src/i_callbacks.c
@@ -721,6 +721,7 @@ DEFINE_I_CALLBACK(edit_delete)
     w_current->inside_action = 0;
     i_set_state(w_current, SELECT);
     i_update_toolbar(w_current);
+    i_update_menus(w_current);
   }
 }
 
diff --git a/gschem/src/o_delete.c b/gschem/src/o_delete.c
index 3103ef3..e9249c1 100644
--- a/gschem/src/o_delete.c
+++ b/gschem/src/o_delete.c
@@ -31,293 +31,71 @@
 #include <dmalloc.h>
 #endif
 
-/*! \todo Finish function documentation!!!
- *  \brief
+/*! \brief Delete an object.
  *  \par Function Description
+ *  This function erases the object \a object before deleting it. It
+ *  deals with connection and object connected to it.
  *
+ *  \param [in] w_current The GSCHEM_TOPLEVEL object.
+ *  \param [in] object    The object to delete.
  */
-void o_delete_net(GSCHEM_TOPLEVEL *w_current, OBJECT *obj)
+void o_delete (GSCHEM_TOPLEVEL *w_current, OBJECT *object)
 {
   TOPLEVEL *toplevel = w_current->toplevel;
   GList *other_objects = NULL;
+  gboolean do_conn;
 
-  o_cue_undraw(w_current, obj);
+  g_return_if_fail (object != NULL);
 
-  o_erase_single(w_current, obj);
-  o_line_erase_grips(w_current, obj);
-
-  other_objects = s_conn_return_others(other_objects, obj);
-       
-  s_delete(toplevel, obj);
-
-  toplevel->page_current->object_tail =
-    (OBJECT *) return_tail(toplevel->page_current->object_head);
-
-  o_cue_undraw_list(w_current, other_objects);
-  o_cue_draw_list(w_current, other_objects);
-  g_list_free(other_objects);
-}
-
-/*! \todo Finish function documentation!!!
- *  \brief
- *  \par Function Description
- *
- */
-void o_delete_bus(GSCHEM_TOPLEVEL *w_current, OBJECT *obj)
-{
-  TOPLEVEL *toplevel = w_current->toplevel;
-  GList *other_objects = NULL;
-        
-  o_cue_undraw(w_current, obj);
-  o_erase_single(w_current, obj);
-  o_line_erase_grips(w_current, obj);
-
-  other_objects = s_conn_return_others(other_objects, obj);
-
-  s_delete(toplevel, obj);
-
-  toplevel->page_current->object_tail =
-    (OBJECT *) return_tail(toplevel->page_current->object_head);
-
-  o_cue_undraw_list(w_current, other_objects);
-  o_cue_draw_list(w_current, other_objects);
-  g_list_free(other_objects);
-
-}
-
-/*! \todo Finish function documentation!!!
- *  \brief
- *  \par Function Description
- *
- */
-static void o_delete_pin(GSCHEM_TOPLEVEL *w_current, OBJECT *obj)
-{
-  TOPLEVEL *toplevel = w_current->toplevel;
-  GList *other_objects = NULL;
-        
-  o_cue_undraw(w_current, obj);
-  o_erase_single(w_current, obj);
-  o_line_erase_grips(w_current, obj);
-        
-  other_objects = s_conn_return_others(other_objects, obj);
-        
-  s_delete(toplevel, obj);
-  toplevel->page_current->object_tail =
-    (OBJECT *) return_tail(toplevel->page_current->object_head);
-
-  o_cue_undraw_list(w_current, other_objects);
-  o_cue_draw_list(w_current, other_objects);
-  g_list_free(other_objects);
-
-}
-
-/*! \todo Finish function documentation!!!
- *  \brief
- *  \par Function Description
- *
- */
-void o_delete_complex(GSCHEM_TOPLEVEL *w_current, OBJECT *obj)
-{
-  TOPLEVEL *toplevel = w_current->toplevel;
-  GList *other_objects = NULL;
-
-  o_cue_undraw(w_current, obj);
-  o_erase_single(w_current, obj);
-
-  other_objects = s_conn_return_complex_others(other_objects, obj);
-
-  s_delete(toplevel, obj);
-
-  /*! \todo special case hack no return_tail. why? */
-  o_cue_undraw_list(w_current, other_objects);
-  o_cue_draw_list(w_current, other_objects);
-  g_list_free(other_objects);
-}
-
-/*! \todo Finish function documentation!!!
- *  \brief
- *  \par Function Description
- *
- */
-static void o_delete_line(GSCHEM_TOPLEVEL *w_current, OBJECT *obj)
-{
-  TOPLEVEL *toplevel = w_current->toplevel;
-  o_erase_single(w_current, obj);
-  o_line_erase_grips(w_current, obj);
+  do_conn =
+    object->type == OBJ_NET || object->type == OBJ_BUS ||
+    object->type == OBJ_PIN || object->type == OBJ_COMPLEX;
   
-  s_delete(toplevel, obj);
-  toplevel->page_current->object_tail =
-    (OBJECT *) return_tail(toplevel->page_current->object_head);
-}
-
-/*! \todo Finish function documentation!!!
- *  \brief
- *  \par Function Description
- *
- */
-static void o_delete_box(GSCHEM_TOPLEVEL *w_current, OBJECT *obj)
-{
-  TOPLEVEL *toplevel = w_current->toplevel;
-  o_erase_single(w_current, obj);
-  o_box_erase_grips(w_current, obj);
-
-  s_delete(toplevel, obj);
-  toplevel->page_current->object_tail =
-  (OBJECT *) return_tail(toplevel->page_current->object_head);
-}
-
-
-/*! \todo Finish function documentation!!!
- *  \brief
- *  \par Function Description
- *
- */
-static void o_delete_picture(GSCHEM_TOPLEVEL *w_current, OBJECT *obj)
-{
-  TOPLEVEL *toplevel = w_current->toplevel;
-  o_erase_single(w_current, obj);
-  o_picture_erase_grips(w_current, obj);
-
-  s_delete(toplevel, obj);
-  toplevel->page_current->object_tail =
-  (OBJECT *) return_tail(toplevel->page_current->object_head);
-}
-
-/*! \todo Finish function documentation!!!
- *  \brief
- *  \par Function Description
- *
- */
-static void o_delete_circle(GSCHEM_TOPLEVEL *w_current, OBJECT *obj)
-{
-  TOPLEVEL *toplevel = w_current->toplevel;
-       o_erase_single(w_current, obj);
-       o_circle_erase_grips(w_current, obj);
-
-       s_delete(toplevel, obj);
-
-       toplevel->page_current->object_tail =
-               (OBJECT *) return_tail(toplevel->page_current->object_head);
-}
-
-/*! \todo Finish function documentation!!!
- *  \brief
- *  \par Function Description
- *
- */
-void o_delete_text(GSCHEM_TOPLEVEL *w_current, OBJECT *obj)
-{
-  TOPLEVEL *toplevel = w_current->toplevel;
-  OBJECT *o_parent = obj->attached_to;
-
-  o_erase_single(w_current, obj);
-
-  s_delete(toplevel, obj);
-  toplevel->page_current->object_tail =
-    (OBJECT *) return_tail(toplevel->page_current->object_head);
-
-  if (o_parent != NULL && o_parent->type == OBJ_COMPLEX)
-    o_attrib_slot_update(toplevel, o_parent);
-}
+  if (do_conn) {
+    o_cue_undraw (w_current, object);
+    other_objects = s_conn_return_others (other_objects, object);
+  }
+  o_erase_single (w_current, object);
+  o_erase_grips (w_current, object);
 
-/*! \todo Finish function documentation!!!
- *  \brief
- *  \par Function Description
- *
- */
-static void o_delete_arc(GSCHEM_TOPLEVEL *w_current, OBJECT *obj)
-{
-  TOPLEVEL *toplevel = w_current->toplevel;
-  o_erase_single(w_current, obj);
+  s_delete (toplevel, object);
 
-  s_delete(toplevel, obj);
-  toplevel->page_current->object_tail =
-  (OBJECT *) return_tail(toplevel->page_current->object_head);
+  if (do_conn) {
+    o_cue_undraw_list (w_current, other_objects);
+    o_cue_draw_list (w_current, other_objects);
+    g_list_free (other_objects);
+  }
+  
+  toplevel->page_current->CHANGED = 1;
+   toplevel->page_current->object_tail =
+     (OBJECT *) return_tail(toplevel->page_current->object_head);
 }
 
-/*! \todo Finish function documentation!!!
- *  \brief
+/*! \brief Delete objects from the selection.
  *  \par Function Description
+ *  This function deletes the objects selected on the current page of
+ *  toplevel \a w_current.
  *
+ *  \param [in] w_current The GSCHEM_TOPLEVEL object.
  */
-void o_delete_selected(GSCHEM_TOPLEVEL *w_current)
+void o_delete_selected (GSCHEM_TOPLEVEL *w_current)
 {
-  TOPLEVEL *toplevel = w_current->toplevel;
-  GList *s_current = NULL;
-  OBJECT *object = NULL;
-
-  object = o_select_return_first_object(w_current);
-  if (object == NULL) {
-    /*! \todo error condition */
-    w_current->inside_action = 0;
-    i_set_state(w_current, SELECT);
-    return;
-  }
-
-
-  /* skip over head node */
-  s_current = geda_list_get_glist( toplevel->page_current->selection_list );
-
-  while(s_current != NULL) {
+  SELECTION *selection = w_current->toplevel->page_current->selection_list;
+  GList *s_current;
 
-    object = (OBJECT *) s_current->data;
-    g_assert (object != NULL);
+  g_return_if_fail (o_select_selected (w_current));
 
-    switch(object->type) {
-      case(OBJ_LINE):
-        o_delete_line(w_current, object);
-        break;
 
-      case(OBJ_NET):
-        o_delete_net(w_current, object);
-        break;
-
-      case(OBJ_BUS):
-        o_delete_bus(w_current, object);
-        break;
-
-      case(OBJ_BOX):
-        o_delete_box(w_current, object);
-        break;
-
-      case(OBJ_PICTURE):
-        o_delete_picture(w_current, object);
-        break;
-
-      case(OBJ_CIRCLE):
-        o_delete_circle(w_current, object);
-        break;
-
-      case(OBJ_COMPLEX):
-      case(OBJ_PLACEHOLDER):
-        o_delete_complex(w_current, object);
-        break;
-
-      case(OBJ_PIN):
-        o_delete_pin(w_current, object);
-        break;
-
-      case(OBJ_TEXT):
-        o_delete_text(w_current, object);
-        break;
-
-      case(OBJ_ARC):
-        o_delete_arc(w_current, object);
-        break;
-    }
-    s_current = g_list_next(s_current);
+  for (s_current = geda_list_get_glist (selection);
+       s_current != NULL;
+       s_current = g_list_next (s_current)) {
+    o_delete (w_current, (OBJECT*)s_current->data);
   }
-
+  /* Objects in the selection list have been deleted. */
+  /* Empty the list without touching the objects */
+  geda_list_remove_all (selection);
+ 
   w_current->inside_action = 0;
-
-  /* Objects in the selection list have been deleted. Empty the list without 
touching the objects */
-  geda_list_remove_all( toplevel->page_current->selection_list );
-
-  toplevel->page_current->CHANGED=1;
-
-  /* no longer needed */
-  /* o_redraw(w_current, toplevel->page_current->object_head);*/
-
-  o_undo_savestate(w_current, UNDO_ALL);
-  i_update_menus(w_current);
+  o_undo_savestate (w_current, UNDO_ALL);
+  i_update_menus (w_current);
 }
diff --git a/gschem/src/o_move.c b/gschem/src/o_move.c
index 1054f06..93da77d 100644
--- a/gschem/src/o_move.c
+++ b/gschem/src/o_move.c
@@ -500,7 +500,7 @@ void o_move_end_rubberband(GSCHEM_TOPLEVEL *w_current, int 
world_diff_x,
 
 
           if (o_move_zero_length(object)) {
-            o_delete_net(w_current, object);
+            o_delete(w_current, object);
           } else {
             o_net_recalc(toplevel, object);
             s_tile_update_object(toplevel, object);
@@ -542,7 +542,7 @@ void o_move_end_rubberband(GSCHEM_TOPLEVEL *w_current, int 
world_diff_x,
           object->line->y[whichone] = y;
 
           if (o_move_zero_length(object)) {
-            o_delete_bus(w_current, object);
+            o_delete(w_current, object);
           } else {
             o_bus_recalc(toplevel, object);
             s_tile_update_object(toplevel, object);
diff --git a/gschem/src/x_autonumber.c b/gschem/src/x_autonumber.c
index b58b3f5..318e05e 100644
--- a/gschem/src/x_autonumber.c
+++ b/gschem/src/x_autonumber.c
@@ -586,7 +586,7 @@ void autonumber_remove_number(AUTONUMBER_TEXT * autotext, 
OBJECT *o_current)
        g_free(slot_str);
        /* delete the slot attribute */
        o_selection_remove 
(autotext->w_current->toplevel->page_current->selection_list, o_slot);
-       o_delete_text (autotext->w_current, o_slot);
+       o_delete (autotext->w_current, o_slot);
       }
     }
   }
diff --git a/gschem/src/x_multiattrib.c b/gschem/src/x_multiattrib.c
index 679d428..6519fb0 100644
--- a/gschem/src/x_multiattrib.c
+++ b/gschem/src/x_multiattrib.c
@@ -518,7 +518,7 @@ static void 
multiattrib_action_delete_attribute(GSCHEM_TOPLEVEL *w_current,
 {
   /* actually deletes the attribute */
   o_selection_remove ( w_current->toplevel->page_current->selection_list, 
o_attrib);
-  o_delete_text (w_current, o_attrib);
+  o_delete (w_current, o_attrib);
   w_current->toplevel->page_current->CHANGED=1;
   o_undo_savestate (w_current, UNDO_ALL);
 
-- 
1.5.6




_______________________________________________
geda-dev mailing list
[email protected]
http://www.seul.org/cgi-bin/mailman/listinfo/geda-dev

Reply via email to