File indexing completed on 2024-05-12 15:59:57

0001 /* This file is part of the KDE project
0002  * SPDX-FileCopyrightText: 2019 Wolthera van Hövell tot Westerflier <griffinvalley@gmail.com>
0003  *
0004  * SPDX-License-Identifier: LGPL-2.0-or-later
0005  */
0006 
0007 #include "KisResourceItemListView.h"
0008 
0009 #include <QEvent>
0010 #include <QHeaderView>
0011 #include <QScroller>
0012 #include <QHelpEvent>
0013 #include <QDebug>
0014 
0015 struct  Q_DECL_HIDDEN KisResourceItemListView::Private
0016 {
0017     bool strictSelectionMode {false};
0018     KisIconToolTip tip;
0019 };
0020 
0021 KisResourceItemListView::KisResourceItemListView(QWidget *parent)
0022     : QListView(parent)
0023     , m_d(new Private)
0024 {
0025     setSelectionMode(QAbstractItemView::SingleSelection);
0026     setContextMenuPolicy(Qt::DefaultContextMenu);
0027     setViewMode(QListView::IconMode);
0028     setGridSize(QSize(64, 64));
0029     setIconSize(QSize(64, 64));
0030     setResizeMode(QListView::Adjust);
0031     setUniformItemSizes(true);
0032 
0033     QScroller *scroller = KisKineticScroller::createPreconfiguredScroller(this);
0034     if (scroller) {
0035         connect(scroller, SIGNAL(stateChanged(QScroller::State)), this, SLOT(slotScrollerStateChange(QScroller::State)));
0036     }
0037 
0038     connect(this, SIGNAL(clicked(QModelIndex)), SIGNAL(currentResourceClicked(const QModelIndex &)));
0039 }
0040 
0041 KisResourceItemListView::~KisResourceItemListView()
0042 {
0043 }
0044 
0045 void KisResourceItemListView::setItemSize(QSize size)
0046 {
0047     setGridSize(size);
0048     setIconSize(size);
0049 }
0050 
0051 void KisResourceItemListView::setStrictSelectionMode(bool enable)
0052 {
0053     m_d->strictSelectionMode = enable;
0054 }
0055 
0056 void KisResourceItemListView::setFixedToolTipThumbnailSize(const QSize &size)
0057 {
0058     m_d->tip.setFixedToolTipThumbnailSize(size);
0059 }
0060 
0061 void KisResourceItemListView::setToolTipShouldRenderCheckers(bool value)
0062 {
0063     m_d->tip.setToolTipShouldRenderCheckers(value);
0064 }
0065 
0066 void KisResourceItemListView::rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end)
0067 {
0068     // QAbstractItemView moves the current index if the row it points to is removed,
0069     // which we don't want for strict selections
0070     QModelIndex current = currentIndex();
0071     if (selectionMode() == SingleSelection
0072             && m_d->strictSelectionMode
0073             && current.isValid()
0074             && current.row() >= start
0075             && current.row() <= end) {
0076 
0077         selectionModel()->clear();
0078     }
0079     QListView::rowsAboutToBeRemoved(parent, start, end);
0080 }
0081 
0082 void KisResourceItemListView::selectionChanged(const QItemSelection &selected, const QItemSelection &deselected)
0083 {
0084     // base class takes care of viewport updates
0085     QListView::selectionChanged(selected, deselected);
0086 
0087     if (selected.isEmpty()) {
0088         emit currentResourceChanged(QModelIndex());
0089     }
0090     else {
0091         emit currentResourceChanged(selected.indexes().first());
0092     }
0093 }
0094 
0095 QItemSelectionModel::SelectionFlags KisResourceItemListView::selectionCommand(const QModelIndex &index, const QEvent *event) const
0096 {
0097     QItemSelectionModel::SelectionFlags cmd = QListView::selectionCommand(index, event);
0098 
0099     // avoid deselecting the current item by Ctrl-clicking in single selection mode
0100     if (selectionMode() == SingleSelection
0101             && m_d->strictSelectionMode
0102             && cmd.testFlag(QItemSelectionModel::Deselect)) {
0103 
0104         cmd = QItemSelectionModel::NoUpdate;
0105     }
0106     return cmd;
0107 }
0108 
0109 void KisResourceItemListView::contextMenuEvent(QContextMenuEvent *event)
0110 {
0111     QListView::contextMenuEvent(event);
0112     emit contextMenuRequested(event->globalPos());
0113 }
0114 
0115 bool KisResourceItemListView::viewportEvent(QEvent *event)
0116 {
0117     if (!model()) return true;
0118 
0119     if (event->type() == QEvent::ToolTip) {
0120         QHelpEvent *he = static_cast<QHelpEvent *>(event);
0121         QStyleOptionViewItem option = viewOptions();
0122         QModelIndex index = model()->buddy(indexAt(he->pos()));
0123         if (index.isValid()) {
0124             option.rect = visualRect(index);
0125             m_d->tip.showTip(this, he->pos(), option, index);
0126             return true;
0127         }
0128         m_d->tip.hide();
0129     }
0130 
0131     return QListView::viewportEvent(event);
0132 }