Handle repeated activation of native IV.

This commit is contained in:
John Preston
2026-05-13 14:51:43 +04:00
parent e0ea3e9925
commit eee2e5ce7f
5 changed files with 94 additions and 24 deletions
+21 -10
View File
@@ -1109,7 +1109,8 @@ private:
Markdown::MarkdownArticleContent content,
QString title,
QString initialFragment,
not_null<WebPageData*> page);
not_null<WebPageData*> page,
bool refresh);
[[nodiscard]] ShareBoxResult shareBox(ShareBoxDescriptor &&descriptor);
[[nodiscard]] std::shared_ptr<Markdown::MediaRuntime> createMediaRuntime(
not_null<WebPageData*> page) const;
@@ -1502,7 +1503,8 @@ void Shown::showWindowed(Prepared result, Source source, bool refresh) {
std::move(native.content),
std::move(result.name),
std::move(result.hash),
page);
page,
refresh);
}
void Shown::showHtmlWindowed(Prepared result, bool refresh) {
@@ -1525,20 +1527,29 @@ void Shown::showMarkdownWindowed(
Markdown::MarkdownArticleContent content,
QString title,
QString initialFragment,
not_null<WebPageData*> page) {
not_null<WebPageData*> page,
bool refresh) {
_controller = nullptr;
auto options = markdownOpenOptions(std::move(initialFragment), page);
if (_markdownController) {
_markdownController->update(
std::move(content),
std::move(title),
std::move(options));
} else {
if (!_markdownController) {
createMarkdownController(
std::move(content),
std::move(title),
std::move(initialFragment),
page);
_markdownController->activate();
return;
}
auto options = markdownOpenOptions(std::move(initialFragment), page);
if (refresh) {
_markdownController->update(
std::move(content),
std::move(title),
std::move(options));
} else {
_markdownController->show(
std::move(content),
std::move(title),
std::move(options));
}
}
@@ -294,6 +294,36 @@ void Controller::update(
MarkdownArticleContent content,
QString title,
OpenOptions options) {
setContent(
std::move(content),
std::move(title),
std::move(options),
true);
}
void Controller::show(
MarkdownArticleContent content,
QString title,
OpenOptions options) {
setContent(
std::move(content),
std::move(title),
std::move(options),
false);
activate();
}
void Controller::setContent(
MarkdownArticleContent content,
QString title,
OpenOptions options,
bool preserveScroll) {
const auto scrollTop = (preserveScroll && _preview)
? MarkdownPreviewScrollTop(_preview.get())
: 0;
if (preserveScroll) {
options.initialFragment = QString();
}
_preparedContent = std::move(content);
_title = std::move(title);
_options = PrepareOpenOptions(std::move(options), _delegate, _title);
@@ -307,6 +337,9 @@ void Controller::update(
}
refreshTitle();
createPreview();
if (preserveScroll && _preview) {
ScrollMarkdownPreviewToY(_preview.get(), scrollTop);
}
if (_window && _window->isActiveWindow() && _preview) {
_preview->setFocus();
}
@@ -418,10 +451,8 @@ void Controller::updateTitleGeometry(int newWidth) const {
- _menuToggle->width());
_subtitle->moveToLeft(st::ivSubtitleLeft, st::ivSubtitleTop);
_menuToggle->moveToRight(0, 0);
if (_titleShadow) {
_titleShadow->resizeToWidth(newWidth);
_titleShadow->move(0, st::ivSubtitleHeight);
}
_titleShadow->resizeToWidth(newWidth);
_titleShadow->move(0, st::ivSubtitleHeight);
}
void Controller::openSource() {
@@ -516,21 +547,16 @@ void Controller::createPreview() {
parent->sizeValue() | rpl::on_next([=](QSize size) {
_preview->resize(size);
}, _preview->lifetime());
if (_titleShadow) {
MarkdownPreviewScrollTopValue(
_preview.get()
) | rpl::on_next([=](int scrollTop) {
_titleShadow->toggle(
(scrollTop > 0),
anim::type::normal);
}, _preview->lifetime());
}
_titleShadow->show(anim::type::instant);
_preview->show();
}
void Controller::createWindow() {
_window = std::make_unique<Ui::RpWindow>();
const auto window = _window.get();
_titleShadow.create(window->body().get());
_subtitleWrap = std::make_unique<Ui::RpWidget>(window->body().get());
_subtitle = std::make_unique<Ui::FlatLabel>(
_subtitleWrap.get(),
@@ -570,7 +596,6 @@ void Controller::createWindow() {
_container->paintRequest() | rpl::on_next([=](QRect clip) {
QPainter(_container).fillRect(clip, st::windowBg);
}, _container->lifetime());
_titleShadow.create(window->body().get());
updateTitleGeometry(window->body()->width());
createLayerManager();
@@ -44,6 +44,10 @@ public:
~Controller();
void activate();
void show(
MarkdownArticleContent content,
QString title,
OpenOptions options = {});
void update(
MarkdownArticleContent content,
QString title,
@@ -65,6 +69,11 @@ private:
void createWindow();
void createLayerManager();
void createPreview();
void setContent(
MarkdownArticleContent content,
QString title,
OpenOptions options,
bool preserveScroll);
void updateTitleGeometry(int newWidth) const;
void showMenu();
void openSource();
@@ -168,6 +168,8 @@ public:
Fn<void(Event)> callback,
const OpenOptions &options);
bool scrollToAnchor(const QString &anchorId);
void scrollToY(int top);
[[nodiscard]] int scrollTop() const;
[[nodiscard]] rpl::producer<int> scrollTopValue() const;
private:
@@ -556,6 +558,16 @@ bool MarkdownPreviewRoot::scrollToAnchor(const QString &anchorId) {
return true;
}
void MarkdownPreviewRoot::scrollToY(int top) {
if (_scroll) {
_scroll->scrollToY(top);
}
}
int MarkdownPreviewRoot::scrollTop() const {
return _scroll ? _scroll->scrollTop() : 0;
}
rpl::producer<int> MarkdownPreviewRoot::scrollTopValue() const {
return _scroll
? _scroll->scrollTopValue()
@@ -569,6 +581,17 @@ bool ScrollMarkdownPreviewToAnchor(
return root ? root->scrollToAnchor(anchorId) : false;
}
void ScrollMarkdownPreviewToY(Ui::RpWidget *preview, int top) {
if (const auto root = dynamic_cast<MarkdownPreviewRoot*>(preview)) {
root->scrollToY(top);
}
}
int MarkdownPreviewScrollTop(Ui::RpWidget *preview) {
const auto root = dynamic_cast<MarkdownPreviewRoot*>(preview);
return root ? root->scrollTop() : 0;
}
rpl::producer<int> MarkdownPreviewScrollTopValue(Ui::RpWidget *preview) {
const auto root = dynamic_cast<MarkdownPreviewRoot*>(preview);
return root ? root->scrollTopValue() : rpl::single(0);
@@ -32,6 +32,8 @@ namespace Iv::Markdown {
bool ScrollMarkdownPreviewToAnchor(
Ui::RpWidget *preview,
const QString &anchorId);
void ScrollMarkdownPreviewToY(Ui::RpWidget *preview, int top);
[[nodiscard]] int MarkdownPreviewScrollTop(Ui::RpWidget *preview);
[[nodiscard]] rpl::producer<int> MarkdownPreviewScrollTopValue(
Ui::RpWidget *preview);