ruscode 1.0.0

ruscode - A visual studio code's workspaces organizer written in Rust
use std::fmt::Debug;

use tui::widgets::ListState;
pub struct StatefulList<T>
where
    T: Debug,
{
    pub state: ListState,
    pub items: Vec<T>,
}

impl<T> StatefulList<T>
where
    T: Debug,
{
    pub fn with_items(items: Vec<T>) -> StatefulList<T> {
        StatefulList {
            state: ListState::default(),
            items,
        }
    }

    pub fn selected_item(&self) -> Option<&T> {
        match self.state.selected() {
            Some(idx) => self.items.get(idx),
            None => None,
        }
    }

    pub fn change_item_source(&mut self, items: Vec<T>) {
        self.items = items;
        match self.state.selected() {
            Some(curr) => {
                if curr > self.items.len() {
                    self.state.select(Some(0));
                }
            }
            None => self.state.select(None),
        }
    }

    pub fn has_selected_item(&self) -> bool {
        self.state.selected().is_some()
    }

    #[allow(dead_code)]
    pub fn unselected(&mut self) {
        self.state.select(None);
    }

    pub fn next(&mut self) {
        if self.items.is_empty() {
            return;
        }

        let i = match self.state.selected() {
            Some(i) => {
                if i >= self.items.len() - 1 {
                    0
                } else {
                    i + 1
                }
            }
            None => 0,
        };
        self.state.select(Some(i));
    }

    pub fn previous(&mut self) {
        if self.items.is_empty() {
            return;
        }
        let i = match self.state.selected() {
            Some(i) => {
                if i == 0 {
                    self.items.len() - 1
                } else {
                    i - 1
                }
            }
            None => 0,
        };
        self.state.select(Some(i));
    }
}