167 lines
4.6 KiB
C++
Raw Normal View History

2024-06-29 11:52:32 +06:00
// 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"