drive viewer

This commit is contained in:
Tim Bendt
2025-05-09 08:28:46 -06:00
parent 9731c94a21
commit fbb9f875e6
9 changed files with 838 additions and 292 deletions

View File

@@ -28,6 +28,7 @@ from actions.delete import delete_current
from actions.open import action_open
from actions.task import action_create_task
from widgets.EnvelopeHeader import EnvelopeHeader
from widgets.ContentContainer import ContentContainer
from maildir_gtd.utils import group_envelopes_by_date
logging.basicConfig(
@@ -106,6 +107,7 @@ class EmailViewerApp(App):
Binding("1", "focus_1", "Focus Accounts Panel"),
Binding("2", "focus_2", "Focus Folders Panel"),
Binding("3", "focus_3", "Focus Envelopes Panel"),
Binding("f", "toggle_mode", "Toggle Content Mode"),
]
BINDINGS.extend(
@@ -129,7 +131,7 @@ class EmailViewerApp(App):
ListView(id="folders_list", classes="list_view"),
id="sidebar",
),
ScrollableContainer(EnvelopeHeader(), Markdown(), id="main_content"),
ContentContainer(id="main_content"),
id="outer-wrapper",
)
yield Footer()
@@ -218,33 +220,33 @@ class EmailViewerApp(App):
if new_message_id == old_message_id:
return
self.msg_worker.cancel() if self.msg_worker else None
headers = self.query_one(EnvelopeHeader)
logging.info(f"new_message_id: {new_message_id}, type: {type(new_message_id)}")
logging.info(f"message_metadata keys: {list(self.message_metadata.keys())}")
content_container = self.query_one("#main_content")
content_container.display_content(new_message_id)
if new_message_id in self.message_metadata:
metadata = self.message_metadata[new_message_id]
self.current_message_index = metadata["index"]
headers.subject = metadata["subject"].strip()
headers.from_ = metadata["from"].get("addr", "")
headers.to = metadata["to"].get("addr", "")
message_date = re.sub(r"[\+\-]\d\d:\d\d", "", metadata["date"])
message_date = datetime.strptime(message_date, "%Y-%m-%d %H:%M").strftime(
"%a %b %d %H:%M"
)
headers.date = message_date
headers.cc = metadata["cc"].get("addr", "") if "cc" in metadata else ""
self.current_message_index = metadata["index"]
content_container.update_header(
subject=metadata.get("subject", "").strip(),
from_=metadata["from"].get("addr", ""),
to=metadata["to"].get("addr", ""),
date=message_date,
cc=metadata["cc"].get("addr", "") if "cc" in metadata else "",
)
self.query_one(ListView).index = metadata["index"]
else:
logging.warning(f"Message ID {new_message_id} not found in metadata.")
if self.message_body_cache.get(new_message_id):
# If the message body is already cached, use it
msg = self.query_one(Markdown)
msg.update(self.message_body_cache[new_message_id])
return
else:
self.query_one("#main_content").loading = True
self.msg_worker = self.fetch_one_message(new_message_id)
def on_list_view_selected(self, event: ListView.Selected) -> None:
"""Called when an item in the list view is selected."""
@@ -257,31 +259,31 @@ class EmailViewerApp(App):
return
self.current_message_id = int(self.all_envelopes[event.list_view.index]["id"])
@work(exclusive=False)
async def fetch_one_message(self, new_message_id: int) -> None:
msg = self.query_one(Markdown)
# @work(exclusive=False)
# async def fetch_one_message(self, new_message_id: int) -> None:
# content_container = self.query_one(ContentContainer)
try:
process = await asyncio.create_subprocess_shell(
f"himalaya message read {str(new_message_id)}",
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.PIPE,
)
stdout, stderr = await process.communicate()
logging.info(f"stdout: {stdout.decode()[0:50]}...")
if process.returncode == 0:
# Render the email content as Markdown
fixedText = stdout.decode().replace("(https://urldefense.com/v3/", "(")
fixedText = re.sub(r"atlOrigin.+?\)", ")", fixedText)
logging.info(f"rendering fixedText: {fixedText[0:50]}")
self.message_body_cache[new_message_id] = fixedText
await msg.update(fixedText)
self.query_one("#main_content").loading = False
logging.info(fixedText)
# try:
# process = await asyncio.create_subprocess_shell(
# f"himalaya message read {str(new_message_id)} -p",
# stdout=asyncio.subprocess.PIPE,
# stderr=asyncio.subprocess.PIPE,
# )
# stdout, stderr = await process.communicate()
# logging.info(f"stdout: {stdout.decode()[0:50]}...")
# if process.returncode == 0:
# # Render the email content as Markdown
# fixedText = stdout.decode().replace("(https://urldefense.com/v3/", "(")
# fixedText = re.sub(r"atlOrigin.+?\)", ")", fixedText)
# logging.info(f"rendering fixedText: {fixedText[0:50]}")
# self.message_body_cache[new_message_id] = fixedText
# await content_container.display_content(new_message_id)
# self.query_one("#main_content").loading = False
# logging.info(fixedText)
except Exception as e:
self.show_status(f"Error fetching message content: {e}", "error")
logging.error(f"Error fetching message content: {e}")
# except Exception as e:
# self.show_status(f"Error fetching message content: {e}", "error")
# logging.error(f"Error fetching message content: {e}")
@work(exclusive=False)
async def fetch_envelopes(self) -> None:
@@ -429,11 +431,7 @@ class EmailViewerApp(App):
message, title="Status", severity=severity, timeout=2.6, markup=True
)
def action_toggle_header(self) -> None:
"""Toggle the visibility of the EnvelopeHeader panel."""
header = self.query_one(EnvelopeHeader)
header.styles.height = "1" if self.header_expanded else "auto"
self.header_expanded = not self.header_expanded
async def action_toggle_sort_order(self) -> None:
"""Toggle the sort order of the envelope list."""
@@ -447,6 +445,11 @@ class EmailViewerApp(App):
else:
self.action_newest()
async def action_toggle_mode(self) -> None:
"""Toggle the content mode between plaintext and markdown."""
content_container = self.query_one(ContentContainer)
await content_container.toggle_mode()
def action_next(self) -> None:
if not self.current_message_index >= 0:
return