pub struct Frame {
pub inner_margin: Margin,
pub fill: Color32,
pub stroke: Stroke,
pub corner_radius: CornerRadius,
pub outer_margin: Margin,
pub shadow: Shadow,
}
Expand description
A frame around some content, including margin, colors, etc.
§Definitions
The total (outer) size of a frame is
content_size + inner_margin + 2 * stroke.width + outer_margin
.
Everything within the stroke is filled with the fill color (if any).
+-----------------^-------------------------------------- -+
| | outer_margin |
| +------------v----^------------------------------+ |
| | | stroke width | |
| | +------------v---^---------------------+ | |
| | | | inner_margin | | |
| | | +-----------v----------------+ | | |
| | | | ^ | | | |
| | | | | | | | |
| | | |<------ content_size ------>| | | |
| | | | | | | | |
| | | | v | | | |
| | | +------- content_rect -------+ | | |
| | | | | |
| | +-------------fill_rect ---------------+ | |
| | | |
| +----------------- widget_rect ------------------+ |
| |
+---------------------- outer_rect ------------------------+
The four rectangles, from inside to outside, are:
content_rect
: the rectangle that is made available to the innerUi
or widget.fill_rect
: the rectangle that is filled with the fill color (inside the stroke, if any).widget_rect
: is the interactive part of the widget (what sense clicks etc).outer_rect
: what is allocated in the outerUi
, and is what is returned byResponse::rect
.
§Usage
egui::Frame::none()
.fill(egui::Color32::RED)
.show(ui, |ui| {
ui.label("Label with red background");
});
§Dynamic color
If you want to change the color of the frame based on the response of the widget, you need to break it up into multiple steps:
let mut frame = egui::Frame::default().inner_margin(4.0).begin(ui);
{
let response = frame.content_ui.label("Inside the frame");
if response.hovered() {
frame.frame.fill = egui::Color32::RED;
}
}
frame.end(ui); // Will "close" the frame.
You can also respond to the hovering of the frame itself:
let mut frame = egui::Frame::default().inner_margin(4.0).begin(ui);
{
frame.content_ui.label("Inside the frame");
frame.content_ui.label("This too");
}
let response = frame.allocate_space(ui);
if response.hovered() {
frame.frame.fill = egui::Color32::RED;
}
frame.paint(ui);
Note that you cannot change the margins after calling begin
.
Fields§
§inner_margin: Margin
Margin within the painted frame.
Known as padding
in CSS.
fill: Color32
The background fill color of the frame, within the Self::stroke
.
Known as background
in CSS.
stroke: Stroke
The width and color of the outline around the frame.
The width of the stroke is part of the total margin/padding of the frame.
corner_radius: CornerRadius
The rounding of the outer corner of the Self::stroke
(or, if there is no stroke, the outer corner of Self::fill
).
In other words, this is the corner radius of the widget rect.
outer_margin: Margin
Margin outside the painted frame.
Similar to what is called margin
in CSS.
However, egui does NOT do “Margin Collapse” like in CSS,
i.e. when placing two frames next to each other,
the distance between their borders is the SUM
of their other margins.
In CSS the distance would be the MAX of their outer margins.
Supporting margin collapse is difficult, and would
requires complicating the already complicated egui layout code.
Consider using crate::Spacing::item_spacing
for adding space between widgets.
shadow: Shadow
Optional drop-shadow behind the frame.
Implementations§
§impl Frame
impl Frame
§Constructors
pub const fn new() -> Frame
pub const fn new() -> Frame
No colors, no margins, no border.
Same as Frame::NONE
.
pub const fn none() -> Frame
Frame::NONE
or Frame::new()
instead.pub fn group(style: &Style) -> Frame
pub fn group(style: &Style) -> Frame
For when you want to group a few widgets together within a frame.
pub fn side_top_panel(style: &Style) -> Frame
pub fn central_panel(style: &Style) -> Frame
pub fn window(style: &Style) -> Frame
pub fn popup(style: &Style) -> Frame
pub fn canvas(style: &Style) -> Frame
pub fn canvas(style: &Style) -> Frame
A canvas to draw on.
In bright mode this will be very bright, and in dark mode this will be very dark.
pub fn dark_canvas(style: &Style) -> Frame
pub fn dark_canvas(style: &Style) -> Frame
A dark canvas to draw on.
§impl Frame
impl Frame
§Builders
pub fn inner_margin(self, inner_margin: impl Into<Margin>) -> Frame
pub fn inner_margin(self, inner_margin: impl Into<Margin>) -> Frame
Margin within the painted frame.
Known as padding
in CSS.
pub fn fill(self, fill: Color32) -> Frame
pub fn fill(self, fill: Color32) -> Frame
The background fill color of the frame, within the Self::stroke
.
Known as background
in CSS.
pub fn stroke(self, stroke: impl Into<Stroke>) -> Frame
pub fn stroke(self, stroke: impl Into<Stroke>) -> Frame
The width and color of the outline around the frame.
The width of the stroke is part of the total margin/padding of the frame.
pub fn corner_radius(self, corner_radius: impl Into<CornerRadius>) -> Frame
pub fn corner_radius(self, corner_radius: impl Into<CornerRadius>) -> Frame
The rounding of the outer corner of the Self::stroke
(or, if there is no stroke, the outer corner of Self::fill
).
In other words, this is the corner radius of the widget rect.
pub fn rounding(self, corner_radius: impl Into<CornerRadius>) -> Frame
👎Deprecated: Renamed to corner_radius
pub fn rounding(self, corner_radius: impl Into<CornerRadius>) -> Frame
corner_radius
The rounding of the outer corner of the Self::stroke
(or, if there is no stroke, the outer corner of Self::fill
).
In other words, this is the corner radius of the widget rect.
pub fn outer_margin(self, outer_margin: impl Into<Margin>) -> Frame
pub fn outer_margin(self, outer_margin: impl Into<Margin>) -> Frame
Margin outside the painted frame.
Similar to what is called margin
in CSS.
However, egui does NOT do “Margin Collapse” like in CSS,
i.e. when placing two frames next to each other,
the distance between their borders is the SUM
of their other margins.
In CSS the distance would be the MAX of their outer margins.
Supporting margin collapse is difficult, and would
requires complicating the already complicated egui layout code.
Consider using crate::Spacing::item_spacing
for adding space between widgets.
pub fn multiply_with_opacity(self, opacity: f32) -> Frame
pub fn multiply_with_opacity(self, opacity: f32) -> Frame
Opacity multiplier in gamma space.
For instance, multiplying with 0.5
will make the frame half transparent.
§impl Frame
impl Frame
§Inspectors
pub fn total_margin(&self) -> Marginf
pub fn total_margin(&self) -> Marginf
How much extra space the frame uses up compared to the content.
Self::inner_margin
+ [Self.stroke
].width
+ Self::outer_margin
.
pub fn fill_rect(&self, content_rect: Rect) -> Rect
pub fn fill_rect(&self, content_rect: Rect) -> Rect
Calculate the fill_rect
from the content_rect
.
This is the rectangle that is filled with the fill color (inside the stroke, if any).
pub fn widget_rect(&self, content_rect: Rect) -> Rect
pub fn widget_rect(&self, content_rect: Rect) -> Rect
Calculate the widget_rect
from the content_rect
.
This is the visible and interactive rectangle.
pub fn outer_rect(&self, content_rect: Rect) -> Rect
pub fn outer_rect(&self, content_rect: Rect) -> Rect
Calculate the outer_rect
from the content_rect
.
This is what is allocated in the outer Ui
, and is what is returned by Response::rect
.
§impl Frame
impl Frame
pub fn begin(self, ui: &mut Ui) -> Prepared
pub fn begin(self, ui: &mut Ui) -> Prepared
Begin a dynamically colored frame.
This is a more advanced API.
Usually you want to use Self::show
instead.
See docs for Frame
for an example.
pub fn show<R>(
self,
ui: &mut Ui,
add_contents: impl FnOnce(&mut Ui) -> R,
) -> InnerResponse<R>
pub fn show<R>( self, ui: &mut Ui, add_contents: impl FnOnce(&mut Ui) -> R, ) -> InnerResponse<R>
Show the given ui surrounded by this frame.
Trait Implementations§
§impl<'de> Deserialize<'de> for Frame
impl<'de> Deserialize<'de> for Frame
§fn deserialize<__D>(
__deserializer: __D,
) -> Result<Frame, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(
__deserializer: __D,
) -> Result<Frame, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
§impl Serialize for Frame
impl Serialize for Frame
§fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
impl Copy for Frame
impl StructuralPartialEq for Frame
Auto Trait Implementations§
impl Freeze for Frame
impl RefUnwindSafe for Frame
impl Send for Frame
impl Sync for Frame
impl Unpin for Frame
impl UnwindSafe for Frame
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
source§impl<T> CheckedAs for T
impl<T> CheckedAs for T
source§fn checked_as<Dst>(self) -> Option<Dst>where
T: CheckedCast<Dst>,
fn checked_as<Dst>(self) -> Option<Dst>where
T: CheckedCast<Dst>,
source§impl<Src, Dst> CheckedCastFrom<Src> for Dstwhere
Src: CheckedCast<Dst>,
impl<Src, Dst> CheckedCastFrom<Src> for Dstwhere
Src: CheckedCast<Dst>,
source§fn checked_cast_from(src: Src) -> Option<Dst>
fn checked_cast_from(src: Src) -> Option<Dst>
source§impl<T> CloneToUninit for Twhere
T: Copy,
impl<T> CloneToUninit for Twhere
T: Copy,
source§unsafe fn clone_to_uninit(&self, dst: *mut T)
unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
source§default unsafe fn clone_to_uninit(&self, dst: *mut T)
default unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)§impl<T> Conv for T
impl<T> Conv for T
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.§impl<T> DowncastSync for T
impl<T> DowncastSync for T
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T
in a tonic::Request
source§impl<Src, Dst> LosslessTryInto<Dst> for Srcwhere
Dst: LosslessTryFrom<Src>,
impl<Src, Dst> LosslessTryInto<Dst> for Srcwhere
Dst: LosslessTryFrom<Src>,
source§fn lossless_try_into(self) -> Option<Dst>
fn lossless_try_into(self) -> Option<Dst>
source§impl<Src, Dst> LossyInto<Dst> for Srcwhere
Dst: LossyFrom<Src>,
impl<Src, Dst> LossyInto<Dst> for Srcwhere
Dst: LossyFrom<Src>,
source§fn lossy_into(self) -> Dst
fn lossy_into(self) -> Dst
§impl<T> NoneValue for Twhere
T: Default,
impl<T> NoneValue for Twhere
T: Default,
type NoneType = T
§fn null_value() -> T
fn null_value() -> T
source§impl<T> OverflowingAs for T
impl<T> OverflowingAs for T
source§fn overflowing_as<Dst>(self) -> (Dst, bool)where
T: OverflowingCast<Dst>,
fn overflowing_as<Dst>(self) -> (Dst, bool)where
T: OverflowingCast<Dst>,
source§impl<Src, Dst> OverflowingCastFrom<Src> for Dstwhere
Src: OverflowingCast<Dst>,
impl<Src, Dst> OverflowingCastFrom<Src> for Dstwhere
Src: OverflowingCast<Dst>,
source§fn overflowing_cast_from(src: Src) -> (Dst, bool)
fn overflowing_cast_from(src: Src) -> (Dst, bool)
§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self
, then passes self.as_ref()
into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self
, then passes self.as_mut()
into the pipe
function.§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self
, then passes self.deref()
into the pipe function.§impl<T> Pointable for T
impl<T> Pointable for T
source§impl<T> SaturatingAs for T
impl<T> SaturatingAs for T
source§fn saturating_as<Dst>(self) -> Dstwhere
T: SaturatingCast<Dst>,
fn saturating_as<Dst>(self) -> Dstwhere
T: SaturatingCast<Dst>,
source§impl<Src, Dst> SaturatingCastFrom<Src> for Dstwhere
Src: SaturatingCast<Dst>,
impl<Src, Dst> SaturatingCastFrom<Src> for Dstwhere
Src: SaturatingCast<Dst>,
source§fn saturating_cast_from(src: Src) -> Dst
fn saturating_cast_from(src: Src) -> Dst
§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B>
of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B>
of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R>
view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R>
view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target
of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target
of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow()
only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref()
only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut()
only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref()
only in debug builds, and is erased in release
builds.