geopro/src/app/panels/LoadingOverlay.cpp

47 lines
1.7 KiB
C++

#include "panels/LoadingOverlay.hpp"
#include <QColor>
#include <QEvent>
#include <QLabel>
#include <QVBoxLayout>
#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