Skip to content

Commit 5ce87a1

Browse files
committed
Add Cancel button on path select screen
1 parent 955fe8e commit 5ce87a1

5 files changed

Lines changed: 48 additions & 5 deletions

File tree

recoverpy/ui/css/screen-path-edit.css

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,8 @@ PathEditScreen {
2020
height: 100%;
2121
align: center middle;
2222
}
23+
24+
#path-edit-button-container > Button {
25+
margin: 0 1;
26+
min-width: 16;
27+
}

recoverpy/ui/screens/screen_path_edit.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ class PathEditScreen(Screen[None]):
1717
BINDINGS = [
1818
Binding("enter", "confirm", "Confirm path", priority=True),
1919
Binding("escape", "cancel", "Cancel", priority=True),
20+
Binding("c", "cancel", "Cancel"),
2021
]
2122

2223
def __init__(self, *args, **kwargs) -> None: # type: ignore
@@ -35,22 +36,30 @@ def compose(self) -> ComposeResult:
3536
yield self._directory_tree
3637
yield self._selected_dir_label
3738
yield Horizontal(
39+
Button("Cancel", id="cancel-button", variant="warning"),
3840
Button("Confirm", id="confirm-button", variant="success"),
3941
id="path-edit-button-container",
4042
)
4143
log.info("path_edit - Path edit screen composed")
4244

4345
def on_mount(self) -> None:
44-
self._selected_dir_label.update(f"Selected directory: {self._selected_dir}")
46+
self._update_selected_dir_label()
4547
if self._directory_tree:
4648
self._directory_tree.focus()
4749

50+
def set_selected_dir(self, directory: str) -> None:
51+
self._selected_dir = directory
52+
self._update_selected_dir_label()
53+
54+
def _update_selected_dir_label(self) -> None:
55+
self._selected_dir_label.update(f"Selected directory: {self._selected_dir}")
56+
4857
async def on_directory_tree_directory_selected(
4958
self, event: DirectoryTree.DirectorySelected
5059
) -> None:
5160
event.stop()
5261
self._selected_dir = str(event.path)
53-
self._selected_dir_label.update(f"Selected directory: {self._selected_dir}")
62+
self._update_selected_dir_label()
5463

5564
async def on_directory_tree_file_selected(
5665
self, event: DirectoryTree.FileSelected
@@ -59,10 +68,13 @@ async def on_directory_tree_file_selected(
5968
self.notify("Only directories can be selected.", severity="warning")
6069

6170
async def on_button_pressed(self, event: Button.Pressed) -> None:
62-
if event.button.id != "confirm-button":
71+
if event.button.id not in {"confirm-button", "cancel-button"}:
6372
return
6473
event.stop()
65-
await self.action_confirm()
74+
if event.button.id == "confirm-button":
75+
await self.action_confirm()
76+
else:
77+
self.action_cancel()
6678

6779
async def action_confirm(self) -> None:
6880
log.info("path_edit - Confirm button pressed")

recoverpy/ui/screens/screen_save.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"""Screen used to confirm save."""
22

3-
from typing import Optional
3+
from typing import Optional, cast
44

55
from textual.app import ComposeResult
66
from textual.binding import Binding
@@ -79,6 +79,10 @@ async def _handle_go_back(self) -> None:
7979

8080
async def _handle_edit_save_path(self) -> None:
8181
log.info("save - Edit save path button pressed")
82+
if self._saver:
83+
cast(PathEditScreen, self.app.get_screen("path_edit")).set_selected_dir(
84+
str(self._saver.save_path)
85+
)
8286
await self.app.push_screen("path_edit")
8387

8488
async def _handle_save(self) -> None:

tests/integration/test_full_workflow.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,19 @@ async def test_full_workflow(session_mocker, tmp_path: Path):
279279
await pilot.press("e")
280280
await pilot.pause()
281281

282+
assert pilot.app.screen.name == "path_edit"
283+
assert "Selected directory:" in str(pilot.app.screen._selected_dir_label.content)
284+
285+
# Test cancel path edition (keyboard)
286+
await pilot.press("escape")
287+
await pilot.pause()
288+
289+
assert pilot.app.screen.name == "save"
290+
291+
# Re-open path edit and confirm
292+
await pilot.press("e")
293+
await pilot.pause()
294+
282295
assert pilot.app.screen.name == "path_edit"
283296

284297
assert isinstance(pilot.app.screen._directory_tree, DirectoryTree)

tests/unit/test_path_edit_screen.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,12 @@ async def test_file_selected_keeps_directory_only_and_notifies(session_mocker) -
2929
notify_mock.assert_called_once_with(
3030
"Only directories can be selected.", severity="warning"
3131
)
32+
33+
34+
def test_set_selected_dir_updates_label() -> None:
35+
screen = PathEditScreen()
36+
37+
screen.set_selected_dir("/tmp")
38+
39+
assert screen._selected_dir == "/tmp"
40+
assert str(screen._selected_dir_label.content) == "Selected directory: /tmp"

0 commit comments

Comments
 (0)