Commit 1c3b344b authored by Bilal Elmoussaoui's avatar Bilal Elmoussaoui

hide the video at start and animate it when the player starts

parent 81dc8443
...@@ -11,6 +11,15 @@ ...@@ -11,6 +11,15 @@
font-weight: 400; font-weight: 400;
font-size: 12pt; font-size: 12pt;
} }
.video {
opacity: 0;
}
.video.playing {
opacity: 1;
transition-property: opacity;
transition-duration: 250ms;
transition-timing-function: ease-in-out;
}
.last-page { .last-page {
background-color: #4a86cf; /*GNOME blue*/ background-color: #4a86cf; /*GNOME blue*/
......
...@@ -3,23 +3,69 @@ use crate::config; ...@@ -3,23 +3,69 @@ use crate::config;
use gettextrs::gettext; use gettextrs::gettext;
#[cfg(feature = "video")] #[cfg(feature = "video")]
use gio::FileExt; use gio::FileExt;
#[cfg(feature = "video")]
use glib::{Receiver, Sender};
use gtk::prelude::*; use gtk::prelude::*;
#[cfg(feature = "video")]
use std::cell::RefCell;
#[derive(PartialEq)]
#[cfg(feature = "video")]
pub enum Action {
VideoReady,
}
pub struct WelcomePageWidget { pub struct WelcomePageWidget {
pub widget: libhandy::WindowHandle, pub widget: libhandy::WindowHandle,
#[cfg(feature = "video")]
player: gst_player::Player,
#[cfg(feature = "video")]
receiver: RefCell<Option<Receiver<Action>>>,
#[cfg(feature = "video")]
sender: Sender<Action>,
} }
impl WelcomePageWidget { impl WelcomePageWidget {
pub fn new() -> Self { pub fn new() -> Self {
let widget = libhandy::WindowHandle::new(); let widget = libhandy::WindowHandle::new();
let welcome_page = Self { widget };
#[cfg(feature = "video")]
let player = {
let dispatcher = gst_player::PlayerGMainContextSignalDispatcher::new(None);
let sink = gst::ElementFactory::make("gtksink", None).expect("Missing dependency: element gtksink is needed (usually, in gstreamer-plugins-good or in gst-plugin-gtk).");
let renderer = gst_player::PlayerVideoOverlayVideoRenderer::with_sink(&sink).upcast();
gst_player::Player::new(Some(&renderer), Some(&dispatcher.upcast::<gst_player::PlayerSignalDispatcher>()))
};
#[cfg(feature = "video")]
let (sender, r) = glib::MainContext::channel(glib::PRIORITY_DEFAULT);
#[cfg(feature = "video")]
let receiver = RefCell::new(Some(r));
let welcome_page = Self {
widget,
#[cfg(feature = "video")]
player,
#[cfg(feature = "video")]
sender,
#[cfg(feature = "video")]
receiver,
};
welcome_page.init(); welcome_page.init();
welcome_page welcome_page
} }
fn init(&self) {
let container = gtk::Box::new(gtk::Orientation::Vertical, 0);
container.set_property_expand(true);
container.set_valign(gtk::Align::Center);
container.set_halign(gtk::Align::Center);
container.set_margin_top(24);
container.set_margin_bottom(24);
#[cfg(not(feature = "video"))] #[cfg(not(feature = "video"))]
fn get_header_widget(&self) -> gtk::Widget { let header = {
let icon = glib::get_os_info("LOGO").unwrap_or_else(|| "start-here-symbolic".into()); let icon = glib::get_os_info("LOGO").unwrap_or_else(|| "start-here-symbolic".into());
let logo = gtk::Image::from_icon_name(Some(&icon), gtk::IconSize::Dialog); let logo = gtk::Image::from_icon_name(Some(&icon), gtk::IconSize::Dialog);
...@@ -27,19 +73,12 @@ impl WelcomePageWidget { ...@@ -27,19 +73,12 @@ impl WelcomePageWidget {
logo.show(); logo.show();
logo.upcast::<gtk::Widget>() logo.upcast::<gtk::Widget>()
} };
#[cfg(feature = "video")] #[cfg(feature = "video")]
fn get_header_widget(&self) -> gtk::Widget { let header = {
let dispatcher = gst_player::PlayerGMainContextSignalDispatcher::new(None); let video_widget = self
let sink = gst::ElementFactory::make("gtksink", None).expect("Missing dependency: element gtksink is needed (usually, in gstreamer-plugins-good or in gst-plugin-gtk)."); .player
let renderer = gst_player::PlayerVideoOverlayVideoRenderer::with_sink(&sink).upcast();
let player = gst_player::Player::new(Some(&renderer), Some(&dispatcher.upcast::<gst_player::PlayerSignalDispatcher>()));
let video_file = gio::File::new_for_path(config::VIDEO_PATH);
player.set_uri(&video_file.get_uri());
let video_widget = player
.get_pipeline() .get_pipeline()
.get_property("video-sink") .get_property("video-sink")
.unwrap() .unwrap()
...@@ -52,33 +91,46 @@ impl WelcomePageWidget { ...@@ -52,33 +91,46 @@ impl WelcomePageWidget {
.unwrap() .unwrap()
.unwrap(); .unwrap();
video_widget.set_size_request(-1, 300); video_widget.set_size_request(-1, 360);
video_widget.set_property("ignore-alpha", &false).unwrap(); video_widget.set_property("ignore-alpha", &false).unwrap();
video_widget.show(); video_widget.show();
video_widget.get_style_context().add_class("video");
video_widget
};
gtk::idle_add(clone!(@strong player => move || { container.add(&header);
player.play();
glib::Continue(true)
}));
video_widget #[cfg(feature = "video")]
{
let receiver = self.receiver.borrow_mut().take().unwrap();
receiver.attach(None, move |action| {
if action == Action::VideoReady {
header.get_style_context().add_class("playing");
} }
glib::Continue(true)
});
fn init(&self) { let video_file = gio::File::new_for_path(config::VIDEO_PATH);
let container = gtk::Box::new(gtk::Orientation::Vertical, 0); self.player.set_uri(&video_file.get_uri());
container.set_property_expand(true); self.player.connect_state_changed(clone!(@strong self.sender as sender => move |_, state| {
container.set_valign(gtk::Align::Center); if state == gst_player::PlayerState::Playing {
container.set_halign(gtk::Align::Center); sender.send(Action::VideoReady).unwrap();
container.set_margin_top(24); }
container.set_margin_bottom(24); }));
gtk::timeout_add(
500,
clone!(@strong self.player as player => move || {
player.play();
glib::Continue(true)
}),
);
};
let name = glib::get_os_info("NAME").unwrap_or_else(|| "GNOME".into()); let name = glib::get_os_info("NAME").unwrap_or_else(|| "GNOME".into());
let version = glib::get_os_info("VERSION").unwrap_or_else(|| "3.36".into()); let version = glib::get_os_info("VERSION").unwrap_or_else(|| "3.36".into());
let header = self.get_header_widget();
container.add(&header);
let title = gtk::Label::new(Some(&gettext(format!("Welcome to {} {}", name, version)))); let title = gtk::Label::new(Some(&gettext(format!("Welcome to {} {}", name, version))));
title.set_margin_top(36); title.set_margin_top(36);
title.get_style_context().add_class("large-title"); title.get_style_context().add_class("large-title");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment