#bindings #graphics #gui

fltk-derive

Rust 对 FLTK 图形用户界面库的绑定

216 个版本 (33 个稳定版)

1.2.5 2021年10月2日
1.1.15 2021年8月31日
1.1.5 2021年7月31日
0.16.5 2021年4月9日
0.1.22 2020年3月31日

#787 in #gui

Download history 42/week @ 2024-03-13 14/week @ 2024-03-20 75/week @ 2024-03-27 145/week @ 2024-04-03 20/week @ 2024-04-10 20/week @ 2024-04-17 48/week @ 2024-04-24 15/week @ 2024-05-01 15/week @ 2024-05-08 17/week @ 2024-05-15 38/week @ 2024-05-22 30/week @ 2024-05-29 28/week @ 2024-06-05 23/week @ 2024-06-12 17/week @ 2024-06-19 11/week @ 2024-06-26

86 每月下载量

MIT 许可证

180KB
4.5K SLoC

fltk-rs

Documentation Crates.io License Build

Rust 对 FLTK 图形用户界面库的绑定。

fltk crate 是一个跨平台的轻量级GUI库,可以静态链接以生成小型、自包含且快速的GUI应用程序。

资源

为什么选择FLTK?

  • 轻量级。二进制文件小,去冗余后大约1MB。 内存占用小
  • 速度。安装快、构建快、启动快、运行快。
  • 单个可执行文件。无需部署DLL。
  • 支持旧架构。
  • FLTK的开源许可证允许静态链接用于封闭源代码应用程序。
  • 可主题化(支持5种方案:Base、GTK、Plastic、Gleam和Oxy),并可以使用fltk-theme进行额外的主题化。
  • 提供约80个可定制的小部件。
  • 内置图像支持。

以下是使用FLTK的软件列表。对于使用fltk-rs的软件,请查看此处

使用方法

只需将以下内容添加到您的项目Cargo.toml文件中

[dependencies]
fltk = "^1.4"

要使用仓库中的最新更改

[dependencies]
fltk = { version = "^1.4", git = "https://github.com/fltk-rs/fltk-rs" }

或者如果您有其他依赖于fltk-rs的依赖项

[dependencies]
fltk = "^1.4"

[patch.crates-io]
fltk = { git = "https://github.com/fltk-rs/fltk-rs" }

要使用捆绑的库(适用于x64 Windows (msvc & gnu (msys2-mingw))、x64 & aarch64 Linux & macOS)

[dependencies]
fltk = { version = "^1.4", features = ["fltk-bundled"] }

库将自动构建并静态链接到您的二进制文件。

一个hello world示例应用程序

use fltk::{app, prelude::*, window::Window};

fn main() {
    let app = app::App::default();
    let mut wind = Window::new(100, 100, 400, 300, "Hello from rust");
    wind.end();
    wind.show();
    app.run().unwrap();
}

另一个示例,展示了基本的回调功能

use fltk::{app, button::Button, frame::Frame, prelude::*, window::Window};

fn main() {
    let app = app::App::default();
    let mut wind = Window::new(100, 100, 400, 300, "Hello from rust");
    let mut frame = Frame::new(0, 0, 400, 200, "");
    let mut but = Button::new(160, 210, 80, 40, "Click me!");
    wind.end();
    wind.show();
    but.set_callback(move |_| frame.set_label("Hello World!")); // the closure capture is mutable borrow to our button
    app.run().unwrap();
}

请查看示例目录获取更多示例。您会注意到所有小部件都是通过new()方法实例化的,该方法接收小部件的x和y坐标、宽度、高度以及一个标签,如果需要可以留空。初始化小部件的另一种方法是使用构建器模式:(以下按钮是等价的)

use fltk::{button::Button, prelude::*};
let but1 = Button::new(10, 10, 80, 40, "Button 1");

let but2 = Button::default()
    .with_pos(10, 10)
    .with_size(80, 40)
    .with_label("Button 2");

一个使用构建器模式的计数器示例

use fltk::{app, button::Button, frame::Frame, prelude::*, window::Window};
fn main() {
    let app = app::App::default();
    let mut wind = Window::default()
        .with_size(160, 200)
        .center_screen()
        .with_label("Counter");
    let mut frame = Frame::default()
        .with_size(100, 40)
        .center_of(&wind)
        .with_label("0");
    let mut but_inc = Button::default()
        .size_of(&frame)
        .above_of(&frame, 0)
        .with_label("+");
    let mut but_dec = Button::default()
        .size_of(&frame)
        .below_of(&frame, 0)
        .with_label("-");
    wind.make_resizable(true);
    wind.end();
    wind.show();
    /* Event handling */
    app.run().unwrap();
}

或者,您可以使用Flex(用于flexbox布局)、Pack或Grid

use fltk::{app, button::Button, frame::Frame, group::Flex, prelude::*, window::Window};
fn main() {
    let app = app::App::default();
    let mut wind = Window::default().with_size(160, 200).with_label("Counter");
    let mut flex = Flex::default().with_size(120, 140).center_of_parent().column();
    let mut but_inc = Button::default().with_label("+");
    let mut frame = Frame::default().with_label("0");
    let mut but_dec = Button::default().with_label("-");
    flex.end();
    wind.end();
    wind.show();
    app.run().unwrap();
}

另一个示例

use fltk::{app, button::Button, frame::Frame, group::Flex, prelude::*, window::Window};

fn main() {
    let app = app::App::default();
    let mut wind = Window::default().with_size(400, 300);
    let mut col = Flex::default_fill().column();
    col.set_margins(120, 80, 120, 80);
    let mut frame = Frame::default();
    let mut but = Button::default().with_label("Click me!");
    col.fixed(&but, 40);
    col.end();
    wind.end();
    wind.show();

    but.set_callback(move |_| frame.set_label("Hello world"));

    app.run().unwrap();
}

事件

可以使用set_callback方法(如上所示)或可用的fltk::app::set_callback()自由函数来处理事件,该函数将处理每个小部件的默认触发器(如按钮的点击)

    /* previous hello world code */
    but.set_callback(move |_| frame.set_label("Hello World!"));
    another_but.set_callback(|this_button| this_button.set_label("Works"));
    app.run().unwrap();

另一种方法是使用消息传递

    /* previous counter code */
    let (s, r) = app::channel::<Message>();

    but_inc.emit(s, Message::Increment);
    but_dec.emit(s, Message::Decrement);
    
    while app.wait() {
        let label: i32 = frame.label().parse().unwrap();
        if let Some(msg) = r.recv() {
            match msg {
                Message::Increment => frame.set_label(&(label + 1).to_string()),
                Message::Decrement => frame.set_label(&(label - 1).to_string()),
            }
        }
    }

有关代码的其余部分,请查看完整的示例此处

对于自定义事件处理,可以使用handle()方法

    some_widget.handle(move |widget, ev: Event| {
        match ev {
            Event::Push => {
                println!("Pushed!");
                true
            },
            /* other events to be handled */
            _ => false,
        }
    });

使用handle方法处理或忽略的事件应返回true,未处理的事件应返回false。更多示例可在fltk/examples目录中找到。

对于使用即时模式方法的替代事件处理机制,请查看fltk-evented crate

主题

FLTK提供了5种应用程序方案

  • 基础
  • Gtk
  • Gleam
  • Plastic
  • Oxy

(在fltk-theme crate)中可以找到额外的主题)

这些可以通过App::with_scheme()方法设置。

let app = app::App::default().with_scheme(app::Scheme::Gleam);

可以使用WidgetExt特质中提供的方法可选地修改单个小部件的主题,例如set_color()set_label_font()set_frame()

    some_button.set_color(Color::Light1); // You can use one of the provided colors in the fltk enums
    some_button.set_color(Color::from_rgb(255, 0, 0)); // Or you can specify a color by rgb or hex/u32 value
    some_button.set_color(Color::from_u32(0xffebee));
    some_button.set_frame(FrameType::RoundUpBox);
    some_button.set_font(Font::TimesItalic);

对于默认应用程序颜色,fltk-rs提供了app::background()app::background2()app::foreground()。您还可以指定默认应用程序选择/非活动颜色、字体、标签大小、框架类型、滚动条大小、菜单行间距。此外,fltk-theme crate还提供了一些其他预定义的颜色图(深色主题、米色等)和可以加载到您的应用程序中的小部件主题。

构建依赖项

Rust(版本 > 1.63)、CMake(版本 > 3.15)、Git和C++17编译器需要安装并添加到您的PATH中,才能从源代码进行跨平台构建。Ninja是推荐的,但不是必需的。此crate还提供了一些x86_64和aarch64平台(Windows(msvc和gnu)、MacOS、Linux)上预包装的fltk版本,这可以通过在用法部分中提到的fltk-bundled功能标志启用(这需要curl和tar下载和解包预包装的库)。

  • Windows
    • MSVC: Windows SDK
    • Gnu: 无依赖
  • MacOS: 无依赖。
  • Linux/BSD: 开发需要安装 X11 和 OpenGL 的开发头文件。这些库通常在带有图形用户界面的 Linux/bsd 发行版上可用。

对于基于 Debian 的 GUI 发行版,这意味着运行

sudo apt-get install libx11-dev libxext-dev libxft-dev libxinerama-dev libxcursor-dev libxrender-dev libxfixes-dev libpango1.0-dev libgl1-mesa-dev libglu1-mesa-dev

对于基于 RHEL 的 GUI 发行版,这意味着运行

sudo yum groupinstall "X Software Development" && yum install pango-devel libXinerama-devel libstdc++-static

对于基于 Arch 的 GUI 发行版,这意味着运行

sudo pacman -S libx11 libxext libxft libxinerama libxcursor libxrender libxfixes pango cairo libgl mesa --needed

对于 Alpine Linux

apk add pango-dev fontconfig-dev libxinerama-dev libxfixes-dev libxcursor-dev mesa-gl

对于 NixOS(Linux 发行版),可以使用此 nix-shell 环境

nix-shell --packages rustc cmake git gcc xorg.libXext xorg.libXft xorg.libXinerama xorg.libXcursor xorg.libXrender xorg.libXfixes libcerf pango cairo libGL mesa pkg-config

运行时依赖

  • Windows: 无
  • MacOS: 无
  • Linux: 您需要 X11 库,以及 pango 和 cairo 用于绘图(如果您想启用 enable-glwindow 功能,还需要 OpenGL)
apt-get install -qq --no-install-recommends libx11-6 libxinerama1 libxft2 libxext6 libxcursor1 libxrender1 libxfixes3 libcairo2 libpango-1.0-0 libpangocairo-1.0-0 libpangoxft-1.0-0 libglib2.0-0 libfontconfig1 libglu1-mesa libgl1

请注意,如果您安装了构建依赖项,它还将自动安装运行时依赖项。

另外请注意,大多数图形桌面环境已经安装了这些库。此列表可以在您想测试已经构建的软件包在 CI/docker(其中没有图形用户界面)中时有用。

特性

以下是由 crate 提供的特性

  • use-ninja: 如果可用,使用 ninja 构建系统以实现更快的构建,特别是在 Windows 上。
  • no-pango: 在 Linux/BSD 上构建不带 pango 支持,如果不需要 rtl/cjk 字体支持。
  • fltk-bundled: 在选定平台上支持 cfltk 和 fltk 的捆绑版本(需要 curl 和 tar)
  • enable-glwindow: 支持使用 OpenGL 函数进行绘图。
  • system-libpng: 使用系统 libpng
  • system-libjpeg: 使用系统 libjpeg
  • system-zlib: 使用系统 zlib
  • use-wayland: 使用 FLTK 的 wayland 混合后端(在存在 wayland 时在 wayland 上运行,在不存在时在 X11 上运行)。需要 libwayland-dev、wayland-protocols、libdbus-1-dev、libxkbcommon-dev、libgtk-3-dev(可选,用于 GTK 风格标题栏),以及 X11 开发包。示例 CI
  • fltk-config: 使用已安装的 FLTK 的 fltk-config 来构建此 crate。这仍然需要 FLTK 1.4。这对于减少构建时间,测试本地构建的 FLTK 很有用,并且不需要调用 git 或 cmake。

常见问题解答

请查看 FAQ 页面,了解常见问题、遇到的问题、部署指南和贡献。

构建

要构建,只需运行

git clone https://github.com/fltk-rs/fltk-rs --recurse-submodules
cd fltk-rs
cargo build

当前实现的数据类型

图像类型

  • SharedImage
  • BmpImage
  • JpegImage
  • GifImage
  • AnimGifImage
  • PngImage
  • SvgImage
  • Pixmap
  • RgbImage
  • XpmImage
  • XbmImage
  • PnmImage
  • TiledImage

小部件

  • 按钮
    • Button
    • RadioButton
    • ToggleButton
    • RoundButton
    • CheckButton
    • LightButton
    • RepeatButton
    • RadioLightButton
    • RadioRoundButton
    • ReturnButton
    • ShortcutButton
  • 对话框
    • 本地文件对话框
    • 文件选择器
    • 帮助对话框
    • 消息对话框
    • 警告对话框
    • 密码对话框
    • 选择对话框
    • 输入对话框
    • 颜色选择器对话框
  • 框架 (Fl_Box)
  • Windows
    • 窗口
    • SingleWindow (单缓冲)
    • DoubleWindow (双缓冲)
    • MenuWindow
    • OverlayWindow
    • GlWindow (需要 "enable-glwindow" 标志)
    • 实验性 GlWidgetWindow (需要 "enable-glwindow" 标志)
  • 文本显示小部件
    • TextDisplay
    • TextEditor
    • 简单终端
  • 输入小部件
    • Input
    • IntInput
    • FloatInput
    • MultilineInput
    • SecretInput
    • FileInput
  • 输出小部件
    • Output
    • MultilineOutput
  • 菜单小部件
    • MenuBar
    • MenuItem
    • 选择(下拉列表)
    • SysMenuBar(出现在屏幕顶部的MacOS菜单栏)
  • 值选择器小部件
    • 滑块
    • NiceSlider
    • ValueSlider
    • 旋钮
    • LineDial
    • 计数器
    • 滚动条
    • 滚筒
    • 调整器
    • 值输入
    • 值输出
    • 填充滑块
    • 填充旋钮
    • HorSlider(水平滑块)
    • HorFillSlider
    • HorNiceSlider
    • HorValueSlider
  • 浏览小部件
    • 浏览器
    • SelectBrowser
    • HoldBrowser
    • MultiBrowser
    • 文件浏览器
    • CheckBrowser
  • 杂项小部件
    • Spinner
    • 时钟(圆形和方形)
    • 图表(提供多种图表类型)
    • 进度(进度条)
    • 工具提示
    • 输入选择
    • 帮助视图
  • 表格小部件
    • 树项

绘图原语

(在draw模块中)

表面类型

  • 打印机。
  • ImageSurface。
  • SvgFileSurface。

GUI设计器

fltk-rs支持FLUID,FLTK的RAD WYSIWYG设计器。查看fl2rust cratefl2rust模板

示例

运行示例

cargo run --example editor
cargo run --example calculator
cargo run --example calculator2
cargo run --example counter
cargo run --example hello_svg
cargo run --example hello_button
cargo run --example fb
cargo run --example pong
cargo run --example custom_widgets
cargo run --example custom_dial
...

使用自定义主题和FLTK提供的默认方案,如Gtk

不同的框架类型,可以与许多不同的小部件一起使用,如框架、按钮小部件、输入/输出小部件等。

更多有趣的示例可以在fltk-rs-demos 仓库中找到。还可以在这里找到7guis任务的出色实现这里。还可以在这里找到各种高级示例这里

主题

更多主题可以在fltk-theme crate中找到。

  • screenshots/aero.jpg

  • screenshots/black.jpg

等等...

额外小部件

此crate公开FLTK的 widget集,全部可定制。还可以在fltk-extras crate中找到额外的自定义小部件。

image

image

ss

image

教程

在此播放列表中还有更多视频这里。一些示例项目可以在这里找到。

依赖关系

~1.5MB
~34K SLoC