Add subtitle font settings to video player backend

This commit is contained in:
Avery 2023-12-04 13:30:58 -05:00
parent d62b8364b6
commit 2a85af4afc
9 changed files with 199 additions and 2 deletions

View File

@ -1,6 +1,7 @@
use std::fmt;
use relm4::gtk;
use serde::{Deserialize, Serialize};
use uuid::Uuid;
use crate::utils::rgba::RGBA;
@ -112,6 +113,9 @@ pub trait VideoPlayerBackend: fmt::Debug {
/// Set subtitle position from 0 - 150, where 0 is the top of the screen and 100 is the bottom.
fn set_subtitle_position(&self, position: u32);
/// Set subtitle font.
fn set_subtitle_font(&self, font: &VideoPlayerSubtitleFont);
/// Get notified when video player reaches the end of the current video.
fn connect_end_of_stream(&mut self, callback: Box<dyn Fn() + Send + 'static>);
@ -142,3 +146,43 @@ pub trait VideoPlayerBackend: fmt::Debug {
callback: Box<dyn Fn(Vec<AudioTrack>) + Send + Sync + 'static>,
);
}
#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Eq)]
pub struct VideoPlayerSubtitleFont {
pub family: String,
pub size: usize,
pub bold: bool,
pub italic: bool,
}
impl Default for VideoPlayerSubtitleFont {
fn default() -> Self {
Self {
family: "Sans".into(),
size: 55,
bold: false,
italic: false,
}
}
}
impl From<VideoPlayerSubtitleFont> for relm4::gtk::pango::FontDescription {
fn from(font: VideoPlayerSubtitleFont) -> Self {
use relm4::gtk::pango::{FontDescription, Style, Weight};
let mut desc = FontDescription::new();
desc.set_family(&font.family);
desc.set_size((font.size * 1024) as i32);
desc.set_weight(if font.bold {
Weight::Bold
} else {
Weight::Normal
});
desc.set_style(if font.italic {
Style::Italic
} else {
Style::Normal
});
desc
}
}

View File

@ -13,6 +13,7 @@ use crate::{tr, utils::rgba::RGBA};
use super::{
AudioTrack, PlayerState, PlayerStateChangedCallback, SubtitleTrack, VideoPlayerBackend,
VideoPlayerSubtitleFont,
};
fn uuid() -> Uuid {
@ -230,6 +231,14 @@ impl VideoPlayerBackend for VideoPlayerBackendMpv {
self.widget.set_subtitle_position(position);
}
fn set_subtitle_font(&self, font: &VideoPlayerSubtitleFont) {
let player = &self.widget;
player.set_subtitle_font_family(&font.family);
player.set_subtitle_font_size(font.size as u32);
player.set_subtitle_font_bold(font.bold);
player.set_subtitle_font_italic(font.italic);
}
fn disconnect_signal_handler(&mut self, id: &Uuid) {
match self.signal_handler_ids.remove(id) {
Some(signal_handler_id) => {

View File

@ -1,3 +1,3 @@
Generated by gir (https://github.com/gtk-rs/gir @ 428c880ecf0b)
from sys/build (@ 312b5ae62bf8+)
from sys/build (@ d62b8364b620)
from sys/gir-files (@ 20031a537e40)

View File

@ -142,6 +142,37 @@ impl VideoPlayerMpv {
}
}
#[doc(alias = "vpm_video_player_mpv_set_subtitle_font_bold")]
pub fn set_subtitle_font_bold(&self, bold: bool) {
unsafe {
ffi::vpm_video_player_mpv_set_subtitle_font_bold(self.to_glib_none().0, bold);
}
}
#[doc(alias = "vpm_video_player_mpv_set_subtitle_font_family")]
pub fn set_subtitle_font_family(&self, family: &str) {
unsafe {
ffi::vpm_video_player_mpv_set_subtitle_font_family(
self.to_glib_none().0,
family.to_glib_none().0,
);
}
}
#[doc(alias = "vpm_video_player_mpv_set_subtitle_font_italic")]
pub fn set_subtitle_font_italic(&self, italic: bool) {
unsafe {
ffi::vpm_video_player_mpv_set_subtitle_font_italic(self.to_glib_none().0, italic);
}
}
#[doc(alias = "vpm_video_player_mpv_set_subtitle_font_size")]
pub fn set_subtitle_font_size(&self, size: u32) {
unsafe {
ffi::vpm_video_player_mpv_set_subtitle_font_size(self.to_glib_none().0, size);
}
}
#[doc(alias = "vpm_video_player_mpv_set_subtitle_position")]
pub fn set_subtitle_position(&self, position: u32) {
unsafe {

View File

@ -429,6 +429,70 @@ and/or use gtk-doc annotations. -->
</parameter>
</parameters>
</method>
<method name="set_subtitle_font_bold"
c:identifier="vpm_video_player_mpv_set_subtitle_font_bold">
<source-position filename="video-player-mpv/video-player-mpv.h"
line="54"/>
<return-value transfer-ownership="none">
<type name="none" c:type="void"/>
</return-value>
<parameters>
<instance-parameter name="self" transfer-ownership="none">
<type name="VideoPlayerMpv" c:type="VpmVideoPlayerMpv*"/>
</instance-parameter>
<parameter name="bold" transfer-ownership="none">
<type name="gboolean" c:type="_Bool"/>
</parameter>
</parameters>
</method>
<method name="set_subtitle_font_family"
c:identifier="vpm_video_player_mpv_set_subtitle_font_family">
<source-position filename="video-player-mpv/video-player-mpv.h"
line="50"/>
<return-value transfer-ownership="none">
<type name="none" c:type="void"/>
</return-value>
<parameters>
<instance-parameter name="self" transfer-ownership="none">
<type name="VideoPlayerMpv" c:type="VpmVideoPlayerMpv*"/>
</instance-parameter>
<parameter name="family" transfer-ownership="none">
<type name="utf8" c:type="char*"/>
</parameter>
</parameters>
</method>
<method name="set_subtitle_font_italic"
c:identifier="vpm_video_player_mpv_set_subtitle_font_italic">
<source-position filename="video-player-mpv/video-player-mpv.h"
line="56"/>
<return-value transfer-ownership="none">
<type name="none" c:type="void"/>
</return-value>
<parameters>
<instance-parameter name="self" transfer-ownership="none">
<type name="VideoPlayerMpv" c:type="VpmVideoPlayerMpv*"/>
</instance-parameter>
<parameter name="italic" transfer-ownership="none">
<type name="gboolean" c:type="_Bool"/>
</parameter>
</parameters>
</method>
<method name="set_subtitle_font_size"
c:identifier="vpm_video_player_mpv_set_subtitle_font_size">
<source-position filename="video-player-mpv/video-player-mpv.h"
line="52"/>
<return-value transfer-ownership="none">
<type name="none" c:type="void"/>
</return-value>
<parameters>
<instance-parameter name="self" transfer-ownership="none">
<type name="VideoPlayerMpv" c:type="VpmVideoPlayerMpv*"/>
</instance-parameter>
<parameter name="size" transfer-ownership="none">
<type name="guint" c:type="uint"/>
</parameter>
</parameters>
</method>
<method name="set_subtitle_position"
c:identifier="vpm_video_player_mpv_set_subtitle_position">
<source-position filename="video-player-mpv/video-player-mpv.h"

View File

@ -1,3 +1,3 @@
Generated by gir (https://github.com/gtk-rs/gir @ 428c880ecf0b)
from build (@ 312b5ae62bf8+)
from build (@ d62b8364b620)
from gir-files (@ 20031a537e40)

View File

@ -149,6 +149,16 @@ extern "C" {
self_: *mut VpmVideoPlayerMpv,
colour: *mut c_char,
);
pub fn vpm_video_player_mpv_set_subtitle_font_bold(self_: *mut VpmVideoPlayerMpv, bold: bool);
pub fn vpm_video_player_mpv_set_subtitle_font_family(
self_: *mut VpmVideoPlayerMpv,
family: *mut c_char,
);
pub fn vpm_video_player_mpv_set_subtitle_font_italic(
self_: *mut VpmVideoPlayerMpv,
italic: bool,
);
pub fn vpm_video_player_mpv_set_subtitle_font_size(self_: *mut VpmVideoPlayerMpv, size: c_uint);
pub fn vpm_video_player_mpv_set_subtitle_position(
self_: *mut VpmVideoPlayerMpv,
position: c_uint,

View File

@ -496,3 +496,34 @@ void vpm_video_player_mpv_set_subtitle_position(VpmVideoPlayerMpv *self,
mpv_set_option(self->mpv_ctx->handle, "sub-pos", MPV_FORMAT_INT64,
&position_int);
}
void vpm_video_player_mpv_set_subtitle_font_family(VpmVideoPlayerMpv *self,
char *family) {
int err = mpv_set_option(self->mpv_ctx->handle, "sub-font", MPV_FORMAT_STRING,
&family);
if (err < 0) {
printf("Error setting sub-font: %d\n", err);
}
}
void vpm_video_player_mpv_set_subtitle_font_size(VpmVideoPlayerMpv *self,
uint size) {
uint64_t size_int = (uint64_t)size;
int err = mpv_set_option(self->mpv_ctx->handle, "sub-font-size",
MPV_FORMAT_INT64, &size_int);
if (err < 0) {
printf("Error setting sub-font-size: %d\n", err);
}
}
void vpm_video_player_mpv_set_subtitle_font_bold(VpmVideoPlayerMpv *self,
bool bold) {
int val = bold;
mpv_set_property(self->mpv_ctx->handle, "sub-bold", MPV_FORMAT_FLAG, &val);
}
void vpm_video_player_mpv_set_subtitle_font_italic(VpmVideoPlayerMpv *self,
bool italic) {
int val = italic;
mpv_set_property(self->mpv_ctx->handle, "sub-italic", MPV_FORMAT_FLAG, &val);
}

View File

@ -47,5 +47,13 @@ void vpm_video_player_mpv_set_subtitle_background_colour(
VpmVideoPlayerMpv *self, char *colour);
void vpm_video_player_mpv_set_subtitle_position(VpmVideoPlayerMpv *self,
uint position);
void vpm_video_player_mpv_set_subtitle_font_family(VpmVideoPlayerMpv *self,
char *family);
void vpm_video_player_mpv_set_subtitle_font_size(VpmVideoPlayerMpv *self,
uint size);
void vpm_video_player_mpv_set_subtitle_font_bold(VpmVideoPlayerMpv *self,
bool bold);
void vpm_video_player_mpv_set_subtitle_font_italic(VpmVideoPlayerMpv *self,
bool italic);
G_END_DECLS