aboutsummaryrefslogtreecommitdiff
path: root/src/app.rs
blob: b4e6456b7a70153dddd5da997e7b6a1d2237f63b (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
use ratatui::widgets::ListState;
use ratatui_textarea::TextArea;

use crate::gentoo::{Package, portage::Portage};

#[derive(Debug)]
#[allow(dead_code)]
pub struct App<'a> {
    portage: Portage,
    pub list_state: ListState,
    pub showing_search_window: bool,
    pub textarea: TextArea<'a>,
    pub search_found: Option<bool>,
    search_indexes: Option<Vec<usize>>,
    pub search_indexes_len: Option<usize>,
    pub current_search_index: Option<usize>,
}

#[allow(dead_code)]
impl<'a> App<'a> {
    pub fn new(portage: Portage) -> Self {
        App {
            portage,
            list_state: ListState::default().with_selected(Some(0)),
            showing_search_window: false,
            textarea: TextArea::default(),
            search_found: None,
            search_indexes: None,
            current_search_index: None,
            search_indexes_len: None,
        }
    }

    pub fn installed_packages(&self) -> Vec<Package> {
        self.portage.installed_packages.clone()
    }

    pub fn current_package(&self) -> Package {
        let selected_package_index = match self.list_state.selected() {
            Some(selected) => selected,
            None => 0,
        };

        self.portage.installed_packages[selected_package_index].clone()
    }

    pub fn toggle_search_window(&mut self) {
        self.showing_search_window = !self.showing_search_window;
        self.textarea.clear();
        self.search_found = None;
    }

    pub fn search(&mut self) -> bool {
        let indexes: Vec<usize> = self
            .portage
            .installed_packages
            .iter()
            .enumerate()
            .filter(|(_, s)| {
                s.name
                    .to_lowercase()
                    .contains(&self.textarea.lines()[0].to_lowercase())
            })
            .map(|(i, _)| i)
            .collect();

        if let Some(index) = indexes.first() {
            self.list_state.select(Some(index.clone()));
            self.search_indexes_len = Some(indexes.len());
            self.search_indexes = Some(indexes);
            self.current_search_index = Some(0);
            return true;
        }

        self.search_indexes = None;
        return false;
    }

    pub fn next_search(&mut self) {
        let mut current_index = match self.current_search_index {
            Some(i) => i,
            None => return,
        };

        let search_indexes = match &self.search_indexes {
            Some(i) => i,
            None => return,
        };

        if current_index + 1 >= search_indexes.len() {
            current_index = 0;
        } else {
            current_index += 1;
        }

        let list_index = search_indexes[current_index];

        self.list_state.select(Some(list_index));
        self.current_search_index = Some(current_index)
    }

    pub fn prev_search(&mut self) {
        let mut current_index = match self.current_search_index {
            Some(i) => i,
            None => return,
        };

        let search_indexes = match &self.search_indexes {
            Some(i) => i,
            None => return,
        };

        if current_index == 0 {
            current_index = search_indexes.len() - 1;
        } else {
            current_index -= 1;
        }

        let list_index = search_indexes[current_index];

        self.list_state.select(Some(list_index));
        self.current_search_index = Some(current_index)
    }
}