summaryrefslogtreecommitdiffstats
path: root/src/widget.rs
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2019-09-14 19:16:06 +0200
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2019-09-14 19:16:06 +0200
commita97401aed2a173260a4abfdb65a77975ce6c0f01 (patch)
treeca85ba2e078ddfeee8e74abd4eaae7c25b031cb2 /src/widget.rs
parent8b8f7563ad33dafeadf6238e377748cdec17d67a (diff)
downloadiced-a97401aed2a173260a4abfdb65a77975ce6c0f01.tar.gz
iced-a97401aed2a173260a4abfdb65a77975ce6c0f01.tar.bz2
iced-a97401aed2a173260a4abfdb65a77975ce6c0f01.zip
Rethink workspace structure
Diffstat (limited to 'src/widget.rs')
-rw-r--r--src/widget.rs114
1 files changed, 114 insertions, 0 deletions
diff --git a/src/widget.rs b/src/widget.rs
new file mode 100644
index 00000000..30606934
--- /dev/null
+++ b/src/widget.rs
@@ -0,0 +1,114 @@
+//! Use the built-in widgets or create your own.
+//!
+//! # Built-in widgets
+//! Every built-in drawable widget has its own module with a `Renderer` trait
+//! that must be implemented by a [renderer] before being able to use it as
+//! a [`Widget`].
+//!
+//! # Custom widgets
+//! If you want to implement a custom widget, you simply need to implement the
+//! [`Widget`] trait. You can use the API of the built-in widgets as a guide or
+//! source of inspiration.
+//!
+//! # Re-exports
+//! For convenience, the contents of this module are available at the root
+//! module. Therefore, you can directly type:
+//!
+//! ```
+//! use iced::{button, Button, Widget};
+//! ```
+//!
+//! [`Widget`]: trait.Widget.html
+//! [renderer]: ../renderer/index.html
+mod column;
+mod row;
+
+pub mod button;
+pub mod checkbox;
+pub mod image;
+//pub mod progress_bar;
+pub mod radio;
+pub mod slider;
+pub mod text;
+
+pub use button::Button;
+pub use checkbox::Checkbox;
+pub use column::Column;
+pub use image::Image;
+//pub use progress_bar::ProgressBar;
+pub use radio::Radio;
+pub use row::Row;
+pub use slider::Slider;
+pub use text::Text;
+
+use crate::{Event, Hasher, Layout, MouseCursor, Node, Point};
+
+/// A component that displays information and allows interaction.
+///
+/// If you want to build your own widgets, you will need to implement this
+/// trait.
+///
+/// [`Widget`]: trait.Widget.html
+/// [`Element`]: ../struct.Element.html
+pub trait Widget<Message, Renderer>: std::fmt::Debug {
+ /// Returns the [`Node`] of the [`Widget`].
+ ///
+ /// This [`Node`] is used by the runtime to compute the [`Layout`] of the
+ /// user interface.
+ ///
+ /// [`Node`]: ../struct.Node.html
+ /// [`Widget`]: trait.Widget.html
+ /// [`Layout`]: ../struct.Layout.html
+ fn node(&self, renderer: &Renderer) -> Node;
+
+ /// Draws the [`Widget`] using the associated `Renderer`.
+ ///
+ /// It must return the [`MouseCursor`] state for the [`Widget`].
+ ///
+ /// [`Widget`]: trait.Widget.html
+ /// [`MouseCursor`]: ../enum.MouseCursor.html
+ fn draw(
+ &self,
+ renderer: &mut Renderer,
+ layout: Layout<'_>,
+ cursor_position: Point,
+ ) -> MouseCursor;
+
+ /// Computes the _layout_ hash of the [`Widget`].
+ ///
+ /// The produced hash is used by the runtime to decide if the [`Layout`]
+ /// needs to be recomputed between frames. Therefore, to ensure maximum
+ /// efficiency, the hash should only be affected by the properties of the
+ /// [`Widget`] that can affect layouting.
+ ///
+ /// For example, the [`Text`] widget does not hash its color property, as
+ /// its value cannot affect the overall [`Layout`] of the user interface.
+ ///
+ /// [`Widget`]: trait.Widget.html
+ /// [`Layout`]: ../struct.Layout.html
+ /// [`Text`]: text/struct.Text.html
+ fn hash_layout(&self, state: &mut Hasher);
+
+ /// Processes a runtime [`Event`].
+ ///
+ /// It receives:
+ /// * an [`Event`] describing user interaction
+ /// * the computed [`Layout`] of the [`Widget`]
+ /// * the current cursor position
+ /// * a mutable `Message` list, allowing the [`Widget`] to produce
+ /// new messages based on user interaction.
+ ///
+ /// By default, it does nothing.
+ ///
+ /// [`Event`]: ../enum.Event.html
+ /// [`Widget`]: trait.Widget.html
+ /// [`Layout`]: ../struct.Layout.html
+ fn on_event(
+ &mut self,
+ _event: Event,
+ _layout: Layout<'_>,
+ _cursor_position: Point,
+ _messages: &mut Vec<Message>,
+ ) {
+ }
+}