From 7a0a027df6b7c81dbb31f0dd3f82dd28479e560f Mon Sep 17 00:00:00 2001 From: Jeff Zhao Date: Mon, 27 Jun 2022 13:07:16 -0400 Subject: rename 'vsplit' to 'hsplit' --- src/config/general/display_raw.rs | 2 +- src/config/option/display_option.rs | 2 +- src/main.rs | 2 +- src/ui/views/mod.rs | 12 +-- src/ui/views/tui_hsplit_view.rs | 195 ++++++++++++++++++++++++++++++++++++ src/ui/views/tui_textfield.rs | 5 +- src/ui/views/tui_view.rs | 7 +- src/ui/views/tui_vsplit_view.rs | 195 ------------------------------------ 8 files changed, 210 insertions(+), 210 deletions(-) create mode 100644 src/ui/views/tui_hsplit_view.rs delete mode 100644 src/ui/views/tui_vsplit_view.rs (limited to 'src') diff --git a/src/config/general/display_raw.rs b/src/config/general/display_raw.rs index 0ea7a78..de91ea2 100644 --- a/src/config/general/display_raw.rs +++ b/src/config/general/display_raw.rs @@ -80,7 +80,7 @@ impl std::default::Default for DisplayOptionRaw { impl From for DisplayOption { fn from(raw: DisplayOptionRaw) -> Self { let mode = match raw.mode.as_str() { - "vsplit" => DisplayMode::VSplit, + "hsplit" => DisplayMode::HSplit, _ => DisplayMode::Default, }; diff --git a/src/config/option/display_option.rs b/src/config/option/display_option.rs index c8c4d01..5166725 100644 --- a/src/config/option/display_option.rs +++ b/src/config/option/display_option.rs @@ -7,7 +7,7 @@ use crate::config::option::SortOption; #[derive(Clone, Copy, Debug)] pub enum DisplayMode { Default, - VSplit, + HSplit, } pub const fn default_column_ratio() -> (usize, usize, usize) { diff --git a/src/main.rs b/src/main.rs index 0223fc2..d809b58 100644 --- a/src/main.rs +++ b/src/main.rs @@ -54,7 +54,7 @@ lazy_static! { if let Ok(p) = std::env::var("HOME") { let mut p = PathBuf::from(p); - p.push(".config/joshuto"); + p.push(format!(".config/{}", PROGRAM_NAME)); if p.is_dir() { config_dirs.push(p); } diff --git a/src/ui/views/mod.rs b/src/ui/views/mod.rs index 645694b..7eac325 100644 --- a/src/ui/views/mod.rs +++ b/src/ui/views/mod.rs @@ -1,13 +1,13 @@ mod tui_command_menu; mod tui_folder_view; +mod tui_hsplit_view; mod tui_textfield; mod tui_view; -mod tui_vsplit_view; mod tui_worker_view; -pub use self::tui_command_menu::TuiCommandMenu; +pub use self::tui_command_menu::*; pub use self::tui_folder_view::*; -pub use self::tui_textfield::TuiTextField; -pub use self::tui_view::TuiView; -pub use self::tui_vsplit_view::*; -pub use self::tui_worker_view::TuiWorkerView; +pub use self::tui_hsplit_view::*; +pub use self::tui_textfield::*; +pub use self::tui_view::*; +pub use self::tui_worker_view::*; diff --git a/src/ui/views/tui_hsplit_view.rs b/src/ui/views/tui_hsplit_view.rs new file mode 100644 index 0000000..015ca5a --- /dev/null +++ b/src/ui/views/tui_hsplit_view.rs @@ -0,0 +1,195 @@ +use tui::buffer::Buffer; +use tui::layout::{Constraint, Direction, Layout, Rect}; +use tui::style::{Color, Style}; +use tui::text::Span; +use tui::widgets::{Block, Borders, Paragraph, Widget, Wrap}; + +use crate::context::AppContext; +use crate::ui::widgets::{TuiDirListDetailed, TuiFooter, TuiTabBar, TuiTopBar}; + +const TAB_VIEW_WIDTH: u16 = 15; + +pub struct TuiHSplitView<'a> { + pub context: &'a AppContext, + pub show_bottom_status: bool, +} + +impl<'a> TuiHSplitView<'a> { + pub fn new(context: &'a AppContext) -> Self { + Self { + context, + show_bottom_status: true, + } + } +} + +impl<'a> Widget for TuiHSplitView<'a> { + fn render(self, area: Rect, buf: &mut Buffer) { + let tab_context = self.context.tab_context_ref(); + let tab_index = tab_context.index; + + let config = self.context.config_ref(); + let display_options = config.display_options_ref(); + let constraints = &[Constraint::Ratio(1, 2), Constraint::Ratio(1, 2)]; + + let layout_rect = if display_options.show_borders() { + let area = Rect { + y: area.top() + 1, + height: area.height - 2, + ..area + }; + + let layout = calculate_layout_with_borders(area, constraints); + + let block = Block::default().borders(Borders::ALL); + let inner = block.inner(area); + block.render(area, buf); + + let layout_rect = Layout::default() + .direction(Direction::Horizontal) + .constraints(constraints.as_ref()) + .split(inner); + + let block = Block::default().borders(Borders::RIGHT); + block.render(layout_rect[0], buf); + + let block = Block::default().borders(Borders::LEFT); + block.render(layout_rect[1], buf); + + layout + } else { + let area = Rect { + y: area.top() + 1, + height: area.height - 2, + ..area + }; + calculate_layout(area, constraints) + }; + + if let Some(curr_tab) = tab_context.tab_ref(tab_index) { + let curr_list = curr_tab.curr_list_ref(); + + let layout_rect = if tab_index % 2 == 0 { + layout_rect[0] + } else { + layout_rect[1] + }; + + // render current view + if let Some(list) = curr_list.as_ref() { + TuiDirListDetailed::new(list, display_options, true).render(layout_rect, buf); + let rect = Rect { + x: 0, + y: area.height - 1, + width: area.width, + height: 1, + }; + + if self.show_bottom_status { + /* draw the bottom status bar */ + if let Some(msg) = self.context.worker_context_ref().get_msg() { + let message_style = Style::default().fg(Color::Yellow); + let text = Span::styled(msg, message_style); + Paragraph::new(text) + .wrap(Wrap { trim: true }) + .render(rect, buf); + } else if let Some(msg) = self.context.message_queue_ref().current_message() { + let text = Span::styled(msg.content.as_str(), msg.style); + Paragraph::new(text) + .wrap(Wrap { trim: true }) + .render(rect, buf); + } else { + TuiFooter::new(list).render(rect, buf); + } + } + } + + let topbar_width = area.width; + let rect = Rect { + x: 0, + y: 0, + width: topbar_width, + height: 1, + }; + TuiTopBar::new(self.context, curr_tab.cwd()).render(rect, buf); + + // render tabs + if self.context.tab_context_ref().len() > 1 { + let topbar_width = area.width.saturating_sub(TAB_VIEW_WIDTH); + + let rect = Rect { + x: topbar_width, + y: 0, + width: TAB_VIEW_WIDTH, + height: 1, + }; + let name = if let Some(ostr) = curr_tab.cwd().file_name() { + ostr.to_str().unwrap_or("") + } else { + "" + }; + TuiTabBar::new( + name, + self.context.tab_context_ref().index, + self.context.tab_context_ref().len(), + ) + .render(rect, buf); + } + } + + let other_tab_index = if tab_index % 2 == 0 { + tab_index + 1 + } else { + tab_index - 1 + }; + + if let Some(curr_tab) = tab_context.tab_ref(other_tab_index) { + let curr_list = curr_tab.curr_list_ref(); + + let layout_rect = if other_tab_index % 2 == 0 { + layout_rect[0] + } else { + layout_rect[1] + }; + + if let Some(list) = curr_list.as_ref() { + TuiDirListDetailed::new(list, display_options, false).render(layout_rect, buf); + } + } + } +} + +fn calculate_layout(area: Rect, constraints: &[Constraint; 2]) -> Vec { + let mut layout_rect = Layout::default() + .direction(Direction::Horizontal) + .constraints(constraints.as_ref()) + .split(area); + + layout_rect[0] = Rect { + width: layout_rect[0].width - 1, + ..layout_rect[0] + }; + layout_rect[1] = Rect { + width: layout_rect[1].width - 1, + ..layout_rect[1] + }; + layout_rect +} + +fn calculate_layout_with_borders(area: Rect, constraints: &[Constraint; 2]) -> Vec { + let block = Block::default().borders(Borders::ALL); + let inner = block.inner(area); + + let layout_rect = Layout::default() + .direction(Direction::Horizontal) + .constraints(constraints.as_ref()) + .split(inner); + + let block = Block::default().borders(Borders::RIGHT); + let inner1 = block.inner(layout_rect[0]); + + let block = Block::default().borders(Borders::LEFT); + let inner2 = block.inner(layout_rect[1]); + + vec![inner1, inner2] +} diff --git a/src/ui/views/tui_textfield.rs b/src/ui/views/tui_textfield.rs index 7cb4369..045def9 100644 --- a/src/ui/views/tui_textfield.rs +++ b/src/ui/views/tui_textfield.rs @@ -86,8 +86,8 @@ impl<'a> TuiTextField<'a> { let char_idx = self._prefix.chars().map(|c| c.len_utf8()).sum(); - line_buffer.insert_str(0, self._suffix); line_buffer.insert_str(0, self._prefix); + line_buffer.insert_str(line_buffer.len(), self._suffix); line_buffer.set_pos(char_idx); let terminal = backend.terminal_mut(); @@ -102,6 +102,7 @@ impl<'a> TuiTextField<'a> { if area.height == 0 { return; } + // redraw view { let mut view = TuiView::new(context); view.show_bottom_status = false; @@ -117,7 +118,7 @@ impl<'a> TuiTextField<'a> { let multiline_height = multiline.height(); // render menu - { + if !self._menu_items.is_empty() { let menu_widget = TuiMenu::new(self._menu_items.as_slice()); let menu_len = menu_widget.len(); let menu_y = if menu_len + 1 > area.height as usize { diff --git a/src/ui/views/tui_view.rs b/src/ui/views/tui_view.rs index d50c1a6..541ffed 100644 --- a/src/ui/views/tui_view.rs +++ b/src/ui/views/tui_view.rs @@ -2,8 +2,7 @@ use tui::buffer::Buffer; use tui::layout::Rect; use tui::widgets::Widget; -use super::TuiFolderView; -use super::TuiVSplitView; +use crate::ui::views::{TuiFolderView, TuiHSplitView}; use crate::config::option::DisplayMode; use crate::context::AppContext; @@ -29,8 +28,8 @@ impl<'a> Widget for TuiView<'a> { DisplayMode::Default => { TuiFolderView::new(self.context).render(area, buf); } - DisplayMode::VSplit => { - TuiVSplitView::new(self.context).render(area, buf); + DisplayMode::HSplit => { + TuiHSplitView::new(self.context).render(area, buf); } } } diff --git a/src/ui/views/tui_vsplit_view.rs b/src/ui/views/tui_vsplit_view.rs deleted file mode 100644 index e6b0a7d..0000000 --- a/src/ui/views/tui_vsplit_view.rs +++ /dev/null @@ -1,195 +0,0 @@ -use tui::buffer::Buffer; -use tui::layout::{Constraint, Direction, Layout, Rect}; -use tui::style::{Color, Style}; -use tui::text::Span; -use tui::widgets::{Block, Borders, Paragraph, Widget, Wrap}; - -use crate::context::AppContext; -use crate::ui::widgets::{TuiDirListDetailed, TuiFooter, TuiTabBar, TuiTopBar}; - -const TAB_VIEW_WIDTH: u16 = 15; - -pub struct TuiVSplitView<'a> { - pub context: &'a AppContext, - pub show_bottom_status: bool, -} - -impl<'a> TuiVSplitView<'a> { - pub fn new(context: &'a AppContext) -> Self { - Self { - context, - show_bottom_status: true, - } - } -} - -impl<'a> Widget for TuiVSplitView<'a> { - fn render(self, area: Rect, buf: &mut Buffer) { - let tab_context = self.context.tab_context_ref(); - let tab_index = tab_context.index; - - let config = self.context.config_ref(); - let display_options = config.display_options_ref(); - let constraints = &[Constraint::Ratio(1, 2), Constraint::Ratio(1, 2)]; - - let layout_rect = if display_options.show_borders() { - let area = Rect { - y: area.top() + 1, - height: area.height - 2, - ..area - }; - - let layout = calculate_layout_with_borders(area, constraints); - - let block = Block::default().borders(Borders::ALL); - let inner = block.inner(area); - block.render(area, buf); - - let layout_rect = Layout::default() - .direction(Direction::Horizontal) - .constraints(constraints.as_ref()) - .split(inner); - - let block = Block::default().borders(Borders::RIGHT); - block.render(layout_rect[0], buf); - - let block = Block::default().borders(Borders::LEFT); - block.render(layout_rect[1], buf); - - layout - } else { - let area = Rect { - y: area.top() + 1, - height: area.height - 2, - ..area - }; - calculate_layout(area, constraints) - }; - - if let Some(curr_tab) = tab_context.tab_ref(tab_index) { - let curr_list = curr_tab.curr_list_ref(); - - let layout_rect = if tab_index % 2 == 0 { - layout_rect[0] - } else { - layout_rect[1] - }; - - // render current view - if let Some(list) = curr_list.as_ref() { - TuiDirListDetailed::new(list, display_options, true).render(layout_rect, buf); - let rect = Rect { - x: 0, - y: area.height - 1, - width: area.width, - height: 1, - }; - - if self.show_bottom_status { - /* draw the bottom status bar */ - if let Some(msg) = self.context.worker_context_ref().get_msg() { - let message_style = Style::default().fg(Color::Yellow); - let text = Span::styled(msg, message_style); - Paragraph::new(text) - .wrap(Wrap { trim: true }) - .render(rect, buf); - } else if let Some(msg) = self.context.message_queue_ref().current_message() { - let text = Span::styled(msg.content.as_str(), msg.style); - Paragraph::new(text) - .wrap(Wrap { trim: true }) - .render(rect, buf); - } else { - TuiFooter::new(list).render(rect, buf); - } - } - } - - let topbar_width = area.width; - let rect = Rect { - x: 0, - y: 0, - width: topbar_width, - height: 1, - }; - TuiTopBar::new(self.context, curr_tab.cwd()).render(rect, buf); - - // render tabs - if self.context.tab_context_ref().len() > 1 { - let topbar_width = area.width.saturating_sub(TAB_VIEW_WIDTH); - - let rect = Rect { - x: topbar_width, - y: 0, - width: TAB_VIEW_WIDTH, - height: 1, - }; - let name = if let Some(ostr) = curr_tab.cwd().file_name() { - ostr.to_str().unwrap_or("") - } else { - "" - }; - TuiTabBar::new( - name, - self.context.tab_context_ref().index, - self.context.tab_context_ref().len(), - ) - .render(rect, buf); - } - } - - let other_tab_index = if tab_index % 2 == 0 { - tab_index + 1 - } else { - tab_index - 1 - }; - - if let Some(curr_tab) = tab_context.tab_ref(other_tab_index) { - let curr_list = curr_tab.curr_list_ref(); - - let layout_rect = if other_tab_index % 2 == 0 { - layout_rect[0] - } else { - layout_rect[1] - }; - - if let Some(list) = curr_list.as_ref() { - TuiDirListDetailed::new(list, display_options, false).render(layout_rect, buf); - } - } - } -} - -fn calculate_layout(area: Rect, constraints: &[Constraint; 2]) -> Vec { - let mut layout_rect = Layout::default() - .direction(Direction::Horizontal) - .constraints(constraints.as_ref()) - .split(area); - - layout_rect[0] = Rect { - width: layout_rect[0].width - 1, - ..layout_rect[0] - }; - layout_rect[1] = Rect { - width: layout_rect[1].width - 1, - ..layout_rect[1] - }; - layout_rect -} - -fn calculate_layout_with_borders(area: Rect, constraints: &[Constraint; 2]) -> Vec { - let block = Block::default().borders(Borders::ALL); - let inner = block.inner(area); - - let layout_rect = Layout::default() - .direction(Direction::Horizontal) - .constraints(constraints.as_ref()) - .split(inner); - - let block = Block::default().borders(Borders::RIGHT); - let inner1 = block.inner(layout_rect[0]); - - let block = Block::default().borders(Borders::LEFT); - let inner2 = block.inner(layout_rect[1]); - - vec![inner1, inner2] -} -- cgit v1.2.3