#include "panels/LoadingOverlay.hpp" #include #include #include #include #include "Theme.hpp" namespace geopro::app { LoadingOverlay::LoadingOverlay(QWidget* parent) : QWidget(parent), label_(new QLabel(this)) { Q_ASSERT(parent); // 契约:必须有父(遮罩几何跟随父,无父无法工作) setAttribute(Qt::WA_StyledBackground, true); label_->setText(QStringLiteral("加载中…")); label_->setAlignment(Qt::AlignCenter); auto* lay = new QVBoxLayout(this); lay->addWidget(label_); if (parent) parent->installEventFilter(this); // 半透明遮罩跟随主题:浅色白纱深字(原版),暗色深纱浅字,避免暗色下刺眼白蒙板。 const auto applyTheme = [this]() { const QColor veil = isDarkTheme() ? tokenColor("bg/app") : QColor(255, 255, 255); setStyleSheet(QStringLiteral("background: rgba(%1,%2,%3,160);") .arg(veil.red()).arg(veil.green()).arg(veil.blue())); label_->setStyleSheet(QStringLiteral("background: transparent; color: %1;") .arg(tokenColor("text/primary").name())); }; applyTheme(); connect(&ThemeManager::instance(), &ThemeManager::changed, this, applyTheme); hide(); } void LoadingOverlay::showOver() { if (parentWidget()) setGeometry(parentWidget()->rect()); raise(); show(); } bool LoadingOverlay::eventFilter(QObject* obj, QEvent* ev) { if (obj == parentWidget() && ev->type() == QEvent::Resize && isVisible()) { setGeometry(parentWidget()->rect()); } return QWidget::eventFilter(obj, ev); } } // namespace geopro::app