vcard_tui 0.1.2

Terminal UI application for managing vCard contacts.
use ratatui::layout::{Constraint, Direction, Layout, Rect};
use ratatui::style::Style;
use ratatui::widgets::{Block, Borders, Clear};
use ratatui::Frame;

use property_adr::render_property_adr_popup;
use property_email::render_property_email_popup;
use property_note::render_property_note_popup;
use property_remove::render_property_remove_popup;
use property_tel::render_property_tel_popup;
use property_url::render_property_url_popup;

use crate::state::popup::PopupState;
use crate::tui::render::popup::confirm::render_confirm_popup;
use crate::tui::render::popup::export::render_export_popup;
use crate::tui::render::popup::import::render_import_popup;
use crate::tui::render::popup::message::render_message_popup;
use crate::tui::render::popup::property_bday::render_property_bday_popup;
use crate::tui::render::popup::property_extra::render_property_extra_popup;
use crate::tui::render::popup::property_n::render_property_n_popup;
use crate::tui::render::popup::vcard_add::render_vcard_add_popup;
use crate::util::{popup_size, popup_title};
use crate::PRIMARY;

mod confirm;
mod export;
mod import;
mod message;
mod property_adr;
mod property_bday;
mod property_email;
mod property_extra;
mod property_n;
mod property_note;
mod property_remove;
mod property_tel;
mod property_url;
mod vcard_add;

pub fn render_popup(frame: &mut Frame, rect: Rect, popup: &mut PopupState) {
    let block = Block::default()
        .title(popup_title(popup))
        .borders(Borders::ALL)
        .style(Style::default().fg(PRIMARY));
    let (height, width) = popup_size(popup);
    let rows = Layout::default()
        .direction(Direction::Vertical)
        .constraints([
            Constraint::Length((rect.height - height) / 2),
            Constraint::Length(height),
            Constraint::Length((rect.height - height) / 2),
        ])
        .split(rect);
    let columns = Layout::default()
        .direction(Direction::Horizontal)
        .constraints([
            Constraint::Length((rect.width - width) / 2),
            Constraint::Length(width),
            Constraint::Length((rect.width - width) / 2),
        ])
        .split(rows[1]);
    let center = columns[1];

    frame.render_widget(Clear, center);
    frame.render_widget(block, center);

    match popup {
        PopupState::Confirm(state) => render_confirm_popup(state, frame, center),
        PopupState::Export(state) => render_export_popup(state, frame, center),
        PopupState::Import(state) => render_import_popup(state, frame, center),
        PopupState::Message(state) => render_message_popup(state, frame, center),
        PopupState::PropertyAdr(state) => render_property_adr_popup(state, frame, center),
        PopupState::PropertyBDay(state) => render_property_bday_popup(state, frame, center),
        PopupState::PropertyEmail(state) => render_property_email_popup(state, frame, center),
        PopupState::PropertyExtra(state) => render_property_extra_popup(state, frame, center),
        PopupState::PropertyN(state) => render_property_n_popup(state, frame, center),
        PopupState::PropertyNote(state) => render_property_note_popup(state, frame, center),
        PopupState::PropertyRemove(state) => render_property_remove_popup(state, frame, center),
        PopupState::PropertyTel(state) => render_property_tel_popup(state, frame, center),
        PopupState::PropertyUrl(state) => render_property_url_popup(state, frame, center),
        PopupState::VcardAdd(state) => render_vcard_add_popup(state, frame, center),
    }
}