forked from gitui-org/gitui
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfiles.rs
113 lines (96 loc) · 1.86 KB
/
files.rs
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
use std::path::Path;
use crate::{
app::Environment,
components::{
visibility_blocking, CommandBlocking, CommandInfo, Component,
DrawableComponent, EventState, RevisionFilesComponent,
},
AsyncNotification,
};
use anyhow::Result;
use asyncgit::sync::{self, RepoPathRef};
pub struct FilesTab {
repo: RepoPathRef,
visible: bool,
files: RevisionFilesComponent,
}
impl FilesTab {
///
pub fn new(env: &Environment) -> Self {
Self {
visible: false,
files: RevisionFilesComponent::new(env),
repo: env.repo.clone(),
}
}
///
pub fn update(&mut self) -> Result<()> {
if self.is_visible() {
if let Ok(head) = sync::get_head(&self.repo.borrow()) {
self.files.set_commit(head)?;
}
}
Ok(())
}
///
pub fn anything_pending(&self) -> bool {
self.files.any_work_pending()
}
///
pub fn update_async(
&mut self,
ev: AsyncNotification,
) -> Result<()> {
if self.is_visible() {
self.files.update(ev)?;
}
Ok(())
}
pub fn file_finder_update(&mut self, file: &Path) {
self.files.find_file(file);
}
}
impl DrawableComponent for FilesTab {
fn draw<B: ratatui::backend::Backend>(
&self,
f: &mut ratatui::Frame<B>,
rect: ratatui::layout::Rect,
) -> Result<()> {
if self.is_visible() {
self.files.draw(f, rect)?;
}
Ok(())
}
}
impl Component for FilesTab {
fn commands(
&self,
out: &mut Vec<CommandInfo>,
force_all: bool,
) -> CommandBlocking {
if self.visible || force_all {
return self.files.commands(out, force_all);
}
visibility_blocking(self)
}
fn event(
&mut self,
ev: &crossterm::event::Event,
) -> Result<EventState> {
if self.visible {
return self.files.event(ev);
}
Ok(EventState::NotConsumed)
}
fn is_visible(&self) -> bool {
self.visible
}
fn hide(&mut self) {
self.visible = false;
}
fn show(&mut self) -> Result<()> {
self.visible = true;
self.update()?;
Ok(())
}
}