diff options
Diffstat (limited to 'src/program.rs')
| -rw-r--r-- | src/program.rs | 157 | 
1 files changed, 146 insertions, 11 deletions
| diff --git a/src/program.rs b/src/program.rs index c2841763..8aa1a4e7 100644 --- a/src/program.rs +++ b/src/program.rs @@ -194,12 +194,16 @@ impl<P: Definition> Program<P> {                  self.program.view(&self.state)              } +            fn subscription(&self) -> Subscription<Self::Message> { +                self.program.subscription(&self.state) +            } +              fn theme(&self) -> Self::Theme {                  self.program.theme(&self.state)              } -            fn subscription(&self) -> Subscription<Self::Message> { -                self.program.subscription(&self.state) +            fn style(&self, theme: &Self::Theme) -> application::Appearance { +                self.program.style(&self.state, theme)              }          } @@ -221,11 +225,11 @@ impl<P: Definition> Program<P> {          Self { settings, ..self }      } -    /// Toggles the [`Settings::antialiasing`] to `true` for the [`Program`]. -    pub fn antialiased(self) -> Self { +    /// Sets the [`Settings::antialiasing`] of the [`Program`]. +    pub fn antialiasing(self, antialiasing: bool) -> Self {          Self {              settings: Settings { -                antialiasing: true, +                antialiasing,                  ..self.settings              },              ..self @@ -263,12 +267,26 @@ impl<P: Definition> Program<P> {          }      } -    /// Sets the [`window::Settings::exit_on_close_request`] to `false` in the [`Program`]. -    pub fn ignore_close_request(self) -> Self { +    /// Sets the [`window::Settings::exit_on_close_request`] of the [`Program`]. +    pub fn exit_on_close_request(self, exit_on_close_request: bool) -> Self {          Self {              settings: Settings {                  window: window::Settings { -                    exit_on_close_request: false, +                    exit_on_close_request, +                    ..self.settings.window +                }, +                ..self.settings +            }, +            ..self +        } +    } + +    /// Sets the [`window::Settings::transparent`] of the [`Program`]. +    pub fn transparent(self, transparent: bool) -> Self { +        Self { +            settings: Settings { +                window: window::Settings { +                    transparent,                      ..self.settings.window                  },                  ..self.settings @@ -328,6 +346,19 @@ impl<P: Definition> Program<P> {              settings: self.settings,          }      } + +    /// Sets the style logic of the [`Program`]. +    pub fn style( +        self, +        f: impl Fn(&P::State, &P::Theme) -> application::Appearance, +    ) -> Program< +        impl Definition<State = P::State, Message = P::Message, Theme = P::Theme>, +    > { +        Program { +            raw: with_style(self.raw, f), +            settings: self.settings, +        } +    }  }  /// The internal definition of a [`Program`]. @@ -377,6 +408,14 @@ pub trait Definition: Sized {      fn theme(&self, _state: &Self::State) -> Self::Theme {          Self::Theme::default()      } + +    fn style( +        &self, +        _state: &Self::State, +        theme: &Self::Theme, +    ) -> application::Appearance { +        application::DefaultStyle::default_style(theme) +    }  }  fn with_title<P: Definition>( @@ -431,6 +470,14 @@ fn with_title<P: Definition>(          ) -> Subscription<Self::Message> {              self.program.subscription(state)          } + +        fn style( +            &self, +            state: &Self::State, +            theme: &Self::Theme, +        ) -> application::Appearance { +            self.program.style(state, theme) +        }      }      WithTitle { program, title } @@ -479,15 +526,23 @@ fn with_load<P: Definition>(              self.program.title(state)          } +        fn subscription( +            &self, +            state: &Self::State, +        ) -> Subscription<Self::Message> { +            self.program.subscription(state) +        } +          fn theme(&self, state: &Self::State) -> Self::Theme {              self.program.theme(state)          } -        fn subscription( +        fn style(              &self,              state: &Self::State, -        ) -> Subscription<Self::Message> { -            self.program.subscription(state) +            theme: &Self::Theme, +        ) -> application::Appearance { +            self.program.style(state, theme)          }      } @@ -545,6 +600,14 @@ fn with_subscription<P: Definition>(          fn theme(&self, state: &Self::State) -> Self::Theme {              self.program.theme(state)          } + +        fn style( +            &self, +            state: &Self::State, +            theme: &Self::Theme, +        ) -> application::Appearance { +            self.program.style(state, theme) +        }      }      WithSubscription { @@ -604,11 +667,83 @@ fn with_theme<P: Definition>(          ) -> Subscription<Self::Message> {              self.program.subscription(state)          } + +        fn style( +            &self, +            state: &Self::State, +            theme: &Self::Theme, +        ) -> application::Appearance { +            self.program.style(state, theme) +        }      }      WithTheme { program, theme: f }  } +fn with_style<P: Definition>( +    program: P, +    f: impl Fn(&P::State, &P::Theme) -> application::Appearance, +) -> impl Definition<State = P::State, Message = P::Message, Theme = P::Theme> { +    struct WithStyle<P, F> { +        program: P, +        style: F, +    } + +    impl<P: Definition, F> Definition for WithStyle<P, F> +    where +        F: Fn(&P::State, &P::Theme) -> application::Appearance, +    { +        type State = P::State; +        type Message = P::Message; +        type Theme = P::Theme; +        type Executor = P::Executor; + +        fn style( +            &self, +            state: &Self::State, +            theme: &Self::Theme, +        ) -> application::Appearance { +            (self.style)(state, theme) +        } + +        fn build(&self) -> (Self::State, Command<Self::Message>) { +            self.program.build() +        } + +        fn title(&self, state: &Self::State) -> String { +            self.program.title(state) +        } + +        fn update( +            &self, +            state: &mut Self::State, +            message: Self::Message, +        ) -> Command<Self::Message> { +            self.program.update(state, message) +        } + +        fn view<'a>( +            &self, +            state: &'a Self::State, +        ) -> Element<'a, Self::Message, Self::Theme> { +            self.program.view(state) +        } + +        fn subscription( +            &self, +            state: &Self::State, +        ) -> Subscription<Self::Message> { +            self.program.subscription(state) +        } + +        fn theme(&self, state: &Self::State) -> Self::Theme { +            self.program.theme(state) +        } +    } + +    WithStyle { program, style: f } +} +  /// The title logic of some [`Program`].  ///  /// This trait is implemented both for `&static str` and | 
