示例#1
0
文件: undo.c 项目: krattai/monoflow
static void
connect_revert(struct ConnectChange *change, Diagram *dia)
{
  object_unconnect(change->obj, change->handle);
  
  object_add_updates(change->obj, dia);
  change->obj->ops->move_handle(change->obj, change->handle ,
				&change->handle_pos, NULL,
				HANDLE_MOVE_CONNECTED, 0);
  
  object_add_updates(change->obj, dia);
}
示例#2
0
ObjectChange *
beziershape_remove_segment(BezierShape *bezier, int pos)
{
  Handle *old_handle1, *old_handle2, *old_handle3;
  ConnectionPoint *old_cp1, *old_cp2;
  BezPoint old_point;
  BezCornerType old_ctype;
  int next = pos+1;

  g_assert(pos > 0);
  g_assert(bezier->numpoints > 2);
  g_assert(pos < bezier->numpoints);

  if (pos == bezier->numpoints - 1)
    next = 1;

  old_handle1 = bezier->object.handles[3*pos-3];
  old_handle2 = bezier->object.handles[3*pos-2];
  old_handle3 = bezier->object.handles[3*pos-1];
  old_point = bezier->points[pos];
  /* remember the old contro point of following bezpoint */
  old_point.p1 = bezier->points[next].p1;
  old_ctype = bezier->corner_types[pos];

  old_cp1 = bezier->object.connections[2*pos-2];
  old_cp2 = bezier->object.connections[2*pos-1];
  
  object_unconnect((DiaObject *)bezier, old_handle1);
  object_unconnect((DiaObject *)bezier, old_handle2);
  object_unconnect((DiaObject *)bezier, old_handle3);

  remove_handles(bezier, pos);

  beziershape_update_data(bezier);
  
  return beziershape_create_point_change(bezier, TYPE_REMOVE_POINT,
					 &old_point, old_ctype, pos,
					 old_handle1, old_handle2, old_handle3,
					 old_cp1, old_cp2);
}
示例#3
0
文件: bus.c 项目: krattai/monoflow
static void
bus_change_apply(struct PointChange *change, DiaObject *obj)
{
  change->applied = 1;
  switch (change->type) {
  case TYPE_ADD_POINT:
    bus_add_handle((Bus *)obj, &change->point, change->handle);
    break;
  case TYPE_REMOVE_POINT:
    object_unconnect(obj, change->handle);
    bus_remove_handle((Bus *)obj, change->handle);
    break;
  }
  bus_update_data((Bus *)obj);
}
示例#4
0
static void
polyconn_change_apply(struct PointChange *change, DiaObject *obj)
{
  change->applied = 1;
  switch (change->type) {
  case TYPE_ADD_POINT:
    add_handle((PolyConn *)obj, change->pos, &change->point,
	       change->handle);
    break;
  case TYPE_REMOVE_POINT:
    object_unconnect(obj, change->handle);
    remove_handle((PolyConn *)obj, change->pos);
    break;
  }
}
示例#5
0
ObjectChange *
polyconn_remove_point(PolyConn *poly, int pos)
{
  Handle *old_handle;
  ConnectionPoint *connectionpoint;
  Point old_point;
  
  old_handle = poly->object.handles[pos];
  old_point = poly->points[pos];
  connectionpoint = old_handle->connected_to;
  
  object_unconnect((DiaObject *)poly, old_handle);

  remove_handle(poly, pos);

  polyconn_update_data(poly);
  
  return polyconn_create_change(poly, TYPE_REMOVE_POINT,
				&old_point, pos, old_handle,
				connectionpoint);
}
示例#6
0
文件: compound.c 项目: brunetton/dia
/**
 * Add or remove handles, so that comp->object.num_handles will equal to
 * the specified value. When there have been no changes done 0 is
 * returned, otherwise the number of handles removed (negative value) or
 * the number of added handles (positive value) will be returned.
 */
static gint
adjust_handle_count_to (Compound * comp, gint to)
{
  DiaObject * obj = &comp->object;
  gint old_count = obj->num_handles;
  gint new_count = to;
  Handle * h;
  gint i;
  gint diff = 0;

  /* we require to have always at least two arms! */
  g_assert (new_count >= 3);

  if (new_count == old_count)
    return diff; /* every thing is ok */

  obj->handles = g_realloc (obj->handles, new_count * sizeof(Handle *));
  obj->num_handles = new_count;
  comp->num_arms = new_count-1;

  if (new_count < old_count) /* removing */
    {
      for (i = new_count; i < old_count; i++)
        object_unconnect (obj, &comp->handles[i]);
      comp->handles = g_realloc (comp->handles, sizeof(Handle) * new_count);
    }
  else /* adding */
    {
      comp->handles = g_realloc (comp->handles, sizeof(Handle) * new_count);
      for (i = old_count; i < new_count; i++)
        {
          h = &comp->handles[i];
          setup_handle (h, HANDLE_ARM,
                        HANDLE_MINOR_CONTROL, HANDLE_CONNECTABLE_NOBREAK);
        }
    }
  for (i = 0; i < new_count; i++)
    obj->handles[i] = &comp->handles[i];
  return new_count - old_count;
}
示例#7
0
文件: bus.c 项目: krattai/monoflow
static ObjectChange *
bus_delete_handle_callback (DiaObject *obj, Point *clicked, gpointer data)
{
  Bus *bus = (Bus *) obj;
  Handle *handle;
  int handle_num;
  ConnectionPoint *connectionpoint;
  Point p;

  handle_num = bus_point_near_handle(bus, clicked);

  handle = bus->handles[handle_num];
  p = handle->pos;
  connectionpoint = handle->connected_to;
  
  object_unconnect(obj, handle);
  bus_remove_handle(bus, handle );
  bus_update_data(bus);

  return bus_create_change(bus, TYPE_REMOVE_POINT, &p, handle,
			   connectionpoint);
}
示例#8
0
ObjectChange *
polyshape_remove_point(PolyShape *poly, int pos)
{
  Handle *old_handle;
  ConnectionPoint *old_cp1, *old_cp2;
  Point old_point;
  
  old_handle = poly->object.handles[pos];
  old_point = poly->points[pos];
  old_cp1 = poly->object.connections[2*pos];
  old_cp2 = poly->object.connections[2*pos+1];
  
  object_unconnect((DiaObject *)poly, old_handle);

  remove_handle(poly, pos);

  polyshape_update_data(poly);
  
  return polyshape_create_change(poly, TYPE_REMOVE_POINT,
				&old_point, pos, old_handle,
				old_cp1, old_cp2);
}
示例#9
0
文件: compound.c 项目: brunetton/dia
static ObjectChange *
compound_flip_arms_cb (DiaObject *obj, Point *pos, gpointer data)
{
  Compound * comp = (Compound *) obj;
  gint direction = GPOINTER_TO_INT (data);
  Point * mppos = &comp->mount_point.pos;
  CompoundState * state;
  Handle * h;
  Point * p;
  gint num_handles, i;

  state = compound_state_new (comp);

  num_handles = obj->num_handles;
  for (i = 1; i < num_handles; i++)
    {
      h = obj->handles[i];
      object_unconnect (obj, h);
      p = &h->pos;
      if (direction == FLIP_VERTICAL)
        {
          p->y -= mppos->y;
          p->y *= -1.0;
          p->y += mppos->y;
        }
      else
        {
          p->x -= mppos->x;
          p->x *= -1.0;
          p->x += mppos->x;
        }
    }

  compound_update_data (comp);
  compound_sanity_check (comp, "After flipping sides");
  return (ObjectChange *) compound_change_new (comp, state);
}