/**************************************************************************** ** ** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). ** Contact: http://www.qt-project.org/legal ** ** This file is part of the examples of the Qt Mobility Components. ** ** $QT_BEGIN_LICENSE:BSD$ ** 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 Digia Plc and its Subsidiary(-ies) 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$ ** ****************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include "landmarkfilterdialog.h" LandmarkFilterDialog::LandmarkFilterDialog(QLandmarkFetchRequest *fetchRequest, QLandmarkManager * manager, QWidget *parent, Qt::WindowFlags flags) : QDialog(parent, flags), manager(manager), fetchRequest(fetchRequest) { setupUi(this); connect(filterAllCheckBox,SIGNAL(stateChanged(int)), this,SLOT(filterAllCheckBoxStateChanged(int))); connect(filterNameCheckBox, SIGNAL(stateChanged(int)), this, SLOT(otherFiltersCheckBoxStateChanged(int))); connect(filterCategoryCheckBox, SIGNAL(stateChanged(int)), this, SLOT(otherFiltersCheckBoxStateChanged(int))); connect(filterBoxCheckBox, SIGNAL(stateChanged(int)), this, SLOT(otherFiltersCheckBoxStateChanged(int))); connect(filterProximityCheckBox, SIGNAL(stateChanged(int)), this, SLOT(otherFiltersCheckBoxStateChanged(int))); connect(manager, SIGNAL(categoriesRemoved(QList)), this, SLOT(categoryRemoved(QList))); filterAllCheckBox->setCheckState(Qt::Checked); QButtonGroup * buttonGroup = new QButtonGroup(this); buttonGroup->addButton(startsWithRadioButton); buttonGroup->addButton(containsRadioButton); } LandmarkFilterDialog::~LandmarkFilterDialog() { } void LandmarkFilterDialog::accept() { if (!setupFetchRequest()) return; QDialog::accept(); } void LandmarkFilterDialog::reject() { QDialog::reject(); } void LandmarkFilterDialog::filterAllCheckBoxStateChanged(int state) { if (state == Qt::Checked) { filterNameCheckBox->setChecked(false); filterCategoryCheckBox->setChecked(false); filterBoxCheckBox->setChecked(false); filterProximityCheckBox->setChecked(false); } else { if (!filterNameCheckBox->isChecked() && !filterCategoryCheckBox->isChecked() && !filterBoxCheckBox->isChecked() && !filterProximityCheckBox->isChecked()) { filterAllCheckBox->setCheckState(Qt::Checked); } } } void LandmarkFilterDialog::otherFiltersCheckBoxStateChanged(int state) { if (state == Qt::Checked) { if (sender() == this->filterCategoryCheckBox) { if (this->categoryComboBox->count() == 0) { filterCategoryCheckBox->setCheckState(Qt::Unchecked); return; } } filterAllCheckBox->setCheckState(Qt::Unchecked); } else { if (!filterNameCheckBox->isChecked() && !filterCategoryCheckBox->isChecked() && !filterBoxCheckBox->isChecked() && !filterProximityCheckBox->isChecked()) { filterAllCheckBox->setCheckState(Qt::Checked); } } } void LandmarkFilterDialog::showEvent(QShowEvent *showEvent) { QList categories = manager->categories(); categoryComboBox->clear(); for (int i=0; i < categories.count(); ++i) { QLandmarkCategory category = categories.at(i); QVariant var; var.setValue(category.categoryId()); categoryComboBox->addItem(category.name(),var); if (oldCategoryId.isValid() && oldCategoryId == category.categoryId()) { categoryComboBox->setCurrentIndex(i); } } QDialog::showEvent(showEvent); } void LandmarkFilterDialog::categoryRemoved(const QList &categoryIds) { if (categoryIds.contains(oldCategoryId)) { filterAllCheckBox->setCheckState(Qt::Checked); setupFetchRequest(); emit doFetchAll(); } } bool LandmarkFilterDialog::setupFetchRequest() { if (filterAllCheckBox->checkState() == Qt::Checked) { fetchRequest->setFilter(QLandmarkFilter()); fetchRequest->setSorting(QLandmarkNameSort()); } else { QLandmarkIntersectionFilter filter; QLandmarkSortOrder sortOrder = QLandmarkNameSort(); if (filterNameCheckBox->checkState() == Qt::Checked) { QLandmarkNameFilter nameFilter; nameFilter.setName(nameLineEdit->text()); if (startsWithRadioButton->isChecked()) nameFilter.setMatchFlags(QLandmarkFilter::MatchStartsWith); else nameFilter.setMatchFlags(QLandmarkFilter::MatchContains); filter.append(nameFilter); } if (filterCategoryCheckBox->checkState() == Qt::Checked) { QLandmarkCategoryFilter categoryFilter; if (categoryComboBox->count() > 0) { oldCategoryId = categoryComboBox->itemData(categoryComboBox->currentIndex()) .value(); categoryFilter.setCategoryId(oldCategoryId); } filter.append(categoryFilter); } if (filterBoxCheckBox->checkState() == Qt::Checked) { if (!isValidLatitude(boxTopLeftLatitudeLineEdit->text())) { QMessageBox::warning(this,"Warning", "Top left latitude is invalid. Must be between -90 and 90 (not inclusive)", QMessageBox::Ok, QMessageBox::NoButton); return false; } else if (!isValidLongitude(boxTopLeftLongitudeLineEdit->text())) { QMessageBox::warning(this,"Warning", "Top left longitude is invalid. Must be between -180 and 180 (inclusive) ", QMessageBox::Ok, QMessageBox::NoButton); return false; } else if (!isValidLatitude(boxBottomRightLatitudeLineEdit->text())) { QMessageBox::warning(this,"Warning", "Bottom right latitude is invalid. (Must be between -90 and 90 (not inclusive)", QMessageBox::Ok, QMessageBox::NoButton); return false; } else if (!isValidLongitude(boxBottomRightLongitudeLineEdit->text())) { QMessageBox::warning(this,"Warning", "Bottom right longitude is invalid. (Must be between -180 and 180 (inclusive)", QMessageBox::Ok, QMessageBox::NoButton); return false; } QGeoCoordinate topLeft; topLeft.setLatitude(boxTopLeftLatitudeLineEdit->text().toDouble()); topLeft.setLongitude(boxTopLeftLongitudeLineEdit->text().toDouble()); QGeoCoordinate bottomRight; bottomRight.setLatitude(boxBottomRightLatitudeLineEdit->text().toDouble()); bottomRight.setLongitude(boxBottomRightLongitudeLineEdit->text().toDouble()); QGeoBoundingBox box; box.setTopLeft(topLeft); box.setBottomRight(bottomRight); QLandmarkBoxFilter boxFilter; boxFilter.setBoundingBox(box); filter.append(boxFilter); } if (filterProximityCheckBox->checkState() == Qt::Checked) { if (!isValidLatitude(proximityLatitudeLineEdit->text())) { QMessageBox::warning(this,"Warning", "Proximity latitude is invalid. It must be between -90 and 90 (not inclusive)", QMessageBox::Ok, QMessageBox::NoButton); return false; } else if (!isValidLongitude(proximityLongitudeLineEdit->text())) { QMessageBox::warning(this,"Warning", "Proximity longitude is invalid. It must be between -180 and 180 (inclusive) ", QMessageBox::Ok, QMessageBox::NoButton); return false; } bool ok; qreal radius = radiusLineEdit->text().toDouble(&ok); if (!ok) { QMessageBox::warning(this,"Warning", "Proximity radius is invalid. It must be a number", QMessageBox::Ok, QMessageBox::NoButton); return false; } QLandmarkProximityFilter proximityFilter; QGeoCoordinate center; center.setLatitude(proximityLatitudeLineEdit->text().toDouble()); center.setLongitude(proximityLongitudeLineEdit->text().toDouble()); proximityFilter.setCenter(center); proximityFilter.setRadius(radiusLineEdit->text().toDouble()); filter.append(proximityFilter); sortOrder = QLandmarkSortOrder(); } fetchRequest->setFilter(filter); fetchRequest->setSorting(sortOrder); } return true; } bool LandmarkFilterDialog::isValidLatitude(const QString &latitude) { bool ok; double lat = latitude.toDouble(&ok); if (!ok) return false; if (-90.0 < lat && lat < 90.0) return true; else return false; } bool LandmarkFilterDialog::isValidLongitude(const QString &longitude) { bool ok; double lon = longitude.toDouble(&ok); if (!ok) return false; if (-180.0 <= lon && lon <= 180.0) return true; else return false; }