mirror of
https://github.com/eried/portapack-mayhem.git
synced 2025-08-07 14:12:31 -04:00
Extract weird range-of-entries algorithm out of view.
This commit is contained in:
parent
f8d9cb318d
commit
b1707298b7
2 changed files with 30 additions and 17 deletions
|
@ -161,6 +161,28 @@ void AISRecentEntries::truncate_entries() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AISRecentEntries::RangeType AISRecentEntries::range_around(
|
||||||
|
ContainerType::const_iterator item, const size_t count
|
||||||
|
) const {
|
||||||
|
auto start = item;
|
||||||
|
auto end = item;
|
||||||
|
size_t i = 0;
|
||||||
|
|
||||||
|
// Move start iterator toward first entry.
|
||||||
|
while( (start != std::begin(entries)) && (i < count / 2) ) {
|
||||||
|
std::advance(start, -1);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Move end iterator toward last entry.
|
||||||
|
while( (end != std::end(entries)) && (i < count) ) {
|
||||||
|
std::advance(end, 1);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return { start, end };
|
||||||
|
}
|
||||||
|
|
||||||
namespace ui {
|
namespace ui {
|
||||||
|
|
||||||
AISRecentEntriesView::AISRecentEntriesView(
|
AISRecentEntriesView::AISRecentEntriesView(
|
||||||
|
@ -207,23 +229,9 @@ void AISRecentEntriesView::paint(Painter& painter) {
|
||||||
selected = std::begin(recent);
|
selected = std::begin(recent);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto start = selected;
|
auto range = recent.range_around(selected, visible_item_count);
|
||||||
auto end = selected;
|
|
||||||
size_t i = 0;
|
|
||||||
|
|
||||||
// Move start iterator toward first entry.
|
for(auto p = range.first; p != range.second; p++) {
|
||||||
while( (start != std::begin(recent)) && (i < visible_item_count / 2) ) {
|
|
||||||
std::advance(start, -1);
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Move end iterator toward last entry.
|
|
||||||
while( (end != std::end(recent)) && (i < visible_item_count) ) {
|
|
||||||
std::advance(end, 1);
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
for(auto p = start; p != end; p++) {
|
|
||||||
const auto& entry = *p;
|
const auto& entry = *p;
|
||||||
const auto is_selected_key = (selected_key == entry.mmsi);
|
const auto is_selected_key = (selected_key == entry.mmsi);
|
||||||
ais_list_item_draw(entry, target_rect, painter, s, (has_focus() && is_selected_key));
|
ais_list_item_draw(entry, target_rect, painter, s, (has_focus() && is_selected_key));
|
||||||
|
|
|
@ -68,7 +68,8 @@ struct AISRecentEntry {
|
||||||
class AISRecentEntries {
|
class AISRecentEntries {
|
||||||
public:
|
public:
|
||||||
using ContainerType = std::list<AISRecentEntry>;
|
using ContainerType = std::list<AISRecentEntry>;
|
||||||
|
using RangeType = std::pair<ContainerType::const_iterator, ContainerType::const_iterator>;
|
||||||
|
|
||||||
void on_packet(const ais::Packet& packet);
|
void on_packet(const ais::Packet& packet);
|
||||||
|
|
||||||
ContainerType::const_reference front() const {
|
ContainerType::const_reference front() const {
|
||||||
|
@ -89,6 +90,10 @@ public:
|
||||||
return entries.empty();
|
return entries.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RangeType range_around(
|
||||||
|
ContainerType::const_iterator, const size_t count
|
||||||
|
) const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
ContainerType entries;
|
ContainerType entries;
|
||||||
const size_t entries_max = 64;
|
const size_t entries_max = 64;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue