open_button/
open_button.rs

1use std::path::PathBuf;
2
3use gtk::prelude::*;
4use relm4::{
5    Component, ComponentController, ComponentParts, ComponentSender, Controller, RelmApp,
6    SimpleComponent, gtk,
7};
8use relm4_components::open_button::{OpenButton, OpenButtonSettings};
9use relm4_components::open_dialog::OpenDialogSettings;
10
11#[derive(Debug)]
12enum AppMsg {
13    Open(PathBuf),
14}
15
16struct App {
17    open_button: Controller<OpenButton>,
18}
19
20#[relm4::component]
21impl SimpleComponent for App {
22    type Init = ();
23    type Input = AppMsg;
24    type Output = ();
25
26    view! {
27        gtk::ApplicationWindow {
28            set_default_size: (300, 100),
29
30            #[wrap(Some)]
31            set_titlebar = &gtk::HeaderBar {
32                pack_start: model.open_button.widget(),
33            }
34        }
35    }
36
37    fn update(&mut self, msg: Self::Input, _: ComponentSender<Self>) {
38        match msg {
39            AppMsg::Open(path) => {
40                println!("* Opened file {path:?} *");
41            }
42        }
43    }
44
45    fn init(
46        _: Self::Init,
47        root: Self::Root,
48        sender: ComponentSender<Self>,
49    ) -> ComponentParts<Self> {
50        let open_button = OpenButton::builder()
51            .launch(OpenButtonSettings {
52                dialog_settings: OpenDialogSettings::default(),
53                icon: None,
54                text: "Open file",
55                recently_opened_files: Some(".recent_files"),
56                max_recent_files: 10,
57            })
58            .forward(sender.input_sender(), AppMsg::Open);
59        let model = App { open_button };
60
61        let widgets = view_output!();
62
63        ComponentParts { model, widgets }
64    }
65}
66
67fn main() {
68    let app = RelmApp::new("relm4.example.open_button");
69    app.run::<App>(());
70}