|
14 | 14 |
|
15 | 15 | //! Opening and closing windows and using window and context menus. |
16 | 16 |
|
17 | | -use druid::widget::{Align, Button, Flex, Label, Padding}; |
| 17 | +use druid::widget::prelude::*; |
| 18 | +use druid::widget::{Align, BackgroundBrush, Button, Flex, Label, Padding}; |
18 | 19 | use druid::{ |
19 | | - commands as sys_cmds, AppDelegate, AppLauncher, Command, ContextMenu, Data, DelegateCtx, Env, |
20 | | - Event, EventCtx, LocalizedString, MenuDesc, MenuItem, Selector, Target, Widget, WindowDesc, |
21 | | - WindowId, |
| 20 | + commands as sys_cmds, AppDelegate, AppLauncher, Color, Command, ContextMenu, Data, DelegateCtx, |
| 21 | + LocalizedString, MenuDesc, MenuItem, Selector, Target, WidgetPod, WindowDesc, WindowId, |
22 | 22 | }; |
23 | 23 |
|
24 | 24 | use log::info; |
25 | 25 |
|
26 | 26 | const MENU_COUNT_ACTION: Selector = Selector::new("menu-count-action"); |
27 | 27 | const MENU_INCREMENT_ACTION: Selector = Selector::new("menu-increment-action"); |
28 | 28 | const MENU_DECREMENT_ACTION: Selector = Selector::new("menu-decrement-action"); |
| 29 | +const MENU_SWITCH_GLOW_ACTION: Selector = Selector::new("menu-switch-glow"); |
29 | 30 |
|
30 | 31 | #[derive(Debug, Clone, Default, Data)] |
31 | 32 | struct State { |
32 | 33 | menu_count: usize, |
33 | 34 | selected: usize, |
| 35 | + glow_hot: bool, |
34 | 36 | } |
35 | 37 |
|
36 | 38 | pub fn main() { |
@@ -79,7 +81,58 @@ fn ui_builder() -> impl Widget<State> { |
79 | 81 | row.add_child(Padding::new(5.0, inc_button)); |
80 | 82 | row.add_child(Padding::new(5.0, dec_button)); |
81 | 83 | col.add_flex_child(Align::centered(row), 1.0); |
82 | | - col |
| 84 | + Glow::new(col) |
| 85 | +} |
| 86 | + |
| 87 | +struct Glow<W> { |
| 88 | + inner: WidgetPod<State, W>, |
| 89 | +} |
| 90 | + |
| 91 | +impl<W: Widget<State>> Glow<W> { |
| 92 | + pub fn new(inner: W) -> Glow<W> { |
| 93 | + Glow { |
| 94 | + inner: WidgetPod::new(inner), |
| 95 | + } |
| 96 | + } |
| 97 | +} |
| 98 | + |
| 99 | +impl<W: Widget<State>> Widget<State> for Glow<W> { |
| 100 | + fn event(&mut self, ctx: &mut EventCtx, event: &Event, data: &mut State, env: &Env) { |
| 101 | + self.inner.event(ctx, event, data, env); |
| 102 | + } |
| 103 | + |
| 104 | + fn lifecycle(&mut self, ctx: &mut LifeCycleCtx, event: &LifeCycle, data: &State, env: &Env) { |
| 105 | + if let LifeCycle::HotChanged(_) = event { |
| 106 | + ctx.request_paint(); |
| 107 | + } |
| 108 | + self.inner.lifecycle(ctx, event, data, env); |
| 109 | + } |
| 110 | + |
| 111 | + fn update(&mut self, ctx: &mut UpdateCtx, old_data: &State, data: &State, env: &Env) { |
| 112 | + if old_data.glow_hot != data.glow_hot { |
| 113 | + ctx.request_paint(); |
| 114 | + } |
| 115 | + self.inner.update(ctx, data, env); |
| 116 | + } |
| 117 | + |
| 118 | + fn layout( |
| 119 | + &mut self, |
| 120 | + ctx: &mut LayoutCtx, |
| 121 | + bc: &BoxConstraints, |
| 122 | + data: &State, |
| 123 | + env: &Env, |
| 124 | + ) -> Size { |
| 125 | + let size = self.inner.layout(ctx, bc, data, env); |
| 126 | + self.inner.set_layout_rect(ctx, data, env, size.to_rect()); |
| 127 | + size |
| 128 | + } |
| 129 | + |
| 130 | + fn paint(&mut self, ctx: &mut PaintCtx, data: &State, env: &Env) { |
| 131 | + if data.glow_hot && ctx.is_hot() { |
| 132 | + BackgroundBrush::Color(Color::rgb8(200, 55, 55)).paint(ctx, data, env); |
| 133 | + } |
| 134 | + self.inner.paint(ctx, data, env); |
| 135 | + } |
83 | 136 | } |
84 | 137 |
|
85 | 138 | struct Delegate; |
@@ -144,6 +197,10 @@ impl AppDelegate<State> for Delegate { |
144 | 197 | ctx.submit_command(cmd, *id); |
145 | 198 | false |
146 | 199 | } |
| 200 | + (_, &MENU_SWITCH_GLOW_ACTION) => { |
| 201 | + data.glow_hot = !data.glow_hot; |
| 202 | + false |
| 203 | + } |
147 | 204 | _ => true, |
148 | 205 | } |
149 | 206 | } |
@@ -207,4 +264,8 @@ fn make_context_menu<T: Data>() -> MenuDesc<T> { |
207 | 264 | LocalizedString::new("Decrement"), |
208 | 265 | MENU_DECREMENT_ACTION, |
209 | 266 | )) |
| 267 | + .append(MenuItem::new( |
| 268 | + LocalizedString::new("Glow when hot"), |
| 269 | + MENU_SWITCH_GLOW_ACTION, |
| 270 | + )) |
210 | 271 | } |
0 commit comments