Skip to content

Relm4/Relm4

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

CI Matrix Relm4 on crates.io Relm4 docs Relm4 book Minimum Rust version 1.85 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

Dependencies

Relm4 depends on GTK4: How to install GTK4 and Rust

Ecosystem

Use this in to your Cargo.toml:

# Core library
relm4 = "0.9"
# Optional: reusable components
relm4-components = "0.9"
# Optional: icons (more info at https://github.com/Relm4/icons)
relm4-icons = "0.9.0"

Features

The relm4 crate has four feature flags:

Flag Purpose Default
macros Enable macros by re-exporting relm4-macros βœ…
libadwaita Improved support for libadwaita -
libpanel Improved support for libpanel -
gnome_47 Enable all version feature flags of all dependencies to match the GNOME 47 SDK -
gnome_46 Enable all version feature flags of all dependencies to match the GNOME 46 SDK -
gnome_45 Enable all version feature flags of all dependencies to match the GNOME 45 SDK -
gnome_44 Enable all version feature flags of all dependencies to match the GNOME 44 SDK -
gnome_43 Enable all version feature flags of all dependencies to match the GNOME 43 SDK -
gnome_42 Enable all version feature flags of all dependencies to match the GNOME 42 SDK βœ…

The macros feature is a default feature.

Examples

Several example applications are available at examples/.

A simple counter app

Simple app screenshot light Simple app screenshot dark

use gtk::prelude::*;
use relm4::prelude::*;

struct App {
    counter: u8,
}

#[derive(Debug)]
enum Msg {
    Increment,
    Decrement,
}

#[relm4::component]
impl SimpleComponent for App {
    type Init = u8;
    type Input = Msg;
    type Output = ();

    view! {
        gtk::Window {
            set_title: Some("Simple app"),
            set_default_size: (300, 100),

            gtk::Box {
                set_orientation: gtk::Orientation::Vertical,
                set_spacing: 5,
                set_margin_all: 5,

                gtk::Button {
                    set_label: "Increment",
                    connect_clicked => Msg::Increment,
                },

                gtk::Button {
                    set_label: "Decrement",
                    connect_clicked => Msg::Decrement,
                },

                gtk::Label {
                    #[watch]
                    set_label: &format!("Counter: {}", model.counter),
                    set_margin_all: 5,
                }
            }
        }
    }

    // Initialize the component.
    fn init(
        counter: Self::Init,
        root: Self::Root,
        sender: ComponentSender<Self>,
    ) -> ComponentParts<Self> {
        let model = App { counter };

        // Insert the code generation of the view! macro here
        let widgets = view_output!();

        ComponentParts { model, widgets }
    }

    fn update(&mut self, msg: Self::Input, _sender: ComponentSender<Self>) {
        match msg {
            Msg::Increment => {
                self.counter = self.counter.wrapping_add(1);
            }
            Msg::Decrement => {
                self.counter = self.counter.wrapping_sub(1);
            }
        }
    }
}

fn main() {
    let app = RelmApp::new("relm4.example.simple");
    app.run::<App>(0);
}

Projects using Relm4

  • fm β€” A small, general-purpose file manager.
  • Done - A simple and versatile to do app.
  • Reovim - GUI frontend for neovim.
  • NixOS Configuration Editor - A graphical configuration editor for NixOS.
  • Rhino Setup - Setup wizard for Rolling Rhino
  • Lemoa - Desktop client for Lemmy
  • Score Tracker - App for tracking player scores in card and board games
  • Spidey - A seamless and distraction-free work and play environment on the web
  • Toolbox Tuner - An application to manage Toolbx containers
  • BitRitter - A bitwarden/vaultwarden client with mobile devices in mind
  • Space Acres - An opinionated GUI application for farming on Autonomys Network
  • Exercise Timer - An interval training app for the GNOME desktop
  • Words! - on Flathub - A word game similar to Wordle
  • LACT - A GPU configuration and info utility
  • xdg-mimer - A GUI tool for managing MIME associations using XDG standards
  • CoDLinux - A CoD & CoD:UO client helper for GNU/Linux
  • waypomo - endless pomodoro timer for wlroots compositors (uses gtk4-layer-shell)

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

Build truly native applications with ease!

Topics

Resources

License

Apache-2.0, MIT licenses found

Licenses found

Apache-2.0
LICENSE-APACHE
MIT
LICENSE-MIT

Stars

Watchers

Forks

Packages

No packages published

Contributors 63

Languages