feat(ui): Integrate imgui_markdown and professional fonts for rich text rendering

This commit is contained in:
2026-03-08 23:07:42 -04:00
parent e802c6675f
commit 5f0168c4f2
10 changed files with 97 additions and 8 deletions

56
src/markdown_helper.py Normal file
View File

@@ -0,0 +1,56 @@
# src/markdown_helper.py
from __future__ import annotations
from imgui_bundle import imgui_md, imgui, immapp
import webbrowser
import os
from typing import Optional
class MarkdownRenderer:
"""
Wrapper for imgui_md to manage styling, callbacks, and specialized rendering
(like syntax highlighting integration).
"""
def __init__(self):
self.options = imgui_md.MarkdownOptions()
# Use Inter as the base font for Markdown (matches professional theme)
# It expects fonts like Inter-Regular.ttf, Inter-Bold.ttf, etc. in the assets folder
self.options.font_options.font_base_path = "fonts/Inter"
self.options.font_options.regular_size = 16.0
# Configure callbacks
self.options.callbacks.on_open_link = self._on_open_link
# Note: Syntax highlighting will be integrated in Phase 2
def _on_open_link(self, url: str) -> None:
"""Handle link clicks in Markdown."""
# If it's a URL, open in browser
if url.startswith("http"):
webbrowser.open(url)
else:
# Handle local files or internal links
# For now, just print. Could integrate with app_controller in Phase 4.
print(f"Clicked local link: {url}")
def render(self, text: str) -> None:
"""Render Markdown text using imgui_md."""
imgui_md.render(text)
def render_unindented(self, text: str) -> None:
"""Render Markdown text with automatic unindentation."""
imgui_md.render_unindented(text)
# Global instance for easy access
_renderer: Optional[MarkdownRenderer] = None
def get_renderer() -> MarkdownRenderer:
global _renderer
if _renderer is None:
_renderer = MarkdownRenderer()
return _renderer
def render(text: str) -> None:
get_renderer().render(text)
def render_unindented(text: str) -> None:
get_renderer().render_unindented(text)