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
// 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::MetaContainer;
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], [`MetaContainerExt`][trait@crate::prelude::MetaContainerExt], [`TimelineElementExtManual`][trait@crate::prelude::TimelineElementExtManual]
    #[doc(alias = "GESTransitionClip")]
    pub struct TransitionClip(Object<ffi::GESTransitionClip, ffi::GESTransitionClipClass>) @extends BaseTransitionClip, OperationClip, Clip, Container, TimelineElement, @implements Extractable, MetaContainer;

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

impl TransitionClip {
    pub const NONE: Option<&'static TransitionClip> = None;

    /// 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)) }
    }
}

/// 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 {
        glib::ObjectExt::property(self.as_ref(), "vtype")
    }

    fn set_vtype(&self, vtype: VideoStandardTransitionType) {
        glib::ObjectExt::set_property(self.as_ref(), "vtype", &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),
            )
        }
    }
}