use super::*;
#[unsafe(no_mangle)]
pub extern "C" fn kui_selection_text(ptr: *mut KuiCtx, out: *mut KuiStr) -> bool {
guard(false, || {
let Some(c) = (unsafe { ctx(ptr) }) else {
return false;
};
let Some(text) = c.core().copy_selection() else {
return false;
};
c.selection_text = text;
write_str(out, &c.selection_text)
})
}
#[unsafe(no_mangle)]
pub extern "C" fn kui_selection_html(ptr: *mut KuiCtx, out: *mut KuiStr) -> bool {
guard(false, || {
let Some(c) = (unsafe { ctx(ptr) }) else {
return false;
};
let Some(html) = c.core().selection_html() else {
return false;
};
c.selection_html = html;
write_str(out, &c.selection_html)
})
}
#[unsafe(no_mangle)]
pub extern "C" fn kui_selection_ends(
ptr: *mut KuiCtx,
anchor_index: *mut i64,
anchor_byte: *mut usize,
focus_index: *mut i64,
focus_byte: *mut usize,
) -> bool {
guard(false, || {
let Some(c) = (unsafe { ctx(ptr) }) else {
return false;
};
let Some((a, f)) = c.core().selection_ends() else {
return false;
};
let put = |index: *mut i64, byte: *mut usize, e: kui_core::RangeEnd| unsafe {
if let Some(p) = index.as_mut() {
*p = e.row.map_or(-1, |r| r as i64);
}
if let Some(p) = byte.as_mut() {
*p = e.byte;
}
};
put(anchor_index, anchor_byte, a);
put(focus_index, focus_byte, f);
true
})
}
#[unsafe(no_mangle)]
pub extern "C" fn kui_cell_selection(
ptr: *mut KuiCtx,
node: *mut u64,
anchor_line: *mut u64,
anchor_col: *mut usize,
focus_line: *mut u64,
focus_col: *mut usize,
block: *mut bool,
) -> bool {
guard(false, || {
let Some(c) = (unsafe { ctx(ptr) }) else {
return false;
};
let Some(sel) = c.core().cell_selection() else {
return false;
};
let put = |line: *mut u64, col: *mut usize, e: kui_core::CellEnd| unsafe {
if let Some(p) = line.as_mut() {
*p = e.line;
}
if let Some(p) = col.as_mut() {
*p = e.col;
}
};
unsafe {
if let Some(p) = node.as_mut() {
*p = sel.node.0;
}
if let Some(p) = block.as_mut() {
*p = sel.block;
}
}
put(anchor_line, anchor_col, sel.anchor);
put(focus_line, focus_col, sel.focus);
true
})
}
#[unsafe(no_mangle)]
pub extern "C" fn kui_select_all_in(ptr: *mut KuiCtx, key: u64) -> bool {
guard(false, || {
let Some(c) = (unsafe { ctx(ptr) }) else {
return false;
};
key != 0 && c.core().select_all_in(Key(key))
})
}
#[unsafe(no_mangle)]
pub extern "C" fn kui_clear_selection(ptr: *mut KuiCtx) -> bool {
guard(false, || {
unsafe { ctx(ptr) }.is_some_and(|c| c.core().clear_selection())
})
}
fn write_str(out: *mut KuiStr, s: &str) -> bool {
if !out.is_null() {
unsafe {
out.write(KuiStr {
ptr: s.as_ptr(),
len: s.len(),
})
};
}
true
}