X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fuisupport%2Fbufferview.cpp;h=7d7490f5b260f635b68028edaa9f47a153718de1;hp=30cf217b729c5d97d1e30b2994be9497daa45d0c;hb=dd27cd1f84ecceb5fb287894373d4cb42131a03f;hpb=f84a3fd303cbea73a7c9b3839e417862fea43baa diff --git a/src/uisupport/bufferview.cpp b/src/uisupport/bufferview.cpp index 30cf217b..7d7490f5 100644 --- a/src/uisupport/bufferview.cpp +++ b/src/uisupport/bufferview.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2016 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 * @@ -69,10 +69,12 @@ 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 + setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + // breaks with Qt 4.8 if (QString("4.8.0") > qVersion()) // FIXME breaks with Qt versions >= 4.10! setAnimated(true); @@ -89,14 +91,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 } @@ -130,6 +131,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(); } @@ -212,16 +218,6 @@ void BufferView::joinChannel(const QModelIndex &index) } -void BufferView::keyPressEvent(QKeyEvent *event) -{ - if (event->key() == Qt::Key_Backspace || event->key() == Qt::Key_Delete) { - event->accept(); - removeSelectedBuffers(); - } - TreeViewTouch::keyPressEvent(event); -} - - void BufferView::dropEvent(QDropEvent *event) { QModelIndex index = indexAt(event->pos()); @@ -230,27 +226,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 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 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) + // 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 TreeViewTouch::dropEvent(event); - if (index.data(NetworkModel::BufferTypeRole) != BufferInfo::QueryBuffer) + // 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); - BufferId bufferId1 = index.data(NetworkModel::BufferIdRole).value(); - if (bufferId1 == bufferId2) + //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); @@ -313,7 +326,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++) { @@ -327,11 +352,6 @@ void BufferView::on_configChanged() setExpandedState(networkIdx); } - - if (config()) { - // update selection to current one - Client::bufferModel()->synchronizeView(this); - } } @@ -563,13 +583,6 @@ void BufferView::hideCurrentBuffer() //The check above means we won't be looking at a network, which should always be the first row, so we can just go backwards. changeBuffer(Backward); - /*if(removedRows.contains(bufferId)) - continue; - - removedRows << bufferId;*/ - /*if(permanently) - config()->requestRemoveBufferPermanently(bufferId); - else*/ config()->requestRemoveBuffer(bufferId); } @@ -640,7 +653,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); @@ -694,6 +711,14 @@ BufferViewDock::BufferViewDock(BufferViewConfig *config, QWidget *parent) QDockWidget::setWidget(_widget); } +void BufferViewDock::setLocked(bool locked) { + if (locked) { + setFeatures(0); + } + else { + setFeatures(QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetFloatable); + } +} void BufferViewDock::updateTitle() { @@ -715,7 +740,7 @@ void BufferViewDock::onFilterReturnPressed() { if (_oldFocusItem) { _oldFocusItem->setFocus(); - _oldFocusItem.clear(); + _oldFocusItem = 0; } if (!config()->showSearch()) { @@ -763,7 +788,7 @@ bool BufferViewDock::eventFilter(QObject *object, QEvent *event) if (_oldFocusItem) { _oldFocusItem->setFocus(); - _oldFocusItem.clear(); + _oldFocusItem = 0; } return true;