1use std::cell::RefCell;
4use std::sync::Arc;
5
6use serde::{Deserialize, Serialize};
7
8use crate::buffer::BufferId;
9use crate::display::{Padding, WrapCache};
10use crate::fold::FoldSet;
11use crate::selection::SelectionSet;
12
13#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize)]
14pub struct ViewId(pub u64);
15
16#[derive(Clone, Copy, Debug, Default, PartialEq, Serialize, Deserialize)]
17pub struct ScrollPos {
18 pub first_line: usize,
21 #[serde(default)]
22 pub first_sub: usize,
23 pub line_fraction: f32,
25 pub x_offset: f32,
27}
28
29#[derive(Clone, Debug)]
30pub struct View {
31 id: ViewId,
32 buffer: BufferId,
33 pub selections: SelectionSet,
34 pub scroll: ScrollPos,
35 pub(crate) folds: FoldSet,
38 pub wrap_cols: Option<usize>,
41 pub(crate) wrap_cache: RefCell<WrapCache>,
42 pub padding: Option<Arc<Padding>>,
45 aux: bool,
48}
49
50impl View {
51 pub(crate) fn new(id: ViewId, buffer: BufferId) -> Self {
52 Self {
53 id,
54 buffer,
55 selections: SelectionSet::caret(Default::default()),
56 scroll: ScrollPos::default(),
57 folds: FoldSet::default(),
58 wrap_cols: None,
59 wrap_cache: RefCell::default(),
60 padding: None,
61 aux: false,
62 }
63 }
64
65 pub fn is_aux(&self) -> bool {
66 self.aux
67 }
68
69 pub(crate) fn set_aux(&mut self) {
70 self.aux = true;
71 }
72
73 pub fn id(&self) -> ViewId {
74 self.id
75 }
76
77 pub fn buffer(&self) -> BufferId {
78 self.buffer
79 }
80
81 pub fn folds(&self) -> &FoldSet {
82 &self.folds
83 }
84}