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
|
// bibiman - a TUI for managing BibLaTeX databases
// Copyright (C) 2024 lukeflo
//
// 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, either version 3 of the License, or
// (at your option) any later version.
//
// 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 <https://www.gnu.org/licenses/>.
/////
use ratatui::{
style::{Color, Stylize},
text::{Line, Span, Text},
widgets::ListState,
};
use crate::MAIN_PURPLE_COLOR_INDEX;
#[derive(Debug)]
pub enum PopupKind {
Help,
Message,
Selection,
}
#[derive(Debug)]
pub struct PopupArea {
pub is_popup: bool,
pub popup_kind: Option<PopupKind>,
pub popup_message: String,
pub popup_list: Vec<String>,
pub popup_state: ListState,
}
impl Default for PopupArea {
fn default() -> Self {
PopupArea {
is_popup: false,
popup_kind: None,
popup_message: String::new(),
popup_list: Vec::new(),
popup_state: ListState::default(),
}
}
}
impl PopupArea {
pub fn popup_help<'a>() -> Text<'a> {
let help = [
("j,k|↓,↑: ", "Select next/previous item"),
("h,l|←,→: ", "Select next/previous column (Entry table)"),
("g|Home: ", "Go to first item"),
("G|End: ", "Go to last item"),
("s: ", "sort entries by selected column (toggles reversed)"),
("TAB: ", "Toggle areas (Entries, Keywords)"),
("/|Ctrl+f: ", "Enter search mode"),
("y: ", "yank/copy citekey of selected entry to clipboard"),
("e: ", "Open editor at selected entry"),
("o: ", "Open with selected entry associated PDF"),
("u: ", "Open DOI/URL of selected entry"),
("ESC: ", "Reset all lists/abort search"),
("ENTER: ", "Confirm search/filter by selected keyword"),
("q|Ctrl+c: ", "Quit bibiman"),
];
let help_text: Vec<Line<'_>> = help
.into_iter()
.map(|(keys, help)| {
Line::from(vec![
Span::raw(keys)
.bold()
.fg(Color::Indexed(MAIN_PURPLE_COLOR_INDEX)),
Span::raw(help),
])
})
.collect();
let text = Text::from(help_text);
text
}
pub fn popup_message(&mut self, message: &str, object: String) {
if object.is_empty() {
self.popup_message = message.into();
} else {
self.popup_message = format!("{} \"{}\"", message, object);
}
self.popup_kind = Some(PopupKind::Message);
self.is_popup = true;
}
pub fn popup_close_message(&mut self) {
self.is_popup = false;
self.popup_message.clear();
self.popup_kind = None
}
}
|