qTox  Version: nightly | Commit: bc751c8e1cac455f9690654fcfe0f560d2d7dfdd
contentdialog.cpp
Go to the documentation of this file.
1 /*
2  Copyright © 2015-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 "contentdialog.h"
21 #include "splitterrestorer.h"
22 
23 #include <QBoxLayout>
24 #include <QCloseEvent>
25 #include <QDragEnterEvent>
26 #include <QGuiApplication>
27 #include <QMimeData>
28 #include <QShortcut>
29 #include <QSplitter>
30 
31 #include "src/core/core.h"
32 #include "src/friendlist.h"
33 #include "src/grouplist.h"
35 #include "src/model/friend.h"
36 #include "src/model/group.h"
37 #include "src/model/status.h"
43 #include "src/widget/groupwidget.h"
44 #include "src/widget/style.h"
46 #include "src/widget/translator.h"
47 #include "src/widget/widget.h"
48 
49 static const int minWidget = 220;
50 static const int minHeight = 220;
51 static const QSize minSize(minHeight, minWidget);
52 static const QSize defaultSize(720, 400);
53 
54 ContentDialog::ContentDialog(const Core &core, QWidget* parent)
55  : ActivateDialog(parent, Qt::Window)
56  , splitter{new QSplitter(this)}
57  , friendLayout{new FriendListLayout(this)}
58  , activeChatroomWidget(nullptr)
59  , videoSurfaceSize(QSize())
60  , videoCount(0)
61 {
62  const Settings& s = Settings::getInstance();
63 
64  friendLayout->setMargin(0);
65  friendLayout->setSpacing(0);
66 
67  layouts = {friendLayout->getLayoutOnline(), groupLayout.getLayout(),
68  friendLayout->getLayoutOffline()};
69 
70  if (s.getGroupchatPosition()) {
71 #if (QT_VERSION >= QT_VERSION_CHECK(5, 13, 0))
72  layouts.swapItemsAt(0, 1);
73 #else
74  layouts.swap(0, 1);
75 #endif
76  }
77 
78  QWidget* friendWidget = new QWidget();
79  friendWidget->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
80  friendWidget->setAutoFillBackground(true);
81  friendWidget->setLayout(friendLayout);
82 
83  onGroupchatPositionChanged(s.getGroupchatPosition());
84 
85  friendScroll = new QScrollArea(this);
86  friendScroll->setMinimumWidth(minWidget);
87  friendScroll->setFrameStyle(QFrame::NoFrame);
88  friendScroll->setLayoutDirection(Qt::RightToLeft);
89  friendScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
90  friendScroll->setWidgetResizable(true);
91  friendScroll->setWidget(friendWidget);
92 
93  QWidget* contentWidget = new QWidget(this);
94  contentWidget->setAutoFillBackground(true);
95 
96  contentLayout = new ContentLayout(contentWidget);
97  contentLayout->setMargin(0);
98  contentLayout->setSpacing(0);
99 
100  splitter->addWidget(friendScroll);
101  splitter->addWidget(contentWidget);
102  splitter->setStretchFactor(1, 1);
103  splitter->setCollapsible(1, false);
104 
105  QVBoxLayout* boxLayout = new QVBoxLayout(this);
106  boxLayout->setMargin(0);
107  boxLayout->setSpacing(0);
108  boxLayout->addWidget(splitter);
109 
110  setMinimumSize(minSize);
111  setAttribute(Qt::WA_DeleteOnClose);
112  setObjectName("detached");
113 
114  QByteArray geometry = s.getDialogGeometry();
115 
116  if (!geometry.isNull()) {
117  restoreGeometry(geometry);
118  } else {
119  resize(defaultSize);
120  }
121 
122  SplitterRestorer restorer(splitter);
123  restorer.restore(s.getDialogSplitterState(), size());
124 
125  username = core.getUsername();
126 
127  setAcceptDrops(true);
128 
129  reloadTheme();
130 
131  new QShortcut(Qt::CTRL + Qt::Key_Q, this, SLOT(close()));
132  new QShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_Tab, this, SLOT(previousContact()));
133  new QShortcut(Qt::CTRL + Qt::Key_Tab, this, SLOT(nextContact()));
134  new QShortcut(Qt::CTRL + Qt::Key_PageUp, this, SLOT(previousContact()));
135  new QShortcut(Qt::CTRL + Qt::Key_PageDown, this, SLOT(nextContact()));
136 
138  connect(splitter, &QSplitter::splitterMoved, this, &ContentDialog::saveSplitterState);
139 
141 }
142 
144 {
146 }
147 
148 void ContentDialog::closeEvent(QCloseEvent* event)
149 {
150  emit willClose();
151  event->accept();
152 }
153 
154 FriendWidget* ContentDialog::addFriend(std::shared_ptr<FriendChatroom> chatroom, GenericChatForm* form)
155 {
156  const auto compact = Settings::getInstance().getCompactLayout();
157  auto frnd = chatroom->getFriend();
158  const auto& friendPk = frnd->getPublicKey();
159  auto friendWidget = new FriendWidget(chatroom, compact);
160  emit connectFriendWidget(*friendWidget);
161  contactWidgets[friendPk] = friendWidget;
162  friendLayout->addFriendWidget(friendWidget, frnd->getStatus());
163  contactChatForms[friendPk] = form;
164 
165  // TODO(sudden6): move this connection to the Friend::displayedNameChanged signal
168  connect(friendWidget, &FriendWidget::chatroomWidgetClicked, this, &ContentDialog::activate);
169 
170  // FIXME: emit should be removed
171  emit friendWidget->chatroomWidgetClicked(friendWidget);
172 
173  return friendWidget;
174 }
175 
176 GroupWidget* ContentDialog::addGroup(std::shared_ptr<GroupChatroom> chatroom, GenericChatForm* form)
177 {
178  const auto g = chatroom->getGroup();
179  const auto& groupId = g->getPersistentId();
180  const auto compact = Settings::getInstance().getCompactLayout();
181  auto groupWidget = new GroupWidget(chatroom, compact);
182  contactWidgets[groupId] = groupWidget;
183  groupLayout.addSortedWidget(groupWidget);
184  contactChatForms[groupId] = form;
185 
186  connect(groupWidget, &GroupWidget::chatroomWidgetClicked, this, &ContentDialog::activate);
187 
188  // FIXME: emit should be removed
189  emit groupWidget->chatroomWidgetClicked(groupWidget);
190 
191  return groupWidget;
192 }
193 
194 void ContentDialog::removeFriend(const ToxPk& friendPk)
195 {
196  auto chatroomWidget = qobject_cast<FriendWidget*>(contactWidgets[friendPk]);
197  disconnect(chatroomWidget->getFriend(), &Friend::aliasChanged, this,
199 
200  // Need to find replacement to show here instead.
201  if (activeChatroomWidget == chatroomWidget) {
202  cycleContacts(/* forward = */ true, /* inverse = */ false);
203  }
204 
207 
208  chatroomWidget->deleteLater();
209 
210  if (chatroomCount() == 0) {
211  contentLayout->clear();
212  activeChatroomWidget = nullptr;
213  deleteLater();
214  } else {
215  update();
216  }
217 
218  contactWidgets.remove(friendPk);
219  contactChatForms.remove(friendPk);
220  closeIfEmpty();
221 }
222 
224 {
225  auto chatroomWidget = qobject_cast<GroupWidget*>(contactWidgets[groupId]);
226  // Need to find replacement to show here instead.
227  if (activeChatroomWidget == chatroomWidget) {
228  cycleContacts(true, false);
229  }
230 
231  groupLayout.removeSortedWidget(chatroomWidget);
232  chatroomWidget->deleteLater();
233 
234  if (chatroomCount() == 0) {
235  contentLayout->clear();
236  activeChatroomWidget = nullptr;
237  deleteLater();
238  } else {
239  update();
240  }
241 
242  contactWidgets.remove(groupId);
243  contactChatForms.remove(groupId);
244  closeIfEmpty();
245 }
246 
248 {
249  if (contactWidgets.isEmpty()) {
250  close();
251  }
252 }
253 
255 {
256  return friendLayout->friendTotalCount() + groupLayout.getLayout()->count();
257 }
258 
260 {
261  if (splitter->sizes().at(0) == 0) {
262  splitter->setSizes({1, 1});
263  }
264 
265  update();
266 }
267 
275 int ContentDialog::getCurrentLayout(QLayout*& layout)
276 {
277  layout = friendLayout->getLayoutOnline();
279  if (index != -1) {
280  return index;
281  }
282 
283  layout = friendLayout->getLayoutOffline();
285  if (index != -1) {
286  return index;
287  }
288 
289  layout = groupLayout.getLayout();
291  if (index != -1) {
292  return index;
293  }
294 
295  layout = nullptr;
296  return -1;
297 }
298 
304 void ContentDialog::cycleContacts(bool forward, bool inverse)
305 {
306  QLayout* currentLayout;
307  int index = getCurrentLayout(currentLayout);
308  if (!currentLayout || index == -1) {
309  return;
310  }
311 
312  if (!inverse && index == currentLayout->count() - 1) {
313  bool groupsOnTop = Settings::getInstance().getGroupchatPosition();
314  bool offlineEmpty = friendLayout->getLayoutOffline()->isEmpty();
315  bool onlineEmpty = friendLayout->getLayoutOnline()->isEmpty();
316  bool groupsEmpty = groupLayout.getLayout()->isEmpty();
317  bool isCurOffline = currentLayout == friendLayout->getLayoutOffline();
318  bool isCurOnline = currentLayout == friendLayout->getLayoutOnline();
319  bool isCurGroup = currentLayout == groupLayout.getLayout();
320  bool nextIsEmpty = (isCurOnline && offlineEmpty && (groupsEmpty || groupsOnTop))
321  || (isCurGroup && offlineEmpty && (onlineEmpty || !groupsOnTop))
322  || (isCurOffline);
323 
324  if (nextIsEmpty) {
325  forward = !forward;
326  }
327  }
328 
329  index += forward ? 1 : -1;
330  // If goes out of the layout, then go to the next and skip empty. This loop goes more
331  // then 1 time, because for empty layout index will be out of interval (0 < 0 || 0 >= 0)
332  while (index < 0 || index >= currentLayout->count()) {
333  int oldCount = currentLayout->count();
334  currentLayout = nextLayout(currentLayout, forward);
335  int newCount = currentLayout->count();
336  if (index < 0) {
337  index = newCount - 1;
338  } else if (index >= oldCount) {
339  index = 0;
340  }
341  }
342 
343  QWidget* widget = currentLayout->itemAt(index)->widget();
344  GenericChatroomWidget* chatWidget = qobject_cast<GenericChatroomWidget*>(widget);
345  if (chatWidget && chatWidget != activeChatroomWidget) {
346  // FIXME: emit should be removed
347  emit chatWidget->chatroomWidgetClicked(chatWidget);
348  }
349 }
350 
352 {
353  ++videoCount;
354  if (videoCount > 1) {
355  return;
356  }
357 
358  videoSurfaceSize = size;
359  QSize minSize = minimumSize();
360  setMinimumSize(minSize + videoSurfaceSize);
361 }
362 
364 {
365  videoCount--;
366  if (videoCount > 0) {
367  return;
368  }
369 
370  QSize minSize = minimumSize();
371  setMinimumSize(minSize - videoSurfaceSize);
372  videoSurfaceSize = QSize();
373 }
374 
375 
380 {
381  if (!activeChatroomWidget) {
382  setWindowTitle(username);
383  return;
384  }
385 
386  setWindowTitle(username + QStringLiteral(" - ") + activeChatroomWidget->getTitle());
387 
388  bool isGroupchat = activeChatroomWidget->getGroup() != nullptr;
389  if (isGroupchat) {
390  setWindowIcon(QIcon(":/img/group.svg"));
391  return;
392  }
393 
395  setWindowIcon(QIcon{Status::getIconPath(currentStatus)});
396 }
397 
402 void ContentDialog::reorderLayouts(bool newGroupOnTop)
403 {
404  bool oldGroupOnTop = layouts.first() == groupLayout.getLayout();
405  if (newGroupOnTop != oldGroupOnTop) {
406  // Kriby: Maintain backwards compatibility
407 #if (QT_VERSION >= QT_VERSION_CHECK(5, 13, 0))
408  layouts.swapItemsAt(0, 1);
409 #else
410  layouts.swap(0, 1);
411 #endif
412  }
413 }
414 
416 {
417  cycleContacts(false);
418 }
419 
424 {
425  cycleContacts(true);
426 }
427 
432 void ContentDialog::setUsername(const QString& newName)
433 {
434  username = newName;
436 }
437 
439 {
440  setStyleSheet(Style::getStylesheet("contentDialog/contentDialog.css"));
441  friendScroll->setStyleSheet(Style::getStylesheet("friendList/friendList.css"));
442 }
443 
444 bool ContentDialog::event(QEvent* event)
445 {
446  switch (event->type()) {
447  case QEvent::WindowActivate:
448  if (activeChatroomWidget) {
451 
453 
454  const Friend* frnd = activeChatroomWidget->getFriend();
455  Group* group = activeChatroomWidget->getGroup();
456 
457  if (frnd) {
458  emit friendDialogShown(frnd);
459  } else if (group) {
460  emit groupDialogShown(group);
461  }
462  }
463 
464  emit activated();
465  default:
466  break;
467  }
468 
470 }
471 
472 void ContentDialog::dragEnterEvent(QDragEnterEvent* event)
473 {
474  QObject* o = event->source();
475  FriendWidget* frnd = qobject_cast<FriendWidget*>(o);
476  GroupWidget* group = qobject_cast<GroupWidget*>(o);
477  if (frnd) {
478  assert(event->mimeData()->hasFormat("toxPk"));
479  ToxPk toxPk{event->mimeData()->data("toxPk")};
480  Friend* contact = FriendList::findFriend(toxPk);
481  if (!contact) {
482  return;
483  }
484 
485  ToxPk friendId = contact->getPublicKey();
486 
487  // If friend is already in a dialog then you can't drop friend where it already is.
488  if (!hasContact(friendId)) {
489  event->acceptProposedAction();
490  }
491  } else if (group) {
492  assert(event->mimeData()->hasFormat("groupId"));
493  GroupId groupId = GroupId{event->mimeData()->data("groupId")};
494  Group* contact = GroupList::findGroup(groupId);
495  if (!contact) {
496  return;
497  }
498 
499  if (!hasContact(groupId)) {
500  event->acceptProposedAction();
501  }
502  }
503 }
504 
505 void ContentDialog::dropEvent(QDropEvent* event)
506 {
507  QObject* o = event->source();
508  FriendWidget* frnd = qobject_cast<FriendWidget*>(o);
509  GroupWidget* group = qobject_cast<GroupWidget*>(o);
510  if (frnd) {
511  assert(event->mimeData()->hasFormat("toxPk"));
512  const ToxPk toxId(event->mimeData()->data("toxPk"));
513  Friend* contact = FriendList::findFriend(toxId);
514  if (!contact) {
515  return;
516  }
517 
518  emit addFriendDialog(contact, this);
520  } else if (group) {
521  assert(event->mimeData()->hasFormat("groupId"));
522  const GroupId groupId(event->mimeData()->data("groupId"));
523  Group* contact = GroupList::findGroup(groupId);
524  if (!contact) {
525  return;
526  }
527 
528  emit addGroupDialog(contact, this);
530  }
531 }
532 
533 void ContentDialog::changeEvent(QEvent* event)
534 {
535  QWidget::changeEvent(event);
536  if (event->type() == QEvent::ActivationChange) {
537  if (isActiveWindow()) {
538  emit activated();
539  }
540  }
541 }
542 
543 void ContentDialog::resizeEvent(QResizeEvent* event)
544 {
546  QDialog::resizeEvent(event);
547 }
548 
549 void ContentDialog::moveEvent(QMoveEvent* event)
550 {
552  QDialog::moveEvent(event);
553 }
554 
555 void ContentDialog::keyPressEvent(QKeyEvent* event)
556 {
557  // Ignore escape keyboard shortcut.
558  if (event->key() != Qt::Key_Escape) {
559  QDialog::keyPressEvent(event);
560  }
561 }
562 
564 {
565  focusCommon(contactId, contactWidgets);
566 }
567 
569 {
570  auto it = list.find(id);
571  if (it == list.end()) {
572  return;
573  }
574 
575  activate(*it);
576 }
577 
583 {
584  // If we clicked on the currently active widget, don't reload and relayout everything
585  if (activeChatroomWidget == widget) {
586  return;
587  }
588 
589  contentLayout->clear();
590 
591  if (activeChatroomWidget) {
593  }
594 
595  activeChatroomWidget = widget;
596  const Contact* contact = widget->getContact();
597  contactChatForms[contact->getPersistentId()]->show(contentLayout);
598 
599  widget->setAsActiveChatroom();
600  widget->resetEventFlags();
601  widget->updateStatusLight();
603 }
604 
606 {
607  auto widget = qobject_cast<FriendWidget*>(contactWidgets.value(friendPk));
608  addFriendWidget(widget, status);
609 }
610 
612 {
613  auto widget = contactWidgets.value(contactId);
614  if (widget != nullptr) {
615  widget->updateStatusLight();
616  }
617 }
618 
619 bool ContentDialog::isContactActive(const ContactId& contactId) const
620 {
621  auto widget = contactWidgets.value(contactId);
622  if (widget == nullptr) {
623  return false;
624  }
625 
626  return widget->isActive();
627 }
628 
629 // TODO: Connect to widget directly
630 void ContentDialog::setStatusMessage(const ToxPk& friendPk, const QString& message)
631 {
632  auto widget = contactWidgets.value(friendPk);
633  if (widget != nullptr) {
634  widget->setStatusMsg(message);
635  }
636 }
637 
643 void ContentDialog::updateFriendWidget(const ToxPk& friendPk, QString alias)
644 {
645  Friend* f = FriendList::findFriend(friendPk);
646  FriendWidget* friendWidget = qobject_cast<FriendWidget*>(contactWidgets[friendPk]);
647 
648  Status::Status status = f->getStatus();
649  friendLayout->addFriendWidget(friendWidget, status);
650 }
651 
659 {
660  friendLayout->removeItem(groupLayout.getLayout());
661  friendLayout->insertLayout(top ? 0 : 1, groupLayout.getLayout());
662 }
663 
668 {
670 }
671 
676 {
677  Settings::getInstance().setDialogGeometry(saveGeometry());
678 }
679 
684 {
686 }
687 
688 bool ContentDialog::hasContact(const ContactId& contactId) const
689 {
690  return contactWidgets.contains(contactId);
691 }
692 
699 QLayout* ContentDialog::nextLayout(QLayout* layout, bool forward) const
700 {
701  int index = layouts.indexOf(layout);
702  if (index == -1) {
703  return nullptr;
704  }
705 
706  int next = forward ? index + 1 : index - 1;
707  size_t size = layouts.size();
708  next = (next + size) % size;
709 
710  return layouts[next];
711 }
712 
714 {
715  friendLayout->addFriendWidget(widget, status);
716 }
717 
719 {
720  return activeChatroomWidget == widget;
721 }
ContentDialog::nextLayout
QLayout * nextLayout(QLayout *layout, bool forward) const
Find the next or previous layout in layout list.
Definition: contentdialog.cpp:699
Settings
Definition: settings.h:51
ContentDialog::updateContactStatusLight
void updateContactStatusLight(const ContactId &contactId)
Definition: contentdialog.cpp:611
Status::Status
Status
Definition: status.h:28
style.h
ContentDialog::saveSplitterState
void saveSplitterState()
Save state of splitter between dialog and dialog list.
Definition: contentdialog.cpp:683
ContentDialog::nextContact
void nextContact()
Enable next contact.
Definition: contentdialog.cpp:423
GenericChatroomWidget::getGroup
virtual Group * getGroup() const
Definition: genericchatroomwidget.h:49
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
GenericChatItemLayout::removeSortedWidget
void removeSortedWidget(GenericChatItemWidget *widget)
Definition: genericchatitemlayout.cpp:73
ContentDialog::dropEvent
void dropEvent(QDropEvent *event) final
Definition: contentdialog.cpp:505
friendlist.h
Status::Status::Offline
@ Offline
ContentDialog::layouts
QList< QLayout * > layouts
Definition: contentdialog.h:124
ContentDialog::closeIfEmpty
void closeIfEmpty()
Definition: contentdialog.cpp:247
ContentDialog::onVideoShow
void onVideoShow(QSize size)
Definition: contentdialog.cpp:351
settings.h
ContentDialog::onVideoHide
void onVideoHide()
Definition: contentdialog.cpp:363
FriendListLayout::addFriendWidget
void addFriendWidget(FriendWidget *widget, Status::Status s)
Definition: friendlistlayout.cpp:55
group.h
GenericChatroomWidget::getContact
virtual const Contact * getContact() const =0
FriendListLayout::friendTotalCount
int friendTotalCount() const
Definition: friendlistlayout.cpp:106
contentdialog.h
ContentDialog::removeGroup
void removeGroup(const GroupId &groupId) override
Definition: contentdialog.cpp:223
ContentDialog::resizeEvent
void resizeEvent(QResizeEvent *event) override
Definition: contentdialog.cpp:543
ContentDialog::chatroomCount
int chatroomCount() const override
Definition: contentdialog.cpp:254
Translator::unregister
static void unregister(void *owner)
Unregisters all handlers of an owner.
Definition: translator.cpp:103
Settings::getDialogSplitterState
QByteArray getDialogSplitterState() const
Definition: settings.cpp:1624
ContentDialog::activated
void activated()
FriendListLayout::removeFriendWidget
void removeFriendWidget(FriendWidget *widget, Status::Status s)
Definition: friendlistlayout.cpp:68
Status::getIconPath
QString getIconPath(Status status, bool event)
Definition: status.cpp:72
ContentDialog::changeEvent
void changeEvent(QEvent *event) override
Definition: contentdialog.cpp:533
GenericChatroomWidget::setAsInactiveChatroom
virtual void setAsInactiveChatroom()=0
FriendListLayout::indexOfFriendWidget
int indexOfFriendWidget(GenericChatItemWidget *widget, bool online) const
Definition: friendlistlayout.cpp:76
ContentDialog::updateFriendStatus
void updateFriendStatus(const ToxPk &friendPk, Status::Status status)
Definition: contentdialog.cpp:605
Status::Status::Online
@ Online
FriendList::findFriend
static Friend * findFriend(const ToxPk &friendPk)
Definition: friendlist.cpp:47
FileTransferList::Column::size
@ size
GenericChatItemLayout::getLayout
QLayout * getLayout() const
Definition: genericchatitemlayout.cpp:102
ContentDialog::addFriendWidget
void addFriendWidget(FriendWidget *widget, Status::Status status)
Definition: contentdialog.cpp:713
chatform.h
ContentDialog::reorderLayouts
void reorderLayouts(bool newGroupOnTop)
Update layouts order according to settings.
Definition: contentdialog.cpp:402
Friend::getStatus
Status::Status getStatus() const
Definition: friend.cpp:190
ContentDialog::willClose
void willClose()
ContentDialog::activeChatroomWidget
GenericChatroomWidget * activeChatroomWidget
Definition: contentdialog.h:130
ContentDialog::friendLayout
FriendListLayout * friendLayout
Definition: contentdialog.h:127
ContentDialog::retranslateUi
void retranslateUi()
Retranslate all elements in the form.
Definition: contentdialog.cpp:667
ContentDialog::ensureSplitterVisible
void ensureSplitterVisible()
Definition: contentdialog.cpp:259
Settings::setDialogGeometry
void setDialogGeometry(const QByteArray &value)
Definition: settings.cpp:1617
ContentDialog::friendDialogShown
void friendDialogShown(const Friend *f)
Friend::statusMessageChanged
void statusMessageChanged(const ToxPk &friendId, const QString &message)
ContentDialog::isActiveWidget
bool isActiveWidget(GenericChatroomWidget *widget)
Definition: contentdialog.cpp:718
ContentDialog::setUsername
void setUsername(const QString &newName)
Update username to show in the title.
Definition: contentdialog.cpp:432
Friend::aliasChanged
void aliasChanged(const ToxPk &friendId, QString alias)
HistMessageContentType::message
@ message
ContentDialog::updateTitleAndStatusIcon
void updateTitleAndStatusIcon()
Update window title and icon.
Definition: contentdialog.cpp:379
grouplist.h
Settings::getDialogGeometry
QByteArray getDialogGeometry() const
Definition: settings.cpp:1611
Settings::getGroupchatPosition
bool getGroupchatPosition() const
Definition: settings.cpp:1992
adjustingscrollarea.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
FriendListLayout::getLayoutOnline
QLayout * getLayoutOnline() const
Definition: friendlistlayout.cpp:122
Friend
Definition: friend.h:31
widget.h
ContentDialog::reloadTheme
void reloadTheme() override
Definition: contentdialog.cpp:438
ContentDialog::getCurrentLayout
int getCurrentLayout(QLayout *&layout)
Get current layout and index of current wiget in it. Current layout – layout contains activated widge...
Definition: contentdialog.cpp:275
ContentDialog::moveEvent
void moveEvent(QMoveEvent *event) override
Definition: contentdialog.cpp:549
ContentDialog::keyPressEvent
void keyPressEvent(QKeyEvent *event) override
Definition: contentdialog.cpp:555
ContentDialog::addFriendDialog
void addFriendDialog(Friend *frnd, ContentDialog *contentDialog)
ContentDialog::updateFriendWidget
void updateFriendWidget(const ToxPk &friendPk, QString alias)
Update friend widget name and position.
Definition: contentdialog.cpp:643
ContentDialog::onGroupchatPositionChanged
void onGroupchatPositionChanged(bool top)
Handler of groupchatPositionChanged action. Move group layout on the top or on the buttom.
Definition: contentdialog.cpp:658
QHash< const ContactId &, GenericChatroomWidget * >
FriendListLayout
Definition: friendlistlayout.h:30
Group::getPersistentId
const GroupId & getPersistentId() const override
Definition: group.cpp:145
ContentDialog::connectFriendWidget
void connectFriendWidget(FriendWidget &friendWidget)
ContentDialog::cycleContacts
void cycleContacts(bool forward, bool loop=true)
Activate next/previous contact.
Definition: contentdialog.cpp:304
ContentDialog::focusContact
void focusContact(const ContactId &friendPk)
Definition: contentdialog.cpp:563
ContentDialog::videoCount
int videoCount
Definition: contentdialog.h:132
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
GroupWidget
Definition: groupwidget.h:30
ContentDialog::setStatusMessage
void setStatusMessage(const ToxPk &friendPk, const QString &message)
Definition: contentdialog.cpp:630
GenericChatroomWidget::setAsActiveChatroom
virtual void setAsActiveChatroom()=0
ContentDialog::friendScroll
QScrollArea * friendScroll
Definition: contentdialog.h:126
Settings::getInstance
static Settings & getInstance()
Returns the singleton instance.
Definition: settings.cpp:88
ContentDialog::dragEnterEvent
void dragEnterEvent(QDragEnterEvent *event) final
Definition: contentdialog.cpp:472
ContentDialog::groupLayout
GenericChatItemLayout groupLayout
Definition: contentdialog.h:128
ContentDialog::contentLayout
ContentLayout * contentLayout
Definition: contentdialog.h:129
GroupId
This class represents a long term persistent group identifier.
Definition: groupid.h:26
Group
Definition: group.h:34
ContentDialog::addGroup
GroupWidget * addGroup(std::shared_ptr< GroupChatroom > chatroom, GenericChatForm *form)
Definition: contentdialog.cpp:176
ContentDialog::previousContact
void previousContact()
Definition: contentdialog.cpp:415
FriendListLayout::getLayoutOffline
QLayout * getLayoutOffline() const
Definition: friendlistlayout.cpp:127
ContentDialog::username
QString username
Definition: contentdialog.h:137
Settings::groupchatPositionChanged
void groupchatPositionChanged(bool enabled)
ContentDialog::groupDialogShown
void groupDialogShown(Group *g)
ContentDialog::contactWidgets
QHash< const ContactId &, GenericChatroomWidget * > contactWidgets
Definition: contentdialog.h:134
GenericChatroomWidget::chatroomWidgetClicked
void chatroomWidgetClicked(GenericChatroomWidget *widget)
ContentDialog::contactChatForms
QHash< const ContactId &, GenericChatForm * > contactChatForms
Definition: contentdialog.h:135
ContentDialog::closeEvent
void closeEvent(QCloseEvent *event) override
Definition: contentdialog.cpp:148
contentlayout.h
Style::getStylesheet
static const QString getStylesheet(const QString &filename, const QFont &baseFont=QFont())
Definition: style.cpp:165
ActivateDialog::event
bool event(QEvent *event) override
Definition: activatedialog.cpp:31
ContactId
Definition: contactid.h:28
ContentDialog::removeFriend
void removeFriend(const ToxPk &friendPk) override
Definition: contentdialog.cpp:194
ContentDialog::focusCommon
void focusCommon(const ContactId &id, QHash< const ContactId &, GenericChatroomWidget * > list)
Definition: contentdialog.cpp:568
GenericChatroomWidget::resetEventFlags
virtual void resetEventFlags()=0
ActivateDialog
Definition: activatedialog.h:24
friendchatroom.h
ContentDialog::splitter
QSplitter * splitter
Definition: contentdialog.h:125
core.h
GroupList::findGroup
static Group * findGroup(const GroupId &groupId)
Definition: grouplist.cpp:42
ContentDialog::videoSurfaceSize
QSize videoSurfaceSize
Definition: contentdialog.h:131
ContentDialog::event
bool event(QEvent *event) final
Definition: contentdialog.cpp:444
ContentLayout
Definition: contentlayout.h:25
ContentDialog::~ContentDialog
~ContentDialog() override
Definition: contentdialog.cpp:143
ContentDialog::addGroupDialog
void addGroupDialog(Group *group, ContentDialog *contentDialog)
ContentDialog::activate
void activate(GenericChatroomWidget *widget)
Show ContentDialog, activate chatroom widget.
Definition: contentdialog.cpp:582
GroupWidget::getGroup
Group * getGroup() const final
Definition: groupwidget.cpp:233
GenericChatroomWidget
Definition: genericchatroomwidget.h:32
Settings::setDialogSplitterState
void setDialogSplitterState(const QByteArray &value)
Definition: settings.cpp:1630
translator.h
ContentDialog::addFriend
FriendWidget * addFriend(std::shared_ptr< FriendChatroom > chatroom, GenericChatForm *form)
Definition: contentdialog.cpp:154
friendlistlayout.h
GenericChatroomWidget::updateStatusLight
virtual void updateStatusLight()=0
SplitterRestorer
Restore splitter from saved state and reset to default.
Definition: splitterrestorer.h:26
splitterrestorer.h
groupwidget.h
friendwidget.h
ContentDialog::saveDialogGeometry
void saveDialogGeometry()
Save size of dialog window.
Definition: contentdialog.cpp:675
ContentLayout::clear
void clear()
Definition: contentlayout.cpp:78
status.h
GenericChatItemLayout::indexOfSortedWidget
int indexOfSortedWidget(GenericChatItemWidget *widget) const
Definition: genericchatitemlayout.cpp:48
FriendWidget
Definition: friendwidget.h:33
GenericChatItemLayout::addSortedWidget
void addSortedWidget(GenericChatItemWidget *widget, int stretch=0, Qt::Alignment alignment=Qt::Alignment())
Definition: genericchatitemlayout.cpp:41
GenericChatroomWidget::getFriend
virtual const Friend * getFriend() const
Definition: genericchatroomwidget.h:45
ContentDialog::hasContact
bool hasContact(const ContactId &contactId) const override
Definition: contentdialog.cpp:688
GenericChatroomWidget::getTitle
QString getTitle() const
Definition: genericchatroomwidget.cpp:149
Core
Definition: core.h:59
ContentDialog::ContentDialog
ContentDialog(const Core &core, QWidget *parent=nullptr)
Definition: contentdialog.cpp:54