vcard_tui 0.1.0

Terminal UI application for managing vCard contacts.
use std::io::Stdout;

use tui::backend::CrosstermBackend;
use tui::layout::{Constraint, Direction, Layout, Rect};
use tui::style::Style;
use tui::widgets::{Block, Borders, Clear};
use tui::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_extra::render_property_extra_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_email;
mod property_extra;
mod property_note;
mod property_remove;
mod property_tel;
mod property_url;
mod vcard_add;

pub fn render_popup(frame: &mut Frame<CrosstermBackend<Stdout>>, 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::Max(height), Constraint::Max((rect.height - height) / 2)]).split(rect);
    let columns = Layout::default().direction(Direction::Horizontal).constraints([Constraint::Length((rect.width - width) / 2), Constraint::Max(width), Constraint::Max((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::PropertyEmail(state) => render_property_email_popup(state, frame, center),
        PopupState::PropertyExtra(state) => render_property_extra_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),
    }
}