kde-workspace/krunner/interfaces/default/resultview.cpp
Ivailo Monev 1f90237e4f krunner: adjust to Katie changes
Signed-off-by: Ivailo Monev <xakepa10@laimg.moc>
2019-06-28 17:54:58 +00:00

196 lines
6.8 KiB
C++

/***************************************************************************
* Copyright 2009 by Jacopo De Simoi <wilderkde@gmail.com> *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . *
***************************************************************************/
#include <KDebug>
#include <QGraphicsView>
#include <QToolButton>
#include <QtGui/qevent.h>
#include <QMutex>
#include <QScrollBar>
#include <Plasma/AbstractRunner>
#include <Plasma/Svg>
#include "resultscene.h"
#include "resultview.h"
#include "resultitem.h"
ResultsView::ResultsView(ResultScene *scene, SharedResultData *resultData, QWidget *parent)
: QGraphicsView(scene, parent),
m_resultScene(scene),
m_resultData(resultData)
{
setFrameStyle(QFrame::NoFrame);
viewport()->setAutoFillBackground(false);
setInteractive(true);
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setOptimizationFlag(QGraphicsView::DontSavePainterState);
setAlignment(Qt::AlignLeft | Qt::AlignTop);
m_arrowSvg = new Plasma::Svg(this);
m_arrowSvg->setImagePath(QLatin1String( "widgets/arrows" ));
m_previousPage = new QToolButton(this);
m_previousPage->setAutoRaise(true);
m_previousPage->setVisible(false);
connect(m_previousPage, SIGNAL(clicked(bool)), SLOT(previousPage()));
m_nextPage = new QToolButton(this);
m_nextPage->setAutoRaise(true);
m_nextPage->setVisible(false);
connect(m_nextPage, SIGNAL(clicked(bool)), SLOT(nextPage()));
connect(m_arrowSvg, SIGNAL(repaintNeeded()), this, SLOT(updateArrowsIcons()));
updateArrowsIcons();
connect(verticalScrollBar(), SIGNAL(rangeChanged(int,int)), this, SLOT(updateArrowsVisibility()));
connect(verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(updateArrowsVisibility()));
connect(m_resultScene, SIGNAL(ensureVisibility(QGraphicsItem*)), this, SLOT(ensureVisibility(QGraphicsItem*)));
}
ResultsView::~ResultsView()
{
}
void ResultsView::ensureVisibility(QGraphicsItem* item)
{
m_resultData->processHoverEvents = false;
ensureVisible(item, 0, 0);
m_resultData->processHoverEvents = true;
}
void ResultsView::previousPage()
{
QGraphicsItem *currentItem = m_resultScene->selectedItems().first();
QGraphicsItem *item = itemAt(0, -height()*0.4);
if (!item) {
item = m_resultScene->itemAt(0,0);
}
if (item && (item != currentItem)) {
m_resultScene->setFocusItem(item);
} else {
verticalScrollBar()->setValue(verticalScrollBar()->value()-height()*0.4);
}
}
void ResultsView::nextPage()
{
QGraphicsItem *currentItem = m_resultScene->selectedItems().first();
QGraphicsItem *item = itemAt(0, height()*1.4);
if (!item) {
item = m_resultScene->itemAt(0,sceneRect().height()-1);
}
ResultItem *rItem = dynamic_cast<ResultItem *>(item);
if (rItem && !rItem->isValid()) {
item = m_resultScene->itemAt(0, m_resultScene->viewableHeight() - 1);
}
if (item && (item != currentItem)) {
m_resultScene->setFocusItem(item);
} else {
verticalScrollBar()->setValue(qMin(m_resultScene->viewableHeight(),
int(verticalScrollBar()->value()+ (height() * 0.4))));
}
}
void ResultsView::resizeEvent(QResizeEvent * event)
{
updateArrowsVisibility();
QGraphicsView::resizeEvent(event);
}
void ResultsView::updateArrowsIcons()
{
m_previousPage->setIcon(m_arrowSvg->pixmap(QLatin1String( "up-arrow" )));
m_previousPage->adjustSize();
m_nextPage->setIcon(m_arrowSvg->pixmap(QLatin1String( "down-arrow" )));
m_nextPage->adjustSize();
updateArrowsVisibility();
}
void ResultsView::updateArrowsVisibility()
{
m_previousPage->move((width() / 2) - (m_previousPage->width() / 2), 0);
m_nextPage->move((width() / 2) - (m_nextPage->width() / 2), height() - m_nextPage->height());
m_previousPage->setVisible(mapFromScene(QPointF(0,0)).y() < 0);
m_nextPage->setVisible(mapFromScene(QPointF(0, m_resultScene->viewableHeight())).y() > height());
//kDebug() << m_resultScene->viewableHeight() << height() << mapFromScene(QPointF(0, m_resultScene->viewableHeight()));
}
void ResultsView::wheelEvent(QWheelEvent *e)
{
if (e->delta() < 0 && !m_nextPage->isVisible()) {
return;
}
QGraphicsView::wheelEvent(e);
}
void ResultsView::paintEvent(QPaintEvent *event)
{
QGraphicsView::paintEvent(event);
QPainter painter(viewport());
if (m_previousFadeout.isNull() || m_previousFadeout.width() != width()) {
QLinearGradient g(0, 0, 0, m_previousPage->height());
g.setColorAt(1, Qt::white );
g.setColorAt(0, Qt::transparent );
m_previousFadeout = QPixmap(width(), m_previousPage->height());
m_previousFadeout.fill(Qt::transparent);
QPainter p(&m_previousFadeout);
p.setCompositionMode(QPainter::CompositionMode_Source);
p.fillRect(m_previousFadeout.rect(), g);
}
if (m_nextFadeout.isNull() || m_nextFadeout.width() != width()) {
QLinearGradient g(0, 0, 0, m_nextPage->height());
g.setColorAt(0, Qt::white );
g.setColorAt(1, Qt::transparent );
m_nextFadeout = QPixmap(width(), m_nextPage->height());
m_nextFadeout.fill(Qt::transparent);
QPainter p(&m_nextFadeout);
p.setCompositionMode(QPainter::CompositionMode_Source);
p.fillRect(m_nextFadeout.rect(), g);
}
painter.setCompositionMode(QPainter::CompositionMode_DestinationIn);
if (m_previousPage->isVisible()) {
painter.drawPixmap(QPoint(0,0), m_previousFadeout);
}
if (m_nextPage->isVisible()) {
painter.drawPixmap(QPoint(0,height()-m_nextFadeout.height()), m_nextFadeout);
}
painter.end();
}
#include "moc_resultview.cpp"