qTox  Version: nightly | Commit: bc751c8e1cac455f9690654fcfe0f560d2d7dfdd
groupwidget.cpp
Go to the documentation of this file.
1 /*
2  Copyright © 2014-2019 by The qTox Project Contributors
3 
4  This file is part of qTox, a Qt-based graphical interface for Tox.
5 
6  qTox is libre software: you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation, either version 3 of the License, or
9  (at your option) any later version.
10 
11  qTox is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with qTox. If not, see <http://www.gnu.org/licenses/>.
18 */
19 
20 #include "groupwidget.h"
21 
22 #include <QApplication>
23 #include <QContextMenuEvent>
24 #include <QDrag>
25 #include <QDragEnterEvent>
26 #include <QMenu>
27 #include <QMimeData>
28 #include <QPalette>
29 
30 #include "maskablepixmapwidget.h"
31 #include "form/groupchatform.h"
32 #include "src/core/core.h"
33 #include "src/model/friend.h"
34 #include "src/friendlist.h"
35 #include "src/model/group.h"
36 #include "src/model/status.h"
37 #include "src/grouplist.h"
39 #include "src/widget/style.h"
40 #include "src/widget/translator.h"
41 #include "src/widget/widget.h"
42 #include "tool/croppinglabel.h"
43 
44 GroupWidget::GroupWidget(std::shared_ptr<GroupChatroom> chatroom, bool compact)
45  : GenericChatroomWidget(compact)
46  , groupId{chatroom->getGroup()->getPersistentId()}
47  , chatroom{chatroom}
48 {
49  avatar->setPixmap(Style::scaleSvgImage(":img/group.svg", avatar->width(), avatar->height()));
50  statusPic.setPixmap(QPixmap(Status::getIconPath(Status::Status::Online)));
51  statusPic.setMargin(3);
52 
53  Group* g = chatroom->getGroup();
54  nameLabel->setText(g->getName());
55 
56  updateUserCount(g->getPeersCount());
57  setAcceptDrops(true);
58 
59  connect(g, &Group::titleChanged, this, &GroupWidget::updateTitle);
61  connect(nameLabel, &CroppingLabel::editFinished, g, &Group::setName);
63 }
64 
66 {
68 }
69 
70 void GroupWidget::updateTitle(const QString& author, const QString& newName)
71 {
72  Q_UNUSED(author)
73  nameLabel->setText(newName);
74 }
75 
76 void GroupWidget::contextMenuEvent(QContextMenuEvent* event)
77 {
78  if (!active) {
79  setBackgroundRole(QPalette::Highlight);
80  }
81 
82  installEventFilter(this); // Disable leave event.
83 
84  QMenu menu(this);
85 
86  QAction* openChatWindow = nullptr;
87  if (chatroom->possibleToOpenInNewWindow() ) {
88  openChatWindow = menu.addAction(tr("Open chat in new window"));
89  }
90 
91  QAction* removeChatWindow = nullptr;
92  if (chatroom->canBeRemovedFromWindow()) {
93  removeChatWindow = menu.addAction(tr("Remove chat from this window"));
94  }
95 
96  menu.addSeparator();
97 
98  QAction* setTitle = menu.addAction(tr("Set title..."));
99  QAction* quitGroup = menu.addAction(tr("Quit group", "Menu to quit a groupchat"));
100 
101  QAction* selectedItem = menu.exec(event->globalPos());
102 
103  removeEventFilter(this);
104 
105  if (!active) {
106  setBackgroundRole(QPalette::Window);
107  }
108 
109  if (!selectedItem) {
110  return;
111  }
112 
113  if (selectedItem == quitGroup) {
114  emit removeGroup(groupId);
115  } else if (selectedItem == openChatWindow) {
116  emit newWindowOpened(this);
117  } else if (selectedItem == removeChatWindow) {
118  chatroom->removeGroupFromDialogs();
119  } else if (selectedItem == setTitle) {
120  editName();
121  }
122 }
123 
124 void GroupWidget::mousePressEvent(QMouseEvent* ev)
125 {
126  if (ev->button() == Qt::LeftButton) {
127  dragStartPos = ev->pos();
128  }
129 
130  GenericChatroomWidget::mousePressEvent(ev);
131 }
132 
133 void GroupWidget::mouseMoveEvent(QMouseEvent* ev)
134 {
135  if (!(ev->buttons() & Qt::LeftButton)) {
136  return;
137  }
138 
139  if ((dragStartPos - ev->pos()).manhattanLength() > QApplication::startDragDistance()) {
140  QMimeData* mdata = new QMimeData;
141  const Group* group = getGroup();
142  mdata->setText(group->getName());
143  mdata->setData("groupId", group->getPersistentId().getByteArray());
144 
145  QDrag* drag = new QDrag(this);
146  drag->setMimeData(mdata);
147  drag->setPixmap(avatar->getPixmap());
148  drag->exec(Qt::CopyAction | Qt::MoveAction);
149  }
150 }
151 
153 {
154  statusMessageLabel->setText(tr("%n user(s) in chat", "Number of users in chat", numPeers));
155 }
156 
158 {
159  setActive(true);
160  avatar->setPixmap(Style::scaleSvgImage(":img/group_dark.svg", avatar->width(), avatar->height()));
161 }
162 
164 {
165  setActive(false);
166  avatar->setPixmap(Style::scaleSvgImage(":img/group.svg", avatar->width(), avatar->height()));
167 }
168 
170 {
171  Group* g = chatroom->getGroup();
172 
173  const bool event = g->getEventFlag();
174  statusPic.setPixmap(QPixmap(Status::getIconPath(Status::Status::Online, event)));
175  statusPic.setMargin(event ? 1 : 3);
176 }
177 
179 {
180  if (chatroom->hasNewMessage()) {
181  return tr("New Message");
182  } else {
183  return tr("Online");
184  }
185 }
186 
188 {
189  nameLabel->editBegin();
190 }
191 
193 {
194  return false;
195 }
196 
198 {
199  return true;
200 }
201 
203 {
204  return nameLabel->fullText();
205 }
206 
208 {
209  return true;
210 }
211 
213 {
214  return isVisible();
215 }
216 
218 {
219  return QDateTime::currentDateTime();
220 }
221 
223 {
224  return this;
225 }
226 
228 {
229  setVisible(visible);
230 }
231 
232 // TODO: Remove
234 {
235  return chatroom->getGroup();
236 }
237 
239 {
240  return getGroup();
241 }
242 
244 {
245  chatroom->resetEventFlags();
246 }
247 
248 void GroupWidget::dragEnterEvent(QDragEnterEvent* ev)
249 {
250  if (!ev->mimeData()->hasFormat("toxPk")) {
251  return;
252  }
253  const ToxPk pk{ev->mimeData()->data("toxPk")};
254  if (chatroom->friendExists(pk)) {
255  ev->acceptProposedAction();
256  }
257 
258  if (!active) {
259  setBackgroundRole(QPalette::Highlight);
260  }
261 }
262 
263 void GroupWidget::dragLeaveEvent(QDragLeaveEvent*)
264 {
265  if (!active) {
266  setBackgroundRole(QPalette::Window);
267  }
268 }
269 
270 void GroupWidget::dropEvent(QDropEvent* ev)
271 {
272  if (!ev->mimeData()->hasFormat("toxPk")) {
273  return;
274  }
275  const ToxPk pk{ev->mimeData()->data("toxPk")};
276  if (!chatroom->friendExists(pk)) {
277  return;
278  }
279 
280  chatroom->inviteFriend(pk);
281 
282  if (!active) {
283  setBackgroundRole(QPalette::Window);
284  }
285 }
286 
287 void GroupWidget::setName(const QString& name)
288 {
289  nameLabel->setText(name);
290 }
291 
293 {
294  const Group* group = chatroom->getGroup();
295  updateUserCount(group->getPeersCount());
296 }
GenericChatroomWidget::avatar
MaskablePixmapWidget * avatar
Definition: genericchatroomwidget.h:83
GroupWidget::dragLeaveEvent
void dragLeaveEvent(QDragLeaveEvent *ev) override
Definition: groupwidget.cpp:263
style.h
Group::getName
QString getName() const
Definition: group.cpp:72
friend.h
friendlist.h
GroupWidget::setWidgetVisible
void setWidgetVisible(bool visible) final
Definition: groupwidget.cpp:227
GroupWidget::isGroup
bool isGroup() const final
Definition: groupwidget.cpp:197
MaskablePixmapWidget::getPixmap
QPixmap getPixmap() const
Definition: maskablepixmapwidget.cpp:68
GroupWidget::updateTitle
void updateTitle(const QString &author, const QString &newName)
Definition: groupwidget.cpp:70
CroppingLabel::editFinished
void editFinished(const QString &newText)
GenericChatroomWidget::setActive
void setActive(bool active)
Definition: genericchatroomwidget.cpp:124
GroupWidget::removeGroup
void removeGroup(const GroupId &groupId)
group.h
Group::titleChanged
void titleChanged(const QString &author, const QString &title)
Group::getPeersCount
int getPeersCount() const
Definition: group.cpp:150
CroppingLabel::setText
void setText(const QString &text)
Definition: croppinglabel.cpp:81
Translator::unregister
static void unregister(void *owner)
Unregisters all handlers of an owner.
Definition: translator.cpp:103
GroupWidget::setName
void setName(const QString &name)
Definition: groupwidget.cpp:287
MaskablePixmapWidget::setPixmap
void setPixmap(const QPixmap &pmap)
Definition: maskablepixmapwidget.cpp:54
GroupWidget::updateStatusLight
void updateStatusLight() final
Definition: groupwidget.cpp:169
Status::getIconPath
QString getIconPath(Status status, bool event)
Definition: status.cpp:72
GroupWidget::editName
void editName()
Definition: groupwidget.cpp:187
Group::numPeersChanged
void numPeersChanged(int numPeers)
GroupWidget::updateUserCount
void updateUserCount(int numPeers)
Definition: groupwidget.cpp:152
Status::Status::Online
@ Online
CroppingLabel::editBegin
void editBegin()
Definition: croppinglabel.cpp:60
croppinglabel.h
GroupWidget::dragEnterEvent
void dragEnterEvent(QDragEnterEvent *ev) override
Definition: groupwidget.cpp:248
GenericChatItemWidget::statusPic
QLabel statusPic
Definition: genericchatitemwidget.h:54
GroupWidget::getContact
const Contact * getContact() const final
Definition: groupwidget.cpp:238
groupchatform.h
GroupWidget::mousePressEvent
void mousePressEvent(QMouseEvent *event) final
Definition: groupwidget.cpp:124
GroupWidget::getNameItem
QString getNameItem() const final
Definition: groupwidget.cpp:202
grouplist.h
ToxPk
This class represents a Tox Public Key, which is a part of Tox ID.
Definition: toxpk.h:26
Contact
Definition: contact.h:26
GroupWidget::setAsActiveChatroom
void setAsActiveChatroom() final
Definition: groupwidget.cpp:157
GenericChatItemWidget::nameLabel
CroppingLabel * nameLabel
Definition: genericchatitemwidget.h:53
widget.h
GenericChatroomWidget::newWindowOpened
void newWindowOpened(GenericChatroomWidget *widget)
GroupWidget::getStatusString
QString getStatusString() const final
Definition: groupwidget.cpp:178
Group::getEventFlag
bool getEventFlag() const override
Definition: group.cpp:169
maskablepixmapwidget.h
GroupWidget::groupId
GroupId groupId
Definition: groupwidget.h:73
GroupWidget::setAsInactiveChatroom
void setAsInactiveChatroom() final
Definition: groupwidget.cpp:163
GenericChatroomWidget::dragStartPos
QPoint dragStartPos
Definition: genericchatroomwidget.h:79
GroupWidget::isOnline
bool isOnline() const final
Definition: groupwidget.cpp:207
Group::getPersistentId
const GroupId & getPersistentId() const override
Definition: group.cpp:145
GroupWidget::retranslateUi
void retranslateUi()
Definition: groupwidget.cpp:292
GroupWidget::chatroom
std::shared_ptr< GroupChatroom > chatroom
Definition: groupwidget.h:76
Translator::registerHandler
static void registerHandler(const std::function< void()> &, void *owner)
Register a function to be called when the UI needs to be retranslated.
Definition: translator.cpp:93
Group
Definition: group.h:34
GroupWidget::getWidget
QWidget * getWidget() final
Definition: groupwidget.cpp:222
GroupWidget::GroupWidget
GroupWidget(std::shared_ptr< GroupChatroom > chatroom, bool compact)
Definition: groupwidget.cpp:44
GroupWidget::isFriend
bool isFriend() const final
Definition: groupwidget.cpp:192
GroupWidget::getLastActivity
QDateTime getLastActivity() const final
Definition: groupwidget.cpp:217
GroupWidget::~GroupWidget
~GroupWidget()
Definition: groupwidget.cpp:65
GroupWidget::mouseMoveEvent
void mouseMoveEvent(QMouseEvent *event) final
Definition: groupwidget.cpp:133
Group::setName
void setName(const QString &newTitle) override
Definition: group.cpp:51
core.h
GenericChatroomWidget::active
bool active
Definition: genericchatroomwidget.h:85
CroppingLabel::fullText
QString fullText()
Get original full text.
Definition: croppinglabel.cpp:168
GroupWidget::resetEventFlags
void resetEventFlags() final
Definition: groupwidget.cpp:243
GroupWidget::getGroup
Group * getGroup() const final
Definition: groupwidget.cpp:233
Style::scaleSvgImage
static QPixmap scaleSvgImage(const QString &path, uint32_t width, uint32_t height)
Definition: style.cpp:381
GenericChatroomWidget
Definition: genericchatroomwidget.h:32
translator.h
GroupWidget::dropEvent
void dropEvent(QDropEvent *ev) override
Definition: groupwidget.cpp:270
GroupWidget::widgetIsVisible
bool widgetIsVisible() const final
Definition: groupwidget.cpp:212
groupwidget.h
friendwidget.h
GenericChatroomWidget::statusMessageLabel
CroppingLabel * statusMessageLabel
Definition: genericchatroomwidget.h:84
status.h
GroupWidget::contextMenuEvent
void contextMenuEvent(QContextMenuEvent *event) final
Definition: groupwidget.cpp:76
ContactId::getByteArray
QByteArray getByteArray() const
Get a copy of the id.
Definition: contactid.cpp:101