示例#1
0
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());
}
示例#2
0
void 
AirspaceSorter::sort_name(AirspaceSelectInfoVector& vec) const
{
  std::sort(vec.begin(),
            vec.end(),
            AirspaceNameCompare);
}
示例#3
0
void 
AirspaceSorter::sort_distance(AirspaceSelectInfoVector& vec) const
{
  std::sort(vec.begin(),
            vec.end(),
            AirspaceDistanceCompare);
}
示例#4
0
void 
AirspaceSorter::filter_direction(AirspaceSelectInfoVector& vec, 
                                 const Angle direction) const
{
  Direction = direction;
  vec.erase(std::remove_if(vec.begin(), vec.end(), AirspaceDirectionFilter), 
            vec.end());
}
示例#5
0
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);
}
示例#7
0
static void
OnAirspaceListEnter(unsigned i)
{
    if (AirspaceSelectInfo.empty()) {
        assert(i == 0);
        return;
    }

    assert(i < AirspaceSelectInfo.size());

    dlgAirspaceDetails(*AirspaceSelectInfo[i].airspace, airspace_warnings);
}
示例#8
0
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);
}
示例#9
0
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);
}
示例#10
0
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();
}
示例#12
0
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();
}
示例#13
0
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);
}
示例#15
0
 virtual void Visit(const AbstractAirspace &as) {
   if (filter.Match(location, projection, as))
     result.push_back(as);
 }
示例#16
0
 void Visit(const AbstractAirspace &as) override {
   if (filter.Match(location, projection, as))
     result.emplace_back(as);
 }
示例#17
0
void 
AirspaceSorter::filter_distance(AirspaceSelectInfoVector& vec, const fixed distance) const
{
  MaxDistance = distance;
  vec.erase(std::remove_if(vec.begin(), vec.end(), AirspaceDistanceFilter), vec.end());
}
示例#18
0
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());
}