/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the test suite of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
** 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.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/

#include <QGraphicsView>
#include <QGraphicsRectItem>
#include <QDesktopWidget>
#include <QApplication>
#include <QDebug>

class DesktopView : public QGraphicsView
{
#if QT_DEPRECATED_SINCE(5, 11)
    Q_OBJECT
public:
    DesktopView()
        : that(0)
    {
        scene = new QGraphicsScene;
        setScene(scene);

        QDesktopWidget *desktop = QApplication::desktop();
        connect(desktop, SIGNAL(resized(int)), this, SLOT(updateScene()));
        connect(desktop, SIGNAL(resized(int)), this, SLOT(desktopResized(int)));
        connect(desktop, SIGNAL(workAreaResized(int)), this, SLOT(updateScene()));
        connect(desktop, SIGNAL(workAreaResized(int)), this, SLOT(desktopWorkAreaResized(int)));
        connect(desktop, SIGNAL(screenCountChanged(int)), this, SLOT(updateScene()));
        connect(desktop, SIGNAL(screenCountChanged(int)), this, SLOT(desktopScreenCountChanged(int)));

        updateScene();

        QTransform transform;
        transform.scale(0.25, 0.25);
        setTransform(transform);

        setBackgroundBrush(Qt::darkGray);
        desktopScreenCountChanged(-1);
    }

protected:
    void moveEvent(QMoveEvent *e)
    {
        if (that) {
            that->setRect(appRect());
            scene->update();
        }
        QGraphicsView::moveEvent(e);
    }
    void resizeEvent(QResizeEvent *e)
    {
        if (that) {
            that->setRect(appRect());
        }
        QGraphicsView::resizeEvent(e);
    }

private slots:
    void updateScene()
    {
        scene->clear();

        const QDesktopWidget *desktop = QApplication::desktop();
        const bool isVirtualDesktop = desktop->isVirtualDesktop();
        const int homeScreen = desktop->screenNumber(this);

        QRect sceneRect;
        int screenCount = desktop->screenCount();
        for (int s = 0; s < screenCount; ++s) {
            const bool isPrimary = desktop->primaryScreen() == s;
            const QRect screenRect = desktop->screenGeometry(s);
            const QRect workRect = desktop->availableGeometry(s);
            const QBrush fillBrush = palette().brush(isPrimary ? QPalette::Active : QPalette::Inactive, QPalette::Highlight);
            QGraphicsRectItem *screen = new QGraphicsRectItem(0, 0, screenRect.width(), screenRect.height());

            if (isVirtualDesktop) {
                thatRoot = QPoint();
                screen->setPos(screenRect.x(), screenRect.y());
            } else {
               // for non-virtual desktops we assume that screens are
               // simply next to each other
                if (s)
                    screen->setPos(sceneRect.right(), 0);
                if (s == homeScreen)
                    thatRoot = screen->pos().toPoint();
            }

            screen->setBrush(fillBrush);
            scene->addItem(screen);
            sceneRect.setLeft(qMin(sceneRect.left(), screenRect.left()));
            sceneRect.setRight(qMax(sceneRect.right(), screenRect.right()));
            sceneRect.setTop(qMin(sceneRect.top(), screenRect.top()));
            sceneRect.setBottom(qMax(sceneRect.bottom(), screenRect.bottom()));

            QGraphicsRectItem *workArea = new QGraphicsRectItem(screen);
            workArea->setRect(0, 0, workRect.width(), workRect.height());
            workArea->setPos(workRect.x() - screenRect.x(), workRect.y() - screenRect.y());
            workArea->setBrush(Qt::white);

            QGraphicsSimpleTextItem *screenNumber = new QGraphicsSimpleTextItem(workArea);
            screenNumber->setText(QString::number(s));
            screenNumber->setPen(QPen(Qt::black, 1));
            screenNumber->setBrush(fillBrush);
            screenNumber->setFont(QFont("Arial Black", 18));
            screenNumber->setTransform(QTransform().scale(10, 10));
            screenNumber->setTransformOriginPoint(screenNumber->boundingRect().center());
            QSizeF center = (workRect.size() - screenNumber->boundingRect().size()) / 2;
            screenNumber->setPos(center.width(), center.height());

            screen->show();
            screen->setZValue(1);
        }

        if (isVirtualDesktop) {
            QGraphicsRectItem *virtualDesktop = new QGraphicsRectItem;
            virtualDesktop->setRect(sceneRect);
            virtualDesktop->setPen(QPen(Qt::black));
            virtualDesktop->setBrush(Qt::DiagCrossPattern);
            scene->addItem(virtualDesktop);
            virtualDesktop->setZValue(-1);
            virtualDesktop->show();
        }

        that = new QGraphicsRectItem;
        that->setBrush(Qt::red);
        that->setOpacity(0.5);
        that->setZValue(2);
        that->setRect(appRect());
        that->show();
        scene->addItem(that);

        scene->setSceneRect(sceneRect);
        scene->update();
    }

    QRect appRect() const
    {
        QRect rect = frameGeometry();
        if (!QApplication::desktop()->isVirtualDesktop()) {
            rect.translate(thatRoot);
        }
        return rect;
    }

    void desktopResized(int screen)
    {
        qDebug() << "Screen was resized: " << screen
                << ", new size =" << QApplication::desktop()->screenGeometry(screen);
    }
    void desktopWorkAreaResized(int screen)
    {
        qDebug() << "Screen workarea was resized: " << screen
                << ", new size =" << QApplication::desktop()->availableGeometry(screen);
    }
    void desktopScreenCountChanged(int screenCount)
    {
        QDesktopWidget *desktop = QApplication::desktop();
        qDebug() << "";
        if (screenCount != -1) {
            qDebug() << "Screen count was changed to " << screenCount;
        } else {
            screenCount = desktop->screenCount();
            qDebug() << "Screen count: " << screenCount;
        }
        for (int i = 0; i < screenCount; ++i) {
            qDebug() << "  #" << i << ": geometry =" << desktop->screenGeometry(i)
                    << "; available geometry =" << desktop->availableGeometry(i);
        }
        qDebug() << "";
    }

private:
    QGraphicsScene *scene;
    QGraphicsRectItem *that;
    QPoint thatRoot;
#endif
};

#include "main.moc"

int main(int argc, char **argv)
{
    QApplication app(argc, argv);

    DesktopView view;
    view.show();

    return app.exec();
}
