static bool CanAckItem(const MapItem &item) { const AirspaceMapItem &as_item = (const AirspaceMapItem &)item; return item.type == MapItem::AIRSPACE && GetAirspaceWarnings() != nullptr && !GetAirspaceWarnings()->GetAckDay(*as_item.airspace); }
// ClearAirspaceWarnings // Clears airspace warnings for the selected airspace void InputEvents::eventClearAirspaceWarnings(gcc_unused const TCHAR *misc) { ProtectedAirspaceWarningManager *airspace_warnings = GetAirspaceWarnings(); if (airspace_warnings != NULL) airspace_warnings->clear_warnings(); }
inline void MapItemListWidget::OnAckClicked() { const AirspaceMapItem &as_item = *(const AirspaceMapItem *) list[GetCursorIndex()]; GetAirspaceWarnings()->AcknowledgeDay(*as_item.airspace); UpdateButtons(); }
bool MainWindow::OnUser(unsigned id) { ProtectedAirspaceWarningManager *airspace_warnings; switch ((Command)id) { case Command::AIRSPACE_WARNING: airspace_warnings = GetAirspaceWarnings(); if (!airspace_warning_pending || airspace_warnings == NULL) return true; airspace_warning_pending = false; if (dlgAirspaceWarningVisible()) /* already visible */ return true; /* un-blank the display, play a sound and show the dialog */ ResetUserIdle(); PlayResource(_T("IDR_WAV_BEEPBWEEP")); dlgAirspaceWarningsShowModal(*this, *airspace_warnings, true); return true; case Command::GPS_UPDATE: UIReceiveSensorData(); return true; case Command::CALCULATED_UPDATE: UIReceiveCalculatedData(); return true; case Command::RESTORE_PAGE: if (restore_page_pending) PageActions::Restore(); return true; case Command::THERMAL_NOTIFICATION: PlayResource(_T("IDR_WAV_CLEAR")); return true; #ifdef ANDROID case Command::CRASH: ShowMessageBox(_T("How embarassing, we're terribly sorry!\n" "Please submit a bug report and " "include the file from the 'crash' directory.\n" "http://bugs.xcsoar.org/newticket\n" "After your report, we'll fix it ASAP."), _T("XCSoar has crashed recently"), MB_OK|MB_ICONERROR); return true; #endif } return false; }
void InputEvents::eventNearestAirspaceDetails(gcc_unused const TCHAR *misc) { const MoreData &basic = CommonInterface::Basic(); const DerivedInfo &calculated = CommonInterface::Calculated(); const ComputerSettings &settings_computer = CommonInterface::GetComputerSettings(); ProtectedAirspaceWarningManager *airspace_warnings = GetAirspaceWarnings(); if (airspace_warnings != NULL && !airspace_warnings->warning_empty()) { // Prevent the dialog from closing itself without active warning // This is relevant if there are only acknowledged airspaces in the list // AutoClose will be reset when the dialog is closed again by hand dlgAirspaceWarningsShowModal(*XCSoarInterface::main_window, *airspace_warnings); return; } const AircraftState aircraft_state = ToAircraftState(basic, calculated); AirspaceVisiblePredicate visible(settings_computer.airspace, CommonInterface::GetMapSettings().airspace, aircraft_state); GlidePolar polar = settings_computer.polar.glide_polar_task; polar.SetMC(max(polar.GetMC(),fixed_one)); AirspaceAircraftPerformanceGlide perf(polar); AirspaceSoonestSort ans(aircraft_state, perf, fixed(1800), visible); const AbstractAirspace* as = ans.find_nearest(airspace_database); if (!as) { return; } dlgAirspaceDetails(*as, airspace_warnings); // clear previous warning if any XCSoarInterface::main_window->popup.Acknowledge(PopupMessage::MSG_AIRSPACE); // TODO code: No control via status data (ala DoStatusMEssage) // - can we change this? // Message::AddMessage(5000, Message::MSG_AIRSPACE, text); }
void AirspaceWarningMonitor::Check() { const auto &calculated = CommonInterface::Calculated(); if (widget == nullptr && calculated.airspace_warnings.latest == last) return; /* there's a new airspace warning */ last = calculated.airspace_warnings.latest; auto *airspace_warnings = GetAirspaceWarnings(); if (airspace_warnings == nullptr) { HideWidget(); return; } if (!HasPointer()) { /* "classic" list-only view for devices without touch screen */ if (dlgAirspaceWarningVisible()) /* already visible */ return; // un-blank the display, play a sound ResetUserIdle(); PlayResource(_T("IDR_WAV_BEEPBWEEP")); // show airspace warnings dialog if (CommonInterface::GetUISettings().enable_airspace_warning_dialog) dlgAirspaceWarningsShowModal(*airspace_warnings, true); return; } const AbstractAirspace *airspace = nullptr; AirspaceWarning::State state; AirspaceInterceptSolution solution; { const ProtectedAirspaceWarningManager::Lease lease(*airspace_warnings); auto w = lease->begin(); if (w != lease->end() && w->IsAckExpired()) { airspace = &w->GetAirspace(); state = w->GetWarningState(); solution = w->GetSolution(); } } if (airspace == nullptr) { HideWidget(); return; } if (CommonInterface::GetUISettings().enable_airspace_warning_dialog) { /* show airspace warning */ if (widget != nullptr) { if (widget->Update(*airspace, state, solution)) return; HideWidget(); } widget = new AirspaceWarningWidget(*this, *airspace_warnings, *airspace, state, solution); PageActions::SetCustomBottom(widget); } // un-blank the display, play a sound ResetUserIdle(); PlayResource(_T("IDR_WAV_BEEPBWEEP")); }
static void OnLookupClicked(gcc_unused WndButton &Sender) { dlgAirspaceSelect(airspace_database, GetAirspaceWarnings()); }
static void OnLookupClicked(gcc_unused WndButton &Sender) { ShowAirspaceListDialog(airspace_database, GetAirspaceWarnings()); }