mirror of
https://github.com/sxyazi/yazi.git
synced 2026-07-25 08:41:05 +00:00
WIP [no ci]
This commit is contained in:
parent
50b7f1af2b
commit
d59e52c39b
5 changed files with 40 additions and 68 deletions
|
|
@ -1,5 +1,2 @@
|
||||||
mod show;
|
mod show;
|
||||||
mod trigger;
|
mod trigger;
|
||||||
|
|
||||||
pub use show::*;
|
|
||||||
pub use trigger::*;
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
use crossterm::terminal::WindowSize;
|
use crossterm::terminal::WindowSize;
|
||||||
use ratatui::prelude::Rect;
|
use ratatui::prelude::Rect;
|
||||||
use yazi_config::keymap::KeymapLayer;
|
|
||||||
use yazi_shared::Term;
|
use yazi_shared::Term;
|
||||||
|
|
||||||
use crate::{completion::Completion, help::Help, input::Input, manager::Manager, select::Select, tasks::Tasks, which::Which, Position};
|
use crate::{completion::Completion, help::Help, input::Input, manager::Manager, select::Select, tasks::Tasks, which::Which, Position};
|
||||||
|
|
@ -32,29 +31,31 @@ impl Ctx {
|
||||||
let WindowSize { columns, rows, .. } = Term::size();
|
let WindowSize { columns, rows, .. } = Term::size();
|
||||||
|
|
||||||
let (x, y) = match pos {
|
let (x, y) = match pos {
|
||||||
Position::None => return Rect::default(),
|
|
||||||
Position::Top(Rect { mut x, mut y, width, height }) => {
|
Position::Top(Rect { mut x, mut y, width, height }) => {
|
||||||
x = x.min(columns.saturating_sub(*width));
|
x = x.min(columns.saturating_sub(*width));
|
||||||
y = y.min(rows.saturating_sub(*height));
|
y = y.min(rows.saturating_sub(*height));
|
||||||
((columns / 2).saturating_sub(width / 2) + x, y)
|
((columns / 2).saturating_sub(width / 2) + x, y)
|
||||||
}
|
}
|
||||||
Position::Hovered(rect @ Rect { mut x, y, width, height }) => {
|
Position::Sticky(Rect { mut x, y, width, height }, r) => {
|
||||||
let Some(r) =
|
|
||||||
self.manager.hovered().and_then(|h| self.manager.current().rect_current(&h.url))
|
|
||||||
else {
|
|
||||||
return self.area(&Position::Top(*rect));
|
|
||||||
};
|
|
||||||
|
|
||||||
x = x.min(columns.saturating_sub(*width));
|
x = x.min(columns.saturating_sub(*width));
|
||||||
if y + height + r.y + r.height > rows {
|
if y + height + r.y + r.height > rows {
|
||||||
(x + r.x, r.y.saturating_sub(height.saturating_sub(1)))
|
(x + r.x, r.y.saturating_sub(height.saturating_sub(*y)))
|
||||||
} else {
|
} else {
|
||||||
(x + r.x, y + r.y + r.height)
|
(x + r.x, y + r.y + r.height)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Position::Hovered(rect) => {
|
||||||
|
return self.area(&if let Some(r) =
|
||||||
|
self.manager.hovered().and_then(|h| self.manager.current().rect_current(&h.url))
|
||||||
|
{
|
||||||
|
Position::Sticky(*rect, r)
|
||||||
|
} else {
|
||||||
|
Position::Top(*rect)
|
||||||
|
});
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let (w, h) = pos.dimension().unwrap();
|
let (w, h) = pos.dimension();
|
||||||
Rect { x, y, width: w.min(columns.saturating_sub(x)), height: h.min(rows.saturating_sub(y)) }
|
Rect { x, y, width: w.min(columns.saturating_sub(x)), height: h.min(rows.saturating_sub(y)) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,23 +1,25 @@
|
||||||
use ratatui::prelude::Rect;
|
use ratatui::prelude::Rect;
|
||||||
|
|
||||||
#[derive(Default)]
|
|
||||||
pub enum Position {
|
pub enum Position {
|
||||||
#[default]
|
|
||||||
None,
|
|
||||||
Top(Rect),
|
Top(Rect),
|
||||||
|
Sticky(Rect, Rect),
|
||||||
Hovered(Rect),
|
Hovered(Rect),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Default for Position {
|
||||||
|
fn default() -> Self { Self::Top(Rect::default()) }
|
||||||
|
}
|
||||||
|
|
||||||
impl Position {
|
impl Position {
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn rect(&self) -> Option<Rect> {
|
pub fn rect(&self) -> Rect {
|
||||||
match self {
|
match self {
|
||||||
Position::None => None,
|
Position::Top(rect) => *rect,
|
||||||
Position::Top(rect) => Some(*rect),
|
Position::Sticky(rect, _) => *rect,
|
||||||
Position::Hovered(rect) => Some(*rect),
|
Position::Hovered(rect) => *rect,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn dimension(&self) -> Option<(u16, u16)> { self.rect().map(|r| (r.width, r.height)) }
|
pub fn dimension(&self) -> (u16, u16) { (self.rect().width, self.rect().height) }
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
use ratatui::{buffer::Buffer, layout::Rect, widgets::{Block, BorderType, Borders, Cell, Clear, List, ListItem, Row, Table, Widget}};
|
use ratatui::{buffer::Buffer, layout::Rect, widgets::{Block, BorderType, Borders, Clear, List, ListItem, Widget}};
|
||||||
use yazi_core::Ctx;
|
use yazi_core::{Ctx, Position};
|
||||||
|
|
||||||
pub(crate) struct Completion<'a> {
|
pub(crate) struct Completion<'a> {
|
||||||
cx: &'a Ctx,
|
cx: &'a Ctx,
|
||||||
|
|
@ -10,54 +10,24 @@ impl<'a> Completion<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> Widget for Completion<'a> {
|
impl<'a> Widget for Completion<'a> {
|
||||||
fn render(self, _: Rect, buf: &mut Buffer) {
|
fn render(self, rect: Rect, buf: &mut Buffer) {
|
||||||
let items =
|
let items =
|
||||||
self.cx.completion.items.iter().map(|x| ListItem::new(x.as_str())).collect::<Vec<_>>();
|
self.cx.completion.items.iter().map(|x| ListItem::new(x.as_str())).collect::<Vec<_>>();
|
||||||
|
|
||||||
// TODO
|
let input_area = self.cx.area(&self.cx.input.position);
|
||||||
Clear.render(Rect { x: 10, y: 10, width: 10, height: 20 }, buf);
|
let mut area =
|
||||||
List::new(items).render(Rect { x: 10, y: 10, width: 10, height: 20 }, buf);
|
self.cx.area(&Position::Sticky(Rect { x: 1, y: 0, width: 20, height: 15 }, input_area));
|
||||||
|
|
||||||
// let completion = &self.cx.input.completion;
|
if area.y > input_area.y {
|
||||||
// let area = self.cx.area(&completion.position);
|
area.y = area.y.saturating_sub(1);
|
||||||
|
} else {
|
||||||
|
area.y = rect.height.min(area.y + 1);
|
||||||
|
area.height = rect.height.saturating_sub(area.y).min(area.height);
|
||||||
|
}
|
||||||
|
|
||||||
// let constraint = (0..completion.column_cnt)
|
Clear.render(area, buf);
|
||||||
// .map(|_| Constraint::Percentage(completion.max_width))
|
List::new(items)
|
||||||
// .collect::<Vec<Constraint>>();
|
.block(Block::new().borders(Borders::ALL).border_type(BorderType::Rounded))
|
||||||
// let table = {
|
.render(area, buf);
|
||||||
// let max_width = completion.max_width as usize;
|
|
||||||
// let mut table = vec![];
|
|
||||||
// let mut cur_row = vec![];
|
|
||||||
// for (idx, s) in completion.items.iter().enumerate() {
|
|
||||||
// if idx != 0 && idx % completion.column_cnt as usize == 0 {
|
|
||||||
// let t = mem::take(&mut cur_row);
|
|
||||||
// table.push(Row::new(t));
|
|
||||||
// }
|
|
||||||
// cur_row.push(
|
|
||||||
// Cell::from(if s.len() < max_width {
|
|
||||||
// s.to_owned()
|
|
||||||
// } else {
|
|
||||||
// s.split_at(max_width - 1).0.to_string() + "…"
|
|
||||||
// })
|
|
||||||
// .style(if completion.cursor == idx {
|
|
||||||
// THEME.completion.active.into()
|
|
||||||
// } else {
|
|
||||||
// THEME.completion.inactive.into()
|
|
||||||
// }),
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
// table.push(Row::new(cur_row));
|
|
||||||
// Table::new(table)
|
|
||||||
// .block(
|
|
||||||
// Block::new()
|
|
||||||
// .borders(Borders::ALL)
|
|
||||||
// .border_type(BorderType::Double)
|
|
||||||
// .border_style(THEME.completion.border.into()),
|
|
||||||
// )
|
|
||||||
// .widths(&constraint)
|
|
||||||
// };
|
|
||||||
|
|
||||||
// Clear.render(area, buf);
|
|
||||||
// table.render(area, buf);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,5 @@
|
||||||
|
#![allow(clippy::module_inception)]
|
||||||
|
|
||||||
mod cursor;
|
mod cursor;
|
||||||
mod term;
|
mod term;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue