LazMapViewer: Combine the units of the two fulldemo projects.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@9326 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
wp_xxyyzz 2024-04-05 14:51:09 +00:00
parent d7ebdbad20
commit 20997f05cc
11 changed files with 1414 additions and 828 deletions

View File

@ -0,0 +1,547 @@
object CfgFrame: TCfgFrame
Left = 0
Height = 682
Top = 0
Width = 287
ClientHeight = 682
ClientWidth = 287
TabOrder = 0
DesignLeft = 1150
DesignTop = 210
object LblProviders: TLabel
AnchorSideLeft.Control = cmbProviders
AnchorSideTop.Control = Owner
Left = 4
Height = 15
Top = 8
Width = 52
BorderSpacing.Top = 8
Caption = 'Providers:'
FocusControl = cmbProviders
ParentColor = False
end
object cmbProviders: TComboBox
AnchorSideLeft.Control = Owner
AnchorSideTop.Control = LblProviders
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = btnLoadMapProviders
Left = 4
Height = 23
Top = 25
Width = 213
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 4
BorderSpacing.Top = 2
BorderSpacing.Right = 2
DropDownCount = 24
ItemHeight = 15
Style = csDropDownList
TabOrder = 0
OnChange = cmbProvidersChange
end
object btnLoadMapProviders: TSpeedButton
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = cmbProviders
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = btnSaveMapProviders
Left = 219
Height = 28
Top = 22
Width = 30
Anchors = [akTop, akRight]
BorderSpacing.Right = 2
Glyph.Data = {
36040000424D3604000000000000360000002800000010000000100000000100
2000000000000004000064000000640000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000003591
DBFA439FDDFA439FDDFA429FDDFA429EDDFA419EDCFA419EDCFA419EDCFA419E
DCFA419EDCFA419EDCFA419EDCFA3792DAFB3080DF100000000000000000429C
DEF76EC7EBFF6DC7EAFF6BC6EAFF6AC5E9FF68C4E9FF67C3E8FF65C2E8FF64C1
E7FF63C0E7FF61BFE6FF60BEE5FF51AFE3FE308CD6450000000000000000409A
DDF47CD0F1FF7BD0F0FF7ACFEFFF79CEEFFF77CDEEFF76CCEEFF74CBEDFF73CA
EDFF71C9ECFF70C8ECFF6EC7EBFF6AC3E9FF3993DB8E00000000000000003E99
DCEC7ECEF1FF8AD9F6FF89D8F5FF87D7F4FF86D6F4FF84D5F3FF83D5F3FF81D4
F2FF80D3F2FF7ED2F1FF7DD1F1FF7BD0F0FF439ADEB40000000000000000409B
DDE470C1EDFF99E2FBFF97E2FBFF96E1FAFF94E0F9FF93DFF9FF91DEF8FF90DD
F8FF8EDCF7FF8DDBF7FF8CDAF6FF8AD9F6FF4EA4E2CD00000000000000004AA5
E0DF61B3E8FFA3E9FFFFA3E9FFFFA3E9FFFFA3E9FFFFA2E8FEFFA0E7FEFF9FE6
FDFF9DE5FDFF9CE4FCFF9AE3FCFF99E2FBFF5FB3E9E33080DF100000000051A8
E2DF5EB2E8FFA3E9FFFFA3E9FFFFA3E9FFFFA3E9FFFFA3E9FFFFA3E9FFFFA3E9
FFFFA3E9FFFFA3E9FFFFA3E9FFFFA3E9FFFF84CFF5FB348CDA450000000058AD
E5DF60B3E8FF61B3E9FF61B3E9FF60B2E9FF60B2E8FF60B2E8FF5FB1E8FF5FB1
E8FF5EB1E8FF5EB1E8FF5EB1E7FF59ADE7FB55A9E5E33B94DC85000000005FB0
E8DF9DE4FBFF9AE3FAFF97E1F9FF94DFF8FF91DDF7FF8EDBF5FF8BD9F4FF88D8
F3FF85D6F2FF82D4F1FF7FD2F0FF4FA7E1DF00000000000000000000000061B1
E8DFA6EAFFFFA6EAFFFFA6EAFFFFA3E8FEFF7AC6F1ED59ACE6DF58AAE5DF57AA
E5DF56AAE5DF53A9E4DF53A8E4DF3C94DCE20000000000000000000000004096
DEE25DAEE7DF5DAEE7DF5DAEE7DF57A9E6DF4399DF6E00000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000
}
OnClick = btnLoadMapProvidersClick
end
object btnSaveMapProviders: TSpeedButton
AnchorSideLeft.Control = btnLoadMapProviders
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = cmbProviders
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
Left = 251
Height = 28
Top = 22
Width = 32
Anchors = [akTop, akRight]
BorderSpacing.Right = 4
Glyph.Data = {
36040000424D3604000000000000360000002800000010000000100000000100
2000000000000004000064000000640000000000000000000000A4653455A465
34FFA46534FFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BD
BAFFA46534FFA46534FFA46534FFA46534FFA46534FF00000000A46534FFA465
34FFA46534FFB6BDBAFFA46534FFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BD
BAFFA46534FFA46534FFA46534FFA46534FFA46534FF00000000A46534FFA465
34FFA46534FFB6BDBAFFA46534FFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BD
BAFFA46534FFA46534FFA46534FFA46534FFA46534FF00000000A46534FFA465
34FFA46534FFB6BDBAFFA46534FFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BD
BAFFA46534FFA46534FFA46534FFA46534FFA46534FF00000000A46534FFA465
34FFA46534FFB6BDBAFFA46534FFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BD
BAFFA46534FFA46534FFA46534FFA46534FFA46534FF00000000A46534FFA465
34FFA46534FFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BD
BAFFA46534FFA46534FFA46534FFA46534FFA46534FF00000000A46534FFA465
34FFA46534FFA46534FFA46534FFA46534FFA46534FFA46534FFA46534FFA465
34FFA46534FFA46534FFA46534FFA46534FFA46534FF00000000A46534FFA465
34FFA46534FFA46534FFA46534FFA46534FFA46534FFA46534FFA46534FFA465
34FFA46534FFA46534FFA46534FFA46534FFA46534FF00000000A46534FFECEE
EEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEE
EEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFA46534FF00000000A46534FFECEE
EEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEE
EEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFA46534FF00000000A46534FFECEE
EEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEE
EEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFA46534FF00000000A46534FFECEE
EEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEE
EEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFA46534FF00000000A46534FFECEE
EEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEE
EEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFA46534FF00000000A46534FFECEE
EEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEE
EEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFA46534FF00000000A46534FF5959
F3FF5959F3FF5959F3FF5959F3FF5959F3FF5959F3FF5959F3FF5959F3FF5959
F3FF5959F3FF5959F3FF5959F3FF5959F3FFA46534FF00000000A46534FF5959
F3FF5959F3FF5959F3FF5959F3FF5959F3FF5959F3FF5959F3FF5959F3FF5959
F3FF5959F3FF5959F3FF5959F3FF5959F3FFA46534FF00000000
}
OnClick = btnSaveMapProvidersClick
end
object gbProxy: TGroupBox
AnchorSideLeft.Control = Owner
AnchorSideTop.Control = cmbProviders
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
Left = 4
Height = 185
Top = 56
Width = 279
Anchors = [akTop, akLeft, akRight]
AutoSize = True
BorderSpacing.Top = 4
BorderSpacing.Around = 4
Caption = 'Proxy'
ClientHeight = 165
ClientWidth = 275
TabOrder = 1
object lblProxyHost: TLabel
AnchorSideLeft.Control = rbNoProxy
AnchorSideTop.Control = edProxyHost
AnchorSideTop.Side = asrCenter
Left = 20
Height = 15
Top = 65
Width = 28
BorderSpacing.Left = 10
Caption = 'Host:'
ParentColor = False
end
object edProxyHost: TEdit
AnchorSideLeft.Control = edProxyUserName
AnchorSideTop.Control = rbProxyData
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = gbProxy
AnchorSideRight.Side = asrBottom
Left = 85
Height = 23
Top = 61
Width = 184
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Right = 6
TabOrder = 3
end
object lblProxyPort: TLabel
AnchorSideLeft.Control = lblProxyHost
AnchorSideTop.Control = seProxyPort
AnchorSideTop.Side = asrCenter
Left = 20
Height = 15
Top = 90
Width = 22
Caption = 'Port'
ParentColor = False
end
object seProxyPort: TSpinEdit
AnchorSideLeft.Control = lblProxyUserName
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = edProxyHost
AnchorSideTop.Side = asrBottom
Left = 85
Height = 23
Top = 86
Width = 70
BorderSpacing.Top = 2
MaxValue = 65535
TabOrder = 4
end
object lblProxyUserName: TLabel
AnchorSideLeft.Control = lblProxyHost
AnchorSideTop.Control = edProxyUserName
AnchorSideTop.Side = asrCenter
Left = 20
Height = 15
Top = 115
Width = 59
BorderSpacing.Right = 6
Caption = 'User name:'
ParentColor = False
end
object edProxyUserName: TEdit
AnchorSideLeft.Control = lblProxyUserName
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = seProxyPort
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = gbProxy
AnchorSideRight.Side = asrBottom
Left = 85
Height = 23
Top = 111
Width = 184
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Top = 2
BorderSpacing.Right = 6
TabOrder = 5
end
object lblProxyPassword: TLabel
AnchorSideLeft.Control = lblProxyHost
AnchorSideTop.Control = edProxyPassword
AnchorSideTop.Side = asrCenter
Left = 20
Height = 15
Top = 140
Width = 50
Caption = 'Password'
ParentColor = False
end
object edProxyPassword: TEdit
AnchorSideLeft.Control = edProxyUserName
AnchorSideTop.Control = edProxyUserName
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = gbProxy
AnchorSideRight.Side = asrBottom
Left = 85
Height = 23
Top = 136
Width = 184
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Top = 2
BorderSpacing.Right = 6
BorderSpacing.Bottom = 6
TabOrder = 6
end
object rbProxyData: TRadioButton
AnchorSideLeft.Control = rbNoProxy
AnchorSideTop.Control = rbSystemProxy
AnchorSideTop.Side = asrBottom
Left = 10
Height = 19
Top = 42
Width = 74
BorderSpacing.Top = 2
Caption = 'Proxy data'
TabOrder = 2
OnChange = rbProxyDataChange
end
object rbNoProxy: TRadioButton
AnchorSideLeft.Control = gbProxy
AnchorSideTop.Control = gbProxy
Left = 10
Height = 19
Top = 0
Width = 67
BorderSpacing.Left = 10
Caption = 'No proxy'
TabOrder = 0
OnChange = rbNoProxyChange
end
object rbSystemProxy: TRadioButton
AnchorSideLeft.Control = rbNoProxy
AnchorSideTop.Control = rbNoProxy
AnchorSideTop.Side = asrBottom
Left = 10
Height = 19
Top = 21
Width = 110
BorderSpacing.Top = 2
Caption = 'Use system proxy'
Checked = True
TabOrder = 1
TabStop = True
OnChange = rbSystemProxyChange
end
end
object cbZoomToCursor: TCheckBox
AnchorSideLeft.Control = Owner
AnchorSideTop.Control = gbProxy
AnchorSideTop.Side = asrBottom
Left = 4
Height = 19
Top = 249
Width = 100
BorderSpacing.Left = 4
BorderSpacing.Top = 8
BorderSpacing.Right = 16
Caption = 'Zoom to cursor'
Checked = True
State = cbChecked
TabOrder = 2
OnChange = cbZoomToCursorChange
end
object cbUseThreads: TCheckBox
AnchorSideLeft.Control = cbZoomToCursor
AnchorSideTop.Control = cbZoomToCursor
AnchorSideTop.Side = asrBottom
Left = 4
Height = 19
Top = 272
Width = 79
BorderSpacing.Top = 4
Caption = 'Use threads'
Checked = True
State = cbChecked
TabOrder = 3
OnChange = cbUseThreadsChange
end
object cbDoubleBuffer: TCheckBox
AnchorSideLeft.Control = cbUseThreads
AnchorSideTop.Control = cbUseThreads
AnchorSideTop.Side = asrBottom
Left = 4
Height = 19
Top = 295
Width = 85
BorderSpacing.Top = 4
BorderSpacing.Right = 6
Caption = 'DblBuffering'
Checked = True
State = cbChecked
TabOrder = 4
OnChange = cbDoubleBufferChange
end
object cbDebugTiles: TCheckBox
AnchorSideLeft.Control = cbDoubleBuffer
AnchorSideTop.Control = cbDoubleBuffer
AnchorSideTop.Side = asrBottom
Left = 4
Height = 19
Top = 318
Width = 77
BorderSpacing.Top = 4
Caption = 'Debug tiles'
TabOrder = 5
OnChange = cbDebugTilesChange
end
object cbCyclicView: TCheckBox
AnchorSideLeft.Control = cbZoomToCursor
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = cbZoomToCursor
Left = 120
Height = 19
Top = 249
Width = 77
Caption = 'Cyclic view'
Checked = True
State = cbChecked
TabOrder = 6
OnChange = cbCyclicViewChange
end
object cbPreviewTiles: TCheckBox
AnchorSideLeft.Control = cbCyclicView
AnchorSideTop.Control = cbUseThreads
Left = 120
Height = 19
Top = 272
Width = 83
Caption = 'Preview tiles'
Checked = True
State = cbChecked
TabOrder = 7
OnChange = cbPreviewTilesChange
end
object clbBackColor: TColorButton
AnchorSideLeft.Control = cbCyclicView
AnchorSideTop.Control = cbDoubleBuffer
AnchorSideTop.Side = asrCenter
Left = 120
Height = 28
Top = 290
Width = 108
BorderWidth = 2
ButtonColorAutoSize = False
ButtonColorSize = 15
ButtonColor = clWhite
Caption = 'Map backgr.'
Margin = 4
OnColorChanged = clbBackColorColorChanged
end
object Bevel1: TBevel
AnchorSideLeft.Control = cbDebugTiles
AnchorSideTop.Control = cbDebugTiles
AnchorSideTop.Side = asrBottom
AnchorSideRight.Side = asrBottom
Left = 4
Height = 2
Top = 343
Width = 257
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Top = 6
Shape = bsTopLine
end
object rgPOIMode: TRadioGroup
AnchorSideLeft.Control = cmbProviders
AnchorSideTop.Control = Bevel1
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
Left = 4
Height = 128
Top = 351
Width = 279
Anchors = [akTop, akLeft, akRight]
AutoFill = False
BorderSpacing.Top = 6
BorderSpacing.Right = 4
Caption = 'POI Mode'
ChildSizing.LeftRightSpacing = 12
ChildSizing.TopBottomSpacing = 4
ChildSizing.ShrinkHorizontal = crsScaleChilds
ChildSizing.ShrinkVertical = crsScaleChilds
ChildSizing.Layout = cclTopToBottomThenLeftToRight
ChildSizing.ControlsPerLine = 4
ClientHeight = 108
ClientWidth = 275
ItemIndex = 0
Items.Strings = (
'default drawing'
'default POI image'
'image from imagelist'
'custom drawing'
)
TabOrder = 8
OnClick = rgPOIModeClick
object Bevel3: TBevel
Left = 151
Height = 25
Top = 4
Width = 66
Constraints.MaxHeight = 25
Shape = bsSpacer
end
object btnSelectPOIImage: TButton
Left = 151
Height = 25
Top = 29
Width = 66
AutoSize = True
BorderSpacing.Left = 8
Caption = 'Select...'
Enabled = False
TabOrder = 4
OnClick = btnSelectPOIImageClick
end
object Bevel4: TBevel
Left = 151
Height = 25
Top = 54
Width = 66
Constraints.MaxHeight = 25
Shape = bsSpacer
end
object Bevel5: TBevel
Left = 151
Height = 25
Top = 79
Width = 66
Constraints.MaxHeight = 25
Shape = bsSpacer
end
end
object btnPOITextFont: TButton
AnchorSideLeft.Control = rgPOIMode
AnchorSideTop.Control = rgPOIMode
AnchorSideTop.Side = asrBottom
Left = 4
Height = 30
Top = 487
Width = 87
BorderSpacing.Top = 8
Caption = 'POI text font'
TabOrder = 9
OnClick = btnPOITextFontClick
end
object LblPOITextBgColor: TLabel
AnchorSideLeft.Control = btnPOITextFont
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = btnPOITextFont
AnchorSideTop.Side = asrCenter
Left = 97
Height = 15
Top = 495
Width = 39
BorderSpacing.Left = 6
Caption = 'Backgr.'
ParentColor = False
end
object cbPOITextBgColor: TColorBox
AnchorSideLeft.Control = LblPOITextBgColor
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = btnPOITextFont
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = rgPOIMode
AnchorSideRight.Side = asrBottom
Left = 142
Height = 21
Top = 492
Width = 141
NoneColorColor = clWhite
Style = [cbStandardColors, cbExtendedColors, cbIncludeNone, cbCustomColor, cbPrettyNames, cbCustomColors]
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 6
ItemHeight = 15
TabOrder = 10
OnChange = cbPOITextBgColorChange
end
object OpenPictureDialog: TOpenPictureDialog
Left = 184
Top = 344
end
object FontDialog: TFontDialog
MinFontSize = 0
MaxFontSize = 0
Left = 40
Top = 528
end
end

View File

@ -0,0 +1,359 @@
unit ConfigFrame;
{$mode ObjFPC}{$H+}
interface
uses
Classes, SysUtils, IniFiles,
Graphics,
Forms, Controls, StdCtrls, Buttons, Dialogs, ExtCtrls, ColorBox, ExtDlgs, Spin,
mvMapViewer, mvEngine,
globals;
type
{ TCfgFrame }
TCfgFrame = class(TFrame)
Bevel1: TBevel;
Bevel3: TBevel;
Bevel4: TBevel;
Bevel5: TBevel;
btnLoadMapProviders: TSpeedButton;
btnPOITextFont: TButton;
btnSaveMapProviders: TSpeedButton;
btnSelectPOIImage: TButton;
cbCyclicView: TCheckBox;
cbDebugTiles: TCheckBox;
cbDoubleBuffer: TCheckBox;
cbPOITextBgColor: TColorBox;
cbPreviewTiles: TCheckBox;
cmbProviders: TComboBox;
cbUseThreads: TCheckBox;
cbZoomToCursor: TCheckBox;
clbBackColor: TColorButton;
edProxyHost: TEdit;
edProxyPassword: TEdit;
edProxyUserName: TEdit;
FontDialog: TFontDialog;
gbProxy: TGroupBox;
LblPOITextBgColor: TLabel;
LblProviders: TLabel;
lblProxyHost: TLabel;
lblProxyPassword: TLabel;
lblProxyPort: TLabel;
lblProxyUserName: TLabel;
OpenPictureDialog: TOpenPictureDialog;
rbNoProxy: TRadioButton;
rbProxyData: TRadioButton;
rbSystemProxy: TRadioButton;
rgPOIMode: TRadioGroup;
seProxyPort: TSpinEdit;
procedure btnLoadMapProvidersClick(Sender: TObject);
procedure btnPOITextFontClick(Sender: TObject);
procedure btnSaveMapProvidersClick(Sender: TObject);
procedure btnSelectPOIImageClick(Sender: TObject);
procedure cbCyclicViewChange(Sender: TObject);
procedure cbDebugTilesChange(Sender: TObject);
procedure cbDoubleBufferChange(Sender: TObject);
procedure cbPOITextBgColorChange(Sender: TObject);
procedure cbPreviewTilesChange(Sender: TObject);
procedure cbUseThreadsChange(Sender: TObject);
procedure cbZoomToCursorChange(Sender: TObject);
procedure clbBackColorColorChanged(Sender: TObject);
procedure cmbProvidersChange(Sender: TObject);
procedure rbNoProxyChange(Sender: TObject);
procedure rgPOIModeClick(Sender: TObject);
procedure rbProxyDataChange(Sender: TObject);
procedure rbSystemProxyChange(Sender: TObject);
private
FMapView: TMapView;
FPOIImage: TCustomBitmap;
FDrawGPSPointEvent: TDrawGpsPointEvent;
FUpdateLayersEvent: TNotifyEvent;
function GetMapProviders: TStrings;
function GetPOIMode: TPOIMode;
function GetPOITextBkColor: TColor;
procedure SetMapView(AValue: TMapView);
protected
procedure DoUpdateLayers; virtual;
procedure UpdateDownloadEngineProxy;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure ReadFromIni(ini: TCustomIniFile); virtual;
procedure WriteToIni(ini: TCustomIniFile); virtual;
property MapView: TMapView read FMapView write SetMapView;
property MapProviders: TStrings read GetMapProviders;
property POIMode: TPOIMode read GetPOIMode;
property POITextBkColor: TColor read GetPOITextBkColor;
property OnDrawGPSPoint: TDrawGpsPointEvent read FDrawGPSPointEvent write FDrawGPSPointEvent;
property OnUpdateLayers: TNotifyEvent read FUpdateLayersEvent write FUpdateLayersEvent;
end;
implementation
{$R *.lfm}
{ TCfgFrame }
constructor TCfgFrame.Create(AOwner: TComponent);
var
fn: String;
begin
inherited;
fn := Application.Location + 'mapmarker.png';
if not FileExists(fn) then
MessageDlg('Copy the file "mapmarker.png" from the source folder to the folder with the executable.',
mtError, [mbOK], 0)
else
begin
FPOIImage := TPortableNetworkGraphic.Create;
FPOIImage.PixelFormat := pf32bit;
FPOIImage.LoadFromFile(fn);
end;
end;
destructor TCfgFrame.Destroy;
begin
FPOIImage.Free;
inherited;
end;
procedure TCfgFrame.btnLoadMapProvidersClick(Sender: TObject);
var
fn: String;
msg: String;
begin
fn := Application.Location + MAP_PROVIDER_FILENAME;
if FileExists(fn) then begin
if MapView.Engine.ReadProvidersFromXML(fn, msg) then begin
MapView.GetMapProviders(cmbProviders.Items);
cmbProviders.ItemIndex := 0;
MapView.MapProvider := cmbProviders.Text;
// sgLayers.Columns[1].PickList.Assign(cmbProviders.Items); // <<--- FIXME
end else
ShowMessage(msg);
end;
end;
procedure TCfgFrame.btnPOITextFontClick(Sender: TObject);
begin
FontDialog.Font.Assign(MapView.Font);
if FontDialog.Execute then
MapView.Font.Assign(FontDialog.Font);
end;
procedure TCfgFrame.btnSaveMapProvidersClick(Sender: TObject);
begin
MapView.Engine.WriteProvidersToXML(Application.Location + MAP_PROVIDER_FILENAME);
end;
procedure TCfgFrame.btnSelectPOIImageClick(Sender: TObject);
begin
OpenPictureDialog.Filter := 'PNG files|*.png|BMP files|*.bmp';
OpenPictureDialog.DefaultExt := '.png';
if OpenPictureDialog.Execute then
begin
FPOIImage.LoadFromFile(OpenPictureDialog.FileName);
MapView.POIImage.Assign(FPOIImage);
end;
end;
procedure TCfgFrame.cbCyclicViewChange(Sender: TObject);
begin
MapView.Cyclic := cbCyclicView.Checked;
DoUpdateLayers;
end;
procedure TCfgFrame.cbDebugTilesChange(Sender: TObject);
begin
MapView.DebugTiles := CbDebugTiles.Checked;
MapView.Invalidate;
end;
procedure TCfgFrame.cbDoubleBufferChange(Sender: TObject);
begin
MapView.DoubleBuffered := cbDoubleBuffer.Checked;
end;
procedure TCfgFrame.cbPOITextBgColorChange(Sender: TObject);
begin
MapView.POITextBgColor := cbPOITextBgColor.Selected;
end;
procedure TCfgFrame.cbPreviewTilesChange(Sender: TObject);
begin
MapView.DrawPreviewTiles := cbPreviewTiles.Checked;
end;
procedure TCfgFrame.cbUseThreadsChange(Sender: TObject);
begin
MapView.UseThreads := cbUseThreads.Checked;
DoUpdateLayers;
end;
procedure TCfgFrame.clbBackColorColorChanged(Sender: TObject);
begin
MapView.InactiveColor := clbBackColor.ButtonColor;
end;
procedure TCfgFrame.cbZoomToCursorChange(Sender: TObject);
begin
MapView.ZoomToCursor := CbZoomToCursor.Checked;
end;
procedure TCfgFrame.cmbProvidersChange(Sender: TObject);
begin
MapView.MapProvider := cmbProviders.Text;
end;
procedure TCfgFrame.DoUpdateLayers;
begin
if Assigned(FUpdateLayersEvent) then
FUpdateLayersEvent(Self);
end;
function TCfgFrame.GetMapProviders: TStrings;
begin
Result := cmbProviders.Items;
end;
function TCfgFrame.GetPOIMode: TPOIMode;
begin
Result := TPOIMode(rgPOIMode.ItemIndex);
end;
function TCfgFrame.GetPOITextBkColor: TColor;
begin
Result := cbPOITextBgColor.Selected;
end;
procedure TCfgFrame.ReadFromIni(ini: TCustomIniFile);
var
n: Integer;
s: String;
begin
n := ini.ReadInteger('Proxy', 'UseProxy', 0);
case n of
0: rbNoProxy.Checked := true;
1: rbSystemProxy.Checked := true;
2: rbProxyData.Checked := true;
end;
edProxyHost.Text := ini.ReadString('Proxy', 'ProxyHost', edProxyHost.Text);
seProxyPort.Value := ini.ReadInteger('Proxy', 'ProxyPort', seProxyPort.Value);
edProxyUserName.Text := ini.ReadString('Proxy', 'ProxyName', edProxyUserName.Text);
edProxyPassword.Text := ini.ReadString('Proxy', 'ProxyPassword', edProxyPassword.Text);
UpdateDownloadEngineProxy;
// The following parameters already have been read by the main form,
// we still must update the frame controls.
MapView.GetMapProviders(cmbProviders.Items);
cmbProviders.ItemIndex := cmbProviders.Items.IndexOf(MapView.MapProvider);
clbBackColor.ButtonColor := MapView.InactiveColor;
end;
procedure TCfgFrame.rbNoProxyChange(Sender: TObject);
begin
UpdateDownloadEngineProxy;
end;
procedure TCfgFrame.rbProxyDataChange(Sender: TObject);
begin
UpdateDownloadEngineProxy;
end;
procedure TCfgFrame.rbSystemProxyChange(Sender: TObject);
begin
UpdateDownloadEngineProxy;
end;
procedure TCfgFrame.rgPOIModeClick(Sender: TObject);
begin
case rgPOIMode.ItemIndex of
0: begin // default symbol
if MapView.POIImage <> nil then MapView.POIImage.Clear;
MapView.OnDrawGPSPoint := nil;
end;
1: begin // default POI image
MapView.POIImage := FPOIImage;
MapView.OnDrawGPSPoint := nil;
end;
2: begin // image from image list, to be applied to the next POI only
//
end;
3: begin // custom-drawn symbol
if MapView.POIImage <> nil then MapView.POIImage.Clear;
MapView.OnDrawGPSPoint := FDrawGpsPointEvent;
end;
end;
MapView.Invalidate;
btnSelectPOIImage.Enabled := (rgPOIMode.ItemIndex = 1);
end;
procedure TCfgFrame.SetMapView(AValue: TMapView);
begin
if FMapView = AValue then
exit;
FMapView := AValue;
if FMapView = nil then
raise Exception.Create('[TCfgFrame.SetMapView] New mapview is nil.');
FMapView.GetMapProviders(cmbProviders.Items);
cmbProviders.ItemIndex := cmbProviders.Items.IndexOf(FMapView.MapProvider);
//sgLayers.Columns[1].PickList.Assign(CbProviders.Items); // << --- FIX ME
FMapView.DoubleBuffered := true;
FMapView.Zoom := 1;
cbZoomToCursor.Checked := FMapView.ZoomToCursor;
cbUseThreads.Checked := FMapView.UseThreads;
cbDoubleBuffer.Checked := FMapView.DoubleBuffered;
cbPOITextBgColor.Selected := FMapView.POITextBgColor;
cbPOITextBgColor.ItemHeight := cmbProviders.ItemHeight + 2;
clbBackColor.ButtonColor := FMapView.InactiveColor;
FDrawGPSpointEvent := FMapView.OnDrawGPSPoint;
end;
procedure TCfgFrame.UpdateDownloadEngineProxy;
begin
if MapView.DownloadEngine.HasProxySupport then
begin
MapView.DownloadEngine.SetProxy(
rbSystemProxy.Checked, rbProxyData.Checked,
edProxyHost.Name, seProxyPort.Value, edProxyUserName.Text, edProxyPassword.Text
);
rbSystemProxy.Enabled := MapView.DownloadEngine.SupportsSystemProxy;
lblProxyHost.Enabled := rbProxyData.Checked;
edProxyHost.Enabled := rbProxyData.Checked;
lblProxyPort.Enabled := rbProxyData.Checked;
seProxyPort.Enabled := rbProxyData.Checked;
lblProxyUserName.Enabled := rbProxyData.Checked;
edProxyUserName.Enabled := rbProxyData.Checked;
lblProxyPassword.Enabled := rbProxyData.Checked;
edProxyPassword.Enabled := rbProxyData.Checked;
end;
end;
procedure TCfgFrame.WriteToIni(ini: TCustomIniFile);
var
n: Integer = 0;
begin
if rbSystemProxy.Checked then
n := 1
else if rbProxyData.Checked then
n := 2;
ini.EraseSection('Proxy');
ini.WriteInteger('Proxy', 'UseProxy', n);
ini.WriteString('Proxy', 'ProxyHost', edProxyHost.Text);
ini.WriteInteger('Proxy', 'ProxyPort', seProxyPort.Value);
ini.WriteString('Proxy', 'ProxyName', edProxyUserName.Text);
ini.WriteString('Proxy', 'ProxyPassword', edProxyPassword.Text);
end;
end.

View File

@ -0,0 +1,139 @@
inherited CfgFrame_with_addons: TCfgFrame_with_addons
inherited LblProviders: TLabel
AnchorSideTop.Control = Owner
end
inherited cmbProviders: TComboBox
AnchorSideLeft.Control = Owner
end
inherited btnSaveMapProviders: TSpeedButton
AnchorSideRight.Control = Owner
end
inherited gbProxy: TGroupBox
AnchorSideLeft.Control = Owner
AnchorSideTop.Control = cbDownloadEngine
AnchorSideRight.Control = Owner
Top = 154
BorderSpacing.Top = 6
end
inherited cbZoomToCursor: TCheckBox
AnchorSideLeft.Control = Owner
Top = 347
end
inherited cbUseThreads: TCheckBox
Top = 370
end
inherited cbDoubleBuffer: TCheckBox
Top = 393
end
inherited cbDebugTiles: TCheckBox
Top = 416
end
inherited cbCyclicView: TCheckBox
Top = 347
end
inherited cbPreviewTiles: TCheckBox
Top = 370
end
inherited clbBackColor: TColorButton
Top = 388
end
inherited Bevel1: TBevel
Top = 441
end
inherited rgPOIMode: TRadioGroup
AnchorSideRight.Control = Owner
Top = 449
end
inherited btnPOITextFont: TButton
Top = 585
end
inherited LblPOITextBgColor: TLabel
Top = 593
end
inherited cbPOITextBgColor: TColorBox
Top = 590
end
object Label1: TLabel[17]
AnchorSideLeft.Control = cbDrawingEngine
AnchorSideTop.Control = cmbProviders
AnchorSideTop.Side = asrBottom
Left = 6
Height = 15
Top = 56
Width = 86
BorderSpacing.Top = 8
Caption = 'Drawing engine:'
ParentColor = False
end
object cbDrawingEngine: TComboBox[18]
AnchorSideLeft.Control = Owner
AnchorSideTop.Control = Label1
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
Left = 6
Height = 23
Top = 73
Width = 275
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 6
BorderSpacing.Top = 2
BorderSpacing.Right = 6
ItemHeight = 15
ItemIndex = 0
Items.Strings = (
'default'
'RGBGraphics'
'BGRABitmap'
'LCL'
)
Style = csDropDownList
TabOrder = 11
Text = 'default'
OnChange = cbDrawingEngineChange
end
object Label2: TLabel[19]
AnchorSideLeft.Control = cbDownloadEngine
AnchorSideTop.Control = cbDrawingEngine
AnchorSideTop.Side = asrBottom
Left = 6
Height = 15
Top = 104
Width = 96
BorderSpacing.Top = 8
Caption = 'Download engine:'
ParentColor = False
end
object cbDownloadEngine: TComboBox[20]
AnchorSideLeft.Control = Owner
AnchorSideTop.Control = Label2
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = Owner
AnchorSideRight.Side = asrBottom
Left = 6
Height = 23
Top = 121
Width = 275
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 6
BorderSpacing.Top = 2
BorderSpacing.Right = 6
ItemHeight = 15
ItemIndex = 0
Items.Strings = (
'default'
'Synapse'
'FpHTTPClient'
'WinInet'
)
Style = csDropDownList
TabOrder = 12
Text = 'default'
OnChange = cbDownloadEngineChange
end
inherited OpenPictureDialog: TOpenPictureDialog[21]
end
inherited FontDialog: TFontDialog[22]
Top = 616
end
end

View File

@ -0,0 +1,108 @@
unit ConfigFrame_with_Addons;
{$mode ObjFPC}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls,
mvDrawingEngine, mvDE_RGBGraphics, mvDE_BGRA, mvDE_LCL,
mvDLEFPC, mvDLEWin, mvDLESynapse,
ConfigFrame;
type
{ TCfgFrame_with_addons }
TCfgFrame_with_addons = class(TCfgFrame)
cbDownloadEngine: TComboBox;
cbDrawingEngine: TComboBox;
Label1: TLabel;
Label2: TLabel;
procedure cbDownloadEngineChange(Sender: TObject);
procedure cbDrawingEngineChange(Sender: TObject);
private
FRGBGraphicsDrawingEngine: TMvRGBGraphicsDrawingEngine;
FBGRADrawingEngine: TMvBGRADrawingEngine;
FLCLDrawingEngine: TMvLCLDrawingEngine;
FSynapseDownloadEngine: TMvDESynapse;
FFpHttpClientDownloadEngine: TMvDEFPC;
{$IFDEF MSWINDOWS}
FWinDownloadEngine: TMvDEWin;
{$ENDIF}
public
destructor Destroy; override;
end;
implementation
{$R *.lfm}
{ TCfgFrame_with_addons }
destructor TCfgFrame_with_addons.Destroy;
begin
FreeAndNil(FRGBGraphicsDrawingEngine);
FreeAndNil(FBGRADrawingEngine);
FreeAndNil(FSynapseDownloadEngine);
FreeAndNil(FFpHttpClientDownloadEngine);
{$IFDEF MSWINDOWS}
FreeAndNil(FWinDownloadEngine);
{$ENDIF}
inherited;
end;
procedure TCfgFrame_with_addons.cbDrawingEngineChange(Sender: TObject);
begin
case cbDrawingEngine.ItemIndex of
0: MapView.DrawingEngine := nil;
1: begin
if FRGBGraphicsDrawingEngine = nil then
FRGBGraphicsDrawingEngine := TMvRGBGraphicsDrawingEngine.Create(self);
MapView.DrawingEngine := FRGBGraphicsDrawingEngine;
end;
2: begin
if FBGRADrawingEngine = nil then
FBGRADrawingEngine := TMvBGRADrawingEngine.Create(self);
MapView.DrawingEngine := FBGRADrawingEngine;
end;
3: begin
if FLCLDrawingEngine = nil then
FLCLDrawingEngine := TMvLCLDrawingEngine.Create(self);
MapView.DrawingEngine := FLCLDrawingEngine;
end;
end;
DoUpdateLayers;
end;
procedure TCfgFrame_with_addons.cbDownloadEngineChange(Sender: TObject);
begin
case cbDownloadEngine.ItemIndex of
0: MapView.DownloadEngine := nil;
1: begin
if FSynapseDownloadEngine = nil then
FSynapseDownloadEngine := TMvDESynapse.Create(self);
MapView.DownloadEngine := FSynapseDownloadEngine;
end;
2: begin
if FFpHttpClientDownloadEngine = nil then
FFpHttpClientDownloadEngine := TMvDEFPC.Create(self);
MapView.DownloadEngine := FFpHttpClientDownloadEngine;
end;
3: begin
{$IFDEF MSWINDOWS}
if FWinDownloadEngine = nil then
FWinDownloadEngine := TMvDEWin.Create(Self);
MapView.DownloadEngine := FWinDownloadEngine;
{$ELSE}
ShowMessage('WinInet download engine can only be used in Windows.');
{$ENDIF}
end;
end;
UpdateDownloadEngineProxy;
end;
end.

View File

@ -7,9 +7,14 @@ interface
uses
Classes, SysUtils, mvEngine;
type
TPOIMode = (pmDefaultDrawing, pmDefaultImage, pmImageList, pmCustomDrawing);
const
MAP_PROVIDER_FILENAME = 'map-providers.xml';
const
DistanceUnit_Names: array[TDistanceUnits] of string = ('m', 'km', 'miles');
var
DistanceUnit: TDistanceUnits = duKilometers;

View File

@ -1,7 +1,7 @@
object MainForm: TMainForm
Left = 381
Left = 375
Height = 586
Top = 187
Top = 177
Width = 750
Caption = 'LazMapViewer'
ClientHeight = 586
@ -40,9 +40,9 @@ object MainForm: TMainForm
Height = 586
Top = 0
Width = 275
ActivePage = PgConfig
ActivePage = PgData
Align = alRight
TabIndex = 2
TabIndex = 0
TabOrder = 1
object PgData: TTabSheet
Caption = 'Data'
@ -715,534 +715,6 @@ object MainForm: TMainForm
end
object PgConfig: TTabSheet
Caption = 'Config'
ClientHeight = 558
ClientWidth = 267
object LblProviders: TLabel
AnchorSideLeft.Control = CbProviders
AnchorSideTop.Control = PgConfig
Left = 4
Height = 15
Top = 8
Width = 52
BorderSpacing.Top = 8
Caption = 'Providers:'
FocusControl = CbProviders
ParentColor = False
end
object CbProviders: TComboBox
AnchorSideLeft.Control = PgConfig
AnchorSideTop.Control = LblProviders
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = BtnLoadMapProviders
Left = 4
Height = 23
Top = 25
Width = 193
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 4
BorderSpacing.Top = 2
BorderSpacing.Right = 2
DropDownCount = 24
ItemHeight = 15
Style = csDropDownList
TabOrder = 0
OnChange = CbProvidersChange
end
object BtnLoadMapProviders: TSpeedButton
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = CbProviders
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = BtnSaveMapProviders
Left = 199
Height = 28
Top = 22
Width = 30
Anchors = [akTop, akRight]
BorderSpacing.Right = 2
Glyph.Data = {
36040000424D3604000000000000360000002800000010000000100000000100
2000000000000004000064000000640000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000003591
DBFA439FDDFA439FDDFA429FDDFA429EDDFA419EDCFA419EDCFA419EDCFA419E
DCFA419EDCFA419EDCFA419EDCFA3792DAFB3080DF100000000000000000429C
DEF76EC7EBFF6DC7EAFF6BC6EAFF6AC5E9FF68C4E9FF67C3E8FF65C2E8FF64C1
E7FF63C0E7FF61BFE6FF60BEE5FF51AFE3FE308CD6450000000000000000409A
DDF47CD0F1FF7BD0F0FF7ACFEFFF79CEEFFF77CDEEFF76CCEEFF74CBEDFF73CA
EDFF71C9ECFF70C8ECFF6EC7EBFF6AC3E9FF3993DB8E00000000000000003E99
DCEC7ECEF1FF8AD9F6FF89D8F5FF87D7F4FF86D6F4FF84D5F3FF83D5F3FF81D4
F2FF80D3F2FF7ED2F1FF7DD1F1FF7BD0F0FF439ADEB40000000000000000409B
DDE470C1EDFF99E2FBFF97E2FBFF96E1FAFF94E0F9FF93DFF9FF91DEF8FF90DD
F8FF8EDCF7FF8DDBF7FF8CDAF6FF8AD9F6FF4EA4E2CD00000000000000004AA5
E0DF61B3E8FFA3E9FFFFA3E9FFFFA3E9FFFFA3E9FFFFA2E8FEFFA0E7FEFF9FE6
FDFF9DE5FDFF9CE4FCFF9AE3FCFF99E2FBFF5FB3E9E33080DF100000000051A8
E2DF5EB2E8FFA3E9FFFFA3E9FFFFA3E9FFFFA3E9FFFFA3E9FFFFA3E9FFFFA3E9
FFFFA3E9FFFFA3E9FFFFA3E9FFFFA3E9FFFF84CFF5FB348CDA450000000058AD
E5DF60B3E8FF61B3E9FF61B3E9FF60B2E9FF60B2E8FF60B2E8FF5FB1E8FF5FB1
E8FF5EB1E8FF5EB1E8FF5EB1E7FF59ADE7FB55A9E5E33B94DC85000000005FB0
E8DF9DE4FBFF9AE3FAFF97E1F9FF94DFF8FF91DDF7FF8EDBF5FF8BD9F4FF88D8
F3FF85D6F2FF82D4F1FF7FD2F0FF4FA7E1DF00000000000000000000000061B1
E8DFA6EAFFFFA6EAFFFFA6EAFFFFA3E8FEFF7AC6F1ED59ACE6DF58AAE5DF57AA
E5DF56AAE5DF53A9E4DF53A8E4DF3C94DCE20000000000000000000000004096
DEE25DAEE7DF5DAEE7DF5DAEE7DF57A9E6DF4399DF6E00000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000
}
OnClick = BtnLoadMapProvidersClick
end
object BtnSaveMapProviders: TSpeedButton
AnchorSideLeft.Control = BtnLoadMapProviders
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = CbProviders
AnchorSideTop.Side = asrCenter
AnchorSideRight.Control = PgConfig
AnchorSideRight.Side = asrBottom
Left = 231
Height = 28
Top = 22
Width = 32
Anchors = [akTop, akRight]
BorderSpacing.Right = 4
Glyph.Data = {
36040000424D3604000000000000360000002800000010000000100000000100
2000000000000004000064000000640000000000000000000000A4653455A465
34FFA46534FFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BD
BAFFA46534FFA46534FFA46534FFA46534FFA46534FF00000000A46534FFA465
34FFA46534FFB6BDBAFFA46534FFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BD
BAFFA46534FFA46534FFA46534FFA46534FFA46534FF00000000A46534FFA465
34FFA46534FFB6BDBAFFA46534FFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BD
BAFFA46534FFA46534FFA46534FFA46534FFA46534FF00000000A46534FFA465
34FFA46534FFB6BDBAFFA46534FFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BD
BAFFA46534FFA46534FFA46534FFA46534FFA46534FF00000000A46534FFA465
34FFA46534FFB6BDBAFFA46534FFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BD
BAFFA46534FFA46534FFA46534FFA46534FFA46534FF00000000A46534FFA465
34FFA46534FFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BDBAFFB6BD
BAFFA46534FFA46534FFA46534FFA46534FFA46534FF00000000A46534FFA465
34FFA46534FFA46534FFA46534FFA46534FFA46534FFA46534FFA46534FFA465
34FFA46534FFA46534FFA46534FFA46534FFA46534FF00000000A46534FFA465
34FFA46534FFA46534FFA46534FFA46534FFA46534FFA46534FFA46534FFA465
34FFA46534FFA46534FFA46534FFA46534FFA46534FF00000000A46534FFECEE
EEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEE
EEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFA46534FF00000000A46534FFECEE
EEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEE
EEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFA46534FF00000000A46534FFECEE
EEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEE
EEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFA46534FF00000000A46534FFECEE
EEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEE
EEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFA46534FF00000000A46534FFECEE
EEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEE
EEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFA46534FF00000000A46534FFECEE
EEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFECEE
EEFFECEEEEFFECEEEEFFECEEEEFFECEEEEFFA46534FF00000000A46534FF5959
F3FF5959F3FF5959F3FF5959F3FF5959F3FF5959F3FF5959F3FF5959F3FF5959
F3FF5959F3FF5959F3FF5959F3FF5959F3FFA46534FF00000000A46534FF5959
F3FF5959F3FF5959F3FF5959F3FF5959F3FF5959F3FF5959F3FF5959F3FF5959
F3FF5959F3FF5959F3FF5959F3FF5959F3FFA46534FF00000000
}
OnClick = BtnSaveMapProvidersClick
end
object CbUseThreads: TCheckBox
AnchorSideLeft.Control = PgConfig
AnchorSideTop.Control = CbZoomToCursor
AnchorSideTop.Side = asrBottom
Left = 4
Height = 19
Top = 272
Width = 79
BorderSpacing.Left = 4
BorderSpacing.Top = 4
Caption = 'Use threads'
Checked = True
State = cbChecked
TabOrder = 4
OnChange = CbUseThreadsChange
end
object CbDoubleBuffer: TCheckBox
AnchorSideLeft.Control = CbUseThreads
AnchorSideTop.Control = CbUseThreads
AnchorSideTop.Side = asrBottom
Left = 4
Height = 19
Top = 295
Width = 85
BorderSpacing.Top = 4
BorderSpacing.Right = 6
Caption = 'DblBuffering'
Checked = True
State = cbChecked
TabOrder = 6
OnChange = CbDoubleBufferChange
end
object CbDebugTiles: TCheckBox
AnchorSideLeft.Control = CbDoubleBuffer
AnchorSideTop.Control = CbDoubleBuffer
AnchorSideTop.Side = asrBottom
Left = 4
Height = 19
Top = 318
Width = 77
BorderSpacing.Top = 4
Caption = 'Debug tiles'
TabOrder = 7
OnChange = CbDebugTilesChange
end
object BtnPOITextFont: TButton
AnchorSideLeft.Control = rgPOIMode
AnchorSideTop.Control = rgPOIMode
AnchorSideTop.Side = asrBottom
Left = 4
Height = 30
Top = 487
Width = 87
BorderSpacing.Top = 8
Caption = 'POI text font'
TabOrder = 9
OnClick = BtnPOITextFontClick
end
object cbPOITextBgColor: TColorBox
AnchorSideLeft.Control = LblPOITextBgColor
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = BtnPOITextFont
AnchorSideTop.Side = asrCenter
AnchorSideRight.Side = asrBottom
Left = 142
Height = 21
Top = 492
Width = 119
NoneColorColor = clWhite
Style = [cbStandardColors, cbExtendedColors, cbIncludeNone, cbCustomColor, cbPrettyNames, cbCustomColors]
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Left = 6
ItemHeight = 15
TabOrder = 10
OnChange = cbPOITextBgColorChange
end
object LblPOITextBgColor: TLabel
AnchorSideLeft.Control = BtnPOITextFont
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = BtnPOITextFont
AnchorSideTop.Side = asrCenter
Left = 97
Height = 15
Top = 495
Width = 39
BorderSpacing.Left = 6
Caption = 'Backgr.'
ParentColor = False
end
object Bevel1: TBevel
AnchorSideLeft.Control = CbDebugTiles
AnchorSideTop.Control = CbDebugTiles
AnchorSideTop.Side = asrBottom
AnchorSideRight.Side = asrBottom
Left = 4
Height = 2
Top = 343
Width = 257
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Top = 6
Shape = bsTopLine
end
object rgPOIMode: TRadioGroup
AnchorSideLeft.Control = CbProviders
AnchorSideTop.Control = Bevel1
AnchorSideTop.Side = asrBottom
Left = 4
Height = 128
Top = 351
Width = 233
AutoFill = False
BorderSpacing.Top = 6
Caption = 'POI Mode'
ChildSizing.LeftRightSpacing = 12
ChildSizing.TopBottomSpacing = 4
ChildSizing.ShrinkHorizontal = crsScaleChilds
ChildSizing.ShrinkVertical = crsScaleChilds
ChildSizing.Layout = cclTopToBottomThenLeftToRight
ChildSizing.ControlsPerLine = 4
ClientHeight = 108
ClientWidth = 229
ItemIndex = 0
Items.Strings = (
'default drawing'
'default POI image'
'image from imagelist'
'custom drawing'
)
TabOrder = 8
OnClick = rgPOIModeClick
object Bevel3: TBevel
Left = 151
Height = 25
Top = 4
Width = 66
Constraints.MaxHeight = 25
Shape = bsSpacer
end
object BtnSelectPOIImage: TButton
Left = 151
Height = 25
Top = 29
Width = 66
AutoSize = True
BorderSpacing.Left = 8
Caption = 'Select...'
Enabled = False
TabOrder = 4
OnClick = BtnSelectPOIImageClick
end
object Bevel4: TBevel
Left = 151
Height = 25
Top = 54
Width = 66
Constraints.MaxHeight = 25
Shape = bsSpacer
end
object Bevel5: TBevel
Left = 151
Height = 25
Top = 79
Width = 66
Constraints.MaxHeight = 25
Shape = bsSpacer
end
end
object CbZoomToCursor: TCheckBox
AnchorSideLeft.Control = PgConfig
AnchorSideTop.Control = gbProxy
AnchorSideTop.Side = asrBottom
Left = 4
Height = 19
Top = 249
Width = 100
BorderSpacing.Left = 4
BorderSpacing.Top = 8
BorderSpacing.Right = 16
Caption = 'Zoom to cursor'
Checked = True
State = cbChecked
TabOrder = 2
OnChange = CbZoomToCursorChange
end
object cbCyclicView: TCheckBox
AnchorSideLeft.Control = CbZoomToCursor
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = CbZoomToCursor
Left = 120
Height = 19
Top = 249
Width = 77
Caption = 'Cyclic view'
Checked = True
State = cbChecked
TabOrder = 3
OnChange = cbCyclicViewChange
end
object clbBackColor: TColorButton
AnchorSideLeft.Control = cbCyclicView
AnchorSideTop.Control = CbDoubleBuffer
AnchorSideTop.Side = asrCenter
Left = 120
Height = 28
Top = 290
Width = 108
BorderWidth = 2
ButtonColorAutoSize = False
ButtonColorSize = 15
ButtonColor = clWhite
Caption = 'Map backgr.'
Margin = 4
OnColorChanged = clbBackColorColorChanged
end
object CbPreviewTiles: TCheckBox
AnchorSideLeft.Control = cbCyclicView
AnchorSideTop.Control = CbUseThreads
Left = 120
Height = 19
Top = 272
Width = 83
Caption = 'Preview tiles'
Checked = True
State = cbChecked
TabOrder = 5
OnChange = CbPreviewTilesChange
end
object gbProxy: TGroupBox
AnchorSideLeft.Control = PgConfig
AnchorSideTop.Control = CbProviders
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = PgConfig
AnchorSideRight.Side = asrBottom
Left = 4
Height = 185
Top = 56
Width = 259
Anchors = [akTop, akLeft, akRight]
AutoSize = True
BorderSpacing.Top = 4
BorderSpacing.Around = 4
Caption = 'Proxy'
ClientHeight = 165
ClientWidth = 255
TabOrder = 1
object lblProxyHost: TLabel
AnchorSideLeft.Control = rbNoProxy
AnchorSideTop.Control = edProxyHost
AnchorSideTop.Side = asrCenter
Left = 20
Height = 15
Top = 65
Width = 28
BorderSpacing.Left = 10
Caption = 'Host:'
ParentColor = False
end
object edProxyHost: TEdit
AnchorSideLeft.Control = edProxyUserName
AnchorSideTop.Control = rbProxyData
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = gbProxy
AnchorSideRight.Side = asrBottom
Left = 85
Height = 23
Top = 61
Width = 164
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Right = 6
TabOrder = 3
OnChange = rbProxyChange
end
object lblProxyPort: TLabel
AnchorSideLeft.Control = lblProxyHost
AnchorSideTop.Control = seProxyPort
AnchorSideTop.Side = asrCenter
Left = 20
Height = 15
Top = 90
Width = 22
Caption = 'Port'
ParentColor = False
end
object seProxyPort: TSpinEdit
AnchorSideLeft.Control = lblProxyUserName
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = edProxyHost
AnchorSideTop.Side = asrBottom
Left = 85
Height = 23
Top = 86
Width = 70
BorderSpacing.Top = 2
MaxValue = 65535
TabOrder = 4
OnChange = rbProxyChange
end
object lblProxyUserName: TLabel
AnchorSideLeft.Control = lblProxyHost
AnchorSideTop.Control = edProxyUserName
AnchorSideTop.Side = asrCenter
Left = 20
Height = 15
Top = 115
Width = 59
BorderSpacing.Right = 6
Caption = 'User name:'
ParentColor = False
end
object edProxyUserName: TEdit
AnchorSideLeft.Control = lblProxyUserName
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = seProxyPort
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = gbProxy
AnchorSideRight.Side = asrBottom
Left = 85
Height = 23
Top = 111
Width = 164
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Top = 2
BorderSpacing.Right = 6
TabOrder = 5
OnChange = rbProxyChange
end
object lblProxyPassword: TLabel
AnchorSideLeft.Control = lblProxyHost
AnchorSideTop.Control = edProxyPassword
AnchorSideTop.Side = asrCenter
Left = 20
Height = 15
Top = 140
Width = 50
Caption = 'Password'
ParentColor = False
end
object edProxyPassword: TEdit
AnchorSideLeft.Control = edProxyUserName
AnchorSideTop.Control = edProxyUserName
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = gbProxy
AnchorSideRight.Side = asrBottom
Left = 85
Height = 23
Top = 136
Width = 164
Anchors = [akTop, akLeft, akRight]
BorderSpacing.Top = 2
BorderSpacing.Right = 6
BorderSpacing.Bottom = 6
TabOrder = 6
OnChange = rbProxyChange
end
object rbProxyData: TRadioButton
AnchorSideLeft.Control = rbNoProxy
AnchorSideTop.Control = rbSystemProxy
AnchorSideTop.Side = asrBottom
Left = 10
Height = 19
Top = 42
Width = 74
BorderSpacing.Top = 2
Caption = 'Proxy data'
TabOrder = 2
OnChangeBounds = rbProxyChange
end
object rbNoProxy: TRadioButton
AnchorSideLeft.Control = gbProxy
AnchorSideTop.Control = gbProxy
Left = 10
Height = 19
Top = 0
Width = 67
BorderSpacing.Left = 10
Caption = 'No proxy'
TabOrder = 0
OnChange = rbProxyChange
end
object rbSystemProxy: TRadioButton
AnchorSideLeft.Control = rbNoProxy
AnchorSideTop.Control = rbNoProxy
AnchorSideTop.Side = asrBottom
Left = 10
Height = 19
Top = 21
Width = 110
BorderSpacing.Top = 2
Caption = 'Use system proxy'
Checked = True
TabOrder = 1
TabStop = True
OnChange = rbProxyChange
end
end
end
end
object GeoNames: TMVGeoNames

View File

@ -1,3 +1,10 @@
{ This file is used by the "MapViewer_Demo" and the "MapViewer_Demo_with_Addons"
projects.
Active define WITH_ADDONS in the project options for "MapViewer_Demo_with_Addons"
and make sure that the addon packages are listed as requirements.
}
unit Main;
{$mode objfpc}{$H+}
@ -6,65 +13,39 @@ interface
uses
Classes, SysUtils, Types, Forms, Controls, Graphics, Dialogs, ExtCtrls,
StdCtrls, ComCtrls, Buttons, IntfGraphics, ColorBox, Spin, PrintersDlgs,
mvGeoNames, mvMapViewer, mvTypes, mvGpsObj, mvDrawingEngine, Grids, ExtDlgs;
StdCtrls, ComCtrls, Buttons, IntfGraphics, PrintersDlgs,
Grids, ExtDlgs,
mvGeoNames, mvMapViewer, mvTypes, mvGpsObj, mvDrawingEngine,
{$IFDEF WITH_ADDONS}ConfigFrame_with_Addons{$ELSE}ConfigFrame{$ENDIF};
type
{ TMainForm }
TMainForm = class(TForm)
Bevel1: TBevel;
Bevel2: TBevel;
Bevel3: TBevel;
Bevel4: TBevel;
Bevel5: TBevel;
BtnSearch: TButton;
BtnGoTo: TButton;
BtnGPSPoints: TButton;
BtnSaveToFile: TButton;
BtnLoadGPXFile: TButton;
BtnPOITextFont: TButton;
BtnPrintMap: TButton;
BtnSelectPOIImage: TButton;
CbDoubleBuffer: TCheckBox;
CbFoundLocations: TComboBox;
CbLocations: TComboBox;
CbProviders: TComboBox;
OpenPictureDialog: TOpenPictureDialog;
PgLayers: TTabSheet;
rbSystemProxy: TRadioButton;
rbNoProxy: TRadioButton;
rbProxyData: TRadioButton;
CbUseThreads: TCheckBox;
CbMouseCoords: TGroupBox;
CbDistanceUnits: TComboBox;
CbDebugTiles: TCheckBox;
cbPOITextBgColor: TColorBox;
CbZoomToCursor: TCheckBox;
cbCyclicView: TCheckBox;
CbPreviewTiles: TCheckBox;
clbBackColor: TColorButton;
edProxyHost: TEdit;
edProxyUserName: TEdit;
edProxyPassword: TEdit;
FontDialog: TFontDialog;
GbCenterCoords: TGroupBox;
GbScreenSize: TGroupBox;
GbSearch: TGroupBox;
GbGPS: TGroupBox;
gbProxy: TGroupBox;
InfoCenterLatitude: TLabel;
InfoViewportHeight: TLabel;
InfoCenterLongitude: TLabel;
InfoBtnGPSPoints: TLabel;
GPSPointInfo: TLabel;
InfoViewportWidth: TLabel;
lblProxyUserName: TLabel;
lblProxyPort: TLabel;
lblProxyHost: TLabel;
LblPOITextBgColor: TLabel;
lblProxyPassword: TLabel;
LblSelectLocation: TLabel;
LblCenterLatitude: TLabel;
LblViewportHeight: TLabel;
@ -74,20 +55,15 @@ type
InfoPositionLongitude: TLabel;
InfoPositionLatitude: TLabel;
LblCenterLongitude: TLabel;
LblProviders: TLabel;
LblZoom: TLabel;
MapView: TMapView;
GeoNames: TMVGeoNames;
BtnLoadMapProviders: TSpeedButton;
BtnSaveMapProviders: TSpeedButton;
OpenDialog: TOpenDialog;
PageControl: TPageControl;
PgData: TTabSheet;
PgConfig: TTabSheet;
POIImages: TImageList;
PrintDialog: TPrintDialog;
rgPOIMode: TRadioGroup;
seProxyPort: TSpinEdit;
sgLayers: TStringGrid;
rgDrawMode: TRadioGroup;
lblOpacity: TLabel;
@ -100,21 +76,9 @@ type
procedure BtnGPSPointsClick(Sender: TObject);
procedure BtnSaveToFileClick(Sender: TObject);
procedure BtnPOITextFontClick(Sender: TObject);
procedure BtnSelectPOIImageClick(Sender: TObject);
procedure cbCyclicViewChange(Sender: TObject);
procedure CbDebugTilesChange(Sender: TObject);
procedure CbDoubleBufferChange(Sender: TObject);
procedure CbFoundLocationsDrawItem(Control: TWinControl; Index: Integer;
ARect: TRect; State: TOwnerDrawState);
procedure cbPOITextBgColorChange(Sender: TObject);
procedure CbPreviewTilesChange(Sender: TObject);
procedure CbProvidersChange(Sender: TObject);
procedure rbProxyChange(Sender: TObject);
procedure CbShowPOIImageChange(Sender: TObject);
procedure CbUseThreadsChange(Sender: TObject);
procedure CbDistanceUnitsChange(Sender: TObject);
procedure CbZoomToCursorChange(Sender: TObject);
procedure clbBackColorColorChanged(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormShow(Sender: TObject);
@ -128,23 +92,18 @@ type
procedure MapViewMouseUp(Sender: TObject; Button: TMouseButton;
{%H-}Shift: TShiftState; X, Y: Integer);
procedure MapViewZoomChange(Sender: TObject);
procedure BtnLoadMapProvidersClick(Sender: TObject);
procedure BtnSaveMapProvidersClick(Sender: TObject);
procedure rgDrawModeSelectionChanged(Sender: TObject);
procedure rgPOIModeClick(Sender: TObject);
procedure sgLayersCheckboxToggled(sender: TObject; aCol, aRow: Integer;
aState: TCheckboxState);
procedure sgLayersCheckboxToggled({%H-}Sender: TObject; {%H-}aCol, {%H-}aRow: Integer; aState: TCheckboxState);
procedure sgLayersEditingDone(Sender: TObject);
procedure sgLayersSelection(Sender: TObject; aCol, aRow: Integer);
procedure sgLayersSelection(Sender: TObject; {%H-}aCol, aRow: Integer);
procedure tbOpacityChange(Sender: TObject);
procedure UpdateLayers;
procedure UpdateLayers(Sender: TObject);
procedure ZoomTrackBarChange(Sender: TObject);
private
POIImage: TCustomBitmap;
CfgFrame: {$IFDEF WITH_ADDONS}TCfgFrame_with_Addons{$ELSE}TCfgFrame{$ENDIF};
procedure ClearFoundLocations;
procedure UpdateCoords(X, Y: Integer);
procedure UpdateDownloadEngineProxy;
procedure UpdateDropdownWidth(ACombobox: TCombobox);
procedure UpdateLocationHistory(ALocation: String);
procedure UpdateViewportSize;
@ -177,7 +136,6 @@ type
const
MAX_LOCATIONS_HISTORY = 50;
MAP_PROVIDER_FILENAME = 'map-providers.xml';
USE_DMS = true;
_TILELAYERS_ID_ = 42;
@ -193,28 +151,6 @@ end;
{ TMainForm }
procedure TMainForm.BtnLoadMapProvidersClick(Sender: TObject);
var
fn: String;
msg: String;
begin
fn := Application.Location + MAP_PROVIDER_FILENAME;
if FileExists(fn) then begin
if MapView.Engine.ReadProvidersFromXML(fn, msg) then begin
MapView.GetMapProviders(CbProviders.Items);
CbProviders.ItemIndex := 0;
MapView.MapProvider := CbProviders.Text;
sgLayers.Columns[1].PickList.Assign(CbProviders.Items);
end else
ShowMessage(msg);
end;
end;
procedure TMainForm.BtnSaveMapProvidersClick(Sender: TObject);
begin
MapView.Engine.WriteProvidersToXML(Application.Location + MAP_PROVIDER_FILENAME);
end;
procedure TMainForm.rgDrawModeSelectionChanged(Sender: TObject);
begin
TileLayer[Pred(sgLayers.Row)].DrawMode := TItemDrawMode(rgDrawMode.ItemIndex);
@ -374,34 +310,6 @@ begin
MapView.Font.Assign(FontDialog.Font);
end;
procedure TMainForm.BtnSelectPOIImageClick(Sender: TObject);
begin
OpenPictureDialog.Filter := 'PNG files|*.png|BMP files|*.bmp';
OpenPictureDialog.DefaultExt := '.png';
if OpenPictureDialog.Execute then
begin
POIImage.LoadFromFile(OpenPictureDialog.FileName);
MapView.POIImage.Assign(POIImage);
end;
end;
procedure TMainForm.cbCyclicViewChange(Sender: TObject);
begin
MapView.Cyclic := cbCyclicView.Checked;
UpdateLayers;
end;
procedure TMainForm.CbDebugTilesChange(Sender: TObject);
begin
MapView.DebugTiles := CbDebugTiles.Checked;
MapView.Invalidate;
end;
procedure TMainForm.CbDoubleBufferChange(Sender: TObject);
begin
MapView.DoubleBuffered := CbDoubleBuffer.Checked;
end;
procedure TMainForm.CbFoundLocationsDrawItem(Control: TWinControl;
Index: Integer; ARect: TRect; State: TOwnerDrawState);
var
@ -431,58 +339,12 @@ begin
combo.Canvas.TextOut(x, y, P.Descr);
end;
procedure TMainForm.cbPOITextBgColorChange(Sender: TObject);
begin
MapView.POITextBgColor := cbPOITextBgColor.Selected;
end;
procedure TMainForm.CbPreviewTilesChange(Sender: TObject);
begin
MapView.DrawPreviewTiles := CbPreviewTiles.Checked;
end;
procedure TMainForm.CbProvidersChange(Sender: TObject);
begin
MapView.MapProvider := CbProviders.Text;
end;
procedure TMainForm.rbProxyChange(Sender: TObject);
begin
UpdateDownloadEngineProxy;
end;
procedure TMainForm.CbShowPOIImageChange(Sender: TObject);
begin
{
if CbShowPOIImage.Checked then
MapView.POIImage.Assign(POIImage)
else
MapView.POIImage.Clear;
}
end;
procedure TMainForm.CbUseThreadsChange(Sender: TObject);
begin
MapView.UseThreads := CbUseThreads.Checked;
UpdateLayers;
end;
procedure TMainForm.CbDistanceUnitsChange(Sender: TObject);
begin
DistanceUnit := TDistanceUnits(CbDistanceUnits.ItemIndex);
UpdateViewPortSize;
end;
procedure TMainForm.CbZoomToCursorChange(Sender: TObject);
begin
MapView.ZoomToCursor := CbZoomToCursor.Checked;
end;
procedure TMainForm.clbBackColorColorChanged(Sender: TObject);
begin
MapView.InactiveColor := clbBackColor.ButtonColor;
end;
procedure TMainForm.ClearFoundLocations;
var
i: Integer;
@ -497,35 +359,17 @@ end;
procedure TMainForm.FormCreate(Sender: TObject);
var
fn: String;
I: Integer;
begin
CfgFrame := {$IFDEF WITH_ADDONS}TCfgFrame_with_Addons{$ELSE}TCfgFrame{$ENDIF}.Create(self);
CfgFrame.Parent := pgConfig;
CfgFrame.Align := alClient;
CfgFrame.MapView := MapView;
CfgFrame.OnDrawGPSPoint := @MapViewDrawGpsPoint;
CfgFrame.OnUpdateLayers := @UpdateLayers;
cInputQueryEditSizePercents := 0;
fn := Application.Location + 'mapmarker.png';
if not FileExists(fn) then
MessageDlg('Copy the file "mapmarker.png" from the source folder to the folder with the executable.',
mtError, [mbOK], 0)
else
begin
// FMapMarker := CreateMapMarker(32, clRed, clBlack);
POIImage := TPortableNetworkGraphic.Create;
POIImage.PixelFormat := pf32bit;
POIImage.LoadFromFile(fn);
end;
MapView.GetMapProviders(CbProviders.Items);
CbProviders.ItemIndex := CbProviders.Items.IndexOf(MapView.MapProvider);
sgLayers.Columns[1].PickList.Assign(CbProviders.Items);
MapView.DoubleBuffered := true;
MapView.Zoom := 1;
CbZoomToCursor.Checked := MapView.ZoomToCursor;
CbUseThreads.Checked := MapView.UseThreads;
CbDoubleBuffer.Checked := MapView.DoubleBuffered;
CbPOITextBgColor.Selected := MapView.POITextBgColor;
CbPOITextBgColor.ItemHeight := CbProviders.ItemHeight + 2;
ClbBackColor.ButtonColor := MapView.InactiveColor;
InfoPositionLongitude.Caption := '';
InfoPositionLatitude.Caption := '';
InfoCenterLongitude.Caption := '';
@ -567,7 +411,6 @@ begin
for I := 0 to High(TileLayer) do
MapView.GPSLayer[I].Delete(TileLayer[I]);
ClearFoundLocations;
FreeAndNil(POIImage)
end;
procedure TMainForm.FormShow(Sender: TObject);
@ -599,22 +442,30 @@ var
sym: TGPSSymbol;
clr: TColor;
extent: TSize;
lMapView: TMapView;
begin
lMapView := TMapView(Sender);
// Screen coordinates of the GPS point
P := TMapView(Sender).LatLonToScreen(APoint.RealPoint);
P := lMapView.LatLonToScreen(APoint.RealPoint);
// Draw the GPS point as specified by the data in the point's ExtraData
if not (APoint.ExtraData is TGPSExtraData) then
exit;
// Get the POI attributes
with TGPSExtraData(APoint.ExtraData) do
if (APoint.ExtraData is TGPSExtraData) then
// Get the POI attributes
with TGPSExtraData(APoint.ExtraData) do
begin
clr := Color;
sym := Symbol;
d := Size div 2;
end
else
begin
clr := Color;
sym := Symbol;
d := Size div 2;
sym := gpsPlus;
clr := clRed;
d := 5;
end;
// Draw the POI symbol
ADrawer.PenColor := clr;
case sym of
@ -655,12 +506,12 @@ begin
// Prepare text output: background color...
inc(P.Y, d + 4);
extent := ADrawer.TextExtent(APoint.Name);
if cbPOITextBgColor.selected = clNone then
if CfgFrame.POITextBkColor = clNone then
ADrawer.BrushStyle := bsClear
else
begin
ADrawer.BrushStyle := bsSolid;
ADrawer.BrushColor := cbPOITextBgColor.Selected;
ADrawer.BrushColor := CfgFrame.POITextBkColor;
end;
// ... and font
@ -673,11 +524,6 @@ begin
ADrawer.TextOut(P.X - extent.CX div 2, P.Y, APoint.Name);
end;
{ ADrawer.BrushColor := clRed;
ADrawer.BrushStyle := bsSolid;
ADrawer.Ellipse(P.X - R, P.Y - R, P.X + R, P.Y + R);
end;
}
procedure TMainForm.MapViewMouseLeave(Sender: TObject);
begin
UpdateCoords(MaxInt, MaxInt);
@ -733,14 +579,14 @@ begin
if (Button = mbRight) then begin
rPt := MapView.ScreenToLatLon(Point(X, Y));
case rgPOIMode.ItemIndex of
0, 1:
case CfgFrame.POIMode of
pmDefaultDrawing, pmDefaultImage:
begin
if not InputQuery('Name of GPS location', 'Please enter name', gpsName) then
exit;
gpsPt := TGpsPoint.CreateFrom(rPt);
end;
2:
pmImageList:
begin
if GPSPointForm = nil then
begin
@ -754,7 +600,7 @@ begin
GPSPointForm.GetImageIndexData(gpsName, gpsImageIndex);
TGPSPointOfInterest(gpsPt).ImageIndex := gpsImageIndex;
end;
3:
pmCustomDrawing:
begin
if GPSPointForm = nil then
begin
@ -796,24 +642,10 @@ var
s: String;
pt: TRealPoint;
du: TDistanceUnits;
provider: String;
begin
ini := TMemIniFile.Create(CalcIniName);
try
HERE_AppID := ini.ReadString('HERE', 'APP_ID', '');
HERE_AppCode := ini.ReadString('HERE', 'APP_CODE', '');
OpenWeatherMap_ApiKey := ini.ReadString('OpenWeatherMap', 'API_Key', '');
ThunderForest_ApiKey := ini.ReadString('ThunderForest', 'API_Key', '');
if ((HERE_AppID <> '') and (HERE_AppCode <> '')) or
(OpenWeatherMap_ApiKey <> '') or
(ThunderForest_ApiKey <> '') then
begin
MapView.Engine.ClearMapProviders;
MapView.Engine.RegisterProviders;
MapView.GetMapProviders(CbProviders.Items);
sgLayers.Columns[1].PickList.Assign(CbProviders.Items);
end;
R := Screen.DesktopRect;
L := ini.ReadInteger('MainForm', 'Left', Left);
T := ini.ReadInteger('MainForm', 'Top', Top);
@ -825,20 +657,34 @@ begin
if T < R.Top then T := R.Top;
SetBounds(L, T, W, H);
s := ini.ReadString('MapView', 'Provider', MapView.MapProvider);
if CbProviders.Items.IndexOf(s) = -1 then begin
MessageDlg('Map provider "' + s + '" not found.', mtError, [mbOK], 0);
s := CbProviders.Items[0];
end;
MapView.MapProvider := s;
CbProviders.Text := MapView.MapProvider;
HERE_AppID := ini.ReadString('HERE', 'APP_ID', '');
HERE_AppCode := ini.ReadString('HERE', 'APP_CODE', '');
OpenWeatherMap_ApiKey := ini.ReadString('OpenWeatherMap', 'API_Key', '');
ThunderForest_ApiKey := ini.ReadString('ThunderForest', 'API_Key', '');
list := TStringList.Create;
try
MapView.Engine.ClearMapProviders;
MapView.Engine.RegisterProviders;
MapView.GetMapProviders(list);
sgLayers.Columns[1].PickList.Assign(list);
provider := ini.ReadString('MapView', 'Provider', MapView.MapProvider);
if MapView.Engine.MapProviderByName(provider) = nil then
begin
MessageDlg('Map provider "' + provider + '" not found.', mtError, [mbOK], 0);
provider := list[0];
end;
MapView.MapProvider := provider;
finally
list.Free;
end;
MapView.InactiveColor := ini.ReadInteger('MapView', 'MapBkgrColor', MapView.InactiveColor);
MapView.Zoom := ini.ReadInteger('MapView', 'Zoom', MapView.Zoom);
pt.Lon := StrToFloatDef(ini.ReadString('MapView', 'Center.Longitude', ''), 0.0, PointFormatSettings);
pt.Lat := StrToFloatDef(ini.ReadString('MapView', 'Center.Latitude', ''), 0.0, PointFormatSettings);
MapView.Center := pt;
MapView.InactiveColor := ini.ReadInteger('MapView', 'MapBkgrColor', MapView.InactiveColor);
clbBackColor.ButtonColor := MapView.InactiveColor;
s := ini.ReadString('MapView', 'DistanceUnits', '');
if s <> '' then begin
@ -862,47 +708,13 @@ begin
List.Free;
end;
i := ini.ReadInteger('Proxy', 'UseProxy', 0);
case i of
0: rbNoProxy.Checked := true;
1: rbSystemProxy.Checked := true;
2: rbProxyData.Checked := true;
end;
edProxyHost.Text := ini.ReadString('Proxy', 'ProxyHost', edProxyHost.Text);
seProxyPort.Value := ini.ReadInteger('Proxy', 'ProxyPort', seProxyPort.Value);
edProxyUserName.Text := ini.ReadString('Proxy', 'ProxyName', edProxyUserName.Text);
edProxyPassword.Text := ini.ReadString('Proxy', 'ProxyPassword', edProxyPassword.Text);
UpdateDownloadEngineProxy;
CfgFrame.ReadFromIni(ini);
finally
ini.Free;
end;
end;
procedure TMainForm.rgPOIModeClick(Sender: TObject);
begin
case rgPOIMode.ItemIndex of
0: begin // default
if MapView.POIImage <> nil then MapView.POIImage.Clear;
MapView.OnDrawGPSPoint := nil;
MapView.Invalidate;
end;
1: begin // default POI image
MapView.POIImage := POIImage;
MapView.OnDrawGPSPoint := nil;
MapView.Invalidate;
end;
2: ; // image from image list
3: begin // symbol
if MapView.POIImage <> nil then MapView.POIImage.Clear;
MapView.OnDrawGPSPoint := @MapViewDrawGpsPoint;
MapView.Invalidate;
end;
end;
BtnSelectPOIImage.Enabled := (rgPOIMode.ItemIndex = 1);
end;
procedure TMainForm.sgLayersCheckboxToggled(sender: TObject; aCol,
aRow: Integer; aState: TCheckboxState);
begin
@ -936,7 +748,7 @@ begin
MapView.Redraw;
end;
procedure TMainForm.UpdateLayers;
procedure TMainForm.UpdateLayers(Sender: TObject);
var
TL: TGPSTileLayer;
begin
@ -964,26 +776,6 @@ begin
end;
end;
procedure TMainForm.UpdateDownloadEngineProxy;
begin
if MapView.DownloadEngine.HasProxySupport then
begin
MapView.DownloadEngine.SetProxy(
rbSystemProxy.Checked, rbProxyData.Checked,
edProxyHost.Name, seProxyPort.Value, edProxyUserName.Text, edProxyPassword.Text
);
rbSystemProxy.Enabled := MapView.DownloadEngine.SupportsSystemProxy;
lblProxyHost.Enabled := rbProxyData.Checked;
edProxyHost.Enabled := rbProxyData.Checked;
lblProxyPort.Enabled := rbProxyData.Checked;
seProxyPort.Enabled := rbProxyData.Checked;
lblProxyUserName.Enabled := rbProxyData.Checked;
edProxyUserName.Enabled := rbProxyData.Checked;
lblProxyPassword.Enabled := rbProxyData.Checked;
edProxyPassword.Enabled := rbProxyData.Checked;
end;
end;
procedure TMainForm.UpdateDropdownWidth(ACombobox: TCombobox);
var
cnv: TControlCanvas;
@ -1082,18 +874,7 @@ begin
for i := 0 to CbLocations.Items.Count-1 do
ini.WriteString('Locations', 'Item'+IntToStr(i), CbLocations.Items[i]);
if rbSystemProxy.Checked then
i := 1
else if rbProxyData.Checked then
i := 2
else
i := 0;
ini.EraseSection('Proxy');
ini.WriteInteger('Proxy', 'UseProxy', i);
ini.WriteString('Proxy', 'ProxyHost', edProxyHost.Text);
ini.WriteInteger('Proxy', 'ProxyPort', seProxyPort.Value);
ini.WriteString('Proxy', 'ProxyName', edProxyUserName.Text);
ini.WriteString('Proxy', 'ProxyPassword', edProxyPassword.Text);
CfgFrame.WriteToIni(ini);
finally
ini.Free;

View File

@ -36,10 +36,11 @@
<PackageName Value="LCL"/>
</Item3>
</RequiredPackages>
<Units Count="6">
<Units Count="7">
<Unit0>
<Filename Value="MapViewer_Demo.lpr"/>
<Filename Value="mapViewer_demo.lpr"/>
<IsPartOfProject Value="True"/>
<UnitName Value="mapviewer_demo"/>
</Unit0>
<Unit1>
<Filename Value="main.pas"/>
@ -71,13 +72,21 @@
<Filename Value="..\..\source\mvengine_mapreg.inc"/>
<IsPartOfProject Value="True"/>
</Unit5>
<Unit6>
<Filename Value="configframe.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="CfgFrame"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Frame"/>
<UnitName Value="ConfigFrame"/>
</Unit6>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="bin\$(TargetCPU)-$(TargetOS)\MapViewer_Demo"/>
<Filename Value="bin\$(TargetCPU)-$(TargetOS)\mapviewer_demo"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>

View File

@ -6,7 +6,7 @@ uses
{$IFDEF UNIX}cthreads,{$ENDIF}
Interfaces, // this includes the LCL widgetset
Forms,
Main, gpslistform;
Main, gpslistform, ConfigFrame;
{$R *.res}

View File

@ -0,0 +1,144 @@
<?xml version="1.0" encoding="UTF-8"?>
<CONFIG>
<ProjectOptions>
<Version Value="12"/>
<PathDelim Value="\"/>
<General>
<Flags>
<CompatibilityMode Value="True"/>
</Flags>
<SessionStorage Value="InProjectDir"/>
<Title Value="MapViewer_Demo_with_Addons"/>
<Scaled Value="True"/>
<ResourceType Value="res"/>
<UseXPManifest Value="True"/>
<XPManifest>
<DpiAware Value="True"/>
</XPManifest>
</General>
<BuildModes Count="1">
<Item1 Name="default" Default="True"/>
</BuildModes>
<PublishOptions>
<Version Value="2"/>
</PublishOptions>
<RunParams>
<FormatVersion Value="2"/>
</RunParams>
<RequiredPackages Count="6">
<Item1>
<PackageName Value="lazmapviewer_bgra"/>
</Item1>
<Item2>
<PackageName Value="lazmapviewer_rgbgraphics"/>
</Item2>
<Item3>
<PackageName Value="lazMapViewer_Synapse"/>
</Item3>
<Item4>
<PackageName Value="Printer4Lazarus"/>
</Item4>
<Item5>
<PackageName Value="lazMapViewerPkg"/>
</Item5>
<Item6>
<PackageName Value="LCL"/>
</Item6>
</RequiredPackages>
<Units Count="8">
<Unit0>
<Filename Value="mapviewer_demo_with_addons.lpr"/>
<IsPartOfProject Value="True"/>
</Unit0>
<Unit1>
<Filename Value="main.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="MainForm"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
<UnitName Value="Main"/>
</Unit1>
<Unit2>
<Filename Value="gpslistform.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="GPSListViewer"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
</Unit2>
<Unit3>
<Filename Value="globals.pas"/>
<IsPartOfProject Value="True"/>
</Unit3>
<Unit4>
<Filename Value="gpsptform.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="GPSPointForm"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Form"/>
</Unit4>
<Unit5>
<Filename Value="..\..\source\mvengine_mapreg.inc"/>
<IsPartOfProject Value="True"/>
</Unit5>
<Unit6>
<Filename Value="configframe.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="CfgFrame"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Frame"/>
<UnitName Value="ConfigFrame"/>
</Unit6>
<Unit7>
<Filename Value="configframe_with_addons.pas"/>
<IsPartOfProject Value="True"/>
<ComponentName Value="CfgFrame_with_addons"/>
<HasResources Value="True"/>
<ResourceBaseClass Value="Frame"/>
<UnitName Value="ConfigFrame_with_Addons"/>
</Unit7>
</Units>
</ProjectOptions>
<CompilerOptions>
<Version Value="11"/>
<PathDelim Value="\"/>
<Target>
<Filename Value="bin\$(TargetCPU)-$(TargetOS)\MapViewer_Demo"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<Linking>
<Debugging>
<DebugInfoType Value="dsDwarf3"/>
</Debugging>
<Options>
<Win32>
<GraphicApplication Value="True"/>
</Win32>
</Options>
</Linking>
<Other>
<CustomOptions Value="-dWITH_ADDONS"/>
<OtherDefines Count="1">
<Define0 Value="WITH_ADDONS"/>
</OtherDefines>
</Other>
</CompilerOptions>
<Debugging>
<Exceptions Count="4">
<Item1>
<Name Value="EAbort"/>
</Item1>
<Item2>
<Name Value="ECodetoolError"/>
</Item2>
<Item3>
<Name Value="EFOpenError"/>
</Item3>
<Item4>
<Name Value="EHTTPClient"/>
</Item4>
</Exceptions>
</Debugging>
</CONFIG>

View File

@ -0,0 +1,22 @@
program MapViewer_Demo;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}cthreads,{$ENDIF}
Interfaces, // this includes the LCL widgetset
Forms,
Main, gpslistform, ConfigFrame, configframe_with_addons;
{$R *.res}
begin
RequireDerivedFormResource:=True;
Application.Title:='MapViewer_Demo_with_Addons';
Application.Scaled:=True;
Application.Initialize;
Application.CreateForm(TMainForm, MainForm);
Application.CreateForm(TGPSListViewer, GPSListViewer);
Application.Run;
end.