#include "FramelessDelegate.h"

#include <QEvent>

#include "FrameTitleBar.h"


FramelessDelegate::FramelessDelegate(QWidget* parent)
    : QObject(parent)
    , mainWidget_(parent) {
    if (nullptr != mainWidget_) {
        mainWidget_->installEventFilter(this);
    }
}

FramelessDelegate::~FramelessDelegate() {
    if (nullptr != titleBar_) {
        titleBar_->removeEventFilter(this);
    }

    if (nullptr != mainWidget_) {
        mainWidget_->removeEventFilter(this);
    }
}

#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
bool FramelessDelegate::nativeEvent(const QByteArray& eventType, void* message, qintptr* result) {
#else 
bool FramelessDelegate::nativeEvent(const QByteArray & eventType, void* message, long* result) {
#endif
    return false;
}

void FramelessDelegate::SetTitleBar(FrameTitleBar* titleBar) {
    if (nullptr == titleBar || titleBar_ == titleBar) {
        return;
    }
    if (nullptr != titleBar_) {
        titleBar_->removeEventFilter(this);
        titleBar_->deleteLater();
    }
    titleBar_ = titleBar;

    if (nullptr != titleBar_) {
        titleBar_->installEventFilter(this);
    }
}

bool FramelessDelegate::eventFilter(QObject* watched, QEvent* event) {
    if (nullptr != mainWidget_ && mainWidget_ == watched) {
        if (QEvent::Show == event->type()) {
            OnShow();
        } else if (QEvent::Hide == event->type()) {
            OnHide();
        } else if (QEvent::Close == event->type()) {
            OnClose();
        } else if (QEvent::WinIdChange == event->type()) {
            isFirstShow_ = true;
        }
//#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
        else if (QEvent::ScreenChangeInternal == event->type()) {
            OnScreenChangeInternaal();
            return false;
        }
//#endif
    } else if (nullptr != titleBar_ && titleBar_ == watched) {
        if (QEvent::Close == event->type() || QEvent::Hide == event->type()) {
            RemoveMoveBar(titleBar_);
        } else if (QEvent::Show == event->type()) {
            AddMoveBar(titleBar_);
        }
    }
    
    return QObject::eventFilter(watched, event);
}

void FramelessDelegate::RemoveMoveBar(QWidget* moveWidget) {
    moveBars_.removeOne(moveWidget);
}