1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
// This file was generated by gir (https://github.com/gtk-rs/gir)
// from gir-files (https://github.com/gtk-rs/gir-files)
// from gst-gir-files (https://gitlab.freedesktop.org/gstreamer/gir-files-rs.git)
// DO NOT EDIT

use crate::BaseTransitionClip;
use crate::Clip;
use crate::Container;
use crate::Extractable;
use crate::OperationClip;
use crate::TimelineElement;
use crate::VideoStandardTransitionType;
use glib::object::Cast;
use glib::object::IsA;
use glib::signal::connect_raw;
use glib::signal::SignalHandlerId;
use glib::translate::*;
use glib::StaticType;
use glib::ToValue;
use std::boxed::Box as Box_;
use std::mem::transmute;

glib::wrapper! {
    /// Creates an object that mixes together the two underlying objects, A and B.
    /// The A object is assumed to have a higher prioirity (lower number) than the
    /// B object. At the transition in point, only A will be visible, and by the
    /// end only B will be visible.
    ///
    /// The shape of the video transition depends on the value of the "vtype"
    /// property. The default value is "crossfade". For audio, only "crossfade" is
    /// supported.
    ///
    /// The ID of the ExtractableType is the nickname of the vtype property value. Note
    /// that this value can be changed after creation and the GESExtractable.asset value
    /// will be updated when needed.
    ///
    /// # Implements
    ///
    /// [`TransitionClipExt`][trait@crate::prelude::TransitionClipExt], [`BaseTransitionClipExt`][trait@crate::prelude::BaseTransitionClipExt], [`OperationClipExt`][trait@crate::prelude::OperationClipExt], [`ClipExt`][trait@crate::prelude::ClipExt], [`GESContainerExt`][trait@crate::prelude::GESContainerExt], [`TimelineElementExt`][trait@crate::prelude::TimelineElementExt], [`trait@glib::ObjectExt`], [`ExtractableExt`][trait@crate::prelude::ExtractableExt], [`TimelineElementExtManual`][trait@crate::prelude::TimelineElementExtManual]
    #[doc(alias = "GESTransitionClip")]
    pub struct TransitionClip(Object<ffi::GESTransitionClip, ffi::GESTransitionClipClass>) @extends BaseTransitionClip, OperationClip, Clip, Container, TimelineElement, @implements Extractable;

    match fn {
        type_ => || ffi::ges_transition_clip_get_type(),
    }
}

impl TransitionClip {
    /// Creates a new [`TransitionClip`][crate::TransitionClip].
    /// ## `vtype`
    /// the type of transition to create
    ///
    /// # Returns
    ///
    /// a newly created [`TransitionClip`][crate::TransitionClip],
    /// or [`None`] if something went wrong.
    #[doc(alias = "ges_transition_clip_new")]
    pub fn new(vtype: VideoStandardTransitionType) -> Option<TransitionClip> {
        assert_initialized_main_thread!();
        unsafe { from_glib_none(ffi::ges_transition_clip_new(vtype.into_glib())) }
    }

    /// Creates a new [`TransitionClip`][crate::TransitionClip] for the provided `nick`.
    /// ## `nick`
    /// a string representing the type of transition to create
    ///
    /// # Returns
    ///
    /// The newly created [`TransitionClip`][crate::TransitionClip],
    /// or [`None`] if something went wrong
    #[doc(alias = "ges_transition_clip_new_for_nick")]
    #[doc(alias = "new_for_nick")]
    pub fn for_nick(nick: &str) -> Option<TransitionClip> {
        assert_initialized_main_thread!();
        unsafe { from_glib_none(ffi::ges_transition_clip_new_for_nick(nick.to_glib_none().0)) }
    }
}

pub const NONE_TRANSITION_CLIP: Option<&TransitionClip> = None;

/// Trait containing all [`struct@TransitionClip`] methods.
///
/// # Implementors
///
/// [`TransitionClip`][struct@crate::TransitionClip]
pub trait TransitionClipExt: 'static {
    /// a [`VideoStandardTransitionType`][crate::VideoStandardTransitionType] representing the wipe to use
    fn vtype(&self) -> VideoStandardTransitionType;

    /// a [`VideoStandardTransitionType`][crate::VideoStandardTransitionType] representing the wipe to use
    fn set_vtype(&self, vtype: VideoStandardTransitionType);

    #[doc(alias = "vtype")]
    fn connect_vtype_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId;
}

impl<O: IsA<TransitionClip>> TransitionClipExt for O {
    fn vtype(&self) -> VideoStandardTransitionType {
        unsafe {
            let mut value =
                glib::Value::from_type(<VideoStandardTransitionType as StaticType>::static_type());
            glib::gobject_ffi::g_object_get_property(
                self.to_glib_none().0 as *mut glib::gobject_ffi::GObject,
                b"vtype\0".as_ptr() as *const _,
                value.to_glib_none_mut().0,
            );
            value
                .get()
                .expect("Return Value for property `vtype` getter")
        }
    }

    fn set_vtype(&self, vtype: VideoStandardTransitionType) {
        unsafe {
            glib::gobject_ffi::g_object_set_property(
                self.to_glib_none().0 as *mut glib::gobject_ffi::GObject,
                b"vtype\0".as_ptr() as *const _,
                vtype.to_value().to_glib_none().0,
            );
        }
    }

    #[doc(alias = "vtype")]
    fn connect_vtype_notify<F: Fn(&Self) + 'static>(&self, f: F) -> SignalHandlerId {
        unsafe extern "C" fn notify_vtype_trampoline<
            P: IsA<TransitionClip>,
            F: Fn(&P) + 'static,
        >(
            this: *mut ffi::GESTransitionClip,
            _param_spec: glib::ffi::gpointer,
            f: glib::ffi::gpointer,
        ) {
            let f: &F = &*(f as *const F);
            f(&TransitionClip::from_glib_borrow(this).unsafe_cast_ref())
        }
        unsafe {
            let f: Box_<F> = Box_::new(f);
            connect_raw(
                self.as_ptr() as *mut _,
                b"notify::vtype\0".as_ptr() as *const _,
                Some(transmute::<_, unsafe extern "C" fn()>(
                    notify_vtype_trampoline::<Self, F> as *const (),
                )),
                Box_::into_raw(f),
            )
        }
    }
}