poezio/tools/sticker-picker/src/sticker.rs
Emmanuel Gil Peyrot d35c0564b3 Add a /sticker plugin
This plugin currently uploads the selected sticker every time, to the
HTTP File Upload service of the server (see XEP-0363), a future
optimisation would be to use XEP-0231 instead, for better caching on the
recipient side.

It relies on a helper tool to select the wanted sticker inside the pack,
a sample one is provided in tools/sticker-picker/, but it is not built
by default.
2022-02-10 01:45:37 +01:00

106 lines
3 KiB
Rust

// 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<Option<String>>,
texture: RefCell<Option<gdk::Texture>>,
}
#[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<Vec<glib::ParamSpec>> = 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<Sticker>);
}
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<String> {
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<gdk::Texture> {
let imp = self.imp();
let texture = imp.texture.borrow();
if let Some(texture) = texture.as_ref() {
Some(texture.clone())
} else {
None
}
}
}