Add some improvements in the documentation (#1056)
* Better documentation for align.rs * Document some painting methods * Fix broken intra-doc links * Add some internal documentation for Window TitleBar
This commit is contained in:
parent
624e2fcfc1
commit
87ae77aab0
6 changed files with 129 additions and 17 deletions
|
@ -741,9 +741,16 @@ fn paint_frame_interaction(
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
struct TitleBar {
|
struct TitleBar {
|
||||||
|
/// A title Id used for dragging windows
|
||||||
id: Id,
|
id: Id,
|
||||||
|
/// Prepared text in the title
|
||||||
title_galley: WidgetTextGalley,
|
title_galley: WidgetTextGalley,
|
||||||
|
/// Size of the title bar in a collapsed state (if window is collapsible),
|
||||||
|
/// which includes all necessary space for showing the expand button, the
|
||||||
|
/// title and the close button.
|
||||||
min_rect: Rect,
|
min_rect: Rect,
|
||||||
|
/// Size of the title bar in an expanded state. This size become known only
|
||||||
|
/// after expanding window and painting its content
|
||||||
rect: Rect,
|
rect: Rect,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -804,6 +811,20 @@ fn show_title_bar(
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TitleBar {
|
impl TitleBar {
|
||||||
|
/// Finishes painting of the title bar when the window content size already known.
|
||||||
|
///
|
||||||
|
/// # Parameters
|
||||||
|
///
|
||||||
|
/// - `ui`:
|
||||||
|
/// - `outer_rect`:
|
||||||
|
/// - `content_response`: if `None`, window is collapsed at this frame, otherwise contains
|
||||||
|
/// a result of rendering the window content
|
||||||
|
/// - `open`: if `None`, no "Close" button will be rendered, otherwise renders and processes
|
||||||
|
/// the "Close" button and writes a `false` if window was closed
|
||||||
|
/// - `collapsing`: holds the current expanding state. Can be changed by double click on the
|
||||||
|
/// title if `collapsible` is `true`
|
||||||
|
/// - `collapsible`: if `true`, double click on the title bar will be handled for a change
|
||||||
|
/// of `collapsing` state
|
||||||
fn ui(
|
fn ui(
|
||||||
mut self,
|
mut self,
|
||||||
ui: &mut Ui,
|
ui: &mut Ui,
|
||||||
|
@ -857,6 +878,11 @@ impl TitleBar {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Paints the "Close" button at the right side of the title bar
|
||||||
|
/// and processes clicks on it.
|
||||||
|
///
|
||||||
|
/// The button is square and its size is determined by the
|
||||||
|
/// [`crate::style::Spacing::icon_width`] setting.
|
||||||
fn close_button_ui(&self, ui: &mut Ui) -> Response {
|
fn close_button_ui(&self, ui: &mut Ui) -> Response {
|
||||||
let button_size = Vec2::splat(ui.spacing().icon_width);
|
let button_size = Vec2::splat(ui.spacing().icon_width);
|
||||||
let pad = (self.rect.height() - button_size.y) / 2.0; // calculated so that the icon is on the diagonal (if window padding is symmetrical)
|
let pad = (self.rect.height() - button_size.y) / 2.0; // calculated so that the icon is on the diagonal (if window padding is symmetrical)
|
||||||
|
@ -872,6 +898,16 @@ impl TitleBar {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Paints the "Close" button of the window and processes clicks on it.
|
||||||
|
///
|
||||||
|
/// The close button is just an `X` symbol painted by a current stroke
|
||||||
|
/// for foreground elements (such as a label text).
|
||||||
|
///
|
||||||
|
/// # Parameters
|
||||||
|
/// - `ui`:
|
||||||
|
/// - `rect`: The rectangular area to fit the button in
|
||||||
|
///
|
||||||
|
/// Returns the result of a click on a button if it was pressed
|
||||||
fn close_button(ui: &mut Ui, rect: Rect) -> Response {
|
fn close_button(ui: &mut Ui, rect: Rect) -> Response {
|
||||||
let close_id = ui.auto_id_with("window_close_button");
|
let close_id = ui.auto_id_with("window_close_button");
|
||||||
let response = ui.interact(rect, close_id, Sense::click());
|
let response = ui.interact(rect, close_id, Sense::click());
|
||||||
|
@ -880,9 +916,9 @@ fn close_button(ui: &mut Ui, rect: Rect) -> Response {
|
||||||
let visuals = ui.style().interact(&response);
|
let visuals = ui.style().interact(&response);
|
||||||
let rect = rect.shrink(2.0).expand(visuals.expansion);
|
let rect = rect.shrink(2.0).expand(visuals.expansion);
|
||||||
let stroke = visuals.fg_stroke;
|
let stroke = visuals.fg_stroke;
|
||||||
ui.painter()
|
ui.painter() // paints \
|
||||||
.line_segment([rect.left_top(), rect.right_bottom()], stroke);
|
.line_segment([rect.left_top(), rect.right_bottom()], stroke);
|
||||||
ui.painter()
|
ui.painter() // paints /
|
||||||
.line_segment([rect.right_top(), rect.left_bottom()], stroke);
|
.line_segment([rect.right_top(), rect.left_bottom()], stroke);
|
||||||
response
|
response
|
||||||
}
|
}
|
||||||
|
|
|
@ -232,6 +232,8 @@ impl Painter {
|
||||||
|
|
||||||
/// # Paint different primitives
|
/// # Paint different primitives
|
||||||
impl Painter {
|
impl Painter {
|
||||||
|
/// Paints the line from the first point to the second using the `stroke`
|
||||||
|
/// for outlining shape.
|
||||||
pub fn line_segment(&self, points: [Pos2; 2], stroke: impl Into<Stroke>) {
|
pub fn line_segment(&self, points: [Pos2; 2], stroke: impl Into<Stroke>) {
|
||||||
self.add(Shape::LineSegment {
|
self.add(Shape::LineSegment {
|
||||||
points,
|
points,
|
||||||
|
|
|
@ -1073,7 +1073,7 @@ impl Ui {
|
||||||
/// Add extra space before the next widget.
|
/// Add extra space before the next widget.
|
||||||
///
|
///
|
||||||
/// The direction is dependent on the layout.
|
/// The direction is dependent on the layout.
|
||||||
/// This will be in addition to the [`Spacing::item_spacing`}.
|
/// This will be in addition to the [`crate::style::Spacing::item_spacing`].
|
||||||
///
|
///
|
||||||
/// [`Self::min_rect`] will expand to contain the space.
|
/// [`Self::min_rect`] will expand to contain the space.
|
||||||
#[inline]
|
#[inline]
|
||||||
|
|
|
@ -342,7 +342,7 @@ struct ExplicitGenerator {
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
/// Result of [`PlotItem::find_closest()`] search, identifies an element inside the item for immediate use
|
/// Result of [`super::PlotItem::find_closest()`] search, identifies an element inside the item for immediate use
|
||||||
pub(crate) struct ClosestElem {
|
pub(crate) struct ClosestElem {
|
||||||
/// Position of hovered-over value (or bar/box-plot/...) in PlotItem
|
/// Position of hovered-over value (or bar/box-plot/...) in PlotItem
|
||||||
pub index: usize,
|
pub index: usize,
|
||||||
|
|
|
@ -47,20 +47,64 @@ impl Align {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// ```
|
/// Returns a range of given size within a specified range.
|
||||||
/// assert_eq!(emath::Align::Min.align_size_within_range(2.0, 10.0..=20.0), 10.0..=12.0);
|
|
||||||
/// assert_eq!(emath::Align::Center.align_size_within_range(2.0, 10.0..=20.0), 14.0..=16.0);
|
|
||||||
/// assert_eq!(emath::Align::Max.align_size_within_range(2.0, 10.0..=20.0), 18.0..=20.0);
|
|
||||||
/// assert_eq!(emath::Align::Min.align_size_within_range(f32::INFINITY, 10.0..=20.0), 10.0..=f32::INFINITY);
|
|
||||||
/// assert_eq!(emath::Align::Center.align_size_within_range(f32::INFINITY, 10.0..=20.0), f32::NEG_INFINITY..=f32::INFINITY);
|
|
||||||
/// assert_eq!(emath::Align::Max.align_size_within_range(f32::INFINITY, 10.0..=20.0), f32::NEG_INFINITY..=20.0);
|
|
||||||
///
|
///
|
||||||
/// assert_eq!(emath::Align::Min.align_size_within_range(f32::INFINITY, 10.0..=f32::INFINITY), 10.0..=f32::INFINITY);
|
/// If the requested `size` is bigger than the size of `range`, then the returned
|
||||||
/// assert_eq!(emath::Align::Min.align_size_within_range(f32::INFINITY, f32::NEG_INFINITY..=10.0), f32::NEG_INFINITY..=10.0);
|
/// range will not fit into the available `range`. The extra space will be allocated
|
||||||
/// assert_eq!(emath::Align::Center.align_size_within_range(f32::INFINITY, 10.0..=f32::INFINITY), 10.0..=f32::INFINITY);
|
/// from:
|
||||||
/// assert_eq!(emath::Align::Center.align_size_within_range(f32::INFINITY, f32::NEG_INFINITY..=10.0), f32::NEG_INFINITY..=10.0);
|
///
|
||||||
/// assert_eq!(emath::Align::Max.align_size_within_range(f32::INFINITY, 10.0..=f32::INFINITY), 10.0..=f32::INFINITY);
|
/// |Align |Side |
|
||||||
/// assert_eq!(emath::Align::Max.align_size_within_range(f32::INFINITY, f32::NEG_INFINITY..=10.0), f32::NEG_INFINITY..=10.0);
|
/// |------|------------|
|
||||||
|
/// |Min |right (end) |
|
||||||
|
/// |Center|both |
|
||||||
|
/// |Max |left (start)|
|
||||||
|
///
|
||||||
|
/// # Examples
|
||||||
|
/// ```
|
||||||
|
/// use std::f32::{INFINITY, NEG_INFINITY};
|
||||||
|
/// use emath::Align::*;
|
||||||
|
///
|
||||||
|
/// // The size is smaller than a range
|
||||||
|
/// assert_eq!(Min .align_size_within_range(2.0, 10.0..=20.0), 10.0..=12.0);
|
||||||
|
/// assert_eq!(Center.align_size_within_range(2.0, 10.0..=20.0), 14.0..=16.0);
|
||||||
|
/// assert_eq!(Max .align_size_within_range(2.0, 10.0..=20.0), 18.0..=20.0);
|
||||||
|
///
|
||||||
|
/// // The size is bigger than a range
|
||||||
|
/// assert_eq!(Min .align_size_within_range(20.0, 10.0..=20.0), 10.0..=30.0);
|
||||||
|
/// assert_eq!(Center.align_size_within_range(20.0, 10.0..=20.0), 5.0..=25.0);
|
||||||
|
/// assert_eq!(Max .align_size_within_range(20.0, 10.0..=20.0), 0.0..=20.0);
|
||||||
|
///
|
||||||
|
/// // The size is infinity, but range is finite - a special case of a previous example
|
||||||
|
/// assert_eq!(Min .align_size_within_range(INFINITY, 10.0..=20.0), 10.0..=INFINITY);
|
||||||
|
/// assert_eq!(Center.align_size_within_range(INFINITY, 10.0..=20.0), NEG_INFINITY..=INFINITY);
|
||||||
|
/// assert_eq!(Max .align_size_within_range(INFINITY, 10.0..=20.0), NEG_INFINITY..=20.0);
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
/// The infinity-sized ranges can produce a surprising results, if the size is also infinity,
|
||||||
|
/// use such ranges with carefully!
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// use std::f32::{INFINITY, NEG_INFINITY};
|
||||||
|
/// use emath::Align::*;
|
||||||
|
///
|
||||||
|
/// // Allocating a size aligned for infinity bound will lead to empty ranges!
|
||||||
|
/// assert_eq!(Min .align_size_within_range(2.0, 10.0..=INFINITY), 10.0..=12.0);
|
||||||
|
/// assert_eq!(Center.align_size_within_range(2.0, 10.0..=INFINITY), INFINITY..=INFINITY);// (!)
|
||||||
|
/// assert_eq!(Max .align_size_within_range(2.0, 10.0..=INFINITY), INFINITY..=INFINITY);// (!)
|
||||||
|
///
|
||||||
|
/// assert_eq!(Min .align_size_within_range(2.0, NEG_INFINITY..=20.0), NEG_INFINITY..=NEG_INFINITY);// (!)
|
||||||
|
/// assert_eq!(Center.align_size_within_range(2.0, NEG_INFINITY..=20.0), NEG_INFINITY..=NEG_INFINITY);// (!)
|
||||||
|
/// assert_eq!(Max .align_size_within_range(2.0, NEG_INFINITY..=20.0), 18.0..=20.0);
|
||||||
|
///
|
||||||
|
///
|
||||||
|
/// // The infinity size will always return the given range if it has at least one infinity bound
|
||||||
|
/// assert_eq!(Min .align_size_within_range(INFINITY, 10.0..=INFINITY), 10.0..=INFINITY);
|
||||||
|
/// assert_eq!(Center.align_size_within_range(INFINITY, 10.0..=INFINITY), 10.0..=INFINITY);
|
||||||
|
/// assert_eq!(Max .align_size_within_range(INFINITY, 10.0..=INFINITY), 10.0..=INFINITY);
|
||||||
|
///
|
||||||
|
/// assert_eq!(Min .align_size_within_range(INFINITY, NEG_INFINITY..=20.0), NEG_INFINITY..=20.0);
|
||||||
|
/// assert_eq!(Center.align_size_within_range(INFINITY, NEG_INFINITY..=20.0), NEG_INFINITY..=20.0);
|
||||||
|
/// assert_eq!(Max .align_size_within_range(INFINITY, NEG_INFINITY..=20.0), NEG_INFINITY..=20.0);
|
||||||
/// ```
|
/// ```
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn align_size_within_range(
|
pub fn align_size_within_range(
|
||||||
|
@ -118,11 +162,13 @@ impl Align2 {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Align2 {
|
impl Align2 {
|
||||||
|
/// Returns an alignment by the X (horizontal) axis
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub fn x(self) -> Align {
|
pub fn x(self) -> Align {
|
||||||
self.0[0]
|
self.0[0]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns an alignment by the Y (vertical) axis
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub fn y(self) -> Align {
|
pub fn y(self) -> Align {
|
||||||
self.0[1]
|
self.0[1]
|
||||||
|
@ -156,6 +202,26 @@ impl Align2 {
|
||||||
Rect::from_x_y_ranges(x_range, y_range)
|
Rect::from_x_y_ranges(x_range, y_range)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns the point on the rect's frame or in the center of a rect according
|
||||||
|
/// to the alignments of this object.
|
||||||
|
///
|
||||||
|
/// ```text
|
||||||
|
/// (*)-----------+------(*)------+-----------(*)--> X
|
||||||
|
/// | | | |
|
||||||
|
/// | Min, Min | Center, Min | Max, Min |
|
||||||
|
/// | | | |
|
||||||
|
/// +------------+---------------+------------+
|
||||||
|
/// | | | |
|
||||||
|
/// (*)Min, Center|Center(*)Center|Max, Center(*)
|
||||||
|
/// | | | |
|
||||||
|
/// +------------+---------------+------------+
|
||||||
|
/// | | | |
|
||||||
|
/// | Min, Max | Center, Max | Max, Max |
|
||||||
|
/// | | | |
|
||||||
|
/// (*)-----------+------(*)------+-----------(*)
|
||||||
|
/// |
|
||||||
|
/// Y
|
||||||
|
/// ```
|
||||||
pub fn pos_in_rect(self, frame: &Rect) -> Pos2 {
|
pub fn pos_in_rect(self, frame: &Rect) -> Pos2 {
|
||||||
let x = match self.x() {
|
let x = match self.x() {
|
||||||
Align::Min => frame.left(),
|
Align::Min => frame.left(),
|
||||||
|
@ -188,6 +254,11 @@ impl std::ops::IndexMut<usize> for Align2 {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Allocates a rectangle of the specified `size` inside the `frame` rectangle
|
||||||
|
/// around of its center.
|
||||||
|
///
|
||||||
|
/// If `size` is bigger than the `frame`s size the returned rect will bounce out
|
||||||
|
/// of the `frame`.
|
||||||
pub fn center_size_in_rect(size: Vec2, frame: Rect) -> Rect {
|
pub fn center_size_in_rect(size: Vec2, frame: Rect) -> Rect {
|
||||||
Align2::CENTER_CENTER.align_size_within_rect(size, frame)
|
Align2::CENTER_CENTER.align_size_within_rect(size, frame)
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,10 +15,13 @@ pub enum Shape {
|
||||||
/// For performance reasons it is better to avoid it.
|
/// For performance reasons it is better to avoid it.
|
||||||
Vec(Vec<Shape>),
|
Vec(Vec<Shape>),
|
||||||
Circle(CircleShape),
|
Circle(CircleShape),
|
||||||
|
/// A line between two points.
|
||||||
LineSegment {
|
LineSegment {
|
||||||
points: [Pos2; 2],
|
points: [Pos2; 2],
|
||||||
stroke: Stroke,
|
stroke: Stroke,
|
||||||
},
|
},
|
||||||
|
/// A series of lines between points.
|
||||||
|
/// The path can have a stroke and/or fill (if closed).
|
||||||
Path(PathShape),
|
Path(PathShape),
|
||||||
Rect(RectShape),
|
Rect(RectShape),
|
||||||
Text(TextShape),
|
Text(TextShape),
|
||||||
|
|
Loading…
Reference in a new issue