Merge pull request #49 from hecrj/feature/control-window-title

Allow applications to control the window title
This commit is contained in:
Héctor Ramón 2019-11-09 19:29:23 +01:00 committed by GitHub
commit 839e039dbf
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 64 additions and 18 deletions

View file

@ -25,6 +25,10 @@ pub enum Message {
impl Application for Example {
type Message = Message;
fn title(&self) -> String {
String::from("Scroll - Iced")
}
fn update(&mut self, message: Message) {
match message {
Message::AddItem => {

View file

@ -25,6 +25,10 @@ pub enum Message {
impl Application for Todos {
type Message = Message;
fn title(&self) -> String {
String::from("Todos - Iced")
}
fn update(&mut self, message: Message) {
match message {
Message::InputChanged(value) => {

View file

@ -7,9 +7,7 @@ use iced::{
pub fn main() {
env_logger::init();
let tour = Tour::new();
tour.run();
Tour::new().run()
}
pub struct Tour {
@ -35,6 +33,10 @@ impl Tour {
impl Application for Tour {
type Message = Message;
fn title(&self) -> String {
format!("{} - Iced", self.steps.title())
}
fn update(&mut self, event: Message) {
match event {
Message::BackPressed => {
@ -52,6 +54,7 @@ impl Application for Tour {
fn view(&mut self) -> Element<Message> {
let Tour {
steps,
scroll,
back_button,
next_button,
..
@ -93,7 +96,7 @@ impl Application for Tour {
.height(Length::Fill)
.justify_content(Justify::Center)
.push(
Scrollable::new(&mut self.scroll)
Scrollable::new(scroll)
.align_items(Align::Center)
.push(element),
)
@ -178,6 +181,10 @@ impl Steps {
self.current + 1 < self.steps.len()
&& self.steps[self.current].can_continue()
}
fn title(&self) -> &str {
self.steps[self.current].title()
}
}
enum Step {
@ -277,6 +284,21 @@ impl<'a> Step {
};
}
fn title(&self) -> &str {
match self {
Step::Welcome => "Welcome",
Step::Radio { .. } => "Radio button",
Step::Slider { .. } => "Slider",
Step::Text { .. } => "Text",
Step::Image { .. } => "Image",
Step::RowsAndColumns { .. } => "Rows and columns",
Step::Scrollable => "Scrollable",
Step::TextInput { .. } => "Text input",
Step::Debugger => "Debugger",
Step::End => "End",
}
}
fn can_continue(&self) -> bool {
match self {
Step::Welcome => true,
@ -294,30 +316,27 @@ impl<'a> Step {
fn view(&mut self, debug: bool) -> Element<StepMessage> {
match self {
Step::Welcome => Self::welcome().into(),
Step::Radio { selection } => Self::radio(*selection).into(),
Step::Slider { state, value } => Self::slider(state, *value).into(),
Step::Welcome => Self::welcome(),
Step::Radio { selection } => Self::radio(*selection),
Step::Slider { state, value } => Self::slider(state, *value),
Step::Text {
size_slider,
size,
color_sliders,
color,
} => Self::text(size_slider, *size, color_sliders, *color).into(),
Step::Image { width, slider } => Self::image(*width, slider).into(),
} => Self::text(size_slider, *size, color_sliders, *color),
Step::Image { width, slider } => Self::image(*width, slider),
Step::RowsAndColumns {
layout,
spacing_slider,
spacing,
} => {
Self::rows_and_columns(*layout, spacing_slider, *spacing).into()
}
Step::Scrollable => Self::scrollable().into(),
Step::TextInput { value, state } => {
Self::text_input(value, state).into()
}
Step::Debugger => Self::debugger(debug).into(),
Step::End => Self::end().into(),
} => Self::rows_and_columns(*layout, spacing_slider, *spacing),
Step::Scrollable => Self::scrollable(),
Step::TextInput { value, state } => Self::text_input(value, state),
Step::Debugger => Self::debugger(debug),
Step::End => Self::end(),
}
.into()
}
fn container(title: &str) -> Column<'a, StepMessage> {

View file

@ -7,6 +7,8 @@ pub use platform::*;
pub trait Application {
type Message: std::fmt::Debug;
fn title(&self) -> String;
fn update(&mut self, message: Self::Message);
fn view(&mut self) -> Element<Self::Message>;
@ -33,6 +35,10 @@ where
type Renderer = Renderer;
type Message = A::Message;
fn title(&self) -> String {
self.0.title()
}
fn update(&mut self, message: Self::Message) {
self.0.update(message);
}

View file

@ -10,6 +10,8 @@ pub trait Application {
type Message: std::fmt::Debug;
fn title(&self) -> String;
fn update(&mut self, message: Self::Message);
fn view(&mut self) -> Element<Self::Message, Self::Renderer>;
@ -25,12 +27,14 @@ pub trait Application {
};
let mut debug = Debug::new();
let mut title = self.title();
debug.startup_started();
let event_loop = EventLoop::new();
// TODO: Ask for window settings and configure this properly
let window = WindowBuilder::new()
.with_title(&title)
.with_inner_size(winit::dpi::LogicalSize {
width: 1280.0,
height: 1024.0,
@ -112,6 +116,15 @@ pub trait Application {
debug.update_finished();
}
// Update window title
let new_title = self.title();
if title != new_title {
window.set_title(&new_title);
title = new_title;
}
debug.layout_started();
let user_interface = UserInterface::build(
document(&mut self, size, &mut debug),