oo_ide/editor/
selection.rs1use 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}