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 }