data_user_names.cpp 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. /*
  2. This file is part of Telegram Desktop,
  3. the official desktop application for the Telegram messaging service.
  4. For license and copyright information please follow this link:
  5. https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
  6. */
  7. #include "data/data_user_names.h"
  8. namespace Data {
  9. UsernamesInfo::UsernamesInfo() = default;
  10. void UsernamesInfo::setUsername(const QString &username) {
  11. if (_usernames.empty()) {
  12. if (username.isEmpty()) {
  13. _indexEditableUsername = -1;
  14. } else {
  15. _usernames.push_back(username);
  16. _indexEditableUsername = 0;
  17. }
  18. } else if ((_indexEditableUsername < 0)
  19. || (_indexEditableUsername >= _usernames.size())) {
  20. if (username.isEmpty()) {
  21. _indexEditableUsername = -1;
  22. } else {
  23. _usernames.push_back(username);
  24. _indexEditableUsername = 0;
  25. }
  26. } else if (_usernames[_indexEditableUsername] != username) {
  27. if (username.isEmpty()) {
  28. _usernames.erase(begin(_usernames) + _indexEditableUsername);
  29. _indexEditableUsername = -1;
  30. } else {
  31. _usernames[_indexEditableUsername] = username;
  32. }
  33. }
  34. }
  35. void UsernamesInfo::setUsernames(const Usernames &usernames) {
  36. auto editableUsername = QString();
  37. auto newUsernames = ranges::views::all(
  38. usernames
  39. ) | ranges::views::filter([&](const Data::Username &username) {
  40. if (username.editable) {
  41. editableUsername = username.username;
  42. return true;
  43. }
  44. return username.active;
  45. }) | ranges::views::transform([](const Data::Username &username) {
  46. return username.username;
  47. }) | ranges::to_vector;
  48. if (!ranges::equal(_usernames, newUsernames)) {
  49. _usernames = std::move(newUsernames);
  50. }
  51. if (!editableUsername.isEmpty()) {
  52. for (auto i = 0; i < _usernames.size(); i++) {
  53. if (_usernames[i] == editableUsername) {
  54. _indexEditableUsername = i;
  55. break;
  56. }
  57. }
  58. } else {
  59. _indexEditableUsername = -1;
  60. }
  61. }
  62. QString UsernamesInfo::username() const {
  63. return _usernames.empty() ? QString() : _usernames.front();
  64. }
  65. QString UsernamesInfo::editableUsername() const {
  66. return (_indexEditableUsername < 0)
  67. ? QString()
  68. : _usernames[_indexEditableUsername];
  69. }
  70. const std::vector<QString> &UsernamesInfo::usernames() const {
  71. return _usernames;
  72. }
  73. bool UsernamesInfo::isEditable(const QString &username) const {
  74. return (_indexEditableUsername >= 0)
  75. && (_indexEditableUsername < _usernames.size())
  76. && (_usernames[_indexEditableUsername] == username);
  77. }
  78. } // namespace Data