mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-02 04:22:27 +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 */
|
||||
GtkWidget *main_window;
|
||||
GtkWidget *add_effect_dlg;
|
||||
GtkWidget *properties;
|
||||
GtkWidget *filesource_properties;
|
||||
GtkWidget *text_properties;
|
||||
GtkWidget *generic_duration;
|
||||
GtkWidget *background_properties;
|
||||
GtkWidget *audio_effect_entry;
|
||||
GtkWidget *video_effect_entry;
|
||||
|
||||
GtkHScale *duration;
|
||||
GtkHScale *in_point;
|
||||
GtkHScale *volume;
|
||||
|
||||
GtkAction *add_file;
|
||||
GtkAction *add_effect;
|
||||
GtkAction *add_test;
|
||||
GtkAction *add_title;
|
||||
GtkAction *add_transition;
|
||||
|
@ -113,6 +117,7 @@ void play_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_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_text_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 background_type_changed_cb (GtkComboBox * 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
|
||||
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.
|
||||
*/
|
||||
|
||||
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
|
||||
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->text_properties, "text_properties", 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->in_point, "in_point_scale", GTK_HSCALE);
|
||||
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_renderer, "duration_renderer", GTK_CELL_RENDERER);
|
||||
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_test, "add_test", 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
|
||||
app_move_selected_down (App * app)
|
||||
{
|
||||
|
@ -1343,6 +1434,12 @@ delete_activate_cb (GtkAction * item, App * app)
|
|||
app_delete_objects (app, objects);
|
||||
}
|
||||
|
||||
void
|
||||
add_effect_activate_cb (GtkAction * item, App * app)
|
||||
{
|
||||
gtk_widget_show_all (app->add_effect_dlg);
|
||||
}
|
||||
|
||||
void
|
||||
add_file_activate_cb (GtkAction * item, App * app)
|
||||
{
|
||||
|
@ -1437,6 +1534,7 @@ app_selection_changed_cb (GtkTreeSelection * selection, App * app)
|
|||
app_update_selection (app);
|
||||
|
||||
update_delete_sensitivity (app);
|
||||
update_effect_sensitivity (app);
|
||||
update_add_transition_sensitivity (app);
|
||||
update_move_up_down_sensitivity (app);
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<?xml version="1.0"?>
|
||||
<interface>
|
||||
<requires lib="gtk+" version="2.16"/>
|
||||
<!-- interface-naming-policy project-wide -->
|
||||
|
@ -229,6 +229,13 @@
|
|||
<property name="use_stock">True</property>
|
||||
</object>
|
||||
</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>
|
||||
</child>
|
||||
</object>
|
||||
|
@ -370,6 +377,19 @@
|
|||
<property name="homogeneous">True</property>
|
||||
</packing>
|
||||
</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>
|
||||
<object class="GtkSeparatorToolItem" id="toolbutton7">
|
||||
<property name="visible">True</property>
|
||||
|
@ -528,7 +548,7 @@
|
|||
<object class="GtkEntry" id="seconds">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="invisible_char">●</property>
|
||||
<property name="invisible_char">●</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="position">1</property>
|
||||
|
@ -700,7 +720,7 @@
|
|||
<object class="GtkSpinButton" id="frequency">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="invisible_char">●</property>
|
||||
<property name="invisible_char">●</property>
|
||||
<property name="adjustment">adjustment2</property>
|
||||
<signal name="value_changed" handler="frequency_value_changed_cb"/>
|
||||
</object>
|
||||
|
@ -772,7 +792,7 @@
|
|||
<object class="GtkEntry" id="text">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="invisible_char">●</property>
|
||||
<property name="invisible_char">●</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="position">1</property>
|
||||
|
@ -869,18 +889,142 @@
|
|||
</child>
|
||||
</object>
|
||||
<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">
|
||||
<widgets>
|
||||
<widget name="label6"/>
|
||||
<widget name="label5"/>
|
||||
<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="label_inpoint"/>
|
||||
<widget name="label_duration"/>
|
||||
<widget name="label_duration"/>
|
||||
<widget name="label_inpoint"/>
|
||||
<widget name="label3"/>
|
||||
<widget name="label4"/>
|
||||
<widget name="label5"/>
|
||||
<widget name="label6"/>
|
||||
</widgets>
|
||||
</object>
|
||||
<object class="GtkAction" id="delete">
|
||||
|
@ -975,4 +1119,11 @@
|
|||
<property name="active">True</property>
|
||||
<signal name="activate" handler="video_track_activate_cb"/>
|
||||
</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>
|
||||
|
|
Loading…
Reference in a new issue