28#include "model/base_platform.h"
29#include "model/georef.h"
30#include "model/nav_object_database.h"
31#include "model/route.h"
32#include "model/select.h"
33#include "model/track.h"
41 pSelectList =
new SelectableItemList;
42 pixelRadius = g_BasePlatform->GetSelectRadiusPix();
46 pSelectList->DeleteContents(
true);
51bool Select::IsSelectableRoutePointValid(
RoutePoint *pRoutePoint) {
55 wxSelectableItemListNode *node = pSelectList->GetFirst();
58 pFindSel = node->GetData();
59 if (pFindSel->m_seltype == SELTYPE_ROUTEPOINT &&
60 (
RoutePoint *)pFindSel->m_pData1 == pRoutePoint)
62 node = node->GetNext();
67bool Select::AddSelectableRoutePoint(
float slat,
float slon,
70 pSelItem->m_slat = slat;
71 pSelItem->m_slon = slon;
72 pSelItem->m_seltype = SELTYPE_ROUTEPOINT;
73 pSelItem->m_bIsSelected =
false;
74 pSelItem->m_pData1 = pRoutePointAdd;
76 wxSelectableItemListNode *node;
79 node = pSelectList->Append(pSelItem);
81 node = pSelectList->Insert(pSelItem);
83 pRoutePointAdd->SetSelectNode(node);
88bool Select::AddSelectableRouteSegment(
float slat1,
float slon1,
float slat2,
93 pSelItem->m_slat = slat1;
94 pSelItem->m_slon = slon1;
95 pSelItem->m_slat2 = slat2;
96 pSelItem->m_slon2 = slon2;
97 pSelItem->m_seltype = SELTYPE_ROUTESEGMENT;
98 pSelItem->m_bIsSelected =
false;
99 pSelItem->m_pData1 = pRoutePointAdd1;
100 pSelItem->m_pData2 = pRoutePointAdd2;
101 pSelItem->m_pData3 = pRoute;
104 pSelectList->Append(pSelItem);
106 pSelectList->Insert(pSelItem);
111bool Select::DeleteAllSelectableRouteSegments(
Route *pr) {
115 wxSelectableItemListNode *node = pSelectList->GetFirst();
118 pFindSel = node->GetData();
119 if (pFindSel->m_seltype == SELTYPE_ROUTESEGMENT &&
120 (
Route *)pFindSel->m_pData3 == pr) {
122 wxSelectableItemListNode *d = node;
123 node = node->GetNext();
124 pSelectList->DeleteNode(d);
126 node = node->GetNext();
132bool Select::DeleteAllSelectableRoutePoints(
Route *pr) {
136 wxSelectableItemListNode *node = pSelectList->GetFirst();
139 pFindSel = node->GetData();
140 if (pFindSel->m_seltype == SELTYPE_ROUTEPOINT) {
150 pSelectList->DeleteNode(node);
151 prp->SetSelectNode(NULL);
153 node = pSelectList->GetFirst();
155 goto got_next_outer_node;
157 pnode = pnode->GetNext();
161 node = node->GetNext();
168bool Select::AddAllSelectableRoutePoints(
Route *pr) {
174 AddSelectableRoutePoint(prp->m_lat, prp->m_lon, prp);
175 node = node->GetNext();
182bool Select::AddAllSelectableRouteSegments(
Route *pr) {
184 float slat1, slon1, slat2, slon2;
193 node = node->GetNext();
200 AddSelectableRouteSegment(slat1, slon1, slat2, slon2, prp0, prp, pr);
206 node = node->GetNext();
213bool Select::AddAllSelectableTrackSegments(
Track *pr) {
215 float slat1, slon1, slat2, slon2;
217 if (pr->GetnPoints()) {
222 for (
int i = 1; i < pr->GetnPoints(); i++) {
227 AddSelectableTrackSegment(slat1, slon1, slat2, slon2, prp0, prp, pr);
238bool Select::UpdateSelectableRouteSegments(
RoutePoint *prp) {
243 wxSelectableItemListNode *node = pSelectList->GetFirst();
246 pFindSel = node->GetData();
247 if (pFindSel->m_seltype == SELTYPE_ROUTESEGMENT) {
248 if (pFindSel->m_pData1 == prp) {
249 pFindSel->m_slat = prp->m_lat;
250 pFindSel->m_slon = prp->m_lon;
255 else if (pFindSel->m_pData2 == prp) {
256 pFindSel->m_slat2 = prp->m_lat;
257 pFindSel->m_slon2 = prp->m_lon;
261 node = node->GetNext();
267SelectItem *Select::AddSelectablePoint(
float slat,
float slon,
268 const void *pdata,
int fseltype) {
271 pSelItem->m_slat = slat;
272 pSelItem->m_slon = slon;
273 pSelItem->m_seltype = fseltype;
274 pSelItem->m_bIsSelected =
false;
275 pSelItem->m_pData1 = pdata;
277 pSelectList->Append(pSelItem);
292bool Select::DeleteSelectablePoint(
void *pdata,
int SeltypeToDelete) {
297 wxSelectableItemListNode *node = pSelectList->GetFirst();
300 pFindSel = node->GetData();
301 if (pFindSel->m_seltype == SeltypeToDelete) {
302 if (pdata == pFindSel->m_pData1) {
306 if (SELTYPE_ROUTEPOINT == SeltypeToDelete) {
308 prp->SetSelectNode(NULL);
314 node = node->GetNext();
320bool Select::DeleteAllSelectableTypePoints(
int SeltypeToDelete) {
324 wxSelectableItemListNode *node = pSelectList->GetFirst();
327 pFindSel = node->GetData();
328 if (pFindSel->m_seltype == SeltypeToDelete) {
331 if (SELTYPE_ROUTEPOINT == SeltypeToDelete) {
333 prp->SetSelectNode(NULL);
337 node = pSelectList->GetFirst();
341 node = node->GetNext();
348bool Select::DeleteSelectableRoutePoint(
RoutePoint *prp) {
350 wxSelectableItemListNode *node =
351 (wxSelectableItemListNode *)prp->GetSelectNode();
357 prp->SetSelectNode(NULL);
361 return DeleteSelectablePoint(prp, SELTYPE_ROUTEPOINT);
366bool Select::ModifySelectablePoint(
float lat,
float lon,
void *data,
367 int SeltypeToModify) {
371 wxSelectableItemListNode *node = pSelectList->GetFirst();
374 pFindSel = node->GetData();
375 if (pFindSel->m_seltype == SeltypeToModify) {
376 if (data == pFindSel->m_pData1) {
377 pFindSel->m_slat = lat;
378 pFindSel->m_slon = lon;
383 node = node->GetNext();
388bool Select::AddSelectableTrackSegment(
float slat1,
float slon1,
float slat2,
393 pSelItem->m_slat = slat1;
394 pSelItem->m_slon = slon1;
395 pSelItem->m_slat2 = slat2;
396 pSelItem->m_slon2 = slon2;
397 pSelItem->m_seltype = SELTYPE_TRACKSEGMENT;
398 pSelItem->m_bIsSelected =
false;
399 pSelItem->m_pData1 = pTrackPointAdd1;
400 pSelItem->m_pData2 = pTrackPointAdd2;
401 pSelItem->m_pData3 = pTrack;
403 if (pTrack->m_bIsInLayer)
404 pSelectList->Append(pSelItem);
406 pSelectList->Insert(pSelItem);
411bool Select::DeleteAllSelectableTrackSegments(
Track *pt) {
415 wxSelectableItemListNode *node = pSelectList->GetFirst();
418 pFindSel = node->GetData();
419 if (pFindSel->m_seltype == SELTYPE_TRACKSEGMENT &&
420 (
Track *)pFindSel->m_pData3 == pt) {
422 wxSelectableItemListNode *d = node;
423 node = node->GetNext();
424 pSelectList->DeleteNode(d);
426 node = node->GetNext();
431bool Select::DeletePointSelectableTrackSegments(
TrackPoint *pt) {
435 wxSelectableItemListNode *node = pSelectList->GetFirst();
438 pFindSel = node->GetData();
439 if (pFindSel->m_seltype == SELTYPE_TRACKSEGMENT &&
443 wxSelectableItemListNode *d = node;
444 node = node->GetNext();
445 pSelectList->DeleteNode(d);
447 node = node->GetNext();
452bool Select::IsSegmentSelected(
float a,
float b,
float c,
float d,
float slat,
458 if (a > 90.0) a -= 180.0;
459 if (b > 90.0) b -= 180.0;
460 if (c > 180.0) c -= 360.0;
461 if (d > 180.0) d -= 360.0;
462 if (slat > 90.0) slat -= 180.0;
463 if (slon > 180.0) slon -= 360.0;
468 DistanceBearingMercator(a, c, b, d, &brg, &dist);
482 if (slon < 0.) adder = 360.;
487 if ((slat >= (fmin(a, b) - selectRadius)) &&
488 (slat <= (fmax(a, b) + selectRadius)) &&
489 ((slon + adder) >= (fmin(c, d) - selectRadius)) &&
490 ((slon + adder) <= (fmax(c, d) + selectRadius))) {
496 toSM(a, c, 0., 0., &cp, &ap);
498 toSM(b, d, 0., 0., &dp, &bp);
500 toSM(slat, slon + adder, 0., 0., &slonp, &slatp);
507 double delta = vGetLengthOfNormal(&va, &vb, &vn);
508 if (fabs(delta) < (selectRadius * 1852 * 60))
return true;
513void Select::CalcSelectRadius(
SelectCtx &ctx) {
514 selectRadius = pixelRadius / (ctx.scale * 1852 * 60);
522 CalcSelectRadius(ctx);
525 wxSelectableItemListNode *node = pSelectList->GetFirst();
528 pFindSel = node->GetData();
529 if (pFindSel->m_seltype == fseltype) {
531 case SELTYPE_ROUTEPOINT:
532 case SELTYPE_TIDEPOINT:
533 case SELTYPE_CURRENTPOINT:
534 case SELTYPE_AISTARGET:
535 if ((fabs(slat - pFindSel->m_slat) < selectRadius) &&
536 (fabs(slon - pFindSel->m_slon) < selectRadius)) {
537 if (fseltype == SELTYPE_ROUTEPOINT) {
539 ->IsVisibleSelectable(ctx.chart_scale))
546 case SELTYPE_ROUTESEGMENT:
547 case SELTYPE_TRACKSEGMENT: {
548 a = pFindSel->m_slat;
549 b = pFindSel->m_slat2;
550 c = pFindSel->m_slon;
551 d = pFindSel->m_slon2;
553 if (IsSegmentSelected(a, b, c, d, slat, slon))
goto find_ok;
561 node = node->GetNext();
569bool Select::IsSelectableSegmentSelected(
SelectCtx &ctx,
float slat,
float slon,
572 wxSelectableItemListNode *node = pSelectList->GetFirst();
575 if (pFindSel == node->GetData()) {
579 node = node->GetNext();
582 if (valid ==
false) {
586 CalcSelectRadius(ctx);
588 float a = pFindSel->m_slat;
589 float b = pFindSel->m_slat2;
590 float c = pFindSel->m_slon;
591 float d = pFindSel->m_slon2;
593 return IsSegmentSelected(a, b, c, d, slat, slon);
597 if (ctx.show_nav_objects)
return true;
602 rte = FindRouteContainingWaypoint(wp);
603 if (rte && rte->IsActive())
return true;
608SelectableItemList Select::FindSelectionList(
SelectCtx &ctx,
float slat,
609 float slon,
int fseltype) {
612 SelectableItemList ret_list;
614 CalcSelectRadius(ctx);
617 wxSelectableItemListNode *node = pSelectList->GetFirst();
620 pFindSel = node->GetData();
621 if (pFindSel->m_seltype == fseltype) {
623 case SELTYPE_ROUTEPOINT:
624 if ((fabs(slat - pFindSel->m_slat) < selectRadius) &&
625 (fabs(slon - pFindSel->m_slon) < selectRadius))
626 if (is_selectable_wp(ctx, (
RoutePoint *)pFindSel->m_pData1))
628 ->IsVisibleSelectable(ctx.chart_scale))
629 ret_list.Append(pFindSel);
631 case SELTYPE_TIDEPOINT:
632 case SELTYPE_CURRENTPOINT:
633 case SELTYPE_AISTARGET:
634 case SELTYPE_DRAGHANDLE:
635 if ((fabs(slat - pFindSel->m_slat) < selectRadius) &&
636 (fabs(slon - pFindSel->m_slon) < selectRadius)) {
637 if (is_selectable_wp(ctx, (
RoutePoint *)pFindSel->m_pData1))
638 ret_list.Append(pFindSel);
641 case SELTYPE_ROUTESEGMENT:
642 case SELTYPE_TRACKSEGMENT: {
643 a = pFindSel->m_slat;
644 b = pFindSel->m_slat2;
645 c = pFindSel->m_slon;
646 d = pFindSel->m_slon2;
648 if (IsSegmentSelected(a, b, c, d, slat, slon)) {
649 if (ctx.show_nav_objects ||
650 (fseltype == SELTYPE_ROUTESEGMENT &&
651 ((
Route *)pFindSel->m_pData3)->m_bRtIsActive)) {
652 ret_list.Append(pFindSel);
663 node = node->GetNext();
Represents a waypoint or mark within the navigation system.
bool m_bIsActive
Flag indicating if this waypoint is active for navigation.
bool m_bIsInLayer
Flag indicating if the waypoint belongs to a layer.
Represents a navigational route in the navigation system.
RoutePointList * pRoutePointList
Ordered list of waypoints (RoutePoints) that make up this route.
bool m_bIsInLayer
Flag indicating whether this route belongs to a layer.
Represents a single point in a track.
Represents a track, which is a series of connected track points.