Revision 119:66352054ce4d Client/Tools/UfrmFilter.pas

b/Client/Tools/UfrmFilter.pas
1
(*
2
 * CDDL HEADER START
3
 *
4
 * The contents of this file are subject to the terms of the
5
 * Common Development and Distribution License, Version 1.0 only
6
 * (the "License").  You may not use this file except in compliance
7
 * with the License.
8
 *
9
 * You can obtain a copy of the license at
10
 * http://www.opensource.org/licenses/cddl1.php.
11
 * See the License for the specific language governing permissions
12
 * and limitations under the License.
13
 *
14
 * When distributing Covered Code, include this CDDL HEADER in each
15
 * file and include the License file at
16
 * http://www.opensource.org/licenses/cddl1.php.  If applicable,
17
 * add the following below this CDDL HEADER, with the fields enclosed
18
 * by brackets "[]" replaced with your own identifying * information:
19
 *      Portions Copyright [yyyy] [name of copyright owner]
20
 *
21
 * CDDL HEADER END
22
 *
23
 *
24
 *      Portions Copyright 2009 Andreas Schneider
25
 *)
26
unit UfrmFilter;
27

  
28
{$mode objfpc}{$H+}
29

  
30
interface
31

  
32
uses
33
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls,
34
  ExtCtrls, VirtualTrees, LCLIntf, LMessages, Buttons, UPlatformTypes, UStatics,
35
  PairSplitter, Menus;
36

  
37
type
38

  
39
  { TfrmFilter }
40

  
41
  TfrmFilter = class(TForm)
42
    btnClear: TSpeedButton;
43
    btnDelete: TSpeedButton;
44
    btnRandomPresetDelete: TSpeedButton;
45
    btnRandomPresetSave: TSpeedButton;
46
    cbRandomPreset: TComboBox;
47
    cbTileFilter: TCheckBox;
48
    cbHueFilter: TCheckBox;
49
    GroupBox1: TGroupBox;
50
    GroupBox2: TGroupBox;
51
    Label1: TLabel;
52
    mnuUncheckHues: TMenuItem;
53
    mnuCheckHues: TMenuItem;
54
    pnlRandomPreset: TPanel;
55
    pmHues: TPopupMenu;
56
    rgFilterType: TRadioGroup;
57
    Splitter1: TSplitter;
58
    vdtFilter: TVirtualDrawTree;
59
    vdtHues: TVirtualDrawTree;
60
    procedure btnClearClick(Sender: TObject);
61
    procedure btnDeleteClick(Sender: TObject);
62
    procedure cbHueFilterChange(Sender: TObject);
63
    procedure cbTileFilterChange(Sender: TObject);
64
    procedure FormCreate(Sender: TObject);
65
    procedure FormDestroy(Sender: TObject);
66
    procedure FormShow(Sender: TObject);
67
    procedure mnuUncheckHuesClick(Sender: TObject);
68
    procedure mnuCheckHuesClick(Sender: TObject);
69
    procedure rgFilterTypeClick(Sender: TObject);
70
    procedure vdtFilterDragDrop(Sender: TBaseVirtualTree; Source: TObject;
71
      DataObject: IDataObject; Formats: TFormatArray; Shift: TShiftState;
72
      Pt: TPoint; var Effect: Integer; Mode: TDropMode);
73
    procedure vdtFilterDragOver(Sender: TBaseVirtualTree; Source: TObject;
74
      Shift: TShiftState; State: TDragState; Pt: TPoint; Mode: TDropMode;
75
      var Effect: Integer; var Accept: Boolean);
76
    procedure vdtFilterDrawNode(Sender: TBaseVirtualTree;
77
      const PaintInfo: TVTPaintInfo);
78
    procedure vdtHuesChecked(Sender: TBaseVirtualTree; Node: PVirtualNode);
79
    procedure vdtHuesDrawNode(Sender: TBaseVirtualTree;
80
      const PaintInfo: TVTPaintInfo);
81
  protected
82
    FLocked: Boolean;
83
    FCheckedHues: TBits;
84
    procedure MouseLeave(var msg: TLMessage); message CM_MouseLeave;
85
  public
86
    property Locked: Boolean read FLocked write FLocked;
87
    function Filter(AStatic: TStaticItem): Boolean;
88
    procedure JumpToHue(AHueID: Word);
89
  end; 
90

  
91
var
92
  frmFilter: TfrmFilter;
93

  
94
implementation
95

  
96
uses
97
  UfrmMain, UGameResources, UHue, UGraphicHelper, UGUIPlatformUtils;
98
  
99
type
100
  PTileInfo = ^TTileInfo;
101
  TTileInfo = record
102
    ID: Word;
103
  end;
104
  PHueInfo = ^THueInfo;
105
  THueInfo = record
106
    ID: Word;
107
    Hue: THue;
108
  end;
109

  
110
{ TfrmFilter }
111

  
112
procedure TfrmFilter.FormShow(Sender: TObject);
113
var
114
  upperLeft, lowerLeft: TPoint;
115
begin
116
  upperLeft := frmMain.pcLeft.ClientToScreen(Point(frmMain.pcLeft.Width, 0));
117
  lowerLeft := frmMain.pcLeft.ClientToScreen(Point(frmMain.pcLeft.Width,
118
    frmMain.pcLeft.Height));
119
  Left := upperLeft.x - 4;
120
  Top := upperLeft.y - 4;
121
  Height := lowerLeft.y - upperLeft.y;
122

  
123
  SetWindowParent(Handle, frmMain.Handle);
124
end;
125

  
126
procedure TfrmFilter.mnuUncheckHuesClick(Sender: TObject);
127
begin
128
  vdtHues.ClearChecked;
129
end;
130

  
131
procedure TfrmFilter.mnuCheckHuesClick(Sender: TObject);
132
var
133
  node: PVirtualNode;
134
begin
135
  node := vdtHues.GetFirst;
136
  while node <> nil do
137
  begin
138
    vdtHues.CheckState[node] := csCheckedNormal;
139
    node := vdtHues.GetNext(node);
140
  end;
141
end;
142

  
143
procedure TfrmFilter.rgFilterTypeClick(Sender: TObject);
144
begin
145
  frmMain.InvalidateFilter;
146
end;
147

  
148
procedure TfrmFilter.vdtFilterDragDrop(Sender: TBaseVirtualTree;
149
  Source: TObject; DataObject: IDataObject; Formats: TFormatArray;
150
  Shift: TShiftState; Pt: TPoint; var Effect: Integer; Mode: TDropMode);
151
var
152
  sourceTree: TVirtualDrawTree;
153
  selected, node: PVirtualNode;
154
  sourceTileInfo, targetTileInfo: PTileInfo;
155
begin
156
  sourceTree := Source as TVirtualDrawTree;
157
  if (sourceTree <> Sender) and (sourceTree <> nil) and
158
     (sourceTree.Tag = 1) then
159
  begin
160
    Sender.BeginUpdate;
161
    selected := sourceTree.GetFirstSelected;
162
    while selected <> nil do
163
    begin
164
      sourceTileInfo := sourceTree.GetNodeData(selected);
165
      if sourceTileInfo^.ID > $3FFF then
166
      begin
167
        node := Sender.AddChild(nil);
168
        targetTileInfo := Sender.GetNodeData(node);
169
        targetTileInfo^.ID := sourceTileInfo^.ID;
170
        cbTileFilter.Checked := True;
171
        frmMain.InvalidateFilter;
172
      end;
173
      selected := sourceTree.GetNextSelected(selected);
174
    end;
175
    Sender.EndUpdate;
176
  end;
177
end;
178

  
179
procedure TfrmFilter.vdtFilterDragOver(Sender: TBaseVirtualTree;
180
  Source: TObject; Shift: TShiftState; State: TDragState; Pt: TPoint;
181
  Mode: TDropMode; var Effect: Integer; var Accept: Boolean);
182
begin
183
  if (Source <> Sender) and (Source is TVirtualDrawTree) and
184
    (TVirtualDrawTree(Source).Tag = 1) then
185
  begin
186
    Accept := True;
187
  end;
188
end;
189

  
190
procedure TfrmFilter.vdtFilterDrawNode(Sender: TBaseVirtualTree;
191
  const PaintInfo: TVTPaintInfo);
192
begin
193
  frmMain.vdtTilesDrawNode(Sender, PaintInfo);
194
end;
195

  
196
procedure TfrmFilter.vdtHuesChecked(Sender: TBaseVirtualTree; Node: PVirtualNode);
197
var
198
  hueInfo: PHueInfo;
199
begin
200
  hueInfo := Sender.GetNodeData(Node);
201
  FCheckedHues.Bits[hueInfo^.ID] := (Sender.CheckState[node] = csCheckedNormal);
202
  cbHueFilter.Checked := True;
203
  frmMain.InvalidateFilter;
204
end;
205

  
206
procedure TfrmFilter.vdtHuesDrawNode(Sender: TBaseVirtualTree;
207
  const PaintInfo: TVTPaintInfo);
208
var
209
  hueInfo: PHueInfo;
210
  hueColor: TColor;
211
  i: Integer;
212
  textStyle: TTextStyle;
213
begin
214
  hueInfo := Sender.GetNodeData(PaintInfo.Node);
215
  textStyle := PaintInfo.Canvas.TextStyle;
216
  textStyle.Alignment := taLeftJustify;
217
  textStyle.Layout := tlCenter;
218
  textStyle.Wordbreak := True;
219
  case PaintInfo.Column of
220
    1:
221
      begin
222
        for i := 0 to 31 do
223
        begin
224
          hueColor := ARGB2RGB(hueInfo^.Hue.ColorTable[i]);
225
          PaintInfo.Canvas.Pen.Color := hueColor;
226
          PaintInfo.Canvas.MoveTo(PaintInfo.CellRect.Left + 2 + i, PaintInfo.CellRect.Top + 1);
227
          PaintInfo.Canvas.LineTo(PaintInfo.CellRect.Left + 2 + i, PaintInfo.CellRect.Bottom - 1);
228
        end;
229
      end;
230
    2:
231
      begin
232
        PaintInfo.Canvas.TextRect(PaintInfo.CellRect, PaintInfo.CellRect.Left, PaintInfo.CellRect.Top, Format('$%x (%s)', [hueInfo^.ID, hueInfo^.Hue.Name]), textStyle);
233
      end;
234
  end;
235
end;
236

  
237
procedure TfrmFilter.MouseLeave(var msg: TLMessage);
238
begin
239
  {if Active and (not PtInRect(ClientRect, ScreenToClient(Mouse.CursorPos))) then
240
    Close;}
241
end;
242

  
243
function TfrmFilter.Filter(AStatic: TStaticItem): Boolean;
244
var
245
  found: Boolean;
246
  tileInfo: PTileInfo;
247
  node: PVirtualNode;
248
  id: Word;
249
begin
250
  if cbTileFilter.Checked then
251
  begin
252
    id := AStatic.TileID + $4000;
253

  
254
    found := False;
255
    node := vdtFilter.GetFirst;
256
    while (node <> nil) and (not found) do
257
    begin
258
      tileInfo := vdtFilter.GetNodeData(node);
259
      if tileInfo^.ID = id then
260
        found := True
261
      else
262
        node := vdtFilter.GetNext(node);
263
    end;
264

  
265
    Result := ((rgFilterType.ItemIndex = 0) and (not found)) or
266
              ((rgFilterType.ItemIndex = 1) and found);
267
  end else
268
    Result := True;
269
    
270
  if cbHueFilter.Checked then
271
  begin
272
    Result := Result and (
273
                ((rgFilterType.ItemIndex = 0) and (not FCheckedHues.Bits[AStatic.Hue])) or
274
                ((rgFilterType.ItemIndex = 1) and (FCheckedHues.Bits[AStatic.Hue]))
275
              );
276
  end;
277
end;
278

  
279
procedure TfrmFilter.JumpToHue(AHueID: Word);
280
var
281
  hueInfo: PHueInfo;
282
  node: PVirtualNode;
283
begin
284
  node := vdtHues.GetFirst;
285
  while node <> nil do
286
  begin
287
    hueInfo := vdtHues.GetNodeData(node);
288
    if hueInfo^.ID = AHueID then
289
    begin
290
      vdtHues.ClearSelection;
291
      vdtHues.Selected[node] := True;
292
      vdtHues.FocusedNode := node;
293
      node := nil;
294
    end else
295
      node := vdtHues.GetNext(node);
296
  end;
297
end;
298

  
299
procedure TfrmFilter.FormCreate(Sender: TObject);
300
var
301
  i: Integer;
302
  hueInfo: PHueInfo;
303
  node: PVirtualNode;
304
begin
305
  FLocked := False;
306
  vdtFilter.NodeDataSize := SizeOf(TTileInfo);
307
  vdtHues.NodeDataSize := SizeOf(THueInfo);
308
  
309
  vdtHues.BeginUpdate;
310
  vdtHues.Clear;
311
  for i := 0 to ResMan.Hue.Count - 1 do
312
  begin
313
    node := vdtHues.AddChild(nil);
314
    hueInfo := vdtHues.GetNodeData(node);
315
    hueInfo^.ID := i + 1;
316
    hueInfo^.Hue := ResMan.Hue.Hues[i];
317
    vdtHues.CheckType[node] := ctCheckBox;
318
  end;
319
  vdtHues.EndUpdate;
320
  FCheckedHues := TBits.Create(ResMan.Hue.Count + 1);
321
  //FCheckedHues.Bits[0] := True;
322
end;
323

  
324
procedure TfrmFilter.FormDestroy(Sender: TObject);
325
begin
326
  if FCheckedHues <> nil then FreeAndNil(FCheckedHues);
327
end;
328

  
329
procedure TfrmFilter.btnDeleteClick(Sender: TObject);
330
begin
331
  vdtFilter.DeleteSelectedNodes;
332
end;
333

  
334
procedure TfrmFilter.cbHueFilterChange(Sender: TObject);
335
begin
336
  frmMain.InvalidateFilter;
337
end;
338

  
339
procedure TfrmFilter.cbTileFilterChange(Sender: TObject);
340
begin
341
  frmMain.InvalidateFilter;
342
end;
343

  
344
procedure TfrmFilter.btnClearClick(Sender: TObject);
345
begin
346
  vdtFilter.Clear;
347
end;
348

  
349
initialization
350
  {$I UfrmFilter.lrs}
351

  
352
end.
353

  
1
(*
2
 * CDDL HEADER START
3
 *
4
 * The contents of this file are subject to the terms of the
5
 * Common Development and Distribution License, Version 1.0 only
6
 * (the "License").  You may not use this file except in compliance
7
 * with the License.
8
 *
9
 * You can obtain a copy of the license at
10
 * http://www.opensource.org/licenses/cddl1.php.
11
 * See the License for the specific language governing permissions
12
 * and limitations under the License.
13
 *
14
 * When distributing Covered Code, include this CDDL HEADER in each
15
 * file and include the License file at
16
 * http://www.opensource.org/licenses/cddl1.php.  If applicable,
17
 * add the following below this CDDL HEADER, with the fields enclosed
18
 * by brackets "[]" replaced with your own identifying * information:
19
 *      Portions Copyright [yyyy] [name of copyright owner]
20
 *
21
 * CDDL HEADER END
22
 *
23
 *
24
 *      Portions Copyright 2009 Andreas Schneider
25
 *)
26
unit UfrmFilter;
27

  
28
{$mode objfpc}{$H+}
29

  
30
interface
31

  
32
uses
33
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, StdCtrls,
34
  ExtCtrls, VirtualTrees, LCLIntf, LMessages, Buttons, UPlatformTypes, UStatics,
35
  Menus;
36

  
37
type
38

  
39
  { TfrmFilter }
40

  
41
  TfrmFilter = class(TForm)
42
    btnClear: TSpeedButton;
43
    btnDelete: TSpeedButton;
44
    btnRandomPresetDelete: TSpeedButton;
45
    btnRandomPresetSave: TSpeedButton;
46
    cbRandomPreset: TComboBox;
47
    cbTileFilter: TCheckBox;
48
    cbHueFilter: TCheckBox;
49
    GroupBox1: TGroupBox;
50
    GroupBox2: TGroupBox;
51
    Label1: TLabel;
52
    mnuUncheckHues: TMenuItem;
53
    mnuCheckHues: TMenuItem;
54
    pnlRandomPreset: TPanel;
55
    pmHues: TPopupMenu;
56
    rgFilterType: TRadioGroup;
57
    Splitter1: TSplitter;
58
    vdtFilter: TVirtualDrawTree;
59
    vdtHues: TVirtualDrawTree;
60
    procedure btnClearClick(Sender: TObject);
61
    procedure btnDeleteClick(Sender: TObject);
62
    procedure cbHueFilterChange(Sender: TObject);
63
    procedure cbTileFilterChange(Sender: TObject);
64
    procedure FormCreate(Sender: TObject);
65
    procedure FormDestroy(Sender: TObject);
66
    procedure FormShow(Sender: TObject);
67
    procedure mnuUncheckHuesClick(Sender: TObject);
68
    procedure mnuCheckHuesClick(Sender: TObject);
69
    procedure rgFilterTypeClick(Sender: TObject);
70
    procedure vdtFilterDragDrop(Sender: TBaseVirtualTree; Source: TObject;
71
      DataObject: IDataObject; Formats: TFormatArray; Shift: TShiftState;
72
      Pt: TPoint; var Effect: Integer; Mode: TDropMode);
73
    procedure vdtFilterDragOver(Sender: TBaseVirtualTree; Source: TObject;
74
      Shift: TShiftState; State: TDragState; Pt: TPoint; Mode: TDropMode;
75
      var Effect: Integer; var Accept: Boolean);
76
    procedure vdtFilterDrawNode(Sender: TBaseVirtualTree;
77
      const PaintInfo: TVTPaintInfo);
78
    procedure vdtHuesChecked(Sender: TBaseVirtualTree; Node: PVirtualNode);
79
    procedure vdtHuesDrawNode(Sender: TBaseVirtualTree;
80
      const PaintInfo: TVTPaintInfo);
81
  protected
82
    FLocked: Boolean;
83
    FCheckedHues: TBits;
84
    procedure MouseLeave(var msg: TLMessage); message CM_MouseLeave;
85
  public
86
    property Locked: Boolean read FLocked write FLocked;
87
    function Filter(AStatic: TStaticItem): Boolean;
88
    procedure JumpToHue(AHueID: Word);
89
  end; 
90

  
91
var
92
  frmFilter: TfrmFilter;
93

  
94
implementation
95

  
96
uses
97
  UfrmMain, UGameResources, UHue, UGraphicHelper, UGUIPlatformUtils;
98
  
99
type
100
  PTileInfo = ^TTileInfo;
101
  TTileInfo = record
102
    ID: Word;
103
  end;
104
  PHueInfo = ^THueInfo;
105
  THueInfo = record
106
    ID: Word;
107
    Hue: THue;
108
  end;
109

  
110
{ TfrmFilter }
111

  
112
procedure TfrmFilter.FormShow(Sender: TObject);
113
var
114
  upperLeft, lowerLeft: TPoint;
115
begin
116
  upperLeft := frmMain.pcLeft.ClientToScreen(Point(frmMain.pcLeft.Width, 0));
117
  lowerLeft := frmMain.pcLeft.ClientToScreen(Point(frmMain.pcLeft.Width,
118
    frmMain.pcLeft.Height));
119
  Left := upperLeft.x - 4;
120
  Top := upperLeft.y - 4;
121
  Height := lowerLeft.y - upperLeft.y;
122

  
123
  SetWindowParent(Handle, frmMain.Handle);
124
end;
125

  
126
procedure TfrmFilter.mnuUncheckHuesClick(Sender: TObject);
127
begin
128
  vdtHues.ClearChecked;
129
end;
130

  
131
procedure TfrmFilter.mnuCheckHuesClick(Sender: TObject);
132
var
133
  node: PVirtualNode;
134
begin
135
  node := vdtHues.GetFirst;
136
  while node <> nil do
137
  begin
138
    vdtHues.CheckState[node] := csCheckedNormal;
139
    node := vdtHues.GetNext(node);
140
  end;
141
end;
142

  
143
procedure TfrmFilter.rgFilterTypeClick(Sender: TObject);
144
begin
145
  frmMain.InvalidateFilter;
146
end;
147

  
148
procedure TfrmFilter.vdtFilterDragDrop(Sender: TBaseVirtualTree;
149
  Source: TObject; DataObject: IDataObject; Formats: TFormatArray;
150
  Shift: TShiftState; Pt: TPoint; var Effect: Integer; Mode: TDropMode);
151
var
152
  sourceTree: TVirtualDrawTree;
153
  selected, node: PVirtualNode;
154
  sourceTileInfo, targetTileInfo: PTileInfo;
155
begin
156
  sourceTree := Source as TVirtualDrawTree;
157
  if (sourceTree <> Sender) and (sourceTree <> nil) and
158
     (sourceTree.Tag = 1) then
159
  begin
160
    Sender.BeginUpdate;
161
    selected := sourceTree.GetFirstSelected;
162
    while selected <> nil do
163
    begin
164
      sourceTileInfo := sourceTree.GetNodeData(selected);
165
      if sourceTileInfo^.ID > $3FFF then
166
      begin
167
        node := Sender.AddChild(nil);
168
        targetTileInfo := Sender.GetNodeData(node);
169
        targetTileInfo^.ID := sourceTileInfo^.ID;
170
        cbTileFilter.Checked := True;
171
        frmMain.InvalidateFilter;
172
      end;
173
      selected := sourceTree.GetNextSelected(selected);
174
    end;
175
    Sender.EndUpdate;
176
  end;
177
end;
178

  
179
procedure TfrmFilter.vdtFilterDragOver(Sender: TBaseVirtualTree;
180
  Source: TObject; Shift: TShiftState; State: TDragState; Pt: TPoint;
181
  Mode: TDropMode; var Effect: Integer; var Accept: Boolean);
182
begin
183
  if (Source <> Sender) and (Source is TVirtualDrawTree) and
184
    (TVirtualDrawTree(Source).Tag = 1) then
185
  begin
186
    Accept := True;
187
  end;
188
end;
189

  
190
procedure TfrmFilter.vdtFilterDrawNode(Sender: TBaseVirtualTree;
191
  const PaintInfo: TVTPaintInfo);
192
begin
193
  frmMain.vdtTilesDrawNode(Sender, PaintInfo);
194
end;
195

  
196
procedure TfrmFilter.vdtHuesChecked(Sender: TBaseVirtualTree; Node: PVirtualNode);
197
var
198
  hueInfo: PHueInfo;
199
begin
200
  hueInfo := Sender.GetNodeData(Node);
201
  FCheckedHues.Bits[hueInfo^.ID] := (Sender.CheckState[node] = csCheckedNormal);
202
  cbHueFilter.Checked := True;
203
  frmMain.InvalidateFilter;
204
end;
205

  
206
procedure TfrmFilter.vdtHuesDrawNode(Sender: TBaseVirtualTree;
207
  const PaintInfo: TVTPaintInfo);
208
var
209
  hueInfo: PHueInfo;
210
  hueColor: TColor;
211
  i: Integer;
212
  textStyle: TTextStyle;
213
begin
214
  hueInfo := Sender.GetNodeData(PaintInfo.Node);
215
  textStyle := PaintInfo.Canvas.TextStyle;
216
  textStyle.Alignment := taLeftJustify;
217
  textStyle.Layout := tlCenter;
218
  textStyle.Wordbreak := True;
219
  case PaintInfo.Column of
220
    1:
221
      begin
222
        for i := 0 to 31 do
223
        begin
224
          hueColor := ARGB2RGB(hueInfo^.Hue.ColorTable[i]);
225
          PaintInfo.Canvas.Pen.Color := hueColor;
226
          PaintInfo.Canvas.MoveTo(PaintInfo.CellRect.Left + 2 + i, PaintInfo.CellRect.Top + 1);
227
          PaintInfo.Canvas.LineTo(PaintInfo.CellRect.Left + 2 + i, PaintInfo.CellRect.Bottom - 1);
228
        end;
229
      end;
230
    2:
231
      begin
232
        PaintInfo.Canvas.TextRect(PaintInfo.CellRect, PaintInfo.CellRect.Left, PaintInfo.CellRect.Top, Format('$%x (%s)', [hueInfo^.ID, hueInfo^.Hue.Name]), textStyle);
233
      end;
234
  end;
235
end;
236

  
237
procedure TfrmFilter.MouseLeave(var msg: TLMessage);
238
begin
239
  {if Active and (not PtInRect(ClientRect, ScreenToClient(Mouse.CursorPos))) then
240
    Close;}
241
end;
242

  
243
function TfrmFilter.Filter(AStatic: TStaticItem): Boolean;
244
var
245
  found: Boolean;
246
  tileInfo: PTileInfo;
247
  node: PVirtualNode;
248
  id: Word;
249
begin
250
  if cbTileFilter.Checked then
251
  begin
252
    id := AStatic.TileID + $4000;
253

  
254
    found := False;
255
    node := vdtFilter.GetFirst;
256
    while (node <> nil) and (not found) do
257
    begin
258
      tileInfo := vdtFilter.GetNodeData(node);
259
      if tileInfo^.ID = id then
260
        found := True
261
      else
262
        node := vdtFilter.GetNext(node);
263
    end;
264

  
265
    Result := ((rgFilterType.ItemIndex = 0) and (not found)) or
266
              ((rgFilterType.ItemIndex = 1) and found);
267
  end else
268
    Result := True;
269
    
270
  if cbHueFilter.Checked then
271
  begin
272
    Result := Result and (
273
                ((rgFilterType.ItemIndex = 0) and (not FCheckedHues.Bits[AStatic.Hue])) or
274
                ((rgFilterType.ItemIndex = 1) and (FCheckedHues.Bits[AStatic.Hue]))
275
              );
276
  end;
277
end;
278

  
279
procedure TfrmFilter.JumpToHue(AHueID: Word);
280
var
281
  hueInfo: PHueInfo;
282
  node: PVirtualNode;
283
begin
284
  node := vdtHues.GetFirst;
285
  while node <> nil do
286
  begin
287
    hueInfo := vdtHues.GetNodeData(node);
288
    if hueInfo^.ID = AHueID then
289
    begin
290
      vdtHues.ClearSelection;
291
      vdtHues.Selected[node] := True;
292
      vdtHues.FocusedNode := node;
293
      node := nil;
294
    end else
295
      node := vdtHues.GetNext(node);
296
  end;
297
end;
298

  
299
procedure TfrmFilter.FormCreate(Sender: TObject);
300
var
301
  i: Integer;
302
  hueInfo: PHueInfo;
303
  node: PVirtualNode;
304
begin
305
  FLocked := False;
306
  vdtFilter.NodeDataSize := SizeOf(TTileInfo);
307
  vdtHues.NodeDataSize := SizeOf(THueInfo);
308
  
309
  vdtHues.BeginUpdate;
310
  vdtHues.Clear;
311
  for i := 0 to ResMan.Hue.Count - 1 do
312
  begin
313
    node := vdtHues.AddChild(nil);
314
    hueInfo := vdtHues.GetNodeData(node);
315
    hueInfo^.ID := i + 1;
316
    hueInfo^.Hue := ResMan.Hue.Hues[i];
317
    vdtHues.CheckType[node] := ctCheckBox;
318
  end;
319
  vdtHues.EndUpdate;
320
  FCheckedHues := TBits.Create(ResMan.Hue.Count + 1);
321
  //FCheckedHues.Bits[0] := True;
322
end;
323

  
324
procedure TfrmFilter.FormDestroy(Sender: TObject);
325
begin
326
  if FCheckedHues <> nil then FreeAndNil(FCheckedHues);
327
end;
328

  
329
procedure TfrmFilter.btnDeleteClick(Sender: TObject);
330
begin
331
  vdtFilter.DeleteSelectedNodes;
332
end;
333

  
334
procedure TfrmFilter.cbHueFilterChange(Sender: TObject);
335
begin
336
  frmMain.InvalidateFilter;
337
end;
338

  
339
procedure TfrmFilter.cbTileFilterChange(Sender: TObject);
340
begin
341
  frmMain.InvalidateFilter;
342
end;
343

  
344
procedure TfrmFilter.btnClearClick(Sender: TObject);
345
begin
346
  vdtFilter.Clear;
347
end;
348

  
349
initialization
350
  {$I UfrmFilter.lrs}
351

  
352
end.
353

  

Also available in: Unified diff