summaryrefslogtreecommitdiff
path: root/extras/tiopf/gui/tiGUIINI.pas
blob: 4d13a9890feb89a77502c4547aeb040f7760f622 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
unit tiGUIINI;

{$mode objfpc}{$H+}

{ TODO: When TfpgForm supports FormState property, implement the remaining functions. }

interface
uses
  tiINI
  ,fpg_form
  ;

type

  TtiGuiINIFile = class(TtiINIFile)
  public
    procedure   ReadFormState(AForm: TfpgForm; AHeight: integer = -1; AWidth: integer = -1);
    procedure   WriteFormState(AForm : TfpgForm);
  end;

function gGUIINI(const AFileName: string = ''): TtiGuiINIFile;


implementation
uses
  fpg_main
  ;

var
  uGuiINI : TtiGuiINIFile;


function gGUIINI(const AFileName: string = ''): TtiGuiINIFile;
begin
  if uGuiINI = nil then
  begin
    uGuiINI := TtiGuiINIFile.CreateExt(AFileName);
    uGuiINI.CacheUpdates := False;
  end;
  result := uGuiINI;
end;

procedure TtiGuiINIFile.ReadFormState(AForm: TfpgForm; AHeight : integer = -1; AWidth : integer = -1);
var
  LINISection: string;
  LTop: integer;
  LLeft: integer;
  LHeight: integer;
  LWidth: integer;
begin
  Assert(AForm <> nil, 'AForm not assigned');
  LINISection := AForm.Name + 'State';
  // Read form position, -1 if not stored in registry
  LTop := readInteger(LINISection, 'Top', -1);
  LLeft := readInteger(LINISection, 'Left', -1);
  // The form pos was found in the ini file
  if (LTop <> -1) and (LLeft <> -1) then
  begin
    AForm.Top   := readInteger(LINISection, 'Top',    AForm.Top);
    AForm.Left  := readInteger(LINISection, 'Left',   AForm.Left);
    AForm.WindowPosition := wpUser;
  end
  else
  begin  // No form pos in the ini file, so default to screen center
    if Assigned(fpgApplication.MainForm) and (fpgApplication.MainForm <> AForm) then
      AForm.WindowPosition := wpAuto
    else
      AForm.WindowPosition := wpScreenCenter;
  end;

  { 2008-11-20 graemeg: disabled Width and Height settings for now. It causes
    major headaches, plus in most applications the forms have been designed
    with specific sizes for best look and fit. The user can still adjust sizes
    at runtime, they will just not be remembered. I will attend to this issue
    at a later date. }
    // Only set the form size if a bsSizable window
  //if AForm.Sizeable then
  //begin
    //if AHeight = -1 then
      //LHeight := AForm.Height
    //else
      //LHeight := AHeight;
    //if AWidth = -1 then
      //LWidth := AForm.Width
    //else
      //LWidth := AWidth;
    //AForm.Height  := readInteger(LINISection, 'Height', LHeight);
    //AForm.Width   := readInteger(LINISection, 'Width',  LWidth);
  //end;

  // If the form is off screen (positioned outside all monitor screens) then
  // center the form on screen.
  if AForm.WindowPosition = wpUser then
  begin
    if (AForm.Top < 0) or (AForm.Top > fpgApplication.ScreenHeight) or
       (AForm.Left < 0) or (AForm.Left > fpgApplication.ScreenWidth) then
      AForm.WindowPosition := wpScreenCenter;
  end;
end;

procedure TtiGuiINIFile.WriteFormState(AForm: TfpgForm);
var
  LINISection: string;
begin
  LINISection := AForm.Name + 'State';
  WriteInteger(LINISection, 'Top', AForm.Top);
  WriteInteger(LINISection, 'Left', AForm.Left);
  if AForm.Sizeable then
  begin
    WriteInteger(LINISection, 'Height', AForm.Height);
    WriteInteger(LINISection, 'Width', AForm.Width);
  end;
end;

initialization
  uGuiINI := nil;

finalization
  uGuiINI.Free;

end.