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"