use serde::{Deserialize, Serialize};
use crate::buffer::BufferId;
use crate::selection::SelectionSet;
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize)]
pub struct ViewId(pub u64);
#[derive(Clone, Copy, Debug, Default, PartialEq, Serialize, Deserialize)]
pub struct ScrollPos {
pub first_line: usize,
pub line_fraction: f32,
pub x_offset: f32,
}
#[derive(Clone, Debug)]
pub struct View {
id: ViewId,
buffer: BufferId,
pub selections: SelectionSet,
pub scroll: ScrollPos,
}
impl View {
pub(crate) fn new(id: ViewId, buffer: BufferId) -> Self {
Self {
id,
buffer,
selections: SelectionSet::caret(Default::default()),
scroll: ScrollPos::default(),
}
}
pub fn id(&self) -> ViewId {
self.id
}
pub fn buffer(&self) -> BufferId {
self.buffer
}
}
pub trait DisplayMap {
fn row_count(&self, line_count: usize) -> usize;
fn line_to_row(&self, line: usize) -> usize;
fn row_to_line(&self, row: usize) -> Option<usize>;
}
#[derive(Clone, Copy, Debug, Default)]
pub struct IdentityDisplayMap;
impl DisplayMap for IdentityDisplayMap {
fn row_count(&self, line_count: usize) -> usize {
line_count
}
fn line_to_row(&self, line: usize) -> usize {
line
}
fn row_to_line(&self, row: usize) -> Option<usize> {
Some(row)
}
}