Skip to content
Snippets Groups Projects
Commit b1707298 authored by Jared Boone's avatar Jared Boone
Browse files

Extract weird range-of-entries algorithm out of view.

parent f8d9cb31
No related branches found
No related tags found
No related merge requests found
...@@ -161,6 +161,28 @@ void AISRecentEntries::truncate_entries() { ...@@ -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) { ...@@ -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.
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++) { for(auto p = range.first; p != range.second; 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 { ...@@ -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: ...@@ -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;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment