diff options
Diffstat (limited to 'src/stateful_list.rs')
| -rw-r--r-- | src/stateful_list.rs | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/src/stateful_list.rs b/src/stateful_list.rs new file mode 100644 index 0000000..50c71cc --- /dev/null +++ b/src/stateful_list.rs @@ -0,0 +1,82 @@ +// This file is part of Germ <https://github.com/gemrest/sydney>. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, version 3. +// +// This program is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see <http://www.gnu.org/licenses/>. +// +// Copyright (C) 2022-2022 Fuwn <[email protected]> +// SPDX-License-Identifier: GPL-3.0-only + +//! <https://github.com/fdehau/tui-rs/blob/master/examples/list.rs> + +use tui::widgets::ListState; + +pub struct StatefulList<T> { + pub state: ListState, + pub items: Vec<T>, + pub selected: usize, +} + +impl<T> StatefulList<T> { + pub fn with_items(items: Vec<T>) -> Self { + Self { + state: ListState::default(), + items, + selected: 0, + } + } + + pub fn next(&mut self) { + let i = match self.state.selected() { + Some(i) => + if i >= self.items.len() - 1 { + 0 + } else { + i + 1 + }, + None => 0, + }; + + self.selected = i; + + self.state.select(Some(i)); + } + + pub fn previous(&mut self) { + let i = match self.state.selected() { + Some(i) => + if i == 0 { + self.items.len() - 1 + } else { + i - 1 + }, + None => 0, + }; + + self.selected = i; + + self.state.select(Some(i)); + } + + pub fn last(&mut self) { + self.state.select(Some(self.items.len() - 1)); + + self.selected = self.items.len() - 1; + } + + pub fn first(&mut self) { + self.state.select(Some(0)); + + self.selected = 0; + } + + pub fn unselect(&mut self) { self.state.select(None); } +} |