Commit 59d6e0f0 authored by Bilal Elmoussaoui's avatar Bilal Elmoussaoui

subclass the WelcomePageWidget

parent ba2f81ad
...@@ -10,6 +10,7 @@ use gtk::glib::clone; ...@@ -10,6 +10,7 @@ use gtk::glib::clone;
#[cfg(feature = "video")] #[cfg(feature = "video")]
use gtk::glib::{Receiver, Sender}; use gtk::glib::{Receiver, Sender};
use gtk::prelude::*; use gtk::prelude::*;
use gtk::subclass::prelude::*;
#[cfg(feature = "video")] #[cfg(feature = "video")]
use std::cell::RefCell; use std::cell::RefCell;
...@@ -20,26 +21,28 @@ pub enum Action { ...@@ -20,26 +21,28 @@ pub enum Action {
VideoUp, VideoUp,
} }
pub struct WelcomePageWidget { mod imp {
pub widget: gtk::Box, use super::*;
#[derive(Debug)]
pub struct WelcomePageWidget {
#[cfg(feature = "video")] #[cfg(feature = "video")]
player: gst_player::Player, player: gst_player::Player,
#[cfg(feature = "video")] #[cfg(feature = "video")]
receiver: RefCell<Option<Receiver<Action>>>, receiver: RefCell<Option<Receiver<Action>>>,
#[cfg(feature = "video")] #[cfg(feature = "video")]
sender: Sender<Action>, sender: Sender<Action>,
} }
impl WelcomePageWidget {
pub fn new() -> Self {
let widget = gtk::Box::new(gtk::Orientation::Horizontal, 0);
impl Default for WelcomePageWidget {
fn default() -> Self {
#[cfg(feature = "video")] #[cfg(feature = "video")]
let player = { let player = {
let dispatcher = gst_player::PlayerGMainContextSignalDispatcher::new(None); let dispatcher = gst_player::PlayerGMainContextSignalDispatcher::new(None);
let sink = gst::ElementFactory::make("gtksink", 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)."); .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 renderer =
gst_player::PlayerVideoOverlayVideoRenderer::with_sink(&sink).upcast();
gst_player::Player::new( gst_player::Player::new(
Some(&renderer), Some(&renderer),
Some(&dispatcher.upcast::<gst_player::PlayerSignalDispatcher>()), Some(&dispatcher.upcast::<gst_player::PlayerSignalDispatcher>()),
...@@ -50,21 +53,32 @@ impl WelcomePageWidget { ...@@ -50,21 +53,32 @@ impl WelcomePageWidget {
#[cfg(feature = "video")] #[cfg(feature = "video")]
let receiver = RefCell::new(Some(r)); let receiver = RefCell::new(Some(r));
let welcome_page = Self { Self {
widget,
#[cfg(feature = "video")] #[cfg(feature = "video")]
player, player,
#[cfg(feature = "video")] #[cfg(feature = "video")]
sender, sender,
#[cfg(feature = "video")] #[cfg(feature = "video")]
receiver, receiver,
}; }
}
}
welcome_page.init(); #[glib::object_subclass]
welcome_page impl ObjectSubclass for WelcomePageWidget {
const NAME: &'static str = "WelcomePageWidget";
type ParentType = gtk::Box;
type Type = super::WelcomePageWidget;
} }
fn init(&self) { impl ObjectImpl for WelcomePageWidget {
fn constructed(&self, widget: &Self::Type) {
let layout_manager = widget
.layout_manager()
.map(|l| l.downcast::<gtk::BoxLayout>().unwrap())
.unwrap();
layout_manager.set_orientation(gtk::Orientation::Vertical);
let container = gtk::Box::builder() let container = gtk::Box::builder()
.orientation(gtk::Orientation::Vertical) .orientation(gtk::Orientation::Vertical)
.spacing(0) .spacing(0)
...@@ -75,8 +89,8 @@ impl WelcomePageWidget { ...@@ -75,8 +89,8 @@ impl WelcomePageWidget {
.margin_top(24) .margin_top(24)
.margin_bottom(24) .margin_bottom(24)
.build(); .build();
self.widget.add_css_class("page"); widget.add_css_class("page");
self.widget.add_css_class("welcome-page"); widget.add_css_class("welcome-page");
let clamp = adw::Clamp::new(); let clamp = adw::Clamp::new();
clamp.set_child(Some(&container)); clamp.set_child(Some(&container));
...@@ -96,21 +110,12 @@ impl WelcomePageWidget { ...@@ -96,21 +110,12 @@ impl WelcomePageWidget {
let header = { let header = {
let video_widget = self let video_widget = self
.player .player
.get_pipeline() .pipeline()
.get_property("video-sink") .property::<gst::Element>("video-sink")
.unwrap() .property::<gtk::Widget>("widget");
.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, 360); 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.add_css_class("video"); video_widget.add_css_class("video");
video_widget video_widget
}; };
...@@ -172,6 +177,21 @@ impl WelcomePageWidget { ...@@ -172,6 +177,21 @@ impl WelcomePageWidget {
text.set_margin_top(12); text.set_margin_top(12);
container.append(&text); container.append(&text);
self.widget.append(&clamp); widget.append(&clamp);
self.parent_constructed(widget);
}
}
impl WidgetImpl for WelcomePageWidget {}
impl BoxImpl for WelcomePageWidget {}
}
glib::wrapper! {
pub struct WelcomePageWidget(ObjectSubclass<imp::WelcomePageWidget>)
@extends gtk::Widget, gtk::Box;
}
impl WelcomePageWidget {
pub fn new() -> Self {
glib::Object::new(&[]).unwrap()
} }
} }
...@@ -34,7 +34,7 @@ mod imp { ...@@ -34,7 +34,7 @@ mod imp {
widget.add_css_class("devel"); widget.add_css_class("devel");
} }
self.paginator.add_page(WelcomePageWidget::new().widget); self.paginator.add_page(WelcomePageWidget::new());
self.paginator.add_page(ImagePageWidget::new( self.paginator.add_page(ImagePageWidget::new(
"/org/gnome/Tour/overview.svg", "/org/gnome/Tour/overview.svg",
gettext("Get an Overview"), gettext("Get an Overview"),
......
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