[gnome-tour/bilelmoussaoui/video: 17/22] add a welcome video page




commit a30ffee3dd11690afa7ee397e199f8b8c10bedc9
Author: Bilal Elmoussaoui <bil elmoussaoui gmail com>
Date:   Fri Aug 7 19:22:49 2020 +0200

    add a welcome video page

 Cargo.lock                         | 204 ++++++++++++++++++++++++++++++++++++-
 Cargo.toml                         |   8 ++
 data/resources.gresource.xml       |   1 +
 data/resources/assets/welcome.mp4  | Bin 0 -> 432016 bytes
 src/main.rs                        |   2 +-
 src/meson.build                    |   1 +
 src/widgets/pages/mod.rs           |   2 +
 src/widgets/pages/welcome_video.rs |  94 +++++++++++++++++
 src/widgets/window.rs              |   4 +-
 9 files changed, 311 insertions(+), 5 deletions(-)
---
diff --git a/Cargo.lock b/Cargo.lock
index 0a5651c..da99a1c 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -52,6 +52,12 @@ dependencies = [
  "winapi",
 ]
 
+[[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"
@@ -381,6 +387,8 @@ dependencies = [
  "gettext-rs",
  "gio",
  "glib",
+ "gstreamer",
+ "gstreamer-player",
  "gtk",
  "libhandy",
  "log",
@@ -398,6 +406,137 @@ dependencies = [
  "system-deps",
 ]
 
+[[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"
@@ -560,11 +699,47 @@ version = "2.3.3"
 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"
@@ -593,6 +768,25 @@ dependencies = [
  "system-deps",
 ]
 
+[[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"
@@ -625,6 +819,12 @@ version = "0.3.18"
 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"
diff --git a/Cargo.toml b/Cargo.toml
index 27b0e6d..5cccfc5 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -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"
diff --git a/data/resources.gresource.xml b/data/resources.gresource.xml
index 688446a..19c7242 100644
--- a/data/resources.gresource.xml
+++ b/data/resources.gresource.xml
@@ -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>
diff --git a/data/resources/assets/welcome.mp4 b/data/resources/assets/welcome.mp4
new file mode 100644
index 0000000..7dca6c7
Binary files /dev/null and b/data/resources/assets/welcome.mp4 differ
diff --git a/src/main.rs b/src/main.rs
index 55b48c4..a5be172 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -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();
diff --git a/src/meson.build b/src/meson.build
index 33879a0..83ea2ca 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -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',
diff --git a/src/widgets/pages/mod.rs b/src/widgets/pages/mod.rs
index 4c7ee37..259a734 100644
--- a/src/widgets/pages/mod.rs
+++ b/src/widgets/pages/mod.rs
@@ -1,5 +1,7 @@
 mod image;
 mod welcome;
+mod welcome_video;
 
 pub use image::ImagePageWidget;
 pub use welcome::WelcomePageWidget;
+pub use welcome_video::WelcomeVideoPageWidget;
diff --git a/src/widgets/pages/welcome_video.rs b/src/widgets/pages/welcome_video.rs
new file mode 100644
index 0000000..7176d2b
--- /dev/null
+++ b/src/widgets/pages/welcome_video.rs
@@ -0,0 +1,94 @@
+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();
+    }
+}
diff --git a/src/widgets/window.rs b/src/widgets/window.rs
index 1f79740..6a0d04f 100644
--- a/src/widgets/window.rs
+++ b/src/widgets/window.rs
@@ -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(


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]