File indexing completed on 2024-05-12 15:59:57
0001 /* This file is part of the KDE project 0002 * SPDX-FileCopyrightText: 2008 Jan Hambrecht <jaham@gmx.net> 0003 * SPDX-FileCopyrightText: 2011 José Luis Vergara <pentalis@gmail.com 0004 * 0005 * SPDX-License-Identifier: LGPL-2.0-or-later 0006 */ 0007 0008 #include "KisResourceItemView.h" 0009 0010 #include <QEvent> 0011 #include <QHeaderView> 0012 #include <QScroller> 0013 #include <QHelpEvent> 0014 #include <QDebug> 0015 0016 #include <KisKineticScroller.h> 0017 0018 #include <QtMath> 0019 0020 KisResourceItemView::KisResourceItemView(QWidget *parent) 0021 : QTableView(parent) 0022 { 0023 setSelectionMode(QAbstractItemView::SingleSelection); 0024 verticalHeader()->hide(); 0025 horizontalHeader()->hide(); 0026 verticalHeader()->setDefaultSectionSize(20); 0027 setContextMenuPolicy(Qt::DefaultContextMenu); 0028 setViewMode(FIXED_COLUMNS); 0029 0030 QScroller *scroller = KisKineticScroller::createPreconfiguredScroller(this); 0031 if (scroller) { 0032 connect(scroller, SIGNAL(stateChanged(QScroller::State)), this, SLOT(slotScrollerStateChange(QScroller::State))); 0033 } 0034 0035 connect(this, SIGNAL(clicked(QModelIndex)), SLOT(slotItemClicked(QModelIndex))); 0036 } 0037 0038 bool KisResourceItemView::viewportEvent(QEvent *event) 0039 { 0040 if (!model()) return true; 0041 0042 if (event->type() == QEvent::ToolTip) { 0043 QHelpEvent *he = static_cast<QHelpEvent *>(event); 0044 QStyleOptionViewItem option = viewOptions(); 0045 QModelIndex index = model()->buddy(indexAt(he->pos())); 0046 if (index.isValid()) { 0047 option.rect = visualRect(index); 0048 m_tip.showTip(this, he->pos(), option, index); 0049 return true; 0050 } 0051 } 0052 0053 return QTableView::viewportEvent(event); 0054 } 0055 0056 void KisResourceItemView::selectionChanged(const QItemSelection &selected, const QItemSelection &/*deselected*/) 0057 { 0058 if (selected.isEmpty()) { 0059 emit currentResourceChanged(QModelIndex()); 0060 } 0061 else { 0062 emit currentResourceChanged(selected.indexes().first()); 0063 } 0064 } 0065 0066 void KisResourceItemView::mousePressEvent(QMouseEvent *event) 0067 { 0068 m_beforeClickIndex = currentIndex(); 0069 QTableView::mousePressEvent(event); 0070 } 0071 0072 void KisResourceItemView::slotItemClicked(const QModelIndex &index) 0073 { 0074 if (m_beforeClickIndex == index) { 0075 emit currentResourceClicked(index); 0076 } 0077 m_beforeClickIndex = QModelIndex(); 0078 } 0079 0080 void KisResourceItemView::contextMenuEvent(QContextMenuEvent *event) 0081 { 0082 QTableView::contextMenuEvent(event); 0083 emit contextMenuRequested(event->globalPos()); 0084 } 0085 0086 void KisResourceItemView::resizeEvent(QResizeEvent *event) 0087 { 0088 QTableView::resizeEvent(event); 0089 updateView(); 0090 emit sigSizeChanged(); 0091 } 0092 0093 void KisResourceItemView::setViewMode(ViewMode mode) 0094 { 0095 m_viewMode = mode; 0096 0097 switch (m_viewMode) { 0098 case FIXED_COLUMNS: 0099 setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); // Horizontal scrollbar is never needed 0100 setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); 0101 break; 0102 case FIXED_ROWS: 0103 setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn); 0104 setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); // Vertical scrollbar is never needed 0105 break; 0106 default: 0107 setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded); 0108 setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); 0109 } 0110 0111 } 0112 0113 void KisResourceItemView::updateView() 0114 { 0115 if (!model()) return; 0116 0117 int columnCount = model()->columnCount(QModelIndex()); 0118 int rowCount = model()->rowCount(QModelIndex()); 0119 int rowHeight, columnWidth; 0120 0121 if (m_viewMode == FIXED_COLUMNS) { 0122 columnWidth = qFloor(viewport()->size().width() / static_cast<double>(columnCount)); 0123 0124 for (int i = 0; i < columnCount; ++i) { 0125 setColumnWidth(i, columnWidth); 0126 } 0127 // keep aspect ratio always square. 0128 if (columnCount > 1) { 0129 for (int i = 0; i < rowCount; ++i) { 0130 setRowHeight(i, columnWidth); 0131 } 0132 } 0133 } else if (m_viewMode == FIXED_ROWS) { 0134 if (rowCount == 0) return; // Don't divide by zero 0135 rowHeight = qFloor(viewport()->size().height() / static_cast<double>(rowCount)); 0136 0137 for (int i = 0; i < rowCount; ++i) { 0138 setRowHeight(i, rowHeight); 0139 } 0140 } 0141 }