Skip to content

Commit 6a0c684

Browse files
committed
add search directories to settings page
1 parent 9d2e3d9 commit 6a0c684

4 files changed

Lines changed: 105 additions & 7 deletions

File tree

src/app.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ pub enum SetConfigFields {
128128
AutoSuggest(bool),
129129
Modes(Editable<(String, String)>),
130130
Aliases(Editable<(String, String)>),
131-
SearchDirs(Editable<Vec<String>>),
131+
SearchDirs(Editable<String>),
132132
DebounceDelay(u64),
133133
SetThemeFields(SetConfigThemeFields),
134134
SetBufferFields(SetConfigBufferFields),

src/app/pages/settings.rs

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,8 @@ pub fn settings_page(config: Config) -> Element<'static, Message> {
379379
aliases_item(config.aliases.clone(), &theme),
380380
settings_hint_text(theme.clone(), "Modes"),
381381
modes_item(config.modes.clone(), &theme),
382+
settings_hint_text(theme.clone(), "Search Directories"),
383+
search_dirs_item(&theme, config.search_dirs.clone()),
382384
Row::from_iter([
383385
savebutton(theme.clone()),
384386
default_button(theme.clone()),
@@ -561,6 +563,47 @@ fn aliases_item(aliases: HashMap<String, String>, theme: &Theme) -> Element<'sta
561563
.into()
562564
}
563565

566+
fn search_dirs_item(theme: &Theme, search_dirs: Vec<String>) -> Element<'static, Message> {
567+
let theme_clone = theme.clone();
568+
let search_dirs = search_dirs.clone();
569+
Column::from_iter([
570+
container(
571+
Column::from_iter(search_dirs.iter().map(|dir| {
572+
let theme_clone_2 = theme.clone();
573+
let directory = dir.clone();
574+
container(
575+
Row::from_iter([
576+
dir_picker_button(directory, dir, theme_clone.clone()).into(),
577+
Button::new("Delete")
578+
.on_press(Message::SetConfig(SetConfigFields::SearchDirs(
579+
Editable::Delete(dir.clone()),
580+
)))
581+
.style(move |_, _| delete_button_style(&theme_clone_2))
582+
.into(),
583+
])
584+
.spacing(10)
585+
.align_y(Alignment::Center),
586+
)
587+
.width(Length::Fill)
588+
.align_x(Alignment::Center)
589+
.into()
590+
}))
591+
.spacing(10),
592+
)
593+
.height(Length::Fill)
594+
.width(Length::Fill)
595+
.align_x(Alignment::Center)
596+
.align_y(Alignment::Center)
597+
.into(),
598+
dir_adder_button("+", theme.to_owned()).into(),
599+
])
600+
.spacing(10)
601+
.height(Length::Fill)
602+
.width(Length::Fill)
603+
.align_x(Alignment::Center)
604+
.into()
605+
}
606+
564607
fn text_input_cell(text: String, theme: &Theme, placeholder: &str) -> TextInput<'static, Message> {
565608
text_input(placeholder, &text)
566609
.font(theme.font())
@@ -631,3 +674,50 @@ fn modes_item(modes: HashMap<String, String>, theme: &Theme) -> Element<'static,
631674
.align_x(Alignment::Center)
632675
.into()
633676
}
677+
678+
fn dir_picker_button(directory: String, dir: &str, theme: Theme) -> Button<'static, Message> {
679+
let home = std::env::var("HOME").unwrap_or("/".to_string());
680+
Button::new(Text::new(dir.to_owned().replace(&home, "~")))
681+
.on_press_with(move || {
682+
let msg = rfd::FileDialog::new()
683+
.set_directory(home.clone())
684+
.set_can_create_directories(false)
685+
.pick_folder()
686+
.map(|path| {
687+
let new = path.to_str().unwrap_or("").to_string();
688+
Message::SetConfig(SetConfigFields::SearchDirs(Editable::Update {
689+
old: directory.clone(),
690+
new,
691+
}))
692+
})
693+
.unwrap_or(Message::SetConfig(SetConfigFields::SearchDirs(
694+
Editable::Update {
695+
old: directory.clone(),
696+
new: directory.clone(),
697+
},
698+
)));
699+
700+
msg
701+
})
702+
.style(move |_, _| settings_add_button_style(&theme.clone()))
703+
}
704+
705+
fn dir_adder_button(dir: &str, theme: Theme) -> Button<'static, Message> {
706+
Button::new(Text::new(dir.to_owned()))
707+
.on_press_with(move || {
708+
let msg = rfd::FileDialog::new()
709+
.set_directory(std::env::var("HOME").unwrap_or("/".to_string()))
710+
.set_can_create_directories(false)
711+
.pick_folder()
712+
.map(|path| {
713+
let new = path.to_str().unwrap_or("").to_string();
714+
Message::SetConfig(SetConfigFields::SearchDirs(Editable::Create(new)))
715+
})
716+
.unwrap_or(Message::SetConfig(SetConfigFields::SearchDirs(
717+
Editable::Create(String::new()),
718+
)));
719+
720+
msg
721+
})
722+
.style(move |_, _| settings_add_button_style(&theme.clone()))
723+
}

src/app/tile/elm.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ pub fn view(tile: &Tile, wid: window::Id) -> Element<'_, Message> {
179179
.height(height as u32);
180180

181181
let text = if tile.query_lc.is_empty() {
182-
if tile.page == Page::Main {
182+
if tile.config.auto_suggest && tile.page == Page::Main {
183183
"Frequently used".to_string()
184184
} else {
185185
tile.page.to_string()

src/app/tile/update.rs

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -600,14 +600,14 @@ pub fn handle_update(tile: &mut Tile, message: Message) -> Task<Message> {
600600
final_config.aliases.insert(new.0, new.1);
601601
}
602602
SetConfigFields::SearchDirs(Editable::Create(dir)) => {
603-
final_config.search_dirs = dir
603+
final_config.search_dirs.push(dir);
604604
}
605605
SetConfigFields::SearchDirs(Editable::Delete(dirs)) => {
606606
final_config.search_dirs = final_config
607607
.search_dirs
608608
.iter()
609609
.filter_map(|dir| {
610-
if !dirs.contains(dir) {
610+
if &dirs != dir {
611611
Some(dir.to_owned())
612612
} else {
613613
None
@@ -616,8 +616,17 @@ pub fn handle_update(tile: &mut Tile, message: Message) -> Task<Message> {
616616
.collect();
617617
}
618618
SetConfigFields::SearchDirs(Editable::Update { old, new }) => {
619-
let _ = old;
620-
let _ = new;
619+
final_config.search_dirs = final_config
620+
.search_dirs
621+
.iter()
622+
.map(|dir| {
623+
if dir == &old {
624+
new.clone()
625+
} else {
626+
dir.to_owned()
627+
}
628+
})
629+
.collect();
621630
}
622631
SetConfigFields::SearchUrl(url) => final_config.search_url = url,
623632
SetConfigFields::PlaceHolder(placeholder) => final_config.placeholder = placeholder,
@@ -651,7 +660,6 @@ pub fn handle_update(tile: &mut Tile, message: Message) -> Task<Message> {
651660
SetConfigFields::ToDefault => {
652661
final_config = Config::default();
653662
final_config.shells = tile.config.shells.clone();
654-
final_config.search_dirs = tile.config.search_dirs.clone();
655663
}
656664
};
657665

0 commit comments

Comments
 (0)