qTox  Version: nightly | Commit: bc751c8e1cac455f9690654fcfe0f560d2d7dfdd
friendlistmanager.cpp
Go to the documentation of this file.
1 /*
2  Copyright © 2021 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 "friendlistmanager.h"
22 
23 FriendListManager::FriendListManager(int countContacts, QObject *parent) : QObject(parent)
24 {
25  this->countContacts = countContacts;
26 }
27 
28 QVector<FriendListManager::IFriendListItemPtr> FriendListManager::getItems() const
29 {
30  return items;
31 }
32 
34 {
35  return hideCircles;
36 }
37 
39 {
40  return positionsChanged;
41 }
42 
44 {
45  if (item->isGroup() && item->getWidget() != nullptr) {
46  items.push_back(IFriendListItemPtr(item, [](IFriendListItem* groupItem){
47  groupItem->getWidget()->deleteLater();}));
48  } else {
49  items.push_back(IFriendListItemPtr(item));
50  }
51 
52  if (countContacts <= items.size()) {
53  countContacts = 0;
55  }
56 }
57 
59 {
60  removeAll(item);
62 }
63 
65 {
66  byName = true;
68 }
69 
71 {
72  byName = false;
74 }
75 
77 {
78  for (int i = 0; i < items.size(); ++i) {
79  IFriendListItem* itemTmp = items[i].get();
80  itemTmp->getWidget()->setParent(nullptr);
81  }
82 }
83 
84 void FriendListManager::setFilter(const QString &searchString, bool hideOnline, bool hideOffline,
85  bool hideGroups)
86 {
87  if (filterParams.searchString == searchString && filterParams.hideOnline == hideOnline &&
88  filterParams.hideOffline == hideOffline && filterParams.hideGroups == hideGroups) {
89  return;
90  }
91  filterParams.searchString = searchString;
92  filterParams.hideOnline = hideOnline;
93  filterParams.hideOffline = hideOffline;
94  filterParams.hideGroups = hideGroups;
95 
97 }
98 
100 {
101  QString searchString = filterParams.searchString;
102 
103  for (IFriendListItemPtr itemTmp : items) {
104  if (searchString.isEmpty()) {
105  itemTmp->setWidgetVisible(true);
106  } else {
107  QString tmp_name = itemTmp->getNameItem();
108  itemTmp->setWidgetVisible(tmp_name.contains(searchString, Qt::CaseInsensitive));
109  }
110 
111  if (filterParams.hideOnline && itemTmp->isOnline()) {
112  if (itemTmp->isFriend()) {
113  itemTmp->setWidgetVisible(false);
114  }
115  }
116 
117  if (filterParams.hideOffline && !itemTmp->isOnline()) {
118  itemTmp->setWidgetVisible(false);
119  }
120 
121  if (filterParams.hideGroups && itemTmp->isGroup()) {
122  itemTmp->setWidgetVisible(false);
123  }
124  }
125 
127  hideCircles = true;
128  } else {
129  hideCircles = false;
130  }
131 }
132 
134 {
135  positionsChanged = true;
136 
137  if (byName) {
138  auto sortName = [&](const IFriendListItemPtr &a, const IFriendListItemPtr &b) {
139  return cmpByName(a, b, groupsOnTop);
140  };
141  if (!needSort) {
142  if (std::is_sorted(items.begin(), items.end(), sortName)) {
143  positionsChanged = false;
144  return;
145  }
146  }
147  std::sort(items.begin(), items.end(), sortName);
148 
149  } else {
150  auto sortActivity = [&](const IFriendListItemPtr &a, const IFriendListItemPtr &b) {
151  return cmpByActivity(a, b);
152  };
153  if (!needSort) {
154  if (std::is_sorted(items.begin(), items.end(), sortActivity)) {
155  positionsChanged = false;
156  return;
157  }
158  }
159  std::sort(items.begin(), items.end(), sortActivity);
160  }
161 
162  needSort = false;
163 }
164 
166 {
167  needSort = true;
168  emit itemsChanged();
169 }
170 
172 {
173  groupsOnTop = v;
174 }
175 
177 {
178  for (int i = 0; i < items.size(); ++i) {
179  if (items[i].get() == item) {
180  items.remove(i);
181  --i;
182  }
183  }
184 }
185 
187  bool groupsOnTop)
188 {
189  if (a->isGroup() && !b->isGroup()) {
190  if (groupsOnTop) {
191  return true;
192  }
193  return !b->isOnline();
194  }
195 
196  if (!a->isGroup() && b->isGroup()) {
197  if (groupsOnTop) {
198  return false;
199  }
200  return a->isOnline();
201  }
202 
203  if (a->isOnline() && !b->isOnline()) {
204  return true;
205  }
206 
207  if (!a->isOnline() && b->isOnline()) {
208  return false;
209  }
210 
211  return a->getNameItem().toUpper() < b->getNameItem().toUpper();
212 }
213 
215 {
216  if (a->isGroup() || b->isGroup()) {
217  if (a->isGroup() && !b->isGroup()) {
218  return true;
219  }
220 
221  if (!a->isGroup() && b->isGroup()) {
222  return false;
223  }
224  return a->getNameItem().toUpper() < b->getNameItem().toUpper();
225  }
226 
227  QDateTime dateA = a->getLastActivity();
228  QDateTime dateB = b->getLastActivity();
229  if (dateA.date() == dateB.date()) {
230  if (a->isOnline() && !b->isOnline()) {
231  return true;
232  }
233 
234  if (!a->isOnline() && b->isOnline()) {
235  return false;
236  }
237  return a->getNameItem().toUpper() < b->getNameItem().toUpper();
238  }
239 
240  return a->getLastActivity() > b->getLastActivity();
241 }
242 
FriendListManager::FilterParams::hideOnline
bool hideOnline
Definition: friendlistmanager.h:61
genericchatroomwidget.h
FriendListManager::resetParents
void resetParents()
Definition: friendlistmanager.cpp:76
FriendListManager::getItems
QVector< IFriendListItemPtr > getItems() const
Definition: friendlistmanager.cpp:28
FriendListManager::byName
bool byName
Definition: friendlistmanager.h:70
FriendListManager::setFilter
void setFilter(const QString &searchString, bool hideOnline, bool hideOffline, bool hideGroups)
Definition: friendlistmanager.cpp:84
FriendListManager::groupsOnTop
bool groupsOnTop
Definition: friendlistmanager.h:72
FriendListManager::needHideCircles
bool needHideCircles() const
Definition: friendlistmanager.cpp:33
IFriendListItem
Definition: ifriendlistitem.h:26
FriendListManager::cmpByName
bool cmpByName(const IFriendListItemPtr &, const IFriendListItemPtr &, bool groupsOnTop)
Definition: friendlistmanager.cpp:186
FriendListManager::sortByActivity
void sortByActivity()
Definition: friendlistmanager.cpp:70
FriendListManager::positionsChanged
bool positionsChanged
Definition: friendlistmanager.h:73
IFriendListItem::getWidget
virtual QWidget * getWidget()=0
IFriendListItem::isGroup
virtual bool isGroup() const =0
FriendListManager::filterParams
struct FriendListManager::FilterParams filterParams
FriendListManager::removeFriendListItem
void removeFriendListItem(IFriendListItem *item)
Definition: friendlistmanager.cpp:58
FriendListManager::FilterParams::hideGroups
bool hideGroups
Definition: friendlistmanager.h:63
FriendListManager::setSortRequired
void setSortRequired()
Definition: friendlistmanager.cpp:165
FriendListManager::removeAll
void removeAll(IFriendListItem *)
Definition: friendlistmanager.cpp:176
FriendListManager::setGroupsOnTop
void setGroupsOnTop(bool v)
Definition: friendlistmanager.cpp:171
FriendListManager::hideCircles
bool hideCircles
Definition: friendlistmanager.h:71
FriendListManager::items
QVector< IFriendListItemPtr > items
Definition: friendlistmanager.h:75
FriendListManager::getPositionsChanged
bool getPositionsChanged() const
Definition: friendlistmanager.cpp:38
FriendListManager::FriendListManager
FriendListManager(int countContacts, QObject *parent=nullptr)
Definition: friendlistmanager.cpp:23
FriendListManager::itemsChanged
void itemsChanged()
FriendListManager::needSort
bool needSort
Definition: friendlistmanager.h:74
FriendListManager::updatePositions
void updatePositions()
Definition: friendlistmanager.cpp:133
FriendListManager::cmpByActivity
bool cmpByActivity(const IFriendListItemPtr &, const IFriendListItemPtr &)
Definition: friendlistmanager.cpp:214
FriendListManager::sortByName
void sortByName()
Definition: friendlistmanager.cpp:64
FriendListManager::addFriendListItem
void addFriendListItem(IFriendListItem *item)
Definition: friendlistmanager.cpp:43
FriendListManager::countContacts
int countContacts
Definition: friendlistmanager.h:77
FriendListManager::FilterParams::searchString
QString searchString
Definition: friendlistmanager.h:60
FriendListManager::applyFilter
void applyFilter()
Definition: friendlistmanager.cpp:99
FriendListManager::IFriendListItemPtr
std::shared_ptr< IFriendListItem > IFriendListItemPtr
Definition: friendlistmanager.h:33
FriendListManager::FilterParams::hideOffline
bool hideOffline
Definition: friendlistmanager.h:62
friendlistmanager.h