Revision 119:66352054ce4d

b/Client/Tools/UfrmFilter.lfm
1
object frmFilter: TfrmFilter
2
  Left = 290
3
  Height = 492
4
  Top = 171
5
  Width = 232
6
  ActiveControl = rgFilterType.RadioButton0
7
  BorderIcons = [biSystemMenu, biMinimize]
8
  BorderStyle = bsToolWindow
9
  Caption = 'Filter'
10
  ClientHeight = 492
11
  ClientWidth = 232
12
  Font.Height = -11
13
  OnCreate = FormCreate
14
  OnDestroy = FormDestroy
15
  OnShow = FormShow
16
  LCLVersion = '0.9.27'
17
  object rgFilterType: TRadioGroup
18
    Left = 4
19
    Height = 40
20
    Top = 4
21
    Width = 224
22
    Align = alTop
23
    AutoFill = True
24
    BorderSpacing.Around = 4
25
    Caption = 'Filter rule'
26
    ChildSizing.LeftRightSpacing = 6
27
    ChildSizing.TopBottomSpacing = 6
28
    ChildSizing.EnlargeHorizontal = crsHomogenousChildResize
29
    ChildSizing.EnlargeVertical = crsHomogenousChildResize
30
    ChildSizing.ShrinkHorizontal = crsScaleChilds
31
    ChildSizing.ShrinkVertical = crsScaleChilds
32
    ChildSizing.Layout = cclLeftToRightThenTopToBottom
33
    ChildSizing.ControlsPerLine = 2
34
    ClientHeight = 26
35
    ClientWidth = 222
36
    Columns = 2
37
    ItemIndex = 0
38
    Items.Strings = (
39
      'Exclusive'
40
      'Inclusive'
41
    )
42
    OnClick = rgFilterTypeClick
43
    TabOrder = 0
44
  end
45
  object GroupBox1: TGroupBox
46
    Left = 4
47
    Height = 259
48
    Top = 48
49
    Width = 224
50
    Align = alClient
51
    BorderSpacing.Around = 4
52
    Caption = 'Tile filter'
53
    ClientHeight = 245
54
    ClientWidth = 222
55
    TabOrder = 1
56
    object Label1: TLabel
57
      AnchorSideLeft.Control = GroupBox1
58
      AnchorSideTop.Control = cbTileFilter
59
      AnchorSideTop.Side = asrBottom
60
      AnchorSideRight.Control = GroupBox1
61
      AnchorSideRight.Side = asrBottom
62
      Left = 4
63
      Height = 30
64
      Top = 30
65
      Width = 214
66
      Anchors = [akTop, akLeft, akRight]
67
      BorderSpacing.Around = 4
68
      Caption = 'Drag and Drop static tiles from the tile list on this list to add them to the filter.'
69
      ParentColor = False
70
      WordWrap = True
71
    end
72
    object btnClear: TSpeedButton
73
      AnchorSideLeft.Control = btnDelete
74
      AnchorSideLeft.Side = asrBottom
75
      AnchorSideRight.Control = GroupBox1
76
      AnchorSideRight.Side = asrCenter
77
      AnchorSideBottom.Control = btnDelete
78
      AnchorSideBottom.Side = asrBottom
79
      Left = 30
80
      Height = 22
81
      Hint = 'Clear'
82
      Top = 219
83
      Width = 22
84
      Anchors = [akLeft, akBottom]
85
      Color = clBtnFace
86
      Glyph.Data = {
87
        36040000424D3604000000000000360000002800000010000000100000000100
88
        20000000000000040000640000006400000000000000000000003ADCFE004800
89
        3A00FEFF4800FCFF1C00FCFF1C0080FF9C00003BD700AF9AFF00002CC600FDEB
90
        9B000000000000000000000000000000000000000000000000000EECFF00B2FC
91
        FF000046C00078D0FF000000F1FF0000F1FF0000F1FF0000F1FF0000EFFF0000
92
        EFFF0000EDFF0000EDFFCBF3FC008905000024AEEF00E4A81C000000DB00B29E
93
        FF0088000D000000F5FF1A20F5FF3C4CF9FF3A49F8FF3847F8FF3545F8FF3443
94
        F7FF3242F7FF141BF1FF0000EDFFFCFF1C00FCFF1C0080FF9C0004000000FFBC
95
        00000000F7FF1D23F9FF4453FAFF2429F9FF1212F7FF0F0FF6FF0C0CF5FF0909
96
        F5FF161BF5FF3343F7FF141BF1FF0000EDFFE4FF5C000050FF004C0000000000
97
        F9FF1F25FAFF4A58FBFF4247FBFFC9C9FDFF3B3BF9FF1313F7FF1010F6FF3333
98
        F7FFC5C5FDFF3035F7FF3444F7FF141BF2FF0000EDFF000008000052FF000000
99
        FBFF4F5DFDFF3237FBFFCBCBFEFFF2F2FFFFEBEBFEFF3B3BF9FF3939F8FFEAEA
100
        FEFFF1F1FEFFC5C5FDFF181DF6FF3343F7FF0000EFFF0000CC0088005B000000
101
        FDFF525FFDFF2828FCFF4747FCFFECECFFFFF2F2FFFFECECFFFFECECFEFFF1F1
102
        FFFFEAEAFEFF3434F7FF0B0BF5FF3545F8FF0000EFFF00B8FF00E3FFA8000000
103
        FDFF5562FEFF2C2CFDFF2929FCFF4848FCFFEDEDFFFFF2F2FFFFF2F2FFFFECEC
104
        FEFF3A3AF9FF1212F7FF0F0FF6FF3848F8FF0000F1FF08009000FCFF72000000
105
        FDFF5764FEFF3030FDFF2D2DFDFF4B4BFCFFEDEDFFFFF2F2FFFFF2F2FFFFECEC
106
        FFFF3D3DF9FF1616F8FF1313F7FF3C4BF8FF0000F1FF02000000E4FF5C000000
107
        FFFF5A67FEFF3333FEFF5050FDFFEDEDFFFFF3F3FFFFEDEDFFFFEDEDFFFFF2F2
108
        FFFFECECFEFF3E3EFAFF1717F8FF3F4EF9FF0000F1FFFCFF1C00000000000000
109
        FFFF5B68FFFF4347FEFFCFCFFFFFF3F3FFFFEDEDFFFF4C4CFCFF4A4AFCFFECEC
110
        FFFFF2F2FFFFCACAFEFF2A2FFAFF4251FAFF0000F3FF00000000CCFF4C000000
111
        FFFF262BFFFF5D6AFFFF585BFFFFCFCFFFFF5252FEFF2F2FFDFF2C2CFDFF4B4B
112
        FCFFCCCCFEFF484CFBFF4957FBFF1D23F9FF0000F5FF00000000000000000000
113
        00000000FFFF262BFFFF5D6AFFFF4347FFFF3434FEFF3232FEFF3030FDFF2D2D
114
        FDFF383CFCFF4F5DFCFF1F25FAFF0000F7FF0000000000000000000000000000
115
        0000000000000000FFFF262BFFFF5C69FFFF5B68FFFF5A67FEFF5865FEFF5663
116
        FEFF5461FEFF2227FCFF0000FBFFFCFF1C00000000000000000008000000EFEF
117
        EF00EFEFEF00EFEFEF000000FFFF0000FFFF0000FFFF0000FFFF0000FDFF0000
118
        FDFF0000FDFF0000FDFF000000000000000000000000000000009034DE009034
119
        DE00D86FDF00D86FDF00E0A223004AC6080000000000580000005870DF000C70
120
        DF000000000000000000000000002070DF000000000000000000
121
      }
122
      NumGlyphs = 0
123
      OnClick = btnClearClick
124
      ShowHint = True
125
      ParentShowHint = False
126
    end
127
    object btnDelete: TSpeedButton
128
      AnchorSideLeft.Control = GroupBox1
129
      AnchorSideBottom.Control = GroupBox1
130
      AnchorSideBottom.Side = asrBottom
131
      Left = 4
132
      Height = 22
133
      Hint = 'Delete'
134
      Top = 219
135
      Width = 22
136
      Anchors = [akLeft, akBottom]
137
      BorderSpacing.Around = 4
138
      Color = clBtnFace
139
      Glyph.Data = {
140
        36040000424D3604000000000000360000002800000010000000100000000100
141
        20000000000000040000640000006400000000000000000000004F91AB005588
142
        9C0043718A004E6974003E4B4C00457796003E6A950037556C005C7E8800548B
143
        A00031464100FFFFFF002B3238002D3B430074B9C8007FC4D5004788A7004A92
144
        B500435E6F002E3040002E3538003D5E7B003853BEFF3551BDFF304BBCFF2E4E
145
        B8FF303B3600FFFFFF00313637002C2D2B00588997007BC3D400365F8400396E
146
        9A003B6282003A5564004255C6FF3C52CCFF757AE8FF8F92EEFF8F92EEFF7178
147
        E4FF334DC1FF2B4AB7FFFFFFFF0036423900486B710061B4CE00396F9600375C
148
        83004085B1004959CBFF5C65E0FFA1A6F5FF7E86EFFF5B63E9FF595DE7FF7D84
149
        EEFF9EA0F4FF515DD7FF2B4AB7FFFFFFFF00354C4C004D94AF00375D7F003348
150
        5C005361CFFF616BE3FFA1ACF5FF545FECFF505CEAFF4D59E9FF4E59E6FF4C56
151
        E6FF5056E6FF9EA2F4FF5460D6FF2A4AB8FFFFFFFF004A90A6003B5864003D5B
152
        6A004B56DBFFA2ABF6FF5664F0FF5266EEFF4D59E9FF4D59E9FF4D59E9FF4D59
153
        E9FF4C58E6FF525AE6FF9FA3F5FF3450C4FF57929C00498BA40047676D005C62
154
        D7FF818CEEFF7E91F7FF5D73F3FF4D59E9FF4D59E9FF4D59E9FF4D59E9FF4D59
155
        E9FF4D59E9FF4F5BE9FF7B83F0FF757BE2FF2E4BBAFF54839500FFFFFF005F63
156
        DAFFA1ABF7FF7086F8FF6882F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
157
        FFFFFFFFFFFF4D59E9FF5C66EAFF969CF1FF3250BCFF6FA2AF00000000006469
158
        DBFFAFB9F9FF7F93FAFF7085F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
159
        FFFFFFFFFFFF4D59E9FF5E6AEEFF969DF1FF364FBEFF58B2E00000000000676A
160
        DEFFA5AFF5FF9DABFAFF778CF0FF545FECFF545FECFF545FECFF545FECFF545F
161
        ECFF545FECFF6377F2FF818EF4FF787FE9FF3A53C0FF000000000800000000E8
162
        1D007D83EAFFCDD4FCFF8B9DFAFF7E93F7FF758AEEFF6C84F6FF6C84F6FF6C84
163
        F6FF6C84F6FF6379F3FFA4AFF8FF3E4FD0FF000000000000000001000100DB12
164
        C0006A69E0FFA3A7F3FFD4DBFDFF879AFAFF7F91F0FF7A8EF1FF7F94F8FF7E92
165
        F9FF768CF8FFA8B6F8FF636EE3FF4557C7FF00000000000000002401AD00BA02
166
        AE002301AE006A69E0FFAAADF2FFD8DCFDFFAEBAFAFF91A3FAFF8B9DFAFF9CA9
167
        FBFFBAC7FCFF707BE9FF4C5BCCFFBB02F00000010000D8000000000000000000
168
        000008000000010008006A6ADFFF8E93EDFFBEC3F8FFCCD3F9FFC4CBF9FFAAB4
169
        F4FF6670E2FF535ED1FF5031DE005031DE002501AC00B902AD000D040400F804
170
        0500F20005000A0106000C040500F8040600686ADDFF6364DCFF6164DAFF5D63
171
        D9FFF2000700F804610000000000710900005031DE005031DE004034DE004034
172
        DE0068B0E00068B0E0000E049300F8049500F2009500070102000F049500F804
173
        0200F2000200080104000E040200F8040400F200040009010500
174
      }
175
      NumGlyphs = 0
176
      OnClick = btnDeleteClick
177
      ShowHint = True
178
      ParentShowHint = False
179
    end
180
    object vdtFilter: TVirtualDrawTree
181
      Tag = 1
182
      AnchorSideLeft.Control = GroupBox1
183
      AnchorSideTop.Control = Label1
184
      AnchorSideTop.Side = asrBottom
185
      AnchorSideRight.Control = GroupBox1
186
      AnchorSideRight.Side = asrBottom
187
      AnchorSideBottom.Control = btnDelete
188
      Cursor = 63
189
      Left = 4
190
      Height = 151
191
      Top = 64
192
      Width = 214
193
      Anchors = [akTop, akLeft, akRight, akBottom]
194
      BorderSpacing.Around = 4
195
      BorderStyle = bsSingle
196
      DefaultNodeHeight = 44
197
      DragType = dtVCL
198
      Header.AutoSizeIndex = 0
199
      Header.Columns = <      
200
        item
201
          Position = 0
202
          Text = 'ID'
203
        end      
204
        item
205
          Position = 1
206
          Text = 'Tile'
207
          Width = 44
208
        end      
209
        item
210
          Position = 2
211
          Text = 'Name'
212
          Width = 100
213
        end>
214
      Header.DefaultHeight = 17
215
      Header.Options = [hoColumnResize, hoDrag, hoVisible]
216
      Header.ParentFont = True
217
      Header.Style = hsFlatButtons
218
      TabOrder = 0
219
      TreeOptions.PaintOptions = [toHideFocusRect, toShowButtons, toShowDropmark, toThemeAware, toUseBlendedImages]
220
      TreeOptions.SelectionOptions = [toFullRowSelect, toMultiSelect]
221
      OnDragOver = vdtFilterDragOver
222
      OnDragDrop = vdtFilterDragDrop
223
      OnDrawNode = vdtFilterDrawNode
224
    end
225
    object cbTileFilter: TCheckBox
226
      AnchorSideLeft.Control = GroupBox1
227
      AnchorSideTop.Control = GroupBox1
228
      Left = 4
229
      Height = 22
230
      Top = 4
231
      Width = 85
232
      BorderSpacing.Around = 4
233
      Caption = 'Filter active'
234
      OnChange = cbTileFilterChange
235
      TabOrder = 1
236
    end
237
  end
238
  object GroupBox2: TGroupBox
239
    Left = 4
240
    Height = 168
241
    Top = 320
242
    Width = 224
243
    Align = alBottom
244
    BorderSpacing.Around = 4
245
    Caption = 'Hue filter'
246
    ClientHeight = 154
247
    ClientWidth = 222
248
    TabOrder = 2
249
    object cbHueFilter: TCheckBox
250
      Left = 4
251
      Height = 22
252
      Top = 4
253
      Width = 214
254
      Align = alTop
255
      BorderSpacing.Around = 4
256
      Caption = 'Filter active'
257
      OnChange = cbHueFilterChange
258
      TabOrder = 0
259
    end
260
    object vdtHues: TVirtualDrawTree
261
      Cursor = 63
262
      Left = 4
263
      Height = 120
264
      Top = 30
265
      Width = 214
266
      Align = alClient
267
      BorderSpacing.Around = 4
268
      BorderStyle = bsSingle
269
      Header.AutoSizeIndex = 2
270
      Header.Columns = <      
271
        item
272
          Position = 0
273
          Width = 20
274
        end      
275
        item
276
          Position = 1
277
          Text = 'Hue'
278
          Width = 38
279
        end      
280
        item
281
          Position = 2
282
          Text = 'Name'
283
          Width = 154
284
        end>
285
      Header.DefaultHeight = 17
286
      Header.Options = [hoAutoResize, hoColumnResize, hoDrag, hoVisible]
287
      Header.ParentFont = True
288
      Header.Style = hsFlatButtons
289
      PopupMenu = pmHues
290
      TabOrder = 1
291
      TreeOptions.MiscOptions = [toCheckSupport, toFullRepaintOnResize, toInitOnSave, toToggleOnDblClick, toWheelPanning]
292
      TreeOptions.PaintOptions = [toShowButtons, toShowDropmark, toThemeAware, toUseBlendedImages]
293
      TreeOptions.SelectionOptions = [toFullRowSelect]
294
      OnChecked = vdtHuesChecked
295
      OnDrawNode = vdtHuesDrawNode
296
    end
297
  end
298
  object Splitter1: TSplitter
299
    Cursor = crVSplit
300
    Left = 0
301
    Height = 5
302
    Top = 311
303
    Width = 232
304
    Align = alBottom
305
    ResizeAnchor = akBottom
306
  end
307
  object pmHues: TPopupMenu
308
    left = 148
309
    top = 404
310
    object mnuCheckHues: TMenuItem
311
      Caption = 'Check all hues'
312
      OnClick = mnuCheckHuesClick
313
    end
314
    object mnuUncheckHues: TMenuItem
315
      Caption = 'Uncheck all hues'
316
      OnClick = mnuUncheckHuesClick
317
    end
318
  end
319
end
1
object frmFilter: TfrmFilter
2
  Left = 290
3
  Height = 492
4
  Top = 171
5
  Width = 232
6
  ActiveControl = rgFilterType.RadioButton0
7
  BorderIcons = [biSystemMenu, biMinimize]
8
  BorderStyle = bsToolWindow
9
  Caption = 'Filter'
10
  ClientHeight = 492
11
  ClientWidth = 232
12
  Font.Height = -11
13
  OnCreate = FormCreate
14
  OnDestroy = FormDestroy
15
  OnShow = FormShow
16
  LCLVersion = '0.9.29'
17
  object rgFilterType: TRadioGroup
18
    Left = 4
19
    Height = 40
20
    Top = 4
21
    Width = 224
22
    Align = alTop
23
    AutoFill = True
24
    BorderSpacing.Around = 4
25
    Caption = 'Filter rule'
26
    ChildSizing.LeftRightSpacing = 6
27
    ChildSizing.TopBottomSpacing = 6
28
    ChildSizing.EnlargeHorizontal = crsHomogenousChildResize
29
    ChildSizing.EnlargeVertical = crsHomogenousChildResize
30
    ChildSizing.ShrinkHorizontal = crsScaleChilds
31
    ChildSizing.ShrinkVertical = crsScaleChilds
32
    ChildSizing.Layout = cclLeftToRightThenTopToBottom
33
    ChildSizing.ControlsPerLine = 2
34
    ClientHeight = 22
35
    ClientWidth = 220
36
    Columns = 2
37
    ItemIndex = 0
38
    Items.Strings = (
39
      'Exclusive'
40
      'Inclusive'
41
    )
42
    OnClick = rgFilterTypeClick
43
    TabOrder = 0
44
  end
45
  object GroupBox1: TGroupBox
46
    Left = 4
47
    Height = 259
48
    Top = 48
49
    Width = 224
50
    Align = alClient
51
    BorderSpacing.Around = 4
52
    Caption = 'Tile filter'
53
    ClientHeight = 241
54
    ClientWidth = 220
55
    TabOrder = 1
56
    object Label1: TLabel
57
      AnchorSideLeft.Control = GroupBox1
58
      AnchorSideTop.Control = cbTileFilter
59
      AnchorSideTop.Side = asrBottom
60
      AnchorSideRight.Control = GroupBox1
61
      AnchorSideRight.Side = asrBottom
62
      Left = 4
63
      Height = 27
64
      Top = 27
65
      Width = 212
66
      Anchors = [akTop, akLeft, akRight]
67
      BorderSpacing.Around = 4
68
      Caption = 'Drag and Drop static tiles from the tile list on this list to add them to the filter.'
69
      ParentColor = False
70
      WordWrap = True
71
    end
72
    object btnClear: TSpeedButton
73
      AnchorSideLeft.Control = btnDelete
74
      AnchorSideLeft.Side = asrBottom
75
      AnchorSideRight.Control = GroupBox1
76
      AnchorSideRight.Side = asrCenter
77
      AnchorSideBottom.Control = btnDelete
78
      AnchorSideBottom.Side = asrBottom
79
      Left = 30
80
      Height = 22
81
      Hint = 'Clear'
82
      Top = 215
83
      Width = 22
84
      Anchors = [akLeft, akBottom]
85
      Color = clBtnFace
86
      Glyph.Data = {
87
        36040000424D3604000000000000360000002800000010000000100000000100
88
        20000000000000040000640000006400000000000000000000003ADCFE004800
89
        3A00FEFF4800FCFF1C00FCFF1C0080FF9C00003BD700AF9AFF00002CC600FDEB
90
        9B000000000000000000000000000000000000000000000000000EECFF00B2FC
91
        FF000046C00078D0FF000000F1FF0000F1FF0000F1FF0000F1FF0000EFFF0000
92
        EFFF0000EDFF0000EDFFCBF3FC008905000024AEEF00E4A81C000000DB00B29E
93
        FF0088000D000000F5FF1A20F5FF3C4CF9FF3A49F8FF3847F8FF3545F8FF3443
94
        F7FF3242F7FF141BF1FF0000EDFFFCFF1C00FCFF1C0080FF9C0004000000FFBC
95
        00000000F7FF1D23F9FF4453FAFF2429F9FF1212F7FF0F0FF6FF0C0CF5FF0909
96
        F5FF161BF5FF3343F7FF141BF1FF0000EDFFE4FF5C000050FF004C0000000000
97
        F9FF1F25FAFF4A58FBFF4247FBFFC9C9FDFF3B3BF9FF1313F7FF1010F6FF3333
98
        F7FFC5C5FDFF3035F7FF3444F7FF141BF2FF0000EDFF000008000052FF000000
99
        FBFF4F5DFDFF3237FBFFCBCBFEFFF2F2FFFFEBEBFEFF3B3BF9FF3939F8FFEAEA
100
        FEFFF1F1FEFFC5C5FDFF181DF6FF3343F7FF0000EFFF0000CC0088005B000000
101
        FDFF525FFDFF2828FCFF4747FCFFECECFFFFF2F2FFFFECECFFFFECECFEFFF1F1
102
        FFFFEAEAFEFF3434F7FF0B0BF5FF3545F8FF0000EFFF00B8FF00E3FFA8000000
103
        FDFF5562FEFF2C2CFDFF2929FCFF4848FCFFEDEDFFFFF2F2FFFFF2F2FFFFECEC
104
        FEFF3A3AF9FF1212F7FF0F0FF6FF3848F8FF0000F1FF08009000FCFF72000000
105
        FDFF5764FEFF3030FDFF2D2DFDFF4B4BFCFFEDEDFFFFF2F2FFFFF2F2FFFFECEC
106
        FFFF3D3DF9FF1616F8FF1313F7FF3C4BF8FF0000F1FF02000000E4FF5C000000
107
        FFFF5A67FEFF3333FEFF5050FDFFEDEDFFFFF3F3FFFFEDEDFFFFEDEDFFFFF2F2
108
        FFFFECECFEFF3E3EFAFF1717F8FF3F4EF9FF0000F1FFFCFF1C00000000000000
109
        FFFF5B68FFFF4347FEFFCFCFFFFFF3F3FFFFEDEDFFFF4C4CFCFF4A4AFCFFECEC
110
        FFFFF2F2FFFFCACAFEFF2A2FFAFF4251FAFF0000F3FF00000000CCFF4C000000
111
        FFFF262BFFFF5D6AFFFF585BFFFFCFCFFFFF5252FEFF2F2FFDFF2C2CFDFF4B4B
112
        FCFFCCCCFEFF484CFBFF4957FBFF1D23F9FF0000F5FF00000000000000000000
113
        00000000FFFF262BFFFF5D6AFFFF4347FFFF3434FEFF3232FEFF3030FDFF2D2D
114
        FDFF383CFCFF4F5DFCFF1F25FAFF0000F7FF0000000000000000000000000000
115
        0000000000000000FFFF262BFFFF5C69FFFF5B68FFFF5A67FEFF5865FEFF5663
116
        FEFF5461FEFF2227FCFF0000FBFFFCFF1C00000000000000000008000000EFEF
117
        EF00EFEFEF00EFEFEF000000FFFF0000FFFF0000FFFF0000FFFF0000FDFF0000
118
        FDFF0000FDFF0000FDFF000000000000000000000000000000009034DE009034
119
        DE00D86FDF00D86FDF00E0A223004AC6080000000000580000005870DF000C70
120
        DF000000000000000000000000002070DF000000000000000000
121
      }
122
      NumGlyphs = 0
123
      OnClick = btnClearClick
124
      ShowHint = True
125
      ParentShowHint = False
126
    end
127
    object btnDelete: TSpeedButton
128
      AnchorSideLeft.Control = GroupBox1
129
      AnchorSideBottom.Control = GroupBox1
130
      AnchorSideBottom.Side = asrBottom
131
      Left = 4
132
      Height = 22
133
      Hint = 'Delete'
134
      Top = 215
135
      Width = 22
136
      Anchors = [akLeft, akBottom]
137
      BorderSpacing.Around = 4
138
      Color = clBtnFace
139
      Glyph.Data = {
140
        36040000424D3604000000000000360000002800000010000000100000000100
141
        20000000000000040000640000006400000000000000000000004F91AB005588
142
        9C0043718A004E6974003E4B4C00457796003E6A950037556C005C7E8800548B
143
        A00031464100FFFFFF002B3238002D3B430074B9C8007FC4D5004788A7004A92
144
        B500435E6F002E3040002E3538003D5E7B003853BEFF3551BDFF304BBCFF2E4E
145
        B8FF303B3600FFFFFF00313637002C2D2B00588997007BC3D400365F8400396E
146
        9A003B6282003A5564004255C6FF3C52CCFF757AE8FF8F92EEFF8F92EEFF7178
147
        E4FF334DC1FF2B4AB7FFFFFFFF0036423900486B710061B4CE00396F9600375C
148
        83004085B1004959CBFF5C65E0FFA1A6F5FF7E86EFFF5B63E9FF595DE7FF7D84
149
        EEFF9EA0F4FF515DD7FF2B4AB7FFFFFFFF00354C4C004D94AF00375D7F003348
150
        5C005361CFFF616BE3FFA1ACF5FF545FECFF505CEAFF4D59E9FF4E59E6FF4C56
151
        E6FF5056E6FF9EA2F4FF5460D6FF2A4AB8FFFFFFFF004A90A6003B5864003D5B
152
        6A004B56DBFFA2ABF6FF5664F0FF5266EEFF4D59E9FF4D59E9FF4D59E9FF4D59
153
        E9FF4C58E6FF525AE6FF9FA3F5FF3450C4FF57929C00498BA40047676D005C62
154
        D7FF818CEEFF7E91F7FF5D73F3FF4D59E9FF4D59E9FF4D59E9FF4D59E9FF4D59
155
        E9FF4D59E9FF4F5BE9FF7B83F0FF757BE2FF2E4BBAFF54839500FFFFFF005F63
156
        DAFFA1ABF7FF7086F8FF6882F6FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
157
        FFFFFFFFFFFF4D59E9FF5C66EAFF969CF1FF3250BCFF6FA2AF00000000006469
158
        DBFFAFB9F9FF7F93FAFF7085F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
159
        FFFFFFFFFFFF4D59E9FF5E6AEEFF969DF1FF364FBEFF58B2E00000000000676A
160
        DEFFA5AFF5FF9DABFAFF778CF0FF545FECFF545FECFF545FECFF545FECFF545F
161
        ECFF545FECFF6377F2FF818EF4FF787FE9FF3A53C0FF000000000800000000E8
162
        1D007D83EAFFCDD4FCFF8B9DFAFF7E93F7FF758AEEFF6C84F6FF6C84F6FF6C84
163
        F6FF6C84F6FF6379F3FFA4AFF8FF3E4FD0FF000000000000000001000100DB12
164
        C0006A69E0FFA3A7F3FFD4DBFDFF879AFAFF7F91F0FF7A8EF1FF7F94F8FF7E92
165
        F9FF768CF8FFA8B6F8FF636EE3FF4557C7FF00000000000000002401AD00BA02
166
        AE002301AE006A69E0FFAAADF2FFD8DCFDFFAEBAFAFF91A3FAFF8B9DFAFF9CA9
167
        FBFFBAC7FCFF707BE9FF4C5BCCFFBB02F00000010000D8000000000000000000
168
        000008000000010008006A6ADFFF8E93EDFFBEC3F8FFCCD3F9FFC4CBF9FFAAB4
169
        F4FF6670E2FF535ED1FF5031DE005031DE002501AC00B902AD000D040400F804
170
        0500F20005000A0106000C040500F8040600686ADDFF6364DCFF6164DAFF5D63
171
        D9FFF2000700F804610000000000710900005031DE005031DE004034DE004034
172
        DE0068B0E00068B0E0000E049300F8049500F2009500070102000F049500F804
173
        0200F2000200080104000E040200F8040400F200040009010500
174
      }
175
      NumGlyphs = 0
176
      OnClick = btnDeleteClick
177
      ShowHint = True
178
      ParentShowHint = False
179
    end
180
    object vdtFilter: TVirtualDrawTree
181
      Tag = 1
182
      AnchorSideLeft.Control = GroupBox1
183
      AnchorSideTop.Control = Label1
184
      AnchorSideTop.Side = asrBottom
185
      AnchorSideRight.Control = GroupBox1
186
      AnchorSideRight.Side = asrBottom
187
      AnchorSideBottom.Control = btnDelete
188
      Cursor = 63
189
      Left = 4
190
      Height = 153
191
      Top = 58
192
      Width = 212
193
      Anchors = [akTop, akLeft, akRight, akBottom]
194
      BorderSpacing.Around = 4
195
      BorderStyle = bsSingle
196
      DefaultNodeHeight = 44
197
      DragType = dtVCL
198
      Header.AutoSizeIndex = 0
199
      Header.Columns = <      
200
        item
201
          Position = 0
202
          Text = 'ID'
203
        end      
204
        item
205
          Position = 1
206
          Text = 'Tile'
207
          Width = 44
208
        end      
209
        item
210
          Position = 2
211
          Text = 'Name'
212
          Width = 100
213
        end>
214
      Header.DefaultHeight = 17
215
      Header.Options = [hoColumnResize, hoDrag, hoVisible]
216
      Header.ParentFont = True
217
      Header.Style = hsFlatButtons
218
      TabOrder = 0
219
      TreeOptions.PaintOptions = [toHideFocusRect, toShowButtons, toShowDropmark, toThemeAware, toUseBlendedImages]
220
      TreeOptions.SelectionOptions = [toFullRowSelect, toMultiSelect]
221
      OnDragOver = vdtFilterDragOver
222
      OnDragDrop = vdtFilterDragDrop
223
      OnDrawNode = vdtFilterDrawNode
224
    end
225
    object cbTileFilter: TCheckBox
226
      AnchorSideLeft.Control = GroupBox1
227
      AnchorSideTop.Control = GroupBox1
228
      Left = 4
229
      Height = 19
230
      Top = 4
231
      Width = 78
232
      BorderSpacing.Around = 4
233
      Caption = 'Filter active'
234
      OnChange = cbTileFilterChange
235
      TabOrder = 1
236
    end
237
  end
238
  object GroupBox2: TGroupBox
239
    Left = 4
240
    Height = 168
241
    Top = 320
242
    Width = 224
243
    Align = alBottom
244
    BorderSpacing.Around = 4
245
    Caption = 'Hue filter'
246
    ClientHeight = 150
247
    ClientWidth = 220
248
    TabOrder = 2
249
    object cbHueFilter: TCheckBox
250
      Left = 4
251
      Height = 19
252
      Top = 4
253
      Width = 212
254
      Align = alTop
255
      BorderSpacing.Around = 4
256
      Caption = 'Filter active'
257
      OnChange = cbHueFilterChange
258
      TabOrder = 0
259
    end
260
    object vdtHues: TVirtualDrawTree
261
      Cursor = 63
262
      Left = 4
263
      Height = 119
264
      Top = 27
265
      Width = 212
266
      Align = alClient
267
      BorderSpacing.Around = 4
268
      BorderStyle = bsSingle
269
      Header.AutoSizeIndex = 2
270
      Header.Columns = <      
271
        item
272
          Position = 0
273
          Width = 20
274
        end      
275
        item
276
          Position = 1
277
          Text = 'Hue'
278
          Width = 38
279
        end      
280
        item
281
          Position = 2
282
          Text = 'Name'
283
          Width = 150
284
        end>
285
      Header.DefaultHeight = 17
286
      Header.Options = [hoAutoResize, hoColumnResize, hoDrag, hoVisible]
287
      Header.ParentFont = True
288
      Header.Style = hsFlatButtons
289
      PopupMenu = pmHues
290
      TabOrder = 1
291
      TreeOptions.MiscOptions = [toCheckSupport, toFullRepaintOnResize, toInitOnSave, toToggleOnDblClick, toWheelPanning]
292
      TreeOptions.PaintOptions = [toShowButtons, toShowDropmark, toThemeAware, toUseBlendedImages]
293
      TreeOptions.SelectionOptions = [toFullRowSelect]
294
      OnChecked = vdtHuesChecked
295
      OnDrawNode = vdtHuesDrawNode
296
    end
297
  end
298
  object Splitter1: TSplitter
299
    Cursor = crVSplit
300
    Left = 0
301
    Height = 5
302
    Top = 311
303
    Width = 232
304
    Align = alBottom
305
    ResizeAnchor = akBottom
306
  end
307
  object pmHues: TPopupMenu
308
    left = 148
309
    top = 404
310
    object mnuCheckHues: TMenuItem
311
      Caption = 'Check all hues'
312
      OnClick = mnuCheckHuesClick
313
    end
314
    object mnuUncheckHues: TMenuItem
315
      Caption = 'Uncheck all hues'
316
      OnClick = mnuUncheckHuesClick
317
    end
318
  end
319
end
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

  
b/Client/ULandscape.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 ULandscape;
27

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

  
30
interface
31

  
32
uses
33
  SysUtils, Classes, math, LCLIntf, GL, GLu, ImagingOpenGL, Imaging,
34
  ImagingClasses, ImagingTypes, ImagingUtility,
35
  UGenericIndex, UMap, UStatics, UArt, UTexture, UTiledata, UHue, UWorldItem,
36
  UMulBlock, UAnimData,
37
  UVector, UEnhancedMemoryStream, UGLFont,
38
  UCacheManager;
39

  
40
type
41
  PNormals = ^TNormals;
42
  TNormals = array[0..3] of TVector;
43
  PRadarBlock = ^TRadarBlock;
44
  TRadarBlock = array[0..7, 0..7] of Word;
45
  
46
  { TMaterial }
47
  
48
  TMaterial = class(ICacheable)
49
    constructor Create;
50
    destructor Destroy; override;
51
  protected
52
    FRefCount: Integer;
53
    FWidth: Integer;
54
    FHeight: Integer;
55
    FRealWidth: Integer;
56
    FRealHeight: Integer;
57
    FGraphic: TMultiImage;
58
    procedure CalculateTextureDimensions(ACaps: TGLTextureCaps; ARealWidth,
59
      ARealHeight: Integer; out AWidth, AHeight: Integer);
60
    function GenerateTexture(AImage: TBaseImage): TGLuint;
61
    function GetTexture: GLuint; virtual; abstract;
62
  public
63
    property Width: Integer read FWidth;
64
    property Height: Integer read FHeight;
65
    property RealWidth: Integer read FRealWidth;
66
    property RealHeight: Integer read FRealHeight;
67
    property Texture: GLuint read GetTexture;
68

  
69
    procedure AddRef;
70
    procedure DelRef;
71
    function HitTest(AX, AY: Integer): Boolean;
72

  
73
    {ICacheable}
74
    function CanBeRemoved: Boolean;
75
    procedure RemoveFromCache;
76
  end;
77

  
78
  { TSimpleMaterial }
79

  
80
  TSimpleMaterial = class(TMaterial)
81
    constructor Create(AGraphic: TBaseImage);
82
    destructor Destroy; override;
83
  protected
84
    FTexture: TGLuint;
85
    function GetTexture: GLuint; override;
86
  end;
87

  
88
  { TAnimMaterial }
89

  
90
  TAnimMaterial = class(TMaterial)
91
    constructor Create(ABaseID: Word; AAnimData: TAnimData; AHue: THue = nil;
92
      APartialHue: Boolean = False);
93
    destructor Destroy; override;
94
  protected
95
    FActiveFrame: Byte;
96
    FNextChange: DWord;
97
    FAnimData: TAnimData;
98
    FTextures: array of TGLuint;
99
    function GetTexture: GLuint; override;
100
  end;
101

  
102
  TMaterialCache = specialize TCacheManager<TMaterial>;
103
  
104
  { TLandTextureManager }
105
  
106
  TLandTextureManager = class
107
    constructor Create;
108
    destructor Destroy; override;
109
  protected
110
    FArtCache: TMaterialCache;
111
    FTexCache: TMaterialCache;
112
    FAnimCache: TMaterialCache;
113
    FUseAnims: Boolean;
114
  public
115
    property UseAnims: Boolean read FUseAnims write FUseAnims;
116
    function GetArtMaterial(ATileID: Word): TMaterial; overload;
117
    function GetArtMaterial(ATileID: Word; AHue: THue;
118
      APartialHue: Boolean): TMaterial; overload;
119
    function GetStaticMaterial(AStaticItem: TStaticItem;
120
      AOverrideHue: Integer = -1): TMaterial;
121
    function GetTexMaterial(ATileID: Word): TMaterial;
122
  end;
123

  
124
 { TSeperatedStaticBlock }
125

  
126
  TSeperatedStaticBlock = class(TStaticBlock)
127
    constructor Create(AData: TStream; AIndex: TGenericIndex; AX, AY: Word); overload;
128
    constructor Create(AData: TStream; AIndex: TGenericIndex); overload;
129
    destructor Destroy; override;
130
  public
131
    Cells: array[0..63] of TStaticItemList;
132
    { Methods }
133
    function Clone: TSeperatedStaticBlock; override;
134
    function GetSize: Integer; override;
135
    procedure RebuildList;
136
  end;
137

  
138
  TLandscape = class;
139
  
140
  { TBlock }
141

  
142
  TBlock = class
143
    constructor Create(AMap: TMapBlock; AStatics: TStaticBlock);
144
    destructor Destroy; override;
145
  protected
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff