-
Notifications
You must be signed in to change notification settings - Fork 74
/
talkable.h
362 lines (305 loc) · 5.82 KB
/
talkable.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
#ifndef TALKABLE_H
#define TALKABLE_H
#include <QObject>
#include <QVector>
#include <QPixmap>
#include <QVariant>
#include <QFile>
#include <QMap>
#include "utils/contact_status.h"
#include "roster/group_presister.h"
#include "qqglobal.h"
enum TalkableDataRole
{
//Generate
TDR_Id = 32,
TDR_Name,
TDR_Markname,
TDR_Avatar,
//Contact
TDR_Category,
TDR_Status,
TDR_ClientType,
//Group
TDR_Gcode,
TDR_Announcement,
//Category
TDR_CategoryIndex,
TDR_CategoryOnlineCount,
};
class Talkable : public QObject
{
Q_OBJECT
signals:
void dataChanged(QVariant data, TalkableDataRole role);
public:
enum TalkableType { kContact, kGroup, kCategory };
Talkable(QString id, QString name, TalkableType type) :
id_(id),
name_(name),
type_(type)
{
}
QString id() const
{
return id_;
}
void setName(QString name)
{
QString before = name_;
if ( name_ != name )
{
name_ = name;
emit dataChanged(name, TDR_Name);
}
}
QString name() const
{
return name_;
}
virtual QString markname() const
{
return name_;
}
TalkableType type() const
{
return type_;
}
void setAvatarPath(QString avatar_path)
{
avatar_path_ = avatar_path;
QFile file(avatar_path);
file.open(QIODevice::ReadOnly);
QByteArray data = file.readAll();
setAvatar(data);
file.close();
}
void setAvatar(QByteArray data)
{
QPixmap pix;
pix.loadFromData(data);
pix_ = pix;
avatar_path_ = QQGlobal::tempDir() + "/avatar/" + id_ + ".jpg";
pix.save(avatar_path_);
emit dataChanged(pix, TDR_Avatar);
}
QPixmap avatar() const
{
return pix_;
}
QString avatarPath() const
{ return avatar_path_; }
virtual QString gcode() const
{ return QString(); }
virtual ContactStatus status() const
{ return CS_Online; }
private:
QString id_;
QString name_;
QString avatar_path_;
QPixmap pix_;
TalkableType type_;
};
class Category;
class Group;
class Contact : public Talkable
{
public:
Contact(QString id, QString name) :
Talkable(id, name, Talkable::kContact),
cat_(NULL),
group_(NULL)
{
}
void setCategory(Category *cat)
{
cat_ = cat;
}
Category* category() const
{ return cat_; }
Group *group() const
{
return group_;
}
void setGroup(Group *group)
{
group_ = group;
}
void setMarkname(QString markname)
{
if ( markname_ != markname )
{
markname_ = markname;
emit dataChanged(markname, TDR_Markname);
}
}
QString markname() const
{
return markname_.isEmpty() ? name() : markname_;
}
void setStatus(ContactStatus status)
{
if ( status_ != status )
{
status_ = status;
emit dataChanged(QVariant::fromValue<ContactStatus>(status), TDR_Status);
}
}
virtual ContactStatus status() const
{
return status_;
}
void setClientType(ContactClientType type)
{
if ( client_type_ != type )
{
client_type_ = type;
emit dataChanged(type, TDR_ClientType);
}
}
ContactClientType clientType() const
{
return client_type_;
}
private:
QString markname_;
ContactStatus status_;
ContactClientType client_type_;
Category *cat_;
Group *group_;
};
class Group : public Talkable
{
Q_OBJECT
signals:
void memberDataChanged(Contact *member, TalkableDataRole role);
void memberAdded(Contact *contact);
void memberRemoved(Contact *contact);
public:
Group(QString id, QString gcode, QString name) :
Talkable(id, name, Talkable::kGroup),
gcode_(gcode),
n_member_(0)
{
}
~Group()
{
clearMembers();
}
void notifyMemberDataChanged(Contact *member, TalkableDataRole role)
{
emit memberDataChanged(member, role);
}
virtual QString gcode() const
{
return gcode_;
}
void setSig(QString sig)
{ sig_ = sig; }
QString sig() const
{ return sig_; }
void setAnnouncement(QString &announcement)
{
if ( announcement_ != announcement )
{
announcement_ = announcement;
emit dataChanged(announcement, TDR_Announcement);
}
}
QString announcement() const
{ return announcement_; }
int memberCount()
{
return n_member_;
}
QVector<Contact *> members()
{
if ( members_.count() == 0 && n_member_ != 0 )
{
depresist();
}
return members_.values().toVector();
}
Contact *member(QString id) const
{
return members_.value(id, NULL);
}
void clearMembers()
{
foreach ( Contact *contact, members_.values() )
{
delete contact;
contact = NULL;
}
members_.clear();
}
void removeMember(QString id)
{
if ( members_.contains(id) )
{
Contact *contact =members_.take(id);
emit memberRemoved(contact);
}
}
void addMember(Contact *contact)
{
if ( !members_.contains(contact->id()) )
{
members_.insert(contact->id(), contact);
++n_member_;
emit memberAdded(contact);
}
}
private:
void depresist()
{
GroupPresister::instance()->getGroupMember(this);
}
private:
QString gcode_;
QString sig_;
QString announcement_;
int n_member_;
QMap<QString, Contact *> members_;
friend class GroupPresister;
};
class Category
{
public:
Category(int index, QString name) :
index_(index),
n_online_(0),
name_(name)
{
}
void setIndex(int idx)
{
index_ = idx;
}
int index() const
{
return index_;
}
int onlineCount() const
{
return n_online_;
}
void setOnlineCount(int n_online)
{
n_online_ = n_online;
}
void setName(QString name)
{
name_ = name;
}
QString name() const
{
return name_;
}
QVector<Contact*> contacts;
private:
int index_;
int n_online_;
QString name_;
};
#endif //TALKABLE_H