1 /***************************************************************************
2 * Copyright (C) 2005-2015 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"
25 #include "networkmodel.h"
26 #include "buffermodel.h"
27 #include "nickviewfilter.h"
28 #include "qtuisettings.h"
33 #include <QAbstractButton>
35 NickListWidget::NickListWidget(QWidget *parent)
36 : AbstractItemView(parent)
42 QDockWidget *NickListWidget::dock() const
44 QDockWidget *dock = qobject_cast<QDockWidget *>(parent());
52 void NickListWidget::hideEvent(QHideEvent *event)
54 emit nickSelectionChanged(QModelIndexList());
55 AbstractItemView::hideEvent(event);
59 void NickListWidget::showEvent(QShowEvent *event)
61 NickView *view = qobject_cast<NickView *>(ui.stackedWidget->currentWidget());
63 emit nickSelectionChanged(view->selectedIndexes());
65 AbstractItemView::showEvent(event);
69 void NickListWidget::showWidget(bool visible)
71 if (!selectionModel())
74 QModelIndex currentIndex = selectionModel()->currentIndex();
75 if (currentIndex.data(NetworkModel::BufferTypeRole) == BufferInfo::ChannelBuffer) {
76 QDockWidget *dock_ = dock();
87 void NickListWidget::setVisible(bool visible)
89 QWidget::setVisible(visible);
90 QDockWidget *dock_ = dock();
101 void NickListWidget::currentChanged(const QModelIndex ¤t, const QModelIndex &previous)
103 BufferInfo::Type bufferType = (BufferInfo::Type)current.data(NetworkModel::BufferTypeRole).toInt();
104 BufferId newBufferId = current.data(NetworkModel::BufferIdRole).value<BufferId>();
105 BufferId oldBufferId = previous.data(NetworkModel::BufferIdRole).value<BufferId>();
107 if (bufferType != BufferInfo::ChannelBuffer) {
108 ui.stackedWidget->setCurrentWidget(ui.emptyPage);
109 emit nickSelectionChanged(QModelIndexList());
113 // See NickListDock::NickListDock() below
114 // if(bufferType != BufferInfo::ChannelBuffer) {
115 // ui.stackedWidget->setCurrentWidget(ui.emptyPage);
116 // QDockWidget *dock_ = dock();
122 // QDockWidget *dock_ = dock();
123 // if(dock_ && dock_->toggleViewAction()->isChecked()) {
128 if (newBufferId == oldBufferId)
132 if (nickViews.contains(newBufferId)) {
133 view = nickViews.value(newBufferId);
134 ui.stackedWidget->setCurrentWidget(view);
137 view = new NickView(this);
138 NickViewFilter *filter = new NickViewFilter(newBufferId, Client::networkModel());
139 view->setModel(filter);
140 QModelIndex source_current = Client::bufferModel()->mapToSource(current);
141 view->setRootIndex(filter->mapFromSource(source_current));
142 nickViews[newBufferId] = view;
143 ui.stackedWidget->addWidget(view);
144 ui.stackedWidget->setCurrentWidget(view);
145 connect(view, SIGNAL(selectionUpdated()), SLOT(nickSelectionChanged()));
147 emit nickSelectionChanged(view->selectedIndexes());
151 void NickListWidget::nickSelectionChanged()
153 NickView *view = qobject_cast<NickView *>(sender());
155 if (view != ui.stackedWidget->currentWidget()) {
156 qDebug() << "Nick selection of hidden view changed!";
159 emit nickSelectionChanged(view->selectedIndexes());
163 void NickListWidget::rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end)
166 if (!parent.isValid()) {
167 // ok this means that whole networks are about to be removed
168 // we can't determine which buffers are affect, so we hope that all nets are removed
169 // this is the most common case (for example disconnecting from the core or terminating the clint)
171 QHash<BufferId, NickView *>::iterator iter = nickViews.begin();
172 while (iter != nickViews.end()) {
174 iter = nickViews.erase(iter);
175 ui.stackedWidget->removeWidget(nickView);
176 QAbstractItemModel *model = nickView->model();
177 nickView->setModel(0);
178 if (QSortFilterProxyModel *filter = qobject_cast<QSortFilterProxyModel *>(model))
179 filter->setSourceModel(0);
180 model->deleteLater();
181 nickView->deleteLater();
185 // check if there are explicitly buffers removed
186 for (int i = start; i <= end; i++) {
187 QVariant variant = parent.child(i, 0).data(NetworkModel::BufferIdRole);
188 if (!variant.isValid())
191 BufferId bufferId = variant.value<BufferId>();
192 removeBuffer(bufferId);
198 void NickListWidget::removeBuffer(BufferId bufferId)
200 if (!nickViews.contains(bufferId))
203 NickView *view = nickViews.take(bufferId);
204 ui.stackedWidget->removeWidget(view);
205 QAbstractItemModel *model = view->model();
207 if (QSortFilterProxyModel *filter = qobject_cast<QSortFilterProxyModel *>(model))
208 filter->setSourceModel(0);
209 model->deleteLater();
214 QSize NickListWidget::sizeHint() const
216 QWidget *currentWidget = ui.stackedWidget->currentWidget();
217 if (!currentWidget || currentWidget == ui.emptyPage)
218 return QSize(100, height());
220 return currentWidget->sizeHint();
224 // ==============================
226 // ==============================
227 NickListDock::NickListDock(const QString &title, QWidget *parent)
228 : QDockWidget(title, parent)
230 // THIS STUFF IS NEEDED FOR NICKLIST AUTOHIDE...
231 // AS THIS BRINGS LOTS OF FUCKUPS WITH IT IT'S DEACTIVATED FOR NOW...
233 // QAction *toggleView = toggleViewAction();
234 // disconnect(toggleView, SIGNAL(triggered(bool)), this, 0);
235 // toggleView->setChecked(QtUiSettings().value("ShowNickList", QVariant(true)).toBool());
237 // // reconnecting the closebuttons clicked signal to the action
238 // foreach(QAbstractButton *button, findChildren<QAbstractButton *>()) {
239 // if(disconnect(button, SIGNAL(clicked()), this, SLOT(close())))
240 // connect(button, SIGNAL(clicked()), toggleView, SLOT(trigger()));
245 // NickListDock::~NickListDock() {
246 // QtUiSettings().setValue("ShowNickList", toggleViewAction()->isChecked());
249 // bool NickListDock::event(QEvent *event) {
250 // switch (event->type()) {
251 // case QEvent::Hide:
252 // case QEvent::Show:
253 // emit visibilityChanged(event->type() == QEvent::Show);
254 // return QWidget::event(event);
256 // return QDockWidget::event(event);