Skip to main content

oo_ide/editor/
selection.rs

1use serde::{Deserialize, Serialize};
2use crate::editor::position::Position;
3
4#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
5pub struct Selection {
6    pub anchor: Position,
7    pub active: Position,
8}
9
10impl Selection {
11    pub fn new(anchor: Position, active: Position) -> Self {
12        Self { anchor, active }
13    }
14
15    pub fn is_empty(&self) -> bool {
16        self.anchor == self.active
17    }
18
19    pub fn min(&self) -> Position {
20        if self.anchor.line < self.active.line
21            || (self.anchor.line == self.active.line && self.anchor.column <= self.active.column)
22        {
23            self.anchor
24        } else {
25            self.active
26        }
27    }
28
29    pub fn max(&self) -> Position {
30        if self.anchor.line > self.active.line
31            || (self.anchor.line == self.active.line && self.anchor.column >= self.active.column)
32        {
33            self.anchor
34        } else {
35            self.active
36        }
37    }
38
39    pub fn covered_spans(&self) -> Vec<(usize, usize, usize)> {
40        if self.is_empty() {
41            return vec![];
42        }
43        let min = self.min();
44        let max = self.max();
45        if min.line == max.line {
46            vec![(min.line, min.column, max.column)]
47        } else {
48            let mut spans = Vec::new();
49            spans.push((min.line, min.column, usize::MAX));
50            for row in (min.line + 1)..max.line {
51                spans.push((row, 0, usize::MAX));
52            }
53            spans.push((max.line, 0, max.column));
54            spans
55        }
56    }
57}