Closes GH-198.
# Setting COMPILE_DEFINITIONS_<CONFIG> is deprecated since CMake 3.0 in favor of generator expressions.
# These have existed since CMake 2.8.10; until we depend on that, we have to explicitly enable the old policy.
-if (CMAKE_MAJOR_VERSION GREATER 2)
+if (POLICY CMP0043)
cmake_policy(SET CMP0043 OLD)
endif()
# Honor visibility settings for all target types
-if (CMAKE_VERSION VERSION_GREATER 3.3)
+if (POLICY CMP0063)
cmake_policy(SET CMP0063 NEW)
endif()
_currentScaleFactor = 1;
_invalidateFilter = false;
+ setAttribute(Qt::WA_AcceptTouchEvents);
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
setAlignment(Qt::AlignLeft|Qt::AlignBottom);
}
}
- if (event->type() == QEvent::Wheel) {
+ if (event->type() == QEvent::TouchBegin) {
+ // Enable scrolling by draging, disable selecting/clicking content
+ setDragMode(QGraphicsView::ScrollHandDrag);
+ setInteractive(false);
+ // if scrollbar is not visible we need to request backlog below else we need to accept
+ // the event now (return true) so that we will receive TouchUpdate and TouchEnd/TouchCancel
+ if (verticalScrollBar()->isVisible()) return true;
+ }
+
+#if QT_VERSION >= 0x050000
+ if (event->type() == QEvent::TouchEnd || event->type() == QEvent::TouchCancel) {
+#else
+ if (event->type() == QEvent::TouchEnd) {
+#endif
+ // End scroll and reset settings to default
+ setDragMode(QGraphicsView::NoDrag);
+ setInteractive(true);
+ _firstTouchUpdateHappened = false;
+ return true;
+ }
+
+ if (event->type() == QEvent::TouchUpdate) {
+ if (!_firstTouchUpdateHappened) {
+ // After the first movement of a Touch-Point, calculate the distance in both axis
+ // and if the point moved more horizontally abort scroll.
+ QTouchEvent::TouchPoint p = ((QTouchEvent*)event)->touchPoints().at(0);
+ double dx = qAbs(p.lastPos().x() - p.pos().x());
+ double dy = qAbs(p.lastPos().y() - p.pos().y());
+ if (dx > dy) {
+ setDragMode(QGraphicsView::NoDrag);
+ setInteractive(true);
+ }
+ _firstTouchUpdateHappened = true;
+ }
+ // Applying the movement happens automatically by the drag-mode
+ }
+
+ if (event->type() == QEvent::Wheel || event->type() == QEvent::TouchBegin || event->type() == QEvent::TouchUpdate) {
if (!verticalScrollBar()->isVisible()) {
scene()->requestBacklog();
return true;
int _scrollOffset;
bool _invalidateFilter;
QSet<ChatLine *> _linesWithCache;
+ bool _firstTouchUpdateHappened = false;
};
styledlabel.cpp
tabcompleter.cpp
toolbaractionprovider.cpp
+ treeviewtouch.cpp
uisettings.cpp
uistyle.cpp
* 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 &)));
{
delete selectionModel();
- QTreeView::setModel(model);
+ TreeViewTouch::setModel(model);
init();
// remove old Actions
QList<QAction *> oldactions = header()->actions();
event->accept();
removeSelectedBuffers();
}
- QTreeView::keyPressEvent(event);
+ TreeViewTouch::keyPressEvent(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<QPair<NetworkId, BufferId> > 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<BufferId>();
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)),
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)
#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<int> &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
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);
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);
#include <QDockWidget>
#include <QModelIndex>
#include <QStyledItemDelegate>
-#include <QTreeView>
#include <QPointer>
#include "actioncollection.h"
#include "bufferviewconfig.h"
#include "networkmodel.h"
+#include "treeviewtouch.h"
#include "types.h"
/*****************************************
* The TreeView showing the Buffers
*****************************************/
-class BufferView : public QTreeView
+class BufferView : public TreeViewTouch
{
Q_OBJECT
#include "types.h"
NickView::NickView(QWidget *parent)
- : QTreeView(parent)
+ : TreeViewTouch(parent)
{
setIndentation(10);
header()->hide();
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();
}
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())) {
#include <QTreeView>
#include "bufferinfo.h"
+#include "treeviewtouch.h"
-class NickView : public QTreeView
+class NickView : public TreeViewTouch
{
Q_OBJECT
--- /dev/null
+/***************************************************************************
+ * Copyright (C) 2005-2016 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 <QEvent>
+#include <QScrollBar>
+#include <QTouchEvent>
+
+
+TreeViewTouch::TreeViewTouch(QWidget *parent)
+ : QTreeView(parent)
+{
+ setAttribute(Qt::WA_AcceptTouchEvents);
+}
+
+
+bool TreeViewTouch::event(QEvent *event) {
+ if (event->type() == QEvent::TouchBegin) {
+ // Register that we may be scrolling, set the scroll mode to scroll-per-pixel
+ // and accept the event (return true) so that we will receive TouchUpdate and TouchEnd/TouchCancel
+ _touchScrollInProgress = true;
+ setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
+ return true;
+ }
+
+ if (event->type() == QEvent::TouchUpdate && _touchScrollInProgress) {
+ QTouchEvent::TouchPoint p = ((QTouchEvent*)event)->touchPoints().at(0);
+ if (!_firstTouchUpdateHappened) {
+ // After the first movement of a Touch-Point, calculate the distance in both axis
+ // and if the point moved more horizontally abort scroll.
+ double dx = qAbs(p.lastPos().x() - p.pos().x());
+ double dy = qAbs(p.lastPos().y() - p.pos().y());
+ if (dx > dy) {
+ _touchScrollInProgress = false;
+ }
+ _firstTouchUpdateHappened = true;
+ }
+ // Apply touch movement to scrollbar
+ 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
+ // End scroll and reset variables
+ _touchScrollInProgress = false;
+ _firstTouchUpdateHappened = 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);
+};
--- /dev/null
+/***************************************************************************
+ * Copyright (C) 2005-2016 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. *
+ ***************************************************************************/
+
+#pragma once
+
+#include <QTreeView>
+
+/**
+* This class handles Touch Events for TreeViews
+*/
+class TreeViewTouch : public QTreeView
+{
+ Q_OBJECT
+
+public:
+ explicit TreeViewTouch(QWidget *parent = 0);
+
+protected:
+
+ /**
+ * Handles Events
+ *
+ * @param[in,out] an event
+ * @returns true if event got handled, false if event got ignored
+ */
+ bool event(QEvent *event) override;
+
+ /**
+ * Handles Mouse Move Events
+ *
+ * Suppresses Events during Touch-Scroll
+ *
+ * @param[in,out] An Event
+ */
+ void mouseMoveEvent(QMouseEvent *event) override;
+
+ /**
+ * Handles Mouse Press Events
+ *
+ * Suppresses Events during Touch-Scroll
+ *
+ * @param[in,out] An Event
+ */
+ void mousePressEvent(QMouseEvent *event) override;
+
+private:
+ bool _touchScrollInProgress = false;
+ bool _firstTouchUpdateHappened = false;
+};