/****************************************************************************
**
** Copyright (C) 2015 The Qt Company Ltd.
** Contact: http://www.qt.io/licensing/
**
** This file is part of the QtLocation module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL3$
** 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 http://www.qt.io/terms-conditions. For further
** information use the contact form at http://www.qt.io/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 3 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 3 requirements
** will be met: https://www.gnu.org/licenses/lgpl.html.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 2.0 or later as published by the Free
** Software Foundation and appearing in the file LICENSE.GPL included in
** the packaging of this file. Please review the following information to
** ensure the GNU General Public License version 2.0 requirements will be
** met: http://www.gnu.org/licenses/gpl-2.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/

#include "qdeclarativegeomapitemgroup_p.h"
#include "qdeclarativegeomapitembase_p.h"
#include "qdeclarativegeomap_p.h"

QT_BEGIN_NAMESPACE

/*!
    \qmltype MapItemGroup
    \instantiates QDeclarativeGeoMapItemGroup
    \inqmlmodule QtLocation
    \ingroup qml-QtLocation5-maps
    \since QtLocation 5.9

    \brief The MapItemGroup type is a container for map items.

    Its purpose is to enable code modularization by allowing the usage
    of qml files containing map elements related to each other, and
    the associated bindings.

    \note The release of this API with Qt 5.9 is a Technology Preview.

    \section2 Example Usage

    The following snippet shows how to use a MapItemGroup to create a MapCircle, centered at
    the coordinate (63, -18) with a radius of 100km, filled in red, surrounded by an ondulated green border,
    both contained in a semitransparent blue circle with a MouseArea that moves the whole group.
    This group is defined in a separate file named PolygonGroup.qml:

    \code
    import QtQuick 2.4
    import QtPositioning 5.6
    import QtLocation 5.9

    MapItemGroup {
        id: itemGroup
        property alias position: mainCircle.center
        property var radius: 100 * 1000
        property var borderHeightPct : 0.3

        MapCircle {
            id: mainCircle
            center : QtPositioning.coordinate(40, 0)
            radius: itemGroup.radius * (1.0 + borderHeightPct)
            opacity: 0.05
            visible: true
            color: 'blue'

            MouseArea{
                anchors.fill: parent
                drag.target: parent
                id: maItemGroup
            }
        }

        MapCircle {
            id: groupCircle
            center: itemGroup.position
            radius: itemGroup.radius
            color: 'crimson'

            onCenterChanged: {
                groupPolyline.populateBorder();
            }
        }

        MapPolyline {
            id: groupPolyline
            line.color: 'green'
            line.width: 3

            function populateBorder() {
                groupPolyline.path = [] // clearing the path
                var waveLength = 8.0;
                var waveAmplitude = groupCircle.radius * borderHeightPct;
                for (var i=0; i <= 360; i++) {
                    var wavePhase = (i/360.0 * 2.0 * Math.PI )* waveLength
                    var waveHeight = (Math.cos(wavePhase) + 1.0) / 2.0
                    groupPolyline.addCoordinate(groupCircle.center.atDistanceAndAzimuth(groupCircle.radius + waveAmplitude * waveHeight , i))
                }
            }

            Component.onCompleted: {
                populateBorder()
            }
        }
    }
    \endcode

    PolygonGroup.qml is now a reusable component that can then be used in a Map as:

    \code
    Map {
        id: map
        PolygonGroup {
            id: polygonGroup
            position: QtPositioning.coordinate(63,-18)
        }
    }
    \endcode

    \image api-mapitemgroup.png
*/

QDeclarativeGeoMapItemGroup::QDeclarativeGeoMapItemGroup(QQuickItem *parent)
:   QQuickItem(parent), m_quickMap(nullptr)
{
    connect(this, &QQuickItem::opacityChanged,
            this, &QDeclarativeGeoMapItemGroup::mapItemOpacityChanged);
}

QDeclarativeGeoMapItemGroup::~QDeclarativeGeoMapItemGroup()
{

}

void QDeclarativeGeoMapItemGroup::setParentGroup(QDeclarativeGeoMapItemGroup &parentGroup)
{
    m_parentGroup = &parentGroup;
    connect(m_parentGroup, &QDeclarativeGeoMapItemGroup::mapItemOpacityChanged,
            this, &QDeclarativeGeoMapItemGroup::mapItemOpacityChanged);
}

void QDeclarativeGeoMapItemGroup::setQuickMap(QDeclarativeGeoMap *quickMap)
{
    if (!quickMap && m_quickMap)
        m_quickMap->disconnect(this);
    m_quickMap = quickMap;
    if (m_quickMap) {
        onMapSizeChanged();
        connect(m_quickMap, &QQuickItem::widthChanged, this, &QDeclarativeGeoMapItemGroup::onMapSizeChanged);
        connect(m_quickMap, &QQuickItem::heightChanged, this, &QDeclarativeGeoMapItemGroup::onMapSizeChanged);
    }
}

QDeclarativeGeoMap *QDeclarativeGeoMapItemGroup::quickMap() const
{
    return m_quickMap;
}

qreal QDeclarativeGeoMapItemGroup::mapItemOpacity() const
{
    return ((m_parentGroup) ? m_parentGroup->mapItemOpacity() : 1.0) * opacity();
}

void QDeclarativeGeoMapItemGroup::classBegin()
{
    QQuickItem::classBegin();
}

void QDeclarativeGeoMapItemGroup::componentComplete()
{
    QQuickItem::componentComplete();

    // In certain cases the parent won't be set via the constructor, but rather later on
    // during the instantiation/incubation process.
    // Therefore calling setParentGroup here, when the parent is known.
    // The childrenChanged use case to handle dynamically-added items is currently unsupported.
    const QList<QQuickItem *> &quickKids = childItems();
    for (QQuickItem *k : quickKids) {
        QDeclarativeGeoMapItemGroup *childGroup
                = qobject_cast<QDeclarativeGeoMapItemGroup *>(k);
        if (childGroup) {
            childGroup->setParentGroup(*this);
            continue;
        }
        QDeclarativeGeoMapItemBase *childItem
                = qobject_cast<QDeclarativeGeoMapItemBase *>(k);
        if (childItem) {
            childItem->setParentGroup(*this);
            continue;
        }
    }
}

void QDeclarativeGeoMapItemGroup::onMapSizeChanged()
{
    setWidth(m_quickMap->width());
    setHeight(m_quickMap->height());
}

QT_END_NAMESPACE
