mirror of
https://github.com/emilk/egui.git
synced 2026-09-03 07:10:04 -04:00
fix incorrect theme
This commit is contained in:
@@ -2061,7 +2061,7 @@ impl Context {
|
|||||||
classes: &Classes,
|
classes: &Classes,
|
||||||
state: WidgetState,
|
state: WidgetState,
|
||||||
) -> S {
|
) -> S {
|
||||||
self.write(move |ctx| ctx.themes.get::<S>(classes, state))
|
self.read(move |ctx| ctx.themes.get::<S>(self, classes, state))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,8 +4,7 @@ use emath::Vec2;
|
|||||||
use epaint::{Shadow, Stroke, mutex::Mutex, text::TextWrapMode};
|
use epaint::{Shadow, Stroke, mutex::Mutex, text::TextWrapMode};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
Frame, Id, Spacing, Style, TextStyle, Ui, Visuals,
|
Context, Frame, Id, TextStyle, Ui,
|
||||||
style::Widgets,
|
|
||||||
util::IdTypeMap,
|
util::IdTypeMap,
|
||||||
widget_style::{
|
widget_style::{
|
||||||
BaseStyle, ButtonStyle, CheckboxStyle, Classes, HasClasses as _, LabelStyle,
|
BaseStyle, ButtonStyle, CheckboxStyle, Classes, HasClasses as _, LabelStyle,
|
||||||
@@ -45,7 +44,7 @@ impl ThemeCache {
|
|||||||
/// A Theme plugin that implement a style computation for a defined `WidgetStyle`
|
/// A Theme plugin that implement a style computation for a defined `WidgetStyle`
|
||||||
pub trait ThemeStyle<S> {
|
pub trait ThemeStyle<S> {
|
||||||
/// The style according to the classes and state of the widget
|
/// The style according to the classes and state of the widget
|
||||||
fn style(&mut self, themes: &Themes, classes: &Classes, state: WidgetState) -> S;
|
fn style(&mut self, ctx: &Context, classes: &Classes, state: WidgetState) -> S;
|
||||||
|
|
||||||
/// Help to differ the different themes
|
/// Help to differ the different themes
|
||||||
fn theme_type_id(&self) -> TypeId
|
fn theme_type_id(&self) -> TypeId
|
||||||
@@ -60,29 +59,31 @@ pub trait ThemeStyle<S> {
|
|||||||
struct DefaultStyle;
|
struct DefaultStyle;
|
||||||
|
|
||||||
impl ThemeStyle<BaseStyle> for DefaultStyle {
|
impl ThemeStyle<BaseStyle> for DefaultStyle {
|
||||||
fn style(&mut self, _themes: &Themes, _classes: &Classes, state: WidgetState) -> BaseStyle {
|
fn style(&mut self, ctx: &Context, _classes: &Classes, state: WidgetState) -> BaseStyle {
|
||||||
let visuals = Widgets::dark();
|
let style = ctx.global_style();
|
||||||
let spacing = Spacing::default();
|
let spacing = &style.spacing;
|
||||||
|
let widget_visuals = match state {
|
||||||
let visuals = match state {
|
WidgetState::Noninteractive => style.visuals.widgets.noninteractive,
|
||||||
WidgetState::Noninteractive => visuals.noninteractive,
|
WidgetState::Inactive => style.visuals.widgets.inactive,
|
||||||
WidgetState::Inactive => visuals.inactive,
|
WidgetState::Hovered => style.visuals.widgets.hovered,
|
||||||
WidgetState::Hovered => visuals.hovered,
|
WidgetState::Active => style.visuals.widgets.active,
|
||||||
WidgetState::Active => visuals.active,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
BaseStyle {
|
BaseStyle {
|
||||||
frame: Frame {
|
frame: Frame {
|
||||||
fill: visuals.bg_fill,
|
fill: widget_visuals.bg_fill,
|
||||||
stroke: visuals.bg_stroke,
|
stroke: widget_visuals.bg_stroke,
|
||||||
corner_radius: visuals.corner_radius,
|
corner_radius: widget_visuals.corner_radius,
|
||||||
inner_margin: spacing.button_padding.into(),
|
inner_margin: spacing.button_padding.into(),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
},
|
},
|
||||||
stroke: visuals.fg_stroke,
|
stroke: widget_visuals.fg_stroke,
|
||||||
text: TextVisuals {
|
text: TextVisuals {
|
||||||
color: visuals.text_color(),
|
color: widget_visuals.text_color(),
|
||||||
font_id: TextStyle::Body.resolve(&Style::default()),
|
font_id: style
|
||||||
|
.override_font_id
|
||||||
|
.clone()
|
||||||
|
.unwrap_or_else(|| TextStyle::Body.resolve(&style)),
|
||||||
strikethrough: Stroke::NONE,
|
strikethrough: Stroke::NONE,
|
||||||
underline: Stroke::NONE,
|
underline: Stroke::NONE,
|
||||||
},
|
},
|
||||||
@@ -91,21 +92,20 @@ impl ThemeStyle<BaseStyle> for DefaultStyle {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl ThemeStyle<ButtonStyle> for DefaultStyle {
|
impl ThemeStyle<ButtonStyle> for DefaultStyle {
|
||||||
fn style(&mut self, themes: &Themes, classes: &Classes, state: WidgetState) -> ButtonStyle {
|
fn style(&mut self, ctx: &Context, classes: &Classes, state: WidgetState) -> ButtonStyle {
|
||||||
let widget_visuals = Widgets::dark();
|
let style = ctx.global_style();
|
||||||
let spacing = Spacing::default();
|
let spacing = &style.spacing;
|
||||||
|
|
||||||
let mut widget_visuals = match state {
|
let mut widget_visuals = match state {
|
||||||
WidgetState::Noninteractive => widget_visuals.noninteractive,
|
WidgetState::Noninteractive => style.visuals.widgets.noninteractive,
|
||||||
WidgetState::Inactive => widget_visuals.inactive,
|
WidgetState::Inactive => style.visuals.widgets.inactive,
|
||||||
WidgetState::Hovered => widget_visuals.hovered,
|
WidgetState::Hovered => style.visuals.widgets.hovered,
|
||||||
WidgetState::Active => widget_visuals.active,
|
WidgetState::Active => style.visuals.widgets.active,
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut ws: BaseStyle = themes.get(classes, state);
|
let mut ws: BaseStyle = ctx.get_widget_style(classes, state);
|
||||||
|
|
||||||
if classes.has(SELECTED_CLASS) {
|
if classes.has(SELECTED_CLASS) {
|
||||||
let visuals = Visuals::default();
|
let visuals = &style.visuals;
|
||||||
widget_visuals.weak_bg_fill = visuals.selection.bg_fill;
|
widget_visuals.weak_bg_fill = visuals.selection.bg_fill;
|
||||||
widget_visuals.bg_fill = visuals.selection.bg_fill;
|
widget_visuals.bg_fill = visuals.selection.bg_fill;
|
||||||
widget_visuals.fg_stroke = visuals.selection.stroke;
|
widget_visuals.fg_stroke = visuals.selection.stroke;
|
||||||
@@ -129,18 +129,17 @@ impl ThemeStyle<ButtonStyle> for DefaultStyle {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl ThemeStyle<CheckboxStyle> for DefaultStyle {
|
impl ThemeStyle<CheckboxStyle> for DefaultStyle {
|
||||||
fn style(&mut self, themes: &Themes, classes: &Classes, state: WidgetState) -> CheckboxStyle {
|
fn style(&mut self, ctx: &Context, classes: &Classes, state: WidgetState) -> CheckboxStyle {
|
||||||
let widget_visuals = Widgets::dark();
|
let style = ctx.global_style();
|
||||||
let spacing = Spacing::default();
|
let spacing = &style.spacing;
|
||||||
|
|
||||||
let widget_visuals = match state {
|
let widget_visuals = match state {
|
||||||
WidgetState::Noninteractive => widget_visuals.noninteractive,
|
WidgetState::Noninteractive => style.visuals.widgets.noninteractive,
|
||||||
WidgetState::Inactive => widget_visuals.inactive,
|
WidgetState::Inactive => style.visuals.widgets.inactive,
|
||||||
WidgetState::Hovered => widget_visuals.hovered,
|
WidgetState::Hovered => style.visuals.widgets.hovered,
|
||||||
WidgetState::Active => widget_visuals.active,
|
WidgetState::Active => style.visuals.widgets.active,
|
||||||
};
|
};
|
||||||
|
|
||||||
let ws: BaseStyle = themes.get(classes, state);
|
let ws: BaseStyle = ctx.get_widget_style(classes, state);
|
||||||
|
|
||||||
CheckboxStyle {
|
CheckboxStyle {
|
||||||
frame: Frame::new(),
|
frame: Frame::new(),
|
||||||
@@ -159,8 +158,8 @@ impl ThemeStyle<CheckboxStyle> for DefaultStyle {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl ThemeStyle<LabelStyle> for DefaultStyle {
|
impl ThemeStyle<LabelStyle> for DefaultStyle {
|
||||||
fn style(&mut self, themes: &Themes, classes: &Classes, state: WidgetState) -> LabelStyle {
|
fn style(&mut self, ctx: &Context, classes: &Classes, state: WidgetState) -> LabelStyle {
|
||||||
let ws: BaseStyle = themes.get(classes, state);
|
let ws: BaseStyle = ctx.get_widget_style(classes, state);
|
||||||
|
|
||||||
LabelStyle {
|
LabelStyle {
|
||||||
frame: Frame {
|
frame: Frame {
|
||||||
@@ -178,8 +177,8 @@ impl ThemeStyle<LabelStyle> for DefaultStyle {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl ThemeStyle<SeparatorStyle> for DefaultStyle {
|
impl ThemeStyle<SeparatorStyle> for DefaultStyle {
|
||||||
fn style(&mut self, themes: &Themes, classes: &Classes, state: WidgetState) -> SeparatorStyle {
|
fn style(&mut self, ctx: &Context, classes: &Classes, state: WidgetState) -> SeparatorStyle {
|
||||||
let ws: BaseStyle = themes.get(classes, state);
|
let ws: BaseStyle = ctx.get_widget_style(classes, state);
|
||||||
|
|
||||||
SeparatorStyle {
|
SeparatorStyle {
|
||||||
spacing: 6.0,
|
spacing: 6.0,
|
||||||
@@ -273,13 +272,18 @@ impl Themes {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Fetch the style of the current theme
|
/// Fetch the style of the current theme
|
||||||
pub fn get<S: WidgetStyle + 'static>(&self, classes: &Classes, state: WidgetState) -> S {
|
pub fn get<S: WidgetStyle + 'static>(
|
||||||
|
&self,
|
||||||
|
ctx: &Context,
|
||||||
|
classes: &Classes,
|
||||||
|
state: WidgetState,
|
||||||
|
) -> S {
|
||||||
let v = self
|
let v = self
|
||||||
.themes
|
.themes
|
||||||
.get_temp::<Arc<Mutex<Box<dyn ThemeStyle<S> + Send + Sync>>>>(Id::NULL);
|
.get_temp::<Arc<Mutex<Box<dyn ThemeStyle<S> + Send + Sync>>>>(Id::NULL);
|
||||||
|
|
||||||
v.unwrap_or_else(|| panic!("A style should be set for {:?}", std::any::type_name::<S>()))
|
v.unwrap_or_else(|| panic!("A style should be set for {:?}", std::any::type_name::<S>()))
|
||||||
.lock()
|
.lock()
|
||||||
.style(self, classes, state)
|
.style(ctx, classes, state)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
use eframe::egui::{
|
use eframe::egui::{
|
||||||
Color32,
|
Color32, Context,
|
||||||
theme_plugin::{ThemeCache, ThemeStyle, Themes},
|
theme_plugin::{ThemeCache, ThemeStyle},
|
||||||
widget_style::{BaseStyle, ButtonStyle, Classes, HasClasses as _, WidgetState},
|
widget_style::{BaseStyle, ButtonStyle, Classes, HasClasses as _, WidgetState},
|
||||||
};
|
};
|
||||||
use logos::Logos;
|
use logos::Logos;
|
||||||
@@ -78,15 +78,15 @@ impl ESSEngine {
|
|||||||
|
|
||||||
/// This implementation basically do nothing. This is only the minimum requirement with caching.
|
/// This implementation basically do nothing. This is only the minimum requirement with caching.
|
||||||
impl ThemeStyle<BaseStyle> for ESSEngine {
|
impl ThemeStyle<BaseStyle> for ESSEngine {
|
||||||
fn style(&mut self, themes: &Themes, classes: &Classes, state: WidgetState) -> BaseStyle {
|
fn style(&mut self, ctx: &Context, classes: &Classes, state: WidgetState) -> BaseStyle {
|
||||||
themes.get::<BaseStyle>(classes, state)
|
ctx.get_widget_style::<BaseStyle>(classes, state)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ThemeStyle<ButtonStyle> for ESSEngine {
|
impl ThemeStyle<ButtonStyle> for ESSEngine {
|
||||||
fn style(&mut self, themes: &Themes, classes: &Classes, state: WidgetState) -> ButtonStyle {
|
fn style(&mut self, ctx: &Context, classes: &Classes, state: WidgetState) -> ButtonStyle {
|
||||||
self.cache.get(classes, state, || {
|
self.cache.get(classes, state, || {
|
||||||
let mut default = themes.get::<ButtonStyle>(classes, state);
|
let mut default = ctx.get_widget_style::<ButtonStyle>(classes, state);
|
||||||
for class in classes.list() {
|
for class in classes.list() {
|
||||||
if let Some(properties) = self.info.get(&class.to_string()) {
|
if let Some(properties) = self.info.get(&class.to_string()) {
|
||||||
for (property, value) in properties {
|
for (property, value) in properties {
|
||||||
|
|||||||
Reference in New Issue
Block a user