diff --git a/components/lazmapviewer/examples/plugin_demos/markerclick_demo/MarkerClick_Demo.lpi b/components/lazmapviewer/examples/plugin_demos/markerclick_demo/MarkerClick_Demo.lpi index b533dca9f..1e4f3904d 100644 --- a/components/lazmapviewer/examples/plugin_demos/markerclick_demo/MarkerClick_Demo.lpi +++ b/components/lazmapviewer/examples/plugin_demos/markerclick_demo/MarkerClick_Demo.lpi @@ -5,7 +5,7 @@ <PathDelim Value="\"/> <General> <SessionStorage Value="InProjectDir"/> - <Title Value="MarkerClick_Demo"/> + <Title Value="Marker Click Demo"/> <Scaled Value="True"/> <ResourceType Value="res"/> <UseXPManifest Value="True"/> diff --git a/components/lazmapviewer/examples/plugin_demos/markerclick_demo/MarkerClick_Demo.lpr b/components/lazmapviewer/examples/plugin_demos/markerclick_demo/MarkerClick_Demo.lpr index a1fd391c4..594ff7ac7 100644 --- a/components/lazmapviewer/examples/plugin_demos/markerclick_demo/MarkerClick_Demo.lpr +++ b/components/lazmapviewer/examples/plugin_demos/markerclick_demo/MarkerClick_Demo.lpr @@ -17,6 +17,7 @@ uses begin RequireDerivedFormResource := True; + Application.Title:='Marker Click Demo'; Application.Scaled:=True; {$PUSH}{$WARN 5044 OFF} Application.MainFormOnTaskbar := True; diff --git a/components/lazmapviewer/examples/plugin_demos/markerclick_demo/main.lfm b/components/lazmapviewer/examples/plugin_demos/markerclick_demo/main.lfm index a46013b2d..394398a2d 100644 --- a/components/lazmapviewer/examples/plugin_demos/markerclick_demo/main.lfm +++ b/components/lazmapviewer/examples/plugin_demos/markerclick_demo/main.lfm @@ -1,18 +1,18 @@ object MainForm: TMainForm Left = 576 - Height = 426 + Height = 606 Top = 248 - Width = 653 + Width = 806 Caption = 'Marker Click Demo' - ClientHeight = 426 - ClientWidth = 653 + ClientHeight = 606 + ClientWidth = 806 LCLVersion = '4.99.0.0' OnCreate = FormCreate object MapView: TMapView Left = 0 - Height = 340 + Height = 497 Top = 0 - Width = 653 + Width = 806 Align = alClient Cyclic = True DownloadEngine = MapView.BuiltInDLE @@ -22,11 +22,28 @@ object MainForm: TMainForm MapProvider = 'Open Topo Map' PluginManager = PluginManager POIImages = POI_Images + object Memo: TMemo + Left = 603 + Height = 497 + Top = 0 + Width = 203 + Align = alRight + ScrollBars = ssAutoBoth + TabOrder = 0 + end + object Splitter1: TSplitter + Left = 598 + Height = 497 + Top = 0 + Width = 5 + Align = alRight + ResizeAnchor = akRight + end end object Bevel1: TBevel AnchorSideLeft.Control = Owner AnchorSideLeft.Side = asrCenter - Left = 323 + Left = 400 Height = 50 Top = 108 Width = 6 @@ -34,14 +51,14 @@ object MainForm: TMainForm end object Panel1: TPanel Left = 0 - Height = 86 - Top = 340 - Width = 653 + Height = 109 + Top = 497 + Width = 806 Align = alBottom AutoSize = True BevelOuter = bvNone - ClientHeight = 86 - ClientWidth = 653 + ClientHeight = 109 + ClientWidth = 806 TabOrder = 1 object cgPointTypes: TCheckGroup AnchorSideLeft.Control = Panel1 @@ -81,13 +98,12 @@ object MainForm: TMainForm } end object Label2: TLabel - AnchorSideLeft.Control = cgPointTypes + AnchorSideLeft.Control = Label1 AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = Label1 - AnchorSideTop.Side = asrBottom - Left = 379 + Left = 104 Height = 15 - Top = 23 + Top = 86 Width = 91 BorderSpacing.Left = 16 Caption = 'blue: MAP points' @@ -98,18 +114,51 @@ object MainForm: TMainForm end object Label1: TLabel AnchorSideLeft.Control = cgPointTypes - AnchorSideLeft.Side = asrBottom AnchorSideTop.Control = cgPointTypes - Left = 379 + AnchorSideTop.Side = asrBottom + Left = 8 Height = 15 - Top = 8 + Top = 86 Width = 80 - BorderSpacing.Left = 16 + BorderSpacing.Bottom = 8 Caption = 'red: GPS points' Font.Color = clRed ParentColor = False ParentFont = False end + object rgClickBehaviour: TRadioGroup + AnchorSideLeft.Control = cgPointTypes + AnchorSideLeft.Side = asrBottom + AnchorSideTop.Control = Panel1 + AnchorSideBottom.Control = cgPointTypes + AnchorSideBottom.Side = asrBottom + Left = 379 + Height = 70 + Top = 8 + Width = 125 + Anchors = [akTop, akLeft, akBottom] + AutoFill = True + AutoSize = True + BorderSpacing.Left = 16 + BorderSpacing.Top = 8 + Caption = 'Click behaviour' + ChildSizing.LeftRightSpacing = 10 + ChildSizing.HorizontalSpacing = 10 + ChildSizing.EnlargeHorizontal = crsHomogenousChildResize + ChildSizing.EnlargeVertical = crsHomogenousChildResize + ChildSizing.ShrinkHorizontal = crsScaleChilds + ChildSizing.ShrinkVertical = crsScaleChilds + ChildSizing.Layout = cclLeftToRightThenTopToBottom + ChildSizing.ControlsPerLine = 1 + ClientHeight = 50 + ClientWidth = 121 + ItemIndex = 0 + Items.Strings = ( + 'Show dialog' + 'Log click points' + ) + TabOrder = 1 + end end object PluginManager: TMvPluginManager Left = 401 diff --git a/components/lazmapviewer/examples/plugin_demos/markerclick_demo/main.pas b/components/lazmapviewer/examples/plugin_demos/markerclick_demo/main.pas index d98faecd2..9e1e89e36 100644 --- a/components/lazmapviewer/examples/plugin_demos/markerclick_demo/main.pas +++ b/components/lazmapviewer/examples/plugin_demos/markerclick_demo/main.pas @@ -18,14 +18,18 @@ type cgPointTypes: TCheckGroup; Label1: TLabel; Label2: TLabel; + Memo: TMemo; Panel1: TPanel; POI_Images: TImageList; MapView: TMapView; PluginManager: TMvPluginManager; + rgClickBehaviour: TRadioGroup; + Splitter1: TSplitter; procedure cgPointTypesItemClick(Sender: TObject; Index: integer); procedure FormCreate(Sender: TObject); private Plugin: TMarkerClickPlugin; + procedure MarkerCanClickHandler(AMapView: TMapView; APoint: TGPSPoint; var CanClick: Boolean); procedure MarkerClickHandler({%H-}AMapView: TMapView; APoint: TGPSPoint); public @@ -124,6 +128,8 @@ begin Plugin := TMarkerClickPlugin.Create(PluginManager); Plugin.OnMarkerClick := @MarkerClickHandler; + Plugin.OnCanClick := @MarkerCanClickHandler; + // Plugin.MapView := MapView; // Required if the MapView has a non-default cursor. for i := 0 to cgPointTypes.Items.Count-1 do cgPointTypes.Checked[i] := true; @@ -141,6 +147,21 @@ begin Plugin.PointTypes := pointTypes; end; +procedure TMainForm.MarkerCanClickHandler(AMapView: TMapView; APoint: TGPSPoint; + var CanClick: Boolean); +var + mapTrack: TMapTrack; + i: Integer; +begin + // Disallow clicking on the points of the (blue) map track + mapTrack := MapView.Layers[0].Tracks[0]; + for i := 0 to mapTrack.Points.Count-1 do + begin + CanClick := not APoint.RealPoint.Equal(mapTrack.Points[i].RealPoint); + if not CanClick then exit; + end; +end; + procedure TMainForm.MarkerClickHandler(AMapView: TMapView; APoint: TGPSPoint); var s, sName, sLat, sLon: String; @@ -148,10 +169,13 @@ begin sName := APoint.Name; sLat := ' Latitude ' + LatToStr(APoint.Lat, true); sLon := ' Longitude ' + LonToStr(APoint.Lon, true); - s := sLat + Lineending + sLon; + s := sLat + LineEnding + sLon; if sName <> '' then s := sName + LineEnding + s; - ShowMessage(s); + case rgClickBehaviour.ItemIndex of + 0: ShowMessage(s); + 1: Memo.Lines.Add(s + LineEnding); + end; end; end. diff --git a/components/lazmapviewer/source/addons/plugins/mvplugins.pas b/components/lazmapviewer/source/addons/plugins/mvplugins.pas index 549783162..86277d7f3 100644 --- a/components/lazmapviewer/source/addons/plugins/mvplugins.pas +++ b/components/lazmapviewer/source/addons/plugins/mvplugins.pas @@ -138,19 +138,28 @@ type { TMarkerClickPlugin } + TMarkerCanClickEvent = procedure (AMapView: TMapView; APoint: TGPSPoint; var CanClick: Boolean) of object; TMarkerClickEvent = procedure (AMapView: TMapView; APoint: TGPSPoint) of object; TMarkerClickPlugin = class(TMvMarkerPlugin) private + FCursor: TCursor; + FSavedCursor: TCursor; FShift: TShiftState; + FOnCanClick: TMarkerCanClickEvent; FOnMarkerClick: TMarkerClickEvent; protected procedure MouseDown(AMapView: TMapView; {%H-}Button: TMouseButton; AShift: TShiftState; X,Y: Integer; var Handled: Boolean); override; + procedure MouseMove(AMapView: TMapView; {%H-}AShift: TShiftState; + X,Y: Integer; var Handled: Boolean); override; + procedure SetMapView(AValue: TMapView); override; public constructor Create(AOwner: TComponent); override; published + property Cursor: TCursor read FCursor write FCursor default crHandPoint; property Shift: TShiftState read FShift write FShift default [ssLeft]; + property OnCanClick: TMarkerCanClickEvent read FOnCanClick write FOnCanClick; property OnMarkerClick: TMarkerClickEvent read FOnMarkerClick write FOnMarkerClick; end; @@ -351,6 +360,12 @@ implementation uses Types; +function IfThen(AValue: Boolean; ACursor1, ACursor2: TCursor): TCursor; +begin + if AValue then Result := ACursor1 else Result := ACursor2; +end; + + { TCenterMargerPlugin } constructor TCenterMarkerPlugin.Create(AOwner: TComponent); @@ -928,6 +943,8 @@ end; constructor TMarkerClickPlugin.Create(AOwner: TComponent); begin inherited; + FCursor := crHandPoint; + FSavedCursor := crDefault; FShift := [ssLeft]; end; @@ -935,18 +952,57 @@ procedure TMarkerClickPlugin.MouseDown(AMapView: TMapView; Button: TMouseButton; AShift: TShiftState; X, Y: Integer; var Handled: Boolean); var gpsPoint: TGPSPoint; + canClick: Boolean; begin if Handled then exit; gpsPoint := FindNearestMarker(AMapView, X, Y); - if Assigned(FOnMarkerClick) and (AShift = FShift) then + if Assigned(gpsPoint) and Assigned(FOnMarkerClick) and (AShift = FShift) then begin + if Assigned(FOnCanClick) then + begin + canClick := true; + FOnCanClick(AMapView, gpsPoint, canClick); + if not canClick then + exit; + end; FOnMarkerClick(AMapView, gpsPoint); Handled := true; end; end; +procedure TMarkerClickPlugin.MouseMove(AMapView: TMapView; + {%H-}AShift: TShiftState; X,Y: Integer; var Handled: Boolean); +var + gpsPoint: TGPSPoint; + canClick: Boolean; +begin + if Handled then + exit; + gpsPoint := FindNearestMarker(AMapView, X, Y); + if Assigned(gpsPoint) then + begin + canClick := true; + if Assigned(FOnCanClick) then + FOnCanClick(AMapView, gpsPoint, canClick); + end else + canClick := false; + AMapView.Cursor := IfThen(canClick, FCursor, FSavedCursor); +end; + +{ Store the original MapView cursor. Is used when the mouse is not over a + clickable point. If no MapView is assigned to the plugin it is assumed that + the MapView has the default cursor. } +procedure TMarkerClickPlugin.SetMapView(AValue: TMapView); +begin + inherited; + if Assigned(MapView) then + FSavedCursor := MapView.Cursor + else + FSavedCursor := crDefault; +end; + { TMarkerHintPlugin }