PowerModeler/source/maskManager.cpp

96 lines
2.9 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "maskManager.h"
#include "maskLayer.h"
#include <QEvent>
#include <QApplication>
#include <QDialog>
#include <QMetaMethod>
MaskManager* MaskManager::m_instance = nullptr;
void MaskManager::initialize(QWidget* mainWindow)
{
if(!m_instance)
m_instance = new MaskManager(mainWindow);
}
MaskManager* MaskManager::instance()
{
Q_ASSERT(m_instance);
return m_instance;
}
MaskManager::MaskManager(QWidget* mainWindow)
: QObject(mainWindow)
, m_mainWindow(mainWindow)
{
m_maskLayer = new MaskLayer(m_mainWindow);
// m_maskLayer->setStyleSheet("background:rgba(112,128,144,180);");
// m_maskLayer->hide();
m_mainWindow->installEventFilter(this); //在Qt中事件过滤会按照install的顺序反向执行过程中对于同一类型事件任何一个过滤器返回true表示事件被处理后续过滤器和事件函数不会再被调用
}
bool MaskManager::eventFilter(QObject* obj, QEvent* event)
{
if(obj == m_mainWindow && event->type() == QEvent::Resize)
{
if(m_maskLayer && m_maskLayer->isVisible())
m_maskLayer->setGeometry(m_mainWindow->rect());
}
return QObject::eventFilter(obj, event);
}
void MaskManager::showMask(QWidget* requester)
{
if(m_activeRequests.isEmpty())
{
m_maskLayer->setGeometry(m_mainWindow->rect());
m_maskLayer->show();
// foreach (QObject* child, m_mainWindow->children())
// {
// if(qobject_cast<QDialog*>(child) || qobject_cast<QWidget*>(child))
// qDebug() << child->objectName();
// }
}
else
{
QWidget* widget = m_activeRequests.last();
if(!widget->windowFlags().testFlag(Qt::Dialog))
{
const QMetaObject* meta = widget->metaObject();
int methodIndex = meta->indexOfMethod("showMask()");
if(methodIndex != -1)
{
//QMetaMethod method = meta->method(methodIndex);
QMetaObject::invokeMethod(widget, "showMask", Qt::AutoConnection);
}
}
else
widget->lower();
}
m_activeRequests.appendUnique(requester);
//qDebug() << "append requester: " << requester->objectName() << "requester count: " << m_activeRequests.size();
}
void MaskManager::hideMask(QWidget* requester)
{
m_activeRequests.remove(requester);
if(m_activeRequests.isEmpty())
m_maskLayer->hide();
else
{
QWidget* widget = m_activeRequests.last();
if(!widget->windowFlags().testFlag(Qt::Dialog))
{
const QMetaObject* meta = widget->metaObject();
int methodIndex = meta->indexOfMethod("hideMask()");
if(methodIndex != -1)
QMetaObject::invokeMethod(widget, "hideMask", Qt::AutoConnection);
}
else
widget->raise();
}
//qDebug() << "remove requester: " << requester->objectName() << "requester count: " << m_activeRequests.size();
}