use std::{ffi::CString, fmt};
use crate::{
BrowserBuilder, Frame, KeyCode, KeyModifier, LogicalUnit, MouseButton, PhysicalUnit, Point,
Size, ffi::*,
};
pub struct Browser {
pub(crate) wef_browser: *mut wef_browser_t,
}
impl fmt::Debug for Browser {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("Browser").finish()
}
}
impl Drop for Browser {
fn drop(&mut self) {
unsafe { wef_browser_destroy(self.wef_browser) };
}
}
impl Browser {
pub fn builder() -> BrowserBuilder<()> {
BrowserBuilder::new()
}
pub fn is_created(&self) -> bool {
unsafe { wef_browser_is_created(self.wef_browser) }
}
pub fn resize(&self, sz: Size<PhysicalUnit<i32>>) {
unsafe { wef_browser_set_size(self.wef_browser, sz.width.0.max(1), sz.height.0.max(1)) };
}
pub fn load_url(&self, url: &str) {
let c_url = CString::new(url).unwrap();
unsafe { wef_browser_load_url(self.wef_browser, c_url.as_ptr()) };
}
pub fn can_forward(&self) -> bool {
unsafe { wef_browser_can_go_forward(self.wef_browser) }
}
pub fn can_back(&self) -> bool {
unsafe { wef_browser_can_go_back(self.wef_browser) }
}
pub fn forward(&self) {
unsafe { wef_browser_go_forward(self.wef_browser) };
}
pub fn back(&self) {
unsafe { wef_browser_go_back(self.wef_browser) };
}
pub fn reload(&self) {
unsafe { wef_browser_reload(self.wef_browser) };
}
pub fn reload_ignore_cache(&self) {
unsafe { wef_browser_reload_ignore_cache(self.wef_browser) };
}
pub fn send_mouse_click_event(
&self,
mouse_button_type: MouseButton,
mouse_up: bool,
click_count: usize,
modifiers: KeyModifier,
) {
unsafe {
wef_browser_send_mouse_click_event(
self.wef_browser,
mouse_button_type as i32,
mouse_up,
click_count as i32,
modifiers.bits(),
)
};
}
pub fn send_mouse_move_event(&self, pt: Point<LogicalUnit<i32>>, modifiers: KeyModifier) {
unsafe {
wef_browser_send_mouse_move_event(self.wef_browser, pt.x.0, pt.y.0, modifiers.bits())
};
}
pub fn send_mouse_wheel_event(&self, delta: Point<LogicalUnit<i32>>) {
unsafe { wef_browser_send_mouse_wheel_event(self.wef_browser, delta.x.0, delta.y.0) };
}
pub fn send_key_event(&self, is_down: bool, key_code: KeyCode, modifiers: KeyModifier) {
unsafe {
wef_browser_send_key_event(
self.wef_browser,
is_down,
key_code as i32,
modifiers.bits(),
);
if let Some(ch) = key_code.as_char() {
wef_browser_send_char_event(self.wef_browser, ch);
}
}
}
pub fn send_char_event(&self, ch: u16) {
unsafe { wef_browser_send_char_event(self.wef_browser, ch) };
}
pub fn ime_set_composition(&self, text: &str, cursor_begin: usize, cursor_end: usize) {
let c_text = CString::new(text).unwrap();
unsafe {
wef_browser_ime_set_composition(
self.wef_browser,
c_text.as_ptr(),
cursor_begin as u32,
cursor_end as u32,
)
};
}
pub fn ime_commit(&self, text: &str) {
let c_text = CString::new(text).unwrap();
unsafe { wef_browser_ime_commit(self.wef_browser, c_text.as_ptr()) };
}
pub fn main_frame(&self) -> Option<Frame> {
let frame = unsafe { wef_browser_get_main_frame(self.wef_browser) };
(!frame.is_null()).then_some(Frame(frame))
}
pub fn focused_frame(&self) -> Option<Frame> {
let frame = unsafe { wef_browser_get_focused_frame(self.wef_browser) };
(!frame.is_null()).then_some(Frame(frame))
}
pub fn frame_by_name(&self, name: &str) -> Option<Frame> {
let c_name = CString::new(name).unwrap();
let frame = unsafe { wef_browser_get_frame_by_name(self.wef_browser, c_name.as_ptr()) };
(!frame.is_null()).then_some(Frame(frame))
}
pub fn frame_by_identifier(&self, id: &str) -> Option<Frame> {
let c_id = CString::new(id).unwrap();
let frame = unsafe { wef_browser_get_frame_by_identifier(self.wef_browser, c_id.as_ptr()) };
(!frame.is_null()).then_some(Frame(frame))
}
pub fn is_audio_muted(&self) -> bool {
unsafe { wef_browser_is_audio_muted(self.wef_browser) }
}
pub fn set_audio_mute(&self, mute: bool) {
unsafe { wef_browser_set_audio_mute(self.wef_browser, mute) };
}
pub fn find(&self, search_text: &str, forward: bool, match_case: bool, find_next: bool) {
unsafe {
let c_search_text = CString::new(search_text).unwrap();
wef_browser_find(
self.wef_browser,
c_search_text.as_ptr(),
forward,
match_case,
find_next,
)
};
}
pub fn set_focus(&self, focus: bool) {
unsafe { wef_browser_set_focus(self.wef_browser, focus) };
}
}