47 lines
1.7 KiB
C++
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
|