167 lines
4.6 KiB
C++
167 lines
4.6 KiB
C++
|
// vim: set tabstop=4 shiftwidth=4 expandtab:
|
||
|
/*
|
||
|
Gwenview: an image viewer
|
||
|
Copyright 2007 Aurélien Gâteau <agateau@kde.org>
|
||
|
|
||
|
This program 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 (at your option) 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
|
||
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||
|
|
||
|
*/
|
||
|
// Self
|
||
|
#include "imagemetainfodialog.h"
|
||
|
|
||
|
// Qt
|
||
|
#include <QApplication>
|
||
|
#include <QDialogButtonBox>
|
||
|
#include <QHeaderView>
|
||
|
#include <QPainter>
|
||
|
#include <QPushButton>
|
||
|
#include <QStyledItemDelegate>
|
||
|
#include <QTreeView>
|
||
|
#include <QVBoxLayout>
|
||
|
|
||
|
// KF
|
||
|
#include <KLocalizedString>
|
||
|
|
||
|
// STL
|
||
|
#include <memory>
|
||
|
|
||
|
// Local
|
||
|
#include <lib/preferredimagemetainfomodel.h>
|
||
|
|
||
|
namespace Gwenview
|
||
|
{
|
||
|
class MetaInfoDelegate : public QStyledItemDelegate
|
||
|
{
|
||
|
public:
|
||
|
MetaInfoDelegate(QObject *parent)
|
||
|
: QStyledItemDelegate(parent)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
protected:
|
||
|
void paint(QPainter *painter, const QStyleOptionViewItem &_option, const QModelIndex &index) const override
|
||
|
{
|
||
|
QStyleOptionViewItem option = _option;
|
||
|
if (!index.parent().isValid()) {
|
||
|
option.displayAlignment = Qt::AlignCenter | Qt::AlignBottom;
|
||
|
option.font.setBold(true);
|
||
|
}
|
||
|
QStyledItemDelegate::paint(painter, option, index);
|
||
|
if (!index.parent().isValid()) {
|
||
|
painter->drawLine(option.rect.bottomLeft(), option.rect.bottomRight());
|
||
|
}
|
||
|
}
|
||
|
|
||
|
QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override
|
||
|
{
|
||
|
QSize sh = QStyledItemDelegate::sizeHint(option, index);
|
||
|
if (!index.parent().isValid()) {
|
||
|
sh.setHeight(sh.height() * 3 / 2);
|
||
|
}
|
||
|
return sh;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* A tree view which is always fully expanded
|
||
|
*/
|
||
|
class ExpandedTreeView : public QTreeView
|
||
|
{
|
||
|
public:
|
||
|
explicit ExpandedTreeView(QWidget *parent)
|
||
|
: QTreeView(parent)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
protected:
|
||
|
void rowsInserted(const QModelIndex &parent, int start, int end) override
|
||
|
{
|
||
|
QTreeView::rowsInserted(parent, start, end);
|
||
|
if (!parent.isValid()) {
|
||
|
for (int row = start; row <= end; ++row) {
|
||
|
setUpRootIndex(row);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void reset() override
|
||
|
{
|
||
|
QTreeView::reset();
|
||
|
if (model()) {
|
||
|
for (int row = 0; row < model()->rowCount(); ++row) {
|
||
|
setUpRootIndex(row);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private:
|
||
|
void setUpRootIndex(int row)
|
||
|
{
|
||
|
expand(model()->index(row, 0));
|
||
|
setFirstColumnSpanned(row, QModelIndex(), true);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
struct ImageMetaInfoDialogPrivate {
|
||
|
std::unique_ptr<PreferredImageMetaInfoModel> mModel;
|
||
|
QTreeView *mTreeView;
|
||
|
};
|
||
|
|
||
|
ImageMetaInfoDialog::ImageMetaInfoDialog(QWidget *parent)
|
||
|
: QDialog(parent)
|
||
|
, d(new ImageMetaInfoDialogPrivate)
|
||
|
{
|
||
|
d->mTreeView = new ExpandedTreeView(this);
|
||
|
d->mTreeView->setRootIsDecorated(false);
|
||
|
d->mTreeView->setIndentation(0);
|
||
|
d->mTreeView->setItemDelegate(new MetaInfoDelegate(d->mTreeView));
|
||
|
setWindowTitle(i18nc("@title:window", "Image Information"));
|
||
|
|
||
|
setLayout(new QVBoxLayout);
|
||
|
layout()->addWidget(d->mTreeView);
|
||
|
auto buttonBox = new QDialogButtonBox(QDialogButtonBox::Close);
|
||
|
layout()->addWidget(buttonBox);
|
||
|
connect(buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept);
|
||
|
connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject);
|
||
|
}
|
||
|
|
||
|
ImageMetaInfoDialog::~ImageMetaInfoDialog()
|
||
|
{
|
||
|
delete d;
|
||
|
}
|
||
|
|
||
|
void ImageMetaInfoDialog::setMetaInfo(ImageMetaInfoModel *model, const QStringList &list)
|
||
|
{
|
||
|
if (model) {
|
||
|
d->mModel = std::make_unique<PreferredImageMetaInfoModel>(model, list);
|
||
|
connect(d->mModel.get(), &PreferredImageMetaInfoModel::preferredMetaInfoKeyListChanged, this, &ImageMetaInfoDialog::preferredMetaInfoKeyListChanged);
|
||
|
} else {
|
||
|
d->mModel.reset(nullptr);
|
||
|
}
|
||
|
d->mTreeView->setModel(d->mModel.get());
|
||
|
|
||
|
const int marginSize = QApplication::style()->pixelMetric(QStyle::PM_LayoutLeftMargin);
|
||
|
d->mTreeView->header()->resizeSection(0, sizeHint().width() / 2 - marginSize * 2);
|
||
|
}
|
||
|
|
||
|
QSize ImageMetaInfoDialog::sizeHint() const
|
||
|
{
|
||
|
return QSize(400, 300);
|
||
|
}
|
||
|
|
||
|
} // namespace
|
||
|
|
||
|
#include "moc_imagemetainfodialog.cpp"
|