1
mirror of https://invent.kde.org/network/falkon.git synced 2024-12-20 10:46:35 +01:00

LocationCompleterView: Change into QWidget

This commit is contained in:
David Rosca 2018-01-25 11:01:19 +01:00
parent bb76281174
commit 11e2ff168e
No known key found for this signature in database
GPG Key ID: EBC3FC294452C6D8
3 changed files with 114 additions and 75 deletions

View File

@ -375,14 +375,11 @@ void LocationCompleter::showPopup()
void LocationCompleter::adjustPopupSize()
{
const int maxItemsCount = 12;
const int popupHeight = s_view->sizeHintForRow(0) * qMin(maxItemsCount, s_model->rowCount()) + 2 * s_view->frameWidth();
if (s_view->currentIndex().row() == 0) {
m_originalText = m_locationBar->text();
s_view->setOriginalText(m_originalText);
}
s_view->resize(s_view->width(), popupHeight);
s_view->adjustSize();
s_view->show();
}

View File

@ -1,6 +1,6 @@
/* ============================================================
* Falkon - Qt web browser
* Copyright (C) 2010-2017 David Rosca <nowrep@gmail.com>
* Copyright (C) 2010-2018 David Rosca <nowrep@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
@ -22,9 +22,10 @@
#include <QKeyEvent>
#include <QApplication>
#include <QScrollBar>
#include <QVBoxLayout>
LocationCompleterView::LocationCompleterView()
: QListView(0)
: QWidget(nullptr)
, m_ignoreNextMouseMove(false)
{
setAttribute(Qt::WA_ShowWithoutActivating);
@ -36,18 +37,51 @@ LocationCompleterView::LocationCompleterView()
setWindowFlags(Qt::Popup);
}
setUniformItemSizes(true);
setEditTriggers(QAbstractItemView::NoEditTriggers);
setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setSelectionBehavior(QAbstractItemView::SelectRows);
setSelectionMode(QAbstractItemView::SingleSelection);
QVBoxLayout *layout = new QVBoxLayout(this);
layout->setContentsMargins(0, 0, 0, 0);
layout->setSpacing(0);
setLayout(layout);
setMouseTracking(true);
m_view = new QListView(this);
layout->addWidget(m_view);
m_view->setUniformItemSizes(true);
m_view->setEditTriggers(QAbstractItemView::NoEditTriggers);
m_view->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
m_view->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
m_view->setSelectionBehavior(QAbstractItemView::SelectRows);
m_view->setSelectionMode(QAbstractItemView::SingleSelection);
m_view->setMouseTracking(true);
qApp->installEventFilter(this);
m_delegate = new LocationCompleterDelegate(this);
setItemDelegate(m_delegate);
m_view->setItemDelegate(m_delegate);
}
QAbstractItemModel *LocationCompleterView::model() const
{
return m_view->model();
}
void LocationCompleterView::setModel(QAbstractItemModel *model)
{
m_view->setModel(model);
}
QModelIndex LocationCompleterView::currentIndex() const
{
return m_view->currentIndex();
}
void LocationCompleterView::setCurrentIndex(const QModelIndex &index)
{
m_view->setCurrentIndex(index);
}
QItemSelectionModel *LocationCompleterView::selectionModel() const
{
return m_view->selectionModel();
}
void LocationCompleterView::setOriginalText(const QString &originalText)
@ -55,11 +89,47 @@ void LocationCompleterView::setOriginalText(const QString &originalText)
m_delegate->setOriginalText(originalText);
}
void LocationCompleterView::adjustSize()
{
const int maxItemsCount = 12;
m_view->setFixedHeight(m_view->sizeHintForRow(0) * qMin(maxItemsCount, model()->rowCount()) + 2 * m_view->frameWidth());
setFixedHeight(sizeHint().height());
}
bool LocationCompleterView::eventFilter(QObject* object, QEvent* event)
{
// Event filter based on QCompleter::eventFilter from qcompleter.cpp
if (object == this || !isVisible()) {
if (object == this || object == m_view || !isVisible()) {
return false;
}
if (object == m_view->viewport()) {
if (event->type() == QEvent::MouseButtonRelease) {
QMouseEvent *e = static_cast<QMouseEvent*>(event);
QModelIndex idx = m_view->indexAt(e->pos());
if (!idx.isValid()) {
return false;
}
Qt::MouseButton button = e->button();
Qt::KeyboardModifiers modifiers = e->modifiers();
if (button == Qt::LeftButton && modifiers == Qt::NoModifier) {
emit indexActivated(idx);
return true;
}
if (button == Qt::MiddleButton || (button == Qt::LeftButton && modifiers == Qt::ControlModifier)) {
emit indexCtrlActivated(idx);
return true;
}
if (button == Qt::LeftButton && modifiers == Qt::ShiftModifier) {
emit indexShiftActivated(idx);
return true;
}
}
return false;
}
@ -67,11 +137,11 @@ bool LocationCompleterView::eventFilter(QObject* object, QEvent* event)
case QEvent::KeyPress: {
QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);
Qt::KeyboardModifiers modifiers = keyEvent->modifiers();
const QModelIndex idx = currentIndex();
const QModelIndex idx = m_view->currentIndex();
const QModelIndex visitSearchIdx = model()->index(0, 0).data(LocationCompleterModel::VisitSearchItemRole).toBool() ? model()->index(0, 0) : QModelIndex();
if ((keyEvent->key() == Qt::Key_Up || keyEvent->key() == Qt::Key_Down) && currentIndex() != idx) {
setCurrentIndex(idx);
if ((keyEvent->key() == Qt::Key_Up || keyEvent->key() == Qt::Key_Down) && m_view->currentIndex() != idx) {
m_view->setCurrentIndex(idx);
}
switch (keyEvent->key()) {
@ -99,7 +169,7 @@ bool LocationCompleterView::eventFilter(QObject* object, QEvent* event)
case Qt::Key_End:
if (modifiers & Qt::ControlModifier) {
setCurrentIndex(model()->index(model()->rowCount() - 1, 0));
m_view->setCurrentIndex(model()->index(model()->rowCount() - 1, 0));
return true;
} else {
close();
@ -108,8 +178,8 @@ bool LocationCompleterView::eventFilter(QObject* object, QEvent* event)
case Qt::Key_Home:
if (modifiers & Qt::ControlModifier) {
setCurrentIndex(model()->index(0, 0));
scrollToTop();
m_view->setCurrentIndex(model()->index(0, 0));
m_view->scrollToTop();
return true;
} else {
close();
@ -142,52 +212,46 @@ bool LocationCompleterView::eventFilter(QObject* object, QEvent* event)
if (!idx.isValid() || idx == visitSearchIdx) {
int rowCount = model()->rowCount();
QModelIndex lastIndex = model()->index(rowCount - 1, 0);
setCurrentIndex(lastIndex);
m_view->setCurrentIndex(lastIndex);
} else if (idx.row() == 0) {
setCurrentIndex(QModelIndex());
m_view->setCurrentIndex(QModelIndex());
} else {
setCurrentIndex(model()->index(idx.row() - 1, 0));
m_view->setCurrentIndex(model()->index(idx.row() - 1, 0));
}
return true;
case Qt::Key_Down:
if (!idx.isValid()) {
QModelIndex firstIndex = model()->index(0, 0);
setCurrentIndex(firstIndex);
m_view->setCurrentIndex(firstIndex);
} else if (idx != visitSearchIdx && idx.row() == model()->rowCount() - 1) {
setCurrentIndex(visitSearchIdx);
scrollToTop();
m_view->setCurrentIndex(visitSearchIdx);
m_view->scrollToTop();
} else {
setCurrentIndex(model()->index(idx.row() + 1, 0));
m_view->setCurrentIndex(model()->index(idx.row() + 1, 0));
}
return true;
case Qt::Key_Delete:
if (idx != visitSearchIdx && viewport()->rect().contains(visualRect(idx))) {
if (idx != visitSearchIdx && m_view->viewport()->rect().contains(m_view->visualRect(idx))) {
emit indexDeleteRequested(idx);
return true;
}
break;
case Qt::Key_PageUp:
if (keyEvent->modifiers() != Qt::NoModifier) {
return false;
}
selectionModel()->setCurrentIndex(moveCursor(QAbstractItemView::MovePageUp, Qt::NoModifier), QItemSelectionModel::SelectCurrent);
return true;
case Qt::Key_PageDown:
if (keyEvent->modifiers() != Qt::NoModifier) {
return false;
}
selectionModel()->setCurrentIndex(moveCursor(QAbstractItemView::MovePageDown, Qt::NoModifier), QItemSelectionModel::SelectCurrent);
QApplication::sendEvent(m_view, event);
return true;
case Qt::Key_Shift:
// don't switch if there is no hovered or selected index to not disturb typing
if (idx != visitSearchIdx || underMouse()) {
m_delegate->setShowSwitchToTab(false);
viewport()->update();
m_view->viewport()->update();
return true;
}
break;
@ -205,7 +269,7 @@ bool LocationCompleterView::eventFilter(QObject* object, QEvent* event)
switch (keyEvent->key()) {
case Qt::Key_Shift:
m_delegate->setShowSwitchToTab(true);
viewport()->update();
m_view->viewport()->update();
return true;
}
break;
@ -250,38 +314,10 @@ bool LocationCompleterView::eventFilter(QObject* object, QEvent* event)
void LocationCompleterView::close()
{
QListView::hide();
verticalScrollBar()->setValue(0);
hide();
m_view->verticalScrollBar()->setValue(0);
m_delegate->setShowSwitchToTab(true);
emit closed();
}
void LocationCompleterView::mouseReleaseEvent(QMouseEvent* event)
{
QModelIndex idx = indexAt(event->pos());
if (!idx.isValid()) {
return;
}
Qt::MouseButton button = event->button();
Qt::KeyboardModifiers modifiers = event->modifiers();
if (button == Qt::LeftButton && modifiers == Qt::NoModifier) {
emit indexActivated(idx);
return;
}
if (button == Qt::MiddleButton || (button == Qt::LeftButton && modifiers == Qt::ControlModifier)) {
emit indexCtrlActivated(idx);
return;
}
if (button == Qt::LeftButton && modifiers == Qt::ShiftModifier) {
emit indexShiftActivated(idx);
return;
}
QListView::mouseReleaseEvent(event);
}

View File

@ -1,6 +1,6 @@
/* ============================================================
* Falkon - Qt web browser
* Copyright (C) 2010-2017 David Rosca <nowrep@gmail.com>
* Copyright (C) 2010-2018 David Rosca <nowrep@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
@ -24,16 +24,24 @@
class LocationCompleterDelegate;
class FALKON_EXPORT LocationCompleterView : public QListView
class FALKON_EXPORT LocationCompleterView : public QWidget
{
Q_OBJECT
public:
explicit LocationCompleterView();
QPersistentModelIndex hoveredIndex() const;
QAbstractItemModel *model() const;
void setModel(QAbstractItemModel *model);
QItemSelectionModel *selectionModel() const;
QModelIndex currentIndex() const;
void setCurrentIndex(const QModelIndex &index);
void setOriginalText(const QString &originalText);
void adjustSize();
bool eventFilter(QObject* object, QEvent* event);
signals:
@ -47,12 +55,10 @@ signals:
public slots:
void close();
protected:
void mouseReleaseEvent(QMouseEvent* event);
private:
bool m_ignoreNextMouseMove;
QListView *m_view;
LocationCompleterDelegate *m_delegate;
};