2007-08-07 15:09:41 +00:00
|
|
|
/* This file is part of Mapnik (c++ mapping toolkit)
|
2011-10-23 14:09:12 +00:00
|
|
|
*
|
2021-01-05 14:39:07 +00:00
|
|
|
* Copyright (C) 2021 Artem Pavlenko
|
2007-08-07 15:09:41 +00:00
|
|
|
*
|
|
|
|
* Mapnik is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
2016-01-26 09:54:42 +00:00
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
2007-08-07 15:09:41 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
#include "layerlistmodel.hpp"
|
|
|
|
#include <QIcon>
|
2021-03-08 13:19:11 +00:00
|
|
|
#include <QBrush>
|
2007-08-07 15:09:41 +00:00
|
|
|
#include <mapnik/layer.hpp>
|
|
|
|
|
|
|
|
using mapnik::Map;
|
|
|
|
|
2022-01-26 22:34:08 +00:00
|
|
|
LayerListModel::LayerListModel(std::shared_ptr<Map> map, QObject* parent)
|
|
|
|
: QAbstractListModel(parent)
|
|
|
|
, map_(map)
|
|
|
|
{}
|
2007-08-07 15:09:41 +00:00
|
|
|
|
|
|
|
int LayerListModel::rowCount(QModelIndex const&) const
|
|
|
|
{
|
2022-01-26 22:34:08 +00:00
|
|
|
if (map_)
|
|
|
|
return map_->layers().size();
|
|
|
|
return 0;
|
2007-08-07 15:09:41 +00:00
|
|
|
}
|
|
|
|
|
2021-03-08 13:19:11 +00:00
|
|
|
QVariant LayerListModel::data(QModelIndex const& index, int role) const
|
2007-08-07 15:09:41 +00:00
|
|
|
{
|
|
|
|
if (!index.isValid() || !map_)
|
2011-05-04 15:53:36 +00:00
|
|
|
return QVariant();
|
2009-12-21 13:44:56 +00:00
|
|
|
if (index.row() < 0 || index.row() >= int(map_->layers().size()))
|
2011-05-04 15:53:36 +00:00
|
|
|
return QVariant();
|
2007-08-07 15:09:41 +00:00
|
|
|
if (role == Qt::DisplayRole)
|
2011-05-04 15:53:36 +00:00
|
|
|
return QString(map_->layers().at(index.row()).name().c_str());
|
2007-08-07 15:09:41 +00:00
|
|
|
else if (role == Qt::DecorationRole)
|
|
|
|
{
|
2011-05-04 15:53:36 +00:00
|
|
|
double scale = map_->scale();
|
2012-03-12 15:39:59 +00:00
|
|
|
if (map_->layers().at(index.row()).visible(scale))
|
2011-05-04 15:53:36 +00:00
|
|
|
{
|
|
|
|
return QIcon(":/images/globe.png");
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
return QIcon(":/images/globe_bw.png");
|
|
|
|
}
|
2007-08-07 15:09:41 +00:00
|
|
|
}
|
|
|
|
else if (role == Qt::CheckStateRole)
|
|
|
|
{
|
2012-03-12 15:39:59 +00:00
|
|
|
if (map_->layers().at(index.row()).active())
|
2022-01-26 22:34:08 +00:00
|
|
|
return QVariant(Qt::Checked);
|
2011-10-23 14:09:12 +00:00
|
|
|
else
|
2022-01-26 22:34:08 +00:00
|
|
|
return QVariant(Qt::Unchecked);
|
2007-08-07 15:09:41 +00:00
|
|
|
}
|
2021-03-08 13:19:11 +00:00
|
|
|
else if (role == Qt::ForegroundRole)
|
|
|
|
{
|
|
|
|
if (map_->layers().at(index.row()).active())
|
|
|
|
return QBrush(QColor("black"));
|
|
|
|
else
|
|
|
|
return QBrush(QColor("lightgrey"));
|
|
|
|
}
|
2007-08-07 15:09:41 +00:00
|
|
|
else
|
|
|
|
{
|
2011-05-04 15:53:36 +00:00
|
|
|
return QVariant();
|
2007-08-07 15:09:41 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-01-26 22:34:08 +00:00
|
|
|
QVariant LayerListModel::headerData(int section, Qt::Orientation orientation, int role) const
|
2007-08-07 15:09:41 +00:00
|
|
|
{
|
|
|
|
if (role != Qt::DisplayRole)
|
2011-05-04 15:53:36 +00:00
|
|
|
return QVariant();
|
2011-10-23 14:09:12 +00:00
|
|
|
|
2007-08-07 15:09:41 +00:00
|
|
|
if (orientation == Qt::Horizontal)
|
2011-05-04 15:53:36 +00:00
|
|
|
return QString("TODO Column %1").arg(section);
|
2007-08-07 15:09:41 +00:00
|
|
|
else
|
2011-05-04 15:53:36 +00:00
|
|
|
return QString("TODO Row %1").arg(section);
|
2007-08-07 15:09:41 +00:00
|
|
|
}
|
|
|
|
|
2022-01-26 22:34:08 +00:00
|
|
|
bool LayerListModel::setData(const QModelIndex& index, const QVariant& value, int role)
|
2007-08-07 15:09:41 +00:00
|
|
|
{
|
2022-01-26 22:34:08 +00:00
|
|
|
if (!map_)
|
|
|
|
return false;
|
2011-10-23 14:09:12 +00:00
|
|
|
|
2022-01-26 22:34:08 +00:00
|
|
|
if (index.isValid() && role == Qt::CheckStateRole)
|
|
|
|
{
|
|
|
|
int status = value.toInt();
|
|
|
|
std::vector<mapnik::layer>& layers = const_cast<std::vector<mapnik::layer>&>(map_->layers());
|
|
|
|
layers.at(index.row()).set_active(status);
|
|
|
|
emit dataChanged(index, index);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
2007-08-07 15:09:41 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
Qt::ItemFlags LayerListModel::flags(QModelIndex const& index) const
|
|
|
|
{
|
|
|
|
Qt::ItemFlags flags = QAbstractItemModel::flags(index);
|
|
|
|
if (index.isValid())
|
2022-01-26 22:34:08 +00:00
|
|
|
flags |= Qt::ItemIsUserCheckable;
|
2007-08-07 15:09:41 +00:00
|
|
|
return flags;
|
|
|
|
}
|
|
|
|
|
2009-12-16 20:02:06 +00:00
|
|
|
boost::optional<mapnik::layer&> LayerListModel::map_layer(int i)
|
2007-08-13 09:13:58 +00:00
|
|
|
{
|
2022-01-26 22:34:08 +00:00
|
|
|
if (map_)
|
|
|
|
{
|
|
|
|
std::vector<mapnik::layer>& layers = const_cast<std::vector<mapnik::layer>&>(map_->layers());
|
|
|
|
if (i < int(layers.size()))
|
|
|
|
return boost::optional<mapnik::layer&>(layers[i]);
|
|
|
|
}
|
|
|
|
return boost::optional<mapnik::layer&>();
|
2007-08-13 09:13:58 +00:00
|
|
|
}
|