void AirspaceSorter::filter_name(AirspaceSelectInfoVector& vec, const unsigned char c) const { MatchChar = c; vec.erase(std::remove_if(vec.begin(), vec.end(), AirspaceNameFilter), vec.end()); }
void AirspaceSorter::sort_name(AirspaceSelectInfoVector& vec) const { std::sort(vec.begin(), vec.end(), AirspaceNameCompare); }
void AirspaceSorter::sort_distance(AirspaceSelectInfoVector& vec) const { std::sort(vec.begin(), vec.end(), AirspaceDistanceCompare); }
void AirspaceSorter::filter_direction(AirspaceSelectInfoVector& vec, const Angle direction) const { Direction = direction; vec.erase(std::remove_if(vec.begin(), vec.end(), AirspaceDirectionFilter), vec.end()); }
static void SortByName(AirspaceSelectInfoVector &vec) { auto compare = [&] (const AirspaceSelectInfo &elem1, const AirspaceSelectInfo &elem2) { return StringCollate(elem1.GetAirspace().GetName(), elem2.GetAirspace().GetName()) < 0; }; std::sort(vec.begin(), vec.end(), compare); }
void AirspaceListWidget::OnActivateItem(unsigned i) { if (items.empty()) { assert(i == 0); return; } assert(i < items.size()); dlgAirspaceDetails(items[i].GetAirspace(), airspace_warnings); }
static void OnAirspaceListEnter(unsigned i) { if (AirspaceSelectInfo.empty()) { assert(i == 0); return; } assert(i < AirspaceSelectInfo.size()); dlgAirspaceDetails(*AirspaceSelectInfo[i].airspace, airspace_warnings); }
static void SortByDistance(AirspaceSelectInfoVector &vec, const GeoPoint &location, const FlatProjection &projection) { auto compare = [&] (const AirspaceSelectInfo &elem1, const AirspaceSelectInfo &elem2) { return elem1.GetVector(location, projection).distance < elem2.GetVector(location, projection).distance; }; std::sort(vec.begin(), vec.end(), compare); }
void AirspaceListDialog::OnActivateItem(unsigned i) { if (airspace_list.empty()) { assert(i == 0); return; } assert(i < airspace_list.size()); dlgAirspaceDetails(airspace_list[i].GetAirspace(), airspace_warnings); }
static void UpdateList() { AirspaceFilterData data; data.Clear(); if (dialog_state.type != WILDCARD) data.cls = (AirspaceClass)dialog_state.type; const TCHAR *name_filter = name_control->GetDataField()->GetAsString(); if (!StringIsEmpty(name_filter)) data.name_prefix = name_filter; if (dialog_state.direction != WILDCARD) { data.direction = dialog_state.direction == 0 ? CommonInterface::Basic().attitude.heading : Angle::Degrees(dialog_state.direction); } if (positive(dialog_state.distance)) data.distance = dialog_state.distance; airspace_list = FilterAirspaces(*airspaces, CommonInterface::Basic().location, data); airspace_list_control->SetLength(std::max((size_t)1, airspace_list.size())); airspace_list_control->Invalidate(); }
void AirspaceListWidget::UpdateList() { AirspaceFilterData data; data.Clear(); if (dialog_state.type != WILDCARD) data.cls = (AirspaceClass)dialog_state.type; const TCHAR *name_filter = filter_widget.GetValueString(NAME); if (!StringIsEmpty(name_filter)) data.name_prefix = name_filter; if (dialog_state.direction != WILDCARD) { data.direction = dialog_state.direction == 0 ? CommonInterface::Basic().attitude.heading : Angle::Degrees(dialog_state.direction); } if (positive(dialog_state.distance)) data.distance = dialog_state.distance; items = FilterAirspaces(*airspaces, CommonInterface::Basic().location, data); GetList().SetLength(std::max((size_t)1, items.size())); GetList().Invalidate(); }
static void UpdateList() { AirspaceSelectInfo = airspace_sorter->get_list(); if (TypeFilterIdx != WILDCARD) airspace_sorter->filter_class(AirspaceSelectInfo, (AirspaceClass)TypeFilterIdx); bool sort_distance = false; if (positive(distance_filter)) { sort_distance = true; airspace_sorter->filter_distance(AirspaceSelectInfo, distance_filter); } if (direction_filter != WILDCARD) { sort_distance = true; Angle a = direction_filter == 0 ? CommonInterface::Calculated().heading : Angle::Degrees(fixed(direction_filter)); airspace_sorter->filter_direction(AirspaceSelectInfo, a); } if (sort_distance) { airspace_sorter->sort_distance(AirspaceSelectInfo); } const TCHAR *name_filter = wpName->GetDataField()->GetAsString(); if (!StringIsEmpty(name_filter)) airspace_sorter->FilterNamePrefix(AirspaceSelectInfo, name_filter); wAirspaceList->SetLength(max((size_t)1, AirspaceSelectInfo.size())); wAirspaceList->invalidate(); }
static void OnPaintListItem(Canvas &canvas, const PixelRect rc, unsigned i) { if (AirspaceSelectInfo.empty()) { assert(i == 0); canvas.text(rc.left + Layout::FastScale(2), rc.top + Layout::FastScale(2), _("No Match!")); return; } assert(i < AirspaceSelectInfo.size()); const AbstractAirspace &airspace = *AirspaceSelectInfo[i].airspace; int w0, w1, w2, w3, x1, x2, x3; w0 = rc.right - rc.left - Layout::FastScale(4); w1 = canvas.CalcTextWidth(_T("XXX")); w2 = canvas.CalcTextWidth(_T(" 000km")); w3 = canvas.CalcTextWidth(_T(" 000")_T(DEG)); x1 = w0-w1-w2-w3; canvas.text_clipped(rc.left + Layout::FastScale(2), rc.top + Layout::FastScale(2), x1 - Layout::FastScale(5), airspace.GetNameText().c_str()); // left justified canvas.text(rc.left + x1, rc.top + Layout::FastScale(2), airspace.GetTypeText(true)); StaticString<12> sTmp; // right justified after airspace type sTmp.Format(_T("%d%s"), (int)AirspaceSelectInfo[i].Distance, Units::GetDistanceName()); x2 = w0 - w3 - canvas.CalcTextWidth(sTmp); canvas.text(rc.left + x2, rc.top + Layout::FastScale(2), sTmp); // right justified after distance FormatBearing(sTmp.buffer(), sTmp.MAX_SIZE, AirspaceSelectInfo[i].Direction); x3 = w0 - canvas.CalcTextWidth(sTmp); canvas.text(rc.left + x3, rc.top + Layout::FastScale(2), sTmp); }
void AirspaceListWidget::OnPaintItem(Canvas &canvas, const PixelRect rc, unsigned i) { if (items.empty()) { assert(i == 0); canvas.DrawText(rc.left + Layout::GetTextPadding(), rc.top + Layout::GetTextPadding(), _("No Match!")); return; } assert(i < items.size()); const AbstractAirspace &airspace = items[i].GetAirspace(); AirspaceListRenderer::Draw( canvas, rc, airspace, items[i].GetVector(location, airspaces->GetProjection()), UIGlobals::GetDialogLook(), UIGlobals::GetMapLook().airspace, CommonInterface::GetMapSettings().airspace); }
virtual void Visit(const AbstractAirspace &as) { if (filter.Match(location, projection, as)) result.push_back(as); }
void Visit(const AbstractAirspace &as) override { if (filter.Match(location, projection, as)) result.emplace_back(as); }
void AirspaceSorter::filter_distance(AirspaceSelectInfoVector& vec, const fixed distance) const { MaxDistance = distance; vec.erase(std::remove_if(vec.begin(), vec.end(), AirspaceDistanceFilter), vec.end()); }
void AirspaceSorter::filter_class(AirspaceSelectInfoVector& vec, const AirspaceClass_t t) const { MatchClass = t; vec.erase(std::remove_if(vec.begin(), vec.end(), AirspaceClassFilter), vec.end()); }