mirror of
https://github.com/emilk/egui.git
synced 2026-08-29 04:40:03 -04:00
Fix widgets being styled with the wrong state on their first pass
`Ui::widget_style` reads the widget state from the response of the previous pass. When there is no such response yet it fell back to `WidgetState::Inactive`, styling the widget wrong for one pass. Now we request a discard instead, so the widget is painted only once we know its state. Also make the default `SeparatorStyle` read `noninteractive.bg_stroke` directly: a separator is never interactive, so its stroke should not depend on the widget state. `inactive.bg_stroke` is `Stroke::NONE`, which made the separator invisible. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -143,12 +143,12 @@ impl StyleProvider<LabelStyle> for DefaultStyle {
|
||||
|
||||
impl StyleProvider<SeparatorStyle> for DefaultStyle {
|
||||
fn style(&mut self, modifiers: &StyleArgs<'_>) -> SeparatorStyle {
|
||||
let StyleArgs { ctx, .. } = modifiers;
|
||||
let ws: BaseStyle = ctx.get_widget_style(modifiers);
|
||||
let StyleArgs { style, .. } = modifiers;
|
||||
|
||||
SeparatorStyle {
|
||||
spacing: 6.0,
|
||||
stroke: ws.frame.stroke,
|
||||
// A separator is never interactive, so its stroke doesn't depend on the widget state:
|
||||
stroke: style.visuals.widgets.noninteractive.bg_stroke,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@ pub use self::{style_provider::StyleProvider, themes::Themes};
|
||||
|
||||
use crate::{
|
||||
Ui,
|
||||
widget_style::{Classes, StyleArgs, WidgetStyle},
|
||||
widget_style::{Classes, StyleArgs, WidgetState, WidgetStyle},
|
||||
};
|
||||
|
||||
impl Ui {
|
||||
@@ -19,11 +19,16 @@ impl Ui {
|
||||
id: crate::Id,
|
||||
classes: &Classes,
|
||||
) -> S {
|
||||
// Fetch the current state of the widget
|
||||
let state = self
|
||||
.read_response(id)
|
||||
.map(|r| r.widget_state())
|
||||
.unwrap_or_default();
|
||||
// Fetch the state of the widget, as it was in the previous pass
|
||||
let state = if let Some(response) = self.read_response(id) {
|
||||
response.widget_state()
|
||||
} else {
|
||||
// We don't know the state of the widget yet, so we would style it wrong.
|
||||
// Discard this pass and style it correctly in the next one.
|
||||
self.ctx()
|
||||
.request_discard("Widget style depends on a widget response we don't have yet");
|
||||
WidgetState::default()
|
||||
};
|
||||
|
||||
self.get_widget_style::<S>(&StyleArgs {
|
||||
classes,
|
||||
|
||||
Reference in New Issue
Block a user