We really don't want to depend on qtui in uisupport
[quassel.git] / src / uisupport / abstractbuffercontainer.cpp
1 /***************************************************************************
2  *   Copyright (C) 2005-2010 by the Quassel Project                        *
3  *   devel@quassel-irc.org                                                 *
4  *                                                                         *
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.                                           *
9  *                                                                         *
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.                          *
14  *                                                                         *
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  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
19  ***************************************************************************/
20
21 #include "abstractbuffercontainer.h"
22 #include "client.h"
23 #include "clientbacklogmanager.h"
24 #include "networkmodel.h"
25
26 AbstractBufferContainer::AbstractBufferContainer(QWidget *parent)
27   : AbstractItemView(parent),
28     _currentBuffer(0)
29 {
30 }
31
32 AbstractBufferContainer::~AbstractBufferContainer() {
33 }
34
35 void AbstractBufferContainer::rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end) {
36   Q_ASSERT(model());
37   if(!parent.isValid()) {
38     // ok this means that whole networks are about to be removed
39     // we can't determine which buffers are affect, so we hope that all nets are removed
40     // this is the most common case (for example disconnecting from the core or terminating the client)
41     if(model()->rowCount(parent) != end - start + 1)
42       return;
43
44     foreach(BufferId id, _chatViews.keys()) {
45       removeChatView(id);
46     }
47     _chatViews.clear();
48   } else {
49     // check if there are explicitly buffers removed
50     for(int i = start; i <= end; i++) {
51       QVariant variant = parent.child(i,0).data(NetworkModel::BufferIdRole);
52       if(!variant.isValid())
53         continue;
54
55       BufferId bufferId = variant.value<BufferId>();
56       removeBuffer(bufferId);
57     }
58   }
59 }
60
61 void AbstractBufferContainer::removeBuffer(BufferId bufferId) {
62   if(!_chatViews.contains(bufferId))
63     return;
64
65   removeChatView(bufferId);
66   _chatViews.take(bufferId);
67 }
68
69 /*
70   Switching to first buffer is now handled in MainWin::clientNetworkUpdated()
71
72 void AbstractBufferContainer::rowsInserted(const QModelIndex &parent, int start, int end) {
73   Q_UNUSED(end)
74
75   if(currentBuffer().isValid())
76     return;
77
78   // we want to make sure the very first valid buffer is selected
79   QModelIndex index = model()->index(start, 0, parent);
80   if(index.isValid()) {
81     BufferId id = index.data(NetworkModel::BufferIdRole).value<BufferId>();
82     if(id.isValid())
83       setCurrentBuffer(id);
84   }
85 }
86 */
87
88 void AbstractBufferContainer::currentChanged(const QModelIndex &current, const QModelIndex &previous) {
89   Q_UNUSED(previous)
90
91   BufferId newBufferId = current.data(NetworkModel::BufferIdRole).value<BufferId>();
92   // To be able to reset the selected buffer, we don't check if buffer/index is valid here
93   if(currentBuffer() != newBufferId) {
94     setCurrentBuffer(newBufferId);
95     emit currentChanged(newBufferId);
96     emit currentChanged(current);
97   }
98 }
99
100 void AbstractBufferContainer::setCurrentBuffer(BufferId bufferId) {
101   BufferId prevBufferId = currentBuffer();
102   if(prevBufferId.isValid() && _chatViews.contains(prevBufferId)) {
103     MsgId msgId = _chatViews.value(prevBufferId)->lastMsgId();
104     Client::setBufferLastSeenMsg(prevBufferId, msgId);
105   }
106
107   if(!bufferId.isValid()) {
108     _currentBuffer = 0;
109     showChatView(0);
110     return;
111   }
112
113   if(!_chatViews.contains(bufferId))
114     _chatViews[bufferId] = createChatView(bufferId);
115
116   _currentBuffer = bufferId;
117   showChatView(bufferId);
118   Client::networkModel()->clearBufferActivity(bufferId);
119   Client::setBufferLastSeenMsg(bufferId, _chatViews[bufferId]->lastMsgId());
120   Client::backlogManager()->checkForBacklog(bufferId);
121   setFocus();
122 }