Compare commits

..

4 Commits

Author SHA1 Message Date
Gustavo Henrique Miranda 1312674186
Merge pull request #35 from gmbrax/fix/bindings-not-properly-working
Fixed the bindings to properly work and changed some bindings to avoid conflicts with the system
2025-07-13 23:06:14 -03:00
Gustavo Henrique Santos Souza de Miranda afc6908f37 Fixed the bindings to properly work and changed some bindings to avoid conflicts with the system 2025-07-13 22:53:39 -03:00
Gustavo Henrique Miranda 2983be09b6
Merge pull request #33 from gmbrax/fix/force-rename-entry
Fixed the new entry creation flow by prompting for a title if none is  set.
2025-07-12 19:29:55 -03:00
Gustavo Henrique Miranda 8129ae77a6
Merge branch 'staging' into fix/force-rename-entry 2025-07-12 19:11:56 -03:00
2 changed files with 78 additions and 52 deletions

View File

@ -25,7 +25,7 @@ structured and accessible format.
To install the application you must issue the command: To install the application you must issue the command:
```bash ```bash
pip install pilgrim pip install --index-url https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple Pilgrim
``` ```
## Usage ## Usage

View File

@ -24,26 +24,33 @@ class EditEntryScreen(Screen):
BINDINGS = [ BINDINGS = [
Binding("ctrl+q", "quit", "Quit"), Binding("ctrl+q", "quit", "Quit"),
Binding("ctrl+s", "save", "Save"), Binding("ctrl+s", "save", "Save"),
Binding("ctrl+n", "new_entry", "New Entry"), Binding("shift+f5", "new_entry", "New Entry"),
Binding("ctrl+shift+n", "next_entry", "Next Entry"), Binding("f5", "next_entry", "Next Entry"),
Binding("ctrl+shift+p", "prev_entry", "Previous Entry"), Binding("f4", "prev_entry", "Previous Entry"),
Binding("ctrl+r", "rename_entry", "Rename Entry"), Binding("ctrl+r", "rename_entry", "Rename Entry"),
Binding("f8", "toggle_sidebar", "Toggle Photos"), Binding("f8", "toggle_sidebar", "Toggle Photos"),
Binding("f9", "toggle_focus", "Toggle Focus"), Binding("f9", "toggle_focus", "Toggle Focus"),
Binding("escape", "back_to_list", "Back to List"), Binding("escape", "back_to_list", "Back to List"),
] ]
def __init__(self, diary_id: int = 1): def __init__(self, diary_id: int = 1,create_new: bool = True):
super().__init__() super().__init__()
if create_new:
self.current_entry_index = -1
self.is_new_entry = True
self.next_entry_id = None
else:
self.is_new_entry = False
self.current_entry_index = 0
self.next_entry_id = 1
self.new_entry_title = ""
self.new_entry_content = ""
self.diary_id = diary_id self.diary_id = diary_id
self.diary_name = f"Diary {diary_id}" self.diary_name = f"Diary {diary_id}"
self.current_entry_index = 0
self.entries: List[Entry] = [] self.entries: List[Entry] = []
self.is_new_entry = False
self.has_unsaved_changes = False self.has_unsaved_changes = False
self.new_entry_content = ""
self.new_entry_title = "New Entry"
self.next_entry_id = 1
self._updating_display = False self._updating_display = False
self._original_content = "" self._original_content = ""
self.is_refreshing = False self.is_refreshing = False
@ -906,11 +913,22 @@ class EditEntryScreen(Screen):
self.notify("Empty entry cannot be saved") self.notify("Empty entry cannot be saved")
return return
# Passe a lista de fotos para o método de criação # Passe a lista de fotos para o método de criação
self.call_later(self._async_create_entry, content, photos_to_link) if self.new_entry_title == "":
self.app.push_screen(RenameEntryModal(current_name=""), lambda result: self._handle_save_after_rename(result,content,
photos_to_link))
else:
self.call_later(self._async_create_entry, content, photos_to_link)
else: else:
# Passe a lista de fotos para o método de atualização # Passe a lista de fotos para o método de atualização
self.call_later(self._async_update_entry, content, photos_to_link) self.call_later(self._async_update_entry, content, photos_to_link)
def _handle_save_after_rename(self, result: str | None, content: str, photos_to_link: List[Photo]) -> None:
if result is None:
self.notify("Save cancelled")
return
self.new_entry_title = result
self.call_later(self._async_create_entry, content, photos_to_link)
async def _async_create_entry(self, content: str, photos_to_link: List[Photo]): async def _async_create_entry(self, content: str, photos_to_link: List[Photo]):
"""Creates a new entry and links the referenced photos.""" """Creates a new entry and links the referenced photos."""
try: try:
@ -937,7 +955,7 @@ class EditEntryScreen(Screen):
self.is_new_entry = False self.is_new_entry = False
self.has_unsaved_changes = False self.has_unsaved_changes = False
self._original_content = new_entry.text self._original_content = new_entry.text
self.new_entry_title = "New Entry" self.new_entry_title = ""
self.next_entry_id = max(entry.id for entry in self.entries) + 1 self.next_entry_id = max(entry.id for entry in self.entries) + 1
self._update_entry_display() self._update_entry_display()
@ -982,52 +1000,60 @@ class EditEntryScreen(Screen):
except Exception as e: except Exception as e:
self.notify(f"Error updating entry: {str(e)}") self.notify(f"Error updating entry: {str(e)}")
def on_key(self, event): def check_key(self, event):
# Sidebar contextual shortcuts """Check for custom key handling before bindings are processed"""
# Sidebar shortcuts
if self.sidebar_focused and self.sidebar_visible: if self.sidebar_focused and self.sidebar_visible:
sidebar_keys = ["i", "n", "d", "e"]
if event.key in sidebar_keys:
if event.key == "i":
self.action_insert_photo()
elif event.key == "n":
self.action_ingest_new_photo()
elif event.key == "d":
self.action_delete_photo()
elif event.key == "e":
self.action_edit_photo()
return True # Indica que o evento foi processado
if event.key == "i": # Text area shortcuts
elif self.focused is self.text_entry:
if event.key in ["tab", "shift+tab"]:
if event.key == "shift+tab":
self._handle_shift_tab()
elif event.key == "tab":
self.text_entry.insert('\t')
return True # Indica que o evento foi processado
self.action_insert_photo() return False # Não foi processado, continuar com bindings
event.stop()
elif event.key == "n":
self.action_ingest_new_photo() def _handle_shift_tab(self):
event.stop() """Handle shift+tab for removing indentation"""
elif event.key == "d": textarea = self.text_entry
row, col = textarea.cursor_location
lines = textarea.text.splitlines()
if row < len(lines):
line = lines[row]
if line.startswith('\t'):
lines[row] = line[1:]
textarea.text = '\n'.join(lines)
textarea.cursor_location = (row, max(col - 1, 0))
elif line.startswith(' '): # 4 spaces
lines[row] = line[4:]
textarea.text = '\n'.join(lines)
textarea.cursor_location = (row, max(col - 4, 0))
elif line.startswith(' '):
n = len(line) - len(line.lstrip(' '))
to_remove = min(n, 4)
lines[row] = line[to_remove:]
textarea.text = '\n'.join(lines)
textarea.cursor_location = (row, max(col - to_remove, 0))
self.action_delete_photo() def on_key(self, event):
event.stop() if self.check_key(event):
elif event.key == "e":
self.action_edit_photo()
event.stop()
# Shift+Tab: remove indent
elif self.focused is self.text_entry and event.key == "shift+tab":
textarea = self.text_entry
row, col = textarea.cursor_location
lines = textarea.text.splitlines()
if row < len(lines):
line = lines[row]
if line.startswith('\t'):
lines[row] = line[1:]
textarea.text = '\n'.join(lines)
textarea.cursor_location = (row, max(col - 1, 0))
elif line.startswith(' '): # 4 spaces
lines[row] = line[4:]
textarea.text = '\n'.join(lines)
textarea.cursor_location = (row, max(col - 4, 0))
elif line.startswith(' '):
n = len(line) - len(line.lstrip(' '))
to_remove = min(n, 4)
lines[row] = line[to_remove:]
textarea.text = '\n'.join(lines)
textarea.cursor_location = (row, max(col - to_remove, 0))
event.stop()
# Tab: insert tab
elif self.focused is self.text_entry and event.key == "tab":
self.text_entry.insert('\t')
event.stop() event.stop()
return
def on_footer_action(self, event) -> None: def on_footer_action(self, event) -> None:
"""Handle clicks on footer actions (Textual 3.x).""" """Handle clicks on footer actions (Textual 3.x)."""