init
Some checks failed
Docker. / Ubuntu (push) Has been cancelled
User-agent updater. / User-agent (push) Failing after 15s
Lock Threads / lock (push) Failing after 10s
Waiting for answer. / waiting-for-answer (push) Failing after 22s
Needs user action. / needs-user-action (push) Failing after 8s
Can't reproduce. / cant-reproduce (push) Failing after 8s
Close stale issues and PRs / stale (push) Has been cancelled
Some checks failed
Docker. / Ubuntu (push) Has been cancelled
User-agent updater. / User-agent (push) Failing after 15s
Lock Threads / lock (push) Failing after 10s
Waiting for answer. / waiting-for-answer (push) Failing after 22s
Needs user action. / needs-user-action (push) Failing after 8s
Can't reproduce. / cant-reproduce (push) Failing after 8s
Close stale issues and PRs / stale (push) Has been cancelled
This commit is contained in:
90
Telegram/lib_ui/ui/text/text_word.h
Normal file
90
Telegram/lib_ui/ui/text/text_word.h
Normal file
@@ -0,0 +1,90 @@
|
||||
// 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 "base/basic_types.h"
|
||||
|
||||
#include <private/qfixed_p.h>
|
||||
|
||||
namespace Ui::Text {
|
||||
|
||||
class Word final {
|
||||
public:
|
||||
Word() = default;
|
||||
Word( // !newline
|
||||
uint16 position,
|
||||
bool unfinished,
|
||||
QFixed width,
|
||||
QFixed rbearing)
|
||||
: _position(position)
|
||||
, _rbearing_modulus(std::min(std::abs(rbearing.value()), 0x7FFF))
|
||||
, _rbearing_positive(rbearing.value() > 0 ? 1 : 0)
|
||||
, _unfinished(unfinished ? 1 : 0)
|
||||
, _qfixedwidth(width.value()) {
|
||||
}
|
||||
Word(uint16 position, int newlineBlockIndex)
|
||||
: _position(position)
|
||||
, _newline(1)
|
||||
, _newlineBlockIndex(newlineBlockIndex) {
|
||||
}
|
||||
|
||||
[[nodiscard]] bool newline() const {
|
||||
return _newline != 0;
|
||||
}
|
||||
[[nodiscard]] int newlineBlockIndex() const {
|
||||
return _newline ? _newlineBlockIndex : 0;
|
||||
}
|
||||
[[nodiscard]] bool unfinished() const {
|
||||
return _unfinished != 0;
|
||||
}
|
||||
|
||||
[[nodiscard]] uint16 position() const {
|
||||
return _position;
|
||||
}
|
||||
[[nodiscard]] QFixed f_rbearing() const {
|
||||
return QFixed::fromFixed(
|
||||
int(_rbearing_modulus) * (_rbearing_positive ? 1 : -1));
|
||||
}
|
||||
[[nodiscard]] QFixed f_width() const {
|
||||
return _newline ? 0 : QFixed::fromFixed(_qfixedwidth);
|
||||
}
|
||||
[[nodiscard]] QFixed f_rpadding() const {
|
||||
return _rpadding;
|
||||
}
|
||||
|
||||
void add_rpadding(QFixed padding) {
|
||||
_rpadding += padding;
|
||||
}
|
||||
|
||||
private:
|
||||
uint16 _position = 0;
|
||||
uint16 _rbearing_modulus : 13 = 0;
|
||||
uint16 _rbearing_positive : 1 = 0;
|
||||
uint16 _unfinished : 1 = 0;
|
||||
uint16 _newline : 1 = 0;
|
||||
|
||||
// Right padding: spaces after the last content of the block (like a word).
|
||||
// This holds spaces after the end of the block, for example a text ending
|
||||
// with a space before a link has started. If text block has a leading spaces
|
||||
// (for example a text block after a link block) it is prepended with an empty
|
||||
// word that holds those spaces as a right padding.
|
||||
QFixed _rpadding;
|
||||
|
||||
union {
|
||||
int _qfixedwidth;
|
||||
int _newlineBlockIndex;
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
using Words = std::vector<Word>;
|
||||
|
||||
[[nodiscard]] inline uint16 CountPosition(Words::const_iterator i) {
|
||||
return i->position();
|
||||
}
|
||||
|
||||
} // namespace Ui::Text
|
||||
Reference in New Issue
Block a user