"""Editor istantaneo per il diario di lavoro — pannello PyQt6, stile Frank/MyICR Suite. Un file .md per giorno (frontmatter + testo libero). All'apertura carica tutto il contenuto gia' presente, editabile ovunque, con una riga vuota gia' timbrata in fondo pronta per scrivere. Il salvataggio (periodico + alla chiusura) scrive semplicemente tutto il contenuto della casella nel file: nessun controllo di concorrenza, non ce n'e' motivo (un solo editore alla volta, keep simple). """ import sys from datetime import datetime from pathlib import Path from PyQt6.QtCore import QTimer from PyQt6.QtGui import QTextCursor from PyQt6.QtWidgets import ( QApplication, QHBoxLayout, QLabel, QMainWindow, QPlainTextEdit, QPushButton, QVBoxLayout, QWidget, ) ARCHIVIO_DIARIO = Path(__file__).resolve().parents[2] / "archivio" / "Mauro" / "diario" DIARIO_HUB = ARCHIVIO_DIARIO / "_i_diario.md" SAVE_INTERVAL_MS = 30_000 def frontmatter(date_str: str) -> str: return f"---\ndate: {date_str}\ntipo: diario\n---\n" def register_in_hub(date_str: str) -> None: """Aggiunge il nuovo giorno all'elenco in _i_diario.md, senza mai toccare la descrizione scritta a mano sopra. Se l'hub non esiste ancora, non lo crea (e' un file curato a mano, non generato dall'app).""" if not DIARIO_HUB.exists(): return content = DIARIO_HUB.read_text(encoding="utf-8") entry = f"- [[{date_str}]]" if entry in content: return if "## Giorni" not in content: return DIARIO_HUB.write_text(content.rstrip("\n") + f"\n{entry}\n", encoding="utf-8") class DiarioEditor(QMainWindow): def __init__(self): super().__init__() self.today = datetime.now().strftime("%Y-%m-%d") self.file_path = ARCHIVIO_DIARIO / f"{self.today}.md" ARCHIVIO_DIARIO.mkdir(parents=True, exist_ok=True) if not self.file_path.exists(): self.file_path.write_text(frontmatter(self.today), encoding="utf-8") register_in_hub(self.today) existing = self.file_path.read_text(encoding="utf-8") now = datetime.now().strftime("%H:%M") self.initial_text = existing.rstrip("\n") + f"\n\n**{now}** — " self.last_saved = None self._build_ui() self.timer = QTimer(self) self.timer.timeout.connect(self.save) self.timer.start(SAVE_INTERVAL_MS) def _build_ui(self): self.setWindowTitle(f"Diario — {self.today}") self.resize(560, 400) container = QWidget() layout = QVBoxLayout(container) info = QLabel(f"{self.today} · #lavoro / #casa dove serve · editabile ovunque") info.setStyleSheet("color: #666;") layout.addWidget(info) self.text_edit = QPlainTextEdit() self.text_edit.setPlainText(self.initial_text) cursor = self.text_edit.textCursor() cursor.movePosition(QTextCursor.MoveOperation.End) self.text_edit.setTextCursor(cursor) layout.addWidget(self.text_edit) button_row = QHBoxLayout() self.new_entry_button = QPushButton("+ Nuova voce (ora)") self.new_entry_button.clicked.connect(self.insert_new_entry) button_row.addStretch() button_row.addWidget(self.new_entry_button) layout.addLayout(button_row) self.status = QLabel("") self.status.setStyleSheet("color: #999; font-size: 11px;") layout.addWidget(self.status) self.setCentralWidget(container) self.text_edit.setFocus() def insert_new_entry(self): """Appende in fondo una nuova riga timbrata con l'ora attuale, senza dover chiudere e riaprire l'app (l'unico modo, prima, di ottenere un orario aggiornato per un secondo pensiero nella stessa sessione).""" now = datetime.now().strftime("%H:%M") current = self.text_edit.toPlainText().rstrip("\n") self.text_edit.setPlainText(current + f"\n\n**{now}** — ") cursor = self.text_edit.textCursor() cursor.movePosition(QTextCursor.MoveOperation.End) self.text_edit.setTextCursor(cursor) self.text_edit.setFocus() def save(self): content = self.text_edit.toPlainText() if content == self.last_saved: return self.file_path.write_text(content, encoding="utf-8") self.last_saved = content self.status.setText(f"Salvato {datetime.now().strftime('%H:%M:%S')}") def closeEvent(self, event): self.save() event.accept() def main(): app = QApplication(sys.argv) window = DiarioEditor() window.show() sys.exit(app.exec()) if __name__ == "__main__": main()