// This file is part of Poezio. // // Poezio is free software: you can redistribute it and/or modify // it under the terms of the zlib license. See the COPYING file. use gtk::prelude::*; use gtk::subclass::prelude::*; use std::cell::RefCell; use std::path::Path; #[derive(Debug, Default)] pub struct Sticker { filename: RefCell>, texture: RefCell>, } #[glib::object_subclass] impl ObjectSubclass for Sticker { const NAME: &'static str = "Sticker"; type Type = StickerType; } impl ObjectImpl for Sticker { fn properties() -> &'static [glib::ParamSpec] { use once_cell::sync::Lazy; static PROPERTIES: Lazy> = Lazy::new(|| { vec![ glib::ParamSpecString::new( "filename", "Filename", "Filename", None, glib::ParamFlags::READWRITE | glib::ParamFlags::CONSTRUCT_ONLY, ), glib::ParamSpecObject::new( "texture", "Texture", "Texture", gdk::Texture::static_type(), glib::ParamFlags::READWRITE | glib::ParamFlags::CONSTRUCT_ONLY, ), ] }); PROPERTIES.as_ref() } fn set_property( &self, _obj: &StickerType, _id: usize, value: &glib::Value, pspec: &glib::ParamSpec, ) { match pspec.name() { "filename" => { let filename = value.get().unwrap(); self.filename.replace(filename); } "texture" => { let texture = value.get().unwrap(); self.texture.replace(texture); } _ => unimplemented!(), } } fn property(&self, _obj: &StickerType, _id: usize, pspec: &glib::ParamSpec) -> glib::Value { match pspec.name() { "filename" => self.filename.borrow().to_value(), "texture" => self.texture.borrow().to_value(), _ => unimplemented!(), } } } glib::wrapper! { pub struct StickerType(ObjectSubclass); } impl StickerType { pub fn new(filename: String, path: &Path) -> StickerType { let texture = gdk::Texture::from_filename(path).unwrap(); glib::Object::new(&[("filename", &filename), ("texture", &texture)]) .expect("Failed to create Sticker") } pub fn filename(&self) -> Option { let imp = self.imp(); let filename = imp.filename.borrow(); if let Some(filename) = filename.as_ref() { Some(filename.clone()) } else { None } } pub fn texture(&self) -> Option { let imp = self.imp(); let texture = imp.texture.borrow(); if let Some(texture) = texture.as_ref() { Some(texture.clone()) } else { None } } }