mirror of
https://github.com/AyuGram/AyuGramDesktop.git
synced 2025-07-27 16:03:03 +02:00
Improve adaptive loading in subsection tabs.
This commit is contained in:
parent
d25356917d
commit
e92adf94a7
2 changed files with 44 additions and 27 deletions
|
@ -241,45 +241,24 @@ void SubsectionTabs::setupSlider(
|
||||||
: scroll->scrollLeftMax();
|
: scroll->scrollLeftMax();
|
||||||
const auto availableFrom = scrollValue;
|
const auto availableFrom = scrollValue;
|
||||||
const auto availableTill = (scrollMax - scrollValue);
|
const auto availableTill = (scrollMax - scrollValue);
|
||||||
if (scrollMax <= 3 * full && _afterAvailable > 0) {
|
const auto needMore = (scrollMax <= 3 * full && _afterAvailable > 0);
|
||||||
|
if (needMore) {
|
||||||
_beforeLimit *= 2;
|
_beforeLimit *= 2;
|
||||||
_afterLimit *= 2;
|
_afterLimit *= 2;
|
||||||
}
|
}
|
||||||
const auto findMiddle = [&] {
|
|
||||||
Expects(!_slice.empty());
|
|
||||||
|
|
||||||
auto best = -1;
|
|
||||||
auto bestDistance = -1;
|
|
||||||
const auto ideal = scrollValue + (full / 2);
|
|
||||||
for (auto i = 0, count = int(_slice.size()); i != count; ++i) {
|
|
||||||
const auto a = slider->lookupSectionPosition(i);
|
|
||||||
const auto b = (i + 1 == count)
|
|
||||||
? (full + scrollMax)
|
|
||||||
: slider->lookupSectionPosition(i + 1);
|
|
||||||
const auto middle = (a + b) / 2;
|
|
||||||
const auto distance = std::abs(middle - ideal);
|
|
||||||
if (best < 0 || distance < bestDistance) {
|
|
||||||
best = i;
|
|
||||||
bestDistance = distance;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Ensures(best >= 0);
|
|
||||||
return best;
|
|
||||||
};
|
|
||||||
if (availableFrom < full
|
if (availableFrom < full
|
||||||
&& _beforeSkipped.value_or(0) > 0
|
&& _beforeSkipped.value_or(0) > 0
|
||||||
&& !_slice.empty()) {
|
&& !_slice.empty()) {
|
||||||
_around = _slice[findMiddle()].thread;
|
refreshAroundMiddle(scroll, slider);
|
||||||
refreshSlice();
|
|
||||||
} else if (availableTill < full) {
|
} else if (availableTill < full) {
|
||||||
if (_afterAvailable > 0) {
|
if (_afterAvailable > 0) {
|
||||||
_around = _slice[findMiddle()].thread;
|
refreshAroundMiddle(scroll, slider);
|
||||||
refreshSlice();
|
|
||||||
} else if (!_afterSkipped.has_value()) {
|
} else if (!_afterSkipped.has_value()) {
|
||||||
_loading = true;
|
_loading = true;
|
||||||
loadMore();
|
loadMore();
|
||||||
}
|
}
|
||||||
|
} else if (needMore) {
|
||||||
|
refreshAroundMiddle(scroll, slider);
|
||||||
}
|
}
|
||||||
}, scroll->lifetime());
|
}, scroll->lifetime());
|
||||||
|
|
||||||
|
@ -641,6 +620,41 @@ void SubsectionTabs::track() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SubsectionTabs::refreshAroundMiddle(
|
||||||
|
not_null<Ui::ScrollArea*> scroll,
|
||||||
|
not_null<Ui::SubsectionSlider*> slider) {
|
||||||
|
Expects(!_slice.empty());
|
||||||
|
|
||||||
|
const auto full = _vertical ? scroll->height() : scroll->width();
|
||||||
|
const auto scrollValue = _vertical
|
||||||
|
? scroll->scrollTop()
|
||||||
|
: scroll->scrollLeft();
|
||||||
|
const auto scrollMax = _vertical
|
||||||
|
? scroll->scrollTopMax()
|
||||||
|
: scroll->scrollLeftMax();
|
||||||
|
|
||||||
|
auto best = -1;
|
||||||
|
auto bestDistance = -1;
|
||||||
|
const auto ideal = scrollValue + (full / 2);
|
||||||
|
for (auto i = 0, count = int(_slice.size()); i != count; ++i) {
|
||||||
|
const auto a = slider->lookupSectionPosition(i);
|
||||||
|
const auto b = (i + 1 == count)
|
||||||
|
? (full + scrollMax)
|
||||||
|
: slider->lookupSectionPosition(i + 1);
|
||||||
|
const auto middle = (a + b) / 2;
|
||||||
|
const auto distance = std::abs(middle - ideal);
|
||||||
|
if (best < 0 || distance < bestDistance) {
|
||||||
|
best = i;
|
||||||
|
bestDistance = distance;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Assert(best >= 0 && best < _slice.size());
|
||||||
|
|
||||||
|
_around = _slice[best].thread;
|
||||||
|
refreshSlice();
|
||||||
|
}
|
||||||
|
|
||||||
void SubsectionTabs::refreshSlice() {
|
void SubsectionTabs::refreshSlice() {
|
||||||
_refreshScheduled = false;
|
_refreshScheduled = false;
|
||||||
|
|
||||||
|
|
|
@ -83,6 +83,9 @@ private:
|
||||||
void toggleModes();
|
void toggleModes();
|
||||||
void setVisible(bool shown);
|
void setVisible(bool shown);
|
||||||
void refreshSlice();
|
void refreshSlice();
|
||||||
|
void refreshAroundMiddle(
|
||||||
|
not_null<Ui::ScrollArea*> scroll,
|
||||||
|
not_null<Ui::SubsectionSlider*> slider);
|
||||||
void scheduleRefresh();
|
void scheduleRefresh();
|
||||||
void loadMore();
|
void loadMore();
|
||||||
void setup(not_null<Ui::RpWidget*> parent);
|
void setup(not_null<Ui::RpWidget*> parent);
|
||||||
|
|
Loading…
Add table
Reference in a new issue