87 lines
1.7 KiB
C++
87 lines
1.7 KiB
C++
#ifndef MASKMANAGER_H
|
|
#define MASKMANAGER_H
|
|
|
|
#include <QWidget>
|
|
#include <QSet>
|
|
|
|
template <typename T>
|
|
class UniqueList
|
|
{
|
|
private:
|
|
QList<T> m_list;
|
|
QSet<T> m_set;
|
|
|
|
public:
|
|
const QList<T>& getList() const { return m_list; }
|
|
|
|
bool isEmpty() { return m_list.isEmpty(); }
|
|
|
|
int size() const { return m_list.size(); }
|
|
|
|
void appendUnique(const T& value)
|
|
{
|
|
if(m_set.contains(value))
|
|
return;
|
|
|
|
m_set.insert(value);
|
|
m_list.append(value);
|
|
}
|
|
void remove(const T& value)
|
|
{
|
|
if(m_set.remove(value))
|
|
{
|
|
m_list.removeOne(value);
|
|
}
|
|
}
|
|
|
|
T& first()
|
|
{
|
|
if(m_list.isEmpty())
|
|
throw std::out_of_range("UniqueList is empty");
|
|
|
|
return m_list.first();
|
|
}
|
|
T& last()
|
|
{
|
|
if(m_list.isEmpty())
|
|
throw std::out_of_range("UniqueList is empty");
|
|
|
|
return m_list.last();
|
|
}
|
|
T& at(int index)
|
|
{
|
|
if (index < 0 || index >= m_list.size())
|
|
throw std::out_of_range("Index out of range");
|
|
|
|
return m_list[index];
|
|
}
|
|
|
|
T& operator[](int index) { return at(index); }
|
|
};
|
|
|
|
class MaskLayer;
|
|
class MaskManager : public QObject
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
//初始化时强制关联窗口
|
|
static void initialize(QWidget* mainWindow);
|
|
static MaskManager* instance();
|
|
|
|
void showMask(QWidget* requester);
|
|
void hideMask(QWidget* requester);
|
|
|
|
protected:
|
|
bool eventFilter(QObject* obj, QEvent* event) override;
|
|
|
|
private:
|
|
explicit MaskManager(QWidget* mainWindow);
|
|
static MaskManager* m_instance;
|
|
QWidget* m_mainWindow;
|
|
QWidget* m_maskLayer;
|
|
UniqueList<QWidget*> m_activeRequests;
|
|
};
|
|
|
|
#endif //MASKMANAGER_H
|