Merge remote-tracking branch 'tdesktop/dev' into dev
This commit is contained in:
commit
34e2d309cf
17 changed files with 115 additions and 89 deletions
|
|
@ -9,7 +9,7 @@
|
||||||
<Identity Name="TelegramMessengerLLP.TelegramDesktop"
|
<Identity Name="TelegramMessengerLLP.TelegramDesktop"
|
||||||
ProcessorArchitecture="ARCHITECTURE"
|
ProcessorArchitecture="ARCHITECTURE"
|
||||||
Publisher="CN=536BC709-8EE1-4478-AF22-F0F0F26FF64A"
|
Publisher="CN=536BC709-8EE1-4478-AF22-F0F0F26FF64A"
|
||||||
Version="2.1.9.0" />
|
Version="2.1.10.0" />
|
||||||
<Properties>
|
<Properties>
|
||||||
<DisplayName>Telegram Desktop</DisplayName>
|
<DisplayName>Telegram Desktop</DisplayName>
|
||||||
<PublisherDisplayName>Telegram FZ-LLC</PublisherDisplayName>
|
<PublisherDisplayName>Telegram FZ-LLC</PublisherDisplayName>
|
||||||
|
|
|
||||||
|
|
@ -44,8 +44,8 @@ IDI_ICON1 ICON "..\\art\\icon256.ico"
|
||||||
//
|
//
|
||||||
|
|
||||||
VS_VERSION_INFO VERSIONINFO
|
VS_VERSION_INFO VERSIONINFO
|
||||||
FILEVERSION 2,1,9,0
|
FILEVERSION 2,1,10,0
|
||||||
PRODUCTVERSION 2,1,9,0
|
PRODUCTVERSION 2,1,10,0
|
||||||
FILEFLAGSMASK 0x3fL
|
FILEFLAGSMASK 0x3fL
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
FILEFLAGS 0x1L
|
FILEFLAGS 0x1L
|
||||||
|
|
@ -62,10 +62,10 @@ BEGIN
|
||||||
BEGIN
|
BEGIN
|
||||||
VALUE "CompanyName", "Telegram FZ-LLC"
|
VALUE "CompanyName", "Telegram FZ-LLC"
|
||||||
VALUE "FileDescription", "Telegram Desktop"
|
VALUE "FileDescription", "Telegram Desktop"
|
||||||
VALUE "FileVersion", "2.1.9.0"
|
VALUE "FileVersion", "2.1.10.0"
|
||||||
VALUE "LegalCopyright", "Copyright (C) 2014-2020"
|
VALUE "LegalCopyright", "Copyright (C) 2014-2020"
|
||||||
VALUE "ProductName", "Telegram Desktop"
|
VALUE "ProductName", "Telegram Desktop"
|
||||||
VALUE "ProductVersion", "2.1.9.0"
|
VALUE "ProductVersion", "2.1.10.0"
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
BLOCK "VarFileInfo"
|
BLOCK "VarFileInfo"
|
||||||
|
|
|
||||||
|
|
@ -35,8 +35,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||||
//
|
//
|
||||||
|
|
||||||
VS_VERSION_INFO VERSIONINFO
|
VS_VERSION_INFO VERSIONINFO
|
||||||
FILEVERSION 2,1,9,0
|
FILEVERSION 2,1,10,0
|
||||||
PRODUCTVERSION 2,1,9,0
|
PRODUCTVERSION 2,1,10,0
|
||||||
FILEFLAGSMASK 0x3fL
|
FILEFLAGSMASK 0x3fL
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
FILEFLAGS 0x1L
|
FILEFLAGS 0x1L
|
||||||
|
|
@ -53,10 +53,10 @@ BEGIN
|
||||||
BEGIN
|
BEGIN
|
||||||
VALUE "CompanyName", "Telegram FZ-LLC"
|
VALUE "CompanyName", "Telegram FZ-LLC"
|
||||||
VALUE "FileDescription", "Telegram Desktop Updater"
|
VALUE "FileDescription", "Telegram Desktop Updater"
|
||||||
VALUE "FileVersion", "2.1.9.0"
|
VALUE "FileVersion", "2.1.10.0"
|
||||||
VALUE "LegalCopyright", "Copyright (C) 2014-2020"
|
VALUE "LegalCopyright", "Copyright (C) 2014-2020"
|
||||||
VALUE "ProductName", "Telegram Desktop"
|
VALUE "ProductName", "Telegram Desktop"
|
||||||
VALUE "ProductVersion", "2.1.9.0"
|
VALUE "ProductVersion", "2.1.10.0"
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
BLOCK "VarFileInfo"
|
BLOCK "VarFileInfo"
|
||||||
|
|
|
||||||
|
|
@ -2633,7 +2633,9 @@ void ApiWrap::resolveWebPages() {
|
||||||
if (!ids.isEmpty()) {
|
if (!ids.isEmpty()) {
|
||||||
requestId = request(MTPmessages_GetMessages(
|
requestId = request(MTPmessages_GetMessages(
|
||||||
MTP_vector<MTPInputMessage>(ids)
|
MTP_vector<MTPInputMessage>(ids)
|
||||||
)).done([=](const MTPmessages_Messages &result, mtpRequestId requestId) {
|
)).done([=](
|
||||||
|
const MTPmessages_Messages &result,
|
||||||
|
mtpRequestId requestId) {
|
||||||
gotWebPages(nullptr, result, requestId);
|
gotWebPages(nullptr, result, requestId);
|
||||||
}).afterDelay(kSmallDelayMs).send();
|
}).afterDelay(kSmallDelayMs).send();
|
||||||
}
|
}
|
||||||
|
|
@ -2642,7 +2644,9 @@ void ApiWrap::resolveWebPages() {
|
||||||
reqsByIndex[i.value().first] = request(MTPchannels_GetMessages(
|
reqsByIndex[i.value().first] = request(MTPchannels_GetMessages(
|
||||||
i.key()->inputChannel,
|
i.key()->inputChannel,
|
||||||
MTP_vector<MTPInputMessage>(i.value().second)
|
MTP_vector<MTPInputMessage>(i.value().second)
|
||||||
)).done([=, channel = i.key()](const MTPmessages_Messages &result, mtpRequestId requestId) {
|
)).done([=, channel = i.key()](
|
||||||
|
const MTPmessages_Messages &result,
|
||||||
|
mtpRequestId requestId) {
|
||||||
gotWebPages(channel, result, requestId);
|
gotWebPages(channel, result, requestId);
|
||||||
}).afterDelay(kSmallDelayMs).send();
|
}).afterDelay(kSmallDelayMs).send();
|
||||||
}
|
}
|
||||||
|
|
@ -2957,58 +2961,8 @@ void ApiWrap::refreshFileReference(
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void ApiWrap::gotWebPages(ChannelData *channel, const MTPmessages_Messages &msgs, mtpRequestId req) {
|
void ApiWrap::gotWebPages(ChannelData *channel, const MTPmessages_Messages &result, mtpRequestId req) {
|
||||||
const QVector<MTPMessage> *v = 0;
|
WebPageData::ApplyChanges(&session(), channel, result);
|
||||||
switch (msgs.type()) {
|
|
||||||
case mtpc_messages_messages: {
|
|
||||||
auto &d = msgs.c_messages_messages();
|
|
||||||
_session->data().processUsers(d.vusers());
|
|
||||||
_session->data().processChats(d.vchats());
|
|
||||||
v = &d.vmessages().v;
|
|
||||||
} break;
|
|
||||||
|
|
||||||
case mtpc_messages_messagesSlice: {
|
|
||||||
auto &d = msgs.c_messages_messagesSlice();
|
|
||||||
_session->data().processUsers(d.vusers());
|
|
||||||
_session->data().processChats(d.vchats());
|
|
||||||
v = &d.vmessages().v;
|
|
||||||
} break;
|
|
||||||
|
|
||||||
case mtpc_messages_channelMessages: {
|
|
||||||
auto &d = msgs.c_messages_channelMessages();
|
|
||||||
if (channel) {
|
|
||||||
channel->ptsReceived(d.vpts().v);
|
|
||||||
} else {
|
|
||||||
LOG(("API Error: received messages.channelMessages when no channel was passed! (ApiWrap::gotWebPages)"));
|
|
||||||
}
|
|
||||||
_session->data().processUsers(d.vusers());
|
|
||||||
_session->data().processChats(d.vchats());
|
|
||||||
v = &d.vmessages().v;
|
|
||||||
} break;
|
|
||||||
|
|
||||||
case mtpc_messages_messagesNotModified: {
|
|
||||||
LOG(("API Error: received messages.messagesNotModified! (ApiWrap::gotWebPages)"));
|
|
||||||
} break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!v) return;
|
|
||||||
|
|
||||||
auto indices = base::flat_map<uint64, int>(); // copied from feedMsgs
|
|
||||||
for (auto i = 0, l = v->size(); i != l; ++i) {
|
|
||||||
const auto msgId = IdFromMessage(v->at(i));
|
|
||||||
indices.emplace((uint64(uint32(msgId)) << 32) | uint64(i), i);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const auto &[position, index] : indices) {
|
|
||||||
const auto item = _session->data().addNewMessage(
|
|
||||||
v->at(index),
|
|
||||||
MTPDmessage_ClientFlags(),
|
|
||||||
NewMessageType::Existing);
|
|
||||||
if (item) {
|
|
||||||
_session->data().requestItemResize(item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (auto i = _webPagesPending.begin(); i != _webPagesPending.cend();) {
|
for (auto i = _webPagesPending.begin(); i != _webPagesPending.cend();) {
|
||||||
if (i.value() == req) {
|
if (i.value() == req) {
|
||||||
if (i.key()->pendingTill > 0) {
|
if (i.key()->pendingTill > 0) {
|
||||||
|
|
|
||||||
|
|
@ -192,7 +192,6 @@ EditCaptionBox::EditCaptionBox(
|
||||||
maxH);
|
maxH);
|
||||||
_thumbnailImageLoaded = true;
|
_thumbnailImageLoaded = true;
|
||||||
};
|
};
|
||||||
prepareStreamedPreview();
|
|
||||||
} else {
|
} else {
|
||||||
Assert(_photoMedia != nullptr);
|
Assert(_photoMedia != nullptr);
|
||||||
|
|
||||||
|
|
@ -328,6 +327,10 @@ EditCaptionBox::EditCaptionBox(
|
||||||
) | rpl::start_with_next([&](bool checked) {
|
) | rpl::start_with_next([&](bool checked) {
|
||||||
_asFile = checked;
|
_asFile = checked;
|
||||||
}, _wayWrap->lifetime());
|
}, _wayWrap->lifetime());
|
||||||
|
|
||||||
|
if (_animated) {
|
||||||
|
prepareStreamedPreview();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
EditCaptionBox::~EditCaptionBox() = default;
|
EditCaptionBox::~EditCaptionBox() = default;
|
||||||
|
|
|
||||||
|
|
@ -1831,11 +1831,7 @@ void SendFilesBox::setupShadows(
|
||||||
}
|
}
|
||||||
|
|
||||||
void SendFilesBox::prepare() {
|
void SendFilesBox::prepare() {
|
||||||
_send = addButton(
|
_send = addButton(tr::lng_send_button(), [=] { send({}); });
|
||||||
(_sendType == Api::SendType::Normal
|
|
||||||
? tr::lng_send_button()
|
|
||||||
: tr::lng_schedule_button()),
|
|
||||||
[=] { send({}); });
|
|
||||||
if (_sendType == Api::SendType::Normal) {
|
if (_sendType == Api::SendType::Normal) {
|
||||||
SetupSendMenuAndShortcuts(
|
SetupSendMenuAndShortcuts(
|
||||||
_send,
|
_send,
|
||||||
|
|
@ -1853,9 +1849,8 @@ void SendFilesBox::prepare() {
|
||||||
}
|
}
|
||||||
}, lifetime());
|
}, lifetime());
|
||||||
|
|
||||||
const auto title = tr::lng_stickers_featured_add(tr::now) + qsl("...");
|
|
||||||
_addFileToAlbum = addLeftButton(
|
_addFileToAlbum = addLeftButton(
|
||||||
rpl::single(title),
|
tr::lng_stickers_featured_add(),
|
||||||
App::LambdaDelayed(st::historyAttach.ripple.hideDuration, this, [=] {
|
App::LambdaDelayed(st::historyAttach.ripple.hideDuration, this, [=] {
|
||||||
openDialogToAddFileToAlbum();
|
openDialogToAddFileToAlbum();
|
||||||
}));
|
}));
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ constexpr auto AppId = "{C4A4AE8F-B9F7-4CC7-8A6C-BF7EEE87ACA5}"_cs;
|
||||||
constexpr auto AppNameOld = "Telegram Win (Unofficial)"_cs;
|
constexpr auto AppNameOld = "Telegram Win (Unofficial)"_cs;
|
||||||
constexpr auto AppName = "Kotatogram Desktop"_cs;
|
constexpr auto AppName = "Kotatogram Desktop"_cs;
|
||||||
constexpr auto AppFile = "Kotatogram"_cs;
|
constexpr auto AppFile = "Kotatogram"_cs;
|
||||||
constexpr auto AppVersion = 2001009;
|
constexpr auto AppVersion = 2001010;
|
||||||
constexpr auto AppVersionStr = "2.1.9";
|
constexpr auto AppVersionStr = "2.1.10";
|
||||||
constexpr auto AppBetaVersion = true;
|
constexpr auto AppBetaVersion = true;
|
||||||
constexpr auto AppAlphaVersion = TDESKTOP_ALPHA_VERSION;
|
constexpr auto AppAlphaVersion = TDESKTOP_ALPHA_VERSION;
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
#include "mainwidget.h"
|
#include "mainwidget.h"
|
||||||
#include "data/data_session.h"
|
#include "data/data_session.h"
|
||||||
#include "data/data_photo.h"
|
#include "data/data_photo.h"
|
||||||
|
#include "data/data_channel.h"
|
||||||
#include "data/data_document.h"
|
#include "data/data_document.h"
|
||||||
#include "ui/image/image.h"
|
#include "ui/image/image.h"
|
||||||
#include "ui/text/text_entity.h"
|
#include "ui/text/text_entity.h"
|
||||||
|
|
@ -240,3 +241,45 @@ void WebPageData::replaceDocumentGoodThumbnail() {
|
||||||
document->setGoodThumbnailPhoto(photo);
|
document->setGoodThumbnailPhoto(photo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WebPageData::ApplyChanges(
|
||||||
|
not_null<Main::Session*> session,
|
||||||
|
ChannelData *channel,
|
||||||
|
const MTPmessages_Messages &result) {
|
||||||
|
result.match([&](
|
||||||
|
const MTPDmessages_channelMessages &data) {
|
||||||
|
if (channel) {
|
||||||
|
channel->ptsReceived(data.vpts().v);
|
||||||
|
} else {
|
||||||
|
LOG(("API Error: received messages.channelMessages "
|
||||||
|
"when no channel was passed! (WebPageData::ApplyChanges)"));
|
||||||
|
}
|
||||||
|
}, [&](const auto &) {
|
||||||
|
});
|
||||||
|
const auto list = result.match([](
|
||||||
|
const MTPDmessages_messagesNotModified &) {
|
||||||
|
LOG(("API Error: received messages.messagesNotModified! "
|
||||||
|
"(WebPageData::ApplyChanges)"));
|
||||||
|
return static_cast<const QVector<MTPMessage>*>(nullptr);
|
||||||
|
}, [&](const auto &data) {
|
||||||
|
session->data().processUsers(data.vusers());
|
||||||
|
session->data().processChats(data.vchats());
|
||||||
|
return &data.vmessages().v;
|
||||||
|
});
|
||||||
|
if (!list) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const auto &message : *list) {
|
||||||
|
message.match([&](const MTPDmessage &data) {
|
||||||
|
if (const auto media = data.vmedia()) {
|
||||||
|
media->match([&](const MTPDmessageMediaWebPage &data) {
|
||||||
|
session->data().processWebpage(data.vwebpage());
|
||||||
|
}, [&](const auto &) {
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}, [&](const auto &) {
|
||||||
|
});
|
||||||
|
}
|
||||||
|
session->data().sendWebPageGamePollNotifications();
|
||||||
|
}
|
||||||
|
|
@ -10,6 +10,12 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||||
#include "data/data_photo.h"
|
#include "data/data_photo.h"
|
||||||
#include "data/data_document.h"
|
#include "data/data_document.h"
|
||||||
|
|
||||||
|
class ChannelData;
|
||||||
|
|
||||||
|
namespace Main {
|
||||||
|
class Session;
|
||||||
|
} // namespace Main
|
||||||
|
|
||||||
enum class WebPageType {
|
enum class WebPageType {
|
||||||
Photo,
|
Photo,
|
||||||
Video,
|
Video,
|
||||||
|
|
@ -50,6 +56,11 @@ struct WebPageData {
|
||||||
const QString &newAuthor,
|
const QString &newAuthor,
|
||||||
int newPendingTill);
|
int newPendingTill);
|
||||||
|
|
||||||
|
static void ApplyChanges(
|
||||||
|
not_null<Main::Session*> session,
|
||||||
|
ChannelData *channel,
|
||||||
|
const MTPmessages_Messages &result);
|
||||||
|
|
||||||
WebPageId id = 0;
|
WebPageId id = 0;
|
||||||
WebPageType type = WebPageType::Article;
|
WebPageType type = WebPageType::Article;
|
||||||
QString url;
|
QString url;
|
||||||
|
|
|
||||||
|
|
@ -5626,7 +5626,15 @@ void HistoryWidget::updateUnreadMentionsVisibility() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void HistoryWidget::mousePressEvent(QMouseEvent *e) {
|
void HistoryWidget::mousePressEvent(QMouseEvent *e) {
|
||||||
_replyForwardPressed = QRect(0, _field->y() - st::historySendPadding - st::historyReplyHeight, st::historyReplySkip, st::historyReplyHeight).contains(e->pos());
|
const auto hasSecondLayer = (_editMsgId
|
||||||
|
|| _replyToId
|
||||||
|
|| readyToForward()
|
||||||
|
|| _kbReplyTo);
|
||||||
|
_replyForwardPressed = hasSecondLayer && QRect(
|
||||||
|
0,
|
||||||
|
_field->y() - st::historySendPadding - st::historyReplyHeight,
|
||||||
|
st::historyReplySkip,
|
||||||
|
st::historyReplyHeight).contains(e->pos());
|
||||||
if (_replyForwardPressed && !_fieldBarCancel->isHidden()) {
|
if (_replyForwardPressed && !_fieldBarCancel->isHidden()) {
|
||||||
updateField();
|
updateField();
|
||||||
} else if (_inReplyEditForward) {
|
} else if (_inReplyEditForward) {
|
||||||
|
|
|
||||||
|
|
@ -1152,7 +1152,7 @@ void Pip::paint(QPainter &p, FrameRequest request) {
|
||||||
} else {
|
} else {
|
||||||
p.drawImage(rect, RotateFrameImage(image, _rotation));
|
p.drawImage(rect, RotateFrameImage(image, _rotation));
|
||||||
}
|
}
|
||||||
if (_instance.player().ready()) {
|
if (canUseVideoFrame()) {
|
||||||
_instance.markFrameShown();
|
_instance.markFrameShown();
|
||||||
}
|
}
|
||||||
paintRadialLoading(p);
|
paintRadialLoading(p);
|
||||||
|
|
@ -1377,8 +1377,13 @@ void Pip::restartAtSeekPosition(crl::time position) {
|
||||||
updatePlaybackState();
|
updatePlaybackState();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Pip::canUseVideoFrame() const {
|
||||||
|
return _instance.player().ready()
|
||||||
|
&& !_instance.info().video.cover.isNull();
|
||||||
|
}
|
||||||
|
|
||||||
QImage Pip::videoFrame(const FrameRequest &request) const {
|
QImage Pip::videoFrame(const FrameRequest &request) const {
|
||||||
if (_instance.player().ready()) {
|
if (canUseVideoFrame()) {
|
||||||
_preparedCoverStorage = QImage();
|
_preparedCoverStorage = QImage();
|
||||||
return _instance.frame(request);
|
return _instance.frame(request);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -169,6 +169,7 @@ private:
|
||||||
void updatePlayPauseResumeState(const Player::TrackState &state);
|
void updatePlayPauseResumeState(const Player::TrackState &state);
|
||||||
void restartAtSeekPosition(crl::time position);
|
void restartAtSeekPosition(crl::time position);
|
||||||
|
|
||||||
|
[[nodiscard]] bool canUseVideoFrame() const;
|
||||||
[[nodiscard]] QImage videoFrame(const FrameRequest &request) const;
|
[[nodiscard]] QImage videoFrame(const FrameRequest &request) const;
|
||||||
[[nodiscard]] QImage videoFrameForDirectPaint(
|
[[nodiscard]] QImage videoFrameForDirectPaint(
|
||||||
const FrameRequest &request) const;
|
const FrameRequest &request) const;
|
||||||
|
|
|
||||||
|
|
@ -322,9 +322,6 @@ std::optional<PreparedList> PreparedList::PreparedFileFromFilesDialog(
|
||||||
auto filteredFiles = ranges::view::all(
|
auto filteredFiles = ranges::view::all(
|
||||||
temp.files
|
temp.files
|
||||||
) | ranges::view::filter([&](const auto &file) {
|
) | ranges::view::filter([&](const auto &file) {
|
||||||
if (!isAlbum) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
const auto info = QFileInfo(file.path);
|
const auto info = QFileInfo(file.path);
|
||||||
if (Core::IsMimeSticker(Core::MimeTypeForFile(info).name())) {
|
if (Core::IsMimeSticker(Core::MimeTypeForFile(info).name())) {
|
||||||
if (isSingleFile) {
|
if (isSingleFile) {
|
||||||
|
|
@ -332,6 +329,9 @@ std::optional<PreparedList> PreparedList::PreparedFileFromFilesDialog(
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
if (!isAlbum) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
using Info = FileMediaInformation;
|
using Info = FileMediaInformation;
|
||||||
|
|
||||||
const auto media = &file.information->media;
|
const auto media = &file.information->media;
|
||||||
|
|
|
||||||
|
|
@ -702,20 +702,20 @@ void Editor::showMenu() {
|
||||||
if (_menu) {
|
if (_menu) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
_menu.create(this);
|
_menu = base::make_unique_q<Ui::DropdownMenu>(this);
|
||||||
_menu->setHiddenCallback([weak = Ui::MakeWeak(this), menu = _menu.data()]{
|
_menu->setHiddenCallback([weak = Ui::MakeWeak(this), menu = _menu.get()]{
|
||||||
menu->deleteLater();
|
menu->deleteLater();
|
||||||
if (weak && weak->_menu == menu) {
|
if (weak && weak->_menu == menu) {
|
||||||
weak->_menu = nullptr;
|
weak->_menu = nullptr;
|
||||||
weak->_menuToggle->setForceRippled(false);
|
weak->_menuToggle->setForceRippled(false);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
_menu->setShowStartCallback(crl::guard(this, [this, menu = _menu.data()]{
|
_menu->setShowStartCallback(crl::guard(this, [this, menu = _menu.get()]{
|
||||||
if (_menu == menu) {
|
if (_menu == menu) {
|
||||||
_menuToggle->setForceRippled(true);
|
_menuToggle->setForceRippled(true);
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
_menu->setHideStartCallback(crl::guard(this, [this, menu = _menu.data()]{
|
_menu->setHideStartCallback(crl::guard(this, [this, menu = _menu.get()]{
|
||||||
if (_menu == menu) {
|
if (_menu == menu) {
|
||||||
_menuToggle->setForceRippled(false);
|
_menuToggle->setForceRippled(false);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -80,7 +80,7 @@ private:
|
||||||
QPointer<Inner> _inner;
|
QPointer<Inner> _inner;
|
||||||
object_ptr<Ui::CrossButton> _close;
|
object_ptr<Ui::CrossButton> _close;
|
||||||
object_ptr<Ui::IconButton> _menuToggle;
|
object_ptr<Ui::IconButton> _menuToggle;
|
||||||
object_ptr<Ui::DropdownMenu> _menu = { nullptr };
|
base::unique_qptr<Ui::DropdownMenu> _menu;
|
||||||
object_ptr<Ui::MultiSelect> _select;
|
object_ptr<Ui::MultiSelect> _select;
|
||||||
object_ptr<Ui::PlainShadow> _leftShadow;
|
object_ptr<Ui::PlainShadow> _leftShadow;
|
||||||
object_ptr<Ui::PlainShadow> _topShadow;
|
object_ptr<Ui::PlainShadow> _topShadow;
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
AppVersion 2001009
|
AppVersion 2001010
|
||||||
AppVersionStrMajor 2.1
|
AppVersionStrMajor 2.1
|
||||||
AppVersionStrSmall 2.1.9
|
AppVersionStrSmall 2.1.10
|
||||||
AppVersionStr 2.1.9
|
AppVersionStr 2.1.10
|
||||||
BetaChannel 1
|
BetaChannel 0
|
||||||
AlphaVersion 0
|
AlphaVersion 0
|
||||||
AppVersionOriginal 2.1.9.beta
|
AppVersionOriginal 2.1.10
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,9 @@
|
||||||
|
2.1.10 (05.06.20)
|
||||||
|
|
||||||
|
- Improve memory usage.
|
||||||
|
- Add support for full group message history export.
|
||||||
|
- Allow export of a single chat message history in JSON format.
|
||||||
|
|
||||||
2.1.9 beta (04.06.20)
|
2.1.9 beta (04.06.20)
|
||||||
|
|
||||||
- Several crash fixes.
|
- Several crash fixes.
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue