mirror of https://github.com/sgoudham/neovide.git
cursor_renderer changes
parent
45f5c937f9
commit
2b2beb4e10
@ -0,0 +1,90 @@
|
|||||||
|
use std::cmp::Ordering;
|
||||||
|
|
||||||
|
use skulpin::skia_safe::{Canvas, Point};
|
||||||
|
|
||||||
|
use crate::editor::Cursor;
|
||||||
|
|
||||||
|
const motion_percentages: [f32; 4] = [0.4, 0.5, 0.6, 0.7];
|
||||||
|
|
||||||
|
#[derive(new, Eq, PartialEq, Clone)]
|
||||||
|
struct Corner {
|
||||||
|
pub x: f32,
|
||||||
|
pub y: f32,
|
||||||
|
|
||||||
|
pub center_x: f32,
|
||||||
|
pub center_y: f32,
|
||||||
|
|
||||||
|
pub position_x: f32,
|
||||||
|
pub position_y: f32
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Corner {
|
||||||
|
pub fn new(position_x: f32, position_y: f32) -> Corner {
|
||||||
|
Corner {
|
||||||
|
x: 0, y: 0,
|
||||||
|
center_x: 0, center_y: 0,
|
||||||
|
position_x, position_y
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn remaining_distance(&self) -> f32 {
|
||||||
|
let dx = self.center_x - x;
|
||||||
|
let dy = self.center_y - y;
|
||||||
|
|
||||||
|
(dx * dx + dy * dy).sqrt()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn update(&mut self, motion_percentage: f32) {
|
||||||
|
let delta_x = self.dest_x - self.x;
|
||||||
|
let delta_y = self.dest_y - self.y;
|
||||||
|
|
||||||
|
self.x += delta_x * motion_percentage;
|
||||||
|
self.y += delta_y * motion_percentage;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Ord for Corner {
|
||||||
|
fn cmp(&self, other: &Self) -> Ordering {
|
||||||
|
self.remaining_distance().cmp(&other.remaining_distance())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl PartialOrd for Corner {
|
||||||
|
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
|
||||||
|
Some(self.cmp(other))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Into<Point> for Corner {
|
||||||
|
fn into(self) -> Point {
|
||||||
|
(self.x, self.y).into()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct CursorRenderer {
|
||||||
|
pub corners: Vec<Corner>
|
||||||
|
}
|
||||||
|
|
||||||
|
impl CursorRenderer {
|
||||||
|
pub fn new() -> CursorRenderer {
|
||||||
|
CursorRenderer {
|
||||||
|
corners: vec![Corner::new(-0.5, -0.5), Corner::new(0.5, -0.5), Corner::new(0.5, 0.5), Corner::new(-0.5, 0.5)]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn update(&mut self, destination: (u64, u64), font_width: f32, font_height: f32) {
|
||||||
|
let (grid_x, grid_y) = destination;
|
||||||
|
let mut center_x = grid_x as f32 * font_width + font_width / 2.0;
|
||||||
|
let mut center_y = grid_y as f32 * font_height + font_height / 2.0;
|
||||||
|
|
||||||
|
let mut corners: Vec<&mut Corner> = self.corners.iter_mut().collect();
|
||||||
|
corners.sort();
|
||||||
|
for (&mut corner, motion_percentage) in corners.iter().zip(motion_percentages.iter()) {
|
||||||
|
corner.update(motion_percentage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn draw(&self, &mut canvas: Canvas, paint: &Paint) {
|
||||||
|
canvas.draw_points(PointMode::Polygon, canvas.as_slice().map(|corner| corner.into::<Point>()).as_slice(), paint);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue