File indexing completed on 2024-04-28 04:21:22

0001 // SPDX-FileCopyrightText: 2003-2020 The KPhotoAlbum Development Team
0002 // SPDX-FileCopyrightText: 2021-2023 Johannes Zarl-Zierl <johannes@zarl-zierl.at>
0003 //
0004 // SPDX-License-Identifier: GPL-2.0-or-later
0005 
0006 #include "ThumbnailFacade.h"
0007 
0008 #include "CellGeometry.h"
0009 #include "FilterWidget.h"
0010 #include "GridResizeSlider.h"
0011 #include "ThumbnailModel.h"
0012 #include "ThumbnailToolTip.h"
0013 #include "ThumbnailWidget.h"
0014 
0015 #include <BackgroundJobs/HandleVideoThumbnailRequestJob.h>
0016 #include <kpabase/SettingsData.h>
0017 #include <kpathumbnails/ThumbnailCache.h>
0018 
0019 ThumbnailView::ThumbnailFacade *ThumbnailView::ThumbnailFacade::s_instance = nullptr;
0020 ThumbnailView::ThumbnailFacade::ThumbnailFacade(ImageManager::ThumbnailCache *thumbnailCache)
0021     : m_cellGeometry(nullptr)
0022     , m_model(nullptr)
0023     , m_widget(nullptr)
0024     , m_toolTip(nullptr)
0025     , m_thumbnailCache(thumbnailCache)
0026 {
0027     // To avoid one of the components references one of the other before it has been initialized, we first construct them all with null.
0028     m_cellGeometry = new CellGeometry(this);
0029     m_model = new ThumbnailModel(this, m_thumbnailCache);
0030     m_widget = new ThumbnailWidget(this);
0031     // I don't want to introduce a strong interdependency between ThumbnailWidget and ThumbnailToolTip,
0032     // hence I don't want to push the tooltip construction into the thumbnail widget.
0033     // Unfortunately, this causes a warning in lgtm:
0034     m_toolTip = new ThumbnailToolTip(m_widget); // lgtm [cpp/resource-not-released-in-destructor]
0035 
0036     connect(m_widget, &ThumbnailWidget::showImage, this, &ThumbnailFacade::showImage);
0037     connect(m_widget, &ThumbnailWidget::showSelection, this, &ThumbnailFacade::showSelection);
0038     connect(m_widget, &ThumbnailWidget::showSearch, this, &ThumbnailFacade::showSearch);
0039     connect(m_widget, &ThumbnailWidget::fileIdUnderCursorChanged, this, &ThumbnailFacade::fileIdUnderCursorChanged);
0040     connect(m_widget, &ThumbnailWidget::currentDateChanged, this, &ThumbnailFacade::currentDateChanged);
0041     connect(m_widget, &ThumbnailWidget::selectionCountChanged, this, &ThumbnailFacade::selectionChanged);
0042     connect(m_model, &ThumbnailModel::collapseAllStacksEnabled, this, &ThumbnailFacade::collapseAllStacksEnabled);
0043     connect(m_model, &ThumbnailModel::expandAllStacksEnabled, this, &ThumbnailFacade::expandAllStacksEnabled);
0044     connect(m_model, &ThumbnailModel::filterChanged, this, &ThumbnailFacade::filterChanged);
0045 
0046     s_instance = this;
0047 }
0048 
0049 QWidget *ThumbnailView::ThumbnailFacade::gui()
0050 {
0051     return m_widget;
0052 }
0053 
0054 void ThumbnailView::ThumbnailFacade::gotoDate(const DB::ImageDate &date, bool b)
0055 {
0056     m_widget->gotoDate(date, b);
0057 }
0058 
0059 void ThumbnailView::ThumbnailFacade::setCurrentItem(const DB::FileName &fileName)
0060 {
0061     widget()->setCurrentItem(fileName);
0062 }
0063 
0064 void ThumbnailView::ThumbnailFacade::reload(SelectionUpdateMethod method)
0065 {
0066     m_widget->reload(method);
0067 }
0068 
0069 DB::FileNameList ThumbnailView::ThumbnailFacade::selection(ThumbnailView::SelectionMode mode) const
0070 {
0071     return m_widget->selection(mode);
0072 }
0073 
0074 DB::FileNameList ThumbnailView::ThumbnailFacade::imageList(Order order) const
0075 {
0076     return m_model->imageList(order);
0077 }
0078 
0079 DB::FileName ThumbnailView::ThumbnailFacade::mediaIdUnderCursor() const
0080 {
0081     return m_widget->mediaIdUnderCursor();
0082 }
0083 
0084 DB::FileName ThumbnailView::ThumbnailFacade::currentItem() const
0085 {
0086     const auto index = m_widget->currentIndex();
0087     if (!index.isValid()) {
0088         return DB::FileName();
0089     }
0090     return m_model->imageAt(m_widget->currentIndex().row());
0091 }
0092 
0093 void ThumbnailView::ThumbnailFacade::setImageList(const DB::FileNameList &list)
0094 {
0095     m_model->setImageList(list);
0096 }
0097 
0098 void ThumbnailView::ThumbnailFacade::setSortDirection(SortDirection direction)
0099 {
0100     m_model->setSortDirection(direction);
0101 }
0102 
0103 QSlider *ThumbnailView::ThumbnailFacade::createResizeSlider()
0104 {
0105     return new GridResizeSlider(this);
0106 }
0107 
0108 ThumbnailView::FilterWidget *ThumbnailView::ThumbnailFacade::createFilterWidget(QWidget *parent)
0109 {
0110     return model()->createFilterWidget(parent);
0111 }
0112 
0113 void ThumbnailView::ThumbnailFacade::selectAll()
0114 {
0115     m_widget->selectAll();
0116 }
0117 
0118 void ThumbnailView::ThumbnailFacade::clearSelection()
0119 {
0120     m_widget->clearSelection();
0121 }
0122 
0123 void ThumbnailView::ThumbnailFacade::showToolTipsOnImages(bool on)
0124 {
0125     m_toolTip->setActive(on);
0126 }
0127 
0128 void ThumbnailView::ThumbnailFacade::toggleStackExpansion(const DB::FileName &fileName)
0129 {
0130     m_model->toggleStackExpansion(fileName);
0131 }
0132 
0133 void ThumbnailView::ThumbnailFacade::collapseAllStacks()
0134 {
0135     m_model->collapseAllStacks();
0136 }
0137 
0138 void ThumbnailView::ThumbnailFacade::expandAllStacks()
0139 {
0140     m_model->expandAllStacks();
0141 }
0142 
0143 void ThumbnailView::ThumbnailFacade::updateDisplayModel()
0144 {
0145     m_model->updateDisplayModel();
0146 }
0147 
0148 void ThumbnailView::ThumbnailFacade::changeSingleSelection(const DB::FileName &fileName)
0149 {
0150     m_widget->changeSingleSelection(fileName);
0151 }
0152 
0153 ThumbnailView::ThumbnailModel *ThumbnailView::ThumbnailFacade::model()
0154 {
0155     Q_ASSERT(m_model);
0156     return m_model;
0157 }
0158 
0159 ThumbnailView::CellGeometry *ThumbnailView::ThumbnailFacade::cellGeometry()
0160 {
0161     Q_ASSERT(m_cellGeometry);
0162     return m_cellGeometry;
0163 }
0164 
0165 ThumbnailView::ThumbnailWidget *ThumbnailView::ThumbnailFacade::widget()
0166 {
0167     Q_ASSERT(m_widget);
0168     return m_widget;
0169 }
0170 
0171 ThumbnailView::ThumbnailFacade *ThumbnailView::ThumbnailFacade::instance()
0172 {
0173     Q_ASSERT(s_instance);
0174     return s_instance;
0175 }
0176 
0177 void ThumbnailView::ThumbnailFacade::clearFilter()
0178 {
0179     Q_ASSERT(m_model);
0180     m_model->clearFilter();
0181 }
0182 
0183 void ThumbnailView::ThumbnailFacade::setFreeformFilter(const QString &text)
0184 {
0185     model()->filterByFreeformText(text);
0186 }
0187 
0188 // vi:expandtab:tabstop=4 shiftwidth=4:
0189 
0190 #include "moc_ThumbnailFacade.cpp"