dear-file-browser 0.14.0

File dialogs and in-UI file browser for dear-imgui-rs
Documentation
use dear_imgui_rs::Ui;

use crate::dialog_state::FileDialogState;
use crate::places::Places;

pub(in crate::ui) fn draw_places_io_modal(ui: &Ui, state: &mut FileDialogState) {
    if state.ui.operations.places.io.open_next {
        ui.open_popup("Places");
        state.ui.operations.places.io.open_next = false;
    }

    if let Some(_popup) = ui.begin_modal_popup("Places") {
        let is_export =
            state.ui.operations.places.io.mode == crate::dialog_state::PlacesIoMode::Export;

        ui.text("Places persistence (compact format)");
        ui.separator();

        if ui.button("Export") {
            state.ui.operations.places.io.mode = crate::dialog_state::PlacesIoMode::Export;
            state.ui.operations.places.io.buffer =
                state
                    .core
                    .places
                    .serialize_compact(crate::PlacesSerializeOptions {
                        include_code_places: state.ui.operations.places.io.include_code,
                    });
            state.ui.operations.places.io.error = None;
        }
        ui.same_line();
        if ui.button("Import") {
            state.ui.operations.places.io.mode = crate::dialog_state::PlacesIoMode::Import;
            state.ui.operations.places.io.error = None;
        }
        ui.same_line();
        if ui.button("Close") {
            ui.close_current_popup();
            state.ui.operations.places.io.error = None;
        }

        ui.separator();

        if is_export {
            let mut include_code = state.ui.operations.places.io.include_code;
            if ui.checkbox("Include code places", &mut include_code) {
                state.ui.operations.places.io.include_code = include_code;
                state.ui.operations.places.io.buffer =
                    state
                        .core
                        .places
                        .serialize_compact(crate::PlacesSerializeOptions {
                            include_code_places: state.ui.operations.places.io.include_code,
                        });
            }
        }

        let avail = ui.content_region_avail();
        let size = [avail[0].max(200.0), (avail[1] - 95.0).max(120.0)];
        if is_export {
            ui.input_text_multiline(
                "##places_export",
                &mut state.ui.operations.places.io.buffer,
                size,
            )
            .read_only(true)
            .build();
        } else {
            ui.input_text_multiline(
                "##places_import",
                &mut state.ui.operations.places.io.buffer,
                size,
            )
            .build();

            if ui.button("Replace") {
                match Places::deserialize_compact(&state.ui.operations.places.io.buffer) {
                    Ok(p) => {
                        state.core.places = p;
                        state.ui.operations.places.io.error = None;
                    }
                    Err(e) => {
                        state.ui.operations.places.io.error = Some(e.to_string());
                    }
                }
            }
            ui.same_line();
            if ui.button("Merge") {
                match Places::deserialize_compact(&state.ui.operations.places.io.buffer) {
                    Ok(p) => {
                        state.core.places.merge_from(
                            p,
                            crate::places::PlacesMergeOptions {
                                overwrite_group_metadata: true,
                            },
                        );
                        state.ui.operations.places.io.error = None;
                    }
                    Err(e) => {
                        state.ui.operations.places.io.error = Some(e.to_string());
                    }
                }
            }
        }

        if let Some(err) = &state.ui.operations.places.io.error {
            ui.separator();
            ui.text_colored([1.0, 0.3, 0.3, 1.0], err);
        }
    }
}