Skip to content

Commit 2a8e40e

Browse files
committed
feat: update pin buttons to pick folders and support fallback current folder pinning
1 parent e2cdf93 commit 2a8e40e

3 files changed

Lines changed: 44 additions & 19 deletions

File tree

crates/media-sort-gui/src/app.rs

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,26 @@ pub fn update(state: &mut AppState, message: Message) -> Task<Message> {
124124
Message::PickFolderResult(None) => {
125125
Task::none()
126126
}
127+
Message::PickPinFolder => {
128+
Task::perform(
129+
async {
130+
if let Some(handle) = rfd::AsyncFileDialog::new().pick_folder().await {
131+
Some(handle.path().to_path_buf())
132+
} else {
133+
None
134+
}
135+
},
136+
Message::PickPinFolderResult
137+
)
138+
}
139+
Message::PickPinFolderResult(Some(path)) => {
140+
state.pin_folder(&path);
141+
let _ = state.settings.save();
142+
Task::none()
143+
}
144+
Message::PickPinFolderResult(None) => {
145+
Task::none()
146+
}
127147
Message::FolderSelected(path) => {
128148
state.selected_folder = Some(path);
129149
Task::none()
@@ -317,8 +337,9 @@ pub fn update(state: &mut AppState, message: Message) -> Task<Message> {
317337
Task::none()
318338
}
319339
Message::PinSelectedFolder => {
320-
if let Some(selected_path) = state.selected_folder.clone() {
321-
state.pin_folder(&selected_path);
340+
let path_to_pin = state.selected_folder.clone().or(state.current_folder.clone());
341+
if let Some(path) = path_to_pin {
342+
state.pin_folder(&path);
322343
let _ = state.settings.save();
323344
}
324345
Task::none()

crates/media-sort-gui/src/message.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ pub enum Message {
1414
OpenFolder(PathBuf),
1515
PickFolder,
1616
PickFolderResult(Option<PathBuf>),
17+
PickPinFolder,
18+
PickPinFolderResult(Option<PathBuf>),
1719
FolderSelected(PathBuf),
1820
ToggleFolderExpand(PathBuf),
1921

crates/media-sort-gui/src/view/folder_panel.rs

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,25 +6,27 @@ use crate::state::AppState;
66
use crate::view::folder_tree;
77

88
pub fn folder_panel_view(state: &AppState) -> Element<'_, Message> {
9-
let pin_btn = if state.current_folder.is_some() {
10-
button(text(state.l10n.tr("ui-pin")).size(12))
11-
.on_press(Message::PinCurrentFolder)
12-
} else {
13-
button(text(state.l10n.tr("ui-pin")).size(12))
9+
let pin_btn = button(text(state.l10n.tr("ui-pin")).size(12))
10+
.on_press(Message::PickPinFolder);
11+
12+
let pin_sel_btn = {
13+
let path_to_pin = state.selected_folder.clone().or(state.current_folder.clone());
14+
if let Some(_) = path_to_pin {
15+
button(text(state.l10n.tr("ui-pin-selected")).size(12))
16+
.on_press(Message::PinSelectedFolder)
17+
} else {
18+
button(text(state.l10n.tr("ui-pin-selected")).size(12))
19+
}
1420
};
1521

16-
let pin_sel_btn = if state.selected_folder.is_some() {
17-
button(text(state.l10n.tr("ui-pin-selected")).size(12))
18-
.on_press(Message::PinSelectedFolder)
19-
} else {
20-
button(text(state.l10n.tr("ui-pin-selected")).size(12))
21-
};
22-
23-
let unpin_btn = if let Some(ref current) = state.current_folder {
24-
button(text(state.l10n.tr("ui-unpin")).size(12))
25-
.on_press(Message::UnpinCurrentFolder(current.clone()))
26-
} else {
27-
button(text(state.l10n.tr("ui-unpin")).size(12))
22+
let unpin_btn = {
23+
let path_to_unpin = state.selected_folder.clone().or(state.current_folder.clone());
24+
if let Some(path) = path_to_unpin {
25+
button(text(state.l10n.tr("ui-unpin")).size(12))
26+
.on_press(Message::UnpinCurrentFolder(path))
27+
} else {
28+
button(text(state.l10n.tr("ui-unpin")).size(12))
29+
}
2830
};
2931

3032
let has_parent = state.selected_folder.is_some() || state.current_folder.is_some();

0 commit comments

Comments
 (0)