Files
AyuGramDesktop/Telegram/SourceFiles/boxes/peer_list_section_headers.cpp
T

89 lines
2.1 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 "boxes/peer_list_section_headers.h"
#include "ui/painter.h"
#include "styles/style_boxes.h"
void PeerListSectionHeaders::rebuild(
int count,
int rowHeight,
Fn<QString(int index)> section) {
_count = count;
_rowHeight = rowHeight;
_total = 0;
_prefix.resize(count);
auto previous = QString();
for (auto i = 0; i != count; ++i) {
const auto letter = section(i);
const auto header = !letter.isEmpty()
&& (i == 0 || letter != previous);
if (header) {
++_total;
}
_prefix[i] = _total;
previous = letter;
}
}
void PeerListSectionHeaders::clear() {
_prefix.clear();
_total = 0;
_count = 0;
}
bool PeerListSectionHeaders::hasHeader(int index) const {
if (index < 0 || index >= int(_prefix.size())) {
return false;
}
return (index == 0)
? (_prefix[0] > 0)
: (_prefix[index] > _prefix[index - 1]);
}
int PeerListSectionHeaders::contentTop(int index) const {
const auto headers = (index >= 0 && index < int(_prefix.size()))
? _prefix[index]
: 0;
return index * _rowHeight + headers * st::contactsSortHeaderHeight;
}
int PeerListSectionHeaders::fullHeight() const {
return _count * _rowHeight + _total * st::contactsSortHeaderHeight;
}
int PeerListSectionHeaders::rowFromY(int y) const {
auto low = 0, high = _count;
while (low < high) {
const auto middle = (low + high) / 2;
if (contentTop(middle) <= y) {
low = middle + 1;
} else {
high = middle;
}
}
const auto index = low - 1;
if (index < 0 || index >= _count) {
return -1;
}
return (y < contentTop(index) + _rowHeight) ? index : -1;
}
void PeerListSectionHeaders::paint(
Painter &p,
int outerWidth,
const QString &text) const {
p.setFont(st::contactsSortHeaderFont);
p.setPen(st::contactsSortHeaderFg);
p.drawTextLeft(
st::contactsSortHeaderPosition.x(),
st::contactsSortHeaderPosition.y(),
outerWidth,
text);
}