qTox  Version: nightly | Commit: bc751c8e1cac455f9690654fcfe0f560d2d7dfdd
friendlistwidget.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 "friendlistwidget.h"
21 #include "circlewidget.h"
22 #include "friendwidget.h"
23 #include "groupwidget.h"
24 #include "widget.h"
25 #include "src/friendlist.h"
26 #include "src/model/friend.h"
27 #include "src/model/group.h"
28 #include "src/model/status.h"
32 
33 #include <QDragEnterEvent>
34 #include <QDragLeaveEvent>
35 #include <QGridLayout>
36 #include <QMimeData>
37 #include <QTimer>
38 #include <cassert>
39 
40 enum class Time
41 {
42  Today,
43  Yesterday,
44  ThisWeek,
45  ThisMonth,
46  Month1Ago,
47  Month2Ago,
48  Month3Ago,
49  Month4Ago,
50  Month5Ago,
51  LongAgo,
52  Never
53 };
54 
55 static const int LAST_TIME = static_cast<int>(Time::Never);
56 
57 Time getTimeBucket(const QDateTime& date)
58 {
59  if (date == QDateTime()) {
60  return Time::Never;
61  }
62 
63  QDate today = QDate::currentDate();
64  // clang-format off
65  const QMap<Time, QDate> dates {
66  { Time::Today, today.addDays(0) },
67  { Time::Yesterday, today.addDays(-1) },
68  { Time::ThisWeek, today.addDays(-6) },
69  { Time::ThisMonth, today.addMonths(-1) },
70  { Time::Month1Ago, today.addMonths(-2) },
71  { Time::Month2Ago, today.addMonths(-3) },
72  { Time::Month3Ago, today.addMonths(-4) },
73  { Time::Month4Ago, today.addMonths(-5) },
74  { Time::Month5Ago, today.addMonths(-6) },
75  };
76  // clang-format on
77 
78  for (Time time : dates.keys()) {
79  if (dates[time] <= date.date()) {
80  return time;
81  }
82  }
83 
84  return Time::LongAgo;
85 }
86 
87 QDateTime getActiveTimeFriend(const Friend* contact)
88 {
89  return Settings::getInstance().getFriendActivity(contact->getPublicKey());
90 }
91 
93 {
94  QDateTime now = QDateTime::currentDateTime();
95  QDateTime tomorrow = now.addDays(1); // Tomorrow.
96  tomorrow.setTime(QTime()); // Midnight.
97  return now.msecsTo(tomorrow);
98 }
99 
100 FriendListWidget::FriendListWidget(const Core &_core, Widget* parent, bool groupsOnTop)
101  : QWidget(parent)
102  , core{_core}
103 {
104  int countContacts = core.getFriendList().size();
105  manager = new FriendListManager(countContacts, this);
106  manager->setGroupsOnTop(groupsOnTop);
108 
109  listLayout = new QVBoxLayout;
110  setLayout(listLayout);
111  setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
112  listLayout->setSpacing(0);
113  listLayout->setMargin(0);
114 
116 
117  dayTimer = new QTimer(this);
118  dayTimer->setTimerType(Qt::VeryCoarseTimer);
119  connect(dayTimer, &QTimer::timeout, this, &FriendListWidget::dayTimeout);
120  dayTimer->start(timeUntilTomorrow());
121 
122  setAcceptDrops(true);
123 }
124 
126 {
127  for (int i = 0; i < Settings::getInstance().getCircleCount(); ++i) {
129  delete circle;
130  }
131 }
132 
134 {
135  if (this->mode == mode)
136  return;
137 
138  this->mode = mode;
140 
142 }
143 
145 {
146  if (mode == SortingMode::Name) {
147  manager->sortByName();
148  if (!manager->getPositionsChanged()) {
149  return;
150  }
151 
152  cleanMainLayout();
153 
154  for (int i = 0; i < Settings::getInstance().getCircleCount(); ++i) {
155  addCircleWidget(i);
156  }
157 
158  QVector<std::shared_ptr<IFriendListItem>> itemsTmp = manager->getItems(); // Sorted items
159  QVector<IFriendListItem*> friendItems; // Items that are not included in the circle
160  int posByName = 0; // Needed for scroll contacts
161  // Linking a friend with a circle and setting scroll position
162  for (int i = 0; i < itemsTmp.size(); ++i) {
163  if (itemsTmp[i]->isFriend() && itemsTmp[i]->getCircleId() >= 0) {
164  CircleWidget* circleWgt = CircleWidget::getFromID(itemsTmp[i]->getCircleId());
165  if (circleWgt != nullptr) {
166  // Place a friend in the circle and continue
167  FriendWidget* frndTmp =
168  qobject_cast<FriendWidget*>((itemsTmp[i].get())->getWidget());
169  circleWgt->addFriendWidget(frndTmp, frndTmp->getFriend()->getStatus());
170  continue;
171  }
172  }
173  // Place the item without the circle in the vector and set the position
174  itemsTmp[i]->setNameSortedPos(posByName++);
175  friendItems.push_back(itemsTmp[i].get());
176  }
177 
178  // Add groups and friends without circles
179  for (int i = 0; i < friendItems.size(); ++i) {
180  listLayout->addWidget(friendItems[i]->getWidget());
181  }
182 
183  // TODO: Try to remove
184  manager->applyFilter();
185 
186  if (!manager->needHideCircles()) {
187  //Sorts circles alphabetically and adds them to the layout
188  QVector<CircleWidget*> circles;
189  for (int i = 0; i < Settings::getInstance().getCircleCount(); ++i) {
190  circles.push_back(CircleWidget::getFromID(i));
191  }
192 
193  std::sort(circles.begin(), circles.end(),
194  [](CircleWidget* a, CircleWidget* b) {
195  return a->getName().toUpper() < b->getName().toUpper();
196  });
197 
198  for (int i = 0; i < circles.size(); ++i) {
199 
200  QVector<std::shared_ptr<IFriendListItem>> itemsInCircle = getItemsFromCircle(circles.at(i));
201  for (int i = 0; i < itemsInCircle.size(); ++i) {
202  itemsInCircle.at(i)->setNameSortedPos(posByName++);
203  }
204 
205  listLayout->addWidget(circles.at(i));
206  }
207  }
208  } else if (mode == SortingMode::Activity) {
209 
211  if (!manager->getPositionsChanged()) {
212  return;
213  }
214  cleanMainLayout();
215 
216  QLocale ql(Settings::getInstance().getTranslation());
217  QDate today = QDate::currentDate();
218 #define COMMENT "Category for sorting friends by activity"
219  // clang-format off
220  const QMap<Time, QString> names {
221  { Time::Today, tr("Today", COMMENT) },
222  { Time::Yesterday, tr("Yesterday", COMMENT) },
223  { Time::ThisWeek, tr("Last 7 days", COMMENT) },
224  { Time::ThisMonth, tr("This month", COMMENT) },
225  { Time::LongAgo, tr("Older than 6 months", COMMENT) },
226  { Time::Never, tr("Never", COMMENT) },
227  { Time::Month1Ago, ql.monthName(today.addMonths(-1).month()) },
228  { Time::Month2Ago, ql.monthName(today.addMonths(-2).month()) },
229  { Time::Month3Ago, ql.monthName(today.addMonths(-3).month()) },
230  { Time::Month4Ago, ql.monthName(today.addMonths(-4).month()) },
231  { Time::Month5Ago, ql.monthName(today.addMonths(-5).month()) },
232  };
233 // clang-format on
234 #undef COMMENT
235 
236  QVector<std::shared_ptr<IFriendListItem>> itemsTmp = manager->getItems();
237 
238  for (int i = 0; i < itemsTmp.size(); ++i) {
239  listLayout->addWidget(itemsTmp[i]->getWidget());
240  }
241 
242  activityLayout = new QVBoxLayout();
243  bool compact = Settings::getInstance().getCompactLayout();
244  for (Time t : names.keys()) {
245  CategoryWidget* category = new CategoryWidget(compact, this);
246  category->setName(names[t]);
247  activityLayout->addWidget(category);
248  }
249 
250  // TODO: Try to remove
251  manager->applyFilter();
252 
253  // Insert widgets to CategoryWidget
254  for (int i = 0; i < itemsTmp.size(); ++i) {
255  if (itemsTmp[i]->isFriend()) {
256  int timeIndex = static_cast<int>(getTimeBucket(itemsTmp[i]->getLastActivity()));
257  QWidget* widget = activityLayout->itemAt(timeIndex)->widget();
258  CategoryWidget* categoryWidget = qobject_cast<CategoryWidget*>(widget);
259  FriendWidget* frnd = qobject_cast<FriendWidget*>((itemsTmp[i].get())->getWidget());
260  if (!isVisible() || (isVisible() && frnd->isVisible())) {
261  categoryWidget->addFriendWidget(frnd, frnd->getFriend()->getStatus());
262  }
263  }
264  }
265 
266  //Hide empty categories
267  for (int i = 0; i < activityLayout->count(); ++i) {
268  QWidget* widget = activityLayout->itemAt(i)->widget();
269  CategoryWidget* categoryWidget = qobject_cast<CategoryWidget*>(widget);
270  categoryWidget->setVisible(categoryWidget->hasChatrooms());
271  }
272 
273  listLayout->addLayout(activityLayout);
274  }
275 }
276 
281 {
283 
284  QLayoutItem* itemForDel;
285  while ((itemForDel = listLayout->takeAt(0)) != nullptr) {
286  listLayout->removeWidget(itemForDel->widget());
287  QWidget* wgt = itemForDel->widget();
288  if (wgt != nullptr) {
289  wgt->setParent(nullptr);
290  } else if (itemForDel->layout() != nullptr) {
291  QLayout* layout = itemForDel->layout();
292  QLayoutItem* itemTmp;
293  while ((itemTmp = layout->takeAt(0)) != nullptr) {
294  wgt = itemTmp->widget();
295  delete wgt;
296  delete itemTmp;
297  }
298  }
299  delete itemForDel;
300  }
301 }
302 
303 QWidget* FriendListWidget::getNextWidgetForName(IFriendListItem *currentPos, bool forward) const
304 {
305  int pos = currentPos->getNameSortedPos();
306  int nextPos = forward ? pos + 1 : pos - 1;
307  if (nextPos >= manager->getItems().size()) {
308  nextPos = 0;
309  } else if (nextPos < 0) {
310  nextPos = manager->getItems().size() - 1;
311  }
312 
313  for (int i = 0; i < manager->getItems().size(); ++i) {
314  if (manager->getItems().at(i)->getNameSortedPos() == nextPos) {
315  return manager->getItems().at(i)->getWidget();
316  }
317  }
318  return nullptr;
319 }
320 
321 QVector<std::shared_ptr<IFriendListItem>>
323 {
324  QVector<std::shared_ptr<IFriendListItem>> itemsTmp = manager->getItems();
325  QVector<std::shared_ptr<IFriendListItem>> itemsInCircle;
326  for (int i = 0; i < itemsTmp.size(); ++i) {
327  int circleId = itemsTmp.at(i)->getCircleId();
328  if (CircleWidget::getFromID(circleId) == circle) {
329  itemsInCircle.push_back(itemsTmp.at(i));
330  }
331  }
332  return itemsInCircle;
333 }
334 
336 {
337  const auto activityTime = getActiveTimeFriend(frd);
338  int timeIndex = static_cast<int>(getTimeBucket(activityTime));
339  QWidget* widget = activityLayout->itemAt(timeIndex)->widget();
340  return qobject_cast<CategoryWidget*>(widget);
341 }
342 
344 {
345  return mode;
346 }
347 
349 {
350  Group* g = widget->getGroup();
351  connect(g, &Group::titleChanged, [=](const QString& author, const QString& name) {
352  Q_UNUSED(author)
353  renameGroupWidget(widget, name);
354  });
355 
356  manager->addFriendListItem(widget);
357 }
358 
360 {
362 }
363 
365 {
367 }
368 
370 {
371  const Friend* contact = w->getFriend();
372  int id = Settings::getInstance().getFriendCircleID(contact->getPublicKey());
373  CircleWidget* circleWidget = CircleWidget::getFromID(id);
374  if (circleWidget != nullptr) {
375  circleWidget->removeFriendWidget(w, contact->getStatus());
376  emit searchCircle(*circleWidget);
377  }
378 
380 }
381 
383 {
384  createCircleWidget(id);
385 }
386 
388 {
389  CircleWidget* circleWidget = createCircleWidget();
390  if (circleWidget != nullptr) {
391  if (friendWidget != nullptr) {
392  const Friend* f = friendWidget->getFriend();
393  circleWidget->addFriendWidget(friendWidget, f->getStatus());
394  circleWidget->setExpanded(true);
395  }
396 
397  if (window()->isActiveWindow())
398  circleWidget->editName();
399 
401  }
402 }
403 
405 {
406  widget->deleteLater();
407 }
408 
409 void FriendListWidget::searchChatrooms(const QString& searchString, bool hideOnline,
410  bool hideOffline, bool hideGroups)
411 {
412  manager->setFilter(searchString, hideOnline, hideOffline, hideGroups);
413 }
414 
415 void FriendListWidget::renameGroupWidget(GroupWidget* groupWidget, const QString& newName)
416 {
417  itemsChanged();
418 }
419 
420 void FriendListWidget::renameCircleWidget(CircleWidget* circleWidget, const QString& newName)
421 {
422  circleWidget->setName(newName);
423 
424  if (mode == SortingMode::Name) {
426  }
427 }
428 
430 {
431  manager->setGroupsOnTop(top);
432 
433  if (mode != SortingMode::Name)
434  return;
435 
436  itemsChanged();
437 }
438 
439 void FriendListWidget::cycleContacts(GenericChatroomWidget* activeChatroomWidget, bool forward)
440 {
441  if (!activeChatroomWidget) {
442  return;
443  }
444 
445  int index = -1;
446  FriendWidget* friendWidget = qobject_cast<FriendWidget*>(activeChatroomWidget);
447 
448  if (mode == SortingMode::Activity) {
449  if (!friendWidget) {
450  return;
451  }
452 
453  const auto activityTime = getActiveTimeFriend(friendWidget->getFriend());
454  index = static_cast<int>(getTimeBucket(activityTime));
455  QWidget* widget = activityLayout->itemAt(index)->widget();
456  CategoryWidget* categoryWidget = qobject_cast<CategoryWidget*>(widget);
457 
458  if (categoryWidget == nullptr || categoryWidget->cycleContacts(friendWidget, forward)) {
459  return;
460  }
461 
462  index += forward ? 1 : -1;
463 
464  for (;;) {
465  // Bounds checking.
466  if (index < 0) {
467  index = LAST_TIME;
468  continue;
469  } else if (index > LAST_TIME) {
470  index = 0;
471  continue;
472  }
473 
474  auto* widget = activityLayout->itemAt(index)->widget();
475  categoryWidget = qobject_cast<CategoryWidget*>(widget);
476 
477  if (categoryWidget != nullptr) {
478  if (!categoryWidget->cycleContacts(forward)) {
479  // Skip empty or finished categories.
480  index += forward ? 1 : -1;
481  continue;
482  }
483  }
484 
485  break;
486  }
487 
488  return;
489  }
490 
491  QWidget* wgt = nullptr;
492 
493  if (friendWidget != nullptr) {
494  wgt = getNextWidgetForName(friendWidget, forward);
495  } else {
496  GroupWidget* groupWidget = qobject_cast<GroupWidget*>(activeChatroomWidget);
497  wgt = getNextWidgetForName(groupWidget, forward);
498  }
499 
500  FriendWidget* friendTmp = qobject_cast<FriendWidget*>(wgt);
501  if (friendTmp != nullptr) {
502  CircleWidget* circleWidget = CircleWidget::getFromID(friendTmp->getCircleId());
503  if (circleWidget != nullptr) {
504  circleWidget->setExpanded(true);
505  }
506  }
507 
508  GenericChatroomWidget* chatWidget = qobject_cast<GenericChatroomWidget*>(wgt);
509  if (chatWidget != nullptr)
510  emit chatWidget->chatroomWidgetClicked(chatWidget);
511 }
512 
513 void FriendListWidget::dragEnterEvent(QDragEnterEvent* event)
514 {
515  if (!event->mimeData()->hasFormat("toxPk")) {
516  return;
517  }
518  ToxPk toxPk(event->mimeData()->data("toxPk"));
519  Friend* frnd = FriendList::findFriend(toxPk);
520  if (frnd)
521  event->acceptProposedAction();
522 }
523 
524 void FriendListWidget::dropEvent(QDropEvent* event)
525 {
526  // Check, that the element is dropped from qTox
527  QObject* o = event->source();
528  FriendWidget* widget = qobject_cast<FriendWidget*>(o);
529  if (!widget)
530  return;
531 
532  // Check, that the user has a friend with the same ToxPk
533  assert(event->mimeData()->hasFormat("toxPk"));
534  const ToxPk toxPk{event->mimeData()->data("toxPk")};
535  Friend* f = FriendList::findFriend(toxPk);
536  if (!f)
537  return;
538 
539  // Save CircleWidget before changing the Id
541  CircleWidget* circleWidget = CircleWidget::getFromID(circleId);
542 
543  moveWidget(widget, f->getStatus(), true);
544 
545  if (circleWidget)
546  circleWidget->updateStatus();
547 }
548 
550 {
551  if (mode == SortingMode::Activity) {
552  itemsChanged();
553  }
554 
555  dayTimer->start(timeUntilTomorrow());
556 }
557 
559 {
560  sortByMode(mode);
561 }
562 
564 {
565  if (mode == SortingMode::Name) {
566  const Friend* f = widget->getFriend();
568  CircleWidget* circleWidget = CircleWidget::getFromID(circleId);
569 
570  if (circleWidget == nullptr || add) {
571  if (circleId != -1) {
574  } else {
575  itemsChanged();
576  }
577  return;
578  }
579 
580  circleWidget->addFriendWidget(widget, s);
581  } else {
582  const Friend* contact = widget->getFriend();
583  auto* categoryWidget = getTimeCategoryWidget(contact);
584  categoryWidget->addFriendWidget(widget, contact->getStatus());
585  categoryWidget->show();
586  }
587  itemsChanged();
588 }
589 
590 void FriendListWidget::updateActivityTime(const QDateTime& time)
591 {
593  return;
594 
595  int timeIndex = static_cast<int>(getTimeBucket(time));
596  QWidget* widget = activityLayout->itemAt(timeIndex)->widget();
597  CategoryWidget* categoryWidget = static_cast<CategoryWidget*>(widget);
598  categoryWidget->updateStatus();
599 
600  categoryWidget->setVisible(categoryWidget->hasChatrooms());
601 }
602 
604 {
605  if (id == -1)
607 
608  if (CircleWidget::getFromID(id) != nullptr) {
609  return CircleWidget::getFromID(id);
610  }
611 
612  CircleWidget* circleWidget = new CircleWidget(core, this, id);
613  emit connectCircleWidget(*circleWidget);
616 
617  return circleWidget;
618 }
FriendListWidget::createCircleWidget
CircleWidget * createCircleWidget(int id=-1)
Definition: friendlistwidget.cpp:603
FriendListWidget::onGroupchatPositionChanged
void onGroupchatPositionChanged(bool top)
Definition: friendlistwidget.cpp:429
Time
Time
Definition: friendlistwidget.cpp:40
FriendListWidget::addCircleWidget
void addCircleWidget(int id)
Definition: friendlistwidget.cpp:382
IFriendListItem::getNameSortedPos
int getNameSortedPos() const
Definition: ifriendlistitem.h:50
FriendListWidget::listLayout
QVBoxLayout * listLayout
Definition: friendlistwidget.h:94
Time::Yesterday
@ Yesterday
Status::Status
Status
Definition: status.h:28
getActiveTimeFriend
QDateTime getActiveTimeFriend(const Friend *contact)
Definition: friendlistwidget.cpp:87
Settings::setFriendSortingMode
void setFriendSortingMode(FriendListSortingMode mode)
Definition: settings.cpp:1959
FriendListWidget::moveWidget
void moveWidget(FriendWidget *w, Status::Status s, bool add=false)
Definition: friendlistwidget.cpp:563
FriendListWidget::renameGroupWidget
void renameGroupWidget(GroupWidget *groupWidget, const QString &newName)
Definition: friendlistwidget.cpp:415
Settings::addCircle
int addCircle(const QString &name=QString())
Definition: settings.cpp:2037
friend.h
FriendListWidget::onCompactChanged
void onCompactChanged(bool compact)
FriendListManager::resetParents
void resetParents()
Definition: friendlistmanager.cpp:76
friendlist.h
FriendListManager::getItems
QVector< IFriendListItemPtr > getItems() const
Definition: friendlistmanager.cpp:28
FriendListWidget::updateActivityTime
void updateActivityTime(const QDateTime &date)
Definition: friendlistwidget.cpp:590
Settings::getCircleCount
int getCircleCount() const
Definition: settings.cpp:2018
settings.h
CategoryWidget::cycleContacts
bool cycleContacts(bool forward)
Definition: categorywidget.cpp:167
FriendListWidget::dayTimer
QTimer * dayTimer
Definition: friendlistwidget.h:96
FriendListManager::setFilter
void setFilter(const QString &searchString, bool hideOnline, bool hideOffline, bool hideGroups)
Definition: friendlistmanager.cpp:84
FriendListWidget::getMode
SortingMode getMode() const
Definition: friendlistwidget.cpp:343
FriendListWidget::itemsChanged
void itemsChanged()
Definition: friendlistwidget.cpp:558
FriendListManager::needHideCircles
bool needHideCircles() const
Definition: friendlistmanager.cpp:33
IFriendListItem
Definition: ifriendlistitem.h:26
FriendListWidget::mode
SortingMode mode
Definition: friendlistwidget.h:93
group.h
FriendListManager::sortByActivity
void sortByActivity()
Definition: friendlistmanager.cpp:70
Group::titleChanged
void titleChanged(const QString &author, const QString &title)
CategoryWidget
Definition: categorywidget.h:32
Time::Month2Ago
@ Month2Ago
CategoryWidget::addFriendWidget
void addFriendWidget(FriendWidget *w, Status::Status s)
Definition: categorywidget.cpp:130
CircleWidget::renameRequested
void renameRequested(CircleWidget *circleWidget, const QString &newName)
FriendListWidget::renameCircleWidget
void renameCircleWidget(CircleWidget *circleWidget, const QString &newName)
Definition: friendlistwidget.cpp:420
FriendListWidget::setMode
void setMode(SortingMode mode)
Definition: friendlistwidget.cpp:133
CategoryWidget::hasChatrooms
bool hasChatrooms() const
Definition: categorywidget.cpp:152
FriendListWidget::searchChatrooms
void searchChatrooms(const QString &searchString, bool hideOnline=false, bool hideOffline=false, bool hideGroups=false)
Definition: friendlistwidget.cpp:409
Time::Today
@ Today
FriendListWidget::dayTimeout
void dayTimeout()
Definition: friendlistwidget.cpp:549
FriendListManager::removeFriendListItem
void removeFriendListItem(IFriendListItem *item)
Definition: friendlistmanager.cpp:58
circlewidget.h
FriendListManager::setSortRequired
void setSortRequired()
Definition: friendlistmanager.cpp:165
FriendList::findFriend
static Friend * findFriend(const ToxPk &friendPk)
Definition: friendlist.cpp:47
FriendListWidget::~FriendListWidget
~FriendListWidget()
Definition: friendlistwidget.cpp:125
Time::ThisMonth
@ ThisMonth
Settings::setFriendCircleID
void setFriendCircleID(const ToxPk &id, int circleID) override
Definition: settings.cpp:1904
FriendListWidget::removeCircleWidget
void removeCircleWidget(CircleWidget *widget)
Definition: friendlistwidget.cpp:404
Settings::FriendListSortingMode
FriendListSortingMode
Definition: settings.h:141
FriendListWidget::manager
FriendListManager * manager
Definition: friendlistwidget.h:97
CategoryWidget::onCompactChanged
void onCompactChanged(bool compact)
Definition: categorywidget.cpp:245
Settings::getFriendCircleID
int getFriendCircleID(const ToxPk &id) const override
Definition: settings.cpp:1894
getTimeBucket
Time getTimeBucket(const QDateTime &date)
Definition: friendlistwidget.cpp:57
FriendListWidget::getNextWidgetForName
QWidget * getNextWidgetForName(IFriendListItem *currentPos, bool forward) const
Definition: friendlistwidget.cpp:303
Friend::getStatus
Status::Status getStatus() const
Definition: friend.cpp:190
FriendListManager
Definition: friendlistmanager.h:29
FriendListManager::setGroupsOnTop
void setGroupsOnTop(bool v)
Definition: friendlistmanager.cpp:171
FriendListWidget::removeFriendWidget
void removeFriendWidget(FriendWidget *w)
Definition: friendlistwidget.cpp:369
FriendListWidget::sortByMode
void sortByMode(SortingMode mode)
Definition: friendlistwidget.cpp:144
FriendWidget::getCircleId
int getCircleId() const final
Definition: friendwidget.cpp:399
ToxPk
This class represents a Tox Public Key, which is a part of Tox ID.
Definition: toxpk.h:26
Time::Month1Ago
@ Month1Ago
FriendListWidget::cycleContacts
void cycleContacts(GenericChatroomWidget *activeChatroomWidget, bool forward)
Definition: friendlistwidget.cpp:439
Friend
Definition: friend.h:31
widget.h
FriendWidget::getFriend
const Friend * getFriend() const final
Definition: friendwidget.cpp:347
FriendListWidget::dropEvent
void dropEvent(QDropEvent *event) override
Definition: friendlistwidget.cpp:524
FriendListWidget::removeGroupWidget
void removeGroupWidget(GroupWidget *w)
Definition: friendlistwidget.cpp:364
FriendListWidget::addGroupWidget
void addGroupWidget(GroupWidget *widget)
Definition: friendlistwidget.cpp:348
FriendListManager::getPositionsChanged
bool getPositionsChanged() const
Definition: friendlistmanager.cpp:38
Time::Month3Ago
@ Month3Ago
FriendListWidget::addFriendWidget
void addFriendWidget(FriendWidget *w)
Definition: friendlistwidget.cpp:359
FriendListWidget::activityLayout
QVBoxLayout * activityLayout
Definition: friendlistwidget.h:95
friendlistwidget.h
FriendListManager::itemsChanged
void itemsChanged()
Settings::getFriendActivity
QDateTime getFriendActivity(const ToxPk &id) const override
Definition: settings.cpp:1911
timeUntilTomorrow
qint64 timeUntilTomorrow()
Definition: friendlistwidget.cpp:92
FriendListWidget::core
const Core & core
Definition: friendlistwidget.h:99
FriendListWidget::FriendListWidget
FriendListWidget(const Core &_core, Widget *parent, bool groupsOnTop=true)
Definition: friendlistwidget.cpp:100
Time::LongAgo
@ LongAgo
GroupWidget
Definition: groupwidget.h:30
Settings::getInstance
static Settings & getInstance()
Returns the singleton instance.
Definition: settings.cpp:88
FriendListWidget::getTimeCategoryWidget
CategoryWidget * getTimeCategoryWidget(const Friend *frd) const
Definition: friendlistwidget.cpp:335
CircleWidget::getFromID
static CircleWidget * getFromID(int id)
Definition: circlewidget.cpp:76
Group
Definition: group.h:34
CircleWidget::editName
void editName()
Definition: circlewidget.cpp:71
FriendListManager::sortByName
void sortByName()
Definition: friendlistmanager.cpp:64
GenericChatroomWidget::chatroomWidgetClicked
void chatroomWidgetClicked(GenericChatroomWidget *widget)
Friend::getPublicKey
const ToxPk & getPublicKey() const
Definition: friend.cpp:131
FriendListManager::addFriendListItem
void addFriendListItem(IFriendListItem *item)
Definition: friendlistmanager.cpp:43
Settings::FriendListSortingMode::Activity
@ Activity
CategoryWidget::setExpanded
void setExpanded(bool isExpanded, bool save=true)
Definition: categorywidget.cpp:83
CircleWidget
Definition: circlewidget.h:27
CategoryWidget::removeFriendWidget
void removeFriendWidget(FriendWidget *w, Status::Status s)
Definition: categorywidget.cpp:138
Time::Never
@ Never
Time::ThisWeek
@ ThisWeek
Settings::getFriendSortingMode
FriendListSortingMode getFriendSortingMode() const
Definition: settings.cpp:1953
Settings::FriendListSortingMode::Name
@ Name
Time::Month5Ago
@ Month5Ago
FriendListWidget::cleanMainLayout
void cleanMainLayout()
Clears the listLayout by performing the creation and ownership inverse of sortByMode.
Definition: friendlistwidget.cpp:280
CategoryWidget::updateStatus
void updateStatus()
Definition: categorywidget.cpp:144
GroupWidget::getGroup
Group * getGroup() const final
Definition: groupwidget.cpp:233
Time::Month4Ago
@ Month4Ago
FriendListManager::applyFilter
void applyFilter()
Definition: friendlistmanager.cpp:99
GenericChatroomWidget
Definition: genericchatroomwidget.h:32
categorywidget.h
FriendListWidget::searchCircle
void searchCircle(CircleWidget &circleWidget)
CategoryWidget::setName
void setName(const QString &name, bool save=true)
Definition: categorywidget.cpp:113
COMMENT
#define COMMENT
FriendListWidget::connectCircleWidget
void connectCircleWidget(CircleWidget &circleWidget)
groupwidget.h
friendwidget.h
FriendListWidget::dragEnterEvent
void dragEnterEvent(QDragEnterEvent *event) override
Definition: friendlistwidget.cpp:513
Core::getFriendList
QVector< uint32_t > getFriendList() const
Returns the list of friendIds in our friendlist, an empty list on error.
Definition: core.cpp:1474
status.h
FriendWidget
Definition: friendwidget.h:33
FriendListWidget::getItemsFromCircle
QVector< std::shared_ptr< IFriendListItem > > getItemsFromCircle(CircleWidget *circle) const
Definition: friendlistwidget.cpp:322
Core
Definition: core.h:59
Widget
Definition: widget.h:87
friendlistmanager.h