diff --git a/Telegram/SourceFiles/history/history_inner_widget.cpp b/Telegram/SourceFiles/history/history_inner_widget.cpp index 0d2c3e520b..20a147fca7 100644 --- a/Telegram/SourceFiles/history/history_inner_widget.cpp +++ b/Telegram/SourceFiles/history/history_inner_widget.cpp @@ -810,7 +810,7 @@ bool HistoryInner::canHaveFromUserpics() const { } else if (const auto channel = _peer->asBroadcast()) { return channel->signatureProfiles(); } - return !_removeFromUserpics; + return _isChatWide || !_removeFromUserpics; } void HistoryInner::toggleRemoveFromUserpics(bool remove) { diff --git a/Telegram/SourceFiles/history/history_widget.cpp b/Telegram/SourceFiles/history/history_widget.cpp index 2d883e5704..397b8bdc88 100644 --- a/Telegram/SourceFiles/history/history_widget.cpp +++ b/Telegram/SourceFiles/history/history_widget.cpp @@ -6474,7 +6474,7 @@ void HistoryWidget::updateControlsGeometry() { _topBars->resize( innerWidth, scrollAreaTop - _topBars->y() + st::lineWidth); - if (_scroll->y() != scrollAreaTop) { + if (_scroll->y() != scrollAreaTop || _scroll->x() != tabsLeftSkip) { _scroll->moveToLeft(tabsLeftSkip, scrollAreaTop); if (_autocomplete) { _autocomplete->setBoundings(_scroll->geometry()); @@ -8301,6 +8301,7 @@ void HistoryWidget::validateSubsectionTabs() { updateControlsGeometry(); orderWidgets(); }, _subsectionTabsLifetime); + _list->toggleRemoveFromUserpics(_subsectionTabs->leftSkip() > 0); updateControlsGeometry(); orderWidgets(); } diff --git a/Telegram/SourceFiles/history/view/history_view_chat_section.cpp b/Telegram/SourceFiles/history/view/history_view_chat_section.cpp index ec2049dbb1..9c3c948da9 100644 --- a/Telegram/SourceFiles/history/view/history_view_chat_section.cpp +++ b/Telegram/SourceFiles/history/view/history_view_chat_section.cpp @@ -1590,6 +1590,9 @@ void ChatWidget::validateSubsectionTabs() { updateControlsGeometry(); orderWidgets(); }, _subsectionTabsLifetime); + _inner->overrideChatMode((_subsectionTabs->leftSkip() > 0) + ? ElementChatMode::Narrow + : std::optional()); updateControlsGeometry(); orderWidgets(); } diff --git a/Telegram/SourceFiles/history/view/history_view_subsection_tabs.cpp b/Telegram/SourceFiles/history/view/history_view_subsection_tabs.cpp index 66790e7051..73fb100f1f 100644 --- a/Telegram/SourceFiles/history/view/history_view_subsection_tabs.cpp +++ b/Telegram/SourceFiles/history/view/history_view_subsection_tabs.cpp @@ -21,6 +21,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "history/history.h" #include "lang/lang_keys.h" #include "main/main_session.h" +#include "main/main_session_settings.h" #include "ui/controls/subsection_tabs_slider.h" #include "ui/effects/ripple_animation.h" #include "ui/widgets/menu/menu_add_action_callback_factory.h" @@ -56,7 +57,7 @@ SubsectionTabs::SubsectionTabs( , _afterLimit(kDefaultLimit) { track(); refreshSlice(); - setupHorizontal(parent); + setup(parent); dataChanged() | rpl::start_with_next([=] { if (_loading) { @@ -72,6 +73,15 @@ SubsectionTabs::~SubsectionTabs() { delete base::take(_shadow); } +void SubsectionTabs::setup(not_null parent) { + const auto peerId = _history->peer->id; + if (session().settings().verticalSubsectionTabs(peerId)) { + setupVertical(parent); + } else { + setupHorizontal(parent); + } +} + void SubsectionTabs::setupHorizontal(not_null parent) { delete base::take(_vertical); _horizontal = Ui::CreateChild(parent); @@ -397,7 +407,7 @@ void SubsectionTabs::setupSlider( slider->setSections({ .tabs = std::move(sections), .context = Core::TextContext({ - .session = &_history->session(), + .session = &session(), }), }, paused); slider->setActiveSectionFast(activeIndex); @@ -466,6 +476,11 @@ void SubsectionTabs::toggleModes() { } else { setupHorizontal(_vertical->parentWidget()); } + const auto peerId = _history->peer->id; + const auto vertical = (_vertical != nullptr); + session().settings().setVerticalSubsectionTabs(peerId, vertical); + session().saveSettingsDelayed(); + _layoutRequests.fire({}); } @@ -703,6 +718,10 @@ void SubsectionTabs::scheduleRefresh() { }); } +Main::Session &SubsectionTabs::session() { + return _history->session(); +} + bool SubsectionTabs::switchTo( not_null thread, not_null parent) { diff --git a/Telegram/SourceFiles/history/view/history_view_subsection_tabs.h b/Telegram/SourceFiles/history/view/history_view_subsection_tabs.h index 200afe3b35..15cf7c6d75 100644 --- a/Telegram/SourceFiles/history/view/history_view_subsection_tabs.h +++ b/Telegram/SourceFiles/history/view/history_view_subsection_tabs.h @@ -16,6 +16,10 @@ namespace Data { class Thread; } // namespace Data +namespace Main { +class Session; +} // namespace Main + namespace Window { class SessionController; } // namespace Window @@ -37,6 +41,8 @@ public: not_null thread); ~SubsectionTabs(); + [[nodiscard]] Main::Session &session(); + [[nodiscard]] bool switchTo( not_null thread, not_null parent); @@ -79,6 +85,7 @@ private: void refreshSlice(); void scheduleRefresh(); void loadMore(); + void setup(not_null parent); [[nodiscard]] rpl::producer<> dataChanged() const; void setupSlider( diff --git a/Telegram/SourceFiles/main/main_session_settings.cpp b/Telegram/SourceFiles/main/main_session_settings.cpp index 88f60b5af8..7f562e3e48 100644 --- a/Telegram/SourceFiles/main/main_session_settings.cpp +++ b/Telegram/SourceFiles/main/main_session_settings.cpp @@ -42,7 +42,9 @@ QByteArray SessionSettings::serialize() const { + sizeof(qint32) * 3 + _groupEmojiSectionHidden.size() * sizeof(quint64) + sizeof(qint32) * 3 - + _hiddenPinnedMessages.size() * (sizeof(quint64) * 4); + + _hiddenPinnedMessages.size() * (sizeof(quint64) * 4) + + sizeof(qint32) + + _verticalSubsectionTabs.size() * sizeof(quint64); auto result = QByteArray(); result.reserve(size); @@ -94,6 +96,10 @@ QByteArray SessionSettings::serialize() const { << SerializePeerId(key.monoforumPeerId) << qint64(value.bare); } + stream << qint32(_verticalSubsectionTabs.size()); + for (const auto &peerId : _verticalSubsectionTabs) { + stream << SerializePeerId(peerId); + } } Ensures(result.size() == size); @@ -153,6 +159,7 @@ void SessionSettings::addFromSerialized(const QByteArray &serialized) { std::vector appDictionariesEnabled; qint32 appAutoDownloadDictionaries = app.autoDownloadDictionaries() ? 1 : 0; base::flat_map hiddenPinnedMessages; + base::flat_set verticalSubsectionTabs; qint32 dialogsFiltersEnabled = _dialogsFiltersEnabled ? 1 : 0; qint32 supportAllSilent = _supportAllSilent ? 1 : 0; qint32 photoEditorHintShowsCount = _photoEditorHintShowsCount; @@ -466,6 +473,22 @@ void SessionSettings::addFromSerialized(const QByteArray &serialized) { } } } + if (!stream.atEnd()) { + auto count = qint32(0); + stream >> count; + if (stream.status() == QDataStream::Ok) { + for (auto i = 0; i != count; ++i) { + auto peerId = quint64(); + stream >> peerId; + if (stream.status() != QDataStream::Ok) { + LOG(("App Error: " + "Bad data for SessionSettings::addFromSerialized()")); + return; + } + verticalSubsectionTabs.emplace(DeserializePeerId(peerId)); + } + } + } if (stream.status() != QDataStream::Ok) { LOG(("App Error: " "Bad data for SessionSettings::addFromSerialized()")); @@ -512,6 +535,7 @@ void SessionSettings::addFromSerialized(const QByteArray &serialized) { _mutePeriods = std::move(mutePeriods); _lastNonPremiumLimitDownload = lastNonPremiumLimitDownload; _lastNonPremiumLimitUpload = lastNonPremiumLimitUpload; + _verticalSubsectionTabs = std::move(verticalSubsectionTabs); if (version < 2) { app.setLastSeenWarningSeen(appLastSeenWarningSeen == 1); @@ -646,6 +670,20 @@ void SessionSettings::setHiddenPinnedMessageId( } } +bool SessionSettings::verticalSubsectionTabs(PeerId peerId) const { + return _verticalSubsectionTabs.contains(peerId); +} + +void SessionSettings::setVerticalSubsectionTabs( + PeerId peerId, + bool vertical) { + if (vertical) { + _verticalSubsectionTabs.emplace(peerId); + } else { + _verticalSubsectionTabs.remove(peerId); + } +} + bool SessionSettings::photoEditorHintShown() const { return _photoEditorHintShowsCount < kPhotoEditorHintMaxShowsCount; } diff --git a/Telegram/SourceFiles/main/main_session_settings.h b/Telegram/SourceFiles/main/main_session_settings.h index b88244aaa3..ee6218e69a 100644 --- a/Telegram/SourceFiles/main/main_session_settings.h +++ b/Telegram/SourceFiles/main/main_session_settings.h @@ -118,6 +118,9 @@ public: PeerId monoforumPeerId, MsgId msgId); + [[nodiscard]] bool verticalSubsectionTabs(PeerId peerId) const; + void setVerticalSubsectionTabs(PeerId peerId, bool vertical); + [[nodiscard]] bool dialogsFiltersEnabled() const { return _dialogsFiltersEnabled; } @@ -167,6 +170,7 @@ private: rpl::variable _archiveInMainMenu = false; rpl::variable _skipArchiveInSearch = false; base::flat_map _hiddenPinnedMessages; + base::flat_set _verticalSubsectionTabs; bool _dialogsFiltersEnabled = false; int _photoEditorHintShowsCount = 0; std::vector _mutePeriods;