############################################################################
##
## Copyright (C) 2016 The Qt Company Ltd.
## Contact: https://www.qt.io/licensing/
##
## This file is part of the examples of Qt for Python.
##
## $QT_BEGIN_LICENSE:BSD$
## Commercial License Usage
## Licensees holding valid commercial Qt licenses may use this file in
## accordance with the commercial license agreement provided with the
## Software or, alternatively, in accordance with the terms contained in
## a written agreement between you and The Qt Company. For licensing terms
## and conditions see https://www.qt.io/terms-conditions. For further
## information use the contact form at https://www.qt.io/contact-us.
##
## BSD License Usage
## Alternatively, you may use this file under the terms of the BSD license
## as follows:
##
## "Redistribution and use in source and binary forms, with or without
## modification, are permitted provided that the following conditions are
## met:
##   * Redistributions of source code must retain the above copyright
##     notice, this list of conditions and the following disclaimer.
##   * Redistributions in binary form must reproduce the above copyright
##     notice, this list of conditions and the following disclaimer in
##     the documentation and/or other materials provided with the
##     distribution.
##   * Neither the name of The Qt Company Ltd nor the names of its
##     contributors may be used to endorse or promote products derived
##     from this software without specific prior written permission.
##
##
## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
##
## $QT_END_LICENSE$
##
############################################################################

from PySide6.QtGui import *


DropArea.DropArea(QWidget *parent)
    : QLabel(parent)
{
    setMinimumSize(200, 200)
    setFrameStyle(QFrame.Sunken | QFrame::StyledPanel)
    setAlignment(Qt.AlignCenter)
    setAcceptDrops(True)
    setAutoFillBackground(True)
    clear()
}

void DropArea.dragEnterEvent(QDragEnterEvent *event)
{
    setText(tr("<drop content>"))
    setBackgroundRole(QPalette.Highlight)

    event.acceptProposedAction()
    emit changed(event.mimeData())
}

void DropArea.dragMoveEvent(QDragMoveEvent *event)
{
    event.acceptProposedAction()
}

void DropArea.dropEvent(QDropEvent *event)
{
    const QMimeData *mimeData = event.mimeData()

    if (mimeData.hasImage()) {
        setPixmap(qvariant_cast<QPixmap>(mimeData.imageData()))
    } else if (mimeData.hasHtml()) {
        setText(mimeData.html())
        setTextFormat(Qt.RichText)
    } else if (mimeData.hasText()) {
        setText(mimeData.text())
        setTextFormat(Qt.PlainText)
    } else {
        setText(tr("Cannot display data"))
    }

    setBackgroundRole(QPalette.Dark)
    event.acceptProposedAction()
}

//![0]
def paste(self):
    clipboard = QGuiApplication.clipboard()
    mimeData = clipboard.mimeData()

    if mimeData.hasImage():
        setPixmap(mimeData.imageData())
    elif mimeData.hasHtml():
        setText(mimeData.html())
        setTextFormat(Qt.RichText)
    elif (mimeData.hasText():
        setText(mimeData.text())
        setTextFormat(Qt.PlainText)
    else:
        setText(tr("Cannot display data"))
//![0]

    emit changed(mimeData)
    setBackgroundRole(QPalette.Dark)
    //event.acceptProposedAction()
}

void DropArea.dragLeaveEvent(QDragLeaveEvent *event)
{
    clear()
    event.accept()
}

void DropArea.clear()
{
    setText(tr("<drop content>"))
    setBackgroundRole(QPalette.Dark)

    emit changed()
}

QPixmap DropArea.extractPixmap(const QByteArray &data, const QString &format)
{
    QList<QByteArray> imageFormats = QImageReader.supportedImageFormats()
    QPixmap pixmap

    foreach (QByteArray imageFormat, imageFormats) {
        if (format.mid(6) == QString(imageFormat)) {
            pixmap.loadFromData(data, imageFormat)
            break
        }
    }
    return pixmap
}
