#ui #widgets #bindings #graphics

bin+lib fl2rust

A fluid (fltk ui designer) file to Rust transpiler

63 releases

new 0.6.0 Dec 9, 2024
0.5.21 Sep 21, 2024
0.5.19 Dec 29, 2023
0.5.17 Aug 2, 2023
0.3.2 Feb 19, 2021

#324 in GUI

Download history 34/week @ 2024-08-22 23/week @ 2024-08-29 16/week @ 2024-09-05 223/week @ 2024-09-12 302/week @ 2024-09-19 135/week @ 2024-09-26 68/week @ 2024-10-03 49/week @ 2024-10-10 35/week @ 2024-10-17 32/week @ 2024-10-24 52/week @ 2024-10-31 44/week @ 2024-11-07 34/week @ 2024-11-14 70/week @ 2024-11-21 38/week @ 2024-11-28 198/week @ 2024-12-05

342 downloads per month
Used in 3 crates

MIT license

37KB
881 lines

fl2rust

Usage

A fluid (fltk ui designer) file to Rust transpiler.

MSRV

The minimum supported Rust version for 0.5 is 1.63 and fltk-rs > 1.3.21.

As an executable

You can run fl2rust on the command-line by installing using cargo-install:

$ cargo install fl2rust

Then run:

$ fl2rust <fl file>.fl > <output file>.rs

As a proc-macro

(A template repo usable via cargo-generate can be found here) Add fl2rust-macro to your list of dependencies:

# Cargo.toml
[dependencies]
fltk = "1"
fl2rust-macro = "0.5"

The ui file that's generated by fluid, we'll name it myuifile.fl and keep it in our src directory:

# data file for the Fltk User Interface Designer (fluid)
version 1.0400
header_name {.h}
code_name {.cxx}
class UserInterface {open
} {
  Function {make_window()} {open
  } {
    Fl_Window {} {open selected
      xywh {138 161 440 355} type Double visible
    } {
      Fl_Button but {
        label {Click me}
        xywh {175 230 95 45}
      }
    }
  }
}

In our main source file:

use fltk::{prelude::*, *};

mod ui {
    fl2rust_macro::include_ui!("src/myuifile.fl");
}

fn main() {
    let a = app::App::default();
    let mut ui = ui::UserInterface::make_window();
    ui.but.set_callback(|b| println!("Button clicked!"));
    a.run().unwrap();
}

In our build.rs file:

fn main() {
    println!("cargo:rerun-if-changed=src/myuifile.fl");
}

As a build-dependency

To automate things through cargo, you can use fl2rust as a library by adding it to your build-dependencies:

# Cargo.toml
[dependencies]
fltk = "1"

[build-dependencies]
fl2rust = "0.5"
// build.rs
fn main() {
    use std::path::PathBuf;
    use std::env;
    println!("cargo:rerun-if-changed=src/myuifile.fl");
    let g = fl2rust::Generator::default();
    let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
    g.in_out("src/myuifile.fl", out_path.join("myuifile.rs").to_str().unwrap()).expect("Failed to generate rust from fl file!");
}

The ui file that's generated by fluid, we'll name it myuifile.fl and keep it in our src directory:

# data file for the Fltk User Interface Designer (fluid)
version 1.0400
header_name {.h}
code_name {.cxx}
class UserInterface {open
} {
  Function {make_window()} {open
  } {
    Fl_Window {} {open selected
      xywh {138 161 440 355} type Double visible
    } {
      Fl_Button but {
        label {Click me}
        xywh {175 230 95 45}
      }
    }
  }
}
// src/myuifile.rs
#![allow(unused_variables)]
#![allow(unused_mut)]
#![allow(unused_imports)]
#![allow(dead_code)]
#![allow(clippy::needless_update)]

include!(concat!(env!("OUT_DIR"), "/myuifile.rs"));
// src/main.rs
use fltk::{prelude::*, *};
mod myuifile;

fn main() {
    let app = app::App::default();
    let mut ui = myuifile::UserInterface::make_window();
    ui.but.set_callback(move |_| {
        println!("Works!");
    });
    app.run().unwrap();
}

Where you can get FLUID?

There are several options:

  • cargo install fltk-fluid
  • Through a package manager.
  • By building the fltk library yourself using cmake.

i18n support

Version 0.4.4 adds i18n support via the tr! macro from the tr crate. To enable it:

  • In fluid, go to Edit->Project Settings...->Internationalization.
  • Change the dropdown to use GNU gettext (which the tr crate supports in both forms gettext-rs and gettext).
  • Add tr to you dependencies in you Cargo.toml.
  • Add to your main.rs file:
#[macro_use]
extern crate tr;
  • Initialize tr as described in the tr crate's documentation.

Known limitations

  • Only constructor methods are supported.
  • fl2rust doesn't check the generated Rust code for correctness.

Tutorial

Dependencies

~32KB