X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fuisupport%2Fbufferview.cpp;h=e1ff7db17ae98bd0c2917d73580fc3cd2bf6a542;hp=d0921466749cc9abb626c5e3190f5507454433e1;hb=35ca85f1c4371ee28d00d5ff0195a5b44aadb299;hpb=81b65f9fe655e291ae7b547fd8b649791cddf41e diff --git a/src/uisupport/bufferview.cpp b/src/uisupport/bufferview.cpp index d0921466..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 * @@ -45,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 &))); @@ -68,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 @@ -88,14 +88,13 @@ void BufferView::init() 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 } @@ -104,7 +103,7 @@ void BufferView::setModel(QAbstractItemModel *model) { delete selectionModel(); - QTreeView::setModel(model); + TreeViewTouch::setModel(model); init(); // remove old Actions QList oldactions = header()->actions(); @@ -129,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(); } @@ -158,21 +162,6 @@ void BufferView::setFilteredModel(QAbstractItemModel *model_, BufferViewConfig * } -void BufferView::setSelectionModel(QItemSelectionModel *selectionModel) -{ - if (QTreeView::selectionModel()) - disconnect(selectionModel, SIGNAL(currentChanged(QModelIndex, QModelIndex)), - model(), SIGNAL(checkPreviousCurrentForRemoval(QModelIndex, QModelIndex))); - - QTreeView::setSelectionModel(selectionModel); - BufferViewFilter *filter = qobject_cast(model()); - if (filter) { - connect(selectionModel, SIGNAL(currentChanged(QModelIndex, QModelIndex)), - filter, SLOT(checkPreviousCurrentForRemoval(QModelIndex, QModelIndex))); - } -} - - void BufferView::setConfig(BufferViewConfig *config) { if (_config == config) @@ -232,7 +221,7 @@ void BufferView::keyPressEvent(QKeyEvent *event) event->accept(); removeSelectedBuffers(); } - QTreeView::keyPressEvent(event); + TreeViewTouch::keyPressEvent(event); } @@ -244,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); @@ -303,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) @@ -327,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++) { @@ -341,11 +359,6 @@ void BufferView::on_configChanged() setExpandedState(networkIdx); } - - if (config()) { - // update selection to current one - Client::bufferModel()->synchronizeView(this); - } } @@ -391,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 @@ -535,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); @@ -566,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); @@ -620,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);