Replaced MatrixRowShift with layout utils.

This commit is contained in:
23rd 2021-07-23 02:11:27 +03:00 committed by John Preston
parent a153059b38
commit 73bb1382b1
4 changed files with 32 additions and 27 deletions

View File

@ -14,6 +14,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "ui/ui_utility.h" #include "ui/ui_utility.h"
#include "ui/cached_round_corners.h" #include "ui/cached_round_corners.h"
#include "lang/lang_keys.h" #include "lang/lang_keys.h"
#include "layout/layout_utils.h"
#include "emoji_suggestions_data.h" #include "emoji_suggestions_data.h"
#include "emoji_suggestions_helper.h" #include "emoji_suggestions_helper.h"
#include "main/main_session.h" #include "main/main_session.h"
@ -553,7 +554,12 @@ void EmojiListWidget::paintEvent(QPaintEvent *e) {
auto index = i * _columnCount + j; auto index = i * _columnCount + j;
if (index >= info.count) break; if (index >= info.count) break;
auto selected = (!_picker->isHidden() && info.section * MatrixRowShift + index == _pickerSel) || (info.section * MatrixRowShift + index == _selected); const auto selectedIndex = Layout::PositionToIndex(
info.section,
index);
auto selected = (selectedIndex == _selected)
|| (!_picker->isHidden()
&& selectedIndex == _pickerSel);
auto w = QPoint(_rowsLeft + j * _singleSize.width(), info.rowsTop + i * _singleSize.height()); auto w = QPoint(_rowsLeft + j * _singleSize.width(), info.rowsTop + i * _singleSize.height());
if (selected) { if (selected) {
@ -593,8 +599,7 @@ void EmojiListWidget::mousePressEvent(QMouseEvent *e) {
_pressedSel = _selected; _pressedSel = _selected;
if (_selected >= 0) { if (_selected >= 0) {
auto section = (_selected / MatrixRowShift); const auto &[section, sel] = Layout::IndexToPosition(_selected);
auto sel = _selected % MatrixRowShift;
if (section < kEmojiSectionCount if (section < kEmojiSectionCount
&& sel < _emoji[section].size() && sel < _emoji[section].size()
&& _emoji[section][sel]->hasVariants()) { && _emoji[section][sel]->hasVariants()) {
@ -619,8 +624,7 @@ void EmojiListWidget::mouseReleaseEvent(QMouseEvent *e) {
if (_picker->rect().contains(_picker->mapFromGlobal(_lastMousePos))) { if (_picker->rect().contains(_picker->mapFromGlobal(_lastMousePos))) {
return _picker->handleMouseRelease(QCursor::pos()); return _picker->handleMouseRelease(QCursor::pos());
} else if (_pickerSel >= 0) { } else if (_pickerSel >= 0) {
auto section = (_pickerSel / MatrixRowShift); const auto &[section, sel] = Layout::IndexToPosition(_pickerSel);
auto sel = _pickerSel % MatrixRowShift;
if (section < kEmojiSectionCount if (section < kEmojiSectionCount
&& sel < _emoji[section].size() && sel < _emoji[section].size()
&& _emoji[section][sel]->hasVariants()) { && _emoji[section][sel]->hasVariants()) {
@ -642,12 +646,11 @@ void EmojiListWidget::mouseReleaseEvent(QMouseEvent *e) {
if (_selected < 0 || _selected != pressed) return; if (_selected < 0 || _selected != pressed) return;
if (_selected >= kEmojiSectionCount * MatrixRowShift) { if (_selected >= Layout::PositionToIndex(kEmojiSectionCount, 0)) {
return; return;
} }
auto section = (_selected / MatrixRowShift); const auto &[section, sel] = Layout::IndexToPosition(_selected);
auto sel = _selected % MatrixRowShift;
if (sel < _emoji[section].size()) { if (sel < _emoji[section].size()) {
auto emoji = _emoji[section][sel]; auto emoji = _emoji[section][sel];
if (emoji->hasVariants() && !_picker->isHidden()) return; if (emoji->hasVariants() && !_picker->isHidden()) return;
@ -664,8 +667,7 @@ void EmojiListWidget::selectEmoji(EmojiPtr emoji) {
void EmojiListWidget::showPicker() { void EmojiListWidget::showPicker() {
if (_pickerSel < 0) return; if (_pickerSel < 0) return;
auto section = (_pickerSel / MatrixRowShift); const auto &[section, sel] = Layout::IndexToPosition(_pickerSel);
auto sel = _pickerSel % MatrixRowShift;
if (section < kEmojiSectionCount && sel < _emoji[section].size() && _emoji[section][sel]->hasVariants()) { if (section < kEmojiSectionCount && sel < _emoji[section].size() && _emoji[section][sel]->hasVariants()) {
_picker->showEmoji(_emoji[section][sel]); _picker->showEmoji(_emoji[section][sel]);
@ -708,8 +710,7 @@ void EmojiListWidget::colorChosen(EmojiPtr emoji) {
Core::App().settings().saveEmojiVariant(emoji); Core::App().settings().saveEmojiVariant(emoji);
} }
if (_pickerSel >= 0) { if (_pickerSel >= 0) {
auto section = (_pickerSel / MatrixRowShift); const auto &[section, sel] = Layout::IndexToPosition(_pickerSel);
auto sel = _pickerSel % MatrixRowShift;
if (section >= 0 && section < kEmojiSectionCount) { if (section >= 0 && section < kEmojiSectionCount) {
_emoji[section][sel] = emoji; _emoji[section][sel] = emoji;
rtlupdate(emojiRect(section, sel)); rtlupdate(emojiRect(section, sel));
@ -756,8 +757,7 @@ Ui::Emoji::Section EmojiListWidget::currentSection(int yOffset) const {
QString EmojiListWidget::tooltipText() const { QString EmojiListWidget::tooltipText() const {
const auto &replacements = Ui::Emoji::internal::GetAllReplacements(); const auto &replacements = Ui::Emoji::internal::GetAllReplacements();
const auto section = (_selected / MatrixRowShift); const auto &[section, sel] = Layout::IndexToPosition(_selected);
const auto sel = _selected % MatrixRowShift;
if (_selected >= 0 && section < kEmojiSectionCount && sel < _emoji[section].size()) { if (_selected >= 0 && section < kEmojiSectionCount && sel < _emoji[section].size()) {
const auto emoji = _emoji[section][sel]->original(); const auto emoji = _emoji[section][sel]->original();
const auto text = emoji->text(); const auto text = emoji->text();
@ -822,7 +822,7 @@ void EmojiListWidget::updateSelected() {
if (newSelected >= _emoji[info.section].size()) { if (newSelected >= _emoji[info.section].size()) {
newSelected = -1; newSelected = -1;
} else { } else {
newSelected += info.section * MatrixRowShift; newSelected += Layout::PositionToIndex(info.section, 0);
} }
} }
} }
@ -835,8 +835,11 @@ void EmojiListWidget::setSelected(int newSelected) {
return; return;
} }
auto updateSelected = [this]() { auto updateSelected = [this]() {
if (_selected < 0) return; if (_selected < 0) {
rtlupdate(emojiRect(_selected / MatrixRowShift, _selected % MatrixRowShift)); return;
}
const auto &[section, sel] = Layout::IndexToPosition(_selected);
rtlupdate(emojiRect(section, sel));
}; };
updateSelected(); updateSelected();
_selected = newSelected; _selected = newSelected;

View File

@ -121,8 +121,6 @@ void memset_rand(void *data, uint32 len);
QString translitRusEng(const QString &rus); QString translitRusEng(const QString &rus);
QString rusKeyboardLayoutSwitch(const QString &from); QString rusKeyboardLayoutSwitch(const QString &from);
static const int MatrixRowShift = 40000;
inline int rowscount(int fullCount, int countPerRow) { inline int rowscount(int fullCount, int countPerRow) {
return (fullCount + countPerRow - 1) / countPerRow; return (fullCount + countPerRow - 1) / countPerRow;
} }

View File

@ -17,6 +17,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "history/view/history_view_service_message.h" #include "history/view/history_view_service_message.h"
#include "history/view/media/history_view_document.h" #include "history/view/media/history_view_document.h"
#include "core/click_handler_types.h" #include "core/click_handler_types.h"
#include "layout/layout_utils.h"
#include "mainwindow.h" #include "mainwindow.h"
#include "media/audio/media_audio.h" #include "media/audio/media_audio.h"
#include "media/player/media_player_instance.h" #include "media/player/media_player_instance.h"
@ -723,7 +724,7 @@ void ReplyKeyboard::clickHandlerPressedChanged(
void ReplyKeyboard::startAnimation(int i, int j, int direction) { void ReplyKeyboard::startAnimation(int i, int j, int direction) {
auto notStarted = _animations.empty(); auto notStarted = _animations.empty();
int indexForAnimation = (i * MatrixRowShift + j + 1) * direction; int indexForAnimation = Layout::PositionToIndex(i, j + 1) * direction;
_animations.remove(-indexForAnimation); _animations.remove(-indexForAnimation);
if (!_animations.contains(indexForAnimation)) { if (!_animations.contains(indexForAnimation)) {
@ -741,8 +742,7 @@ bool ReplyKeyboard::selectedAnimationCallback(crl::time now) {
} }
for (auto i = _animations.begin(); i != _animations.end();) { for (auto i = _animations.begin(); i != _animations.end();) {
const auto index = std::abs(i->first) - 1; const auto index = std::abs(i->first) - 1;
const auto row = (index / MatrixRowShift); const auto &[row, col] = Layout::IndexToPosition(index);
const auto col = index % MatrixRowShift;
const auto dt = float64(now - i->second) / st::botKbDuration; const auto dt = float64(now - i->second) / st::botKbDuration;
if (dt >= 1) { if (dt >= 1) {
_rows[row][col].howMuchOver = (i->first > 0) ? 1 : 0; _rows[row][col].howMuchOver = (i->first > 0) ? 1 : 0;
@ -759,8 +759,7 @@ bool ReplyKeyboard::selectedAnimationCallback(crl::time now) {
void ReplyKeyboard::clearSelection() { void ReplyKeyboard::clearSelection() {
for (const auto &[relativeIndex, time] : _animations) { for (const auto &[relativeIndex, time] : _animations) {
const auto index = std::abs(relativeIndex) - 1; const auto index = std::abs(relativeIndex) - 1;
const auto row = (index / MatrixRowShift); const auto &[row, col] = Layout::IndexToPosition(index);
const auto col = index % MatrixRowShift;
_rows[row][col].howMuchOver = 0; _rows[row][col].howMuchOver = 0;
} }
_animations.clear(); _animations.clear();

View File

@ -8,15 +8,20 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "layout/layout_utils.h" #include "layout/layout_utils.h"
namespace Layout { namespace Layout {
namespace {
constexpr auto kMatrixRowShift = 40000;
} // namespace
Layout::Position IndexToPosition(int index) { Layout::Position IndexToPosition(int index) {
return { return {
(index >= 0) ? (index / MatrixRowShift) : -1, (index >= 0) ? (index / kMatrixRowShift) : -1,
(index >= 0) ? (index % MatrixRowShift) : -1 }; (index >= 0) ? (index % kMatrixRowShift) : -1 };
} }
int PositionToIndex(int row, int column) { int PositionToIndex(int row, int column) {
return row * MatrixRowShift + column; return row * kMatrixRowShift + column;
} }
int PositionToIndex(const Layout::Position &position) { int PositionToIndex(const Layout::Position &position) {