#![allow(deprecated)]
use std::convert::identity;
use gtk::glib;
use gtk::prelude::{ButtonExt, ContainerExt, GtkWindowExt, LabelExt, WidgetExt};
use nrelm::MessageBroker;
use nrelm::{
Component, ComponentController, ComponentParts, ComponentSender, Controller, RelmApp,
SimpleComponent,
};
static DIALOG_BROKER: MessageBroker<DialogMsg> = MessageBroker::new();
struct Dialog {
visible: bool,
}
#[derive(Debug)]
enum DialogMsg {
Show,
Hide,
}
#[nrelm::component]
impl SimpleComponent for Dialog {
type Init = ();
type Input = DialogMsg;
type Output = ButtonMsg;
view! {
dialog = gtk::Dialog {
#[watch]
set_visible: model.visible,
set_modal: true,
gtk::Label {
set_size_request: (200, 80),
set_halign: gtk::Align::Center,
set_valign: gtk::Align::Center,
#[watch]
set_label: if dialog.transient_for().is_some() {
"I'm transient!"
} else {
"I'm not transient..."
},
},
connect_delete_event[sender] => move |_, _| {
sender.input(DialogMsg::Hide);
glib::Propagation::Stop
}
}
}
fn init(
_init: Self::Init,
root: Self::Root,
sender: ComponentSender<Self>,
) -> ComponentParts<Self> {
let model = Dialog { visible: false };
let widgets = view_output!();
ComponentParts { model, widgets }
}
fn update(&mut self, msg: Self::Input, _sender: ComponentSender<Self>) {
match msg {
DialogMsg::Show => self.visible = true,
DialogMsg::Hide => self.visible = false,
}
}
}
struct Button {
#[allow(dead_code)]
dialog: Controller<Dialog>,
}
#[derive(Debug)]
enum ButtonMsg {}
#[nrelm::component]
impl SimpleComponent for Button {
type Init = ();
type Input = ButtonMsg;
type Output = AppMsg;
view! {
button = >k::Button {
set_label: "Show the dialog",
connect_clicked => move |_| {
DIALOG_BROKER.send(DialogMsg::Show);
}
}
}
fn init(
_init: Self::Init,
root: Self::Root,
sender: ComponentSender<Self>,
) -> ComponentParts<Self> {
let dialog = Dialog::builder()
.transient_for(&root)
.launch_with_broker((), &DIALOG_BROKER)
.forward(sender.input_sender(), identity);
let model = Button { dialog };
let widgets = view_output!();
ComponentParts { model, widgets }
}
fn update(&mut self, _msg: Self::Input, _sender: ComponentSender<Self>) {}
}
#[derive(Debug)]
enum AppMsg {}
struct App {
button: Controller<Button>,
}
#[nrelm::component]
impl SimpleComponent for App {
type Init = ();
type Input = AppMsg;
type Output = ();
view! {
main_window = gtk::Window {
set_default_size: (500, 250),
add: model.button.widget(),
}
}
fn init(
_init: Self::Init,
root: Self::Root,
sender: ComponentSender<Self>,
) -> ComponentParts<Self> {
let button = Button::builder()
.launch(())
.forward(sender.input_sender(), identity);
let model = App { button };
let widgets = view_output!();
ComponentParts { model, widgets }
}
fn update(&mut self, _msg: Self::Input, _sender: ComponentSender<Self>) {}
}
fn main() {
let app = RelmApp::new("nrelm.example.transient_dialog");
app.run::<App>(());
}