#ifndef DROPSHADOWMGR_H
#define DROPSHADOWMGR_H

#include <QObject>
#include "idropshadowable.h"

class DropShadowMgr : public QObject
{
    Q_OBJECT
public:
    static DropShadowMgr* Instance(){return sm_pInstance;}
    ~DropShadowMgr() override {sm_pInstance = nullptr;}
public:
    //static QMap<BoxShadow, QImage> sm_cacheShadows;
    static QList<BoxShadow> sm_cacheShadows;
private:
    DropShadowMgr(QObject *parent = nullptr):QObject(parent){}
    //防拷贝, C++11
    DropShadowMgr(DropShadowMgr const&) = delete;
	DropShadowMgr& operator=(DropShadowMgr const&) = delete;
    
private:
    static DropShadowMgr* sm_pInstance;     //单例实例
public:
    virtual bool eventFilter(QObject *watched, QEvent *event) override;
    /*----------------------------------------------------------------
     * 关于释放全局单例: 
     * 一个妥善的方法是让这个类自己知道在合适的时候把自己删除; 或者说把删除自己的操作挂在系统中的某个合适的点上, 使其在恰当的时候自动被执行;
     * 程序在结束的时候, 系统会自动析构所有的全局变量;事实上, 系统也会析构所有的类的静态成员变量, 就像这些静态成员也是全局变量一样;
     * 利用这个特征, 我们可以在单例类中定义一个这样的静态成员变量, 而它的唯一工作就是在析构函数中删除单例类的实例;
    ----------------------------------------------------------------*/
private:
    class DropShadowMgrGarbo
    {
    public:
        ~DropShadowMgrGarbo()
        {  
            if(DropShadowMgr::sm_pInstance != nullptr)
                delete DropShadowMgr::sm_pInstance;
        }
    };
    static DropShadowMgrGarbo garbo;
    /*----------------------------------------------------------------*/
};

#endif // DROPSHADOWMGR_H