Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 43 additions & 0 deletions src/oterm/app/log_export.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
from datetime import datetime

from textual import on
from textual.app import ComposeResult
from textual.containers import Container
from textual.screen import ModalScreen
from textual.widgets import Input, Label

from oterm.log import log_lines


class LogExport(ModalScreen[str]):
file_name: str = ""
BINDINGS = [
("escape", "cancel", "Cancel"),
]

def __init__(self, file_name: str = "") -> None:
super().__init__()
if not file_name:
timestamp = datetime.now().strftime("%Y%m%d-%H%M%S")
file_name = f"oterm-logs-{timestamp}.txt"
self.file_name = file_name

def action_cancel(self) -> None:
self.dismiss()

@on(Input.Submitted)
async def on_submit(self, event: Input.Submitted) -> None:
if not event.value:
return

with open(event.value, "w", encoding="utf-8") as file:
for group, line in log_lines:
file.write(f"[{group.name}] {line}\n")

self.app.notify(f"Logs exported to {event.value}")
self.dismiss()

def compose(self) -> ComposeResult:
with Container(classes="screen-container short"):
yield Label("Export logs", classes="title")
yield Input(id="log-file-input", value=self.file_name)
6 changes: 6 additions & 0 deletions src/oterm/app/log_viewer.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,17 @@ class LogViewer(ModalScreen[str]):

BINDINGS = [
("escape", "cancel", "Cancel"),
("ctrl+s", "save_logs", "Save logs"),
]

def action_cancel(self) -> None:
self.dismiss()

def action_save_logs(self) -> None:
from oterm.app.log_export import LogExport

self.app.push_screen(LogExport())

@debounce(0.5)
async def log_update(self) -> None:
widget = self.query_one(RichLog)
Expand Down