1 /***************************************************************************
2 * Copyright (C) 2005-2018 by the Quassel Project *
3 * devel@quassel-irc.org *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) version 3. *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the *
17 * Free Software Foundation, Inc., *
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
19 ***************************************************************************/
21 #include "nicklistwidget.h"
23 #include <QAbstractButton>
28 #include "buffermodel.h"
30 #include "networkmodel.h"
32 #include "nickviewfilter.h"
33 #include "qtuisettings.h"
35 NickListWidget::NickListWidget(QWidget* parent)
36 : AbstractItemView(parent)
41 QDockWidget* NickListWidget::dock() const
43 auto* dock = qobject_cast<QDockWidget*>(parent());
50 void NickListWidget::hideEvent(QHideEvent* event)
52 emit nickSelectionChanged(QModelIndexList());
53 AbstractItemView::hideEvent(event);
56 void NickListWidget::showEvent(QShowEvent* event)
58 auto* view = qobject_cast<NickView*>(ui.stackedWidget->currentWidget());
60 emit nickSelectionChanged(view->selectedIndexes());
62 AbstractItemView::showEvent(event);
65 void NickListWidget::showWidget(bool visible)
67 if (!selectionModel())
70 QModelIndex currentIndex = selectionModel()->currentIndex();
71 if (currentIndex.data(NetworkModel::BufferTypeRole) == BufferInfo::ChannelBuffer) {
72 QDockWidget* dock_ = dock();
83 void NickListWidget::setVisible(bool visible)
85 QWidget::setVisible(visible);
86 QDockWidget* dock_ = dock();
96 void NickListWidget::currentChanged(const QModelIndex& current, const QModelIndex& previous)
98 BufferInfo::Type bufferType = (BufferInfo::Type)current.data(NetworkModel::BufferTypeRole).toInt();
99 BufferId newBufferId = current.data(NetworkModel::BufferIdRole).value<BufferId>();
100 BufferId oldBufferId = previous.data(NetworkModel::BufferIdRole).value<BufferId>();
102 if (bufferType != BufferInfo::ChannelBuffer) {
103 ui.stackedWidget->setCurrentWidget(ui.emptyPage);
104 emit nickSelectionChanged(QModelIndexList());
108 // See NickListDock::NickListDock() below
109 // if(bufferType != BufferInfo::ChannelBuffer) {
110 // ui.stackedWidget->setCurrentWidget(ui.emptyPage);
111 // QDockWidget *dock_ = dock();
117 // QDockWidget *dock_ = dock();
118 // if(dock_ && dock_->toggleViewAction()->isChecked()) {
123 if (newBufferId == oldBufferId)
127 if (nickViews.contains(newBufferId)) {
128 view = nickViews.value(newBufferId);
129 ui.stackedWidget->setCurrentWidget(view);
132 view = new NickView(this);
133 auto* filter = new NickViewFilter(newBufferId, Client::networkModel());
134 view->setModel(filter);
135 QModelIndex source_current = Client::bufferModel()->mapToSource(current);
136 view->setRootIndex(filter->mapFromSource(source_current));
137 nickViews[newBufferId] = view;
138 ui.stackedWidget->addWidget(view);
139 ui.stackedWidget->setCurrentWidget(view);
140 connect(view, &NickView::selectionUpdated, this, &NickListWidget::onNickSelectionChanged);
142 emit nickSelectionChanged(view->selectedIndexes());
145 void NickListWidget::onNickSelectionChanged()
147 auto* view = qobject_cast<NickView*>(sender());
149 if (view != ui.stackedWidget->currentWidget()) {
150 qDebug() << "Nick selection of hidden view changed!";
153 emit nickSelectionChanged(view->selectedIndexes());
156 void NickListWidget::rowsAboutToBeRemoved(const QModelIndex& parent, int start, int end)
159 if (!parent.isValid()) {
160 // ok this means that whole networks are about to be removed
161 // we can't determine which buffers are affect, so we hope that all nets are removed
162 // this is the most common case (for example disconnecting from the core or terminating the clint)
164 QHash<BufferId, NickView*>::iterator iter = nickViews.begin();
165 while (iter != nickViews.end()) {
167 iter = nickViews.erase(iter);
168 ui.stackedWidget->removeWidget(nickView);
169 QAbstractItemModel* model = nickView->model();
170 nickView->setModel(nullptr);
171 if (auto* filter = qobject_cast<QSortFilterProxyModel*>(model))
172 filter->setSourceModel(nullptr);
173 model->deleteLater();
174 nickView->deleteLater();
178 // check if there are explicitly buffers removed
179 for (int i = start; i <= end; i++) {
180 QVariant variant = parent.child(i, 0).data(NetworkModel::BufferIdRole);
181 if (!variant.isValid())
184 BufferId bufferId = variant.value<BufferId>();
185 removeBuffer(bufferId);
190 void NickListWidget::removeBuffer(BufferId bufferId)
192 if (!nickViews.contains(bufferId))
195 NickView* view = nickViews.take(bufferId);
196 ui.stackedWidget->removeWidget(view);
197 QAbstractItemModel* model = view->model();
198 view->setModel(nullptr);
199 if (auto* filter = qobject_cast<QSortFilterProxyModel*>(model))
200 filter->setSourceModel(nullptr);
201 model->deleteLater();
205 QSize NickListWidget::sizeHint() const
207 QWidget* currentWidget = ui.stackedWidget->currentWidget();
208 if (!currentWidget || currentWidget == ui.emptyPage)
209 return {100, height()};
211 return currentWidget->sizeHint();
214 // ==============================
216 // ==============================
217 NickListDock::NickListDock(const QString& title, QWidget* parent)
218 : QDockWidget(title, parent)
220 // THIS STUFF IS NEEDED FOR NICKLIST AUTOHIDE...
221 // AS THIS BRINGS LOTS OF FUCKUPS WITH IT IT'S DEACTIVATED FOR NOW...
223 // QAction *toggleView = toggleViewAction();
224 // disconnect(toggleView, SIGNAL(triggered(bool)), this, 0);
225 // toggleView->setChecked(QtUiSettings().value("ShowNickList", QVariant(true)).toBool());
227 // // reconnecting the closebuttons clicked signal to the action
228 // foreach(QAbstractButton *button, findChildren<QAbstractButton *>()) {
229 // if(disconnect(button, SIGNAL(clicked()), this, SLOT(close())))
230 // connect(button, SIGNAL(clicked()), toggleView, SLOT(trigger()));
234 void NickListDock::setLocked(bool locked)
237 setFeatures(nullptr);
240 setFeatures(QDockWidget::DockWidgetClosable | QDockWidget::DockWidgetMovable | QDockWidget::DockWidgetFloatable);
244 // NickListDock::~NickListDock() {
245 // QtUiSettings().setValue("ShowNickList", toggleViewAction()->isChecked());
248 // bool NickListDock::event(QEvent *event) {
249 // switch (event->type()) {
250 // case QEvent::Hide:
251 // case QEvent::Show:
252 // emit visibilityChanged(event->type() == QEvent::Show);
253 // return QWidget::event(event);
255 // return QDockWidget::event(event);