use std::cell::Cell;
use crate::core::{ObjectId, Point, Rect, Size};
use crate::widget::WidgetKind;
#[derive(Debug, Clone)]
pub struct WebView {
widget_id: ObjectId,
rect: Rect,
scroll_offset: Point,
redraw_requested: Cell<bool>,
}
impl WebView {
pub fn new(widget_id: ObjectId) -> Self {
Self {
widget_id,
rect: Rect::default(),
scroll_offset: Point::origin(),
redraw_requested: Cell::new(false),
}
}
pub fn widget_id(&self) -> ObjectId {
self.widget_id
}
pub fn widget_kind(&self) -> WidgetKind {
WidgetKind::WebView
}
pub fn set_rect(&mut self, rect: Rect) {
self.rect = rect;
}
pub fn rect(&self) -> Rect {
Rect::new(
self.rect.x + self.scroll_offset.x,
self.rect.y + self.scroll_offset.y,
self.rect.width,
self.rect.height,
)
}
pub fn request_redraw(&self) {
self.redraw_requested.set(true);
}
pub fn take_redraw_requested(&self) -> bool {
self.redraw_requested.replace(false)
}
pub fn set_scroll_offset(&mut self, offset: Point) {
self.scroll_offset = offset;
}
pub fn scroll_offset(&self) -> Point {
self.scroll_offset
}
pub fn preferred_size(&self) -> Size {
let base = Size::new(800, 600);
Size::new(
base.width.wrapping_add(self.scroll_offset.x.unsigned_abs()),
base.height.wrapping_add(self.scroll_offset.y.unsigned_abs()),
)
}
}
impl Default for WebView {
fn default() -> Self {
Self::new(ObjectId::default())
}
}