use crate::document::Buffer;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Selection {
pub anchor: usize,
pub active: usize,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct CellBand {
pub lines: (usize, usize),
pub cols: (usize, usize),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct VisualSelection {
pub anchor: (usize, usize),
pub active: (usize, usize),
pub band: Option<CellBand>,
}
impl VisualSelection {
pub fn span(anchor: (usize, usize), active: (usize, usize)) -> Self {
Self {
anchor,
active,
band: None,
}
}
pub fn range(&self) -> ((usize, usize), (usize, usize)) {
if self.anchor <= self.active {
(self.anchor, self.active)
} else {
(self.active, self.anchor)
}
}
pub fn is_empty(&self) -> bool {
self.anchor == self.active
}
}
impl Selection {
#[allow(dead_code)]
pub fn new(anchor: usize) -> Self {
Self {
anchor,
active: anchor,
}
}
pub fn range(&self) -> (usize, usize) {
(self.anchor.min(self.active), self.anchor.max(self.active))
}
pub fn selected_text(&self, buf: &Buffer) -> String {
let (start, end) = self.range();
let end = end.min(buf.len_chars());
if start >= end {
return String::new();
}
buf.slice_to_string(start, end)
}
pub fn is_empty(&self) -> bool {
self.anchor == self.active
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::document::Buffer;
fn buf(s: &str) -> Buffer {
Buffer::from_str(s)
}
#[test]
fn new_selection_is_empty() {
let s = Selection::new(5);
assert!(s.is_empty());
assert_eq!(s.range(), (5, 5));
}
#[test]
fn range_forward() {
let s = Selection {
anchor: 2,
active: 7,
};
assert_eq!(s.range(), (2, 7));
}
#[test]
fn range_backward() {
let s = Selection {
anchor: 7,
active: 2,
};
assert_eq!(s.range(), (2, 7));
}
#[test]
fn selected_text_forward() {
let b = buf("hello world");
let s = Selection {
anchor: 6,
active: 11,
};
assert_eq!(s.selected_text(&b), "world");
}
#[test]
fn selected_text_backward() {
let b = buf("hello world");
let s = Selection {
anchor: 11,
active: 6,
};
assert_eq!(s.selected_text(&b), "world");
}
#[test]
fn selected_text_empty() {
let b = buf("hello");
let s = Selection::new(3);
assert_eq!(s.selected_text(&b), "");
}
}