use std::sync::Arc;
use crate::{math::Rect, Context, Ui};
#[derive(Clone, Default)]
pub struct Output {
pub cursor_icon: CursorIcon,
pub open_url: Option<String>,
pub copied_text: String,
pub needs_repaint: bool,
}
#[derive(Clone, Copy)]
pub enum CursorIcon {
Default,
PointingHand,
ResizeHorizontal,
ResizeNeSw,
ResizeNwSe,
ResizeVertical,
Text,
}
impl Default for CursorIcon {
fn default() -> Self {
Self::Default
}
}
#[derive(Clone)]
pub struct Response {
pub ctx: Arc<Context>,
pub rect: Rect,
pub sense: Sense,
pub hovered: bool,
pub clicked: bool,
pub double_clicked: bool,
pub active: bool,
pub has_kb_focus: bool,
}
impl std::fmt::Debug for Response {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("Response")
.field("rect", &self.rect)
.field("sense", &self.sense)
.field("hovered", &self.hovered)
.field("clicked", &self.clicked)
.field("double_clicked", &self.double_clicked)
.field("active", &self.active)
.field("has_kb_focus", &self.has_kb_focus)
.finish()
}
}
impl Response {
pub fn on_hover_ui(self, add_contents: impl FnOnce(&mut Ui)) -> Self {
if self.hovered {
crate::containers::show_tooltip(&self.ctx, add_contents);
}
self
}
pub fn on_hover_text(self, text: impl Into<String>) -> Self {
self.on_hover_ui(|ui| {
ui.add(crate::widgets::Label::new(text));
})
}
#[deprecated = "Deprecated 2020-10-01: use `on_hover_text` instead."]
pub fn tooltip_text(self, text: impl Into<String>) -> Self {
self.on_hover_text(text)
}
}
impl Response {
pub fn union(&self, other: Self) -> Self {
assert!(Arc::ptr_eq(&self.ctx, &other.ctx));
Self {
ctx: other.ctx,
rect: self.rect.union(other.rect),
sense: self.sense.union(other.sense),
hovered: self.hovered || other.hovered,
clicked: self.clicked || other.clicked,
double_clicked: self.double_clicked || other.double_clicked,
active: self.active || other.active,
has_kb_focus: self.has_kb_focus || other.has_kb_focus,
}
}
}
impl std::ops::BitOr for Response {
type Output = Self;
fn bitor(self, rhs: Self) -> Self {
self.union(rhs)
}
}
impl std::ops::BitOrAssign for Response {
fn bitor_assign(&mut self, rhs: Self) {
*self = self.union(rhs);
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct Sense {
pub click: bool,
pub drag: bool,
}
impl Sense {
pub fn nothing() -> Self {
Self {
click: false,
drag: false,
}
}
pub fn click() -> Self {
Self {
click: true,
drag: false,
}
}
pub fn drag() -> Self {
Self {
click: false,
drag: true,
}
}
pub fn click_and_drag() -> Self {
Self {
click: true,
drag: true,
}
}
#[must_use]
pub fn union(self, other: Self) -> Self {
Self {
click: self.click | other.click,
drag: self.drag | other.drag,
}
}
}