Accessibility

FLTK提供了一些开箱即用的无障碍功能:

  • 在ui元素之间和内部的键盘导航。
  • 键盘快捷键。
  • 键盘可替代的鼠标操作。
  • IME 支持。
  • 为组件和自定义组件设置按键事件。

屏幕阅读器的支持集成在另一个 crate 中:

这个例子使用了 fltk-accesskit 编写了一个无障碍程序的示例:

例子:

#![windows_subsystem = "windows"]
use fltk::{prelude::*, *};
use fltk_accesskit::{AccessibilityContext, AccessibleApp};

fn main() {
    let a = app::App::default().with_scheme(app::Scheme::Oxy);
    let mut w = window::Window::default()
        .with_size(400, 300)
        .with_label("Hello fltk-accesskit");
    let col = group::Flex::default()
        .with_size(200, 100)
        .center_of_parent()
        .column();
    let inp = input::Input::default().with_id("inp").with_label("Enter name:");
    let mut btn = button::Button::default().with_label("Greet");
    let out = output::Output::default().with_id("out");
    col.end();
    w.end();
    w.make_resizable(true);
    w.show();

    btn.set_callback(btn_callback);

    let ac = AccessibilityContext::new(
        w,
        vec![Box::new(inp), Box::new(btn), Box::new(out)],
    );

    a.run_with_accessibility(ac).unwrap();
}

fn btn_callback(_btn: &mut button::Button) {
    let inp: input::Input = app::widget_from_id("inp").unwrap();
    let mut out: output::Output = app::widget_from_id("out").unwrap();
    let name = inp.value();
    if name.is_empty() {
        return;
    }
    out.set_value(&format!("Hello {}", name));
}

Accessible Trait 是为一些特定的组件实现的。 这个例子中,你需要实例化一个fltk_accesskit::AccessibilityContext,它需要你将根组件(主窗口),以及会被屏幕阅读器识别的组件作为参数。 最后你需要使用特殊的 run_with_accessibility 来运行 App结构。