1/***************************************************************************
2 * Copyright (C) 2005-2014 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 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
19 ***************************************************************************/
20
21#ifndef NETWORKMODELCONTROLLER_H_
22#define NETWORKMODELCONTROLLER_H_
23
24#include <QDialog>
25
26#include "action.h"
27#include "actioncollection.h"
28#include "messagefilter.h"
29
30class QComboBox;
31class QDialogButtonBox;
32class QLineEdit;
33
34class NetworkModelController : public QObject
35{
36 Q_OBJECT
37
38public:
39 NetworkModelController(QObject *parent = 0);
40 virtual ~NetworkModelController();
41
42 // don't change enums without doublechecking masks etc. in code
43 enum ActionType {
44 // Network actions
45 NetworkMask = 0x0f,
46 NetworkConnect = 0x01,
47 NetworkDisconnect = 0x02,
48 NetworkConnectAll = 0x03,
49 NetworkDisconnectAll = 0x04,
50
51 // Buffer actions
52 BufferMask = 0xf0,
53 BufferJoin = 0x10,
54 BufferPart = 0x20,
55 BufferSwitchTo = 0x30,
56 BufferRemove = 0x40,
57
58 // Hide actions
59 HideMask = 0x0f00,
60 HideJoin = 0x0100,
61 HidePart = 0x0200,
62 HideQuit = 0x0300,
63 HideNick = 0x0400,
64 HideMode = 0x0500,
65 HideDayChange = 0x0600,
66 HideTopic = 0x0700,
67 HideUseDefaults = 0xe00,
68 HideApplyToAll = 0xf00,
69
70 // General actions
71 GeneralMask = 0xf000,
72 JoinChannel = 0x1000,
73 ShowChannelList = 0x2000,
74 ShowIgnoreList = 0x3000,
75
76 // Nick actions
77 NickMask = 0xff0000,
78 NickWhois = 0x010000,
79 NickQuery = 0x020000,
80 NickSwitchTo = 0x030000,
81 NickCtcpVersion = 0x040000,
82 NickCtcpPing = 0x050000,
83 NickCtcpTime = 0x060000,
84 NickCtcpClientinfo = 0x070000,
85 NickOp = 0x080000,
86 NickDeop = 0x090000,
87 NickVoice = 0x0a0000,
88 NickDevoice = 0x0b0000,
89 NickHalfop = 0x0c0000,
90 NickDehalfop = 0x0d0000,
91 NickKick = 0x0e0000,
92 NickBan = 0x0f0000,
93 NickKickBan = 0x100000,
94 NickIgnoreUser = 0x200000,
95 NickIgnoreHost = 0x300000,
96 NickIgnoreDomain = 0x400000,
97 NickIgnoreCustom = 0x500000,
98 // The next 5 types have to stay together
99 // Don't change without reading ContextMenuActionProvider::addIgnoreMenu!
100 NickIgnoreToggleEnabled0 = 0x600000,
101 NickIgnoreToggleEnabled1 = 0x700000,
102 NickIgnoreToggleEnabled2 = 0x800000,
103 NickIgnoreToggleEnabled3 = 0x900000,
104 NickIgnoreToggleEnabled4 = 0xa00000,
105
106 // Actions that are handled externally
107 // These emit a signal to the action requester, rather than being handled here
108 ExternalMask = 0xff000000,
109 HideBufferTemporarily = 0x01000000,
110 HideBufferPermanently = 0x02000000
111 };
112
113 inline Action *action(ActionType type) const;
114
115public:
116 enum ItemActiveState {
117 InactiveState = 0x01,
118 ActiveState = 0x02
119 };
120 Q_DECLARE_FLAGS(ItemActiveStates, ItemActiveState)
121
122public slots:
123 virtual void connectedToCore() {}
124 virtual void disconnectedFromCore() {}
125
126protected:
127 inline ActionCollection *actionCollection() const;
128 inline QList<QModelIndex> indexList() const;
129 inline MessageFilter *messageFilter() const;
130 inline QString contextItem() const; ///< Channel name or nick to provide context menu for
131 inline QObject *receiver() const;
132 inline const char *method() const;
133
134 void setIndexList(const QModelIndex &);
135 void setIndexList(const QList<QModelIndex> &);
136 void setMessageFilter(MessageFilter *);
137 void setContextItem(const QString &);
138 void setSlot(QObject *receiver, const char *method);
139
140 Action *registerAction(ActionType type, const QString &text, bool checkable = false);
141 Action *registerAction(ActionType type, const QPixmap &icon, const QString &text, bool checkable = false);
142 bool checkRequirements(const QModelIndex &index, ItemActiveStates requiredActiveState = QFlags<ItemActiveState>(ActiveState | InactiveState));
143
144 QString nickName(const QModelIndex &index) const;
145 BufferId findQueryBuffer(const QModelIndex &index, const QString &predefinedNick = QString()) const;
146 BufferId findQueryBuffer(NetworkId, const QString &nickName) const;
147 void removeBuffers(const QModelIndexList &indexList);
148
149protected slots:
150 virtual void actionTriggered(QAction *);
151
152signals:
153 void showChannelList(NetworkId);
154 void showIgnoreList(QString);
155
156protected:
157 virtual void handleNetworkAction(ActionType, QAction *);
158 virtual void handleBufferAction(ActionType, QAction *);
159 virtual void handleHideAction(ActionType, QAction *);
160 virtual void handleNickAction(ActionType, QAction *action);
161 virtual void handleGeneralAction(ActionType, QAction *);
162 virtual void handleExternalAction(ActionType, QAction *);
163
164 class JoinDlg;
165
166private:
167 NetworkModel *_model;
168
169 ActionCollection *_actionCollection;
170 QHash<ActionType, Action *> _actionByType;
171
172 QList<QModelIndex> _indexList;
173 MessageFilter *_messageFilter;
174 QString _contextItem; ///< Channel name or nick to provide context menu for
175 QObject *_receiver;
176 const char *_method;
177};
178
179
180//! Input dialog for joining a channel
181class NetworkModelController::JoinDlg : public QDialog
182{
183 Q_OBJECT
184
185public:
186 JoinDlg(const QModelIndex &index, QWidget *parent = 0);
187
188 QString channelName() const;
189 QString channelPassword() const;
190 NetworkId networkId() const;
191
192private slots:
193 void on_channel_textChanged(const QString &);
194
195private:
196 QComboBox *networks;
197 QLineEdit *channel;
198 QLineEdit *password;
199 QDialogButtonBox *buttonBox;
200};
201
202
203// inlines
204ActionCollection *NetworkModelController::actionCollection() const { return _actionCollection; }
205Action *NetworkModelController::action(ActionType type) const { return _actionByType.value(type, 0); }
206QList<QModelIndex> NetworkModelController::indexList() const { return _indexList; }
207MessageFilter *NetworkModelController::messageFilter() const { return _messageFilter; }
208QString NetworkModelController::contextItem() const { return _contextItem; }
209QObject *NetworkModelController::receiver() const { return _receiver; }
210const char *NetworkModelController::method() const { return _method; }
211
212#endif
213