/**************************************************************************** ** ** 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 "qdeclarativelocationtestmodel_p.h" #include #include #include QT_BEGIN_NAMESPACE QDeclarativeLocationTestModel::QDeclarativeLocationTestModel(QObject *parent): QAbstractListModel(parent), delay_(0), datacount_(0), componentCompleted_(false), crazyLevel_(0), crazyMode_(false) { timer_.setSingleShot(true); connect(&timer_, SIGNAL(timeout()), this, SLOT(timerFired())); } QDeclarativeLocationTestModel::~QDeclarativeLocationTestModel() { if (timer_.isActive()) timer_.stop(); if (!dataobjects_.isEmpty()) { qDeleteAll(dataobjects_); dataobjects_.clear(); } } void QDeclarativeLocationTestModel::timerFired() { //qDebug() << "timer fired" ; repopulate(); if (crazyMode_) { int delay = (QRandomGenerator::global()->bounded(uint(INT_MAX) + 1) % crazyLevel_); // writing software is exact science delay = qMax(1000, delay); // 3 ms at minimum qDebug() << "starting timer with : " << delay; timer_.start(delay); } } void QDeclarativeLocationTestModel::componentComplete() { componentCompleted_ = true; scheduleRepopulation(); } int QDeclarativeLocationTestModel::datacount() const { return datacount_; } void QDeclarativeLocationTestModel::setDatacount(int datacount) { if (datacount_ == datacount) return; datacount_ = datacount; emit datacountChanged(); scheduleRepopulation(); } int QDeclarativeLocationTestModel::delay() const { return delay_; } void QDeclarativeLocationTestModel::setDelay(int delay) { if (delay_ == delay) return; delay_ = delay; emit delayChanged(); } QString QDeclarativeLocationTestModel::datatype() const { return datatype_; } void QDeclarativeLocationTestModel::setDatatype(QString datatype) { if (datatype_ == datatype) return; datatype_ = datatype; emit datatypeChanged(); scheduleRepopulation(); } int QDeclarativeLocationTestModel::crazyLevel() const { return crazyLevel_; } void QDeclarativeLocationTestModel::setCrazyLevel(int level) { if (level == crazyLevel_) return; crazyLevel_ = level; reset(); scheduleRepopulation(); emit crazyLevelChanged(); } bool QDeclarativeLocationTestModel::crazyMode() const { return crazyMode_; } void QDeclarativeLocationTestModel::setCrazyMode(bool mode) { if (mode == crazyMode_) return; crazyMode_ = mode; //if (!crazyMode_) //reset(); //else if (crazyMode_) scheduleRepopulation(); emit crazyModeChanged(); } // only coordinate datatype for now to get started with, // refactor if more usecases for the model emerge. void QDeclarativeLocationTestModel::repopulate() { double latitude = -30; double longitude = 153; beginResetModel(); if (!dataobjects_.isEmpty()) { qDeleteAll(dataobjects_); dataobjects_.clear(); } int datacount = datacount_; if (crazyMode_) datacount = QRandomGenerator::global()->bounded(datacount_); for (int i = 0; i < datacount; ++i) { DataObject* dataobject = new DataObject; dataobject->coordinate_ = QGeoCoordinate(latitude, longitude); dataobjects_.append(dataobject); longitude -= 0.2; latitude += 0.2; } endResetModel(); } void QDeclarativeLocationTestModel::update() { scheduleRepopulation(); } void QDeclarativeLocationTestModel::reset() { if (timer_.isActive()) timer_.stop(); beginResetModel(); if (!dataobjects_.isEmpty()) { qDeleteAll(dataobjects_); dataobjects_.clear(); } endResetModel(); } void QDeclarativeLocationTestModel::scheduleRepopulation() { if (!componentCompleted_) return; if (datacount_ <= 0) return; if (timer_.isActive()) timer_.stop(); if (crazyMode_) { // start generating arbitrary amount of data at arbitrary intervals int delay = QRandomGenerator::global()->bounded(crazyLevel_); // writing software is exact science delay = qMax(3, delay); // 3 ms at minimum qDebug() << "starting timer with : " << delay; timer_.start(delay); } else { // just update if (delay_ > 0) timer_.start(delay_); else repopulate(); } } int QDeclarativeLocationTestModel::rowCount(const QModelIndex& parent) const { Q_UNUSED(parent); return dataobjects_.count(); } // Returns the stored under the given role for the item referred to by the index. QVariant QDeclarativeLocationTestModel::data(const QModelIndex& index, int role) const { switch (role) { case TestDataRole: if (dataobjects_.at(index.row())) { return QVariant::fromValue(qobject_cast(dataobjects_.at(index.row()))); } break; } return QVariant(); } QHash QDeclarativeLocationTestModel::roleNames() const { QHash roles = QAbstractListModel::roleNames(); roles.insert(TestDataRole, "modeldata"); return roles; } QT_END_NAMESPACE