From 12ad1190ff44037b0f8518752e54167136917a33 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Mon, 1 Jun 2020 12:24:50 +0300 Subject: [PATCH] Added initial edit message header to scheduled section. --- .../view/history_view_compose_controls.cpp | 100 +++++++++++++++++- .../view/history_view_compose_controls.h | 7 ++ .../view/history_view_context_menu.cpp | 12 ++- .../history/view/history_view_list_widget.cpp | 8 ++ .../history/view/history_view_list_widget.h | 5 + .../view/history_view_scheduled_section.cpp | 5 + 6 files changed, 131 insertions(+), 6 deletions(-) diff --git a/Telegram/SourceFiles/history/view/history_view_compose_controls.cpp b/Telegram/SourceFiles/history/view/history_view_compose_controls.cpp index 58ae9df3d7..bf82a7bd24 100644 --- a/Telegram/SourceFiles/history/view/history_view_compose_controls.cpp +++ b/Telegram/SourceFiles/history/view/history_view_compose_controls.cpp @@ -15,6 +15,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "base/call_delayed.h" #include "base/qt_signal_producer.h" #include "history/history.h" +#include "main/main_session.h" #include "chat_helpers/tabbed_panel.h" #include "chat_helpers/tabbed_section.h" #include "chat_helpers/tabbed_selector.h" @@ -29,6 +30,82 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL namespace HistoryView { +class FieldHeader : public Ui::RpWidget { +public: + FieldHeader(QWidget *parent, not_null data); + + void editMessage(FullMsgId edit); + + bool isDisplayed() const; + bool isEditingMessage() const; + rpl::producer editMsgId() const; + +protected: + void paintEvent(QPaintEvent *e) override; + +private: + void updateControlsGeometry(QSize size); + + rpl::variable _editMsgId; + + const not_null _data; + const not_null _cancel; + +}; + +FieldHeader::FieldHeader(QWidget *parent, not_null data) +: RpWidget(parent) +, _data(data) +, _cancel(Ui::CreateChild(this, st::historyReplyCancel)) { + resize(QSize(parent->width(), st::historyReplyHeight)); + + sizeValue( + ) | rpl::start_with_next([=](QSize size) { + updateControlsGeometry(size); + }, lifetime()); + + _editMsgId.value( + ) | rpl::start_with_next([=] { + isDisplayed() ? show() : hide(); + }, lifetime()); +} + +void FieldHeader::paintEvent(QPaintEvent *e) { + Painter p(this); + + p.fillRect(rect(), st::historyComposeAreaBg); + + st::historyEditIcon.paint(p, st::historyReplyIconPosition, width()); + + p.setPen(st::historyReplyNameFg); + p.setFont(st::msgServiceNameFont); + p.drawTextLeft( + st::historyReplySkip, + st::msgReplyPadding.top(), + width(), + tr::lng_edit_message(tr::now)); +} + +bool FieldHeader::isDisplayed() const { + return isEditingMessage(); +} + +bool FieldHeader::isEditingMessage() const { + return !!_editMsgId.current(); +} + +void FieldHeader::updateControlsGeometry(QSize size) { + _cancel->moveToRight(0, 0); +} + +void FieldHeader::editMessage(FullMsgId id) { + _editMsgId = id; +} + +rpl::producer FieldHeader::editMsgId() const { + return _editMsgId.value(); +} + ComposeControls::ComposeControls( not_null parent, not_null window, @@ -49,7 +126,10 @@ ComposeControls::ComposeControls( _wrap.get(), st::historyComposeField, Ui::InputField::Mode::MultiLine, - tr::lng_message_ph())) { + tr::lng_message_ph())) +, _header(std::make_unique( + _wrap.get(), + &_window->session().data())) { init(); } @@ -199,6 +279,11 @@ void ComposeControls::init() { ) | rpl::start_with_next([=](QRect clip) { paintBackground(clip); }, _wrap->lifetime()); + + _header->editMsgId( + ) | rpl::start_with_next([=] { + updateHeight(); + }, _wrap->lifetime()); } void ComposeControls::initField() { @@ -312,6 +397,11 @@ void ComposeControls::updateControlsGeometry(QSize size) { left, size.height() - _field->height() - st::historySendPadding); + _header->resizeToWidth(size.width()); + _header->moveToLeft( + 0, + _field->y() - _header->height() - st::historySendPadding); + auto right = st::historySendRight; _send->moveToRight(right, buttonsTop); right += _send->width(); @@ -408,8 +498,14 @@ void ComposeControls::toggleTabbedSelectorMode() { } void ComposeControls::updateHeight() { - const auto height = _field->height() + 2 * st::historySendPadding; + const auto height = _field->height() + + (_header->isDisplayed() ? _header->height() : 0) + + 2 * st::historySendPadding; _wrap->resize(_wrap->width(), height); } +void ComposeControls::editMessage(FullMsgId edit) { + _header->editMessage(std::move(edit)); +} + } // namespace HistoryView diff --git a/Telegram/SourceFiles/history/view/history_view_compose_controls.h b/Telegram/SourceFiles/history/view/history_view_compose_controls.h index 239b7b1f33..9755c42e12 100644 --- a/Telegram/SourceFiles/history/view/history_view_compose_controls.h +++ b/Telegram/SourceFiles/history/view/history_view_compose_controls.h @@ -45,6 +45,8 @@ struct SectionShow; namespace HistoryView { +class FieldHeader; + class ComposeControls final { public: enum class Mode { @@ -90,6 +92,8 @@ public: void showStarted(); void showFinished(); + void editMessage(FullMsgId edit); + [[nodiscard]] TextWithTags getTextWithAppliedMarkdown() const; void clear(); void hidePanelsAnimated(); @@ -125,6 +129,9 @@ private: std::unique_ptr _inlineResults; std::unique_ptr _tabbedPanel; + friend class FieldHeader; + const std::unique_ptr _header; + rpl::event_stream<> _cancelRequests; rpl::event_stream> _fileChosen; rpl::event_stream> _photoChosen; diff --git a/Telegram/SourceFiles/history/view/history_view_context_menu.cpp b/Telegram/SourceFiles/history/view/history_view_context_menu.cpp index 48e4c552e0..5956005e72 100644 --- a/Telegram/SourceFiles/history/view/history_view_context_menu.cpp +++ b/Telegram/SourceFiles/history/view/history_view_context_menu.cpp @@ -477,11 +477,15 @@ bool AddEditMessageAction( if (!item) { return; } - if (!item->media() || !item->media()->allowsEditCaption()) { - return; + if (const auto media = item->media()) { + if (media->allowsEditCaption()) { + Ui::show(Box( + App::wnd()->sessionController(), + item)); + } + } else { + list->editMessageRequestNotify(item->fullId()); } - - Ui::show(Box(App::wnd()->sessionController(), item)); }); return true; } diff --git a/Telegram/SourceFiles/history/view/history_view_list_widget.cpp b/Telegram/SourceFiles/history/view/history_view_list_widget.cpp index d64e9c991d..8bae9ec5aa 100644 --- a/Telegram/SourceFiles/history/view/history_view_list_widget.cpp +++ b/Telegram/SourceFiles/history/view/history_view_list_widget.cpp @@ -2550,6 +2550,14 @@ QPoint ListWidget::mapPointToItem( return point - QPoint(0, itemTop(view)); } +rpl::producer ListWidget::editMessageRequested() const { + return _requestedToEditMessage.events(); +} + +void ListWidget::editMessageRequestNotify(FullMsgId item) { + _requestedToEditMessage.fire(std::move(item)); +} + ListWidget::~ListWidget() = default; } // namespace HistoryView diff --git a/Telegram/SourceFiles/history/view/history_view_list_widget.h b/Telegram/SourceFiles/history/view/history_view_list_widget.h index 3912f7ee1d..fbb1c56336 100644 --- a/Telegram/SourceFiles/history/view/history_view_list_widget.h +++ b/Telegram/SourceFiles/history/view/history_view_list_widget.h @@ -181,6 +181,9 @@ public: QPoint tooltipPos() const override; bool tooltipWindowActive() const override; + rpl::producer editMessageRequested() const; + void editMessageRequestNotify(FullMsgId item); + // ElementDelegate interface. Context elementContext() override; std::unique_ptr elementCreate( @@ -512,6 +515,8 @@ private: FullMsgId _highlightedMessageId; base::Timer _highlightTimer; + rpl::event_stream _requestedToEditMessage; + rpl::lifetime _viewerLifetime; }; diff --git a/Telegram/SourceFiles/history/view/history_view_scheduled_section.cpp b/Telegram/SourceFiles/history/view/history_view_scheduled_section.cpp index c4710aec60..9af4373563 100644 --- a/Telegram/SourceFiles/history/view/history_view_scheduled_section.cpp +++ b/Telegram/SourceFiles/history/view/history_view_scheduled_section.cpp @@ -130,6 +130,11 @@ ScheduledWidget::ScheduledWidget( _scroll->show(); connect(_scroll, &Ui::ScrollArea::scrolled, [=] { onScroll(); }); + _inner->editMessageRequested( + ) | rpl::start_with_next([=](auto id) { + _composeControls->editMessage(id); + }, _inner->lifetime()); + setupScrollDownButton(); setupComposeControls(); }