From f93c2bb5e5393c074b56c4f571d7d4800891b776 Mon Sep 17 00:00:00 2001 From: John Preston Date: Tue, 8 Feb 2022 11:05:52 +0300 Subject: [PATCH 001/635] Always convert to ARGB before rounding. --- ui/image/image_prepare.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ui/image/image_prepare.cpp b/ui/image/image_prepare.cpp index da8bc33..83900f5 100644 --- a/ui/image/image_prepare.cpp +++ b/ui/image/image_prepare.cpp @@ -1011,6 +1011,10 @@ QImage Round( return std::move(image); } + image = std::move(image).convertToFormat( + QImage::Format_ARGB32_Premultiplied); + Assert(!image.isNull()); + // We need to detach image first (if it is shared), before we // count some offsets using QImage::bytesPerLine etc, because // bytesPerLine may change on detach, this leads to crashes: @@ -1068,10 +1072,6 @@ QImage Round( } Assert(!image.isNull()); - image = std::move(image).convertToFormat( - QImage::Format_ARGB32_Premultiplied); - Assert(!image.isNull()); - const auto masks = CornersMask(radius); return Round(std::move(image), masks, corners, target); } From 681da392eb0523e87f9c1e9b3c732757e0c18850 Mon Sep 17 00:00:00 2001 From: John Preston Date: Mon, 7 Feb 2022 17:46:24 +0300 Subject: [PATCH 002/635] Improve box rounding and buttons. --- ui/layers/box_layer_widget.cpp | 13 ++++++++++--- ui/layers/layer_widget.cpp | 2 +- ui/layers/layers.style | 28 ++++++++++++++-------------- ui/widgets/widgets.style | 4 ++-- 4 files changed, 27 insertions(+), 20 deletions(-) diff --git a/ui/layers/box_layer_widget.cpp b/ui/layers/box_layer_widget.cpp index cd2b494..96ba72b 100644 --- a/ui/layers/box_layer_widget.cpp +++ b/ui/layers/box_layer_widget.cpp @@ -42,7 +42,7 @@ BoxLayerWidget::BoxLayerWidget( : LayerWidget(layer) , _layer(layer) , _content(std::move(content)) -, _roundRect(ImageRoundRadius::Small, st().bg) { +, _roundRect(st::boxRadius, st().bg) { _content->setParent(this); _content->setDelegate(this); @@ -270,6 +270,7 @@ QPointer BoxLayerWidget::addButton( const style::RoundButton &st) { _buttons.emplace_back(this, std::move(text), st); auto result = QPointer(_buttons.back()); + result->setTextTransform(RoundButton::TextTransform::NoTransform); result->setClickedCallback(std::move(clickCallback)); result->show(); result->widthValue( @@ -285,6 +286,7 @@ QPointer BoxLayerWidget::addLeftButton( const style::RoundButton &st) { _leftButton = object_ptr(this, std::move(text), st); auto result = QPointer(_leftButton); + result->setTextTransform(RoundButton::TextTransform::NoTransform); result->setClickedCallback(std::move(clickCallback)); result->show(); result->widthValue( @@ -377,14 +379,19 @@ int BoxLayerWidget::countFullHeight() const { } int BoxLayerWidget::contentTop() const { - return hasTitle() ? titleHeight() : (_noContentMargin ? 0 : st::boxTopMargin); + return hasTitle() + ? titleHeight() + : _noContentMargin + ? + 0 + : st::boxTopMargin; } void BoxLayerWidget::resizeEvent(QResizeEvent *e) { updateButtonsPositions(); updateTitlePosition(); - auto top = contentTop(); + const auto top = contentTop(); _content->resize(width(), height() - top - buttonsHeight()); _content->moveToLeft(0, top); diff --git a/ui/layers/layer_widget.cpp b/ui/layers/layer_widget.cpp index 7d8722c..2b5731d 100644 --- a/ui/layers/layer_widget.cpp +++ b/ui/layers/layer_widget.cpp @@ -86,7 +86,7 @@ private: LayerStackWidget::BackgroundWidget::BackgroundWidget(QWidget *parent) : TWidget(parent) -, _roundRect(ImageRoundRadius::Small, st::boxBg) { +, _roundRect(st::boxRadius, st::boxBg) { } void LayerStackWidget::BackgroundWidget::setCacheImages( diff --git a/ui/layers/layers.style b/ui/layers/layers.style index fcdb708..84317e6 100644 --- a/ui/layers/layers.style +++ b/ui/layers/layers.style @@ -32,13 +32,14 @@ Box { } boxDuration: 200; -boxRadius: 3px; +boxRadius: 8px; boxButtonFont: font(boxFontSize semibold); defaultBoxButton: RoundButton(defaultLightButton) { - width: -24px; - height: 36px; - font: boxButtonFont; + width: -30px; + height: 34px; + textTop: 7px; + font: font(14px semibold); } boxLabelStyle: TextStyle(boxTextStyle) { @@ -74,25 +75,25 @@ boxRoundShadow: Shadow { fallback: windowShadowFgFallback; } -boxTitleFont: font(17px semibold); +boxTitleFont: font(16px semibold); boxTitle: FlatLabel(defaultFlatLabel) { textFg: boxTitleFg; maxHeight: 24px; style: TextStyle(defaultTextStyle) { font: boxTitleFont; linkFont: boxTitleFont; - linkFontOver: font(17px semibold underline); + linkFontOver: font(16px semibold underline); } } -boxTitlePosition: point(22px, 16px); -boxTitleHeight: 56px; +boxTitlePosition: point(24px, 18px); +boxTitleHeight: 48px; boxTitleAdditionalSkip: 9px; boxTitleAdditionalFont: normalFont; boxScroll: defaultSolidScroll; -boxRowPadding: margins(22px, 0px, 22px, 0px); +boxRowPadding: margins(24px, 0px, 24px, 0px); -boxTopMargin: 6px; +boxTopMargin: 8px; boxTitleClose: IconButton(defaultIconButton) { width: boxTitleHeight; @@ -119,14 +120,14 @@ boxOptionInputSkip: 6px; boxWidth: 320px; boxWideWidth: 364px; -boxPadding: margins(22px, 30px, 22px, 8px); +boxPadding: margins(24px, 30px, 24px, 8px); boxMaxListHeight: 492px; boxLittleSkip: 10px; boxMediumSkip: 20px; defaultBox: Box { - buttonPadding: margins(8px, 12px, 13px, 12px); - buttonHeight: 36px; + buttonPadding: margins(6px, 10px, 10px, 10px); + buttonHeight: 34px; button: defaultBoxButton; margin: margins(0px, 10px, 0px, 10px); bg: boxBg; @@ -134,7 +135,6 @@ defaultBox: Box { titleAdditionalFg: boxTitleAdditionalFg; } layerBox: Box(defaultBox) { - buttonPadding: margins(8px, 8px, 8px, 8px); } boxLabel: FlatLabel(defaultFlatLabel) { minWidth: 274px; diff --git a/ui/widgets/widgets.style b/ui/widgets/widgets.style index 3ec601c..f9fb12e 100644 --- a/ui/widgets/widgets.style +++ b/ui/widgets/widgets.style @@ -878,7 +878,7 @@ defaultPopupMenu: PopupMenu { defaultInputField: InputField { textBg: windowBg; textFg: windowFg; - textMargins: margins(0px, 26px, 0px, 4px); + textMargins: margins(0px, 28px, 0px, 4px); textAlign: align(topleft); placeholderFg: windowSubTextFg; @@ -901,7 +901,7 @@ defaultInputField: InputField { font: boxTextFont; menu: defaultPopupMenu; - heightMin: 52px; + heightMin: 55px; heightMax: 148px; } From 6685a1565eb19f6c434d72f5bf1147c14e98ac2c Mon Sep 17 00:00:00 2001 From: John Preston Date: Tue, 8 Feb 2022 20:17:56 +0300 Subject: [PATCH 003/635] Allow rounding radius in InfoTopBar style. --- ui/widgets/widgets.style | 1 + 1 file changed, 1 insertion(+) diff --git a/ui/widgets/widgets.style b/ui/widgets/widgets.style index f9fb12e..130102e 100644 --- a/ui/widgets/widgets.style +++ b/ui/widgets/widgets.style @@ -1319,6 +1319,7 @@ InfoTopBar { searchRow: SearchFieldRow; highlightBg: color; highlightDuration: int; + radius: pixels; } LevelMeter { From b011d9fcb2a683f73bfad07c23ec3c9f364434fa Mon Sep 17 00:00:00 2001 From: John Preston Date: Wed, 9 Feb 2022 13:39:54 +0300 Subject: [PATCH 004/635] Add new palette colors for colored icons. --- ui/colors.palette | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/ui/colors.palette b/ui/colors.palette index d78cf94..3b534c1 100644 --- a/ui/colors.palette +++ b/ui/colors.palette @@ -309,6 +309,16 @@ historyPeerUserpicFg: windowFgActive; // default userpic initials historyPeerSavedMessagesBg: historyPeer4UserpicBg; // saved messages userpic background historyPeerArchiveUserpicBg: dialogsUnreadBgMuted; // archive folder userpic background +settingsIconBg1: #f06964 | historyPeer1UserpicBg; // red settings icon background +settingsIconBg2: #6dc534 | historyPeer2UserpicBg; // green settings icon background +settingsIconBg3: #ed9f20 | historyPeer3UserpicBg; // light-orange settings icon background +settingsIconBg4: #56b3f5 | historyPeer4UserpicBg; // light-blue settings icon background +settingsIconBg5: #7595ff | historyPeer5UserpicBg; // dark-blue settings icon background +settingsIconBg6: #b580e2 | historyPeer6UserpicBg; // purple settings icon background +settingsIconBg8: #f2925b | historyPeer8UserpicBg; // dark-orange settings icon background +settingsIconBgArchive: #9da2b0 | historyPeerArchiveUserpicBg; // archive main menu icon background +settingsIconFg: #ffffff | historyPeerUserpicFg; // settings icon shape + // Some values are marked as (adjusted), it means they're adjusted by // hue and saturation of the average background color if user chooses // some other (not bundled to this color theme) background. If the From 93ba307071358d547ef0f53a7aafae119b083802 Mon Sep 17 00:00:00 2001 From: John Preston Date: Wed, 9 Feb 2022 13:40:17 +0300 Subject: [PATCH 005/635] Track icon offset inside SettingsButton style. --- ui/widgets/widgets.style | 1 + 1 file changed, 1 insertion(+) diff --git a/ui/widgets/widgets.style b/ui/widgets/widgets.style index 130102e..2ae207b 100644 --- a/ui/widgets/widgets.style +++ b/ui/widgets/widgets.style @@ -525,6 +525,7 @@ SettingsButton { height: pixels; padding: margins; + iconLeft: pixels; toggle: Toggle; toggleOver: Toggle; From c1f44ca8c739cd7183c1e85eb1b7a62f1ada12d6 Mon Sep 17 00:00:00 2001 From: John Preston Date: Wed, 9 Feb 2022 13:40:31 +0300 Subject: [PATCH 006/635] Round SettingsSlider by 1px. --- ui/widgets/widgets.style | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ui/widgets/widgets.style b/ui/widgets/widgets.style index 2ae207b..8e236b8 100644 --- a/ui/widgets/widgets.style +++ b/ui/widgets/widgets.style @@ -1005,6 +1005,7 @@ SettingsSlider { barTop: pixels; barSkip: pixels; barStroke: pixels; + barRadius: pixels; barFg: color; barFgActive: color; labelTop: pixels; @@ -1023,6 +1024,7 @@ defaultSettingsSlider: SettingsSlider { barTop: 5px; barSkip: 3px; barStroke: 3px; + barRadius: 1px; barFg: sliderBgInactive; barFgActive: sliderBgActive; labelTop: 17px; From 43c61172d8d2ef08c2c190d6b3425823727ea9c9 Mon Sep 17 00:00:00 2001 From: John Preston Date: Thu, 10 Feb 2022 12:22:35 +0300 Subject: [PATCH 007/635] Allow overriding Ui::SettingsButton padding. --- ui/widgets/buttons.cpp | 21 ++++++++++++++------- ui/widgets/buttons.h | 5 ++++- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/ui/widgets/buttons.cpp b/ui/widgets/buttons.cpp index 4519357..b624afc 100644 --- a/ui/widgets/buttons.cpp +++ b/ui/widgets/buttons.cpp @@ -690,7 +690,8 @@ SettingsButton::SettingsButton( rpl::producer &&text, const style::SettingsButton &st) : RippleButton(parent, st.ripple) -, _st(st) { +, _st(st) +, _padding(_st.padding) { std::move( text ) | rpl::start_with_next([this](QString &&value) { @@ -736,11 +737,17 @@ rpl::producer SettingsButton::toggledValue() const { return nullptr; } -void SettingsButton::setColorOverride(std::optional textColorOverride) { +void SettingsButton::setColorOverride( + std::optional textColorOverride) { _textColorOverride = textColorOverride; update(); } +void SettingsButton::setPaddingOverride(style::margins padding) { + _padding = padding; + resizeToWidth(widthNoMargins()); +} + const style::SettingsButton &SettingsButton::st() const { return _st; } @@ -773,8 +780,8 @@ void SettingsButton::paintText(Painter &p, bool over, int outerw) const { ? _st.textFgOver : _st.textFg); p.drawTextLeft( - _st.padding.left(), - _st.padding.top(), + _padding.left(), + _padding.top(), outerw, _text, _textWidth); @@ -798,7 +805,7 @@ QRect SettingsButton::toggleRect() const { int SettingsButton::resizeGetHeight(int newWidth) { updateVisibleText(newWidth); - return _st.padding.top() + _st.height + _st.padding.bottom(); + return _padding.top() + _st.height + _padding.bottom(); } void SettingsButton::onStateChanged( @@ -821,8 +828,8 @@ void SettingsButton::setText(QString &&text) { void SettingsButton::updateVisibleText(int newWidth) { auto availableWidth = newWidth - - _st.padding.left() - - _st.padding.right(); + - _padding.left() + - _padding.right(); if (_toggle) { availableWidth -= (width() - toggleRect().x()); } diff --git a/ui/widgets/buttons.h b/ui/widgets/buttons.h index 0e0c835..8be2672 100644 --- a/ui/widgets/buttons.h +++ b/ui/widgets/buttons.h @@ -266,6 +266,9 @@ public: rpl::producer toggledValue() const; void setColorOverride(std::optional textColorOverride); + void setPaddingOverride(style::margins padding); + + [[nodiscard]] const style::SettingsButton &st() const; protected: int resizeGetHeight(int newWidth) override; @@ -275,7 +278,6 @@ protected: void paintEvent(QPaintEvent *e) override; - const style::SettingsButton &st() const; void paintBg(Painter &p, const QRect &rect, bool over) const; void paintText(Painter &p, bool over, int outerw) const; void paintToggle(Painter &p, int outerw) const; @@ -286,6 +288,7 @@ private: void updateVisibleText(int newWidth); const style::SettingsButton &_st; + style::margins _padding; QString _original; QString _text; int _originalWidth = 0; From 6316443b27cffbf0205e07edc0616d370044893c Mon Sep 17 00:00:00 2001 From: John Preston Date: Tue, 22 Feb 2022 15:48:51 +0300 Subject: [PATCH 008/635] Allow SlideWrap to slide up, not only down. --- ui/wrap/slide_wrap.cpp | 29 ++++++++++++++++++++--------- ui/wrap/slide_wrap.h | 7 ++++++- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/ui/wrap/slide_wrap.cpp b/ui/wrap/slide_wrap.cpp index 8075c5b..1dcd246 100644 --- a/ui/wrap/slide_wrap.cpp +++ b/ui/wrap/slide_wrap.cpp @@ -46,6 +46,11 @@ SlideWrap *SlideWrap::setDuration(int duration) { return this; } +SlideWrap *SlideWrap::setDirectionUp(bool up) { + _up = up; + return this; +} + SlideWrap *SlideWrap::toggle( bool shown, anim::type animated) { @@ -92,22 +97,28 @@ SlideWrap *SlideWrap::toggleOn( } void SlideWrap::animationStep() { - auto newWidth = width(); - if (auto weak = wrapped()) { - auto margins = getMargins(); + const auto weak = wrapped(); + if (weak && !_up) { + const auto margins = getMargins(); weak->moveToLeft(margins.left(), margins.top()); - newWidth = weak->width(); } - auto current = _animation.value(_toggled ? 1. : 0.); - auto newHeight = wrapped() + const auto newWidth = weak ? weak->width() : width(); + const auto current = _animation.value(_toggled ? 1. : 0.); + const auto newHeight = weak ? (_animation.animating() - ? anim::interpolate(0, wrapped()->heightNoMargins(), current) - : (_toggled ? wrapped()->height() : 0)) + ? anim::interpolate(0, weak->heightNoMargins(), current) + : (_toggled ? weak->height() : 0)) : 0; + if (weak && _up) { + const auto margins = getMargins(); + weak->moveToLeft( + margins.left(), + margins.top() - (weak->height() - newHeight)); + } if (newWidth != width() || newHeight != height()) { resize(newWidth, newHeight); } - auto shouldBeHidden = !_toggled && !_animation.animating(); + const auto shouldBeHidden = !_toggled && !_animation.animating(); if (shouldBeHidden != isHidden()) { const auto guard = MakeWeak(this); setVisible(!shouldBeHidden); diff --git a/ui/wrap/slide_wrap.h b/ui/wrap/slide_wrap.h index d972d7f..fcee961 100644 --- a/ui/wrap/slide_wrap.h +++ b/ui/wrap/slide_wrap.h @@ -31,6 +31,7 @@ public: const style::margins &padding); SlideWrap *setDuration(int duration); + SlideWrap *setDirectionUp(bool up); SlideWrap *toggle(bool shown, anim::type animated); SlideWrap *show(anim::type animated) { return toggle(true, animated); @@ -62,10 +63,11 @@ protected: private: void animationStep(); - bool _toggled = true; rpl::event_stream _toggledChanged; Animations::Simple _animation; int _duration = 0; + bool _toggled = true; + bool _up = false; }; @@ -94,6 +96,9 @@ public: SlideWrap *setDuration(int duration) { return chain(Parent::setDuration(duration)); } + SlideWrap *setDirectionUp(bool up) { + return chain(Parent::setDirectionUp(up)); + } SlideWrap *toggle(bool shown, anim::type animated) { return chain(Parent::toggle(shown, animated)); } From 34a42aa8c3ea8c00cba5ced73e3bb6a84938cd92 Mon Sep 17 00:00:00 2001 From: John Preston Date: Thu, 24 Feb 2022 17:58:36 +0300 Subject: [PATCH 009/635] Don't set userpic-color fallbacks for icon colors. --- ui/colors.palette | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/ui/colors.palette b/ui/colors.palette index 3b534c1..965c21c 100644 --- a/ui/colors.palette +++ b/ui/colors.palette @@ -309,15 +309,15 @@ historyPeerUserpicFg: windowFgActive; // default userpic initials historyPeerSavedMessagesBg: historyPeer4UserpicBg; // saved messages userpic background historyPeerArchiveUserpicBg: dialogsUnreadBgMuted; // archive folder userpic background -settingsIconBg1: #f06964 | historyPeer1UserpicBg; // red settings icon background -settingsIconBg2: #6dc534 | historyPeer2UserpicBg; // green settings icon background -settingsIconBg3: #ed9f20 | historyPeer3UserpicBg; // light-orange settings icon background -settingsIconBg4: #56b3f5 | historyPeer4UserpicBg; // light-blue settings icon background -settingsIconBg5: #7595ff | historyPeer5UserpicBg; // dark-blue settings icon background -settingsIconBg6: #b580e2 | historyPeer6UserpicBg; // purple settings icon background -settingsIconBg8: #f2925b | historyPeer8UserpicBg; // dark-orange settings icon background -settingsIconBgArchive: #9da2b0 | historyPeerArchiveUserpicBg; // archive main menu icon background -settingsIconFg: #ffffff | historyPeerUserpicFg; // settings icon shape +settingsIconBg1: #f06964; // red settings icon background +settingsIconBg2: #6dc534; // green settings icon background +settingsIconBg3: #ed9f20; // light-orange settings icon background +settingsIconBg4: #56b3f5; // light-blue settings icon background +settingsIconBg5: #7595ff; // dark-blue settings icon background +settingsIconBg6: #b580e2; // purple settings icon background +settingsIconBg8: #f2925b; // dark-orange settings icon background +settingsIconBgArchive: #9da2b0; // archive main menu icon background +settingsIconFg: #ffffff; // settings icon shape // Some values are marked as (adjusted), it means they're adjusted by // hue and saturation of the average background color if user chooses From d6cdc810c456d902b6f1398f96b197dfc8ffdf19 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Mon, 7 Feb 2022 21:36:51 +0300 Subject: [PATCH 010/635] Renamed anim::interpolateF to anim::interpolateToF. --- ui/effects/animation_value.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/effects/animation_value.h b/ui/effects/animation_value.h index 1b9694b..8d1ebe8 100644 --- a/ui/effects/animation_value.h +++ b/ui/effects/animation_value.h @@ -94,12 +94,12 @@ private: }; -TG_FORCE_INLINE float64 interpolateF(int a, int b, float64 b_ratio) { +TG_FORCE_INLINE float64 interpolateToF(int a, int b, float64 b_ratio) { return a + float64(b - a) * b_ratio; } TG_FORCE_INLINE int interpolate(int a, int b, float64 b_ratio) { - return base::SafeRound(interpolateF(a, b, b_ratio)); + return base::SafeRound(interpolateToF(a, b, b_ratio)); } #ifdef ARCH_CPU_32_BITS From 27d3b68ff450f49393e57dbb01064aa2733b9a50 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Mon, 7 Feb 2022 21:37:15 +0300 Subject: [PATCH 011/635] Moved InterpolatedRect util to separated file. --- CMakeLists.txt | 1 + ui/effects/animation_value_f.h | 26 ++++++++++++++++++++++++++ ui/paint/arcs.cpp | 18 ++---------------- 3 files changed, 29 insertions(+), 16 deletions(-) create mode 100644 ui/effects/animation_value_f.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 8fac166..e76e73c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -38,6 +38,7 @@ PRIVATE ui/effects/animation_value.cpp ui/effects/animation_value.h + ui/effects/animation_value_f.h ui/effects/animations.cpp ui/effects/animations.h ui/effects/cross_animation.cpp diff --git a/ui/effects/animation_value_f.h b/ui/effects/animation_value_f.h new file mode 100644 index 0000000..bd8adb7 --- /dev/null +++ b/ui/effects/animation_value_f.h @@ -0,0 +1,26 @@ +// This file is part of Desktop App Toolkit, +// a set of libraries for developing nice desktop applications. +// +// For license and copyright information please follow this link: +// https://github.com/desktop-app/legal/blob/master/LEGAL +// +#pragma once + +namespace anim { + +TG_FORCE_INLINE float64 interpolateF(float a, float b, float64 b_ratio) { + return a + float64(b - a) * b_ratio; +}; + +TG_FORCE_INLINE QRectF interpolatedRectF( + const QRectF &r1, + const QRectF &r2, + float64 ratio) { + return QRectF( + interpolateF(r1.x(), r2.x(), ratio), + interpolateF(r1.y(), r2.y(), ratio), + interpolateF(r1.width(), r2.width(), ratio), + interpolateF(r1.height(), r2.height(), ratio)); +} + +} // namespace anim diff --git a/ui/paint/arcs.cpp b/ui/paint/arcs.cpp index d3121d6..0204e06 100644 --- a/ui/paint/arcs.cpp +++ b/ui/paint/arcs.cpp @@ -7,24 +7,10 @@ #include "ui/paint/arcs.h" #include "ui/effects/animation_value.h" +#include "ui/effects/animation_value_f.h" #include "ui/painter.h" namespace Ui::Paint { -namespace { - -inline float64 InterpolateF(float a, float b, float64 b_ratio) { - return a + float64(b - a) * b_ratio; -}; - -QRectF InterpolatedRect(const QRectF &r1, const QRectF &r2, float64 ratio) { - return QRectF( - InterpolateF(r1.x(), r2.x(), ratio), - InterpolateF(r1.y(), r2.y(), ratio), - InterpolateF(r1.width(), r2.width(), ratio), - InterpolateF(r1.height(), r2.height(), ratio)); -} - -} // namespace ArcsAnimation::ArcsAnimation( const style::ArcsAnimation &st, @@ -221,7 +207,7 @@ void ArcsAnimation::paint(Painter &p, std::optional colorOverride) { ? arc.rect : (progress == 1.) ? previousRect - : InterpolatedRect(arc.rect, previousRect, progress); + : anim::interpolatedRectF(arc.rect, previousRect, progress); p.drawArc(rect, _startAngle, _spanAngle); } p.setOpacity(1.); From 88966598b8056024f625828a64aa5818ee36a437 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Tue, 15 Feb 2022 07:37:07 +0300 Subject: [PATCH 012/635] Removed limitations on number of indexes. --- ui/text/text.cpp | 4 ++-- ui/text/text_utilities.cpp | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/ui/text/text.cpp b/ui/text/text.cpp index fc4c0e5..60cc4ea 100644 --- a/ui/text/text.cpp +++ b/ui/text/text.cpp @@ -565,8 +565,8 @@ bool Parser::processCustomIndex(uint16 index) { if (url.isEmpty()) { return false; } - if (url.startsWith("internal:index") && url.back().isDigit()) { - const auto customIndex = uint16(url.back().unicode() - '0'); + if (url.startsWith("internal:index")) { + const auto customIndex = uint16(url.back().unicode()); // if (customIndex != index) { url = QString(); _linksIndexes.push_back(customIndex); diff --git a/ui/text/text_utilities.cpp b/ui/text/text_utilities.cpp index c6b36a7..7e16fa1 100644 --- a/ui/text/text_utilities.cpp +++ b/ui/text/text_utilities.cpp @@ -43,8 +43,7 @@ TextWithEntities Link(const QString &text, const QString &url) { } TextWithEntities Link(const QString &text, int index) { - Expects(index > 0 && index < 10); - return Link(text, QString("internal:index") + QChar('0' + index)); + return Link(text, QString("internal:index") + QChar(index)); } TextWithEntities PlainLink(const QString &text) { From b69fcf60484c06feca0483ef22559ad1ecef99c8 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Tue, 22 Feb 2022 07:59:09 +0300 Subject: [PATCH 013/635] Added ability to hide layer from delegate of BoxContent. --- ui/layers/box_content.h | 1 + ui/layers/box_layer_widget.cpp | 4 ++++ ui/layers/box_layer_widget.h | 1 + 3 files changed, 6 insertions(+) diff --git a/ui/layers/box_content.h b/ui/layers/box_content.h index cd8a672..c76e34b 100644 --- a/ui/layers/box_content.h +++ b/ui/layers/box_content.h @@ -79,6 +79,7 @@ public: virtual void setNoContentMargin(bool noContentMargin) = 0; virtual bool isBoxShown() const = 0; virtual void closeBox() = 0; + virtual void hideLayer() = 0; virtual void triggerButton(int index) = 0; template diff --git a/ui/layers/box_layer_widget.cpp b/ui/layers/box_layer_widget.cpp index 96ba72b..e8bcf53 100644 --- a/ui/layers/box_layer_widget.cpp +++ b/ui/layers/box_layer_widget.cpp @@ -217,6 +217,10 @@ void BoxLayerWidget::showBox( _layer->showBox(std::move(box), options, animated); } +void BoxLayerWidget::hideLayer() { + _layer->hideLayers(anim::type::normal); +} + void BoxLayerWidget::updateSize() { setDimensions(width(), _maxContentHeight); } diff --git a/ui/layers/box_layer_widget.h b/ui/layers/box_layer_widget.h index a26c5ad..893e220 100644 --- a/ui/layers/box_layer_widget.h +++ b/ui/layers/box_layer_widget.h @@ -91,6 +91,7 @@ public: void closeBox() override { closeLayer(); } + void hideLayer() override; void triggerButton(int index) override; void setCloseByOutsideClick(bool close) override; From c369eb13bf0ad1c04434d5ea6b740068c6d67ef3 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Wed, 23 Feb 2022 04:07:24 +0300 Subject: [PATCH 014/635] Removed Q_OBJECT from BoxContent. --- ui/layers/box_content.cpp | 81 +++++++++++++++++++++------------------ ui/layers/box_content.h | 16 ++++---- 2 files changed, 51 insertions(+), 46 deletions(-) diff --git a/ui/layers/box_content.cpp b/ui/layers/box_content.cpp index 8e45c8e..e25af58 100644 --- a/ui/layers/box_content.cpp +++ b/ui/layers/box_content.cpp @@ -18,8 +18,6 @@ #include "styles/style_layers.h" #include "styles/palette.h" -#include - namespace Ui { void BoxContent::setTitle(rpl::producer title) { @@ -48,7 +46,9 @@ void BoxContent::setInner(object_ptr inner) { setInner(std::move(inner), st::boxScroll); } -void BoxContent::setInner(object_ptr inner, const style::ScrollArea &st) { +void BoxContent::setInner( + object_ptr inner, + const style::ScrollArea &st) { if (inner) { getDelegate()->setLayerType(true); _scroll.create(this, st); @@ -90,11 +90,13 @@ void BoxContent::finishScrollCreate() { updateScrollAreaGeometry(); _scroll->scrolls( ) | rpl::start_with_next([=] { - onScroll(); + updateInnerVisibleTopBottom(); + updateShadowsVisibility(); }, lifetime()); _scroll->innerResizes( ) | rpl::start_with_next([=] { - onInnerResize(); + updateInnerVisibleTopBottom(); + updateShadowsVisibility(); }, lifetime()); } @@ -118,32 +120,39 @@ void BoxContent::scrollByDraggingDelta(int delta) { _draggingScrollDelta = _scroll ? delta : 0; if (_draggingScrollDelta) { if (!_draggingScrollTimer) { - _draggingScrollTimer.create(this); - _draggingScrollTimer->setSingleShot(false); - connect(_draggingScrollTimer, SIGNAL(timeout()), this, SLOT(onDraggingScrollTimer())); + _draggingScrollTimer = std::make_unique([=] { + draggingScrollTimerCallback(); + }); } - _draggingScrollTimer->start(15); + _draggingScrollTimer->callEach(15); } else { - _draggingScrollTimer.destroy(); + _draggingScrollTimer = nullptr; } } -void BoxContent::onDraggingScrollTimer() { - auto delta = (_draggingScrollDelta > 0) ? qMin(_draggingScrollDelta * 3 / 20 + 1, int32(kMaxScrollSpeed)) : qMax(_draggingScrollDelta * 3 / 20 - 1, -int32(kMaxScrollSpeed)); +void BoxContent::draggingScrollTimerCallback() { + const auto delta = (_draggingScrollDelta > 0) + ? qMin(_draggingScrollDelta * 3 / 20 + 1, int32(kMaxScrollSpeed)) + : qMax(_draggingScrollDelta * 3 / 20 - 1, -int32(kMaxScrollSpeed)); _scroll->scrollToY(_scroll->scrollTop() + delta); } void BoxContent::updateInnerVisibleTopBottom() { - if (auto widget = static_cast(_scroll ? _scroll->widget() : nullptr)) { - auto top = _scroll->scrollTop(); + const auto widget = static_cast(_scroll + ? _scroll->widget() + : nullptr); + if (widget) { + const auto top = _scroll->scrollTop(); widget->setVisibleTopBottom(top, top + _scroll->height()); } } void BoxContent::updateShadowsVisibility() { - if (!_scroll) return; + if (!_scroll) { + return; + } - auto top = _scroll->scrollTop(); + const auto top = _scroll->scrollTop(); _topShadow->toggle( (top > 0 || _innerTopSkip > 0), anim::type::normal); @@ -152,16 +161,6 @@ void BoxContent::updateShadowsVisibility() { anim::type::normal); } -void BoxContent::onScroll() { - updateInnerVisibleTopBottom(); - updateShadowsVisibility(); -} - -void BoxContent::onInnerResize() { - updateInnerVisibleTopBottom(); - updateShadowsVisibility(); -} - void BoxContent::setDimensionsToContent( int newWidth, not_null content) { @@ -174,7 +173,7 @@ void BoxContent::setDimensionsToContent( void BoxContent::setInnerTopSkip(int innerTopSkip, bool scrollBottomFixed) { if (_innerTopSkip != innerTopSkip) { - auto delta = innerTopSkip - _innerTopSkip; + const auto delta = innerTopSkip - _innerTopSkip; _innerTopSkip = innerTopSkip; if (_scroll && width() > 0) { auto scrollTopWas = _scroll->scrollTop(); @@ -202,13 +201,21 @@ void BoxContent::setInnerVisible(bool scrollAreaVisible) { } QPixmap BoxContent::grabInnerCache() { - auto isTopShadowVisible = !_topShadow->isHidden(); - auto isBottomShadowVisible = !_bottomShadow->isHidden(); - if (isTopShadowVisible) _topShadow->setVisible(false); - if (isBottomShadowVisible) _bottomShadow->setVisible(false); - auto result = GrabWidget(this, _scroll->geometry()); - if (isTopShadowVisible) _topShadow->setVisible(true); - if (isBottomShadowVisible) _bottomShadow->setVisible(true); + const auto isTopShadowVisible = !_topShadow->isHidden(); + const auto isBottomShadowVisible = !_bottomShadow->isHidden(); + if (isTopShadowVisible) { + _topShadow->setVisible(false); + } + if (isBottomShadowVisible) { + _bottomShadow->setVisible(false); + } + const auto result = GrabWidget(this, _scroll->geometry()); + if (isTopShadowVisible) { + _topShadow->setVisible(true); + } + if (isBottomShadowVisible) { + _bottomShadow->setVisible(true); + } return result; } @@ -227,8 +234,8 @@ void BoxContent::keyPressEvent(QKeyEvent *e) { } void BoxContent::updateScrollAreaGeometry() { - auto newScrollHeight = height() - _innerTopSkip - _innerBottomSkip; - auto changed = (_scroll->height() != newScrollHeight); + const auto newScrollHeight = height() - _innerTopSkip - _innerBottomSkip; + const auto changed = (_scroll->height() != newScrollHeight); _scroll->setGeometryToLeft(0, _innerTopSkip, width(), newScrollHeight); _topShadow->entity()->resize(width(), st::lineWidth); _topShadow->moveToLeft(0, _innerTopSkip); @@ -239,7 +246,7 @@ void BoxContent::updateScrollAreaGeometry() { if (changed) { updateInnerVisibleTopBottom(); - auto top = _scroll->scrollTop(); + const auto top = _scroll->scrollTop(); _topShadow->toggle( (top > 0 || _innerTopSkip > 0), anim::type::instant); diff --git a/ui/layers/box_content.h b/ui/layers/box_content.h index c76e34b..8b470d9 100644 --- a/ui/layers/box_content.h +++ b/ui/layers/box_content.h @@ -18,6 +18,10 @@ enum class RectPart; using RectParts = base::flags; +namespace base { +class Timer; +} // namespace base + namespace style { struct RoundButton; struct IconButton; @@ -97,7 +101,6 @@ public: }; class BoxContent : public RpWidget { - Q_OBJECT public: BoxContent() { @@ -211,7 +214,6 @@ public: void scrollByDraggingDelta(int delta); -public Q_SLOTS: void onScrollToY(int top, int bottom = -1); protected: @@ -274,12 +276,6 @@ protected: void paintEvent(QPaintEvent *e) override; void keyPressEvent(QKeyEvent *e) override; -private Q_SLOTS: - void onScroll(); - void onInnerResize(); - - void onDraggingScrollTimer(); - private: void finishPrepare(); void finishScrollCreate(); @@ -290,6 +286,8 @@ private: void updateShadowsVisibility(); object_ptr doTakeInnerWidget(); + void draggingScrollTimerCallback(); + BoxContentDelegate *_delegate = nullptr; bool _preparing = false; @@ -301,7 +299,7 @@ private: object_ptr _topShadow = { nullptr }; object_ptr _bottomShadow = { nullptr }; - object_ptr _draggingScrollTimer = { nullptr }; + std::unique_ptr _draggingScrollTimer; int _draggingScrollDelta = 0; rpl::event_stream<> _boxClosingStream; From 4ba28e2fec2ab86fb539a4cfe08b9bd1803f8fcf Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Wed, 23 Feb 2022 04:11:04 +0300 Subject: [PATCH 015/635] Renamed BoxContent::onScrollToY to BoxContent::scrollToY. --- ui/layers/box_content.cpp | 2 +- ui/layers/box_content.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/layers/box_content.cpp b/ui/layers/box_content.cpp index e25af58..e089902 100644 --- a/ui/layers/box_content.cpp +++ b/ui/layers/box_content.cpp @@ -110,7 +110,7 @@ RectParts BoxContent::customCornersFilling() { return {}; } -void BoxContent::onScrollToY(int top, int bottom) { +void BoxContent::scrollToY(int top, int bottom) { if (_scroll) { _scroll->scrollToY(top, bottom); } diff --git a/ui/layers/box_content.h b/ui/layers/box_content.h index 8b470d9..86112dc 100644 --- a/ui/layers/box_content.h +++ b/ui/layers/box_content.h @@ -214,7 +214,7 @@ public: void scrollByDraggingDelta(int delta); - void onScrollToY(int top, int bottom = -1); + void scrollToY(int top, int bottom = -1); protected: virtual void prepare() = 0; From ec7af743519d6d30cfa59bc6a61fe4d61b538954 Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 25 Feb 2022 16:08:47 +0300 Subject: [PATCH 016/635] Update some icons. --- icons/box_button_back.png | Bin 218 -> 339 bytes icons/box_button_back@2x.png | Bin 282 -> 504 bytes icons/box_button_back@3x.png | Bin 251 -> 772 bytes icons/box_button_close.png | Bin 148 -> 315 bytes icons/box_button_close@2x.png | Bin 269 -> 432 bytes icons/box_button_close@3x.png | Bin 590 -> 562 bytes icons/box_search.png | Bin 350 -> 392 bytes icons/box_search@2x.png | Bin 707 -> 660 bytes icons/box_search@3x.png | Bin 825 -> 1027 bytes icons/default_checkbox_check.png | Bin 136 -> 279 bytes icons/default_checkbox_check@2x.png | Bin 255 -> 385 bytes icons/default_checkbox_check@3x.png | Bin 296 -> 523 bytes icons/simple_close.png | Bin 124 -> 282 bytes icons/simple_close@2x.png | Bin 176 -> 399 bytes icons/simple_close@3x.png | Bin 264 -> 492 bytes ui/effects/animation_value.cpp | 2 +- ui/effects/animation_value.h | 2 +- 17 files changed, 2 insertions(+), 2 deletions(-) diff --git a/icons/box_button_back.png b/icons/box_button_back.png index 9db1870f6b3b21d9a479cab250c00a689506c791..3fcc4ad2ed4879d0ba1e9890e675c230bdd04fde 100644 GIT binary patch literal 339 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|jKx9jP7LeL$-D$|Tv8)E(|mmy zw18|52FCVG1{RPKAeI7R1_tH@j10^`nh_+nfC(-uuz(rC1}QWNE&K$e_IkQFhG>XR zop_L|MM0pg_`X7wrv5ye@^7Y10*88h1XXr@i;At9P$u@>$l}Dh?LYVDmt0wcsN+x`D z&DZ}`d%hQ(vpIituHhM5d%KU@P3sp4Fy)7?T{0#2_M}tNdq0HB?>xA0@?wP8Gi-<001BJ|6u?C0HH}lK~y-6t&+J7!!Qg*zk|SqjsZM`HHkEW zAh+6rYq0cUUWF-wAOd3gh)sZ%_#PmB0)S}E%reijSZmc8Xb(grp9&$I6SQzCMY^s# zE@KjC4B}eOY(Ga4DsN-I@PzUIf19m`qrzn zyS^~7)`#zHWY_Rm%AwS>HB|hTyslDESN-m$Y(f1ChtIUk6k5`~NFZ@mD~H`*_^lT`&?ne;<&({^F?Z8-TzyE>(s>_Sm>SqY;R>V{j};*h6|TXTz_S4U9{wU z+UDDD+e#v*b-uj*TJ&YtqJT@wFK13t@wlI3cI1mi-^6wGtF%<-rry-(ny@ZY%J6T| zPKDU(rCwHt4IBj&?i%nU{d!sAv@3JgkuQfIHk6#+#PKpdpYt02x}*UkK2#M z!hs@&<)5Y>O*%M1s72dyH|tajU-*A{vx@)&@2g6=YsX7tC%ol<^^{X;-}}XE zI_vwdzKG+vz0KY7_{XG*BT;X^{|1WmExVg%e#-LPbK`4WWe&F1(pB46Z@imVz4ed6 z^69FEU2HlR4R|(&O;X|Y+Bm&9eDSJPafZ%w9g_FPT`#qrf4==#-|PR(mmHVhn!Qka QCMe)NUHx3vIVCg!056Tnb^rhX delta 266 zcmV+l0rmd)1DXPm8Gi-<0047(dh`GQ0O3hQK~z|U#n(*=gD?;U;McT=a+gyHu9A)? z^GJg0FkMtBtucRPCIhoEle`ZMf;Rw+#v&pBfcL)j2w(?PHxcnsMAUS~-v5OkHBFNa zAQrx^D-XjU4-g112MC3i0R+SI0O9a7Kq34ZpcEblD2AT_%75YCfDYjwK&S9GAQrAw z=o!w;Y|y#x%d$L;F|gJ~2SNy7X0ZkmmvGxQolDpmk^c}0BhC+%5%C2@#Py;QB0Zph z$PWo4$_51y<-Hi}$J?)xD6@E&qT2y3VPtI{op%vqMD4Bb7=$9*@;(J)h6_`<>8@ zRBkXBj>qHY?_;;yiA1E2M+BtT>rbZ>L&N;qY&IfC60uIF`yLyH=61UojYbkre63ci zJsb|~u|cud>wm>}BvB%o{eBNEJosq zua(Q?^Z6Xm#N%;%M-nBXnNFvGCXq;xc;ahiGTCG@0e>{9R0`jbM2Tp|<1wH~r_%y~ zfW#J4i}p9e;SkVdG8sBF5{abW?*p1_HcO4B+wB6HTrNk4Ml2S$+igHoEEa`AA!hDz zWnXpLY&Kmk7u#eun}x$+gvh@5y7+p%UM`m}e{QD0P`&4rd94UcCKGBHUiaw#=Gv-d+xX!7%p zsnu!$rdq8=d7QXR)oPU{6Ix=q%Lrn6|1$ENLx`!<>44l-Diz)_mCI$yOx$-SADK#} z66JB~^?IP5sBD#ZH zop74>u!4Y#ZxA1EAe)hpd*2j>xdCj8`1z(dxJ7c#JUT!4QS;lGwaw{!bL)3a35t5X zx<8R6VV2eNs`vMPpZv=;LxORJn^T9x<5`MQ$_&8_NoVg|oMM+YFLRpX-pgwG*LY&G zdwupe7&V-}_~eUx%%zBDJNTb_^lxsQR6O1A*n&Kc#0xr`-&`kqr~ls%S$9Pa7r=d#Wzp$P!mXk+^T literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a)4Xipc%5RHj*0}t{t7;-4Z9{xN3 z-9x1fY~Od>k2THo{UhNJkh08E>c9<^xii^3Z_9bgpUF39jCXR+YWbFR_}bpqbB_+W w-i@^4sx7&8`S{vZO)4%f(nd-OoT07kiV-r$UTbaZ09wP~>FVdQ&MBb@0Ck@k44ofy`glX(f`xTHpSruq6Z zXaU(A42G$TlC0TWzSVF5FO4N|zKE$K5*nUtrCV~7Xu z+bPz3%?1K4Kkv2)1v)W{a(LyjiYsn^B;|3kB~*ud&$%QWRaU(pZ>sJcxFNvu{l|8e zOD1PGoq4-bq2@AeZ{p@4w;lbUpa{tv^+m?D-%=*iq2Kh16}HW+&Px`h^xZ6s{JF6B{lm$5 zUjk;|u${R+a_*_SzXEI4Tq}*8_O$rB-D5G=y+tph&d0j8JW^dD^!m$jvl^huQK5P7 zSFu|a7A~25qo3XV`{Tsr@n0ugxNG~QM7)2K&Q-A~|2fOD<3w01rTa=_CpXTitLb00 ziYG&>HSxyxzXm*oGMgvQU{et&i#`73{ipXr6^u`K7}$UP{p|+|El*cJmvv4FO#p-f BrR4ws literal 269 zcmV+o0rLKdP))j zJym5Xg(O*Py@aHcSZgIomQor5fa@`ftmCf%fMRC52T`OKUp0hRkdt@=W)VmH14I#L zd<%GyKzt9JA;EYb7$Fmr;dqAhkYIcaj1ccMe#j5Te?Cz!zAVch?0!%x~%8F zx8)|Et+xAQGyi?ZK5zC3c9}je7P|81gD=PGw!{~^`r__w)6Khh zeQNx|`H!AzKmNfl_HZwEiMv(@WT!l*Oj$?PMhM!ueta<;`z{Qu$ZU(LQ`rG0g!GU>CHnR>Vso2YMb zSe(tP6?1*+YD=SqAn#?)5(*+3&t;ucLK6Tj$mHYz literal 590 zcmV-U0KoEwlBb~_MRiK0x zYIsAC5J?CSLE;JAyTPS5JWbc&3-2`natsEFfRe6vW6#Boe#bPE0o%4X@X$ z?*tf%D1`+^Cy>Ig*=%b10Rt?GY`5EZJpK*kh9wc&YPD|q0RSe_H=9i?7P}^}L_#FA z+iis(sZOVJhm#f2Xmq_^i!|g!KNh>)u1G-&LDhytB9Y~CDUuPr^5eGG>xp1Qkh=Y< z0WB5_QKH}P`+PnN#s#+`47!%nm)~qQ6NLtY!TUM55CIVHaIzvC4o|03QSRd$VhRex zM+#3U6q-yXrgi{^@_0!N27{V@(I^lI*wY3PQam3izu&K;^QHr` zL={=Pn)~Uo*d-^nQRju(^MN?`={xsRJ6Eps3-Mom^Z8u2&GJZRDu)ye5N2Z^Ch-2{|he0a}g~F?k cxt{_I0NxbTCUcV|{r~^~07*qoM6N<$g7G2-RsaA1 diff --git a/icons/box_search.png b/icons/box_search.png index 04735260760a3bc5d9b99022d3d868882a5d59c7..fff003560b82e86cfb3b82cd482841e1a2354cb1 100644 GIT binary patch delta 376 zcmcb|)WJMKvYv^7fnmbL3^O3bSRCZ;#IWw1%u680B{jk`&DWPf3&`eRU~JE1U;!xs zVksbIU|?Rr$iNJw89`zTnBcMk3z!jXkV2Et!cRczlc$Sgh=%CWiH3YG4kB$gSD3~) zG%lE4uc@l{kZ;|h0`aX!7)`uvojRIa_SRo}mgd;tC~(GIHtBmjftQy_&ysz)a{qd}+YSdF z2AzsdNIIi%>AIYZ-jn9-vDb5NPg7rV@L?CP%gVkMo7aWUtslrftBkvD%Hw=WEY4Gz z`H%rmXlQBd`c5D!cY)IpJQ@>Kp2zYd-BQ=}qp#Pt!E82Tx7z`5I2^cMuZ%_`7JrKc0L$f)3`0G0fWk18nW-p>b^$X}p69K@cjS34 zGZUb%HuI{g>N1|Hs)*wlfER(fu1V9hQy@*#MiT$)!MiEE+<|kB$z+1}9{BqX`oQLS z_IlGNB{r;07*qoM6N<$f~^pr1^@s6 diff --git a/icons/box_search@2x.png b/icons/box_search@2x.png index 4d2c66f86e536edb168c150881677aeb32b04d57..f633fd720506d98e419569d87e841d5bed894fc9 100644 GIT binary patch delta 646 zcmX@iI)!zDWIYoD1H&JQw~K)kV{wqX6T`Z5GB1G~m(&Q)G+$o^Eg+kNfw4W4fd!-l zh^2s-fq{7eBLg##W(0{XV1mmkEMP{kK?>KjC4B}e`{(K67~;Wub?V+Mra*z##Z3`Q zE`%Lqum51Elk=JDo7uFi_skuOIJh3=FMnd06S_e>n$}xn|PegT9~ePzllz+kX3P zd!ir{!<%_8)8>1qEW5nY@#isKo(43Z4H`vGiTcQ`sbP#U#BK+IJ%PIfLu{Q zs_pNG1t*>s9ZdKz>(A{&o*WHJ8Xs*7n-Xd<;quEb+ZX(`XE@7vQ7+}{CF5TqmJ3W% zHZ`7XRB$psxbM%+oUjX1ZfrB^uSxi2vw-`+vSmUG9v{uv8uk2hWX|*WgogJo+)fqk zoFaWe%k6?Q!-fqD>{;?<>v!MvTVV1e_edstM8pNwbe)Nld#2AYWGr?onRIeVwIi$c z-5CvR7Tn7)3E6o2?KCe{*>$hN58qa=7cM=u z_KDwe<)zElzqorc<h{AA|JLbqx-Fh~{#DWDj}+rk4%6`rnsF6*2UngB0~A&me4 delta 694 zcmV;n0!jUp1;Yi98Gi-<0047(dh`GQ0*XmQK~z|U#g@HmGC>f=$2SLpaG;GSUSnl- z2V!BRm`<<~tWq4-R&u3<)wLFaHe#c#HVOC-T(DTg4}^e)Bt?jzpdy0ALMD})cN0Bt zqv!(*bL`GMzx&v^wE+Oa4JBNnNFWdZhr(aJSPTgv%=(v?7ZgSDZvfeBmMK;!6f8lf(`hE} z>FJ3d!0YwmYJat&MRZ-~`eu^JBmFxwUfpi@U|myy{oMlq%;)p70G7)ojh#-XHGhCh>hA82#=G6l8o=>I12 z`ud8pEOP@GhGEu@PdAabw>MhAFbpp9TrNj*x7#f$ioyo~02q(Q@$>VO79xaTC=@cy z5k(Qp<$p5s=#TtIP6Mc_$^h(DEEX{qi=iY*)HE0jqNZs$olcpxjYb1)HXA>Hs;bN( z;}FOx6^q4V=H>uD%{!eAhQncee0;QIJRA-&9*>`T!q&~5PA8pL6b1A7JQ{{Ux9VcC zKtc#st5u#Y%Wr<+aZ_^^;0EU30I5{!7Utgok}o9DkLil$>?@EY37gI4HO%`G*D7P zp)t0Ef`pce#10ETz(fHJf%i_H$>cigvNOB;)R#y>?#!Hf=Iq_sd+%5*KfnJh0>4br z>-BoG+3fD_?&|8Q+wFEboevKWH#ax^e!tmlHX4myuV>0e8YD|gONBzA+wK0=`T+wZ z@EVLpmXD5(M1Q1Eslda_$fh6rTCLVnsYG{@vf&GckEtyd=`-YTIBK=p;o+f@@$T-f z-EQOP-~izm;V^A)Z@XMBCGz6pBA?GcJv}Lx=jZ2KJZ7_5wOZZT*-<_>W-yOc zU^p-EDDiS?fG(HI9B-@D^7(w4M8E*a`QqJaIxYg>Jb!YGXJ=YDm?2 zR0bNJN~NL-6-QM0B&mUj_ z590(s+kaRnLa5=)0l9cSpR=Jp0}S9{zLZ}`5Q+eEMrB~O5rgtjej!09Ol)t|DP|in zC=cZq5~SvAL=Y80`Go|jh1ZB6`kE-ekRWuTY;SZFrhH}KVVsm-ND%sB=8XO(8jZ4{ zJ_8K2Pon%ngj}XZo)vOa2QA3d>Q3)hzE>@SwtsI|?UnsdyXcUjfDF!xbOR-o)C)(+BP`Y1VU-1tc zGnl76Jm)Ak3V~qJ&ny|GC4RnFpFP~XMKHLsV13B%4V^cg8&lS-w`;+N(*IXR(fUS3|( z>9jP9F^6|OHPkRR7ics$qF*N}x|n8{?mK!I{gyWNfqw4kIbU4CXh bHv)eE`dpSRf0gSA00000NkvXXu0mjfFL=q| delta 802 zcmV+-1Ks?C2)PE3B!3xnMObuGZ)S9NVRB^vL1b@YWgtmyVP|DhWnpA_ami&o0008p zNklx_d+L%fdJB_3=rB*({2R?p4NUCV1jiPoU`d2KpvGWC%3Tm2^ zS|uSuQUtV78(m*}P?#OAyP7+95)AlN-@Sb2%!zkqzVqem?0*#BEM(FtR4SF<@3-6S zS65eBt@ix<952V?alha1cDv1HvtF;izrTOQUt_geE0xN8K40&R#bSXn6n~;HkGMU|F?(gs8@wmxkQYw|dHh~0>u~@9r>Fm~n zgpZn3DkY#U6n_fX(fd&-K$!rTPNzA1DFJCD68Shh91aWMAY@mg)9G-M3D?WZi_7H_ zO9IIA^D`jt*Bdcszo0$HHQ z=*~dj#eqOTx*(i8LI`p!Ap(4NcSqkhyzVnl5n3!k-hcl%h(y;Ud9hgJC5WbSI2! z79pt7Xn&CW`udueAest;fC!{ot)^SYK|99KIo7M^ndW5n?QocXf)bxw>b}r|5USDt=L9s zv@QN$>h0~#>2xyuvjJyHuh;WegZJA4o6Ux6ZLwJF*RfnKQHEkkm+3(@^jH!M26MUG z!@~pYn+a07*qoM6N<$f|UY-YXATM diff --git a/icons/default_checkbox_check.png b/icons/default_checkbox_check.png index 574f57123bd038d32c8e3bf99a69d06c028444c0..cee8d4573facf6b851a4227348c9bea81efbed73 100644 GIT binary patch literal 279 zcmeAS@N?(olHy`uVBq!ia0vp^d_c^_!2~3^cmJ3Gq!^2X+?^QKos)S92pB~#!TXHMri92-|YAyZo^5Vj|L5G~ShVeAbE`IcD_Hn}#*=rZ} yZuRTidTrNtzTRK+kN5e@{e8FX->>)SLKj(IR0I^>F5hzpS8E*yv004y9Z^r-t08dFoK~yM_mC(Trz%U2{K)Qx^^ZsMF4}_Y~ zD!52|!1sWN2ssTvl0>p*KB}@{M*wDcKnY2{76VGy0|rXig9dtT{K5ycKWD`Q(pCCz Y-LaA7&AorNa{vGU07*qoM6N<$f|_nG@&Et; diff --git a/icons/default_checkbox_check@2x.png b/icons/default_checkbox_check@2x.png index 6d3859c84cb809ea2feda32901477b47b31768a9..9109508f09013ebe87d9ecb41fcef32a0717a9b4 100644 GIT binary patch delta 369 zcmey**vLFVvYv^7fkDvb)H)!=SRCZ;#IWw1%u680B{jk`&DWPf3&`eRU~JE1U;!xs zVksbIU|?Rr$iNJw89`zTnBcN93z*?-5s<==v-^{Q)N4-{#}Es_qgOn+S`By@0tz3q z-mz}7sF%CF^l)N~^`nXosk$Gk8uAx8_OA}Ol|D;Av~{nEuQ5;aSpkKvMeAO-2xQKh zlah;Az(n uUaMR0J6j^0x>fF;SP`xC2wk{0Hg?Ap~Z$)*9Y>D5dUa{FpHYIcESsjPZ`n!;bRa z&jD*#&KX*3ez1iZWBA|j1vU=8#7dBeAf=p%o#3)82q9qGHfOBsIt$xDB0>nE80?_~ z*bYi5s{u815Ie856?8=zu=3ONP$ulT7Oh|=>CutN;K207*qoM6N<$f-YTX4gdfE diff --git a/icons/default_checkbox_check@3x.png b/icons/default_checkbox_check@3x.png index 46f67cbde14f5759ef7642d2948e2dd5085ff29a..ebe40ff1f0c460eaca3c7b1976a0b11427ce0356 100644 GIT binary patch delta 497 zcmZ3%)Xg$MrJk`k$lZxy-8q?;3=9k|sS%!OzP=1vKsE;hV|yk83y{SK#8N=az`(qK zk%1XVGlIkxFu`TD7BIuvav+5byLbBnm6dwBIEHxezMXcytJy%{*lRn#ekHDXdsc|L zYT1eiy1E=qub*^{{f79L__yyaGzyq$?Ox+~dXr^~A@Aqk&!i{sy8ZWOqQtS^$qov; zZrGfE|NZyzWS`4RUhlGCHIWvL(G!>Y?`EGP&AfYEw&$c5TMips=--pHEpNrX+}nTa z&U1Ty5_5I@)jRL-ozlAx3lyp=SoM#yozK1fEL88Lb@X@p**`YR)vs7pwKwiz+Jw}~ zTJ^u#k<;E(|4Tk^>bv`HUWMO-B8$0xCdr!j+IVlyUZ$8X(o`tZtPrv2(XX@|5B6=B zD>@D~KmNF5NrJbTfrx8kS0wAc_nWz<-I$iTarXY*MRxN&e|PrndvAMwad1JRvI5WH zNY-_)AF=i2u($-W+-F@<#q%JG|8SwqyPOb#1mmzgSK&o_dv|b2tkW7oM(uF6*2UngFo>&rJXT delta 269 zcmV+o0rLKf1gHX#B!3xnMObuGZ)S9NVRB^vL1b@YWgtmyVP|DhWnpA_ami&o0002W zNklVE7=~d6AWEFT0nh{(lPT<6z=8p=WDp8g;QqwK!pk8h@Ny_ld6S z)^!y^G_d==-}fD^g%Ffds5Yh4T6BftRh!^^9C TLZemy0000z diff --git a/icons/simple_close.png b/icons/simple_close.png index 10f8b030e8cd105c9c3ac7af355ac80689fada49..808a461c3c57db3e9edb455b9af97715a28d7844 100644 GIT binary patch literal 282 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2V6Od#Ihk44ofy`glX(f`xTHpSruq6Z zXaU(A42G$TlC0TW!7YXLKY4N_=bvEwU{YVmY&43Usb zE-5Q}_WXJL_B>f;tq)(n{{8%%-#IAg(*6DQlP6D}n7VlJ;>M!L$Vi2Qmo5dRhzjhy zbt|fcZ3mZ5kwB<`s6+CEuZ9PGE55yvY~f8muvFqf+M(QoO6-D8fr0`84QcWLf-bHV z6&9Q4&AT^I*?rgU-Ga*u4P>m#-aI`$-65A@qD0c>XNp3bP0l+XkK+?vmiEu3Re*NBfWq=cOfA#NBvNthns+%EiYdl6S3>Ze!#xp8xc`#o%4VTD#B7pSr(zy{j#?FeCQ* zs#PtCO@1eYjb25VI=4EfYDrDA2x*ALOZ}5vhOgDtmnrFyGCV_&()78&q Iol`;+04ykx_W%F@ delta 159 zcmV;Q0AT-*1F!**8Gi-<0051N9Sr~g0C!15K~y-6wUk>5z%U2|m)_XhdYkD-2$a&$ zHJCsks5{^zN)nQY2A*Rka%)ps$EJ0#TfbiGayYWSS{LloQ5c1NX>Z{H>C584E7$-4 N002ovPDHLkV1mo}L#6-# diff --git a/icons/simple_close@3x.png b/icons/simple_close@3x.png index 5a5f817033b6165696a4693f51a60b7778cd58b0..e51bb68a35ff4ba13923f98017f4b86ed8a27c22 100644 GIT binary patch delta 477 zcmeBRdc!a}eX&MRXlcnLm7hQJLqjuXv0Ziz)ahcf{{FkxWs}a~?H2@> z>BqL%%=e$Q?0-q@_4Y)D*V^Ki+j7r4Z`a{omLGfmb6UOlcZOe@;tPa#xL9qh4r1Sx z|JD0l<3Gmo@b#~MeXQ^~Enix8O|tIOnZm6~_Rrou>-*~c(=XZSbM&;QM)#Lx9th1z zTKTs6uwg>zn-i^9XGR{`o4YTgE<9g!((iTM&T*Ic?|A=;7GE*Hq_b3Mx&!-;wwa&NuzT*z>#t4!wM(>J+?IR2blvN| ziw^3SO#+|3`hBl(j^vKJc{-=hUB4iA*g)p^!{zmi3fGOKnpS0g0R^_FtDnm{r-UW| D=YPTd delta 247 zcmVH5CF^Y&lM37Q~nL$<2=5`HLg_$Ae+|LVg&ZxBl07@xa;i`&K3IL$i z`hoY*rd{wJ+VqB-8P2o{KZ7=z8RRM;3Lo5aIB+NQ1>Oap+;Ahja0Pk Date: Fri, 25 Feb 2022 19:23:05 +0300 Subject: [PATCH 017/635] Allow fractional stroke values in CrossAnimation. --- ui/effects/cross_animation.cpp | 26 +++++++++++++++----------- ui/style/style_core_scale.h | 12 ++++++++++++ ui/widgets/widgets.style | 6 +++--- 3 files changed, 30 insertions(+), 14 deletions(-) diff --git a/ui/effects/cross_animation.cpp b/ui/effects/cross_animation.cpp index 61084d7..4b6f7f9 100644 --- a/ui/effects/cross_animation.cpp +++ b/ui/effects/cross_animation.cpp @@ -120,14 +120,18 @@ void CrossAnimation::paint( float64 loading) { PainterHighQualityEnabler hq(p); - auto sqrt2 = sqrt(2.); - auto deleteScale = shown + st.minScale * (1. - shown); - auto deleteSkip = (deleteScale * st.skip) + (1. - deleteScale) * (st.size / 2); - auto deleteLeft = style::rtlpoint(x + deleteSkip, 0, outerWidth).x() + 0.; - auto deleteTop = y + deleteSkip + 0.; - auto deleteWidth = st.size - 2 * deleteSkip; - auto deleteHeight = st.size - 2 * deleteSkip; - auto deleteStroke = st.stroke / sqrt2; + const auto stroke = style::ConvertScaleExact(st.stroke); + + const auto sqrt2 = sqrt(2.); + const auto deleteScale = shown + st.minScale * (1. - shown); + const auto deleteSkip = (deleteScale * st.skip) + + (1. - deleteScale) * (st.size / 2); + const auto deleteLeft = 0. + + style::rtlpoint(x + deleteSkip, 0, outerWidth).x(); + const auto deleteTop = y + deleteSkip + 0.; + const auto deleteWidth = st.size - 2 * deleteSkip; + const auto deleteHeight = st.size - 2 * deleteSkip; + const auto deleteStroke = stroke / sqrt2; std::array pathDelete = { { { deleteLeft, deleteTop + deleteStroke }, { deleteLeft + deleteStroke, deleteTop }, @@ -176,10 +180,10 @@ void CrossAnimation::paint( p.fillPath(path, color); } if (loadingArcLength != 0) { - auto roundSkip = (st.size * (1 - sqrt2) + 2 * sqrt2 * deleteSkip + st.stroke) / 2; + auto roundSkip = (st.size * (1 - sqrt2) + 2 * sqrt2 * deleteSkip + stroke) / 2; auto roundPart = QRectF(x + roundSkip, y + roundSkip, st.size - 2 * roundSkip, st.size - 2 * roundSkip); if (staticLoading) { - anim::DrawStaticLoading(p, roundPart, st.stroke, color); + anim::DrawStaticLoading(p, roundPart, stroke, color); } else { auto loadingArcStart = kFullArcLength / 8; if (shown < 1.) { @@ -192,7 +196,7 @@ void CrossAnimation::paint( p.setBrush(Qt::NoBrush); auto pen = color->p; - pen.setWidthF(st.stroke); + pen.setWidthF(stroke); pen.setCapStyle(Qt::RoundCap); p.setPen(pen); p.drawArc(roundPart, loadingArcStart, loadingArcLength); diff --git a/ui/style/style_core_scale.h b/ui/style/style_core_scale.h index a92c786..93ac4da 100644 --- a/ui/style/style_core_scale.h +++ b/ui/style/style_core_scale.h @@ -44,6 +44,18 @@ template return ConvertScale(value, Scale()); } +template +[[nodiscard]] inline T ConvertScaleExact(T value, int scale) { + return (value < 0.) + ? (-ConvertScale(-value, scale)) + : T(double(value) * scale / 100.); +} + +template +[[nodiscard]] inline T ConvertScaleExact(T value) { + return ConvertScaleExact(value, Scale()); +} + [[nodiscard]] inline QSize ConvertScale(QSize size) { return QSize(ConvertScale(size.width()), ConvertScale(size.height())); } diff --git a/ui/widgets/widgets.style b/ui/widgets/widgets.style index 8e236b8..173bc1b 100644 --- a/ui/widgets/widgets.style +++ b/ui/widgets/widgets.style @@ -386,7 +386,7 @@ CrossAnimation { fg: color; size: pixels; skip: pixels; - stroke: pixels; + stroke: double; minScale: double; } @@ -923,7 +923,7 @@ defaultMultiSelectItem: MultiSelectItem { deleteCross: CrossAnimation { size: 32px; skip: 10px; - stroke: 2px; + stroke: 1.5; minScale: 0.3; } duration: 150; @@ -959,7 +959,7 @@ defaultMultiSelectSearchCancel: CrossButton { cross: CrossAnimation { size: 36px; skip: 12px; - stroke: 2px; + stroke: 1.5; minScale: 0.3; } crossFg: boxTitleCloseFg; From 5214f96bbafa1d879fca39c3374cb182687084c8 Mon Sep 17 00:00:00 2001 From: John Preston Date: Sun, 27 Feb 2022 17:48:43 +0300 Subject: [PATCH 018/635] Parse markup in Ui::Text::String::setMarkedText by default. --- ui/text/text.cpp | 11 +++++++++-- ui/text/text.h | 10 ++++++---- ui/widgets/tooltip.cpp | 2 +- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/ui/text/text.cpp b/ui/text/text.cpp index 60cc4ea..4773df7 100644 --- a/ui/text/text.cpp +++ b/ui/text/text.cpp @@ -147,14 +147,21 @@ bool IsBad(QChar ch) { } // namespace Text } // namespace Ui -const TextParseOptions _defaultOptions = { +const TextParseOptions kDefaultTextOptions = { TextParseLinks | TextParseMultiline, // flags 0, // maxw 0, // maxh Qt::LayoutDirectionAuto, // dir }; -const TextParseOptions _textPlainOptions = { +const TextParseOptions kMarkupTextOptions = { + TextParseLinks | TextParseMultiline | TextParseMarkdown, // flags + 0, // maxw + 0, // maxh + Qt::LayoutDirectionAuto, // dir +}; + +const TextParseOptions kPlainTextOptions = { TextParseMultiline, // flags 0, // maxw 0, // maxh diff --git a/ui/text/text.h b/ui/text/text.h index b27fd80..3927652 100644 --- a/ui/text/text.h +++ b/ui/text/text.h @@ -29,7 +29,9 @@ struct TextParseOptions { int32 maxh; Qt::LayoutDirection dir; }; -extern const TextParseOptions _defaultOptions, _textPlainOptions; +extern const TextParseOptions kDefaultTextOptions; +extern const TextParseOptions kMarkupTextOptions; +extern const TextParseOptions kPlainTextOptions; enum class TextSelectType { Letters = 0x01, @@ -102,7 +104,7 @@ public: String( const style::TextStyle &st, const QString &text, - const TextParseOptions &options = _defaultOptions, + const TextParseOptions &options = kDefaultTextOptions, int32 minResizeWidth = QFIXED_MAX); String(const String &other) = default; String(String &&other) = default; @@ -113,8 +115,8 @@ public: int countWidth(int width, bool breakEverywhere = false) const; int countHeight(int width, bool breakEverywhere = false) const; void countLineWidths(int width, QVector *lineWidths, bool breakEverywhere = false) const; - void setText(const style::TextStyle &st, const QString &text, const TextParseOptions &options = _defaultOptions); - void setMarkedText(const style::TextStyle &st, const TextWithEntities &textWithEntities, const TextParseOptions &options = _defaultOptions, const std::any &context = {}); + void setText(const style::TextStyle &st, const QString &text, const TextParseOptions &options = kDefaultTextOptions); + void setMarkedText(const style::TextStyle &st, const TextWithEntities &textWithEntities, const TextParseOptions &options = kMarkupTextOptions, const std::any &context = {}); void setLink(uint16 lnkIndex, const ClickHandlerPtr &lnk); bool hasLinks() const; diff --git a/ui/widgets/tooltip.cpp b/ui/widgets/tooltip.cpp index acf7bf4..e875ec5 100644 --- a/ui/widgets/tooltip.cpp +++ b/ui/widgets/tooltip.cpp @@ -85,7 +85,7 @@ void Tooltip::popup(const QPoint &m, const QString &text, const style::Tooltip * _point = m; _st = st; - _text = Text::String(_st->textStyle, text, _textPlainOptions, _st->widthMax); + _text = Text::String(_st->textStyle, text, kPlainTextOptions, _st->widthMax); _useTransparency = Platform::TranslucentWindowsSupported(_point); setAttribute(Qt::WA_OpaquePaintEvent, !_useTransparency); From 6392af756fe51c72b6ffd8be4f429f449e1e1d1e Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Mon, 28 Feb 2022 08:07:08 +0300 Subject: [PATCH 019/635] Added utils for variant text. --- CMakeLists.txt | 2 ++ ui/text/text_variant.cpp | 48 ++++++++++++++++++++++++++++++++++++++++ ui/text/text_variant.h | 28 +++++++++++++++++++++++ 3 files changed, 78 insertions(+) create mode 100644 ui/text/text_variant.cpp create mode 100644 ui/text/text_variant.h diff --git a/CMakeLists.txt b/CMakeLists.txt index e76e73c..b09a999 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -149,6 +149,8 @@ PRIVATE ui/text/text_isolated_emoji.h ui/text/text_utilities.cpp ui/text/text_utilities.h + ui/text/text_variant.cpp + ui/text/text_variant.h ui/toast/toast.cpp ui/toast/toast.h ui/toast/toast_manager.cpp diff --git a/ui/text/text_variant.cpp b/ui/text/text_variant.cpp new file mode 100644 index 0000000..b795d94 --- /dev/null +++ b/ui/text/text_variant.cpp @@ -0,0 +1,48 @@ +// This file is part of Desktop App Toolkit, +// a set of libraries for developing nice desktop applications. +// +// For license and copyright information please follow this link: +// https://github.com/desktop-app/legal/blob/master/LEGAL +// +#include "ui/text/text_variant.h" + +namespace v::text { + +rpl::producer take_plain( + data &&d, + rpl::producer &&fallback) { + if (const auto empty = std::get_if<0>(&d)) { + return std::move(fallback); + } else if (const auto plainPtr = std::get_if<1>(&d)) { + return rpl::single(base::take(*plainPtr)); + } else if (const auto rplPlainPtr = std::get_if<2>(&d)) { + return base::take(*rplPlainPtr); + } else if (const auto markedPtr = std::get_if<3>(&d)) { + return rpl::single(base::take(*markedPtr).text); + } else if (const auto rplMarkedPtr = std::get_if<4>(&d)) { + return base::take(*rplMarkedPtr) | rpl::map([](const auto &marked) { + return marked.text; + }); + } + Unexpected("Bad variant in take_plain."); +} + +rpl::producer take_marked( + data &&d, + rpl::producer &&fallback) { + if (const auto empty = std::get_if<0>(&d)) { + return std::move(fallback); + } else if (const auto plainPtr = std::get_if<1>(&d)) { + return rpl::single(TextWithEntities{ base::take(*plainPtr) }); + } else if (const auto rplPlainPtr = std::get_if<2>(&d)) { + return base::take(*rplPlainPtr) | rpl::map(TextWithEntities::Simple); + } else if (const auto markedPtr = std::get_if<3>(&d)) { + return rpl::single(base::take(*markedPtr)); + } else if (const auto rplMarkedPtr = std::get_if<4>(&d)) { + return base::take(*rplMarkedPtr); + } + Unexpected("Bad variant in take_marked."); +} + +} // namespace v::text + diff --git a/ui/text/text_variant.h b/ui/text/text_variant.h new file mode 100644 index 0000000..e0ed379 --- /dev/null +++ b/ui/text/text_variant.h @@ -0,0 +1,28 @@ +// This file is part of Desktop App Toolkit, +// a set of libraries for developing nice desktop applications. +// +// For license and copyright information please follow this link: +// https://github.com/desktop-app/legal/blob/master/LEGAL +// +#pragma once + +#include "ui/text/text_entity.h" + +namespace v::text { + +using data = std::variant< + v::null_t, + QString, + rpl::producer, + TextWithEntities, + rpl::producer>; + +[[nodiscard]] rpl::producer take_plain( + data &&d, + rpl::producer &&fallback = rpl::never()); +[[nodiscard]] rpl::producer take_marked( + data &&d, + rpl::producer &&fallback + = rpl::never()); + +} // namespace v::text From dea62df69b02c52fd0efe37b8b39a592220a7bf0 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Mon, 28 Feb 2022 11:39:28 +0300 Subject: [PATCH 020/635] Replaced index-based accessor with type-based one in variant text. --- ui/text/text_variant.cpp | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/ui/text/text_variant.cpp b/ui/text/text_variant.cpp index b795d94..943867c 100644 --- a/ui/text/text_variant.cpp +++ b/ui/text/text_variant.cpp @@ -11,16 +11,17 @@ namespace v::text { rpl::producer take_plain( data &&d, rpl::producer &&fallback) { - if (const auto empty = std::get_if<0>(&d)) { + using RplMarked = rpl::producer; + if (const auto empty = std::get_if(&d)) { return std::move(fallback); - } else if (const auto plainPtr = std::get_if<1>(&d)) { - return rpl::single(base::take(*plainPtr)); - } else if (const auto rplPlainPtr = std::get_if<2>(&d)) { - return base::take(*rplPlainPtr); - } else if (const auto markedPtr = std::get_if<3>(&d)) { - return rpl::single(base::take(*markedPtr).text); - } else if (const auto rplMarkedPtr = std::get_if<4>(&d)) { - return base::take(*rplMarkedPtr) | rpl::map([](const auto &marked) { + } else if (const auto ptr = std::get_if(&d)) { + return rpl::single(base::take(*ptr)); + } else if (const auto ptr = std::get_if>(&d)) { + return base::take(*ptr); + } else if (const auto ptr = std::get_if(&d)) { + return rpl::single(base::take(*ptr).text); + } else if (const auto ptr = std::get_if(&d)) { + return base::take(*ptr) | rpl::map([](const auto &marked) { return marked.text; }); } @@ -30,16 +31,17 @@ rpl::producer take_plain( rpl::producer take_marked( data &&d, rpl::producer &&fallback) { - if (const auto empty = std::get_if<0>(&d)) { + using RplMarked = rpl::producer; + if (const auto empty = std::get_if(&d)) { return std::move(fallback); - } else if (const auto plainPtr = std::get_if<1>(&d)) { - return rpl::single(TextWithEntities{ base::take(*plainPtr) }); - } else if (const auto rplPlainPtr = std::get_if<2>(&d)) { - return base::take(*rplPlainPtr) | rpl::map(TextWithEntities::Simple); - } else if (const auto markedPtr = std::get_if<3>(&d)) { - return rpl::single(base::take(*markedPtr)); - } else if (const auto rplMarkedPtr = std::get_if<4>(&d)) { - return base::take(*rplMarkedPtr); + } else if (const auto ptr = std::get_if(&d)) { + return rpl::single(TextWithEntities{ base::take(*ptr) }); + } else if (const auto ptr = std::get_if>(&d)) { + return base::take(*ptr) | rpl::map(TextWithEntities::Simple); + } else if (const auto ptr = std::get_if(&d)) { + return rpl::single(base::take(*ptr)); + } else if (const auto ptr = std::get_if(&d)) { + return base::take(*ptr); } Unexpected("Bad variant in take_marked."); } From 73ec29fa06e3cd353294b2282a00b66528a65ff3 Mon Sep 17 00:00:00 2001 From: 23rd <23rd@vivaldi.net> Date: Mon, 28 Feb 2022 12:33:31 +0300 Subject: [PATCH 021/635] Added clearing of selection on changing of FlatLabel selectability. --- ui/widgets/labels.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ui/widgets/labels.cpp b/ui/widgets/labels.cpp index 2362a45..bb3ca84 100644 --- a/ui/widgets/labels.cpp +++ b/ui/widgets/labels.cpp @@ -263,8 +263,12 @@ void FlatLabel::setMarkedText(const TextWithEntities &textWithEntities) { } void FlatLabel::setSelectable(bool selectable) { - _selectable = selectable; - setMouseTracking(_selectable || _text.hasLinks()); + if (_selectable != selectable) { + _selection = { 0, 0 }; + _savedSelection = { 0, 0 }; + _selectable = selectable; + setMouseTracking(_selectable || _text.hasLinks()); + } } void FlatLabel::setDoubleClickSelectsParagraph(bool doubleClickSelectsParagraph) { From 5d475f54f0c8aa19693d13ec9a4f418f63018052 Mon Sep 17 00:00:00 2001 From: John Preston Date: Mon, 28 Feb 2022 19:12:26 +0300 Subject: [PATCH 022/635] Enlarge padded title controls hit area. --- ui/platform/ui_platform_window_title.cpp | 18 +++++++++++------- ui/platform/ui_platform_window_title.h | 2 +- ui/platform/win/ui_window_title_win.cpp | 5 ++++- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/ui/platform/ui_platform_window_title.cpp b/ui/platform/ui_platform_window_title.cpp index 33a9bf3..5c22615 100644 --- a/ui/platform/ui_platform_window_title.cpp +++ b/ui/platform/ui_platform_window_title.cpp @@ -218,15 +218,18 @@ void TitleControls::raise() { _close->raise(); } -HitTestResult TitleControls::hitTest(QPoint point) const { - const auto test = [&](const object_ptr