feat: allow copying with background

chore: refactor a bit
This commit is contained in:
ZavaruKitsu 2024-02-08 00:24:34 +03:00
parent f583732688
commit 222a643ce3
6 changed files with 50 additions and 24 deletions

View file

@ -4885,8 +4885,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
"ayu_MessageShotThemeDefault" = "Default"; "ayu_MessageShotThemeDefault" = "Default";
"ayu_MessageShotThemeSelectTitle" = "Select message theme"; "ayu_MessageShotThemeSelectTitle" = "Select message theme";
"ayu_MessageShotThemeApply" = "Apply"; "ayu_MessageShotThemeApply" = "Apply";
"ayu_MessageShotBackground" = "Background"; "ayu_MessageShotShowBackground" = "Show background";
"ayu_MessageShotBackgroundSelected" = "Selected";
"ayu_MessageShotShowDate" = "Show date"; "ayu_MessageShotShowDate" = "Show date";
"ayu_MessageShotShowReactions" = "Show reactions"; "ayu_MessageShotShowReactions" = "Show reactions";
"ayu_MessageShotShowColorfulReplies" = "Show colorful replies"; "ayu_MessageShotShowColorfulReplies" = "Show colorful replies";

View file

@ -7,6 +7,7 @@
#include "message_shot.h" #include "message_shot.h"
#include "styles/style_layers.h" #include "styles/style_layers.h"
#include "styles/style_ayu_styles.h"
#include "qguiapplication.h" #include "qguiapplication.h"
#include "ayu/ui/boxes/message_shot_box.h" #include "ayu/ui/boxes/message_shot_box.h"
@ -24,6 +25,7 @@
#include "ui/chat/chat_theme.h" #include "ui/chat/chat_theme.h"
#include "ui/effects/path_shift_gradient.h" #include "ui/effects/path_shift_gradient.h"
#include "ui/layers/box_content.h" #include "ui/layers/box_content.h"
#include "window/themes/window_theme.h"
namespace AyuFeatures::MessageShot { namespace AyuFeatures::MessageShot {
@ -185,7 +187,7 @@ bool MessageShotDelegate::elementIsChatWide() {
return true; return true;
} }
QImage removePadding(const QImage &original) { QImage removeEmptySpaceAround(const QImage &original) {
if (original.isNull()) { if (original.isNull()) {
return {}; return {};
} }
@ -211,29 +213,37 @@ QImage removePadding(const QImage &original) {
return {}; return {};
} }
QRect bounds(minX, minY, maxX - minX + 1, maxY - minY + 1); const QRect bounds(minX, minY, maxX - minX + 1, maxY - minY + 1);
return original.copy(bounds); return original.copy(bounds);
} }
QImage addPadding(const QImage &original, int padding) { QImage addPadding(const QImage &original) {
if (original.isNull()) { if (original.isNull()) {
return {}; return {};
} }
QImage paddedImage( QImage paddedImage(
original.width() + padding * 2 * style::DevicePixelRatio(), original.width() + 2 * st::messageShotPadding,
original.height() + padding * 2 * style::DevicePixelRatio(), original.height() + 2 * st::messageShotPadding,
QImage::Format_ARGB32_Premultiplied QImage::Format_ARGB32_Premultiplied
); );
paddedImage.fill(Qt::transparent); paddedImage.fill(Qt::transparent);
Painter painter(&paddedImage); Painter painter(&paddedImage);
painter.drawImage(padding, padding, original); painter.drawImage(st::messageShotPadding, st::messageShotPadding, original);
painter.end(); painter.end();
return paddedImage; return paddedImage;
} }
QColor makeDefaultBackgroundColor() {
if (Window::Theme::IsNightMode()) {
return st::boxBg->c.lighter(175);
}
return st::boxBg->c.darker(110);
}
QImage Make(not_null<QWidget*> box, const ShotConfig &config) { QImage Make(not_null<QWidget*> box, const ShotConfig &config) {
const auto controller = config.controller; const auto controller = config.controller;
const auto st = config.st; const auto st = config.st;
@ -342,11 +352,6 @@ QImage Make(not_null<QWidget*> box, const ShotConfig &config) {
rect, rect,
true); true);
// hides too much
// if (AyuFeatures::MessageShot::ignoreRender(AyuFeatures::MessageShot::RenderPart::Date)) {
// context.skipDrawingParts = Ui::ChatPaintContext::SkipDrawingParts::Surrounding;
// }
p.translate(0, y); p.translate(0, y);
view->draw(p, context); view->draw(p, context);
p.translate(0, -y); p.translate(0, -y);
@ -367,9 +372,18 @@ QImage Make(not_null<QWidget*> box, const ShotConfig &config) {
takingShot = false; takingShot = false;
const auto overlay = addPadding(removePadding(image), 4); auto result = addPadding(removeEmptySpaceAround(image));
if (!config.showBackground) {
return result;
}
return overlay; auto newResult = QImage(result.size(), QImage::Format_ARGB32_Premultiplied);
newResult.fill(makeDefaultBackgroundColor());
Painter painter(&newResult);
painter.drawImage(0, 0, result);
return newResult;
} }
void Wrapper(not_null<HistoryView::ListWidget*> widget) { void Wrapper(not_null<HistoryView::ListWidget*> widget) {

View file

@ -19,6 +19,7 @@ struct ShotConfig
std::shared_ptr<Ui::ChatStyle> st; std::shared_ptr<Ui::ChatStyle> st;
std::vector<not_null<HistoryItem*>> messages; std::vector<not_null<HistoryItem*>> messages;
bool showBackground;
bool showDate; bool showDate;
bool showReactions; bool showReactions;
}; };
@ -63,6 +64,9 @@ rpl::producer<Data::CloudTheme> themeChosen();
void setPalette(style::palette &palette); void setPalette(style::palette &palette);
rpl::producer<style::palette> paletteChosen(); rpl::producer<style::palette> paletteChosen();
// util
QColor makeDefaultBackgroundColor();
QImage Make(not_null<QWidget*> box, const ShotConfig &config); QImage Make(not_null<QWidget*> box, const ShotConfig &config);
void Wrapper(not_null<HistoryView::ListWidget*> widget); void Wrapper(not_null<HistoryView::ListWidget*> widget);

View file

@ -27,6 +27,8 @@ recentStickersLimitPadding: margins(22px, 4px, 22px, 8px);
imageViewPadding: margins(22px, 10px, 22px, 10px); imageViewPadding: margins(22px, 10px, 22px, 10px);
imageViewInnerPadding: margins(16px, 16px, 16px, 16px); imageViewInnerPadding: margins(16px, 16px, 16px, 16px);
messageShotPadding: 4px;
topBarAdmins: IconButton { topBarAdmins: IconButton {
width: 40px; width: 40px;
height: topBarHeight; height: topBarHeight;

View file

@ -109,6 +109,20 @@ void MessageShotBox::setupContent() {
Ui::show(std::move(box), Ui::LayerOption::KeepOther); Ui::show(std::move(box), Ui::LayerOption::KeepOther);
}); });
AddButtonWithIcon(
content,
tr::ayu_MessageShotShowBackground(),
st::settingsButtonNoIcon
)->toggleOn(rpl::single(false)
)->toggledValue(
) | start_with_next(
[=](bool enabled)
{
_config.showBackground = enabled;
updatePreview();
},
content->lifetime());
AddButtonWithIcon( AddButtonWithIcon(
content, content,

View file

@ -6,12 +6,12 @@
// Copyright @Radolyn, 2024 // Copyright @Radolyn, 2024
#include "image_view.h" #include "image_view.h"
#include "ayu/features/messageshot/message_shot.h"
#include "styles/style_ayu_styles.h" #include "styles/style_ayu_styles.h"
#include "ayu/utils/telegram_helpers.h" #include "ayu/utils/telegram_helpers.h"
#include "styles/style_chat.h" #include "styles/style_chat.h"
#include "ui/painter.h" #include "ui/painter.h"
#include "window/themes/window_theme.h"
ImageView::ImageView(QWidget *parent) ImageView::ImageView(QWidget *parent)
: RpWidget(parent) { : RpWidget(parent) {
@ -63,15 +63,8 @@ QImage ImageView::getImage() const {
void ImageView::paintEvent(QPaintEvent *e) { void ImageView::paintEvent(QPaintEvent *e) {
Painter p(this); Painter p(this);
// PainterHighQualityEnabler hq(p);
auto brush = QBrush(st::boxBg); // copy const auto brush = QBrush(AyuFeatures::MessageShot::makeDefaultBackgroundColor());
if (Window::Theme::IsNightMode()) {
brush.setColor(brush.color().lighter(120));
} else {
brush.setColor(brush.color().darker(105));
}
QPainterPath path; QPainterPath path;
path.addRoundedRect(rect(), st::bubbleRadiusLarge, st::bubbleRadiusLarge); path.addRoundedRect(rect(), st::bubbleRadiusLarge, st::bubbleRadiusLarge);