qTox  Version: nightly | Commit: bc751c8e1cac455f9690654fcfe0f560d2d7dfdd
contentdialogmanager.cpp
Go to the documentation of this file.
1 /*
2  Copyright © 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 "contentdialogmanager.h"
21 
22 #include "src/friendlist.h"
23 #include "src/grouplist.h"
24 #include "src/model/friend.h"
25 #include "src/model/group.h"
27 #include "src/widget/groupwidget.h"
28 
29 #include <tuple>
30 
31 namespace {
32 void removeDialog(ContentDialog* dialog, QHash<const ContactId&, ContentDialog*>& dialogs)
33 {
34  for (auto it = dialogs.begin(); it != dialogs.end();) {
35  if (*it == dialog) {
36  it = dialogs.erase(it);
37  } else {
38  ++it;
39  }
40  }
41 }
42 } // namespace
43 
45 
47 {
48  return currentDialog;
49 }
50 
52 {
53  const auto dialog = contactDialogs.value(contactId, nullptr);
54  if (dialog == nullptr) {
55  return false;
56  }
57 
58  return dialog->hasContact(contactId);
59 }
60 
62  std::shared_ptr<FriendChatroom> chatroom,
63  GenericChatForm* form)
64 {
65  auto friendWidget = dialog->addFriend(chatroom, form);
66  const auto& friendPk = friendWidget->getFriend()->getPublicKey();
67 
68  ContentDialog* lastDialog = getFriendDialog(friendPk);
69  if (lastDialog) {
70  lastDialog->removeFriend(friendPk);
71  }
72 
73  contactDialogs[friendPk] = dialog;
74  return friendWidget;
75 }
76 
78  std::shared_ptr<GroupChatroom> chatroom,
79  GenericChatForm* form)
80 {
81  auto groupWidget = dialog->addGroup(chatroom, form);
82  const auto& groupId = groupWidget->getGroup()->getPersistentId();
83 
84  ContentDialog* lastDialog = getGroupDialog(groupId);
85  if (lastDialog) {
86  lastDialog->removeGroup(groupId);
87  }
88 
89  contactDialogs[groupId] = dialog;
90  return groupWidget;
91 }
92 
94 {
95  auto dialog = focusDialog(contactId, contactDialogs);
96  if (dialog != nullptr) {
97  dialog->focusContact(contactId);
98  }
99 }
100 
109 {
110  auto iter = list.find(id);
111  if (iter == list.end()) {
112  return nullptr;
113  }
114 
115  ContentDialog* dialog = *iter;
116  if (dialog->windowState() & Qt::WindowMinimized) {
117  dialog->showNormal();
118  }
119 
120  dialog->raise();
121  dialog->activateWindow();
122  return dialog;
123 }
124 
126 {
127  auto dialog = contactDialogs.value(friendPk);
128  if (dialog == nullptr) {
129  return;
130  }
131 
132  dialog->updateContactStatusLight(friendPk);
133  if (dialog->isContactActive(friendPk)) {
134  dialog->updateTitleAndStatusIcon();
135  }
136 
137  Friend* f = FriendList::findFriend(friendPk);
138  dialog->updateFriendStatus(friendPk, f->getStatus());
139 }
140 
142 {
143  auto dialog = contactDialogs.value(groupId);
144  if (dialog == nullptr) {
145  return;
146  }
147 
148  dialog->updateContactStatusLight(groupId);
149  if (dialog->isContactActive(groupId)) {
150  dialog->updateTitleAndStatusIcon();
151  }
152 }
153 
155 {
156  const auto dialog = contactDialogs.value(contactId);
157  if (dialog == nullptr) {
158  return false;
159  }
160 
161  return dialog->isContactActive(contactId);
162 }
163 
165 {
166  return contactDialogs.value(friendPk);
167 }
168 
170 {
171  return contactDialogs.value(groupId);
172 }
173 
175 {
176  if (instance == nullptr) {
178  }
179 
180  return instance;
181 }
182 
184 {
185  currentDialog = &dialog;
188 }
189 
191 {
192  ContentDialog* dialog = qobject_cast<ContentDialog*>(sender());
193  currentDialog = dialog;
194 }
195 
197 {
198  ContentDialog* dialog = qobject_cast<ContentDialog*>(sender());
199  if (currentDialog == dialog) {
200  currentDialog = nullptr;
201  }
202 
203  removeDialog(dialog, contactDialogs);
204 }
205 
207 {
208  return getFriendDialog(friendPk);
209 }
210 
212 {
213  return getGroupDialog(groupId);
214 }
ContentDialog::updateContactStatusLight
void updateContactStatusLight(const ContactId &contactId)
Definition: contentdialog.cpp:611
ContentDialogManager::updateFriendStatus
void updateFriendStatus(const ToxPk &friendPk)
Definition: contentdialogmanager.cpp:125
GenericChatForm
Parent class for all chatforms. It's provide the minimum required UI elements and methods to work wit...
Definition: genericchatform.h:67
friend.h
ContentDialog::isContactActive
bool isContactActive(const ContactId &contactId) const override
Definition: contentdialog.cpp:619
friendlist.h
ContentDialogManager::focusDialog
ContentDialog * focusDialog(const ContactId &id, const QHash< const ContactId &, ContentDialog * > &list)
Focus the dialog if it exists.
Definition: contentdialogmanager.cpp:107
contentdialogmanager.h
group.h
ContentDialog::removeGroup
void removeGroup(const GroupId &groupId) override
Definition: contentdialog.cpp:223
ContentDialog::activated
void activated()
ContentDialogManager::getInstance
static ContentDialogManager * getInstance()
Definition: contentdialogmanager.cpp:174
ContentDialogManager::current
ContentDialog * current()
Definition: contentdialogmanager.cpp:46
ContentDialogManager::getFriendDialog
ContentDialog * getFriendDialog(const ToxPk &friendPk) const
Definition: contentdialogmanager.cpp:164
ContentDialogManager::currentDialog
ContentDialog * currentDialog
Definition: contentdialogmanager.h:66
ContentDialogManager::instance
static ContentDialogManager * instance
Definition: contentdialogmanager.h:70
ContentDialog::updateFriendStatus
void updateFriendStatus(const ToxPk &friendPk, Status::Status status)
Definition: contentdialog.cpp:605
ContentDialogManager::addFriendToDialog
FriendWidget * addFriendToDialog(ContentDialog *dialog, std::shared_ptr< FriendChatroom > chatroom, GenericChatForm *form)
Definition: contentdialogmanager.cpp:61
FriendList::findFriend
static Friend * findFriend(const ToxPk &friendPk)
Definition: friendlist.cpp:47
ContentDialogManager::getFriendDialogs
IDialogs * getFriendDialogs(const ToxPk &friendPk) const
Definition: contentdialogmanager.cpp:206
ContentDialogManager::getGroupDialogs
IDialogs * getGroupDialogs(const GroupId &groupId) const
Definition: contentdialogmanager.cpp:211
Friend::getStatus
Status::Status getStatus() const
Definition: friend.cpp:190
ContentDialog::willClose
void willClose()
ContentDialogManager::focusContact
void focusContact(const ContactId &contactId)
Definition: contentdialogmanager.cpp:93
ContentDialogManager::contactWidgetExists
bool contactWidgetExists(const ContactId &groupId)
Definition: contentdialogmanager.cpp:51
ContentDialog
Definition: contentdialog.h:49
ContentDialog::updateTitleAndStatusIcon
void updateTitleAndStatusIcon()
Update window title and icon.
Definition: contentdialog.cpp:379
grouplist.h
ToxPk
This class represents a Tox Public Key, which is a part of Tox ID.
Definition: toxpk.h:26
Friend
Definition: friend.h:31
FriendWidget::getFriend
const Friend * getFriend() const final
Definition: friendwidget.cpp:347
IDialogs
Definition: idialogs.h:26
ContentDialogManager::isContactActive
bool isContactActive(const ContactId &contactId)
Definition: contentdialogmanager.cpp:154
QHash< const ContactId &, ContentDialog * >
ContentDialogManager::getGroupDialog
ContentDialog * getGroupDialog(const GroupId &friendPk) const
Definition: contentdialogmanager.cpp:169
Group::getPersistentId
const GroupId & getPersistentId() const override
Definition: group.cpp:145
ContentDialog::focusContact
void focusContact(const ContactId &friendPk)
Definition: contentdialog.cpp:563
GroupWidget
Definition: groupwidget.h:30
GroupId
This class represents a long term persistent group identifier.
Definition: groupid.h:26
ContentDialog::addGroup
GroupWidget * addGroup(std::shared_ptr< GroupChatroom > chatroom, GenericChatForm *form)
Definition: contentdialog.cpp:176
Friend::getPublicKey
const ToxPk & getPublicKey() const
Definition: friend.cpp:131
ContentDialogManager::onDialogActivate
void onDialogActivate()
Definition: contentdialogmanager.cpp:190
ContactId
Definition: contactid.h:28
ContentDialog::removeFriend
void removeFriend(const ToxPk &friendPk) override
Definition: contentdialog.cpp:194
ContentDialogManager::contactDialogs
QHash< const ContactId &, ContentDialog * > contactDialogs
Definition: contentdialogmanager.h:68
ContentDialogManager::addGroupToDialog
GroupWidget * addGroupToDialog(ContentDialog *dialog, std::shared_ptr< GroupChatroom > chatroom, GenericChatForm *form)
Definition: contentdialogmanager.cpp:77
ContentDialogManager
Definition: contentdialogmanager.h:33
ContentDialogManager::addContentDialog
void addContentDialog(ContentDialog &dialog)
Definition: contentdialogmanager.cpp:183
ContentDialogManager::onDialogClose
void onDialogClose()
Definition: contentdialogmanager.cpp:196
GroupWidget::getGroup
Group * getGroup() const final
Definition: groupwidget.cpp:233
ContentDialog::addFriend
FriendWidget * addFriend(std::shared_ptr< FriendChatroom > chatroom, GenericChatForm *form)
Definition: contentdialog.cpp:154
ContentDialogManager::updateGroupStatus
void updateGroupStatus(const GroupId &friendPk)
Definition: contentdialogmanager.cpp:141
groupwidget.h
friendwidget.h
FriendWidget
Definition: friendwidget.h:33
ContentDialog::hasContact
bool hasContact(const ContactId &contactId) const override
Definition: contentdialog.cpp:688