/***************************************************************************
- * Copyright (C) 2005-2018 by the Quassel Project *
+ * Copyright (C) 2005-2019 by the Quassel Project *
* devel@quassel-irc.org *
* *
* This program is free software; you can redistribute it and/or modify *
#include "bufferview.h"
-#include <QApplication>
#include <QAction>
+#include <QApplication>
#include <QFlags>
#include <QHeaderView>
#include <QLineEdit>
#include "action.h"
#include "buffermodel.h"
-#include "bufferviewfilter.h"
#include "buffersettings.h"
#include "buffersyncer.h"
+#include "bufferviewfilter.h"
#include "client.h"
#include "contextmenuactionprovider.h"
#include "graphicalui.h"
#include "network.h"
#include "networkmodel.h"
-#include "contextmenuactionprovider.h"
/*****************************************
-* The TreeView showing the Buffers
-*****************************************/
+ * 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 (or TreeViewTouch's)
-BufferView::BufferView(QWidget *parent)
+BufferView::BufferView(QWidget* parent)
: TreeViewTouch(parent)
{
connect(this, &QTreeView::collapsed, this, &BufferView::storeExpandedState);
setSelectionMode(QAbstractItemView::ExtendedSelection);
- QAbstractItemDelegate *oldDelegate = itemDelegate();
- auto *tristateDelegate = new BufferViewDelegate(this);
+ QAbstractItemDelegate* oldDelegate = itemDelegate();
+ auto* tristateDelegate = new BufferViewDelegate(this);
setItemDelegate(tristateDelegate);
delete oldDelegate;
}
-
void BufferView::init()
{
header()->setContextMenuPolicy(Qt::ActionsContextMenu);
// New entries will be expanded automatically when added; no need to call expandAll()
- header()->hide(); // nobody seems to use this anyway
+ header()->hide(); // nobody seems to use this anyway
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
#endif
}
-
-void BufferView::setModel(QAbstractItemModel *model)
+void BufferView::setModel(QAbstractItemModel* model)
{
delete selectionModel();
TreeViewTouch::setModel(model);
init();
// remove old Actions
- QList<QAction *> oldactions = header()->actions();
- foreach(QAction *action, oldactions) {
+ QList<QAction*> oldactions = header()->actions();
+ foreach (QAction* action, oldactions) {
header()->removeAction(action);
action->deleteLater();
}
return;
QString sectionName;
- QAction *showSection;
+ QAction* showSection;
for (int i = 1; i < model->columnCount(); i++) {
sectionName = (model->headerData(i, Qt::Horizontal, Qt::DisplayRole)).toString();
showSection = new QAction(sectionName, header());
setExpandedState();
}
-
-void BufferView::setFilteredModel(QAbstractItemModel *model_, BufferViewConfig *config)
+void BufferView::setFilteredModel(QAbstractItemModel* model_, BufferViewConfig* config)
{
- auto *filter = qobject_cast<BufferViewFilter *>(model());
+ auto* filter = qobject_cast<BufferViewFilter*>(model());
if (filter) {
filter->setConfig(config);
setConfig(config);
setModel(model_);
}
else {
- auto *filter = new BufferViewFilter(model_, config);
+ auto* filter = new BufferViewFilter(model_, config);
setModel(filter);
connect(filter, &BufferViewFilter::configChanged, this, &BufferView::on_configChanged);
}
setConfig(config);
}
-
-void BufferView::setConfig(BufferViewConfig *config)
+void BufferView::setConfig(BufferViewConfig* config)
{
if (_config == config)
return;
}
}
-
-void BufferView::setRootIndexForNetworkId(const NetworkId &networkId)
+void BufferView::setRootIndexForNetworkId(const NetworkId& networkId)
{
if (!networkId.isValid() || !model()) {
setIndentation(10);
}
}
-
-void BufferView::joinChannel(const QModelIndex &index)
+void BufferView::joinChannel(const QModelIndex& index)
{
BufferInfo::Type bufferType = (BufferInfo::Type)index.data(NetworkModel::BufferTypeRole).value<int>();
Client::userInput(bufferInfo, QString("/JOIN %1").arg(bufferInfo.bufferName()));
}
-
-void BufferView::dropEvent(QDropEvent *event)
+void BufferView::dropEvent(QDropEvent* event)
{
QModelIndex index = indexAt(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)
+ 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<QPair<NetworkId, BufferId> > bufferList = Client::networkModel()->mimeDataToBufferList(event->mimeData());
+ QList<QPair<NetworkId, BufferId>> bufferList = Client::networkModel()->mimeDataToBufferList(event->mimeData());
if (bufferList.count() != 1)
return TreeViewTouch::dropEvent(event);
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)
+ // 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)
+ 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(nullptr, 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);
+ int res = QMessageBox::question(nullptr,
+ 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);
if (res == QMessageBox::Yes) {
Client::mergeBuffersPermanently(bufferId1, bufferId2);
}
}
-
void BufferView::removeSelectedBuffers(bool permanently)
{
if (!config())
BufferId bufferId;
QSet<BufferId> removedRows;
- foreach(QModelIndex index, selectionModel()->selectedIndexes()) {
+ foreach (QModelIndex index, selectionModel()->selectedIndexes()) {
if (index.data(NetworkModel::ItemTypeRole) != NetworkModel::BufferItemType)
continue;
removedRows << bufferId;
}
- foreach(BufferId bufferId, removedRows) {
+ foreach (BufferId bufferId, removedRows) {
if (permanently)
config()->requestRemoveBufferPermanently(bufferId);
else
}
}
-
-void BufferView::rowsInserted(const QModelIndex &parent, int start, int end)
+void BufferView::rowsInserted(const QModelIndex& parent, int start, int end)
{
TreeViewTouch::rowsInserted(parent, start, end);
setExpandedState(parent);
}
-
void BufferView::on_layoutChanged()
{
int numNets = model()->rowCount(QModelIndex());
}
}
-
void BufferView::on_configChanged()
{
Q_ASSERT(model());
}
}
-
void BufferView::setExpandedState()
{
// Expand all active networks, collapse inactive ones... unless manually changed
NetworkId networkId;
for (int row = 0; row < model()->rowCount(); row++) {
networkIdx = model()->index(row, 0);
- if (model()->rowCount(networkIdx) == 0)
+ if (model()->rowCount(networkIdx) == 0)
continue;
networkId = model()->data(networkIdx, NetworkModel::NetworkIdRole).value<NetworkId>();
}
}
-
-void BufferView::storeExpandedState(const QModelIndex &networkIdx)
+void BufferView::storeExpandedState(const QModelIndex& networkIdx)
{
NetworkId networkId = model()->data(networkIdx, NetworkModel::NetworkIdRole).value<NetworkId>();
_expandedState[networkId] = oldState;
}
-
-void BufferView::setExpandedState(const QModelIndex &networkIdx)
+void BufferView::setExpandedState(const QModelIndex& networkIdx)
{
if (model()->data(networkIdx, NetworkModel::ItemTypeRole) != NetworkModel::NetworkItemType)
return;
update(networkIdx);
setExpanded(networkIdx, expandNetwork);
}
- storeExpandedState(networkIdx); // this call is needed to keep track of the isActive state
+ storeExpandedState(networkIdx); // this call is needed to keep track of the isActive state
}
-void BufferView::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles)
+void BufferView::dataChanged(const QModelIndex& topLeft, const QModelIndex& bottomRight, const QVector<int>& roles)
{
TreeViewTouch::dataChanged(topLeft, bottomRight, roles);
}
}
-
void BufferView::toggleHeader(bool checked)
{
- auto *action = qobject_cast<QAction *>(sender());
+ auto* action = qobject_cast<QAction*>(sender());
header()->setSectionHidden((action->property("column")).toInt(), !checked);
}
-
-void BufferView::contextMenuEvent(QContextMenuEvent *event)
+void BufferView::contextMenuEvent(QContextMenuEvent* event)
{
QModelIndex index = indexAt(event->pos());
if (!index.isValid())
contextMenu.exec(QCursor::pos());
}
-
-void BufferView::addActionsToMenu(QMenu *contextMenu, const QModelIndex &index)
+void BufferView::addActionsToMenu(QMenu* contextMenu, const QModelIndex& index)
{
QModelIndexList indexList = selectedIndexes();
// make sure the item we clicked on is first
GraphicalUi::contextMenuActionProvider()->addActions(contextMenu, indexList, this, &BufferView::menuActionTriggered, (bool)config());
}
-
-void BufferView::addFilterActions(QMenu *contextMenu, const QModelIndex &index)
+void BufferView::addFilterActions(QMenu* contextMenu, const QModelIndex& index)
{
- auto *filter = qobject_cast<BufferViewFilter *>(model());
+ auto* filter = qobject_cast<BufferViewFilter*>(model());
if (filter) {
- QList<QAction *> filterActions = filter->actions(index);
+ QList<QAction*> filterActions = filter->actions(index);
if (!filterActions.isEmpty()) {
contextMenu->addSeparator();
- foreach(QAction *action, filterActions) {
+ foreach (QAction* action, filterActions) {
contextMenu->addAction(action);
}
}
}
}
-
-void BufferView::menuActionTriggered(QAction *result)
+void BufferView::menuActionTriggered(QAction* result)
{
ContextMenuActionProvider::ActionType type = (ContextMenuActionProvider::ActionType)result->data().toInt();
switch (type) {
}
}
-
void BufferView::nextBuffer()
{
changeBuffer(Forward);
}
-
void BufferView::previousBuffer()
{
changeBuffer(Backward);
}
-
void BufferView::changeBuffer(Direction direction)
{
QModelIndex currentIndex = selectionModel()->currentIndex();
QModelIndex lastNetIndex = model()->index(model()->rowCount() - 1, 0, QModelIndex());
if (currentIndex.parent().isValid()) {
- //If we are a child node just switch among siblings unless it's the first/last child
+ // If we are a child node just switch among siblings unless it's the first/last child
resultingIndex = currentIndex.sibling(currentIndex.row() + direction, 0);
if (!resultingIndex.isValid()) {
}
}
else {
- //If we have a toplevel node, try and get an adjacent child
+ // If we have a toplevel node, try and get an adjacent child
if (direction == Backward) {
QModelIndex newParent = currentIndex.sibling(currentIndex.row() - 1, 0);
if (currentIndex.row() == 0)
newParent = lastNetIndex;
if (model()->hasChildren(newParent))
- resultingIndex = newParent.child(model()->rowCount(newParent) - 1, 0);
+ resultingIndex = newParent.model()->index(model()->rowCount(newParent) - 1, 0, newParent);
else
resultingIndex = newParent;
}
else {
if (model()->hasChildren(currentIndex))
- resultingIndex = currentIndex.child(0, 0);
+ resultingIndex = currentIndex.model()->index(0, 0, currentIndex);
else
resultingIndex = currentIndex.sibling(currentIndex.row() + 1, 0);
}
if (direction == Forward)
resultingIndex = model()->index(0, 0, QModelIndex());
else
- resultingIndex = lastNetIndex.child(model()->rowCount(lastNetIndex) - 1, 0);
+ resultingIndex = lastNetIndex.model()->index(model()->rowCount(lastNetIndex) - 1, 0, lastNetIndex);
}
selectionModel()->setCurrentIndex(resultingIndex, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows);
selectionModel()->select(bufferIndex, QItemSelectionModel::ClearAndSelect);
}
-void BufferView::wheelEvent(QWheelEvent *event)
+void BufferView::wheelEvent(QWheelEvent* event)
{
if (ItemViewSettings().mouseWheelChangesBuffer() == (bool)(event->modifiers() & Qt::AltModifier))
return TreeViewTouch::wheelEvent(event);
changeBuffer((Direction)rowDelta);
}
-
void BufferView::hideCurrentBuffer()
{
QModelIndex index = selectionModel()->currentIndex();
BufferId bufferId = index.data(NetworkModel::BufferIdRole).value<BufferId>();
- //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.
+ // 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);
config()->requestRemoveBuffer(bufferId);
void BufferView::filterTextChanged(const QString& filterString)
{
- auto *filter = qobject_cast<BufferViewFilter *>(model());
+ auto* filter = qobject_cast<BufferViewFilter*>(model());
if (!filter) {
return;
}
filter->setFilterString(filterString);
- on_configChanged(); // make sure collapsation is correct
+ on_configChanged(); // make sure collapsation is correct
}
-
-QSize BufferView::sizeHint() const
-{
- return TreeViewTouch::sizeHint();
-
- if (!model())
- return TreeViewTouch::sizeHint();
-
- if (model()->rowCount() == 0)
- return {120, 50};
-
- int columnSize = 0;
- for (int i = 0; i < model()->columnCount(); i++) {
- if (!isColumnHidden(i))
- columnSize += sizeHintForColumn(i);
- }
- return {columnSize, 50};
-}
-
-
void BufferView::changeHighlight(BufferView::Direction direction)
{
// If for some weird reason we get a new delegate
if (direction == Backward) {
newIndex = indexBelow(newIndex);
- } else {
+ }
+ else {
newIndex = indexAbove(newIndex);
}
if (_currentHighlight.isValid()) {
selectionModel()->setCurrentIndex(_currentHighlight, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows);
selectionModel()->select(_currentHighlight, QItemSelectionModel::ClearAndSelect);
- } else {
+ }
+ else {
selectFirstBuffer();
}
class ColorsChangedEvent : public QEvent
{
public:
- ColorsChangedEvent() : QEvent(QEvent::User) {};
+ ColorsChangedEvent()
+ : QEvent(QEvent::User){};
};
-
-BufferViewDelegate::BufferViewDelegate(QObject *parent)
+BufferViewDelegate::BufferViewDelegate(QObject* parent)
: QStyledItemDelegate(parent)
-{
-}
+{}
-
-void BufferViewDelegate::customEvent(QEvent *event)
+void BufferViewDelegate::customEvent(QEvent* event)
{
if (event->type() != QEvent::User)
return;
event->accept();
}
-
-bool BufferViewDelegate::editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
+bool BufferViewDelegate::editorEvent(QEvent* event, QAbstractItemModel* model, const QStyleOptionViewItem& option, const QModelIndex& index)
{
if (event->type() != QEvent::MouseButtonRelease)
return QStyledItemDelegate::editorEvent(event, model, option, index);
initStyleOption(&viewOpt, index);
QRect checkRect = viewOpt.widget->style()->subElementRect(QStyle::SE_ItemViewItemCheckIndicator, &viewOpt, viewOpt.widget);
- auto *me = static_cast<QMouseEvent *>(event);
+ auto* me = static_cast<QMouseEvent*>(event);
if (me->button() != Qt::LeftButton || !checkRect.contains(me->pos()))
return QStyledItemDelegate::editorEvent(event, model, option, index);
return true;
}
-
// ==============================
// BufferView Dock
// ==============================
-BufferViewDock::BufferViewDock(BufferViewConfig *config, QWidget *parent)
- : QDockWidget(parent),
- _childWidget(nullptr),
- _widget(new QWidget(parent)),
- _filterEdit(new QLineEdit(parent)),
- _active(false),
- _title(config->bufferViewName())
+BufferViewDock::BufferViewDock(BufferViewConfig* config, QWidget* parent)
+ : QDockWidget(parent)
+ , _childWidget(nullptr)
+ , _widget(new QWidget(parent))
+ , _filterEdit(new QLineEdit(parent))
+ , _active(false)
+ , _title(config->bufferViewName())
{
setObjectName("BufferViewDock-" + QString::number(config->bufferViewId()));
toggleViewAction()->setData(config->bufferViewId());
- setAllowedAreas(Qt::RightDockWidgetArea|Qt::LeftDockWidgetArea);
+ setAllowedAreas(Qt::RightDockWidgetArea | Qt::LeftDockWidgetArea);
connect(config, &BufferViewConfig::bufferViewNameSet, this, &BufferViewDock::bufferViewRenamed);
connect(config, &BufferViewConfig::configChanged, this, &BufferViewDock::configChanged);
updateTitle();
QDockWidget::setWidget(_widget);
}
-void BufferViewDock::setLocked(bool locked) {
+void BufferViewDock::setLocked(bool locked)
+{
if (locked) {
setFeatures(nullptr);
}
_filterEdit->setVisible(false);
}
- BufferView *view = bufferView();
+ BufferView* view = bufferView();
if (!view) {
return;
}
if (!_filterEdit->text().isEmpty()) {
view->selectHighlighted();
_filterEdit->clear();
- } else {
+ }
+ else {
view->clearHighlight();
}
}
}
}
-bool BufferViewDock::eventFilter(QObject *object, QEvent *event)
+bool BufferViewDock::eventFilter(QObject* object, QEvent* event)
{
- if (object != _filterEdit) {
- return false;
- }
+ if (object != _filterEdit) {
+ return false;
+ }
if (event->type() == QEvent::FocusOut) {
if (!config()->showSearch() && _filterEdit->text().isEmpty()) {
_filterEdit->setVisible(false);
return true;
}
- } else if (event->type() == QEvent::KeyRelease) {
+ }
+ else if (event->type() == QEvent::KeyRelease) {
auto keyEvent = static_cast<QKeyEvent*>(event);
- BufferView *view = bufferView();
+ BufferView* view = bufferView();
if (!view) {
return false;
}
return false;
}
-void BufferViewDock::bufferViewRenamed(const QString &newName)
+void BufferViewDock::bufferViewRenamed(const QString& newName)
{
_title = newName;
updateTitle();
toggleViewAction()->setText(newName);
}
-
int BufferViewDock::bufferViewId() const
{
- BufferView *view = bufferView();
+ BufferView* view = bufferView();
if (!view)
return 0;
return 0;
}
-
-BufferViewConfig *BufferViewDock::config() const
+BufferViewConfig* BufferViewDock::config() const
{
- BufferView *view = bufferView();
+ BufferView* view = bufferView();
if (!view)
return nullptr;
else
return view->config();
}
-void BufferViewDock::setWidget(QWidget *newWidget)
+void BufferViewDock::setWidget(QWidget* newWidget)
{
_widget->layout()->addWidget(newWidget);
_childWidget = newWidget;