#effect #tui #ratatui #terminal #ui

tachyonfx

为TUI创建类似着色器效果的光子fx库

5个版本 (破坏性)

新版本 0.5.0 2024年8月21日
0.4.0 2024年7月14日
0.3.0 2024年6月30日
0.2.0 2024年6月23日
0.1.0 2024年6月20日

#219 in 命令行界面

Download history 292/week @ 2024-06-20 189/week @ 2024-06-27 23/week @ 2024-07-04 114/week @ 2024-07-11 16/week @ 2024-07-18 49/week @ 2024-07-25 89/week @ 2024-08-15

143 每月下载量

MIT 许可证

7MB
4.5K SLoC

tachyonfx

Crate Badge API Badge Deps.rs Badge

tachyonfx是一个用于在终端UI中创建类似着色器效果的ratatui库。此库提供了一系列效果,可用于增强终端应用程序的视觉吸引力,包括颜色变换、动画和复杂效果组合等功能。

demo

安装

将tachyonfx添加到您的Cargo.toml

tachyonfx = "0.5.0"

概述

效果

该库包含各种效果,大致分为以下几类

颜色效果

  • fade_from: 从指定的背景和前景颜色渐变
  • fade_from_fg: 从指定颜色渐变前景颜色。
  • fade_to: 渐变到指定的背景和前景颜色。
  • fade_to_fg: 将前景颜色渐变到指定颜色。
  • hsl_shift: 改变前景和背景颜色的色调、饱和度和亮度。
  • hsl_shift_fg: 在指定时间内将前景颜色按指定的色调、饱和度和亮度偏移。
  • term256_colors: 下采样到256色模式。

文本/字符效果

  • coalesce: 与dissolve相反,将文本在指定时间内合并。
  • dissolve: 在指定时间内将当前文本溶解。
  • slide_in: 将方向滑动效果应用于终端单元格。
  • slide_out: 将方向滑动出效果应用于终端单元格。
  • sweep_in: 从指定颜色开始扫描。
  • sweep_out: 扫描到指定颜色。

计时和控制效果

  • consume_tick: 消耗一个计时器滴答。
  • never_complete: 使效果无限期运行。
  • ping_pong: 先向前播放效果,然后向后播放。
  • prolong_start: 通过指定持续时间延长效果的开始。
  • prolong_end: 通过指定持续时间延长效果的结束。
  • repeat: 无限期或指定次数或持续时间地重复效果。
  • repeating: 无限期重复效果。
  • sleep: 暂停指定时长。
  • timed_never_complete: 创建一个无限运行但具有强制持续时间的效果。
  • with_duration: 包装一个效果并强制设置其持续时间。

几何效果

  • translate: 通过指定量移动效果区域。
  • translate_buf: 从辅助缓冲区复制内容,并按指定量移动。
  • resize_area: 调整包装效果的区域。

组合效果

  • parallel: 并行运行效果,所有效果同时进行。一旦所有效果完成,则报告完成。
  • sequence: 按顺序运行效果,一个接一个。一旦最后一个效果完成,则报告完成。

其他效果

  • effect_fn: 从用户定义的函数创建自定义效果,在 CellIterator 上操作。
  • effect_fn_buf: 从函数创建自定义效果,在 Buffer 上操作。
  • offscreen_buffer: 包装现有效果并将其渲染重定向到单独的缓冲区。

EffectTimer 和插值

EffectTimer 用于控制效果的时间和插值。它允许在应用程序中精确地定时和同步视觉效果。

单元格选择和区域

可以将效果应用于终端 UI 的特定单元格,从而实现有针对性的视觉修改和动画。

// only apply to cells with `Light2` foreground color
fx::sweep_in(Direction::UpToDown, 15, Dark0, timer)
    .with_cell_selection(CellFilter::FgColor(Light2.into()))

CellFilter 可以组合形成复杂的选择标准。

// apply effect to cells on the outer border of the area
let margin = Margin::new(1, 1);
let border_text = CellFilter::AllOf(vec![
    CellFilter::Outer(margin),
    CellFilter::Text
]);

sequence(vec![
    with_duration(duration, never_complete(fx::fade_to(Dark0, Dark0, 0))),
    fx::fade_from(Dark0, Dark0, (320, QuadOut)),
]).with_cell_selection(border_text)

示例

示例: tweens

tweens

cargo run --release --example=tweens 

示例: basic-effects

basic effeects

cargo run --release --example=basic-effects 

示例: open-window

cargo run --release --example=open-window  

示例: fx-chart

fx-chart

这是 EffectTimelineWidget 的一个演示,展示了效果的组合。该小部件是一个“纯”小部件,其渲染过程中没有任何效果。效果而是在渲染小部件之后应用。

cargo run --release --example=fx-chart  

依赖项

~8–18MB
~244K SLoC