{$mode objfpc}{$H+}
unit uArrows;

// CC 20260313 heading arrow create/update/remove helpers

interface

uses
  Graphics,
  TGClasses, Globe4, TGSysUtils, GlobeUtils, TGPresenters, TGObjects,
  uCICG4Presenters;

procedure CreateArrow(aGlobe: TGlobe4; aLayer: TGlobeLayer;
  const pCenter: TPointLL; course: SmallInt; aColor: TColor;
  var ioNextID: Integer; out presID: Integer; out objID: Integer);

procedure UpdateArrow(aLayer: TGlobeLayer; presID, objID: Integer;
  const pCenter: TPointLL; course: SmallInt; aColor: TColor);

procedure RemoveArrow(aLayer: TGlobeLayer; presID, objID: Integer);

implementation

procedure CreateArrow(aGlobe: TGlobe4; aLayer: TGlobeLayer;
  const pCenter: TPointLL; course: SmallInt; aColor: TColor;
  var ioNextID: Integer; out presID: Integer; out objID: Integer);
var
  lPres: TCICG4PointPresenter;
  lDataObj: TGeoDataObject;
begin
  lPres := TCICG4PointPresenter.Create(aGlobe, 0);
  aLayer.Presenters.Add(lPres);
  with lPres do
  begin
    PointPen.PenColor := aColor;
    PointType := ppArrow;
    PointSize := 24;
    PointUnit := Pixel;
    AngleDeg := course;
  end;
  presID := lPres.PresenterID;

  lDataObj := TGeoDataObject.Create(aLayer.Objects);
  lDataObj.Centroid := pCenter;
  lDataObj.PresenterID := lPres.PresenterID;
  lDataObj.ID := ioNextID;
  objID := ioNextID;
  Inc(ioNextID);
end;

procedure UpdateArrow(aLayer: TGlobeLayer; presID, objID: Integer;
  const pCenter: TPointLL; course: SmallInt; aColor: TColor);
var
  lPres: TGlobePresenter;
  lObj: TGlobeObject;
begin
  lPres := aLayer.Presenters.ByID(presID, False);
  if lPres <> nil then
  begin
    TCICG4PointPresenter(lPres).AngleDeg := course;
    TCICG4PointPresenter(lPres).PointPen.PenColor := aColor;
  end;
  lObj := aLayer.ObjectByID(objID);
  if lObj <> nil then
    TGeoDataObject(lObj).Centroid := pCenter;
end;

procedure RemoveArrow(aLayer: TGlobeLayer; presID, objID: Integer);
var
  lObj: TGlobeObject;
  lPres: TGlobePresenter;
begin
  lObj := aLayer.ObjectByID(objID);
  if lObj <> nil then
  begin
    aLayer.Objects.Delete(lObj);
    lObj.Free;
  end;
  lPres := aLayer.Presenters.ByID(presID, False);
  if lPres <> nil then
  begin
    aLayer.Presenters.Delete(lPres);
    lPres.Free;
  end;
end;

end.
