2023-03-13 18:19:16 -07:00
|
|
|
use iced::multi_window::{self, Application};
|
|
|
|
|
use iced::widget::{button, column, container, scrollable, text, text_input};
|
|
|
|
|
use iced::{
|
|
|
|
|
executor, window, Alignment, Command, Element, Length, Settings, Theme,
|
2022-07-14 10:37:33 -03:00
|
|
|
};
|
2022-07-21 09:52:55 -03:00
|
|
|
use std::collections::HashMap;
|
2023-01-02 18:14:31 -08:00
|
|
|
|
2023-03-13 18:19:16 -07:00
|
|
|
fn main() -> iced::Result {
|
2022-07-14 10:37:33 -03:00
|
|
|
Example::run(Settings::default())
|
2022-06-28 14:27:06 -03:00
|
|
|
}
|
|
|
|
|
|
2023-03-13 18:19:16 -07:00
|
|
|
#[derive(Default)]
|
2022-07-14 10:37:33 -03:00
|
|
|
struct Example {
|
2023-03-13 18:19:16 -07:00
|
|
|
windows_count: usize,
|
2022-07-21 09:52:55 -03:00
|
|
|
windows: HashMap<window::Id, Window>,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
struct Window {
|
2023-03-13 18:19:16 -07:00
|
|
|
id: window::Id,
|
2022-07-21 09:52:55 -03:00
|
|
|
title: String,
|
2023-03-13 18:19:16 -07:00
|
|
|
scale_input: String,
|
|
|
|
|
current_scale: f64,
|
2022-06-28 14:27:06 -03:00
|
|
|
}
|
|
|
|
|
|
2022-07-21 09:52:55 -03:00
|
|
|
#[derive(Debug, Clone)]
|
2022-06-28 14:27:06 -03:00
|
|
|
enum Message {
|
2023-03-13 18:19:16 -07:00
|
|
|
ScaleInputChanged(window::Id, String),
|
|
|
|
|
ScaleChanged(window::Id, String),
|
|
|
|
|
TitleChanged(window::Id, String),
|
|
|
|
|
CloseWindow(window::Id),
|
|
|
|
|
NewWindow,
|
2022-06-28 14:27:06 -03:00
|
|
|
}
|
|
|
|
|
|
2023-03-13 18:19:16 -07:00
|
|
|
impl multi_window::Application for Example {
|
2023-01-09 10:19:12 -08:00
|
|
|
type Executor = executor::Default;
|
2022-06-28 14:27:06 -03:00
|
|
|
type Message = Message;
|
2022-07-14 10:37:33 -03:00
|
|
|
type Theme = Theme;
|
|
|
|
|
type Flags = ();
|
2022-06-28 14:27:06 -03:00
|
|
|
|
|
|
|
|
fn new(_flags: ()) -> (Self, Command<Message>) {
|
2022-07-14 10:37:33 -03:00
|
|
|
(
|
|
|
|
|
Example {
|
2023-03-13 18:19:16 -07:00
|
|
|
windows_count: 0,
|
|
|
|
|
windows: HashMap::from([(
|
|
|
|
|
window::Id::MAIN,
|
|
|
|
|
Window::new(window::Id::MAIN),
|
|
|
|
|
)]),
|
2022-07-14 10:37:33 -03:00
|
|
|
},
|
|
|
|
|
Command::none(),
|
|
|
|
|
)
|
2022-06-28 14:27:06 -03:00
|
|
|
}
|
|
|
|
|
|
2023-01-05 15:26:28 -08:00
|
|
|
fn title(&self, window: window::Id) -> String {
|
|
|
|
|
self.windows
|
|
|
|
|
.get(&window)
|
2023-03-13 18:19:16 -07:00
|
|
|
.map(|window| window.title.clone())
|
|
|
|
|
.unwrap_or("Example".to_string())
|
2022-06-28 14:27:06 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn update(&mut self, message: Message) -> Command<Message> {
|
|
|
|
|
match message {
|
2023-03-13 18:19:16 -07:00
|
|
|
Message::ScaleInputChanged(id, scale) => {
|
|
|
|
|
let window =
|
|
|
|
|
self.windows.get_mut(&id).expect("Window not found!");
|
|
|
|
|
window.scale_input = scale;
|
|
|
|
|
}
|
|
|
|
|
Message::ScaleChanged(id, scale) => {
|
|
|
|
|
let window =
|
|
|
|
|
self.windows.get_mut(&id).expect("Window not found!");
|
|
|
|
|
|
|
|
|
|
window.current_scale = scale
|
|
|
|
|
.parse::<f64>()
|
|
|
|
|
.unwrap_or(window.current_scale)
|
|
|
|
|
.clamp(0.5, 5.0);
|
|
|
|
|
}
|
|
|
|
|
Message::TitleChanged(id, title) => {
|
|
|
|
|
let window =
|
|
|
|
|
self.windows.get_mut(&id).expect("Window not found.");
|
2023-02-20 12:34:04 -08:00
|
|
|
|
2023-03-13 18:19:16 -07:00
|
|
|
window.title = title;
|
|
|
|
|
}
|
|
|
|
|
Message::CloseWindow(id) => {
|
|
|
|
|
return window::close(id);
|
|
|
|
|
}
|
|
|
|
|
Message::NewWindow => {
|
|
|
|
|
self.windows_count += 1;
|
|
|
|
|
let id = window::Id::new(self.windows_count);
|
|
|
|
|
self.windows.insert(id, Window::new(id));
|
2023-02-20 12:34:04 -08:00
|
|
|
|
2023-03-13 18:19:16 -07:00
|
|
|
return window::spawn(id, window::Settings::default());
|
2022-06-28 14:27:06 -03:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Command::none()
|
|
|
|
|
}
|
|
|
|
|
|
2023-03-13 18:19:16 -07:00
|
|
|
fn view(&self, window: window::Id) -> Element<Message> {
|
|
|
|
|
let window = self
|
|
|
|
|
.windows
|
|
|
|
|
.get(&window)
|
|
|
|
|
.map(|window| window.view())
|
|
|
|
|
.unwrap();
|
2022-07-21 09:52:55 -03:00
|
|
|
|
2023-03-13 18:19:16 -07:00
|
|
|
container(window)
|
2022-07-14 10:37:33 -03:00
|
|
|
.width(Length::Fill)
|
|
|
|
|
.height(Length::Fill)
|
2022-07-21 09:52:55 -03:00
|
|
|
.center_x()
|
|
|
|
|
.center_y()
|
2022-06-28 14:27:06 -03:00
|
|
|
.into()
|
|
|
|
|
}
|
2023-01-09 10:19:12 -08:00
|
|
|
|
2023-03-13 18:19:16 -07:00
|
|
|
fn scale_factor(&self, window: window::Id) -> f64 {
|
|
|
|
|
self.windows
|
|
|
|
|
.get(&window)
|
|
|
|
|
.map(|window| window.current_scale)
|
|
|
|
|
.unwrap_or(1.0)
|
2022-07-21 09:52:55 -03:00
|
|
|
}
|
|
|
|
|
|
2023-03-13 18:19:16 -07:00
|
|
|
fn close_requested(&self, window: window::Id) -> Self::Message {
|
|
|
|
|
Message::CloseWindow(window)
|
2022-07-14 10:37:33 -03:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-03-13 18:19:16 -07:00
|
|
|
impl Window {
|
|
|
|
|
fn new(id: window::Id) -> Self {
|
2022-07-14 10:37:33 -03:00
|
|
|
Self {
|
|
|
|
|
id,
|
2023-03-13 18:19:16 -07:00
|
|
|
title: "Window".to_string(),
|
|
|
|
|
scale_input: "1.0".to_string(),
|
|
|
|
|
current_scale: 1.0,
|
2022-07-14 10:37:33 -03:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-03-13 18:19:16 -07:00
|
|
|
fn view(&self) -> Element<Message> {
|
|
|
|
|
window_view(self.id, &self.scale_input, &self.title)
|
2022-07-14 10:37:33 -03:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-03-13 18:19:16 -07:00
|
|
|
fn window_view<'a>(
|
|
|
|
|
id: window::Id,
|
|
|
|
|
scale_input: &'a str,
|
|
|
|
|
title: &'a str,
|
|
|
|
|
) -> Element<'a, Message> {
|
|
|
|
|
let scale_input = column![
|
|
|
|
|
text("Window scale factor:"),
|
|
|
|
|
text_input("Window Scale", scale_input, move |msg| {
|
|
|
|
|
Message::ScaleInputChanged(id, msg)
|
|
|
|
|
})
|
|
|
|
|
.on_submit(Message::ScaleChanged(id, scale_input.to_string()))
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
let title_input = column![
|
|
|
|
|
text("Window title:"),
|
|
|
|
|
text_input("Window Title", title, move |msg| {
|
|
|
|
|
Message::TitleChanged(id, msg)
|
|
|
|
|
})
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
let new_window_button =
|
|
|
|
|
button(text("New Window")).on_press(Message::NewWindow);
|
|
|
|
|
|
|
|
|
|
let content = scrollable(
|
|
|
|
|
column![scale_input, title_input, new_window_button]
|
|
|
|
|
.spacing(50)
|
|
|
|
|
.width(Length::Fill)
|
|
|
|
|
.align_items(Alignment::Center),
|
|
|
|
|
);
|
2022-07-14 10:37:33 -03:00
|
|
|
|
2023-03-13 18:19:16 -07:00
|
|
|
container(content).width(200).center_x().into()
|
2022-07-14 10:37:33 -03:00
|
|
|
}
|