mirror of
https://github.com/bobwen-dev/hunter
synced 2025-04-12 00:55:41 +02:00
traitified(er) tabview
This commit is contained in:
parent
52c4a1586e
commit
fe542047c2
@ -8,20 +8,38 @@ use crate::files::{File, Files};
|
|||||||
use crate::listview::ListView;
|
use crate::listview::ListView;
|
||||||
use crate::miller_columns::MillerColumns;
|
use crate::miller_columns::MillerColumns;
|
||||||
use crate::widget::Widget;
|
use crate::widget::Widget;
|
||||||
use crate::tabview::Tabbable;
|
use crate::tabview::{TabView, Tabbable};
|
||||||
|
|
||||||
#[derive(PartialEq)]
|
#[derive(PartialEq)]
|
||||||
pub struct FileBrowser {
|
pub struct FileBrowser {
|
||||||
pub columns: MillerColumns<ListView<Files>>,
|
pub columns: MillerColumns<ListView<Files>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Tabbable<FileBrowser> for FileBrowser {
|
impl Tabbable for TabView<FileBrowser> {
|
||||||
fn new_tab(&self) -> FileBrowser {
|
fn new_tab(&mut self) {
|
||||||
FileBrowser::new().unwrap()
|
let tab = FileBrowser::new().unwrap();
|
||||||
|
self.push_widget(tab);
|
||||||
|
self.active += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn close_tab(&mut self) {
|
||||||
|
self.close_tab_();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn next_tab(&mut self) {
|
||||||
|
self.next_tab_();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn active_tab(& self) -> & dyn Widget {
|
||||||
|
self.active_tab_()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn active_tab_mut(&mut self) -> &mut dyn Widget {
|
||||||
|
self.active_tab_mut_()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn on_next_tab(&mut self) {
|
fn on_next_tab(&mut self) {
|
||||||
self.update_preview();
|
self.active_tab_mut().refresh();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,20 +3,32 @@ use termion::event::Key;
|
|||||||
use crate::coordinates::{Coordinates};
|
use crate::coordinates::{Coordinates};
|
||||||
use crate::widget::Widget;
|
use crate::widget::Widget;
|
||||||
|
|
||||||
pub trait Tabbable<T: Widget> {
|
pub trait Tabbable {
|
||||||
fn new_tab(&self) -> T;
|
fn new_tab(&mut self);
|
||||||
|
fn close_tab(&mut self);
|
||||||
|
fn next_tab(&mut self);
|
||||||
fn on_next_tab(&mut self);
|
fn on_next_tab(&mut self);
|
||||||
|
fn active_tab(&self) -> &dyn Widget;
|
||||||
|
fn active_tab_mut(&mut self) -> &mut dyn Widget;
|
||||||
|
fn on_key(&mut self, key: Key) {
|
||||||
|
match key {
|
||||||
|
Key::Ctrl('t') => { self.new_tab(); },
|
||||||
|
Key::Ctrl('w') => self.close_tab(),
|
||||||
|
Key::Char('\t') => self.next_tab(),
|
||||||
|
_ => self.active_tab_mut().on_key(key)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#[derive(PartialEq)]
|
#[derive(PartialEq)]
|
||||||
pub struct TabView<T> where T: Widget, T: Tabbable<T> {
|
pub struct TabView<T> where T: Widget, TabView<T>: Tabbable {
|
||||||
widgets: Vec<T>,
|
widgets: Vec<T>,
|
||||||
active: usize,
|
pub active: usize,
|
||||||
coordinates: Coordinates
|
coordinates: Coordinates
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T> TabView<T> where T: Widget, T: Tabbable<T> {
|
impl<T> TabView<T> where T: Widget, TabView<T>: Tabbable {
|
||||||
pub fn new() -> TabView<T> {
|
pub fn new() -> TabView<T> {
|
||||||
TabView {
|
TabView {
|
||||||
widgets: vec![],
|
widgets: vec![],
|
||||||
@ -36,41 +48,35 @@ impl<T> TabView<T> where T: Widget, T: Tabbable<T> {
|
|||||||
widget
|
widget
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn active_widget(&self) -> &T {
|
pub fn active_tab_(&self) -> &T {
|
||||||
&self.widgets[self.active]
|
&self.widgets[self.active]
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn active_widget_mut(&mut self) -> &mut T {
|
pub fn active_tab_mut_(&mut self) -> &mut T {
|
||||||
&mut self.widgets[self.active]
|
&mut self.widgets[self.active]
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn new_tab(&mut self) {
|
pub fn close_tab_(&mut self) {
|
||||||
let tab = self.active_widget().new_tab();
|
|
||||||
self.push_widget(tab);
|
|
||||||
self.active += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn close_tab(&mut self) {
|
|
||||||
if self.active == 0 { return }
|
if self.active == 0 { return }
|
||||||
if self.active + 1 >= self.widgets.len() { self.active -= 1 }
|
if self.active + 1 >= self.widgets.len() { self.active -= 1 }
|
||||||
|
|
||||||
self.pop_widget();
|
self.pop_widget();
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn next_tab(&mut self) {
|
pub fn next_tab_(&mut self) {
|
||||||
if self.active + 1 == self.widgets.len() {
|
if self.active + 1 == self.widgets.len() {
|
||||||
self.active = 0;
|
self.active = 0;
|
||||||
} else {
|
} else {
|
||||||
self.active += 1
|
self.active += 1
|
||||||
}
|
}
|
||||||
self.active_widget_mut().on_next_tab();
|
self.on_next_tab();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T> Widget for TabView<T> where T: Widget + Tabbable<T> {
|
impl<T> Widget for TabView<T> where T: Widget, TabView<T>: Tabbable {
|
||||||
fn render_header(&self) -> String {
|
fn render_header(&self) -> String {
|
||||||
let xsize = self.get_coordinates().xsize();
|
let xsize = self.get_coordinates().xsize();
|
||||||
let header = self.active_widget().render_header();
|
let header = self.active_tab_().render_header();
|
||||||
let mut nums_length = 0;
|
let mut nums_length = 0;
|
||||||
let tabnums = (0..self.widgets.len()).map(|num| {
|
let tabnums = (0..self.widgets.len()).map(|num| {
|
||||||
nums_length += format!("{} ", num).len();
|
nums_length += format!("{} ", num).len();
|
||||||
@ -95,15 +101,15 @@ impl<T> Widget for TabView<T> where T: Widget + Tabbable<T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn render_footer(&self) -> String {
|
fn render_footer(&self) -> String {
|
||||||
self.active_widget().render_footer()
|
self.active_tab_().render_footer()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn refresh(&mut self) {
|
fn refresh(&mut self) {
|
||||||
self.active_widget_mut().refresh();
|
self.active_tab_mut().refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_drawlist(&self) -> String {
|
fn get_drawlist(&self) -> String {
|
||||||
self.active_widget().get_drawlist()
|
self.active_tab_().get_drawlist()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_coordinates(&self) -> &Coordinates {
|
fn get_coordinates(&self) -> &Coordinates {
|
||||||
@ -118,12 +124,6 @@ impl<T> Widget for TabView<T> where T: Widget + Tabbable<T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn on_key(&mut self, key: Key) {
|
fn on_key(&mut self, key: Key) {
|
||||||
match key {
|
Tabbable::on_key(self, key);
|
||||||
Key::Ctrl('t') => self.new_tab(),
|
|
||||||
Key::Ctrl('w') => self.close_tab(),
|
|
||||||
Key::Char('\t') => self.next_tab(),
|
|
||||||
_ => self.active_widget_mut().on_key(key)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user