cargo-port 0.1.3

A TUI for inspecting and managing Rust projects
//! `Pane` impls for overlay panes plus `Hittable` for `FinderPane`.
//!
//! Render is a no-op for the framework-owned overlays — the popup
//! bodies are drawn by `keymap_ui::render_keymap_popup`,
//! `settings::render_settings_popup`, and `finder::render_finder_popup`
//! directly from the top-level `render::ui` path.
//!
//! Hit-testing for `KeymapPane` and `SettingsPane` lives in
//! `tui_pane` (their `row_at(pos)` methods); cargo-port consumes those
//! through `Framework::hit_test_at` via the
//! `InputContext::map_framework_hit` hook in `tui/interaction.rs`.
//! The finder is app-owned, so its `Hittable` impl stays here.

use ratatui::Frame;
use ratatui::layout::Position;
use ratatui::layout::Rect;
use tui_pane::Hittable;
use tui_pane::Renderable;
use tui_pane::SettingsPane;

use super::FinderPane;
use crate::tui::finder;
use crate::tui::pane::HoverTarget;
use crate::tui::pane::PaneRenderCtx;
use crate::tui::panes;
use crate::tui::panes::PaneId;
use crate::tui::settings;

impl Renderable<PaneRenderCtx<'_>> for SettingsPane {
    fn render(&mut self, frame: &mut Frame<'_>, _: Rect, ctx: &PaneRenderCtx<'_>) {
        settings::render_settings_pane_body(frame, self, ctx);
    }
}

impl Renderable<PaneRenderCtx<'_>> for FinderPane {
    fn render(&mut self, frame: &mut Frame<'_>, area: Rect, ctx: &PaneRenderCtx<'_>) {
        finder::render_finder_pane_body(frame, area, self, ctx);
    }
}

impl Hittable<HoverTarget> for FinderPane {
    fn hit_test_at(&self, pos: Position) -> Option<HoverTarget> {
        let row = panes::hit_test_table_row(&self.viewport, pos)?;
        Some(HoverTarget::PaneRow {
            pane: PaneId::Finder,
            row,
        })
    }
}