Menu

[r2591]: / trunk / Src / UUIWidgetImages.pas  Maximize  Restore  History

Download this file

167 lines (144 with data), 4.9 kB

  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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
{
* This Source Code Form is subject to the terms of the Mozilla Public License,
* v. 2.0. If a copy of the MPL was not distributed with this file, You can
* obtain one at http://mozilla.org/MPL/2.0/
*
* Copyright (C) 2010-2012, Peter Johnson (www.delphidabbler.com).
*
* $Rev$
* $Date$
*
* Implements an abstract base class that provides a framework for classes that
* manage image lists containing images that are displayed in GUI widgets.
}
unit UUIWidgetImages;
interface
uses
// Delphi
Types, Classes, Controls, SyncObjs;
type
{
TUIWidgetImages:
Abstract base class that provides a framework for classes that manage image
lists containing images that are displayed in GUI widgets.
}
TUIWidgetImages = class abstract(TObject)
strict private
var
fImages: TImageList; // Value of Images property
fOwnsImages: Boolean; // Whether object owns (and frees) fImages
fLock: TSimpleEvent; // Signalling event to control access to Update
fOnChange: TNotifyEvent; // OnChange event handler
const
cLockTimeout = 10000; {10 secs} // Event signalling timeout
procedure ThemeChangeListener(Sender: TObject);
{Handles theme services change event. Updates images according to whether
themes are in use or not.
@param Sender [in] Not used.
}
procedure Update;
{Updates image list. Images used depend on whether themes are active.
}
strict protected
procedure RecreateImages; virtual; abstract;
{Descendants recreate the image list in this method. Images should take
account of whether themes are active.
}
function GetImageSize: TSize; virtual; abstract;
{Gets the size of a single UI widget image.
@return Required image size.
}
property Images: TImageList read fImages;
{References image list that contains the various UI widget images}
public
constructor Create(const AImages: TImageList; const AOwnsImages: Boolean);
{Object constructor. Sets up object.
@param AImages [in] Reference to image list that will contain the the UI
widget images.
@param AOwnsImages [in] True if this object owns, and frees, AImages and
False if caller maintains lifetime of AImages.
}
destructor Destroy; override;
{Object destructor. Tears down object and frees Images image list if
required.
}
property OnChange: TNotifyEvent
read fOnChange write fOnChange;
{Event triggered when image list changes, i.e. when themes change}
end;
implementation
uses
// Project
UThemesEx;
{ TUIWidgetImages }
constructor TUIWidgetImages.Create(const AImages: TImageList;
const AOwnsImages: Boolean);
{Object constructor. Sets up object.
@param AImages [in] Reference to image list that will contain the the UI
widget images.
@param AOwnsImages [in] True if this object owns, and frees, AImages and
False if caller maintains lifetime of AImages.
}
begin
Assert(Assigned(AImages), ClassName + '.Create: AImages is nil');
inherited Create;
fImages := AImages;
fOwnsImages := AOwnsImages;
fLock := TSimpleEvent.Create; // lock for protected sections: needed by Update
fLock.SetEvent;
Update;
ThemeServicesEx.AddChangeEventHandler(ThemeChangeListener);
end;
destructor TUIWidgetImages.Destroy;
{Object destructor. Tears down object and frees Images image list if required.
}
begin
ThemeServicesEx.RemoveChangeEventHandler(ThemeChangeListener);
if fOwnsImages then
fImages.Free;
fLock.Free;
inherited;
end;
procedure TUIWidgetImages.ThemeChangeListener(Sender: TObject);
{Handles theme services change event. Updates images according to whether
themes are in use or not.
@param Sender [in] Not used.
}
begin
Update;
end;
procedure TUIWidgetImages.Update;
{Updates image list. Images used depend on whether themes are active.
}
// ---------------------------------------------------------------------------
procedure UpdateImageListSize;
{Updates width and height of images stored in image list.
}
var
Size: TSize; // image size
begin
Size := GetImageSize;
Images.Width := Size.cx;
Images.Height := Size.cy;
end;
// ---------------------------------------------------------------------------
begin
// Wair for any lock to be opened
fLock.WaitFor(cLockTimeout);
// Close lock: this is used to prevent image list from being modified
// asynchronously
fLock.ResetEvent;
try
// Initialise image list
Images.Clear;
UpdateImageListSize;
RecreateImages;
finally
// Open lock: this permits modification of image list
fLock.SetEvent;
end;
// Trigger event notifying that check boxes have changed
if Assigned(fOnChange) then
fOnChange(Self);
end;
end.
Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.