From 40fc7379bc1c81a7e6e0ddf805a83f0dc6d1530e Mon Sep 17 00:00:00 2001 From: John Preston Date: Wed, 19 Oct 2016 11:59:19 +0300 Subject: [PATCH] Fixed several bugs appearing on logout-login in player and messages. --- Telegram/SourceFiles/app.cpp | 2 +- .../SourceFiles/boxes/notifications_box.cpp | 3 +++ Telegram/SourceFiles/core/utils.h | 7 +++---- Telegram/SourceFiles/historywidget.cpp | 3 +++ .../media/player/media_player_cover.cpp | 3 +++ .../media/player/media_player_instance.cpp | 17 +++++++++++++++++ .../media/player/media_player_instance.h | 3 +++ .../media/player/media_player_list.cpp | 3 ++- .../media/player/media_player_widget.cpp | 3 +++ 9 files changed, 38 insertions(+), 6 deletions(-) diff --git a/Telegram/SourceFiles/app.cpp b/Telegram/SourceFiles/app.cpp index 63a865738..902b3a85a 100644 --- a/Telegram/SourceFiles/app.cpp +++ b/Telegram/SourceFiles/app.cpp @@ -2927,8 +2927,8 @@ namespace { if (App::main()) { App::main()->updateScrollColors(); - HistoryLayout::serviceColorsUpdated(); } + HistoryLayout::serviceColorsUpdated(); } const style::color &msgServiceBg() { diff --git a/Telegram/SourceFiles/boxes/notifications_box.cpp b/Telegram/SourceFiles/boxes/notifications_box.cpp index 172e2b67f..98e9a4fe6 100644 --- a/Telegram/SourceFiles/boxes/notifications_box.cpp +++ b/Telegram/SourceFiles/boxes/notifications_box.cpp @@ -161,6 +161,7 @@ void NotificationsBox::paintEvent(QPaintEvent *e) { p.drawPixmapLeft(sampleLeft, sampleTop, width(), _notificationSampleSmall); sampleTop += (isTop ? 1 : -1) * (st::notificationSampleSize.height() + st::notificationsSampleMargin); } + p.setOpacity(1.); } else { p.setOpacity(st::notificationSampleOpacity); p.drawPixmapLeft(sampleLeft, sampleTop, width(), _notificationSampleSmall); @@ -169,6 +170,8 @@ void NotificationsBox::paintEvent(QPaintEvent *e) { } auto labelTop = screenRect.y() + screenRect.height() + st::notificationsBoxCountLabelTop; + p.setFont(st::boxTitleFont); + p.setPen(st::boxTitleFg); p.drawTextLeft(contentLeft, labelTop, width(), lang(lng_settings_notifications_count)); } diff --git a/Telegram/SourceFiles/core/utils.h b/Telegram/SourceFiles/core/utils.h index f1b049480..f14625ddf 100644 --- a/Telegram/SourceFiles/core/utils.h +++ b/Telegram/SourceFiles/core/utils.h @@ -30,10 +30,9 @@ inline constexpr size_t array_size(T(&)[N]) { } template -inline T take(T &source) { - T result = T(); - std_::swap_moveable(result, source); - return std_::move(result); +inline T take(T &source, T &&new_value = T()) { + std_::swap_moveable(new_value, source); + return std_::move(new_value); } } // namespace base diff --git a/Telegram/SourceFiles/historywidget.cpp b/Telegram/SourceFiles/historywidget.cpp index cfc2b8b23..b914f3847 100644 --- a/Telegram/SourceFiles/historywidget.cpp +++ b/Telegram/SourceFiles/historywidget.cpp @@ -975,6 +975,9 @@ void HistoryInner::itemRemoved(HistoryItem *item) { if (_history != item->history() && _migrated != item->history()) { return; } + if (!App::main()) { + return; + } auto i = _selected.find(item); if (i != _selected.cend()) { diff --git a/Telegram/SourceFiles/media/player/media_player_cover.cpp b/Telegram/SourceFiles/media/player/media_player_cover.cpp index 6544a31ef..b2e252b1f 100644 --- a/Telegram/SourceFiles/media/player/media_player_cover.cpp +++ b/Telegram/SourceFiles/media/player/media_player_cover.cpp @@ -312,6 +312,9 @@ void CoverWidget::updateTimeLabel() { void CoverWidget::handleSongChange() { auto ¤t = instance()->current(); auto song = current.audio()->song(); + if (!song) { + return; + } TextWithEntities textWithEntities; if (song->performer.isEmpty()) { diff --git a/Telegram/SourceFiles/media/player/media_player_instance.cpp b/Telegram/SourceFiles/media/player/media_player_instance.cpp index ae5692799..47c9561ec 100644 --- a/Telegram/SourceFiles/media/player/media_player_instance.cpp +++ b/Telegram/SourceFiles/media/player/media_player_instance.cpp @@ -59,6 +59,11 @@ Instance::Instance() { subscribe(Notify::PeerUpdated(), Notify::PeerUpdatedHandler(observeEvents, [this](const Notify::PeerUpdate &update) { notifyPeerUpdated(update); })); + subscribe(Global::RefSelfChanged(), [this] { + if (!App::self()) { + handleLogout(); + } + }); } void Instance::notifyPeerUpdated(const Notify::PeerUpdate &update) { @@ -297,5 +302,17 @@ void Instance::preloadNext() { } } +void Instance::handleLogout() { + _current = _seeking = AudioMsgId(); + _history = nullptr; + _migrated = nullptr; + + _repeatEnabled = _isPlaying = false; + + _playlist.clear(); + + _usePanelPlayer.notify(false, true); +} + } // namespace Player } // namespace Media diff --git a/Telegram/SourceFiles/media/player/media_player_instance.h b/Telegram/SourceFiles/media/player/media_player_instance.h index 9891e34fc..fa0dc9fbf 100644 --- a/Telegram/SourceFiles/media/player/media_player_instance.h +++ b/Telegram/SourceFiles/media/player/media_player_instance.h @@ -105,6 +105,8 @@ public: void documentLoadProgress(DocumentData *document); + void clear(); + private: Instance(); friend void start(); @@ -117,6 +119,7 @@ private: void rebuildPlaylist(); void moveInPlaylist(int delta); void preloadNext(); + void handleLogout(); template void emitUpdate(CheckCallback check); diff --git a/Telegram/SourceFiles/media/player/media_player_list.cpp b/Telegram/SourceFiles/media/player/media_player_list.cpp index 522ce7e41..daeba189e 100644 --- a/Telegram/SourceFiles/media/player/media_player_list.cpp +++ b/Telegram/SourceFiles/media/player/media_player_list.cpp @@ -161,9 +161,10 @@ QRect ListWidget::getCurrentTrackGeometry() const { if (exists()) { auto top = marginTop(); auto current = instance()->current(); + auto fullMsgId = current.contextId(); for_const (auto layout, _list) { auto layoutHeight = layout->height(); - if (layout->getItem()->fullId() == current.contextId()) { + if (layout->getItem()->fullId() == fullMsgId) { return QRect(0, top, width(), layoutHeight); } top += layoutHeight; diff --git a/Telegram/SourceFiles/media/player/media_player_widget.cpp b/Telegram/SourceFiles/media/player/media_player_widget.cpp index 6b5e28ed6..e9fded51f 100644 --- a/Telegram/SourceFiles/media/player/media_player_widget.cpp +++ b/Telegram/SourceFiles/media/player/media_player_widget.cpp @@ -367,6 +367,9 @@ void Widget::updateTimeLabel() { void Widget::handleSongChange() { auto ¤t = instance()->current(); auto song = current.audio()->song(); + if (!song) { + return; + } TextWithEntities textWithEntities; if (song->performer.isEmpty()) {