예제 #1
0
void
InputEvents::eventAddWaypoint(const TCHAR *misc)
{
  const NMEAInfo &basic = CommonInterface::Basic();
  const DerivedInfo &calculated = CommonInterface::Calculated();

  if (StringIsEqual(misc, _T("takeoff"))) {
    if (basic.location_available && calculated.terrain_valid) {
      ScopeSuspendAllThreads suspend;
      way_points.AddTakeoffPoint(basic.location, calculated.terrain_altitude);
      way_points.Optimise();
    }
  } else {
    Waypoint edit_waypoint = way_points.Create(basic.location);
    edit_waypoint.elevation = calculated.terrain_altitude;
    if (!dlgWaypointEditShowModal(edit_waypoint) || edit_waypoint.name.empty()) {
      trigger_redraw();
      return;
    }

    SuspendAppendSaveWaypoint(std::move(edit_waypoint));
  }

  trigger_redraw();
}
예제 #2
0
// TaskLoad
// Loads the task of the specified filename
void
InputEvents::eventTaskLoad(const TCHAR *misc)
{
  if (protected_task_manager == NULL)
    return;

  if (!StringIsEmpty(misc)) {
    TCHAR buffer[MAX_PATH];
    LocalPath(buffer, misc);

    OrderedTask *task = TaskFile::GetTask(buffer,
                                          CommonInterface::GetComputerSettings().task,
                                          &way_points, 0);
    if (task) {
      {
        ScopeSuspendAllThreads suspend;
        task->CheckDuplicateWaypoints(way_points);
        way_points.Optimise();
      }

      task->FillMatPoints(way_points);
      protected_task_manager->TaskCommit(*task);
      delete task;
    }
  }

  trigger_redraw();
}
예제 #3
0
void
InputEvents::eventCalculator(gcc_unused const TCHAR *misc)
{
  dlgTaskManagerShowModal(UIGlobals::GetMainWindow());

  trigger_redraw();
}
예제 #4
0
void
InputEvents::eventCalculator(gcc_unused const TCHAR *misc)
{
  dlgTaskManagerShowModal();

  trigger_redraw();
}
예제 #5
0
// AdjustWaypoint
// Adjusts the active waypoint of the task
//  next: selects the next waypoint, stops at final waypoint
//  previous: selects the previous waypoint, stops at start waypoint
//  nextwrap: selects the next waypoint, wrapping back to start after final
//  previouswrap: selects the previous waypoint, wrapping to final after start
void
InputEvents::eventAdjustWaypoint(const TCHAR *misc)
{
  if (protected_task_manager == NULL)
    return;

  if (StringIsEqual(misc, _T("next")))
    protected_task_manager->IncrementActiveTaskPoint(1); // next
  else if (StringIsEqual(misc, _T("nextwrap")))
    protected_task_manager->IncrementActiveTaskPoint(1); // next - with wrap
  else if (StringIsEqual(misc, _T("previous")))
    protected_task_manager->IncrementActiveTaskPoint(-1); // previous
  else if (StringIsEqual(misc, _T("previouswrap")))
    protected_task_manager->IncrementActiveTaskPoint(-1); // previous with wrap
  else if (StringIsEqual(misc, _T("nextarm")))
    protected_task_manager->IncrementActiveTaskPointArm(1); // arm sensitive next
  else if (StringIsEqual(misc, _T("previousarm")))
    protected_task_manager->IncrementActiveTaskPointArm(-1); // arm sensitive previous

  {
    /* quickly propagate the updated values from the TaskManager to
       the InterfaceBlackboard, so they are available immediately */
    ProtectedTaskManager::ExclusiveLease tm(*protected_task_manager);
    tm->UpdateCommonStatsTask();
    CommonInterface::ReadCommonStats(tm->GetCommonStats());
  }

  trigger_redraw();
}
예제 #6
0
// Setup
// Activates configuration and setting dialogs
//  Basic: Basic settings (QNH/Bugs/Ballast/MaxTemperature)
//  Wind: Wind settings
//  Task: Task editor
//  Airspace: Airspace filter settings
//  Replay: IGC replay dialog
void
InputEvents::eventSetup(const TCHAR *misc)
{
  if (StringIsEqual(misc, _T("Basic")))
    dlgBasicSettingsShowModal();
  else if (StringIsEqual(misc, _T("Wind")))
    ShowWindSettingsDialog();
  else if (StringIsEqual(misc, _T("System")))
    SystemConfiguration();
  else if (StringIsEqual(misc, _T("Task")))
    dlgTaskManagerShowModal();
  else if (StringIsEqual(misc, _T("Airspace")))
    dlgAirspaceShowModal(false);
  else if (StringIsEqual(misc, _T("Weather")))
    ShowWeatherDialog(_T("rasp"));
  else if (StringIsEqual(misc, _T("Replay"))) {
    if (!CommonInterface::MovementDetected())
      ShowReplayDialog();
  } else if (StringIsEqual(misc, _T("Switches")))
    dlgSwitchesShowModal();
  else if (StringIsEqual(misc, _T("Teamcode")))
    dlgTeamCodeShowModal();
  else if (StringIsEqual(misc, _T("Target")))
    dlgTargetShowModal();
  else if (StringIsEqual(misc, _T("Plane")))
    dlgPlanesShowModal();
  else if (StringIsEqual(misc, _T("Profile")))
    ProfileListDialog();
  else if (StringIsEqual(misc, _T("Alternates")))
    dlgAlternatesListShowModal();

  trigger_redraw();
}
예제 #7
0
void
view_helper_set_x(ViewHelper *self, float x)
{
    if (self->x == x)
        return;

    self->x = x;
    update_autoscale(self);
    trigger_redraw(self, NULL);
}
예제 #8
0
void
view_helper_set_scale(ViewHelper *self, float scale)
{
    if (self->scale == scale)
        return;

    self->scale = scale;
    update_autoscale(self);
    trigger_redraw(self, NULL);
}
예제 #9
0
void
view_helper_set_y(ViewHelper *self, float y)
{
    if (self->y == y)
        return;

    self->y = y;
    update_autoscale(self);
    trigger_redraw(self, NULL);
}
예제 #10
0
// AbortTask
// Allows aborting and resuming of tasks
// abort: aborts the task if active
// resume: resumes the task if aborted
// toggle: toggles between abort and resume
// show: displays a status message showing the task abort status
void
InputEvents::eventAbortTask(const TCHAR *misc)
{
  if (protected_task_manager == NULL)
    return;

  ProtectedTaskManager::ExclusiveLease task_manager(*protected_task_manager);

  if (StringIsEqual(misc, _T("abort")))
    task_manager->Abort();
  else if (StringIsEqual(misc, _T("resume")))
    task_manager->Resume();
  else if (StringIsEqual(misc, _T("show"))) {
    switch (task_manager->GetMode()) {
    case TaskType::ABORT:
      Message::AddMessage(_("Task aborted"));
      break;
    case TaskType::GOTO:
      Message::AddMessage(_("Go to target"));
      break;
    case TaskType::ORDERED:
      Message::AddMessage(_("Ordered task"));
      break;
    default:
      Message::AddMessage(_("No task"));
    }
  } else {
    // toggle
    switch (task_manager->GetMode()) {
    case TaskType::NONE:
    case TaskType::ORDERED:
      task_manager->Abort();
      break;
    case TaskType::GOTO:
      if (task_manager->CheckOrderedTask()) {
        task_manager->Resume();
      } else {
        task_manager->Abort();
      }
      break;
    case TaskType::ABORT:
      task_manager->Resume();
      break;
    }
  }

  /* quickly propagate the updated values from the TaskManager to the
     InterfaceBlackboard, so they are available immediately */
  task_manager->UpdateCommonStatsTask();
  CommonInterface::ReadCommonStats(task_manager->GetCommonStats());

  trigger_redraw();
}
예제 #11
0
/* When the GeglNode has been computed,
 * find out if the size of the vie changed and
 * emit the "size-changed" signal to notify view
 * find out which area in the view was computed and emit the
 * "redraw-needed" signal to notify it that a redraw is needed */
static void
computed_event(GeglNode      *node,
               GeglRectangle *rect,
               ViewHelper    *self)
{
    update_autoscale(self);

    /* Emit redraw-needed */
    GeglRectangle redraw_rect = *rect;
    model_rect_to_view_rect(self, &redraw_rect);

    trigger_redraw(self, &redraw_rect);
}
예제 #12
0
void
InputEvents::eventGotoLookup(gcc_unused const TCHAR *misc)
{
  const NMEAInfo &basic = CommonInterface::Basic();

  if (protected_task_manager == NULL)
    return;

  auto wp = ShowWaypointListDialog(basic.location);
  if (wp != NULL) {
    protected_task_manager->DoGoto(std::move(wp));
    trigger_redraw();
  }
}
예제 #13
0
void
InputEvents::eventGotoLookup(gcc_unused const TCHAR *misc)
{
  const NMEAInfo &basic = CommonInterface::Basic();

  if (protected_task_manager == NULL)
    return;

  const Waypoint* wp = dlgWaypointSelect(XCSoarInterface::main_window,
                                         basic.location);
  if (wp != NULL) {
    protected_task_manager->DoGoto(*wp);
    trigger_redraw();
  }
}
예제 #14
0
// AbortTask
// Allows aborting and resuming of tasks
// abort: aborts the task if active
// resume: resumes the task if aborted
// toggle: toggles between abort and resume
// show: displays a status message showing the task abort status
void
InputEvents::eventAbortTask(const TCHAR *misc)
{
  if (protected_task_manager == NULL)
    return;

  ProtectedTaskManager::ExclusiveLease task_manager(*protected_task_manager);

  if (StringIsEqual(misc, _T("abort")))
    task_manager->Abort();
  else if (StringIsEqual(misc, _T("resume")))
    task_manager->Resume();
  else if (StringIsEqual(misc, _T("show"))) {
    switch (task_manager->GetMode()) {
    case TaskManager::MODE_ABORT:
      Message::AddMessage(_("Task aborted"));
      break;
    case TaskManager::MODE_GOTO:
      Message::AddMessage(_("Go to target"));
      break;
    case TaskManager::MODE_ORDERED:
      Message::AddMessage(_("Ordered task"));
      break;
    default:
      Message::AddMessage(_("No task"));
    }
  } else {
    // toggle
    switch (task_manager->GetMode()) {
    case TaskManager::MODE_NULL:
    case TaskManager::MODE_ORDERED:
      task_manager->Abort();
      break;
    case TaskManager::MODE_GOTO:
      if (task_manager->CheckOrderedTask()) {
        task_manager->Resume();
      } else {
        task_manager->Abort();
      }
      break;
    case TaskManager::MODE_ABORT:
      task_manager->Resume();
      break;
    }
  }

  trigger_redraw();
}
예제 #15
0
void
InputEvents::eventAirspaceDisplayMode(const TCHAR *misc)
{
  AirspaceRendererSettings &settings =
    CommonInterface::SetMapSettings().airspace;

  if (StringIsEqual(misc, _T("all")))
    settings.altitude_mode = AirspaceDisplayMode::ALLON;
  else if (StringIsEqual(misc, _T("clip")))
    settings.altitude_mode = AirspaceDisplayMode::CLIP;
  else if (StringIsEqual(misc, _T("auto")))
    settings.altitude_mode = AirspaceDisplayMode::AUTO;
  else if (StringIsEqual(misc, _T("below")))
    settings.altitude_mode = AirspaceDisplayMode::ALLBELOW;
  else if (StringIsEqual(misc, _T("off")))
    settings.altitude_mode = AirspaceDisplayMode::ALLOFF;

  trigger_redraw();
}
예제 #16
0
// AdjustWaypoint
// Adjusts the active waypoint of the task
//  next: selects the next waypoint, stops at final waypoint
//  previous: selects the previous waypoint, stops at start waypoint
//  nextwrap: selects the next waypoint, wrapping back to start after final
//  previouswrap: selects the previous waypoint, wrapping to final after start
void
InputEvents::eventAdjustWaypoint(const TCHAR *misc)
{
  if (protected_task_manager == NULL)
    return;

  if (StringIsEqual(misc, _T("next")))
    protected_task_manager->IncrementActiveTaskPoint(1); // next
  else if (StringIsEqual(misc, _T("nextwrap")))
    protected_task_manager->IncrementActiveTaskPoint(1); // next - with wrap
  else if (StringIsEqual(misc, _T("previous")))
    protected_task_manager->IncrementActiveTaskPoint(-1); // previous
  else if (StringIsEqual(misc, _T("previouswrap")))
    protected_task_manager->IncrementActiveTaskPoint(-1); // previous with wrap
  else if (StringIsEqual(misc, _T("nextarm")))
    protected_task_manager->IncrementActiveTaskPointArm(1); // arm sensitive next
  else if (StringIsEqual(misc, _T("previousarm")))
    protected_task_manager->IncrementActiveTaskPointArm(-1); // arm sensitive previous

  trigger_redraw();
}
예제 #17
0
void
InputEvents::eventScreenModes(const TCHAR *misc)
{
  // toggle switches like this:
  //  -- normal infobox
  //  -- auxiliary infobox
  //  -- full screen
  //  -- normal infobox

  const UIState &ui_state = CommonInterface::GetUIState();

  if (StringIsEqual(misc, _T("normal"))) {
    PageActions::OpenLayout(PageLayout::Default());
  } else if (StringIsEqual(misc, _T("auxilary"))) {
    PageActions::OpenLayout(PageLayout::Aux());
  } else if (StringIsEqual(misc, _T("toggleauxiliary"))) {
    PageActions::OpenLayout(ui_state.auxiliary_enabled
                            ? PageLayout::Default()
                            : PageLayout::Aux());
  } else if (StringIsEqual(misc, _T("full"))) {
    PageActions::OpenLayout(PageLayout::FullScreen());
  } else if (StringIsEqual(misc, _T("togglefull"))) {
    CommonInterface::main_window->SetFullScreen(
        !CommonInterface::main_window->GetFullScreen());
  } else if (StringIsEqual(misc, _T("show"))) {
    if (CommonInterface::main_window->GetFullScreen())
      Message::AddMessage(_("Screen Mode Full"));
    else if (ui_state.auxiliary_enabled)
        Message::AddMessage(_("Auxiliary InfoBoxes"));
    else
        Message::AddMessage(_("Default InfoBoxes"));
  } else if (StringIsEqual(misc, _T("previous")))
    PageActions::Prev();
  else
    PageActions::Next();


  trigger_redraw();
}
예제 #18
0
// TODO code: Keep marker text for use in log file etc.
void
InputEvents::eventMarkLocation(const TCHAR *misc)
{
  const NMEAInfo &basic = CommonInterface::Basic();

  if (StringIsEqual(misc, _T("reset"))) {
    ScopeSuspendAllThreads suspend;
    way_points.EraseUserMarkers();
  } else {
    const auto location = GetVisibleLocation();
    if (!location.IsValid())
      return;

    MarkLocation(location, basic.date_time_utc);

    const WaypointFactory factory(WaypointOrigin::USER, terrain);
    Waypoint wp = factory.Create(location);
    factory.FallbackElevation(wp);

    TCHAR name[64] = _T("Marker");
    if (basic.date_time_utc.IsPlausible()) {
      auto *p = name + StringLength(name);
      *p++ = _T(' ' );
      FormatISO8601(p, basic.date_time_utc);
    }

    wp.name = name;
    wp.type = Waypoint::Type::MARKER;

    SuspendAppendSaveWaypoint(std::move(wp));

    if (CommonInterface::GetUISettings().sound.sound_modes_enabled)
      PlayResource(_T("IDR_WAV_CLEAR"));
  }

  trigger_redraw();
}