Skip to main content

modde_ui/views/
overwrite.rs

1use std::path::PathBuf;
2
3use iced::widget::{button, column, row, scrollable, text};
4use iced::{Element, Length};
5
6use crate::app::Message;
7
8/// State for the overwrite management view.
9#[derive(Debug, Clone, Default)]
10pub struct OverwriteState {
11    pub files: Vec<String>, // relative paths in the overrides directory
12    pub overrides_dir: PathBuf,
13}
14
15pub fn view<'a>(state: &'a OverwriteState) -> Element<'a, Message> {
16    let title = text("Overwrite / Profile Overrides").size(20);
17
18    let count_text = text(format!("{} file(s) in overrides", state.files.len())).size(14);
19
20    if state.files.is_empty() {
21        return column![
22            title,
23            count_text,
24            text("No override files. Files placed here will win over all mods during deploy.")
25                .size(12),
26        ]
27        .spacing(12)
28        .padding(16)
29        .into();
30    }
31
32    let file_list: Vec<Element<Message>> = state
33        .files
34        .iter()
35        .map(|f| row![text(f).size(12).width(Length::Fill),].padding(4).into())
36        .collect();
37
38    let actions = row![
39        button(text("Clear All").size(12))
40            .on_press(Message::ClearOverwrite)
41            .style(button::danger)
42            .padding([4, 12]),
43        button(text("Create Mod from Overrides").size(12))
44            .on_press(Message::MoveOverwriteToMod(
45                "__from_overrides__".to_string()
46            ))
47            .padding([4, 12]),
48    ]
49    .spacing(8);
50
51    column![
52        title,
53        count_text,
54        actions,
55        scrollable(column(file_list).spacing(2)).height(Length::Fill),
56    ]
57    .spacing(12)
58    .padding(16)
59    .into()
60}