Added the sidebar to add images, and modals to manage photo

This commit is contained in:
Gustavo Henrique Santos Souza de Miranda
2025-06-27 17:08:20 -03:00
parent 14055770e7
commit 84b0397263
5 changed files with 738 additions and 54 deletions
@@ -0,0 +1,61 @@
import os
from textual.app import ComposeResult
from textual.screen import Screen
from textual.widgets import Static, Input, Button
from textual.containers import Horizontal, Container
from .file_picker_modal import FilePickerModal
class AddPhotoModal(Screen):
"""Modal for adding a new photo"""
def __init__(self, diary_id: int):
super().__init__()
self.diary_id = diary_id
self.result = None
def compose(self) -> ComposeResult:
yield Container(
Static("📷 Add New Photo", classes="AddPhotoModal-Title"),
Static("File path:", classes="AddPhotoModal-Label"),
Horizontal(
Input(placeholder="Enter file path...", id="filepath-input", classes="AddPhotoModal-Input"),
Button("Escolher arquivo...", id="choose-file-button", classes="AddPhotoModal-Button"),
classes="AddPhotoModal-FileRow"
),
Static("Photo name:", classes="AddPhotoModal-Label"),
Input(placeholder="Enter photo name...", id="name-input", classes="AddPhotoModal-Input"),
Static("Caption (optional):", classes="AddPhotoModal-Label"),
Input(placeholder="Enter caption...", id="caption-input", classes="AddPhotoModal-Input"),
Horizontal(
Button("Add Photo", id="add-button", classes="AddPhotoModal-Button"),
Button("Cancel", id="cancel-button", classes="AddPhotoModal-Button"),
classes="AddPhotoModal-Buttons"
),
classes="AddPhotoModal-Dialog"
)
def on_button_pressed(self, event: Button.Pressed) -> None:
if event.button.id == "choose-file-button":
self.app.push_screen(
FilePickerModal(),
self.handle_file_picker_result
)
return
if event.button.id == "add-button":
filepath = self.query_one("#filepath-input", Input).value
name = self.query_one("#name-input", Input).value
caption = self.query_one("#caption-input", Input).value
if not filepath.strip() or not name.strip():
self.notify("File path and name are required", severity="error")
return
self.result = {
"filepath": filepath.strip(),
"name": name.strip(),
"caption": caption.strip() if caption.strip() else None
}
self.dismiss()
elif event.button.id == "cancel-button":
self.dismiss()
def handle_file_picker_result(self, result: str | None) -> None:
if result:
self.query_one("#filepath-input", Input).value = result
@@ -0,0 +1,66 @@
import os
from pathlib import Path
from typing import Iterable
from textual.app import ComposeResult
from textual.screen import Screen
from textual.widgets import Static, DirectoryTree, Button
from textual.containers import Horizontal, Container
class ImageDirectoryTree(DirectoryTree):
"""DirectoryTree that only shows image files"""
def filter_paths(self, paths: Iterable[Path]) -> Iterable[Path]:
"""Filter to show only directories and image files"""
image_extensions = {'.png', '.jpg', '.jpeg', '.gif', '.bmp', '.webp'}
return [
path for path in paths
if path.is_dir() or path.suffix.lower() in image_extensions
]
class FilePickerModal(Screen):
"""Modal for picking an image file using DirectoryTree"""
def __init__(self, start_path=None):
super().__init__()
self.start_path = Path(start_path or os.getcwd())
# Start one level up to make navigation easier
self.current_path = self.start_path.parent
self.result = None
def compose(self) -> ComposeResult:
yield Container(
Static(f"Current: {self.current_path}", id="title", classes="FilePickerModal-Title"),
ImageDirectoryTree(str(self.current_path), id="directory-tree"),
Horizontal(
Button("Up", id="up-button", classes="FilePickerModal-Button"),
Button("Cancel", id="cancel-button", classes="FilePickerModal-Button"),
classes="FilePickerModal-Buttons"
),
classes="FilePickerModal-Dialog"
)
def on_directory_tree_file_selected(self, event: DirectoryTree.FileSelected) -> None:
"""Handle file selection"""
file_path = event.path
# Check if it's an image file
image_extensions = {'.png', '.jpg', '.jpeg', '.gif', '.bmp', '.webp'}
if file_path.suffix.lower() in image_extensions:
self.result = str(file_path)
self.dismiss()
else:
self.notify("Please select an image file", severity="warning")
def on_button_pressed(self, event: Button.Pressed) -> None:
"""Handle button presses"""
if event.button.id == "up-button":
# Navigate to parent directory
parent = self.current_path.parent
if parent != self.current_path:
self.current_path = parent
self.query_one("#title", Static).update(f"Current: {self.current_path}")
# Reload the directory tree
tree = self.query_one("#directory-tree", ImageDirectoryTree)
tree.path = str(self.current_path)
tree.reload()
elif event.button.id == "cancel-button":
self.dismiss()