Skip to content

Commit fb0e8b8

Browse files
authored
Add hot glow option to multiwin example. (#845)
1 parent 54cb758 commit fb0e8b8

File tree

1 file changed

+66
-5
lines changed

1 file changed

+66
-5
lines changed

druid/examples/multiwin.rs

Lines changed: 66 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,23 +14,25 @@
1414

1515
//! Opening and closing windows and using window and context menus.
1616
17-
use druid::widget::{Align, Button, Flex, Label, Padding};
17+
use druid::widget::prelude::*;
18+
use druid::widget::{Align, BackgroundBrush, Button, Flex, Label, Padding};
1819
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,
2222
};
2323

2424
use log::info;
2525

2626
const MENU_COUNT_ACTION: Selector = Selector::new("menu-count-action");
2727
const MENU_INCREMENT_ACTION: Selector = Selector::new("menu-increment-action");
2828
const MENU_DECREMENT_ACTION: Selector = Selector::new("menu-decrement-action");
29+
const MENU_SWITCH_GLOW_ACTION: Selector = Selector::new("menu-switch-glow");
2930

3031
#[derive(Debug, Clone, Default, Data)]
3132
struct State {
3233
menu_count: usize,
3334
selected: usize,
35+
glow_hot: bool,
3436
}
3537

3638
pub fn main() {
@@ -79,7 +81,58 @@ fn ui_builder() -> impl Widget<State> {
7981
row.add_child(Padding::new(5.0, inc_button));
8082
row.add_child(Padding::new(5.0, dec_button));
8183
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+
}
83136
}
84137

85138
struct Delegate;
@@ -144,6 +197,10 @@ impl AppDelegate<State> for Delegate {
144197
ctx.submit_command(cmd, *id);
145198
false
146199
}
200+
(_, &MENU_SWITCH_GLOW_ACTION) => {
201+
data.glow_hot = !data.glow_hot;
202+
false
203+
}
147204
_ => true,
148205
}
149206
}
@@ -207,4 +264,8 @@ fn make_context_menu<T: Data>() -> MenuDesc<T> {
207264
LocalizedString::new("Decrement"),
208265
MENU_DECREMENT_ACTION,
209266
))
267+
.append(MenuItem::new(
268+
LocalizedString::new("Glow when hot"),
269+
MENU_SWITCH_GLOW_ACTION,
270+
))
210271
}

0 commit comments

Comments
 (0)