static void move_objects_revert(struct MoveObjectsChange *change, Diagram *dia) { GList *list; int i; DiaObject *obj; object_add_updates_list(change->obj_list, dia); list = change->obj_list; i=0; while (list != NULL) { obj = (DiaObject *) list->data; obj->ops->move(obj, &change->orig_pos[i]); list = g_list_next(list); i++; } list = change->obj_list; while (list!=NULL) { obj = (DiaObject *) list->data; diagram_update_connections_object(dia, obj, TRUE); list = g_list_next(list); } object_add_updates_list(change->obj_list, dia); }
void diagram_remove_all_selected(Diagram *diagram, int delete_empty) { object_add_updates_list(diagram->data->selected, diagram); textedit_remove_focus_all(diagram); data_remove_all_selected(diagram->data); }
static void delete_objects_revert(struct DeleteObjectsChange *change, Diagram *dia) { GList *list; DEBUG_PRINTF(("delete_objects_revert()\n")); change->applied = 0; layer_set_object_list(change->layer, g_list_copy(change->original_objects)); object_add_updates_list(change->obj_list, dia); list = change->obj_list; while (list) { DiaObject *obj = (DiaObject *) list->data; if (obj->parent) /* Restore child references */ obj->parent->children = g_list_append(obj->parent->children, obj); /* Emit a signal per object reverted */ data_emit(layer_get_parent_diagram(change->layer),change->layer,obj,"object_add"); list = g_list_next(list); } diagram_tree_add_objects(diagram_tree(), dia, change->obj_list); }
static void delete_objects_apply(struct DeleteObjectsChange *change, Diagram *dia) { GList *list; DEBUG_PRINTF(("delete_objects_apply()\n")); change->applied = 1; diagram_unselect_objects(dia, change->obj_list); layer_remove_objects(change->layer, change->obj_list); object_add_updates_list(change->obj_list, dia); list = change->obj_list; while (list != NULL) { DiaObject *obj = (DiaObject *)list->data; /* Have to hide any open properties dialog if it contains some object in cut_list */ properties_hide_if_shown(dia, obj); if (obj->parent) /* Lose references to deleted object */ obj->parent->children = g_list_remove(obj->parent->children, obj); list = g_list_next(list); } diagram_tree_remove_objects(diagram_tree(), change->obj_list); }
static void reorder_objects_revert(struct ReorderObjectsChange *change, Diagram *dia) { DEBUG_PRINTF(("reorder_objects_revert()\n")); layer_set_object_list(change->layer, g_list_copy(change->original_objects)); object_add_updates_list(change->changed_list, dia); }
static void insert_objects_apply(struct InsertObjectsChange *change, Diagram *dia) { DEBUG_PRINTF(("insert_objects_apply()\n")); change->applied = 1; layer_add_objects(change->layer, g_list_copy(change->obj_list)); object_add_updates_list(change->obj_list, dia); diagram_tree_add_objects(diagram_tree(), dia, change->obj_list); }
static gint properties_respond(GtkWidget *widget, gint response_id, gpointer data) { ObjectChange *obj_change = NULL; gboolean set_tp = TRUE; GList *tmp; if ( response_id == GTK_RESPONSE_APPLY || response_id == GTK_RESPONSE_OK) { if ((current_objects != NULL) && (current_dia != NULL)) { object_add_updates_list(current_objects, current_dia); for (tmp = current_objects; tmp != NULL; tmp = tmp->next) { DiaObject *current_obj = (DiaObject*)tmp->data; obj_change = current_obj->ops->apply_properties_from_dialog(current_obj, object_part); object_add_updates(current_obj, current_dia); diagram_update_connections_object(current_dia, current_obj, TRUE); if (obj_change != NULL) { undo_object_change(current_dia, current_obj, obj_change); set_tp = set_tp && TRUE; } else set_tp = FALSE; diagram_object_modified(current_dia, current_obj); } diagram_modified(current_dia); diagram_update_extents(current_dia); if (set_tp) { undo_set_transactionpoint(current_dia->undo); } else { message_warning(_("This object doesn't support Undo/Redo.\n" "Undo information erased.")); undo_clear(current_dia->undo); } diagram_flush(current_dia); } } if (response_id != GTK_RESPONSE_APPLY) { #ifdef G_OS_WIN32 /* on windows we are not hiding the dialog, because shrinking when hidden does * not work (the dialog shows up with the same size as before, bug #333751) */ gtk_widget_destroy (dialog); #else properties_dialog_hide(); #endif } return 0; }
static void move_object_to_layer_revert(MoveObjectToLayerChange *change, Diagram *dia) { if (change->moving_up) { move_object_layer_relative(dia, change->objects, -1); } else { diagram_unselect_objects(dia, change->objects); move_object_layer_relative(dia, change->objects, 1); /* overwriting the 'unsorted' list of objects to the order it had before */ layer_set_object_list(change->orig_layer, g_list_copy(change->orig_list)); object_add_updates_list(change->orig_list, dia); } }
void diagram_place_down_selected(Diagram *dia) { GList *sorted_list; GList *orig_list; GList *tmp, *stmp; GList *new_list = NULL; if (g_list_length (dia->data->selected) == 0) return; orig_list = g_list_copy(dia->data->active_layer->objects); sorted_list = diagram_get_sorted_selected(dia); object_add_updates_list(orig_list, dia); /* Sanity check */ g_assert(g_list_length (dia->data->selected) == g_list_length(sorted_list)); new_list = g_list_copy(orig_list); stmp = sorted_list; for (tmp = new_list; tmp != NULL; tmp = g_list_next(tmp)) { if (stmp == NULL) break; if (tmp->next == NULL) break; if (tmp->data == stmp->data) { /* This just takes care of any starting matches */ stmp = g_list_next(stmp); } else if (tmp->next->data == stmp->data) { /* This flips the non-selected element forwards, ala bubblesort */ void *swap = tmp->data; tmp->data = tmp->next->data; tmp->next->data = swap; stmp = g_list_next(stmp); } } layer_set_object_list(dia->data->active_layer, new_list); undo_reorder_objects(dia, g_list_copy(sorted_list), orig_list); diagram_modified(dia); diagram_flush(dia); undo_set_transactionpoint(dia->undo); }
static void group_objects_revert(struct GroupObjectsChange *change, Diagram *dia) { DEBUG_PRINTF(("group_objects_revert()\n")); change->applied = 0; diagram_unselect_object(dia, change->group); object_add_updates(change->group, dia); layer_set_object_list(change->layer, g_list_copy(change->orig_list)); object_add_updates_list(change->obj_list, dia); properties_hide_if_shown(dia, change->group); diagram_tree_add_objects(diagram_tree(), dia, change->obj_list); diagram_tree_remove_object(diagram_tree(), change->group); }
static void ungroup_objects_apply(struct UngroupObjectsChange *change, Diagram *dia) { DEBUG_PRINTF(("ungroup_objects_apply()\n")); change->applied = 1; diagram_unselect_object(dia, change->group); object_add_updates(change->group, dia); layer_replace_object_with_list(change->layer, change->group, g_list_copy(change->obj_list)); object_add_updates_list(change->obj_list, dia); properties_hide_if_shown(dia, change->group); diagram_tree_add_objects(diagram_tree(), dia, change->obj_list); diagram_tree_remove_object(diagram_tree(), change->group); }
void diagram_place_up_selected(Diagram *dia) { GList *sorted_list; GList *orig_list; GList *tmp, *stmp; GList *new_list = NULL; if (g_list_length (dia->data->selected) == 0) return; orig_list = g_list_copy(dia->data->active_layer->objects); sorted_list = diagram_get_sorted_selected(dia); object_add_updates_list(orig_list, dia); new_list = g_list_copy(orig_list); stmp = g_list_last(sorted_list); for (tmp = g_list_last(new_list); tmp != NULL; tmp = g_list_previous(tmp)) { if (stmp == NULL) break; if (tmp->prev == NULL) break; if (tmp->data == stmp->data) { stmp = g_list_previous(stmp); } else if (tmp->prev->data == stmp->data) { void *swap = tmp->data; tmp->data = tmp->prev->data; tmp->prev->data = swap; stmp = g_list_previous(stmp); } } layer_set_object_list(dia->data->active_layer, new_list); undo_reorder_objects(dia, g_list_copy(sorted_list), orig_list); diagram_modified(dia); diagram_flush(dia); undo_set_transactionpoint(dia->undo); }
void diagram_place_over_selected(Diagram *dia) { GList *sorted_list; GList *orig_list; if (g_list_length (dia->data->selected) == 0) return; orig_list = g_list_copy(dia->data->active_layer->objects); sorted_list = diagram_get_sorted_selected_remove(dia); object_add_updates_list(sorted_list, dia); layer_add_objects(dia->data->active_layer, sorted_list); undo_reorder_objects(dia, g_list_copy(sorted_list), orig_list); diagram_modified(dia); diagram_flush(dia); undo_set_transactionpoint(dia->undo); }
/*! * BEWARE: we need to notify the DiagramTree somehow - maybe * better make it listen to object-add signal? */ static void move_object_layer_relative(Diagram *dia, GList *objects, gint dist) { /* from the active layer to above or below */ Layer *active, *target; guint pos; g_return_if_fail(dia->data->active_layer); active = dia->data->active_layer; for (pos = 0; pos < dia->data->layers->len; ++pos) if (active == g_ptr_array_index(dia->data->layers, pos)) break; pos = (pos + dia->data->layers->len + dist) % dia->data->layers->len; target = g_ptr_array_index(dia->data->layers, pos); object_add_updates_list(objects, dia); layer_remove_objects(active, objects); diagram_tree_add_objects(diagram_tree(), dia, objects); layer_add_objects(target, g_list_copy(objects)); data_set_active_layer(dia->data, target); diagram_tree_add_objects(diagram_tree(), dia, objects); }
static void insert_objects_revert(struct InsertObjectsChange *change, Diagram *dia) { GList *list; DEBUG_PRINTF(("insert_objects_revert()\n")); change->applied = 0; diagram_unselect_objects(dia, change->obj_list); layer_remove_objects(change->layer, change->obj_list); object_add_updates_list(change->obj_list, dia); list = change->obj_list; while (list != NULL) { DiaObject *obj = (DiaObject *)list->data; /* Have to hide any open properties dialog if it contains some object in cut_list */ properties_hide_if_shown(dia, obj); list = g_list_next(list); } diagram_tree_remove_objects(diagram_tree(), change->obj_list); }
static void modify_motion (ModifyTool *tool, GdkEventMotion *event, DDisplay *ddisp) { Point to; Point now, delta, full_delta; gboolean auto_scroll, vertical = FALSE; ConnectionPoint *connectionpoint = NULL; ObjectChange *objchange = NULL; ddisplay_untransform_coords(ddisp, event->x, event->y, &to.x, &to.y); if (tool->state==STATE_NONE) { DiaObject *obj = NULL; Handle *handle = NULL; diagram_find_closest_handle (ddisp->diagram, &handle, &obj, &to); if (handle && handle->type != HANDLE_NON_MOVABLE && handle->id >= HANDLE_RESIZE_NW && handle->id <= HANDLE_RESIZE_SE && handle_is_clicked(ddisp, handle, &to) && g_list_length (ddisp->diagram->data->selected) == 1) ddisplay_set_all_cursor (get_direction_cursor (CURSOR_DIRECTION_0 + handle->id)); else ddisplay_set_all_cursor_name (NULL, "default"); return; /* Fast path... */ } auto_scroll = ddisplay_autoscroll(ddisp, event->x, event->y); if (!modify_move_already(tool, ddisp, &to)) return; switch (tool->state) { case STATE_MOVE_OBJECT: if (tool->orig_pos == NULL) { GList *list, *pla; int i; DiaObject *obj; /* consider non-selected children affected */ pla = list = parent_list_affected(ddisp->diagram->data->selected); tool->orig_pos = g_new(Point, g_list_length(list)); i=0; while (list != NULL) { obj = (DiaObject *) list->data; tool->orig_pos[i] = obj->position; list = g_list_next(list); i++; } g_list_free (pla); } if (tool->break_connections) diagram_unconnect_selected(ddisp->diagram); /* Pushes UNDO info */ if (gdk_event_to_dia_ModifierKeys (event->state) & MODIFIER_CONTROL) { full_delta = to; point_sub(&full_delta, &tool->start_at); vertical = (fabs(full_delta.x) < fabs(full_delta.y)); } point_add(&to, &tool->move_compensate); snap_to_grid(ddisp, &to.x, &to.y); now = tool->object->position; delta = to; point_sub(&delta, &now); if (gdk_event_to_dia_ModifierKeys (event->state) & MODIFIER_CONTROL) { /* Up-down or left-right */ if (vertical) { delta.x = tool->start_at.x + tool->move_compensate.x - now.x; } else { delta.y = tool->start_at.y + tool->move_compensate.y - now.y; } } object_add_updates_list(ddisp->diagram->data->selected, ddisp->diagram); objchange = object_list_move_delta(ddisp->diagram->data->selected, &delta); if (objchange != NULL) { undo_object_change(ddisp->diagram, tool->object, objchange); } object_add_updates_list(ddisp->diagram->data->selected, ddisp->diagram); object_add_updates(tool->object, ddisp->diagram); /* Put current mouse position in status bar */ { gchar *postext; GtkStatusbar *statusbar = GTK_STATUSBAR (ddisp->modified_status); guint context_id = gtk_statusbar_get_context_id (statusbar, "ObjectPos"); gtk_statusbar_pop (statusbar, context_id); postext = g_strdup_printf("%.3f, %.3f - %.3f, %.3f", tool->object->bounding_box.left, tool->object->bounding_box.top, tool->object->bounding_box.right, tool->object->bounding_box.bottom); gtk_statusbar_pop (statusbar, context_id); gtk_statusbar_push (statusbar, context_id, postext); g_free(postext); } diagram_update_connections_selection(ddisp->diagram); diagram_flush(ddisp->diagram); break; case STATE_MOVE_HANDLE: full_delta = to; point_sub(&full_delta, &tool->start_at); /* make sure resizing is restricted to its parent */ /* if resize was blocked by parent, that means the resizing was outward, thus it won't bother the children so we don't have to check the children */ if (!parent_handle_move_out_check(tool->object, &to)) parent_handle_move_in_check(tool->object, &to, &tool->start_at); if (gdk_event_to_dia_ModifierKeys (event->state) & MODIFIER_CONTROL) vertical = (fabs(full_delta.x) < fabs(full_delta.y)); highlight_reset_all(ddisp->diagram); if ((tool->handle->connect_type != HANDLE_NONCONNECTABLE)) { /* Move to ConnectionPoint if near: */ connectionpoint = object_find_connectpoint_display (ddisp, &to, tool->object, TRUE); if (connectionpoint != NULL) { DiaHighlightType type; to = connectionpoint->pos; if (connectionpoint->flags & CP_FLAGS_MAIN) { type = DIA_HIGHLIGHT_CONNECTIONPOINT_MAIN; } else { type = DIA_HIGHLIGHT_CONNECTIONPOINT; } highlight_object(connectionpoint->object, type, ddisp->diagram); ddisplay_set_all_cursor_name (NULL, "crosshair"); } } if (connectionpoint == NULL) { /* No connectionopoint near, then snap to grid (if enabled) */ snap_to_grid(ddisp, &to.x, &to.y); ddisplay_set_all_cursor_name (NULL, "move"); } if (tool->break_connections) { /* break connections to the handle currently selected. */ if (tool->handle->connected_to!=NULL) { Change *change = undo_unconnect (ddisp->diagram, tool->object, tool->handle); (change->apply)(change, ddisp->diagram); } } if (gdk_event_to_dia_ModifierKeys (event->state) & MODIFIER_CONTROL) { /* Up-down or left-right */ if (vertical) { to.x = tool->start_at.x; } else { to.y = tool->start_at.y; } } if (tool->orig_pos == NULL) { tool->orig_pos = g_new(Point, 1); *tool->orig_pos = tool->handle->pos; } /* Put current mouse position in status bar */ { gchar *postext; GtkStatusbar *statusbar = GTK_STATUSBAR (ddisp->modified_status); guint context_id = gtk_statusbar_get_context_id (statusbar, "ObjectPos"); if (tool->object) { /* play safe */ real w = tool->object->bounding_box.right - tool->object->bounding_box.left; real h = tool->object->bounding_box.bottom - tool->object->bounding_box.top; postext = g_strdup_printf("%.3f, %.3f (%.3fx%.3f)", to.x, to.y, w, h); } else { postext = g_strdup_printf("%.3f, %.3f", to.x, to.y); } gtk_statusbar_pop (statusbar, context_id); gtk_statusbar_push (statusbar, context_id, postext); g_free(postext); } object_add_updates(tool->object, ddisp->diagram); /* Handle undo */ if (tool->object) objchange = tool->object->ops->move_handle(tool->object, tool->handle, &to, connectionpoint, HANDLE_MOVE_USER, gdk_event_to_dia_ModifierKeys(event->state)); if (objchange != NULL) { undo_object_change(ddisp->diagram, tool->object, objchange); } object_add_updates(tool->object, ddisp->diagram); diagram_update_connections_selection(ddisp->diagram); diagram_flush(ddisp->diagram); break; case STATE_BOX_SELECT: tool->end_box = to; ddisplay_transform_coords (ddisp, MIN (tool->start_box.x, tool->end_box.x), MIN (tool->start_box.y, tool->end_box.y), &tool->x1, &tool->y1); ddisplay_transform_coords (ddisp, MAX (tool->start_box.x, tool->end_box.x), MAX (tool->start_box.y, tool->end_box.y), &tool->x2, &tool->y2); dia_interactive_renderer_set_selection (ddisp->renderer, TRUE, tool->x1, tool->y1, tool->x2 - tool->x1, tool->y2 - tool->y1); ddisplay_flush (ddisp); break; case STATE_NONE: break; default: message_error("Internal error: Strange state in modify_tool\n"); } tool->last_to = to; tool->auto_scrolled = auto_scroll; }
static DiaObject * click_select_object(DDisplay *ddisp, Point *clickedpoint, GdkEventButton *event) { Diagram *diagram; real click_distance; DiaObject *obj; diagram = ddisp->diagram; /* Find the closest object to select it: */ click_distance = ddisplay_untransform_length(ddisp, 3.0); obj = diagram_find_clicked_object(diagram, clickedpoint, click_distance); if (obj!=NULL) { /* Selected an object. */ GList *already; /*printf("Selected object!\n");*/ already = g_list_find(diagram->data->selected, obj); if (already == NULL) { /* Not already selected */ /*printf("Not already selected\n");*/ if (!(event->state & GDK_SHIFT_MASK)) { /* Not Multi-select => remove current selection */ diagram_remove_all_selected(diagram, TRUE); } diagram_select(diagram, obj); /* To be removed once text edit mode is stable. By then, * we don't want to automatically edit selected objects. textedit_activate_object(ddisp, obj, clickedpoint); */ ddisplay_do_update_menu_sensitivity(ddisp); object_add_updates_list(diagram->data->selected, diagram); diagram_flush(diagram); return obj; } else { /* Clicked on already selected. */ /*printf("Already selected\n");*/ /* To be removed once text edit mode is stable. By then, * we don't want to automatically edit selected objects. textedit_activate_object(ddisp, obj, clickedpoint); */ object_add_updates_list(diagram->data->selected, diagram); diagram_flush(diagram); if (event->state & GDK_SHIFT_MASK) { /* Multi-select */ /* Remove the selected selected */ ddisplay_do_update_menu_sensitivity(ddisp); diagram_unselect_object(diagram, (DiaObject *)already->data); diagram_flush(ddisp->diagram); } else { return obj; } } } /* Else part moved to allow union/intersection select */ return NULL; }