From de2c1a4f9bbae7070cf8fd8247db765a23d28a9c Mon Sep 17 00:00:00 2001 From: romibi Date: Sat, 11 Jun 2016 01:52:03 +0200 Subject: [PATCH] Refactoring: Pull Up Duplicate Code The event override for NickView and BufferView was Copy&Paste. To reduce duplicate code i moved that to a new class (TreeViewTouch) now between QTreeView and the mentioned Classes. --- src/uisupport/CMakeLists.txt | 1 + src/uisupport/bufferview.cpp | 69 +++++++-------------------------- src/uisupport/bufferview.h | 8 +--- src/uisupport/nickview.cpp | 49 +++-------------------- src/uisupport/nickview.h | 8 +--- src/uisupport/treeviewtouch.cpp | 67 ++++++++++++++++++++++++++++++++ src/uisupport/treeviewtouch.h | 43 ++++++++++++++++++++ 7 files changed, 135 insertions(+), 110 deletions(-) create mode 100644 src/uisupport/treeviewtouch.cpp create mode 100644 src/uisupport/treeviewtouch.h diff --git a/src/uisupport/CMakeLists.txt b/src/uisupport/CMakeLists.txt index a72a9c73..baa49fe4 100644 --- a/src/uisupport/CMakeLists.txt +++ b/src/uisupport/CMakeLists.txt @@ -28,6 +28,7 @@ set(SOURCES styledlabel.cpp tabcompleter.cpp toolbaractionprovider.cpp + treeviewtouch.cpp uisettings.cpp uistyle.cpp diff --git a/src/uisupport/bufferview.cpp b/src/uisupport/bufferview.cpp index 3d45167d..e01ca09a 100644 --- a/src/uisupport/bufferview.cpp +++ b/src/uisupport/bufferview.cpp @@ -28,9 +28,6 @@ #include #include #include -#include -#include - #include "action.h" #include "buffermodel.h" @@ -48,9 +45,9 @@ * The TreeView showing the Buffers *****************************************/ // Please be carefull when reimplementing methods which are used to inform the view about changes to the data -// to be on the safe side: call QTreeView's method aswell +// to be on the safe side: call QTreeView's method aswell (or TreeViewTouch's) BufferView::BufferView(QWidget *parent) - : QTreeView(parent) + : TreeViewTouch(parent) { connect(this, SIGNAL(collapsed(const QModelIndex &)), SLOT(storeExpandedState(const QModelIndex &))); connect(this, SIGNAL(expanded(const QModelIndex &)), SLOT(storeExpandedState(const QModelIndex &))); @@ -87,7 +84,6 @@ void BufferView::init() setAcceptDrops(true); setDropIndicatorShown(true); #endif - setAttribute(Qt::WA_AcceptTouchEvents); setSortingEnabled(true); sortByColumn(0, Qt::AscendingOrder); @@ -108,7 +104,7 @@ void BufferView::setModel(QAbstractItemModel *model) { delete selectionModel(); - QTreeView::setModel(model); + TreeViewTouch::setModel(model); init(); // remove old Actions QList oldactions = header()->actions(); @@ -214,48 +210,13 @@ void BufferView::joinChannel(const QModelIndex &index) Client::userInput(bufferInfo, QString("/JOIN %1").arg(bufferInfo.bufferName())); } -bool BufferView::event(QEvent *event) { - if (event->type() == QEvent::TouchBegin && _lastTouchStart < QDateTime::currentMSecsSinceEpoch() - 1000) { //(slow) double tab = normal behaviour = select multiple. 1000 ok? - _touchScrollInProgress = true; - _lastTouchStart = QDateTime::currentMSecsSinceEpoch(); - setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); - return true; - } - - if (event->type() == QEvent::TouchUpdate && _touchScrollInProgress) { - QTouchEvent::TouchPoint p = ((QTouchEvent*)event)->touchPoints().at(0); - verticalScrollBar()->setValue(verticalScrollBar()->value() - (p.pos().y() - p.lastPos().y())); - return true; - } -#if QT_VERSION >= 0x050000 - if (event->type() == QEvent::TouchEnd || event->type() == QEvent::TouchCancel) { -#else - if (event->type() == QEvent::TouchEnd) { -#endif - _touchScrollInProgress = false; - return true; - } - - return QTreeView::event(event); -} - -void BufferView::mousePressEvent(QMouseEvent * event) { - if (!_touchScrollInProgress) - QTreeView::mousePressEvent(event); -} - -void BufferView::mouseMoveEvent(QMouseEvent * event) { - if (!_touchScrollInProgress) - QTreeView::mouseMoveEvent(event); -} - void BufferView::keyPressEvent(QKeyEvent *event) { if (event->key() == Qt::Key_Backspace || event->key() == Qt::Key_Delete) { event->accept(); removeSelectedBuffers(); } - QTreeView::keyPressEvent(event); + TreeViewTouch::keyPressEvent(event); } @@ -270,23 +231,23 @@ void BufferView::dropEvent(QDropEvent *event) const int margin = 2; if (cursorPos.y() - indexRect.top() < margin || indexRect.bottom() - cursorPos.y() < margin) - return QTreeView::dropEvent(event); + return TreeViewTouch::dropEvent(event); QList > bufferList = Client::networkModel()->mimeDataToBufferList(event->mimeData()); if (bufferList.count() != 1) - return QTreeView::dropEvent(event); + return TreeViewTouch::dropEvent(event); BufferId bufferId2 = bufferList[0].second; if (index.data(NetworkModel::ItemTypeRole) != NetworkModel::BufferItemType) - return QTreeView::dropEvent(event); + return TreeViewTouch::dropEvent(event); if (index.data(NetworkModel::BufferTypeRole) != BufferInfo::QueryBuffer) - return QTreeView::dropEvent(event); + return TreeViewTouch::dropEvent(event); BufferId bufferId1 = index.data(NetworkModel::BufferIdRole).value(); if (bufferId1 == bufferId2) - return QTreeView::dropEvent(event); + return TreeViewTouch::dropEvent(event); int res = QMessageBox::question(0, tr("Merge buffers permanently?"), tr("Do you want to merge the buffer \"%1\" permanently into buffer \"%2\"?\n This cannot be reversed!").arg(Client::networkModel()->bufferName(bufferId2)).arg(Client::networkModel()->bufferName(bufferId1)), @@ -326,7 +287,7 @@ void BufferView::removeSelectedBuffers(bool permanently) void BufferView::rowsInserted(const QModelIndex &parent, int start, int end) { - QTreeView::rowsInserted(parent, start, end); + TreeViewTouch::rowsInserted(parent, start, end); // ensure that newly inserted network nodes are expanded per default if (parent.data(NetworkModel::ItemTypeRole) != NetworkModel::NetworkItemType) @@ -414,11 +375,11 @@ void BufferView::setExpandedState(const QModelIndex &networkIdx) #if QT_VERSION < 0x050000 void BufferView::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight) { - QTreeView::dataChanged(topLeft, bottomRight); + TreeViewTouch::dataChanged(topLeft, bottomRight); #else void BufferView::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector &roles) { - QTreeView::dataChanged(topLeft, bottomRight, roles); + TreeViewTouch::dataChanged(topLeft, bottomRight, roles); #endif // determine how many items have been changed and if any of them is a networkitem @@ -558,7 +519,7 @@ void BufferView::changeBuffer(Direction direction) void BufferView::wheelEvent(QWheelEvent *event) { if (ItemViewSettings().mouseWheelChangesBuffer() == (bool)(event->modifiers() & Qt::AltModifier)) - return QTreeView::wheelEvent(event); + return TreeViewTouch::wheelEvent(event); int rowDelta = (event->delta() > 0) ? -1 : 1; changeBuffer((Direction)rowDelta); @@ -589,10 +550,10 @@ void BufferView::hideCurrentBuffer() QSize BufferView::sizeHint() const { - return QTreeView::sizeHint(); + return TreeViewTouch::sizeHint(); if (!model()) - return QTreeView::sizeHint(); + return TreeViewTouch::sizeHint(); if (model()->rowCount() == 0) return QSize(120, 50); diff --git a/src/uisupport/bufferview.h b/src/uisupport/bufferview.h index aaafd615..4971e368 100644 --- a/src/uisupport/bufferview.h +++ b/src/uisupport/bufferview.h @@ -33,11 +33,12 @@ #include "bufferviewconfig.h" #include "networkmodel.h" #include "types.h" +#include "treeviewtouch.h" /***************************************** * The TreeView showing the Buffers *****************************************/ -class BufferView : public QTreeView +class BufferView : public TreeViewTouch { Q_OBJECT @@ -79,9 +80,6 @@ protected: virtual QSize sizeHint() const; virtual void focusInEvent(QFocusEvent *event) { QAbstractScrollArea::focusInEvent(event); } virtual void contextMenuEvent(QContextMenuEvent *event); - virtual bool event(QEvent *event); - virtual void mouseMoveEvent(QMouseEvent *event); - virtual void mousePressEvent(QMouseEvent *event); #if QT_VERSION < 0x050000 virtual void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight); @@ -103,8 +101,6 @@ private slots: private: QPointer _config; - qint64 _lastTouchStart = 0; - bool _touchScrollInProgress = false; enum ExpandedState { WasExpanded = 0x01, diff --git a/src/uisupport/nickview.cpp b/src/uisupport/nickview.cpp index ea29d3fe..75e4d73d 100644 --- a/src/uisupport/nickview.cpp +++ b/src/uisupport/nickview.cpp @@ -25,8 +25,6 @@ #include #include #include -#include -#include #include "buffermodel.h" #include "client.h" @@ -38,7 +36,7 @@ #include "types.h" NickView::NickView(QWidget *parent) - : QTreeView(parent) + : TreeViewTouch(parent) { setIndentation(10); header()->hide(); @@ -74,7 +72,6 @@ void NickView::init() connect(selectionModel(), SIGNAL(currentChanged(QModelIndex, QModelIndex)), SIGNAL(selectionUpdated())); connect(selectionModel(), SIGNAL(selectionChanged(QItemSelection, QItemSelection)), SIGNAL(selectionUpdated())); - setAttribute(Qt::WA_AcceptTouchEvents); } @@ -83,14 +80,14 @@ void NickView::setModel(QAbstractItemModel *model_) if (model()) disconnect(model(), 0, this, 0); - QTreeView::setModel(model_); + TreeViewTouch::setModel(model_); init(); } void NickView::rowsInserted(const QModelIndex &parent, int start, int end) { - QTreeView::rowsInserted(parent, start, end); + TreeViewTouch::rowsInserted(parent, start, end); if (model()->data(parent, NetworkModel::ItemTypeRole) == NetworkModel::UserCategoryItemType && !isExpanded(parent)) { unanimatedExpandAll(); } @@ -107,7 +104,7 @@ void NickView::setRootIndex(const QModelIndex &index) QModelIndexList NickView::selectedIndexes() const { - QModelIndexList indexList = QTreeView::selectedIndexes(); + QModelIndexList indexList = TreeViewTouch::selectedIndexes(); // make sure the item we clicked on is first if (indexList.contains(currentIndex())) { @@ -152,40 +149,4 @@ void NickView::startQuery(const QModelIndex &index) return; Client::bufferModel()->switchToOrStartQuery(networkId, ircUser->nick()); -} - -bool NickView::event(QEvent *event) { - if (event->type() == QEvent::TouchBegin && _lastTouchStart < QDateTime::currentMSecsSinceEpoch() - 1000) { //(slow) double tab = normal behaviour = select multiple. 1000 ok? - _touchScrollInProgress = true; - _lastTouchStart = QDateTime::currentMSecsSinceEpoch(); - setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); - return true; - } - - if (event->type() == QEvent::TouchUpdate && _touchScrollInProgress) { - QTouchEvent::TouchPoint p = ((QTouchEvent*)event)->touchPoints().at(0); - verticalScrollBar()->setValue(verticalScrollBar()->value() - (p.pos().y() - p.lastPos().y())); - return true; - } - -#if QT_VERSION >= 0x050000 - if (event->type() == QEvent::TouchEnd || event->type() == QEvent::TouchCancel) { -#else - if (event->type() == QEvent::TouchEnd) { -#endif - _touchScrollInProgress = false; - return true; - } - - return QTreeView::event(event); -} - -void NickView::mousePressEvent(QMouseEvent * event) { - if (!_touchScrollInProgress) - QTreeView::mousePressEvent(event); -} - -void NickView::mouseMoveEvent(QMouseEvent * event) { - if (!_touchScrollInProgress) - QTreeView::mouseMoveEvent(event); -} +} \ No newline at end of file diff --git a/src/uisupport/nickview.h b/src/uisupport/nickview.h index 8638039a..4f4981b5 100644 --- a/src/uisupport/nickview.h +++ b/src/uisupport/nickview.h @@ -24,8 +24,9 @@ #include #include "bufferinfo.h" +#include "treeviewtouch.h" -class NickView : public QTreeView +class NickView : public TreeViewTouch { Q_OBJECT @@ -37,9 +38,6 @@ protected: //! This reimplementation ensures that the current index is first in list virtual QModelIndexList selectedIndexes() const; - virtual bool event(QEvent *event); - virtual void mouseMoveEvent(QMouseEvent *event); - virtual void mousePressEvent(QMouseEvent *event); void unanimatedExpandAll(); @@ -55,8 +53,6 @@ signals: private: friend class NickListWidget; // needs selectedIndexes() - qint64 _lastTouchStart = 0; - bool _touchScrollInProgress = false; }; diff --git a/src/uisupport/treeviewtouch.cpp b/src/uisupport/treeviewtouch.cpp new file mode 100644 index 00000000..adfb9172 --- /dev/null +++ b/src/uisupport/treeviewtouch.cpp @@ -0,0 +1,67 @@ +/*************************************************************************** +* Copyright (C) 2005-2015 by the Quassel Project * +* devel@quassel-irc.org * +* * +* 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) version 3. * +* * +* 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 "treeviewtouch.h" + +#include +#include +#include + +TreeViewTouch::TreeViewTouch(QWidget *parent) + : QTreeView(parent) +{ + setAttribute(Qt::WA_AcceptTouchEvents); +} + + +bool TreeViewTouch::event(QEvent *event) { + if (event->type() == QEvent::TouchBegin && _lastTouchStart < QDateTime::currentMSecsSinceEpoch() - 1000) { //(slow) double tab = normal behaviour = select multiple. 1000 ok? + _touchScrollInProgress = true; + _lastTouchStart = QDateTime::currentMSecsSinceEpoch(); + setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); + return true; + } + + if (event->type() == QEvent::TouchUpdate && _touchScrollInProgress) { + QTouchEvent::TouchPoint p = ((QTouchEvent*)event)->touchPoints().at(0); + verticalScrollBar()->setValue(verticalScrollBar()->value() - (p.pos().y() - p.lastPos().y())); + return true; + } + +#if QT_VERSION >= 0x050000 + if (event->type() == QEvent::TouchEnd || event->type() == QEvent::TouchCancel) { +#else + if (event->type() == QEvent::TouchEnd) { +#endif + _touchScrollInProgress = false; + return true; + } + + return QTreeView::event(event); +} + +void TreeViewTouch::mousePressEvent(QMouseEvent * event) { + if (!_touchScrollInProgress) + QTreeView::mousePressEvent(event); +} + +void TreeViewTouch::mouseMoveEvent(QMouseEvent * event) { + if (!_touchScrollInProgress) + QTreeView::mouseMoveEvent(event); +}; diff --git a/src/uisupport/treeviewtouch.h b/src/uisupport/treeviewtouch.h new file mode 100644 index 00000000..e8431443 --- /dev/null +++ b/src/uisupport/treeviewtouch.h @@ -0,0 +1,43 @@ +/*************************************************************************** +* Copyright (C) 2005-2015 by the Quassel Project * +* devel@quassel-irc.org * +* * +* 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) version 3. * +* * +* 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. * +***************************************************************************/ + +#ifndef TREEVIEWTOUCH_H_ +#define TREEVIEWTOUCH_H_ + +#include +class TreeViewTouch : + public QTreeView +{ + Q_OBJECT + +public: + explicit TreeViewTouch(QWidget *parent = 0); + +protected: + virtual bool event(QEvent *event); + virtual void mouseMoveEvent(QMouseEvent *event); + virtual void mousePressEvent(QMouseEvent *event); + +private: + qint64 _lastTouchStart = 0; + bool _touchScrollInProgress = false; +}; + +#endif \ No newline at end of file -- 2.20.1