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

subclass the WelcomePageWidget

parent ba2f81ad
......@@ -10,6 +10,7 @@ use gtk::glib::clone;
#[cfg(feature = "video")]
use gtk::glib::{Receiver, Sender};
use gtk::prelude::*;
use gtk::subclass::prelude::*;
#[cfg(feature = "video")]
use std::cell::RefCell;
......@@ -20,26 +21,28 @@ pub enum Action {
VideoUp,
}
pub struct WelcomePageWidget {
pub widget: gtk::Box,
mod imp {
use super::*;
#[derive(Debug)]
pub struct WelcomePageWidget {
#[cfg(feature = "video")]
player: gst_player::Player,
#[cfg(feature = "video")]
receiver: RefCell<Option<Receiver<Action>>>,
#[cfg(feature = "video")]
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")]
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();
let renderer =
gst_player::PlayerVideoOverlayVideoRenderer::with_sink(&sink).upcast();
gst_player::Player::new(
Some(&renderer),
Some(&dispatcher.upcast::<gst_player::PlayerSignalDispatcher>()),
......@@ -50,21 +53,32 @@ impl WelcomePageWidget {
#[cfg(feature = "video")]
let receiver = RefCell::new(Some(r));
let welcome_page = Self {
widget,
Self {
#[cfg(feature = "video")]
player,
#[cfg(feature = "video")]
sender,
#[cfg(feature = "video")]
receiver,
};
}
}
}
welcome_page.init();
welcome_page
#[glib::object_subclass]
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()
.orientation(gtk::Orientation::Vertical)
.spacing(0)
......@@ -75,8 +89,8 @@ impl WelcomePageWidget {
.margin_top(24)
.margin_bottom(24)
.build();
self.widget.add_css_class("page");
self.widget.add_css_class("welcome-page");
widget.add_css_class("page");
widget.add_css_class("welcome-page");
let clamp = adw::Clamp::new();
clamp.set_child(Some(&container));
......@@ -96,21 +110,12 @@ impl WelcomePageWidget {
let header = {
let video_widget = self
.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();
.pipeline()
.property::<gst::Element>("video-sink")
.property::<gtk::Widget>("widget");
video_widget.set_size_request(-1, 360);
video_widget.set_property("ignore-alpha", &false).unwrap();
video_widget.show();
video_widget.add_css_class("video");
video_widget
};
......@@ -172,6 +177,21 @@ impl WelcomePageWidget {
text.set_margin_top(12);
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 {
widget.add_css_class("devel");
}
self.paginator.add_page(WelcomePageWidget::new().widget);
self.paginator.add_page(WelcomePageWidget::new());
self.paginator.add_page(ImagePageWidget::new(
"/org/gnome/Tour/overview.svg",
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