File indexing completed on 2025-04-27 03:58:26

0001 /* ============================================================
0002  *
0003  * This file is a part of digiKam project
0004  * https://www.digikam.org
0005  *
0006  * Date        : 2010-08-03
0007  * Description : widget displaying all image versions in a list
0008  *
0009  * SPDX-FileCopyrightText: 2010 by Martin Klapetek <martin dot klapetek at gmail dot com>
0010  *
0011  * SPDX-License-Identifier: GPL-2.0-or-later
0012  *
0013  * ============================================================ */
0014 
0015 #include "versionswidget.h"
0016 
0017 // Qt includes
0018 
0019 #include <QButtonGroup>
0020 #include <QGridLayout>
0021 #include <QHBoxLayout>
0022 #include <QLabel>
0023 #include <QPaintEvent>
0024 #include <QToolButton>
0025 #include <QTreeView>
0026 #include <QIcon>
0027 
0028 // KDE includes
0029 
0030 #include <kconfiggroup.h>
0031 #include <klocalizedstring.h>
0032 
0033 // Local includes
0034 
0035 #include "digikam_debug.h"
0036 #include "applicationsettings.h"
0037 #include "dimagehistory.h"
0038 #include "itemhistorygraphmodel.h"
0039 #include "iteminfo.h"
0040 #include "itemlistmodel.h"
0041 #include "thumbnailloadthread.h"
0042 #include "versionsdelegate.h"
0043 #include "versionmanagersettings.h"
0044 #include "versionsoverlays.h"
0045 #include "versionstreeview.h"
0046 
0047 namespace Digikam
0048 {
0049 
0050 class Q_DECL_HIDDEN VersionsWidget::Private
0051 {
0052 public:
0053 
0054     explicit Private()
0055         : view              (nullptr),
0056           model             (nullptr),
0057           delegate          (nullptr),
0058           showHideOverlay   (nullptr),
0059           viewButtonGroup   (nullptr),
0060           listModeButton    (nullptr),
0061           treeModeButton    (nullptr),
0062           combinedModeButton(nullptr)
0063     {
0064     }
0065 
0066     VersionsTreeView*        view;
0067     ItemHistoryGraphModel*   model;
0068     VersionsDelegate*        delegate;
0069 
0070     ShowHideVersionsOverlay* showHideOverlay;
0071 
0072     QButtonGroup*            viewButtonGroup;
0073     QToolButton*             listModeButton;
0074     QToolButton*             treeModeButton;
0075     QToolButton*             combinedModeButton;
0076 
0077     static const QString     configCurrentMode;
0078 };
0079 
0080 const QString VersionsWidget::Private::configCurrentMode(QLatin1String("Version Properties View Mode"));
0081 
0082 VersionsWidget::VersionsWidget(QWidget* const parent)
0083     : QWidget(parent),
0084       d      (new Private)
0085 {
0086     QGridLayout* const layout = new QGridLayout;
0087 
0088     d->viewButtonGroup        = new QButtonGroup(this);
0089     d->listModeButton         = new QToolButton;
0090     d->listModeButton->setIcon(QIcon::fromTheme(QLatin1String("view-list-icons")));
0091     d->listModeButton->setCheckable(true);
0092     d->listModeButton->setToolTip(i18n("Show available versions in a list"));
0093     d->viewButtonGroup->addButton(d->listModeButton, ItemHistoryGraphModel::ImagesListMode);
0094 
0095     d->treeModeButton         = new QToolButton;
0096     d->treeModeButton->setIcon(QIcon::fromTheme(QLatin1String("view-list-tree")));
0097     d->treeModeButton->setCheckable(true);
0098     d->treeModeButton->setToolTip(i18n("Show available versions as a tree"));
0099     d->viewButtonGroup->addButton(d->treeModeButton, ItemHistoryGraphModel::ImagesTreeMode);
0100 
0101     d->combinedModeButton     = new QToolButton;
0102     d->combinedModeButton->setIcon(QIcon::fromTheme(QLatin1String("view-list-details")));
0103     d->combinedModeButton->setCheckable(true);
0104     d->combinedModeButton->setToolTip(i18n("Show available versions and the applied filters in a combined list"));
0105     d->viewButtonGroup->addButton(d->combinedModeButton, ItemHistoryGraphModel::CombinedTreeMode);
0106 
0107     QHBoxLayout* const buttonLayout = new QHBoxLayout;
0108     buttonLayout->addWidget(d->listModeButton);
0109     buttonLayout->addWidget(d->treeModeButton);
0110     buttonLayout->addWidget(d->combinedModeButton);
0111 
0112     d->model                = new ItemHistoryGraphModel(this);
0113     d->model->imageModel()->setThumbnailLoadThread(ThumbnailLoadThread::defaultIconViewThread());
0114 
0115     d->view                 = new VersionsTreeView;
0116     d->view->setModel(d->model);
0117     d->view->setWordWrap(true);
0118     d->view->setRootIsDecorated(false);
0119     d->view->setHeaderHidden(true);
0120     d->view->setSelectionMode(QAbstractItemView::SingleSelection);
0121     //d->view->setFrameShape(QFrame::NoFrame);
0122     d->view->setFrameShadow(QFrame::Plain);
0123 
0124     layout->addLayout(buttonLayout, 0, 1);
0125     layout->addWidget(d->view,      1, 0, 1, 2);
0126     layout->setColumnStretch(0, 1);
0127     layout->setRowStretch(1, 1);
0128     setLayout(layout);
0129 
0130     connect(d->view->delegate(), SIGNAL(animationStateChanged()),
0131             d->view->viewport(), SLOT(update()));
0132 
0133     connect(d->view->selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)),
0134             this, SLOT(slotViewCurrentChanged(QModelIndex,QModelIndex)));
0135 
0136 #if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0))
0137 
0138     connect(d->viewButtonGroup, SIGNAL(idClicked(int)),
0139             this, SLOT(slotViewModeChanged(int)));
0140 
0141 #else
0142 
0143     connect(d->viewButtonGroup, SIGNAL(buttonClicked(int)),
0144             this, SLOT(slotViewModeChanged(int)));
0145 
0146 #endif
0147 
0148     connect(ApplicationSettings::instance(), SIGNAL(setupChanged()),
0149             this, SLOT(slotSetupChanged()));
0150 
0151     slotSetupChanged();
0152 }
0153 
0154 VersionsWidget::~VersionsWidget()
0155 {
0156     delete d;
0157 }
0158 
0159 void VersionsWidget::readSettings(const KConfigGroup& group)
0160 {
0161     int mode = group.readEntry(d->configCurrentMode, (int)ItemHistoryGraphModel::CombinedTreeMode);
0162 
0163     switch (mode)
0164     {
0165         case ItemHistoryGraphModel::ImagesListMode:
0166             d->listModeButton->setChecked(true);
0167             break;
0168 
0169         case ItemHistoryGraphModel::ImagesTreeMode:
0170             d->treeModeButton->setChecked(true);
0171             break;
0172 
0173         case ItemHistoryGraphModel::CombinedTreeMode:
0174         default:
0175             d->combinedModeButton->setChecked(true);
0176             break;
0177     }
0178 
0179     slotViewModeChanged(mode);
0180 }
0181 
0182 VersionsTreeView* VersionsWidget::view() const
0183 {
0184     return d->view;
0185 }
0186 
0187 VersionsDelegate* VersionsWidget::delegate() const
0188 {
0189     return d->delegate;
0190 }
0191 
0192 ActionVersionsOverlay* VersionsWidget::addActionOverlay(const QIcon& icon, const QString& text, const QString& tip)
0193 {
0194     ActionVersionsOverlay* const overlay = new ActionVersionsOverlay(this, icon, text, tip);
0195     d->view->addOverlay(overlay);
0196 
0197     return overlay;
0198 }
0199 
0200 ShowHideVersionsOverlay* VersionsWidget::addShowHideOverlay()
0201 {
0202     d->showHideOverlay = new ShowHideVersionsOverlay(this);
0203     d->showHideOverlay->setSettings(ApplicationSettings::instance()->getVersionManagerSettings());
0204     d->view->addOverlay(d->showHideOverlay);
0205 
0206     return d->showHideOverlay;
0207 }
0208 
0209 void VersionsWidget::writeSettings(KConfigGroup& group)
0210 {
0211     group.writeEntry(d->configCurrentMode, d->viewButtonGroup->checkedId());
0212 }
0213 
0214 void VersionsWidget::setCurrentItem(const ItemInfo& info)
0215 {
0216     d->model->setHistory(info);
0217     applyViewMode();
0218 }
0219 
0220 void VersionsWidget::slotViewCurrentChanged(const QModelIndex& current, const QModelIndex& previous)
0221 {
0222     ItemInfo info = d->model->imageInfo(current);
0223 
0224     if (!info.isNull())
0225     {
0226         Q_EMIT imageSelected(info);
0227     }
0228 
0229     switch (d->model->mode())
0230     {
0231         case ItemHistoryGraphModel::ImagesListMode:
0232         case ItemHistoryGraphModel::ImagesTreeMode:
0233             break;
0234 
0235         case ItemHistoryGraphModel::CombinedTreeMode:
0236 
0237             // toplevel image index
0238 
0239             if (!info.isNull() && !current.parent().isValid())
0240             {
0241                 d->view->expand(current);
0242             }
0243 
0244             if (previous.isValid() && d->model->isImage(previous) && !previous.parent().isValid())
0245             {
0246                 d->view->collapse(previous);
0247             }
0248             break;
0249     }
0250 }
0251 
0252 void VersionsWidget::slotViewModeChanged(int mode)
0253 {
0254     d->model->setMode((ItemHistoryGraphModel::Mode)mode);
0255     applyViewMode();
0256 }
0257 
0258 void VersionsWidget::applyViewMode()
0259 {
0260     switch (d->model->mode())
0261     {
0262         case ItemHistoryGraphModel::ImagesListMode:
0263             break;
0264 
0265         case ItemHistoryGraphModel::ImagesTreeMode:
0266             d->view->expandAll();
0267             break;
0268 
0269         case ItemHistoryGraphModel::CombinedTreeMode:
0270             d->view->collapseAll();
0271             break;
0272     }
0273 
0274     QModelIndex subjectIndex = d->model->indexForInfo(d->model->subject());
0275     d->view->scrollTo(subjectIndex, QAbstractItemView::PositionAtCenter);
0276     d->view->setCurrentIndex(subjectIndex);
0277 }
0278 
0279 void VersionsWidget::slotSetupChanged()
0280 {
0281     d->view->setToolTipEnabled(ApplicationSettings::instance()->showToolTipsIsValid());
0282 
0283     if (d->showHideOverlay)
0284     {
0285         d->showHideOverlay->setSettings(ApplicationSettings::instance()->getVersionManagerSettings());
0286     }
0287 }
0288 
0289 } // namespace Digikam
0290 
0291 #include "moc_versionswidget.cpp"