126 lines
3.2 KiB
C++
126 lines
3.2 KiB
C++
/*
|
|
This file is part of Telegram Desktop,
|
|
the official desktop application for the Telegram messaging service.
|
|
|
|
For license and copyright information please follow this link:
|
|
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
|
*/
|
|
#include "ui/chat/chat_style.h"
|
|
|
|
#include "ui/chat/chat_theme.h"
|
|
#include "styles/style_chat.h"
|
|
|
|
namespace Ui {
|
|
|
|
ChatStyle::ChatStyle() {
|
|
finalize();
|
|
messageIcon(
|
|
&MessageStyle::tailLeft,
|
|
st::historyBubbleTailInLeft,
|
|
st::historyBubbleTailInLeftSelected,
|
|
st::historyBubbleTailOutLeft,
|
|
st::historyBubbleTailOutLeftSelected);
|
|
messageIcon(
|
|
&MessageStyle::tailRight,
|
|
st::historyBubbleTailInRight,
|
|
st::historyBubbleTailInRightSelected,
|
|
st::historyBubbleTailOutRight,
|
|
st::historyBubbleTailOutRightSelected);
|
|
messageColor(
|
|
&MessageStyle::msgBg,
|
|
msgInBg(),
|
|
msgInBgSelected(),
|
|
msgOutBg(),
|
|
msgOutBgSelected());
|
|
messageColor(
|
|
&MessageStyle::msgShadow,
|
|
msgInShadow(),
|
|
msgInShadowSelected(),
|
|
msgOutShadow(),
|
|
msgOutShadowSelected());
|
|
}
|
|
|
|
void ChatStyle::apply(not_null<ChatTheme*> theme) {
|
|
const auto themePalette = theme->palette();
|
|
assignPalette(themePalette
|
|
? themePalette
|
|
: style::main_palette::get().get());
|
|
if (themePalette) {
|
|
_defaultPaletteChangeLifetime.destroy();
|
|
} else {
|
|
style::PaletteChanged(
|
|
) | rpl::start_with_next([=] {
|
|
assignPalette(style::main_palette::get());
|
|
}, _defaultPaletteChangeLifetime);
|
|
}
|
|
}
|
|
|
|
void ChatStyle::assignPalette(not_null<const style::palette*> palette) {
|
|
*static_cast<style::palette*>(this) = *palette;
|
|
style::internal::resetIcons();
|
|
for (auto &style : _messageStyles) {
|
|
style.corners = {};
|
|
}
|
|
}
|
|
|
|
const MessageStyle &ChatStyle::messageStyle(bool outbg, bool selected) const {
|
|
auto &result = messageStyleRaw(outbg, selected);
|
|
if (result.corners.p[0].isNull()) {
|
|
result.corners = Ui::PrepareCornerPixmaps(
|
|
st::historyMessageRadius,
|
|
result.msgBg,
|
|
&result.msgShadow);
|
|
}
|
|
return result;
|
|
}
|
|
|
|
MessageStyle &ChatStyle::messageStyleRaw(bool outbg, bool selected) const {
|
|
return _messageStyles[(outbg ? 2 : 0) + (selected ? 1 : 0)];
|
|
}
|
|
|
|
void ChatStyle::icon(style::icon &my, const style::icon &original) {
|
|
my = original.withPalette(*this);
|
|
}
|
|
|
|
MessageStyle &ChatStyle::messageIn() {
|
|
return messageStyleRaw(false, false);
|
|
}
|
|
|
|
MessageStyle &ChatStyle::messageInSelected() {
|
|
return messageStyleRaw(false, true);
|
|
}
|
|
|
|
MessageStyle &ChatStyle::messageOut() {
|
|
return messageStyleRaw(true, false);
|
|
}
|
|
|
|
MessageStyle &ChatStyle::messageOutSelected() {
|
|
return messageStyleRaw(true, true);
|
|
}
|
|
|
|
void ChatStyle::messageIcon(
|
|
style::icon MessageStyle::*my,
|
|
const style::icon &originalIn,
|
|
const style::icon &originalInSelected,
|
|
const style::icon &originalOut,
|
|
const style::icon &originalOutSelected) {
|
|
icon(messageIn().*my, originalIn);
|
|
icon(messageInSelected().*my, originalInSelected);
|
|
icon(messageOut().*my, originalOut);
|
|
icon(messageOutSelected().*my, originalOutSelected);
|
|
}
|
|
|
|
void ChatStyle::messageColor(
|
|
style::color MessageStyle::*my,
|
|
const style::color &originalIn,
|
|
const style::color &originalInSelected,
|
|
const style::color &originalOut,
|
|
const style::color &originalOutSelected) {
|
|
messageIn().*my = originalIn;
|
|
messageInSelected().*my = originalInSelected;
|
|
messageOut().*my = originalOut;
|
|
messageOutSelected().*my = originalOutSelected;
|
|
}
|
|
|
|
} // namespace Ui
|