7d310e56cc
Related commit: 57b22d2ad2.
82 linhas
2.2 KiB
C++
82 linhas
2.2 KiB
C++
/*
|
|
This file is part of Telegram Desktop,
|
|
the official desktop application for the Telegram messaging service.
|
|
|
|
For license and copyright information please follow this link:
|
|
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
|
*/
|
|
#include "tray_accounts_menu.h"
|
|
|
|
#include "base/weak_ptr.h"
|
|
#include "base/qt/qt_key_modifiers.h"
|
|
#include "core/application.h"
|
|
#include "data/data_peer.h"
|
|
#include "data/data_user.h"
|
|
#include "info/profile/info_profile_values.h"
|
|
#include "main/main_account.h"
|
|
#include "main/main_domain.h"
|
|
#include "main/main_session.h"
|
|
#include "styles/style_window.h"
|
|
#include "ui/dynamic_thumbnails.h"
|
|
|
|
namespace Core::TrayAccountsMenu {
|
|
|
|
void SetupChangesSubscription(Fn<void()> callback, rpl::lifetime &lifetime) {
|
|
const auto accountSessionsLifetime = lifetime.make_state<rpl::lifetime>();
|
|
const auto watchAccountSessions = [=] {
|
|
accountSessionsLifetime->destroy();
|
|
for (const auto &[index, account] : Core::App().domain().accounts()) {
|
|
account->sessionChanges(
|
|
) | rpl::on_next([=](Main::Session*) {
|
|
callback();
|
|
}, *accountSessionsLifetime);
|
|
}
|
|
};
|
|
Core::App().domain().accountsChanges() | rpl::on_next([=] {
|
|
watchAccountSessions();
|
|
callback();
|
|
}, lifetime);
|
|
watchAccountSessions();
|
|
}
|
|
|
|
void Fill(Platform::Tray &tray) {
|
|
auto accounts = std::vector<not_null<Main::Account*>>();
|
|
for (const auto &account : Core::App().domain().orderedAccounts()) {
|
|
if (account->sessionExists()) {
|
|
accounts.push_back(account);
|
|
}
|
|
}
|
|
if (accounts.size() <= 1) {
|
|
return;
|
|
}
|
|
tray.addSeparator();
|
|
constexpr auto kMaxLength = 30;
|
|
for (const auto account : accounts) {
|
|
const auto user = account->session().user();
|
|
const auto weak = base::make_weak(account);
|
|
tray.addAction(
|
|
Info::Profile::NameValue(
|
|
user
|
|
) | rpl::map([=](const QString &name) {
|
|
return (name.size() > kMaxLength)
|
|
? (name.mid(0, kMaxLength) + Ui::kQEllipsis)
|
|
: name;
|
|
}),
|
|
[weak] {
|
|
const auto strong = weak.get();
|
|
if (!strong || !strong->sessionExists()) {
|
|
return;
|
|
}
|
|
if (base::IsCtrlPressed()) {
|
|
Core::App().ensureSeparateWindowFor({ strong });
|
|
} else {
|
|
Core::App().domain().maybeActivate(strong);
|
|
}
|
|
},
|
|
Ui::MakeUserpicThumbnail(user, true),
|
|
st::notifyMacPhotoSize);
|
|
}
|
|
}
|
|
|
|
} // namespace Core::TrayAccountsMenu
|