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 }