From 6820d27efa146afc84b1bffdba208168b84b9444 Mon Sep 17 00:00:00 2001
From: Přemysl Janouch
Date: Sat, 19 Feb 2011 14:04:52 +0100
Subject: Add "x" and "y" properties to LdDiagramView.
Plus a bit of refactoring.
---
liblogdiag/ld-diagram-view.c | 136 ++++++++++++++++++++++++++++++++++++-------
liblogdiag/ld-diagram-view.h | 5 ++
2 files changed, 119 insertions(+), 22 deletions(-)
diff --git a/liblogdiag/ld-diagram-view.c b/liblogdiag/ld-diagram-view.c
index 5991824..0e8c049 100644
--- a/liblogdiag/ld-diagram-view.c
+++ b/liblogdiag/ld-diagram-view.c
@@ -189,6 +189,8 @@ enum
PROP_0,
PROP_DIAGRAM,
PROP_LIBRARY,
+ PROP_X,
+ PROP_Y,
PROP_ZOOM
};
@@ -366,6 +368,26 @@ ld_diagram_view_class_init (LdDiagramViewClass *klass)
LD_TYPE_LIBRARY, G_PARAM_READWRITE);
g_object_class_install_property (object_class, PROP_LIBRARY, pspec);
+/**
+ * LdDiagramView:x:
+ *
+ * The X coordinate of the center of view.
+ */
+ pspec = g_param_spec_double ("x", "X",
+ "The X coordinate of the center of view.",
+ -G_MAXDOUBLE, G_MAXDOUBLE, 0, G_PARAM_READWRITE);
+ g_object_class_install_property (object_class, PROP_X, pspec);
+
+/**
+ * LdDiagramView:y:
+ *
+ * The Y coordinate of the center of view.
+ */
+ pspec = g_param_spec_double ("y", "Y",
+ "The Y coordinate of the center of view.",
+ -G_MAXDOUBLE, G_MAXDOUBLE, 0, G_PARAM_READWRITE);
+ g_object_class_install_property (object_class, PROP_Y, pspec);
+
/**
* LdDiagramView:zoom:
*
@@ -499,6 +521,12 @@ ld_diagram_view_get_property (GObject *object, guint property_id,
case PROP_LIBRARY:
g_value_set_object (value, ld_diagram_view_get_library (self));
break;
+ case PROP_X:
+ g_value_set_double (value, ld_diagram_view_get_x (self));
+ break;
+ case PROP_Y:
+ g_value_set_double (value, ld_diagram_view_get_y (self));
+ break;
case PROP_ZOOM:
g_value_set_double (value, ld_diagram_view_get_zoom (self));
break;
@@ -524,6 +552,12 @@ ld_diagram_view_set_property (GObject *object, guint property_id,
ld_diagram_view_set_library (self,
LD_LIBRARY (g_value_get_object (value)));
break;
+ case PROP_X:
+ ld_diagram_view_set_x (self, g_value_get_double (value));
+ break;
+ case PROP_Y:
+ ld_diagram_view_set_y (self, g_value_get_double (value));
+ break;
case PROP_ZOOM:
ld_diagram_view_set_zoom (self, g_value_get_double (value));
break;
@@ -608,17 +642,11 @@ on_adjustment_value_changed (GtkAdjustment *adjustment, LdDiagramView *self)
scale = ld_diagram_view_get_scale_in_px (self);
if (adjustment == self->priv->adjustment_h)
- {
- self->priv->x = adjustment->value
- + widget->allocation.width / scale / 2;
- gtk_widget_queue_draw (widget);
- }
+ ld_diagram_view_set_x (self, adjustment->value
+ + widget->allocation.width / scale / 2);
else if (adjustment == self->priv->adjustment_v)
- {
- self->priv->y = adjustment->value
- + widget->allocation.height / scale / 2;
- gtk_widget_queue_draw (widget);
- }
+ ld_diagram_view_set_y (self, adjustment->value
+ + widget->allocation.height / scale / 2);
}
static void
@@ -672,20 +700,13 @@ ld_diagram_view_real_move (LdDiagramView *self, gdouble dx, gdouble dy)
if (!diagram)
return;
- /* TODO: Check/move boundaries, also implement normal
- * getters and setters for priv->x and priv->y.
- */
if (ld_diagram_get_selection (diagram))
move_selection (self, dx, dy);
else
{
- self->priv->x += dx;
- self->priv->y += dy;
-
- simulate_motion (self);
- update_adjustments (self);
+ ld_diagram_view_set_x (self, self->priv->x + dx);
+ ld_diagram_view_set_y (self, self->priv->y + dy);
}
- gtk_widget_queue_draw (GTK_WIDGET (self));
}
@@ -896,6 +917,74 @@ ld_diagram_view_diagram_to_widget_coords (LdDiagramView *self,
*wy = scale * (dy - self->priv->y) + 0.5 * widget->allocation.height;
}
+/**
+ * ld_diagram_view_get_x:
+ * @self: an #LdDiagramView object.
+ *
+ * Return value: the X coordinate of the center of view.
+ */
+gdouble
+ld_diagram_view_get_x (LdDiagramView *self)
+{
+ g_return_val_if_fail (LD_IS_DIAGRAM_VIEW (self), 0);
+ return self->priv->x;
+}
+
+/**
+ * ld_diagram_view_set_x:
+ * @self: an #LdDiagramView object.
+ *
+ * Set the X coordinate of the center of view.
+ */
+void
+ld_diagram_view_set_x (LdDiagramView *self, gdouble x)
+{
+ g_return_if_fail (LD_IS_DIAGRAM_VIEW (self));
+
+ /* TODO: Check boundaries. */
+ self->priv->x = x;
+
+ simulate_motion (self);
+ update_adjustments (self);
+ gtk_widget_queue_draw (GTK_WIDGET (self));
+
+ g_object_notify (G_OBJECT (self), "x");
+}
+
+/**
+ * ld_diagram_view_get_x:
+ * @self: an #LdDiagramView object.
+ *
+ * Return value: the X coordinate of the center of view.
+ */
+gdouble
+ld_diagram_view_get_y (LdDiagramView *self)
+{
+ g_return_val_if_fail (LD_IS_DIAGRAM_VIEW (self), 0);
+ return self->priv->y;
+}
+
+/**
+ * ld_diagram_view_set_y:
+ * @self: an #LdDiagramView object.
+ *
+ * Set the Y coordinate of the center of view.
+ */
+void
+ld_diagram_view_set_y (LdDiagramView *self, gdouble y)
+{
+ g_return_if_fail (LD_IS_DIAGRAM_VIEW (self));
+
+ /* TODO: Check boundaries. */
+ self->priv->y = y;
+
+ simulate_motion (self);
+ update_adjustments (self);
+ gtk_widget_queue_draw (GTK_WIDGET (self));
+
+ g_object_notify (G_OBJECT (self), "y");
+}
+
/**
* ld_diagram_view_get_zoom:
* @self: an #LdDiagramView object.
@@ -1121,10 +1210,14 @@ move_selection (LdDiagramView *self, gdouble dx, gdouble dy)
{
gdouble x, y;
+ queue_object_draw (self, iter->data);
g_object_get (iter->data, "x", &x, "y", &y, NULL);
+
x += dx;
y += dy;
+
g_object_set (iter->data, "x", x, "y", y, NULL);
+ queue_object_draw (self, iter->data);
}
ld_diagram_end_user_action (diagram);
}
@@ -2078,10 +2171,9 @@ on_scroll (GtkWidget *widget, GdkEventScroll *event, gpointer user_data)
event->x, event->y, &new_x, &new_y);
/* Focus on the point under the cursor. */
- self->priv->x += prev_x - new_x;
- self->priv->y += prev_y - new_y;
+ ld_diagram_view_set_x (self, self->priv->x + prev_x - new_x);
+ ld_diagram_view_set_y (self, self->priv->y + prev_y - new_y);
- check_terminals (self, &point);
return TRUE;
}
diff --git a/liblogdiag/ld-diagram-view.h b/liblogdiag/ld-diagram-view.h
index dacb594..8ba9fc1 100644
--- a/liblogdiag/ld-diagram-view.h
+++ b/liblogdiag/ld-diagram-view.h
@@ -78,6 +78,11 @@ void ld_diagram_view_widget_to_diagram_coords (LdDiagramView *self,
void ld_diagram_view_diagram_to_widget_coords (LdDiagramView *self,
gdouble dx, gdouble dy, gdouble *wx, gdouble *wy);
+gdouble ld_diagram_view_get_x (LdDiagramView *self);
+void ld_diagram_view_set_x (LdDiagramView *self, gdouble x);
+gdouble ld_diagram_view_get_y (LdDiagramView *self);
+void ld_diagram_view_set_y (LdDiagramView *self, gdouble y);
+
gdouble ld_diagram_view_get_zoom (LdDiagramView *self);
void ld_diagram_view_set_zoom (LdDiagramView *self, gdouble zoom);
gboolean ld_diagram_view_can_zoom_in (LdDiagramView *self);
--
cgit v1.2.3-70-g09d2