PowerModeler/source/maskManager.cpp

103 lines
3.3 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();
const QMetaObject* meta = widget->metaObject();
int methodIndex = meta->indexOfMethod("showMask()");
if(methodIndex != -1)
{
//QMetaMethod method = meta->method(methodIndex);
QMetaObject::invokeMethod(widget, "showMask", Qt::AutoConnection);
}
/*if(widget->parentWidget() == m_mainWindow && widget->isVisible() && !widget->isModal())
{
// qDebug() << "Child Dialog Order:";
// foreach (QObject* child, m_mainWindow->children())
// {
// if(qobject_cast<QDialog*>(child) || qobject_cast<QWidget*>(child))
// qDebug() << child->objectName();
// }
widget->stackUnder(m_maskLayer);
//widget->lower();
//强制刷新
//m_mainWindow->update();
//QApplication::processEvents();
}*/
}
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();
const QMetaObject* meta = widget->metaObject();
int methodIndex = meta->indexOfMethod("hideMask()");
if(methodIndex != -1)
QMetaObject::invokeMethod(widget, "hideMask", Qt::AutoConnection);
widget->setFocus();
}
//qDebug() << "remove requester: " << requester->objectName() << "requester count: " << m_activeRequests.size();
}