From: Andy W. <wi...@us...> - 2002-07-16 05:26:26
|
CVS Root: /cvsroot/gstreamer Module: gst-editor Changes by: wingo Date: Mon Jul 15 2002 22:26:25 PDT Log message: * improve eyecandy on connections * allow disconnections by dragging the connection off the pad * better MVC with connections * don't connect to pads of the same kind * don't show the property palette at the beginning Modified files: libs/gst/editor : gsteditor.c gsteditorconnection.c gsteditorpad.c gsteditorpad.h Links: http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-editor/libs/gst/editor/gsteditor.c.diff?r1=1.15&r2=1.16 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-editor/libs/gst/editor/gsteditorconnection.c.diff?r1=1.9&r2=1.10 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-editor/libs/gst/editor/gsteditorpad.c.diff?r1=1.13&r2=1.14 http://cvs.sf.net/cgi-bin/viewcvs.cgi/gstreamer/gst-editor/libs/gst/editor/gsteditorpad.h.diff?r1=1.7&r2=1.8 ====Begin Diffs==== Index: gsteditor.c =================================================================== RCS file: /cvsroot/gstreamer/gst-editor/libs/gst/editor/gsteditor.c,v retrieving revision 1.15 retrieving revision 1.16 diff -u -d -r1.15 -r1.16 --- gsteditor.c 13 Jul 2002 04:09:37 -0000 1.15 +++ gsteditor.c 16 Jul 2002 05:26:13 -0000 1.16 @@ -135,8 +135,6 @@ GTK_WIDGET (editor->canvas)); editor->need_name = TRUE; - - gst_editor_property_get(); } static void Index: gsteditorconnection.c =================================================================== RCS file: /cvsroot/gstreamer/gst-editor/libs/gst/editor/gsteditorconnection.c,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- gsteditorconnection.c 13 Jul 2002 05:39:26 -0000 1.9 +++ gsteditorconnection.c 16 Jul 2002 05:26:13 -0000 1.10 @@ -10,6 +10,9 @@ GValue *value, GParamSpec *pspec); static void gst_editor_connection_realize (GnomeCanvasItem *citem); +static void gst_editor_connection_on_disconnect (GstEditorConnection *connection, + GstPad *peer, + GstPad *pad); /* events fired by items within self */ /* static gint gst_editor_connection_line_event(GnomeCanvasItem *item, */ @@ -104,10 +107,11 @@ g_return_val_if_fail(GST_IS_EDITOR_PAD(frompad), NULL); /* in the from element's group */ - connection = GST_EDITOR_CONNECTION (gnome_canvas_item_new (GNOME_CANVAS_ITEM (frompad)->parent, - GST_TYPE_EDITOR_CONNECTION, - "from-pad", frompad, - NULL)); + connection = GST_EDITOR_CONNECTION + (gnome_canvas_item_new ((GnomeCanvasGroup*)GNOME_CANVAS_ITEM (frompad)->parent, + GST_TYPE_EDITOR_CONNECTION, + "from-pad", frompad, + NULL)); connection->fromsrc = frompad->issrc; gst_editor_connection_realize (GNOME_CANVAS_ITEM (connection)); @@ -235,8 +239,8 @@ "points", connection->points, "width-units", 2.0, "line-style", GDK_LINE_ON_OFF_DASH, - "first-arrowhead", !connection->fromsrc, - "last-arrowhead", connection->fromsrc, + "first-arrowhead", connection->fromsrc, + "last-arrowhead", !connection->fromsrc, "arrow-shape-a", 5.0, "arrow-shape-b", 5.0, "arrow-shape-c", 5.0, @@ -288,10 +292,12 @@ gnome_canvas_item_w2i (GNOME_CANVAS_ITEM (connection->frompad)->parent, &x2, &y2); } - connection->points->coords[0] = x1; - connection->points->coords[1] = y1; - connection->points->coords[2] = x2; - connection->points->coords[3] = y2; + /* we do this in reverse so that with dot-dash lines it gives the illusion of + pulling out a rope from the element */ + connection->points->coords[2] = x1; + connection->points->coords[3] = y1; + connection->points->coords[0] = x2; + connection->points->coords[1] = y2; gnome_canvas_item_set (GNOME_CANVAS_ITEM (connection), "points", connection->points, NULL); } @@ -364,11 +370,11 @@ if (GST_IS_EDITOR_PAD_ALWAYS (connection->frompad)) { if (GST_IS_EDITOR_PAD_ALWAYS (connection->topad)) { if (GST_PAD_PEER (from) || GST_PAD_PEER (to)) { - if (GST_PAD_PEER (from) != to) { + if (GST_PAD_PEER (from) != (GstPad*)to) { g_warning ("The from pad is connected, but not to the to pad"); goto error; } - if (GST_PAD_PEER (to) != from) { + if (GST_PAD_PEER (to) != (GstPad*)from) { g_warning ("The to pad is connected, but not to the from pad"); goto error; } @@ -423,11 +429,17 @@ if (gst_pad_connect(frompad, topad)) { connected: - gnome_canvas_item_set (connection, "line-style", GDK_LINE_SOLID, NULL); + gnome_canvas_item_set (GNOME_CANVAS_ITEM (connection), "line-style", + GDK_LINE_SOLID, NULL); + g_signal_connect (GNOME_CANVAS_ITEM (connection->topad)->parent, "position-changed", G_CALLBACK (on_element_position_changed), G_OBJECT (connection)); g_signal_connect (GNOME_CANVAS_ITEM (connection->frompad)->parent, "position-changed", G_CALLBACK (on_element_position_changed), G_OBJECT (connection)); + + g_signal_connect_swapped (frompad, "disconnected", + G_CALLBACK (gst_editor_connection_on_disconnect), connection); + g_message ("connection successful"); return TRUE; } @@ -442,3 +454,19 @@ GST_EDITOR_PAD (connection->topad)->connection = NULL; return FALSE; } + +static void +gst_editor_connection_on_disconnect (GstEditorConnection *connection, GstPad *peer, + GstPad *pad) +{ + g_message ("disconnect %s:%s from %s:%s", GST_DEBUG_PAD_NAME (pad), GST_DEBUG_PAD_NAME (peer)); + GST_EDITOR_PAD (connection->frompad)->connection = NULL; + GST_EDITOR_PAD (connection->topad)->connection = NULL; + connection->frompad = NULL; + connection->topad = NULL; + /* i have bad luck with actually killing the GCI's */ + gnome_canvas_item_hide (GNOME_CANVAS_ITEM (connection)); + + g_signal_handlers_disconnect_by_func (pad, gst_editor_connection_on_disconnect, connection); +} + Index: gsteditorpad.c =================================================================== RCS file: /cvsroot/gstreamer/gst-editor/libs/gst/editor/gsteditorpad.c,v retrieving revision 1.13 retrieving revision 1.14 diff -u -d -r1.13 -r1.14 --- gsteditorpad.c 13 Jul 2002 05:39:26 -0000 1.13 +++ gsteditorpad.c 16 Jul 2002 05:26:13 -0000 1.14 @@ -41,6 +41,7 @@ static void gst_editor_pad_connection_drag (GstEditorPad *pad, gdouble wx, gdouble wy); static void gst_editor_pad_connection_start (GstEditorPad *pad); +static void gst_editor_pad_disconnect (GstEditorPad *pad); enum { @@ -329,15 +330,20 @@ switch(event->type) { case GDK_ENTER_NOTIFY: - g_object_set (G_OBJECT (item->border), + gnome_canvas_item_set (GNOME_CANVAS_ITEM (item->border), "fill_color_rgba", 0xBBDDBB00, NULL); break; case GDK_LEAVE_NOTIFY: - g_object_set (G_OBJECT (item->border), + gnome_canvas_item_set (GNOME_CANVAS_ITEM (item->border), "fill_color_rgba", item->fill_color, NULL); + if (pad->disconnecting) + gst_editor_pad_disconnect (pad); break; case GDK_BUTTON_PRESS: - gst_editor_pad_connection_start (pad); + if (!pad->connection) + gst_editor_pad_connection_start (pad); + else + pad->disconnecting = TRUE; return TRUE; break; case GDK_BUTTON_RELEASE: @@ -352,6 +358,9 @@ } pad->connecting = FALSE; return TRUE; + } else if (pad->disconnecting) { + pad->disconnecting = FALSE; + return TRUE; } break; case GDK_MOTION_NOTIFY: @@ -370,26 +379,66 @@ } static void -gst_editor_pad_connection_start (GstEditorPad *pad) +gst_editor_pad_disconnect (GstEditorPad *pad) { GdkCursor *cursor; - + GstEditorConnection *connection; + GstPad *pad1 = NULL, *pad2 = NULL; + GstEditorPad *otherpad; + g_return_if_fail (GST_IS_EDITOR_PAD (pad)); + g_return_if_fail (pad->connection != NULL); + g_return_if_fail (pad->disconnecting == TRUE); - if (pad->connection) { - g_warning ("disconnection not yet implemented"); - } else { - pad->connection = gst_editor_connection_new (pad); + connection = pad->connection; + pad->disconnecting = FALSE; - cursor = gdk_cursor_new (GDK_SB_RIGHT_ARROW); + g_object_get (pad, "object", &pad1, NULL); + pad2 = GST_PAD_PEER (pad1); + if ((GstEditorPad*)connection->frompad == pad) + otherpad = (GstEditorPad*)connection->topad; + else + otherpad = (GstEditorPad*)connection->frompad; + + gst_pad_disconnect (pad1, pad2); - gnome_canvas_item_grab (GNOME_CANVAS_ITEM (pad), - GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, - cursor, - GDK_CURRENT_TIME); + /* yay mvc */ + /* potential threadsafety issues here, can't assume that the signal has + * already been handled. you might not even be able to assume you can + * disconnect the pads. maybe the pipeline should only be modifyable in + * PAUSED? */ + /* 'connection' is now invalid */ - pad->connecting = TRUE; - } + otherpad->connection = gst_editor_connection_new (otherpad); + + cursor = gdk_cursor_new (GDK_HAND2); + + gnome_canvas_item_grab (GNOME_CANVAS_ITEM (otherpad), + GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, + cursor, + GDK_CURRENT_TIME); + + otherpad->connecting = TRUE; +} + +static void +gst_editor_pad_connection_start (GstEditorPad *pad) +{ + GdkCursor *cursor; + + g_return_if_fail (GST_IS_EDITOR_PAD (pad)); + g_return_if_fail (pad->connection == NULL); + + pad->connection = gst_editor_connection_new (pad); + + cursor = gdk_cursor_new (GDK_HAND2); + + gnome_canvas_item_grab (GNOME_CANVAS_ITEM (pad), + GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK, + cursor, + GDK_CURRENT_TIME); + + pad->connecting = TRUE; } static void @@ -411,7 +460,9 @@ if (under && GST_IS_EDITOR_PAD (under)) destpad = GST_EDITOR_PAD (under); - if (destpad && destpad != pad && (!destpad->connection || destpad->connection == pad->connection)) + if (destpad && destpad != pad && + (!destpad->connection || destpad->connection == pad->connection) && + destpad->issrc != pad->issrc) gst_editor_connection_set_endpad (pad->connection, destpad); else gst_editor_connection_set_endpoint (pad->connection, wx, wy); Index: gsteditorpad.h =================================================================== RCS file: /cvsroot/gstreamer/gst-editor/libs/gst/editor/gsteditorpad.h,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- gsteditorpad.h 17 Jun 2002 04:28:12 -0000 1.7 +++ gsteditorpad.h 16 Jul 2002 05:26:13 -0000 1.8 @@ -71,6 +71,7 @@ gdouble dragx, dragy; gboolean connecting; + gboolean disconnecting; }; struct _GstEditorPadClass { |