yazi-actor 26.1.22

Yazi actor model
Documentation
use anyhow::Result;
use yazi_macro::{act, render, succ};
use yazi_parser::mgr::TabCloseOpt;
use yazi_shared::data::Data;

use crate::{Actor, Ctx};

pub struct TabClose;

impl Actor for TabClose {
	type Options = TabCloseOpt;

	const NAME: &str = "tab_close";

	fn act(cx: &mut Ctx, opt: Self::Options) -> Result<Data> {
		let len = cx.tabs().len();
		if len < 2 || opt.idx >= len {
			succ!();
		}

		let tabs = cx.tabs_mut();
		tabs.remove(opt.idx).shutdown();

		if opt.idx > tabs.cursor {
			tabs.set_idx(tabs.cursor);
		} else {
			tabs.set_idx(usize::min(tabs.cursor + 1, tabs.len() - 1));
		}

		let cx = &mut Ctx::renew(cx);
		act!(mgr:refresh, cx)?;
		act!(mgr:peek, cx, true)?;

		succ!(render!());
	}
}