uimageobservation.pas 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. // SPDX-License-Identifier: GPL-3.0-only
  2. unit UImageObservation;
  3. {$mode objfpc}{$H+}
  4. interface
  5. uses
  6. Classes, SysUtils;
  7. type
  8. TLazPaintImageObservationEvent = record
  9. Sender: TObject;
  10. DelayedStackUpdate: boolean;
  11. end;
  12. TLazPaintImageObservationHandler = procedure(AEvent: TLazPaintImageObservationEvent) of object;
  13. { TLazPaintImageObservable }
  14. TLazPaintImageObservable = class
  15. private
  16. FObservers: array of TLazPaintImageObservationHandler;
  17. FObserverCount: integer;
  18. FObservable: TObject;
  19. public
  20. DelayedStackUpdate: boolean;
  21. constructor Create(AObservable: TObject);
  22. destructor Destroy; override;
  23. procedure AddObserver(AObservationHandler: TLazPaintImageObservationHandler);
  24. procedure RemoveObserver(AObservationHandler: TLazPaintImageObservationHandler);
  25. procedure NotifyObservers;
  26. end;
  27. implementation
  28. { TLazPaintImageObservable }
  29. constructor TLazPaintImageObservable.Create(AObservable: TObject);
  30. begin
  31. FObserverCount := 0;
  32. FObservable:= AObservable;
  33. end;
  34. destructor TLazPaintImageObservable.Destroy;
  35. begin
  36. inherited Destroy;
  37. end;
  38. procedure TLazPaintImageObservable.AddObserver(
  39. AObservationHandler: TLazPaintImageObservationHandler);
  40. begin
  41. if length(FObservers) = FObserverCount then
  42. setLength(FObservers,length(FObservers)*2+1);
  43. FObservers[FObserverCount] := AObservationHandler;
  44. inc(FObserverCount);
  45. end;
  46. procedure TLazPaintImageObservable.RemoveObserver(
  47. AObservationHandler: TLazPaintImageObservationHandler);
  48. var
  49. i,j: Integer;
  50. begin
  51. for i := 0 to FObserverCount-1 do
  52. if FObservers[i] = AObservationHandler then
  53. begin
  54. for j := i to FObserverCount-2 do
  55. FObservers[j] := FObservers[j+1];
  56. dec(FObserverCount);
  57. exit;
  58. end;
  59. end;
  60. procedure TLazPaintImageObservable.NotifyObservers;
  61. var
  62. i: Integer;
  63. event: TLazPaintImageObservationEvent;
  64. begin
  65. event.Sender := FObservable;
  66. event.DelayedStackUpdate := DelayedStackUpdate;
  67. for i := 0 to FObserverCount-1 do
  68. FObservers[i](event);
  69. end;
  70. end.