119 lines
3.7 KiB
C++
119 lines
3.7 KiB
C++
/*
|
|
This file is part of Telegram Desktop,
|
|
the official desktop version of Telegram messaging app, see https://telegram.org
|
|
|
|
Telegram Desktop is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
It is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
In addition, as a special exception, the copyright holders give permission
|
|
to link the code of portions of this program with the OpenSSL library.
|
|
|
|
Full license: https://github.com/telegramdesktop/tdesktop/blob/master/LICENSE
|
|
Copyright (c) 2014-2017 John Preston, https://desktop.telegram.org
|
|
*/
|
|
#include "profile/profile_block_invite_link.h"
|
|
|
|
#include "styles/style_profile.h"
|
|
#include "ui/widgets/labels.h"
|
|
#include "ui/toast/toast.h"
|
|
#include "boxes/confirm_box.h"
|
|
#include "observer_peer.h"
|
|
#include "mainwindow.h"
|
|
#include "lang/lang_keys.h"
|
|
|
|
namespace Profile {
|
|
|
|
using UpdateFlag = Notify::PeerUpdate::Flag;
|
|
|
|
InviteLinkWidget::InviteLinkWidget(QWidget *parent, PeerData *peer) : BlockWidget(parent, peer, lang(lng_profile_invite_link_section)) {
|
|
auto observeEvents = UpdateFlag::InviteLinkChanged | UpdateFlag::UsernameChanged;
|
|
subscribe(Notify::PeerUpdated(), Notify::PeerUpdatedHandler(observeEvents, [this](const Notify::PeerUpdate &update) {
|
|
notifyPeerUpdated(update);
|
|
}));
|
|
|
|
refreshLink();
|
|
refreshVisibility();
|
|
}
|
|
|
|
void InviteLinkWidget::notifyPeerUpdated(const Notify::PeerUpdate &update) {
|
|
if (update.peer != peer()) {
|
|
return;
|
|
}
|
|
|
|
if (update.flags & (UpdateFlag::InviteLinkChanged | UpdateFlag::UsernameChanged)) {
|
|
refreshLink();
|
|
refreshVisibility();
|
|
|
|
contentSizeUpdated();
|
|
}
|
|
}
|
|
|
|
int InviteLinkWidget::resizeGetHeight(int newWidth) {
|
|
int newHeight = contentTop();
|
|
|
|
int marginLeft = st::profileBlockTextPart.margin.left();
|
|
int marginRight = st::profileBlockTextPart.margin.right();
|
|
int left = st::profileBlockTitlePosition.x();
|
|
if (_link) {
|
|
int textWidth = _link->naturalWidth();
|
|
int availableWidth = newWidth - left - st::profileBlockMarginRight;
|
|
int maxWidth = st::msgMaxWidth;
|
|
accumulate_min(textWidth, availableWidth);
|
|
accumulate_min(textWidth, st::msgMaxWidth);
|
|
_link->resizeToWidth(textWidth + marginLeft + marginRight);
|
|
_link->moveToLeft(left - marginLeft, newHeight - st::profileBlockTextPart.margin.top());
|
|
newHeight += _link->height();
|
|
}
|
|
|
|
newHeight += st::profileBlockMarginBottom;
|
|
return newHeight;
|
|
}
|
|
|
|
void InviteLinkWidget::refreshVisibility() {
|
|
setVisible(_link != nullptr);
|
|
}
|
|
|
|
QString InviteLinkWidget::getInviteLink() const {
|
|
if (auto chat = peer()->asChat()) {
|
|
return chat->inviteLink();
|
|
} else if (auto channel = peer()->asChannel()) {
|
|
return channel->isPublic() ? QString() : channel->inviteLink();
|
|
}
|
|
return QString();
|
|
};
|
|
|
|
void InviteLinkWidget::refreshLink() {
|
|
_link.destroy();
|
|
TextWithEntities linkData = { getInviteLink(), EntitiesInText() };
|
|
if (linkData.text.isEmpty()) {
|
|
_link.destroy();
|
|
} else {
|
|
_link.create(this, QString(), Ui::FlatLabel::InitType::Simple, st::profileInviteLinkText);
|
|
_link->show();
|
|
|
|
linkData.entities.push_back(EntityInText(EntityInTextUrl, 0, linkData.text.size()));
|
|
_link->setMarkedText(linkData);
|
|
_link->setSelectable(true);
|
|
_link->setContextCopyText(QString());
|
|
_link->setClickHandlerHook([this](const ClickHandlerPtr &handler, Qt::MouseButton button) {
|
|
auto link = getInviteLink();
|
|
if (link.isEmpty()) {
|
|
return true;
|
|
}
|
|
|
|
QApplication::clipboard()->setText(link);
|
|
Ui::Toast::Show(lang(lng_group_invite_copied));
|
|
return false;
|
|
});
|
|
}
|
|
}
|
|
|
|
} // namespace Profile
|