mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-05 06:58:56 +00:00
ges-ui: add effects
This commit is contained in:
parent
a1f11bed79
commit
3b13d0fee0
2 changed files with 260 additions and 11 deletions
|
@ -62,17 +62,21 @@ typedef struct App
|
||||||
|
|
||||||
/* widgets */
|
/* widgets */
|
||||||
GtkWidget *main_window;
|
GtkWidget *main_window;
|
||||||
|
GtkWidget *add_effect_dlg;
|
||||||
GtkWidget *properties;
|
GtkWidget *properties;
|
||||||
GtkWidget *filesource_properties;
|
GtkWidget *filesource_properties;
|
||||||
GtkWidget *text_properties;
|
GtkWidget *text_properties;
|
||||||
GtkWidget *generic_duration;
|
GtkWidget *generic_duration;
|
||||||
GtkWidget *background_properties;
|
GtkWidget *background_properties;
|
||||||
|
GtkWidget *audio_effect_entry;
|
||||||
|
GtkWidget *video_effect_entry;
|
||||||
|
|
||||||
GtkHScale *duration;
|
GtkHScale *duration;
|
||||||
GtkHScale *in_point;
|
GtkHScale *in_point;
|
||||||
GtkHScale *volume;
|
GtkHScale *volume;
|
||||||
|
|
||||||
GtkAction *add_file;
|
GtkAction *add_file;
|
||||||
|
GtkAction *add_effect;
|
||||||
GtkAction *add_test;
|
GtkAction *add_test;
|
||||||
GtkAction *add_title;
|
GtkAction *add_title;
|
||||||
GtkAction *add_transition;
|
GtkAction *add_transition;
|
||||||
|
@ -113,6 +117,7 @@ void play_activate_cb (GtkAction * item, App * app);
|
||||||
void stop_activate_cb (GtkAction * item, App * app);
|
void stop_activate_cb (GtkAction * item, App * app);
|
||||||
void move_up_activate_cb (GtkAction * item, App * app);
|
void move_up_activate_cb (GtkAction * item, App * app);
|
||||||
void move_down_activate_cb (GtkAction * item, App * app);
|
void move_down_activate_cb (GtkAction * item, App * app);
|
||||||
|
void add_effect_activate_cb (GtkAction * item, App * app);
|
||||||
void add_file_activate_cb (GtkAction * item, App * app);
|
void add_file_activate_cb (GtkAction * item, App * app);
|
||||||
void add_text_activate_cb (GtkAction * item, App * app);
|
void add_text_activate_cb (GtkAction * item, App * app);
|
||||||
void add_test_activate_cb (GtkAction * item, App * app);
|
void add_test_activate_cb (GtkAction * item, App * app);
|
||||||
|
@ -124,6 +129,10 @@ void halign_changed_cb (GtkComboBox * widget, App * app);
|
||||||
void valign_changed_cb (GtkComboBox * widget, App * app);
|
void valign_changed_cb (GtkComboBox * widget, App * app);
|
||||||
void background_type_changed_cb (GtkComboBox * widget, App * app);
|
void background_type_changed_cb (GtkComboBox * widget, App * app);
|
||||||
void frequency_value_changed_cb (GtkSpinButton * widget, App * app);
|
void frequency_value_changed_cb (GtkSpinButton * widget, App * app);
|
||||||
|
void on_apply_effect_cb (GtkButton * button, App * app);
|
||||||
|
void on_cancel_add_effect_cb (GtkButton * button, App * app);
|
||||||
|
gboolean add_effect_dlg_delete_event_cb (GtkWidget * widget, GdkEvent * event,
|
||||||
|
gpointer * app);
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
duration_scale_change_value_cb (GtkRange * range,
|
duration_scale_change_value_cb (GtkRange * range,
|
||||||
|
@ -143,6 +152,25 @@ volume_change_value_cb (GtkRange * range,
|
||||||
* Update properties of UI elements that depend on more than one thing.
|
* Update properties of UI elements that depend on more than one thing.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
static void
|
||||||
|
update_effect_sensitivity (App * app)
|
||||||
|
{
|
||||||
|
GList *i;
|
||||||
|
gboolean ok = TRUE;
|
||||||
|
|
||||||
|
/* effects will work for multiple FileSource */
|
||||||
|
for (i = app->selected_objects; i; i = i->next) {
|
||||||
|
if (!GES_IS_TIMELINE_FILE_SOURCE (i->data)) {
|
||||||
|
ok = FALSE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
gtk_action_set_sensitive (app->add_effect,
|
||||||
|
ok && (app->n_selected > 0) && (app->state != GST_STATE_PLAYING)
|
||||||
|
&& (app->state != GST_STATE_PAUSED));
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
update_delete_sensitivity (App * app)
|
update_delete_sensitivity (App * app)
|
||||||
{
|
{
|
||||||
|
@ -802,6 +830,9 @@ create_ui (App * app)
|
||||||
GET_WIDGET (app->filesource_properties, "filesource_properties", GTK_WIDGET);
|
GET_WIDGET (app->filesource_properties, "filesource_properties", GTK_WIDGET);
|
||||||
GET_WIDGET (app->text_properties, "text_properties", GTK_WIDGET);
|
GET_WIDGET (app->text_properties, "text_properties", GTK_WIDGET);
|
||||||
GET_WIDGET (app->main_window, "window", GTK_WIDGET);
|
GET_WIDGET (app->main_window, "window", GTK_WIDGET);
|
||||||
|
GET_WIDGET (app->add_effect_dlg, "add_effect_dlg", GTK_WIDGET);
|
||||||
|
GET_WIDGET (app->audio_effect_entry, "entry1", GTK_WIDGET);
|
||||||
|
GET_WIDGET (app->video_effect_entry, "entry2", GTK_WIDGET);
|
||||||
GET_WIDGET (app->duration, "duration_scale", GTK_HSCALE);
|
GET_WIDGET (app->duration, "duration_scale", GTK_HSCALE);
|
||||||
GET_WIDGET (app->in_point, "in_point_scale", GTK_HSCALE);
|
GET_WIDGET (app->in_point, "in_point_scale", GTK_HSCALE);
|
||||||
GET_WIDGET (app->halign, "halign", GTK_COMBO_BOX);
|
GET_WIDGET (app->halign, "halign", GTK_COMBO_BOX);
|
||||||
|
@ -810,6 +841,7 @@ create_ui (App * app)
|
||||||
GET_WIDGET (duration_col, "duration_column", GTK_TREE_VIEW_COLUMN);
|
GET_WIDGET (duration_col, "duration_column", GTK_TREE_VIEW_COLUMN);
|
||||||
GET_WIDGET (duration_renderer, "duration_renderer", GTK_CELL_RENDERER);
|
GET_WIDGET (duration_renderer, "duration_renderer", GTK_CELL_RENDERER);
|
||||||
GET_WIDGET (app->add_file, "add_file", GTK_ACTION);
|
GET_WIDGET (app->add_file, "add_file", GTK_ACTION);
|
||||||
|
GET_WIDGET (app->add_effect, "add_effect", GTK_ACTION);
|
||||||
GET_WIDGET (app->add_title, "add_text", GTK_ACTION);
|
GET_WIDGET (app->add_title, "add_text", GTK_ACTION);
|
||||||
GET_WIDGET (app->add_test, "add_test", GTK_ACTION);
|
GET_WIDGET (app->add_test, "add_test", GTK_ACTION);
|
||||||
GET_WIDGET (app->add_transition, "add_transition", GTK_ACTION);
|
GET_WIDGET (app->add_transition, "add_transition", GTK_ACTION);
|
||||||
|
@ -1026,6 +1058,65 @@ app_move_selected_up (App * app)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
app_add_effect_on_selected_clips (App * app, const gchar * bin_desc,
|
||||||
|
GESTrackType type)
|
||||||
|
{
|
||||||
|
GList *objects, *tmp;
|
||||||
|
GESTrackObject *effect = NULL;
|
||||||
|
|
||||||
|
/* No crash if the video is playing */
|
||||||
|
gst_element_set_state (GST_ELEMENT (app->pipeline), GST_STATE_PAUSED);
|
||||||
|
objects = ges_timeline_layer_get_objects (app->layer);
|
||||||
|
|
||||||
|
for (tmp = objects; tmp; tmp = tmp->next) {
|
||||||
|
effect = GES_TRACK_OBJECT (ges_track_parse_launch_effect_new (bin_desc));
|
||||||
|
ges_timeline_object_add_track_object (GES_TIMELINE_OBJECT (tmp->data),
|
||||||
|
effect);
|
||||||
|
|
||||||
|
if (type == GES_TRACK_TYPE_VIDEO)
|
||||||
|
ges_track_add_object (app->video_track, effect);
|
||||||
|
else if (type == GES_TRACK_TYPE_AUDIO)
|
||||||
|
ges_track_add_object (app->audio_track, effect);
|
||||||
|
|
||||||
|
g_object_unref (tmp->data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
add_effect_dlg_delete_event_cb (GtkWidget * widget, GdkEvent * event,
|
||||||
|
gpointer * app)
|
||||||
|
{
|
||||||
|
gtk_widget_hide_all (((App *) app)->add_effect_dlg);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
on_cancel_add_effect_cb (GtkButton * button, App * app)
|
||||||
|
{
|
||||||
|
gtk_widget_hide_all (app->add_effect_dlg);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
on_apply_effect_cb (GtkButton * button, App * app)
|
||||||
|
{
|
||||||
|
const gchar *effect;
|
||||||
|
|
||||||
|
effect = gtk_entry_get_text (GTK_ENTRY (app->video_effect_entry));
|
||||||
|
if (g_strcmp0 (effect, ""))
|
||||||
|
app_add_effect_on_selected_clips (app, effect, GES_TRACK_TYPE_VIDEO);
|
||||||
|
|
||||||
|
gtk_entry_set_text (GTK_ENTRY (app->video_effect_entry), "");
|
||||||
|
|
||||||
|
effect = gtk_entry_get_text (GTK_ENTRY (app->audio_effect_entry));
|
||||||
|
if (g_strcmp0 (effect, ""))
|
||||||
|
app_add_effect_on_selected_clips (app, effect, GES_TRACK_TYPE_AUDIO);
|
||||||
|
|
||||||
|
gtk_entry_set_text (GTK_ENTRY (app->audio_effect_entry), "");
|
||||||
|
|
||||||
|
gtk_widget_hide_all (app->add_effect_dlg);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
app_move_selected_down (App * app)
|
app_move_selected_down (App * app)
|
||||||
{
|
{
|
||||||
|
@ -1343,6 +1434,12 @@ delete_activate_cb (GtkAction * item, App * app)
|
||||||
app_delete_objects (app, objects);
|
app_delete_objects (app, objects);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
add_effect_activate_cb (GtkAction * item, App * app)
|
||||||
|
{
|
||||||
|
gtk_widget_show_all (app->add_effect_dlg);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
add_file_activate_cb (GtkAction * item, App * app)
|
add_file_activate_cb (GtkAction * item, App * app)
|
||||||
{
|
{
|
||||||
|
@ -1437,6 +1534,7 @@ app_selection_changed_cb (GtkTreeSelection * selection, App * app)
|
||||||
app_update_selection (app);
|
app_update_selection (app);
|
||||||
|
|
||||||
update_delete_sensitivity (app);
|
update_delete_sensitivity (app);
|
||||||
|
update_effect_sensitivity (app);
|
||||||
update_add_transition_sensitivity (app);
|
update_add_transition_sensitivity (app);
|
||||||
update_move_up_down_sensitivity (app);
|
update_move_up_down_sensitivity (app);
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0"?>
|
||||||
<interface>
|
<interface>
|
||||||
<requires lib="gtk+" version="2.16"/>
|
<requires lib="gtk+" version="2.16"/>
|
||||||
<!-- interface-naming-policy project-wide -->
|
<!-- interface-naming-policy project-wide -->
|
||||||
|
@ -229,6 +229,13 @@
|
||||||
<property name="use_stock">True</property>
|
<property name="use_stock">True</property>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkMenuItem" id="add_effect_item">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="related_action">add_effect</property>
|
||||||
|
<property name="use_action_appearance">True</property>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
</object>
|
</object>
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
|
@ -370,6 +377,19 @@
|
||||||
<property name="homogeneous">True</property>
|
<property name="homogeneous">True</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkToolButton" id="add_button1">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="related_action">add_effect</property>
|
||||||
|
<property name="use_action_appearance">True</property>
|
||||||
|
<property name="label" translatable="yes">File</property>
|
||||||
|
<property name="use_underline">True</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="homogeneous">True</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkSeparatorToolItem" id="toolbutton7">
|
<object class="GtkSeparatorToolItem" id="toolbutton7">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
|
@ -528,7 +548,7 @@
|
||||||
<object class="GtkEntry" id="seconds">
|
<object class="GtkEntry" id="seconds">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">True</property>
|
<property name="can_focus">True</property>
|
||||||
<property name="invisible_char">●</property>
|
<property name="invisible_char">●</property>
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="position">1</property>
|
<property name="position">1</property>
|
||||||
|
@ -700,7 +720,7 @@
|
||||||
<object class="GtkSpinButton" id="frequency">
|
<object class="GtkSpinButton" id="frequency">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">True</property>
|
<property name="can_focus">True</property>
|
||||||
<property name="invisible_char">●</property>
|
<property name="invisible_char">●</property>
|
||||||
<property name="adjustment">adjustment2</property>
|
<property name="adjustment">adjustment2</property>
|
||||||
<signal name="value_changed" handler="frequency_value_changed_cb"/>
|
<signal name="value_changed" handler="frequency_value_changed_cb"/>
|
||||||
</object>
|
</object>
|
||||||
|
@ -772,7 +792,7 @@
|
||||||
<object class="GtkEntry" id="text">
|
<object class="GtkEntry" id="text">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can_focus">True</property>
|
<property name="can_focus">True</property>
|
||||||
<property name="invisible_char">●</property>
|
<property name="invisible_char">●</property>
|
||||||
</object>
|
</object>
|
||||||
<packing>
|
<packing>
|
||||||
<property name="position">1</property>
|
<property name="position">1</property>
|
||||||
|
@ -869,18 +889,142 @@
|
||||||
</child>
|
</child>
|
||||||
</object>
|
</object>
|
||||||
<object class="GtkTreeSelection" id="selection"/>
|
<object class="GtkTreeSelection" id="selection"/>
|
||||||
|
<object class="GtkDialog" id="add_effect_dlg">
|
||||||
|
<property name="border_width">5</property>
|
||||||
|
<property name="title" translatable="yes">Add effects</property>
|
||||||
|
<property name="window_position">center-always</property>
|
||||||
|
<property name="type_hint">dialog</property>
|
||||||
|
<signal name="delete_event" handler="add_effect_dlg_delete_event_cb"/>
|
||||||
|
<child internal-child="vbox">
|
||||||
|
<object class="GtkVBox" id="dialog-vbox1">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="orientation">vertical</property>
|
||||||
|
<property name="spacing">2</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkVBox" id="vbox3">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="orientation">vertical</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkHBox" id="hbox6">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="label9">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="label" translatable="yes">Audio effects bin description</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="position">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkEntry" id="entry1">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="invisible_char">●</property>
|
||||||
|
<signal name="activate" handler="on_apply_effect_cb"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="position">1</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="position">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkHBox" id="hbox7">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="label10">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="label" translatable="yes">Video effects bin desciption:</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="position">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkEntry" id="entry2">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="invisible_char">●</property>
|
||||||
|
<signal name="activate" handler="on_apply_effect_cb"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="position">1</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="position">1</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="position">1</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child internal-child="action_area">
|
||||||
|
<object class="GtkHButtonBox" id="dialog-action_area1">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="layout_style">end</property>
|
||||||
|
<child>
|
||||||
|
<object class="GtkButton" id="button2">
|
||||||
|
<property name="label">gtk-cancel</property>
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="receives_default">True</property>
|
||||||
|
<property name="use_stock">True</property>
|
||||||
|
<signal name="clicked" handler="on_cancel_add_effect_cb"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">False</property>
|
||||||
|
<property name="position">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkButton" id="button1">
|
||||||
|
<property name="label">gtk-apply</property>
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">True</property>
|
||||||
|
<property name="receives_default">True</property>
|
||||||
|
<property name="use_stock">True</property>
|
||||||
|
<signal name="clicked" handler="on_apply_effect_cb"/>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="fill">False</property>
|
||||||
|
<property name="position">1</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="expand">False</property>
|
||||||
|
<property name="pack_type">end</property>
|
||||||
|
<property name="position">0</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<action-widgets>
|
||||||
|
<action-widget response="0">button2</action-widget>
|
||||||
|
<action-widget response="0">button1</action-widget>
|
||||||
|
</action-widgets>
|
||||||
|
</object>
|
||||||
<object class="GtkSizeGroup" id="LabelSizeGroup">
|
<object class="GtkSizeGroup" id="LabelSizeGroup">
|
||||||
<widgets>
|
<widgets>
|
||||||
<widget name="label6"/>
|
|
||||||
<widget name="label5"/>
|
|
||||||
<widget name="label4"/>
|
<widget name="label4"/>
|
||||||
<widget name="label3"/>
|
<widget name="label_inpoint"/>
|
||||||
|
<widget name="label_duration"/>
|
||||||
|
<widget name="label_duration"/>
|
||||||
|
<widget name="label_inpoint"/>
|
||||||
<widget name="label2"/>
|
<widget name="label2"/>
|
||||||
<widget name="label_inpoint"/>
|
<widget name="label3"/>
|
||||||
<widget name="label_duration"/>
|
|
||||||
<widget name="label_duration"/>
|
|
||||||
<widget name="label_inpoint"/>
|
|
||||||
<widget name="label4"/>
|
<widget name="label4"/>
|
||||||
|
<widget name="label5"/>
|
||||||
|
<widget name="label6"/>
|
||||||
</widgets>
|
</widgets>
|
||||||
</object>
|
</object>
|
||||||
<object class="GtkAction" id="delete">
|
<object class="GtkAction" id="delete">
|
||||||
|
@ -975,4 +1119,11 @@
|
||||||
<property name="active">True</property>
|
<property name="active">True</property>
|
||||||
<signal name="activate" handler="video_track_activate_cb"/>
|
<signal name="activate" handler="video_track_activate_cb"/>
|
||||||
</object>
|
</object>
|
||||||
|
<object class="GtkAction" id="add_effect">
|
||||||
|
<property name="label">Add effect...</property>
|
||||||
|
<property name="short_label">Effect</property>
|
||||||
|
<property name="icon_name">face-smile</property>
|
||||||
|
<property name="always_show_image">True</property>
|
||||||
|
<signal name="activate" handler="add_effect_activate_cb"/>
|
||||||
|
</object>
|
||||||
</interface>
|
</interface>
|
||||||
|
|
Loading…
Reference in a new issue