use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize, Default)]
#[serde(rename_all = "lowercase")]
pub enum VsyncMode {
Immediate,
Mailbox,
#[default]
Fifo,
}
impl VsyncMode {
#[cfg(feature = "wgpu-types")]
pub fn to_present_mode(self) -> wgpu::PresentMode {
match self {
VsyncMode::Immediate => wgpu::PresentMode::Immediate,
VsyncMode::Mailbox => wgpu::PresentMode::Mailbox,
VsyncMode::Fifo => wgpu::PresentMode::Fifo,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize, Default)]
#[serde(rename_all = "snake_case")]
pub enum PowerPreference {
#[default]
None,
LowPower,
HighPerformance,
}
impl PowerPreference {
#[cfg(feature = "wgpu-types")]
pub fn to_wgpu(self) -> wgpu::PowerPreference {
match self {
PowerPreference::None => wgpu::PowerPreference::None,
PowerPreference::LowPower => wgpu::PowerPreference::LowPower,
PowerPreference::HighPerformance => wgpu::PowerPreference::HighPerformance,
}
}
pub fn display_name(&self) -> &'static str {
match self {
PowerPreference::None => "None (System Default)",
PowerPreference::LowPower => "Low Power (Integrated GPU)",
PowerPreference::HighPerformance => "High Performance (Discrete GPU)",
}
}
pub fn all() -> &'static [PowerPreference] {
&[
PowerPreference::None,
PowerPreference::LowPower,
PowerPreference::HighPerformance,
]
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
#[serde(rename_all = "lowercase")]
pub enum ImageScalingMode {
Nearest,
#[default]
Linear,
}
impl ImageScalingMode {
pub fn display_name(&self) -> &'static str {
match self {
ImageScalingMode::Nearest => "Nearest (Sharp)",
ImageScalingMode::Linear => "Linear (Smooth)",
}
}
pub fn all() -> &'static [ImageScalingMode] {
&[ImageScalingMode::Nearest, ImageScalingMode::Linear]
}
#[cfg(feature = "wgpu-types")]
pub fn to_filter_mode(self) -> wgpu::FilterMode {
match self {
ImageScalingMode::Nearest => wgpu::FilterMode::Nearest,
ImageScalingMode::Linear => wgpu::FilterMode::Linear,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
#[serde(rename_all = "lowercase")]
pub enum BackgroundImageMode {
Fit,
Fill,
#[default]
Stretch,
Tile,
Center,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
#[serde(rename_all = "lowercase")]
pub enum BackgroundMode {
#[default]
Default,
Color,
Image,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct PaneBackgroundConfig {
pub index: usize,
pub image: String,
#[serde(default)]
pub mode: BackgroundImageMode,
#[serde(default = "crate::defaults::background_image_opacity")]
pub opacity: f32,
#[serde(default = "crate::defaults::pane_background_darken")]
pub darken: f32,
}
#[derive(Debug, Clone, Default)]
pub struct PaneBackground {
pub image_path: Option<String>,
pub mode: BackgroundImageMode,
pub opacity: f32,
pub darken: f32,
}
impl PaneBackground {
pub fn new() -> Self {
Self {
image_path: None,
mode: BackgroundImageMode::default(),
opacity: 1.0,
darken: 0.0,
}
}
pub fn has_image(&self) -> bool {
self.image_path.is_some()
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
#[serde(rename_all = "snake_case")]
pub enum PaneTitlePosition {
#[default]
Top,
Bottom,
}
impl PaneTitlePosition {
pub const ALL: &'static [PaneTitlePosition] =
&[PaneTitlePosition::Top, PaneTitlePosition::Bottom];
pub fn display_name(&self) -> &'static str {
match self {
PaneTitlePosition::Top => "Top",
PaneTitlePosition::Bottom => "Bottom",
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
#[serde(rename_all = "snake_case")]
pub enum DividerStyle {
#[default]
Solid,
Double,
Dashed,
Shadow,
}
impl DividerStyle {
pub const ALL: &'static [DividerStyle] = &[
DividerStyle::Solid,
DividerStyle::Double,
DividerStyle::Dashed,
DividerStyle::Shadow,
];
pub fn display_name(&self) -> &'static str {
match self {
DividerStyle::Solid => "Solid",
DividerStyle::Double => "Double",
DividerStyle::Dashed => "Dashed",
DividerStyle::Shadow => "Shadow",
}
}
}
#[derive(Debug, Clone, Copy)]
pub struct DividerRect {
pub x: f32,
pub y: f32,
pub width: f32,
pub height: f32,
pub is_horizontal: bool,
}
impl DividerRect {
pub fn new(x: f32, y: f32, width: f32, height: f32, is_horizontal: bool) -> Self {
Self {
x,
y,
width,
height,
is_horizontal,
}
}
pub fn contains(&self, px: f32, py: f32, padding: f32) -> bool {
px >= self.x - padding
&& px < self.x + self.width + padding
&& py >= self.y - padding
&& py < self.y + self.height + padding
}
}
pub type SeparatorMark = (usize, Option<i32>, Option<(u8, u8, u8)>);
pub type PaneId = u64;
pub type TabId = u64;