Hi,
please apply the two patches attached. The basestation.patch
fixes mainly a text bounding box error. The radiocell.patch
removes the flickering when resizing the hexagon. I also took
the liberty of removing two useless properties, I introduced
in a fit of over-engineering ("cell type" and "subscribers").
I hope to see the fixes in 0.95 :-)
Cheers,
--
W. Borgert <[EMAIL PROTECTED]>, http://people.debian.org/~debacle/
--- dia-cvs-snapshot/objects/network/basestation.c 2005-04-01
05:00:06.000000000 +0200
+++ dia-cvs-snapshot-0.94.20060324/objects/network/basestation.c
2006-03-25 12:33:56.000000000 +0100
@@ -198,13 +198,16 @@
Point *to, ConnectionPoint *cp,
HandleMoveReason reason, ModifierKeys modifiers)
{
+ ObjectChange* oc;
+
assert(basestation!=NULL);
assert(handle!=NULL);
assert(to!=NULL);
-
assert(handle->id < 8);
- return NULL;
+ oc = element_move_handle (&(basestation->element), handle->id, to, cp,
reason, modifiers);
+
+ return oc;
}
static ObjectChange*
@@ -313,11 +316,16 @@
Rectangle text_box;
Point p;
- text_calc_boundingbox(basestation->text, &text_box);
-
elem->width = BASESTATION_WIDTH;
elem->height = BASESTATION_HEIGHT+basestation->text->height;
+ p = elem->corner;
+ p.x += elem->width/2;
+ p.y += elem->height + basestation->text->ascent;
+ text_set_position(basestation->text, &p);
+
+ text_calc_boundingbox(basestation->text, &text_box);
+
/* Update connections: */
basestation->connections[0].pos.x = elem->corner.x;
basestation->connections[0].pos.y = elem->corner.y;
@@ -349,11 +357,6 @@
element_update_boundingbox(elem);
- p = elem->corner;
- p.x += elem->width/2;
- p.y += elem->height + basestation->text->ascent;
- text_set_position(basestation->text, &p);
-
/* Add bounding box for text: */
rectangle_union(&obj->bounding_box, &text_box);
--- dia-cvs-snapshot/objects/network/radiocell.c 2004-05-21
17:48:35.000000000 +0200
+++ dia-cvs-snapshot-0.94.20060324/objects/network/radiocell.c 2006-03-25
13:42:38.000000000 +0100
@@ -39,22 +39,12 @@
#include "pixmaps/radiocell.xpm"
-/* TODO? no visual effect ATM, but useful anyway */
-typedef enum {
- MACRO_CELL,
- MICRO_CELL,
- PICO_CELL,
-} CellType;
-
-/* TODO: add different cell technologies, like GSM, UMTS, ... */
-
typedef struct _RadioCell RadioCell;
struct _RadioCell {
PolyShape poly; /* always 1st! */
- CellType celltype;
real radius; /* pseudo-radius */
- ConnectionPoint cp; /* connection point in the center */
+ Point center; /* point in the center */
Color line_colour;
LineStyle line_style;
real dashlength;
@@ -63,8 +53,6 @@
Color fill_colour;
Text *text;
TextAttributes attrs;
- int subscribers; /* number of subscribers in this cell,
- always >= 0, but check is missing */
};
#define RADIOCELL_LINEWIDTH 0.1
@@ -126,18 +114,9 @@
(SetPropsFunc) radiocell_set_props
};
-static PropEnumData prop_cell_type_data[] = {
- { N_("Macro Cell"), MACRO_CELL },
- { N_("Micro Cell"), MICRO_CELL },
- { N_("Pico Cell"), PICO_CELL },
- { NULL, 0}
-};
-
static PropDescription radiocell_props[] = {
POLYSHAPE_COMMON_PROPERTIES,
{ "radius", PROP_TYPE_REAL, 0, N_("Radius"), NULL, NULL },
- { "celltype", PROP_TYPE_ENUM, PROP_FLAG_VISIBLE,
- N_("Cell Type:"), NULL, prop_cell_type_data },
PROP_STD_LINE_WIDTH,
PROP_STD_LINE_COLOUR,
PROP_STD_LINE_STYLE,
@@ -148,8 +127,6 @@
PROP_STD_TEXT_HEIGHT,
PROP_STD_TEXT_COLOUR,
PROP_STD_TEXT_ALIGNMENT,
- { "subscribers", PROP_TYPE_INT, PROP_FLAG_VISIBLE,
- N_("Subscribers"), NULL, NULL },
PROP_DESC_END
};
@@ -165,7 +142,6 @@
static PropOffset radiocell_offsets[] = {
POLYSHAPE_COMMON_PROPERTIES_OFFSETS,
{ "radius", PROP_TYPE_REAL, offsetof(RadioCell, radius) },
- { "celltype", PROP_TYPE_ENUM, offsetof(RadioCell, celltype) },
{ "line_width", PROP_TYPE_REAL, offsetof(RadioCell, line_width) },
{ "line_colour", PROP_TYPE_COLOUR, offsetof(RadioCell, line_colour) },
{ "line_style", PROP_TYPE_LINESTYLE,
@@ -179,7 +155,6 @@
{ "text_colour", PROP_TYPE_COLOUR, offsetof(RadioCell, attrs.color) },
{ "text_alignment", PROP_TYPE_ENUM,
offsetof(RadioCell, attrs.alignment) },
- { "subscribers", PROP_TYPE_INT, offsetof(RadioCell, subscribers) },
{ NULL, 0, 0 },
};
@@ -222,11 +197,30 @@
Point *to, ConnectionPoint *cp,
HandleMoveReason reason, ModifierKeys modifiers)
{
- real distance = distance_point_point(&handle->pos, to);
- gboolean larger = distance_point_point(&handle->pos, &radiocell->cp.pos) <
- distance_point_point(to, &radiocell->cp.pos);
+ real distance;
+ gboolean larger;
+
+ /* prevent flicker for "negative" resizing */
+ if ((handle->id == HANDLE_CUSTOM1 && to->x < radiocell->center.x) ||
+ (handle->id == HANDLE_CUSTOM4 && to->x > radiocell->center.x) ||
+ ((handle->id == HANDLE_CUSTOM2 || handle->id == HANDLE_CUSTOM3) &&
+ to->y < radiocell->center.y) ||
+ ((handle->id == HANDLE_CUSTOM5 || handle->id == HANDLE_CUSTOM6) &&
+ to->y > radiocell->center.y)) {
+ return NULL;
+ }
- /* TODO: this flickers terribly */
+ /* prevent flicker for "diagonal" resizing */
+ if (handle->id == HANDLE_CUSTOM1 || handle->id == HANDLE_CUSTOM4) {
+ to->y = handle->pos.y;
+ }
+ else {
+ to->x = handle->pos.x;
+ }
+
+ distance = distance_point_point(&handle->pos, to);
+ larger = distance_point_point(&handle->pos, &radiocell->center) <
+ distance_point_point(to, &radiocell->center);
radiocell->radius += distance * (larger? 1: -1);
if (radiocell->radius < 1.)
radiocell->radius = 1.;
@@ -239,8 +233,8 @@
radiocell_move(RadioCell *radiocell, Point *to)
{
polyshape_move(&radiocell->poly, to);
- radiocell->cp.pos = *to;
- radiocell->cp.pos.x -= radiocell->radius;
+ radiocell->center = *to;
+ radiocell->center.x -= radiocell->radius;
radiocell_update_data(radiocell);
return NULL;
@@ -288,12 +282,11 @@
Point points[] = { { 1., 0. }, { .5, .75 }, { -.5, .75 },
{ -1., 0. }, { -.5, -.75 }, { .5, -.75 } };
- /* TODO: the CP is invisible and does not yet work */
- radiocell->cp.pos.x = (poly->points[0].x + poly->points[3].x) / 2.;
- radiocell->cp.pos.y = poly->points[0].y;
+ radiocell->center.x = (poly->points[0].x + poly->points[3].x) / 2.;
+ radiocell->center.y = poly->points[0].y;
for (i = 0; i < 6; i++) {
- poly->points[i] = radiocell->cp.pos;
+ poly->points[i] = radiocell->center;
poly->points[i].x += radiocell->radius * points[i].x;
poly->points[i].y += radiocell->radius * points[i].y;
}
@@ -323,6 +316,7 @@
PolyShape *poly;
DiaObject *obj;
DiaFont *font;
+ int i = 0;
radiocell = g_new0(RadioCell, 1);
poly = &radiocell->poly;
@@ -331,9 +325,7 @@
obj->ops = &radiocell_ops;
obj->can_parent = TRUE;
- radiocell->celltype = MACRO_CELL;
radiocell->radius = 4.;
- radiocell->subscribers = 1000;
/* do not use default_properties.show_background here */
radiocell->show_background = FALSE;
@@ -351,17 +343,17 @@
polyshape_init(poly, 6);
- object_add_connectionpoint(&poly->object, &radiocell->cp);
- obj->connections[0] = &radiocell->cp;
- radiocell->cp.object = obj;
- radiocell->cp.connected = NULL;
- radiocell->cp.directions = DIR_ALL;
- radiocell->cp.pos = *startpoint;
- radiocell->cp.pos.x -= radiocell->radius;
+ radiocell->center = *startpoint;
+ radiocell->center.x -= radiocell->radius;
radiocell_update_data(radiocell);
*handle1 = poly->object.handles[0];
*handle2 = poly->object.handles[2];
+
+ for (i=0;i<6;i++) {
+ poly->object.handles[i]->id = HANDLE_CUSTOM1 + i;
+ }
+
return &radiocell->poly.object;
}
_______________________________________________
Dia-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/dia-list
FAQ at http://www.gnome.org/projects/dia/faq.html
Main page at http://www.gnome.org/projects/dia