use cursive::Vec2;
pub struct LinkHandler {
links: Vec<Link>,
current_link: usize,
}
impl LinkHandler {
pub fn new() -> Self {
log::debug!("creating a new instance of LinkHandler");
Self {
links: Vec::new(),
current_link: 0,
}
}
pub fn registered_links(&self) -> usize {
self.links.len()
}
pub fn push_link(&mut self, id: i32, x: usize, y: usize) {
self.links.push(Link { id, x, y })
}
pub fn get_current_link(&self) -> i32 {
assert!(self.links.len() > self.current_link);
self.links[self.current_link].id
}
pub fn get_current_link_pos(&self) -> Vec2 {
assert!(self.links.len() > self.current_link);
let link = &self.links[self.current_link];
Vec2::new(link.x, link.y)
}
pub fn move_up(&mut self, amount: usize) {
assert!(self.links.len() > self.current_link);
let min_y = self.links[self.current_link].y.saturating_sub(amount);
for i in (0..self.current_link).rev() {
if self.links[i].y <= min_y {
self.current_link = i;
return;
}
}
self.current_link = 0;
}
pub fn move_down(&mut self, amount: usize) {
let min_y = self.links[self.current_link].y.saturating_add(amount);
for i in self.current_link..self.links.len() {
if self.links[i].y >= min_y {
self.current_link = i;
return;
}
}
self.current_link = self.links.len().saturating_sub(1);
}
pub fn move_left(&mut self, amount: usize) {
self.current_link = self.current_link.saturating_sub(amount);
}
pub fn move_right(&mut self, amount: usize) {
if self.current_link + amount >= self.links.len() {
self.current_link = self.links.len().saturating_sub(1);
return;
}
self.current_link += amount
}
}
struct Link {
id: i32,
x: usize,
y: usize,
}