static void wire_unregister (ItemData *data) { NodeStore *store; g_return_if_fail (IS_WIRE (data)); store = item_data_get_store (data); node_store_remove_wire (store, WIRE (data)); }
static gboolean wire_register (ItemData *data) { NodeStore *store; g_return_val_if_fail (IS_WIRE (data), FALSE); store = item_data_get_store (data); return node_store_add_wire (store, WIRE (data)); }
static void part_unregister (ItemData *data) { NodeStore *store; g_return_if_fail (IS_PART (data)); store = item_data_get_store (data); node_store_remove_part (store, PART (data)); }
static void textbox_unregister (ItemData *data) { NodeStore *store; g_return_if_fail (IS_TEXTBOX (data)); store = item_data_get_store (data); node_store_remove_textbox (store, TEXTBOX (data)); }
static int textbox_register (ItemData *data) { NodeStore *store; g_return_val_if_fail (IS_TEXTBOX (data), 0); store = item_data_get_store (data); node_store_add_textbox (store, TEXTBOX (data)); return 0; }
/** * register a part to its nodestore * @param data the part * @attention the @data has to have a valid nodestore set */ static int part_register (ItemData *data) { NodeStore *store; g_return_val_if_fail (IS_PART (data), FALSE); store = item_data_get_store (data); node_store_add_part (store, PART (data)); return TRUE; }
int node_store_remove_wire (NodeStore *store, Wire *wire) { GSList *list; SheetPos lookup_key, pos, length; g_return_val_if_fail (store != NULL, FALSE); g_return_val_if_fail (IS_NODE_STORE (store), FALSE); g_return_val_if_fail (wire != NULL, FALSE); g_return_val_if_fail (IS_WIRE (wire), FALSE); if (item_data_get_store (ITEM_DATA (wire)) == NULL) { g_warning ("Trying to remove non-stored wire."); return FALSE; } wire_get_pos_and_length (wire, &pos, &length); store->wires = g_list_remove (store->wires, wire); store->items = g_list_remove (store->items, wire); // If the nodes that this wire passes through will be // empty when the wire is removed, remove the node as well. // We must work on a copy of the nodes list, since it // changes as we remove nodes. list = g_slist_copy (wire_get_nodes (wire)); for (; list; list = list->next) { Node *node = list->data; lookup_key = node->key; node_remove_wire (node, wire); wire_remove_node (wire, node); if (node_is_empty (node)) g_hash_table_remove (store->nodes, &lookup_key); } g_slist_free (list); return TRUE; }
/** * removes/unregisters a wire from the nodestore * this does _not_ free the wire itself! */ gboolean node_store_remove_wire (NodeStore *store, Wire *wire) { GSList *copy, *iter; Coords lookup_key; g_return_val_if_fail (store, FALSE); g_return_val_if_fail (IS_NODE_STORE (store), FALSE); g_return_val_if_fail (wire, FALSE); g_return_val_if_fail (IS_WIRE (wire), FALSE); if (item_data_get_store (ITEM_DATA (wire)) == NULL) { g_warning ("Trying to remove not-stored wire %p.", wire); return FALSE; } store->wires = g_list_remove (store->wires, wire); store->items = g_list_remove (store->items, wire); // If the nodes that this wire passes through will be // empty when the wire is removed, remove the node as well. // FIXME if done properly, a list copy is _not_ necessary copy = g_slist_copy (wire_get_nodes (wire)); for (iter = copy; iter; iter = iter->next) { Node *node = iter->data; lookup_key = node->key; node_remove_wire (node, wire); wire_remove_node (wire, node); if (node_is_empty (node)) g_hash_table_remove (store->nodes, &lookup_key); } g_slist_free (copy); return TRUE; }