Commit a30ffee3 authored by Bilal Elmoussaoui's avatar Bilal Elmoussaoui

add a welcome video page

parent faa5f3c9
......@@ -53,6 +53,12 @@ dependencies = [
]
[[package]]
name = "autocfg"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d"
[[package]]
name = "bitflags"
version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
......@@ -381,6 +387,8 @@ dependencies = [
"gettext-rs",
"gio",
"glib",
"gstreamer",
"gstreamer-player",
"gtk",
"libhandy",
"log",
......@@ -399,6 +407,137 @@ dependencies = [
]
[[package]]
name = "gstreamer"
version = "0.16.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ce4ce1ba28d3293b8cb8c3d33f50e6da2e5cfeefa59a0d10d922ab8015791609"
dependencies = [
"bitflags",
"cfg-if",
"futures-channel",
"futures-core",
"futures-util",
"glib",
"glib-sys",
"gobject-sys",
"gstreamer-sys",
"libc",
"muldiv",
"num-rational",
"once_cell",
"paste",
"pretty-hex",
"thiserror",
]
[[package]]
name = "gstreamer-base"
version = "0.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "872893487ce8876f18c63730402822804c5762869f631d8e3e6b18aafc8399f0"
dependencies = [
"bitflags",
"glib",
"glib-sys",
"gobject-sys",
"gstreamer",
"gstreamer-base-sys",
"gstreamer-sys",
"libc",
]
[[package]]
name = "gstreamer-base-sys"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c0fd5a77d39b47568fba01274dfcb28dc32382513c697009f80b89ef63fd32fd"
dependencies = [
"glib-sys",
"gobject-sys",
"gstreamer-sys",
"libc",
"system-deps",
]
[[package]]
name = "gstreamer-player"
version = "0.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "90e8a850be21b18fb21f21fa16394bfc176013f7fffdc6719db0ea23b3c99a2b"
dependencies = [
"bitflags",
"glib",
"glib-sys",
"gobject-sys",
"gstreamer",
"gstreamer-player-sys",
"gstreamer-sys",
"gstreamer-video",
"libc",
]
[[package]]
name = "gstreamer-player-sys"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b9f0cd125febba8f9b3cae13881c0d845a77a4e4797b9552aa4058330c23e958"
dependencies = [
"glib-sys",
"gobject-sys",
"gstreamer-sys",
"gstreamer-video-sys",
"libc",
"system-deps",
]
[[package]]
name = "gstreamer-sys"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1321f34d53bb5f60ab1aaf581e29b664b8d41601714ee1bb7dbea490b5b9ff60"
dependencies = [
"glib-sys",
"gobject-sys",
"libc",
"system-deps",
]
[[package]]
name = "gstreamer-video"
version = "0.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "42a52c141d83113e6dd080347ca49ef9be296e7900e081f2b67eaad6a3d5ef26"
dependencies = [
"bitflags",
"futures-channel",
"futures-util",
"glib",
"glib-sys",
"gobject-sys",
"gstreamer",
"gstreamer-base",
"gstreamer-base-sys",
"gstreamer-sys",
"gstreamer-video-sys",
"libc",
"once_cell",
]
[[package]]
name = "gstreamer-video-sys"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d6f105143a7676d2032c386c10b2d376106b5562b7a11b694b634113456f1935"
dependencies = [
"glib-sys",
"gobject-sys",
"gstreamer-base-sys",
"gstreamer-sys",
"libc",
"system-deps",
]
[[package]]
name = "gtk"
version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
......@@ -561,10 +700,46 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400"
[[package]]
name = "muldiv"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0419348c027fa7be448d2ae7ea0e4e04c2334c31dc4e74ab29f00a2a7ca69204"
[[package]]
name = "num-integer"
version = "0.1.43"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8d59457e662d541ba17869cf51cf177c0b5f0cbf476c66bdc90bf1edac4f875b"
dependencies = [
"autocfg",
"num-traits",
]
[[package]]
name = "num-rational"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a5b4d7360f362cfb50dde8143501e6940b22f644be75a4cc90b2d81968908138"
dependencies = [
"autocfg",
"num-integer",
"num-traits",
]
[[package]]
name = "num-traits"
version = "0.2.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ac267bcc07f48ee5f8935ab0d24f316fb722d7a1292e2913f0cc196b29ffd611"
dependencies = [
"autocfg",
]
[[package]]
name = "once_cell"
version = "1.4.0"
version = "1.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b631f7e854af39a1739f401cf34a8a013dfe09eac4fa4dba91e9768bd28168d"
checksum = "260e51e7efe62b592207e9e13a68e43692a7a279171d6ba57abd208bf23645ad"
[[package]]
name = "pango"
......@@ -594,6 +769,25 @@ dependencies = [
]
[[package]]
name = "paste"
version = "0.1.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "45ca20c77d80be666aef2b45486da86238fabe33e38306bd3118fe4af33fa880"
dependencies = [
"paste-impl",
"proc-macro-hack",
]
[[package]]
name = "paste-impl"
version = "0.1.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d95a7db200b97ef370c8e6de0088252f7e0dfff7d047a28528e47456c0fc98b6"
dependencies = [
"proc-macro-hack",
]
[[package]]
name = "pin-project"
version = "0.4.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
......@@ -626,6 +820,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d36492546b6af1463394d46f0c834346f31548646f6ba10849802c9c9a27ac33"
[[package]]
name = "pretty-hex"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "be91bcc43e73799dc46a6c194a55e7aae1d86cc867c860fd4a436019af21bd8c"
[[package]]
name = "pretty_env_logger"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
......
......@@ -14,3 +14,11 @@ gettext-rs = { version = "0.4", features = ["gettext-system"] }
libhandy = "1.0.0-alpha"
pretty_env_logger = "0.4"
anyhow = "1.0"
[dependencies.gst_player]
version = "0.16"
package = "gstreamer-player"
[dependencies.gst]
version = "0.16"
package = "gstreamer"
......@@ -2,6 +2,7 @@
<gresources>
<gresource prefix="/org/gnome/Tour/">
<file compressed="true" alias="style.css">resources/style.css</file>
<file alias="welcome.mp4">resources/assets/welcome.mp4</file>
<file compressed="true" alias="activities.svg">resources/assets/activities.svg</file>
<file compressed="true" alias="calendar.svg">resources/assets/calendar.svg</file>
<file compressed="true" alias="search.svg">resources/assets/search.svg</file>
......
......@@ -20,7 +20,7 @@ fn main() {
glib::set_prgname(Some("Tour"));
gtk::init().expect("Unable to start GTK3");
gst::init().expect("Unable to start gst");
static_resources::init().expect("Failed to initialize the resource file.");
let app = Application::new();
......
......@@ -39,6 +39,7 @@ sources = files(
'widgets/pages/image.rs',
'widgets/pages/mod.rs',
'widgets/pages/welcome.rs',
'widgets/pages/welcome_video.rs',
'widgets/mod.rs',
'widgets/paginator.rs',
'widgets/window.rs',
......
mod image;
mod welcome;
mod welcome_video;
pub use image::ImagePageWidget;
pub use welcome::WelcomePageWidget;
pub use welcome_video::WelcomeVideoPageWidget;
use gettextrs::gettext;
use gtk::prelude::*;
// The welcome page with a video instead of a static logo
pub struct WelcomeVideoPageWidget {
pub widget: gtk::Box,
}
impl WelcomeVideoPageWidget {
pub fn new() -> Self {
let widget = gtk::Box::new(gtk::Orientation::Vertical, 0);
let welcome_page = Self { widget };
welcome_page.init();
welcome_page
}
fn init(&self) {
self.widget.set_property_expand(true);
self.widget.set_valign(gtk::Align::Center);
self.widget.set_halign(gtk::Align::Center);
self.widget.set_margin_top(24);
self.widget.set_margin_bottom(24);
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 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();
let player = gst_player::Player::new(Some(&renderer), Some(&dispatcher.upcast::<gst_player::PlayerSignalDispatcher>()));
player.set_uri("/org/gnome/Tour/welcome.mp4");
let video_widget = player
.get_pipeline()
.get_property("video-sink")
.unwrap()
.get::<gst::Element>()
.expect("The player of a VideoPlayerWidget should not use the default sink.")
.unwrap()
.get_property("widget")
.unwrap()
.get::<gtk::Widget>()
.unwrap()
.unwrap();
video_widget.set_size_request(-1, 720);
video_widget.show();
gtk::idle_add(clone!(@strong player => move || {
player.play();
glib::Continue(false)
}));
self.widget.add(&video_widget);
let title = gtk::Label::new(Some(&gettext(format!("Welcome to {} {}", name, version))));
title.set_margin_top(36);
title.get_style_context().add_class("large-title");
title.show();
self.widget.add(&title);
let text = gtk::Label::new(Some(&gettext("Hi there! Take the tour to learn your way around and discover essential features.")));
text.get_style_context().add_class("body");
text.set_margin_top(12);
text.show();
self.widget.add(&text);
let actions_container = gtk::Box::new(gtk::Orientation::Horizontal, 12);
actions_container.set_halign(gtk::Align::Center);
actions_container.set_margin_top(36);
let skip_tour_btn = gtk::Button::with_label(&gettext("_No Thanks"));
skip_tour_btn.set_property_height_request(40);
skip_tour_btn.set_property_width_request(180);
skip_tour_btn.set_use_underline(true);
skip_tour_btn.set_action_name(Some("app.skip-tour"));
skip_tour_btn.show();
actions_container.add(&skip_tour_btn);
let start_tour_btn = gtk::Button::with_label(&gettext("_Start Tour"));
start_tour_btn.set_property_height_request(40);
start_tour_btn.set_property_width_request(180);
start_tour_btn.set_use_underline(true);
start_tour_btn.set_action_name(Some("app.start-tour"));
start_tour_btn.get_style_context().add_class("suggested-action");
start_tour_btn.show();
actions_container.add(&start_tour_btn);
actions_container.set_focus_child(Some(&start_tour_btn));
actions_container.show();
self.widget.add(&actions_container);
self.widget.show();
}
}
......@@ -4,7 +4,7 @@ use gtk::prelude::*;
use std::cell::RefCell;
use std::rc::Rc;
use super::pages::{ImagePageWidget, WelcomePageWidget};
use super::pages::{ImagePageWidget, WelcomePageWidget, WelcomeVideoPageWidget};
use super::paginator::PaginatorWidget;
use crate::config::{APP_ID, PROFILE};
......@@ -42,7 +42,7 @@ impl Window {
if PROFILE == "Devel" {
self.widget.get_style_context().add_class("devel");
}
self.paginator.borrow_mut().add_page(WelcomePageWidget::new().widget.upcast::<gtk::Widget>());
self.paginator.borrow_mut().add_page(WelcomeVideoPageWidget::new().widget.upcast::<gtk::Widget>());
self.paginator.borrow_mut().add_page(
ImagePageWidget::new(
......
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