diff --git a/Telegram/SourceFiles/history/view/history_view_compose_controls.cpp b/Telegram/SourceFiles/history/view/history_view_compose_controls.cpp index 52080bfaad..33a683372e 100644 --- a/Telegram/SourceFiles/history/view/history_view_compose_controls.cpp +++ b/Telegram/SourceFiles/history/view/history_view_compose_controls.cpp @@ -493,6 +493,7 @@ ComposeControls::ComposeControls( , _window(window) , _mode(mode) , _wrap(std::make_unique(parent)) +, _writeRestricted(std::make_unique(parent)) , _send(Ui::CreateChild(_wrap.get())) , _attachToggle(Ui::CreateChild( _wrap.get(), @@ -534,6 +535,8 @@ void ComposeControls::setHistory(SetHistoryArgs &&args) { | rpl::then(std::move(args.slowmodeSecondsLeft)); _sendDisabledBySlowmode = rpl::single(false) | rpl::then(std::move(args.sendDisabledBySlowmode)); + _writeRestriction = rpl::single(std::optional()) + | rpl::then(std::move(args.writeRestriction)); const auto history = *args.history; if (_history == history) { return; @@ -546,19 +549,27 @@ void ComposeControls::setHistory(SetHistoryArgs &&args) { void ComposeControls::move(int x, int y) { _wrap->move(x, y); + _writeRestricted->move(x, y); } void ComposeControls::resizeToWidth(int width) { _wrap->resizeToWidth(width); + _writeRestricted->resizeToWidth(width); updateHeight(); } rpl::producer ComposeControls::height() const { - return _wrap->heightValue(); + using namespace rpl::mappers; + return rpl::conditional( + _writeRestriction.value() | rpl::map(!_1), + _wrap->heightValue(), + _writeRestricted->heightValue()); } int ComposeControls::heightCurrent() const { - return _wrap->height(); + return _writeRestriction.current() + ? _writeRestricted->height() + : _wrap->height(); } bool ComposeControls::focus() { @@ -773,6 +784,7 @@ void ComposeControls::init() { initField(); initTabbedSelector(); initSendButton(); + initWriteRestriction(); QObject::connect( ::Media::Capture::instance(), @@ -957,6 +969,18 @@ void ComposeControls::drawRecording(Painter &p, float64 recordActive) { p.drawText(left + (right - left - _recordCancelWidth) / 2, _attachToggle->y() + st::historyRecordTextTop + st::historyRecordFont->ascent, tr::lng_record_cancel(tr::now)); } +void ComposeControls::drawRestrictedWrite(Painter &p, const QString &error) { + p.fillRect(_writeRestricted->rect(), st::historyReplyBg); + + p.setFont(st::normalFont); + p.setPen(st::windowSubTextFg); + p.drawText( + _writeRestricted->rect().marginsRemoved( + QMargins(st::historySendPadding, 0, st::historySendPadding, 0)), + error, + style::al_center); +} + void ComposeControls::setTextFromEditingMessage(not_null item) { if (!_header->isEditingMessage()) { return; @@ -1050,6 +1074,25 @@ void ComposeControls::initSendButton() { _send->finishAnimating(); } +void ComposeControls::initWriteRestriction() { + _writeRestricted->resize( + _writeRestricted->width(), + st::historyUnblock.height); + _writeRestricted->paintRequest( + ) | rpl::start_with_next([=] { + if (const auto error = _writeRestriction.current()) { + auto p = Painter(_writeRestricted.get()); + drawRestrictedWrite(p, *error); + } + }, _wrap->lifetime()); + + _writeRestriction.value( + ) | rpl::start_with_next([=](const std::optional &error) { + _writeRestricted->setVisible(error.has_value()); + _wrap->setVisible(!error.has_value()); + }, _wrap->lifetime()); +} + void ComposeControls::updateSendButtonType() { using Type = Ui::SendButton::Type; const auto type = [&] { @@ -1143,8 +1186,6 @@ void ComposeControls::paintBackground(QRect clip) { if (!_send->isHidden() && _recording) { drawRecording(p, _send->recordActiveRatio()); } - //} else if (const auto error = writeRestriction()) { - // drawRestrictedWrite(p, *error); } } @@ -1414,7 +1455,6 @@ void ComposeControls::initWebpageProcess() { title->events(), description->events(), pageData->events()); - } WebPageId ComposeControls::webPageId() const { diff --git a/Telegram/SourceFiles/history/view/history_view_compose_controls.h b/Telegram/SourceFiles/history/view/history_view_compose_controls.h index 61c4ce1f53..4c1167e3a5 100644 --- a/Telegram/SourceFiles/history/view/history_view_compose_controls.h +++ b/Telegram/SourceFiles/history/view/history_view_compose_controls.h @@ -94,6 +94,7 @@ public: Fn showSlowmodeError; rpl::producer slowmodeSecondsLeft; rpl::producer sendDisabledBySlowmode; + rpl::producer> writeRestriction; }; void setHistory(SetHistoryArgs &&args); void finishAnimating(); @@ -159,6 +160,7 @@ private: void initTabbedSelector(); void initSendButton(); void initWebpageProcess(); + void initWriteRestriction(); void updateSendButtonType(); void updateHeight(); void updateControlsVisibility(); @@ -187,6 +189,7 @@ private: bool showRecordButton() const; void drawRecording(Painter &p, float64 recordActive); + void drawRestrictedWrite(Painter &p, const QString &error); void updateOverStates(QPoint pos); const not_null _parent; @@ -195,9 +198,11 @@ private: Fn _showSlowmodeError; rpl::variable _slowmodeSecondsLeft; rpl::variable _sendDisabledBySlowmode; + rpl::variable> _writeRestriction; Mode _mode = Mode::Normal; const std::unique_ptr _wrap; + const std::unique_ptr _writeRestricted; const not_null _send; const not_null _attachToggle; diff --git a/Telegram/SourceFiles/history/view/history_view_replies_section.cpp b/Telegram/SourceFiles/history/view/history_view_replies_section.cpp index d6c347edb9..c2571a98a8 100644 --- a/Telegram/SourceFiles/history/view/history_view_replies_section.cpp +++ b/Telegram/SourceFiles/history/view/history_view_replies_section.cpp @@ -440,11 +440,21 @@ void RepliesWidget::setupComposeControls() { std::move(hasSendingMessage), _1 && _2); + auto writeRestriction = session().changes().peerFlagsValue( + _history->peer, + Data::PeerUpdate::Flag::Rights + ) | rpl::map([=] { + return Data::RestrictionError( + _history->peer, + ChatRestriction::f_send_messages); + }); + _composeControls->setHistory({ .history = _history.get(), .showSlowmodeError = [=] { return showSlowmodeError(); }, .slowmodeSecondsLeft = std::move(slowmodeSecondsLeft), .sendDisabledBySlowmode = std::move(sendDisabledBySlowmode), + .writeRestriction = std::move(writeRestriction), }); _composeControls->height( @@ -761,6 +771,12 @@ bool RepliesWidget::showSlowmodeError() { return true; } +std::optional RepliesWidget::writeRestriction() const { + return Data::RestrictionError( + _history->peer, + ChatRestriction::f_send_messages); +} + void RepliesWidget::uploadFilesAfterConfirmation( Storage::PreparedList &&list, SendMediaType type, diff --git a/Telegram/SourceFiles/history/view/history_view_replies_section.h b/Telegram/SourceFiles/history/view/history_view_replies_section.h index 3df08c90bf..88d6d2aab0 100644 --- a/Telegram/SourceFiles/history/view/history_view_replies_section.h +++ b/Telegram/SourceFiles/history/view/history_view_replies_section.h @@ -235,6 +235,7 @@ private: Api::SendOptions options); [[nodiscard]] bool showSlowmodeError(); + [[nodiscard]] std::optional writeRestriction() const; const not_null _history; const MsgId _rootId = 0;