| |
| """ |
| Main entry point for the ECGLight Dashboard. |
| Slim router that delegates to page modules in utils/. |
| """ |
|
|
| import os |
| import sys |
| import streamlit as st |
|
|
| |
| sys.path.append(os.path.abspath(os.path.dirname(__file__))) |
|
|
| |
| import config |
|
|
| |
| from utils.css import inject_custom_css |
| from utils.branding import render_sidebar_logo, render_logo_footer |
| from utils.hardware import render_sidebar_hardware |
| from utils import page_digitizer, page_csv_viewer, page_classifier |
|
|
| |
| |
|
|
| |
| |
| |
| st.set_page_config( |
| page_title="ECGLight", |
| page_icon="β‘", |
| layout="wide", |
| initial_sidebar_state="expanded" |
| ) |
|
|
| |
| |
| |
| inject_custom_css() |
|
|
| |
| |
| |
| |
| render_sidebar_logo() |
|
|
| st.sidebar.markdown( |
| '<h1 style="font-size: 1.8rem; margin-bottom: 5px; font-weight: 800; letter-spacing: -0.5px; text-align: center; padding-right: 1.5rem;">' |
| 'β‘ <span class="glow-text">ECGLight</span></h1>', |
| unsafe_allow_html=True |
| ) |
| st.sidebar.markdown( |
| '<p class="section-subtitle" style="text-align: center;">Lightweight Digitization & Classification Suite</p>', |
| unsafe_allow_html=True |
| ) |
|
|
| st.sidebar.markdown("---") |
|
|
| |
| page = st.sidebar.radio( |
| "π§ Navigation Pages", |
| ["π· ECG Image Digitizer", "π ECG Signal Viewer", "β€οΈ ECG Classification"], |
| index=0 |
| ) |
|
|
| |
| if "current_page" not in st.session_state: |
| st.session_state["current_page"] = page |
|
|
| if st.session_state["current_page"] != page: |
| |
| |
| keys_to_clear = [ |
| "digitized_df", "digitized_name", "last_uploaded_name", |
| "clf_results", "clf_logs", "selected_task", |
| "csv_viewer_upload", "classifier_csv_upload" |
| ] |
| for key in keys_to_clear: |
| st.session_state.pop(key, None) |
| |
| st.session_state["current_page"] = page |
| st.rerun() |
|
|
| st.sidebar.markdown("---") |
|
|
| |
| render_sidebar_hardware() |
|
|
| |
| |
| |
| yolo_configured = all([ |
| config.YOLO_BOX_MODEL_PATH, |
| config.YOLO_LEAD_NAME_MODEL_PATH, |
| config.YOLO_PULSE_MODEL_PATH, |
| config.YOLO_SEGMENTATION_MODEL_PATH |
| ]) |
|
|
| |
| |
| |
| if page == "π· ECG Image Digitizer": |
| from backend import digitization_runner |
| page_digitizer.render(config, digitization_runner, yolo_configured) |
| render_logo_footer() |
|
|
| elif page == "π ECG Signal Viewer": |
| page_csv_viewer.render() |
| render_logo_footer() |
|
|
| elif page == "β€οΈ ECG Classification": |
| from backend import classification_runner |
| page_classifier.render(config, classification_runner) |
| render_logo_footer() |
|
|