1 /* -*- Mode: C; c-basic-offset: 4 -*- */
2 /* Python plug-in for dia
3 * Copyright (C) 1999 James Henstridge
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24 #include "pydia-layer.h"
25 #include "pydia-object.h"
26 #include "pydia-cpoint.h"
29 PyDiaLayer_New(Layer
*layer
)
33 self
= PyObject_NEW(PyDiaLayer
, &PyDiaLayer_Type
);
35 if (!self
) return NULL
;
37 return (PyObject
*)self
;
41 PyDiaLayer_Dealloc(PyDiaLayer
*self
)
47 PyDiaLayer_Compare(PyDiaLayer
*self
, PyDiaLayer
*other
)
49 if (self
->layer
== other
->layer
) return 0;
50 if (self
->layer
> other
->layer
) return -1;
55 PyDiaLayer_Hash(PyDiaLayer
*self
)
57 return (long)self
->layer
;
61 PyDiaLayer_Str(PyDiaLayer
*self
)
63 return PyString_FromString(self
->layer
->name
);
69 PyDiaLayer_Destroy(PyDiaLayer
*self
, PyObject
*args
)
71 if (!PyArg_ParseTuple(args
, ":DiaLayer.destroy"))
73 layer_destroy(self
->layer
);
74 self
->layer
= NULL
; /* we need some error checking elsewhere */
80 PyDiaLayer_ObjectIndex(PyDiaLayer
*self
, PyObject
*args
)
84 if (!PyArg_ParseTuple(args
, "O!:DiaLayer.object_index",
85 &PyDiaObject_Type
, &obj
))
87 return PyInt_FromLong(layer_object_index(self
->layer
, obj
->object
));
91 PyDiaLayer_AddObject(PyDiaLayer
*self
, PyObject
*args
)
96 if (!PyArg_ParseTuple(args
, "O!|i:DiaLayer.add_object",
97 &PyDiaObject_Type
, &obj
,
101 layer_add_object_at(self
->layer
, obj
->object
, pos
);
103 layer_add_object(self
->layer
, obj
->object
);
109 PyDiaLayer_RemoveObject(PyDiaLayer
*self
, PyObject
*args
)
113 if (!PyArg_ParseTuple(args
, "O!:DiaLayer.remove_object",
114 &PyDiaObject_Type
, &obj
))
116 layer_remove_object(self
->layer
, obj
->object
);
122 PyDiaLayer_FindObjectsInRectangle(PyDiaLayer
*self
, PyObject
*args
)
128 if (!PyArg_ParseTuple(args
, "dddd:DiaLayer.find_objects_in_rectange",
129 &rect
.top
, &rect
.left
, &rect
.bottom
, &rect
.right
))
131 list
= layer_find_objects_in_rectangle(self
->layer
, &rect
);
133 for (tmp
= list
; tmp
; tmp
= tmp
->next
)
134 PyList_Append(ret
, PyDiaObject_New((Object
*)tmp
->data
));
140 PyDiaLayer_FindClosestObject(PyDiaLayer
*self
, PyObject
*args
)
146 if (!PyArg_ParseTuple(args
, "ddd:DiaLayer.find_closest_object",
147 &pos
.x
, &pos
.y
, &maxdist
))
149 obj
= layer_find_closest_object(self
->layer
, &pos
, maxdist
);
151 return PyDiaObject_New(obj
);
157 PyDiaLayer_FindClosestConnectionPoint(PyDiaLayer
*self
, PyObject
*args
)
159 ConnectionPoint
*cpoint
= NULL
;
164 if (!PyArg_ParseTuple(args
, "dd:DiaLayer.find_closest_connection_point",
167 dist
= layer_find_closest_connectionpoint(self
->layer
, &cpoint
, &pos
, NULL
);
169 ret
= PyTuple_New(2);
170 PyTuple_SetItem(ret
, 0, PyFloat_FromDouble(dist
));
172 PyTuple_SetItem(ret
, 1, PyDiaConnectionPoint_New(cpoint
));
175 PyTuple_SetItem(ret
, 1, Py_None
);
181 PyDiaLayer_UpdateExtents(PyDiaLayer
*self
, PyObject
*args
)
183 if (!PyArg_ParseTuple(args
, ":DiaLayer.update_extents"))
185 return PyInt_FromLong(layer_update_extents(self
->layer
));
188 /* missing functions:
190 * layer_add_objects_first
191 * layer_remove_objects
192 * layer_replace_object_with_list
193 * layer_set_object_list
198 static PyMethodDef PyDiaLayer_Methods
[] = {
199 {"destroy", (PyCFunction
)PyDiaLayer_Destroy
, 1},
200 {"object_index", (PyCFunction
)PyDiaLayer_ObjectIndex
, 1},
201 {"add_object", (PyCFunction
)PyDiaLayer_AddObject
, 1},
202 {"remove_object", (PyCFunction
)PyDiaLayer_RemoveObject
, 1},
203 {"find_objects_in_rectangle",
204 (PyCFunction
)PyDiaLayer_FindObjectsInRectangle
, 1},
205 {"find_closest_object", (PyCFunction
)PyDiaLayer_FindClosestObject
, 1},
206 {"find_closest_connection_point",
207 (PyCFunction
)PyDiaLayer_FindClosestConnectionPoint
, 1},
208 {"update_extents", (PyCFunction
)PyDiaLayer_UpdateExtents
, 1},
213 PyDiaLayer_GetAttr(PyDiaLayer
*self
, gchar
*attr
)
215 if (!strcmp(attr
, "__members__"))
216 return Py_BuildValue("[ssss]", "extents", "name", "objects",
218 else if (!strcmp(attr
, "name"))
219 return PyString_FromString(self
->layer
->name
);
220 else if (!strcmp(attr
, "extents"))
221 return Py_BuildValue("(dddd)", self
->layer
->extents
.top
,
222 self
->layer
->extents
.left
,
223 self
->layer
->extents
.bottom
,
224 self
->layer
->extents
.right
);
225 else if (!strcmp(attr
, "objects")) {
230 ret
= PyTuple_New(g_list_length(self
->layer
->objects
));
231 for (i
= 0, tmp
= self
->layer
->objects
; tmp
; i
++, tmp
= tmp
->next
)
232 PyTuple_SetItem(ret
, i
, PyDiaObject_New((Object
*)tmp
->data
));
234 } else if (!strcmp(attr
, "visible"))
235 return PyInt_FromLong(self
->layer
->visible
);
237 return Py_FindMethod(PyDiaLayer_Methods
, (PyObject
*)self
, attr
);
240 PyTypeObject PyDiaLayer_Type
= {
241 PyObject_HEAD_INIT(&PyType_Type
)
246 (destructor
)PyDiaLayer_Dealloc
,
248 (getattrfunc
)PyDiaLayer_GetAttr
,
250 (cmpfunc
)PyDiaLayer_Compare
,
255 (hashfunc
)PyDiaLayer_Hash
,
257 (reprfunc
)PyDiaLayer_Str
,