dit7ya / Relm4

An idiomatic GUI library inspired by Elm and based on gtk4-rs

Home Page:https://relm4.org

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Relm4

CI Matrix Relm4 on crates.io Relm4 docs Relm4 book Minimum Rust version 1.56 dependency status

An idiomatic GUI library inspired by Elm and based on gtk4-rs. Relm4 is a new version of relm that's built from scratch and is compatible with GTK4 and libadwaita.

Why Relm4

We believe that GUI development should be easy, productive and delightful.
The gtk4-rs crate already provides everything you need to write modern, beautiful and cross-platform applications. Built on top of this foundation, Relm4 makes developing more idiomatic, simpler and faster and enables you to become productive in just a few hours.

Our goals

  • ⏱️ Productivity
  • ✨ Simplicity
  • πŸ“Ž Outstanding documentation
  • πŸ”§ Maintainability

Documentation

Need help?

If you find yourself having trouble with anything, feel free to ask questions at:

Dependencies

Relm4 depends on GTK4: How to install GTK4.

Ecosystem

Relm4 has two crates that extend the core functionality:

  • relm4-macros provides a widget macro that simplifies UI creation
  • relm4-components is a collections of reusable components you can easily integrate into your application

To use all features, just add this to your Cargo.toml:

relm4 = { version = "0.4", features = ["macros"] }
relm4-components = "0.4"

Features

The relm4 crate has four feature flags:

 Flag  Purpose
 macros  Enable macros by re-exporting relm4-macros
 tokio-rt  Adds the AsyncRelmWorker type that uses an asynchronous update function
 libadwaita  Improved support for libadwaita
 all  Enable all features

Examples

Several example applications are available at relm4-examples/.

A simple counter app

Simple app screenshot light Simple app screenshot dark

use gtk::prelude::{BoxExt, ButtonExt, GtkWindowExt, OrientableExt};
use relm4::{send, AppUpdate, Model, RelmApp, Sender, WidgetPlus, Widgets};

#[derive(Default)]
struct AppModel {
    counter: u8,
}

enum AppMsg {
    Increment,
    Decrement,
}

impl Model for AppModel {
    type Msg = AppMsg;
    type Widgets = AppWidgets;
    type Components = ();
}

impl AppUpdate for AppModel {
    fn update(&mut self, msg: AppMsg, _components: &(), _sender: Sender<AppMsg>) -> bool {
        match msg {
            AppMsg::Increment => {
                self.counter = self.counter.wrapping_add(1);
            }
            AppMsg::Decrement => {
                self.counter = self.counter.wrapping_sub(1);
            }
        }
        true
    }
}

#[relm4::widget]
impl Widgets<AppModel, ()> for AppWidgets {
    view! {
        gtk::ApplicationWindow {
            set_title: Some("Simple app"),
            set_default_width: 300,
            set_default_height: 100,
            set_child = Some(&gtk::Box) {
                set_orientation: gtk::Orientation::Vertical,
                set_margin_all: 5,
                set_spacing: 5,

                append = &gtk::Button {
                    set_label: "Increment",
                    connect_clicked(sender) => move |_| {
                        send!(sender, AppMsg::Increment);
                    },
                },
                append = &gtk::Button {
                    set_label: "Decrement",
                    connect_clicked(sender) => move |_| {
                        send!(sender, AppMsg::Decrement);
                    },
                },
                append = &gtk::Label {
                    set_margin_all: 5,
                    set_label: watch! { &format!("Counter: {}", model.counter) },
                }
            },
        }
    }
}

fn main() {
    let model = AppModel::default();
    let app = RelmApp::new(model);
    app.run();
}

Projects using Relm4

  • fm β€” A small, general-purpose file manager.
  • Done - A simple and versatile to do app.
  • Reovim - GUI frontend for neovim.

License

Licensed under either of

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Feedback and contributions are highly appreciated!

About

An idiomatic GUI library inspired by Elm and based on gtk4-rs

https://relm4.org

License:Apache License 2.0


Languages

Language:Rust 100.0%