X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fuisupport%2Fbufferview.cpp;h=e1ff7db17ae98bd0c2917d73580fc3cd2bf6a542;hp=dd5005323244276ba0d466f2247dccd34e576136;hb=35ca85f1c4371ee28d00d5ff0195a5b44aadb299;hpb=1c5537d85f9cf3dee9562ed7ea557fdfde9f8d8e diff --git a/src/uisupport/bufferview.cpp b/src/uisupport/bufferview.cpp index dd500532..e1ff7db1 100644 --- a/src/uisupport/bufferview.cpp +++ b/src/uisupport/bufferview.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2015 by the Quassel Project * + * Copyright (C) 2005-2018 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -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 &))); @@ -71,7 +68,7 @@ void BufferView::init() hideColumn(2); setIndentation(10); - expandAll(); + // New entries will be expanded automatically when added; no need to call expandAll() header()->hide(); // nobody seems to use this anyway @@ -87,19 +84,17 @@ void BufferView::init() setAcceptDrops(true); setDropIndicatorShown(true); #endif - setAttribute(Qt::WA_AcceptTouchEvents); setSortingEnabled(true); sortByColumn(0, Qt::AscendingOrder); - // activated() fails on X11 and Qtopia at least -#if defined Q_WS_QWS || defined Q_WS_X11 - disconnect(this, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(joinChannel(QModelIndex))); - connect(this, SIGNAL(doubleClicked(QModelIndex)), SLOT(joinChannel(QModelIndex))); -#else +#if defined Q_OS_MACOS || defined Q_OS_WIN // afaik this is better on Mac and Windows disconnect(this, SIGNAL(activated(QModelIndex)), this, SLOT(joinChannel(QModelIndex))); connect(this, SIGNAL(activated(QModelIndex)), SLOT(joinChannel(QModelIndex))); +#else + disconnect(this, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(joinChannel(QModelIndex))); + connect(this, SIGNAL(doubleClicked(QModelIndex)), SLOT(joinChannel(QModelIndex))); #endif } @@ -108,7 +103,7 @@ void BufferView::setModel(QAbstractItemModel *model) { delete selectionModel(); - QTreeView::setModel(model); + TreeViewTouch::setModel(model); init(); // remove old Actions QList oldactions = header()->actions(); @@ -133,6 +128,11 @@ void BufferView::setModel(QAbstractItemModel *model) } connect(model, SIGNAL(layoutChanged()), this, SLOT(on_layoutChanged())); + + // Make sure collapsation is correct after setting a model + // This might not be needed here, only in BufferView::setFilteredModel(). If issues arise, just + // move down to setFilteredModel (which calls this function). + setExpandedState(); } @@ -214,40 +214,6 @@ 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) { @@ -255,7 +221,7 @@ void BufferView::keyPressEvent(QKeyEvent *event) event->accept(); removeSelectedBuffers(); } - QTreeView::keyPressEvent(event); + TreeViewTouch::keyPressEvent(event); } @@ -267,27 +233,44 @@ void BufferView::dropEvent(QDropEvent *event) QPoint cursorPos = event->pos(); // check if we're really _on_ the item and not indicating a move to just above or below the item + // Magic margin number for this is from QAbstractItemViewPrivate::position() const int margin = 2; if (cursorPos.y() - indexRect.top() < margin || indexRect.bottom() - cursorPos.y() < margin) - return QTreeView::dropEvent(event); + return TreeViewTouch::dropEvent(event); + // If more than one buffer was being dragged, treat this as a rearrangement instead of a merge request QList > bufferList = Client::networkModel()->mimeDataToBufferList(event->mimeData()); if (bufferList.count() != 1) - return QTreeView::dropEvent(event); + return TreeViewTouch::dropEvent(event); + // Get the Buffer ID of the buffer that was being dragged BufferId bufferId2 = bufferList[0].second; - if (index.data(NetworkModel::ItemTypeRole) != NetworkModel::BufferItemType) - return QTreeView::dropEvent(event); - - if (index.data(NetworkModel::BufferTypeRole) != BufferInfo::QueryBuffer) - return QTreeView::dropEvent(event); - + // Get the Buffer ID of the target buffer BufferId bufferId1 = index.data(NetworkModel::BufferIdRole).value(); + + // If the source and target are the same buffer, this was an aborted rearrangement if (bufferId1 == bufferId2) - return QTreeView::dropEvent(event); + return TreeViewTouch::dropEvent(event); + + // Get index of buffer that was being dragged + QModelIndex index2 = Client::networkModel()->bufferIndex(bufferId2); + // If the buffer being dragged is a channel and we're still joined to it, treat this as a rearrangement + // This prevents us from being joined to a channel with no associated UI elements + if (index2.data(NetworkModel::BufferTypeRole) == BufferInfo::ChannelBuffer && index2.data(NetworkModel::ItemActiveRole) == true) + return TreeViewTouch::dropEvent(event); + + //If the source buffer is not mergeable(AKA not a Channel and not a Query), try rearranging instead + if (index2.data(NetworkModel::BufferTypeRole) != BufferInfo::ChannelBuffer && index2.data(NetworkModel::BufferTypeRole) != BufferInfo::QueryBuffer) + return TreeViewTouch::dropEvent(event); + + // If the target buffer is not mergeable(AKA not a Channel and not a Query), try rearranging instead + if (index.data(NetworkModel::BufferTypeRole) != BufferInfo::ChannelBuffer && index.data(NetworkModel::BufferTypeRole) != BufferInfo::QueryBuffer) + return TreeViewTouch::dropEvent(event); + + // Confirm that the user really wants to merge the buffers before doing so 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)), QMessageBox::Yes|QMessageBox::No, QMessageBox::No); @@ -326,7 +309,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) @@ -350,7 +333,19 @@ void BufferView::on_configChanged() { Q_ASSERT(model()); - // expand all active networks... collapse inactive ones... unless manually changed + // Expand/collapse as needed + setExpandedState(); + + if (config()) { + // update selection to current one + Client::bufferModel()->synchronizeView(this); + } +} + + +void BufferView::setExpandedState() +{ + // Expand all active networks, collapse inactive ones... unless manually changed QModelIndex networkIdx; NetworkId networkId; for (int row = 0; row < model()->rowCount(); row++) { @@ -364,11 +359,6 @@ void BufferView::on_configChanged() setExpandedState(networkIdx); } - - if (config()) { - // update selection to current one - Client::bufferModel()->synchronizeView(this); - } } @@ -414,11 +404,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 +548,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 +579,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); @@ -643,7 +633,11 @@ bool BufferViewDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, c if (!value.isValid()) return QStyledItemDelegate::editorEvent(event, model, option, index); +#if QT_VERSION < 0x050000 QStyleOptionViewItemV4 viewOpt(option); +#else + QStyleOptionViewItem viewOpt(option); +#endif initStyleOption(&viewOpt, index); QRect checkRect = viewOpt.widget->style()->subElementRect(QStyle::SE_ItemViewItemCheckIndicator, &viewOpt, viewOpt.widget);