GuiSkins.pas
上传用户:ctlcnc
上传日期:2021-12-10
资源大小:4933k
文件大小:13k
源码类别:

2D图形编程

开发平台:

Delphi

  1. unit GuiSkins;
  2. //---------------------------------------------------------------------------
  3. // GuiSkins.pas                                         Modified: 03-Mar-2007
  4. // Skinning and colors for Asphyre GUI foundation                 Version 1.0
  5. //---------------------------------------------------------------------------
  6. // Important Notice:
  7. //
  8. // If you modify/use this code or one of its parts either in original or
  9. // modified form, you must comply with Mozilla Public License v1.1,
  10. // specifically section 3, "Distribution Obligations". Failure to do so will
  11. // result in the license breach, which will be resolved in the court.
  12. // Remember that violating author's rights is considered a serious crime in
  13. // many countries. Thank you!
  14. //
  15. // !! Please *read* Mozilla Public License 1.1 document located at:
  16. //  http://www.mozilla.org/MPL/
  17. //
  18. // If you require any clarifications about the license, feel free to contact
  19. // us or post your question on our forums at: http://www.afterwarp.net
  20. //---------------------------------------------------------------------------
  21. // The contents of this file are subject to the Mozilla Public License
  22. // Version 1.1 (the "License"); you may not use this file except in
  23. // compliance with the License. You may obtain a copy of the License at
  24. // http://www.mozilla.org/MPL/
  25. //
  26. // Software distributed under the License is distributed on an "AS IS"
  27. // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
  28. // License for the specific language governing rights and limitations
  29. // under the License.
  30. //
  31. // The Original Code is GuiSkins.pas.
  32. //
  33. // The Initial Developer of the Original Code is M. Sc. Yuriy Kotsarenko.
  34. // Portions created by M. Sc. Yuriy Kotsarenko are Copyright (C) 2007,
  35. // Afterwarp Interactive. All Rights Reserved.
  36. //---------------------------------------------------------------------------
  37. interface
  38. //---------------------------------------------------------------------------
  39. uses
  40.  Types, AsphyreXML, AsphyreTypes, AsphyreImages, MediaUtils, GuiTypes;
  41. //---------------------------------------------------------------------------
  42. type
  43.  TSkinDrawType = (sdtNormal, sdtOver, sdtDown, sdtFocused, sdtDisabled);
  44. //---------------------------------------------------------------------------
  45.  TGuiSkin = class
  46.  private
  47.   NormalSkinIndex  : Integer;
  48.   OverSkinIndex    : Integer;
  49.   DownSkinIndex    : Integer;
  50.   FocusedSkinIndex : Integer;
  51.   DisabledSkinIndex: Integer;
  52.   FNormalSkin  : string;
  53.   FNormalRect  : TRect;
  54.   FOverSkin    : string;
  55.   FOverRect    : TRect;
  56.   FDownSkin    : string;
  57.   FDownRect    : TRect;
  58.   FFocusedSkin : string;
  59.   FFocusedRect : TRect;
  60.   FDisabledSkin: string;
  61.   FDisabledRect: TRect;
  62.   procedure SetNormalSkin(const Value: string);
  63.   procedure SetOverSkin(const Value: string);
  64.   procedure SetDownSkin(const Value: string);
  65.   procedure SetFocusedSkin(const Value: string);
  66.   procedure SetDisabledSkin(const Value: string);
  67.   procedure HandleSkin(var SkinIndex: Integer; var Skin: string;
  68.    var Image: TAsphyreCustomImage);
  69.  public
  70.   property NormalSkin: string read FNormalSkin write SetNormalSkin;
  71.   property NormalRect: TRect read FNormalRect write FNormalRect;
  72.   property OverSkin: string read FOverSkin write SetOverSkin;
  73.   property OverRect: TRect read FOverRect write FOverRect;
  74.   property DownSkin: string read FDownSkin write SetDownSkin;
  75.   property DownRect: TRect read FDownRect write FDownRect;
  76.   property FocusedSkin: string read FFocusedSkin write SetFocusedSkin;
  77.   property FocusedRect: TRect read FFocusedRect write FFocusedRect;
  78.   property DisabledSkin: string read FDisabledSkin write SetDisabledSkin;
  79.   property DisabledRect: TRect read FDisabledRect write FDisabledRect;
  80.   function UseImage(DrawType: TSkinDrawType): Boolean;
  81.   procedure Assign(Source: TGuiSkin);
  82.   procedure LoadFromXML(Parent: TXMLNode);
  83.   constructor Create();
  84.  end;
  85. //---------------------------------------------------------------------------
  86.  TGuiFontCol = class
  87.  private
  88.   FNormal  : TColor2;
  89.   FOver    : TColor2;
  90.   FDown    : TColor2;
  91.   FFocused : TColor2;
  92.   FDisabled: TColor2;
  93.  public
  94.   property Normal  : TColor2 read FNormal write FNormal;
  95.   property Over    : TColor2 read FOver write FOver;
  96.   property Down    : TColor2 read FDown write FDown;
  97.   property Focused : TColor2 read FFocused write FFocused;
  98.   property Disabled: TColor2 read FDisabled write FDisabled;
  99.   function UseColor(DrawType: TSkinDrawType): TColor2;
  100.   procedure Assign(Source: TGuiFontCol);
  101.   procedure LoadFromXML(Parent: TXMLNode);
  102.   constructor Create();
  103.  end;
  104. //---------------------------------------------------------------------------
  105. implementation
  106. //---------------------------------------------------------------------------
  107. constructor TGuiSkin.Create();
  108. begin
  109.  inherited;
  110.  FNormalSkin:= '';
  111.  NormalSkinIndex:= -1;
  112.  FOverSkin:= '';
  113.  OverSkinIndex:= -1;
  114.  FDownSkin:= '';
  115.  DownSkinIndex:= -1;
  116.  FFocusedSkin:= '';
  117.  FocusedSkinIndex:= -1;
  118.  FDisabledSkin:= '';
  119.  DisabledSkinIndex:= -1;
  120. end;
  121. //---------------------------------------------------------------------------
  122. procedure TGuiSkin.SetNormalSkin(const Value: string);
  123. begin
  124.  FNormalSkin:= Value;
  125.  NormalSkinIndex:= -1;
  126. end;
  127. //---------------------------------------------------------------------------
  128. procedure TGuiSkin.SetOverSkin(const Value: string);
  129. begin
  130.  FOverSkin:= Value;
  131.  OverSkinIndex:= -1;
  132. end;
  133. //---------------------------------------------------------------------------
  134. procedure TGuiSkin.SetDownSkin(const Value: string);
  135. begin
  136.  FDownSkin:= Value;
  137.  DownSkinIndex:= -1;
  138. end;
  139. //---------------------------------------------------------------------------
  140. procedure TGuiSkin.SetFocusedSkin(const Value: string);
  141. begin
  142.  FFocusedSkin:= Value;
  143.  FocusedSkinIndex:= -1;
  144. end;
  145. //---------------------------------------------------------------------------
  146. procedure TGuiSkin.SetDisabledSkin(const Value: string);
  147. begin
  148.  FDisabledSkin:= Value;
  149.  DisabledSkinIndex:= -1;
  150. end;
  151. //---------------------------------------------------------------------------
  152. procedure TGuiSkin.HandleSkin(var SkinIndex: Integer; var Skin: string;
  153.  var Image: TAsphyreCustomImage);
  154. begin
  155.  // attempt to retreive image by index first
  156.  if (SkinIndex <> -1) then
  157.   begin
  158.    Image := GuiImages[SkinIndex];
  159.    if (Image = nil) then SkinIndex:= -1;
  160.   end else Image:= nil;
  161.  // attempt to retreive Result by name
  162.  if (SkinIndex = -1) then
  163.   begin
  164.    Image:= GuiImages.Image[Skin];
  165.    if (Image = nil) then Skin:= '' else SkinIndex:= Image.ImageIndex;
  166.   end;
  167. end;
  168. //---------------------------------------------------------------------------
  169. function TGuiSkin.UseImage(DrawType: TSkinDrawType): Boolean;
  170. var
  171.  Image: TAsphyreCustomImage;
  172. begin
  173.  case DrawType of
  174.   sdtNormal:
  175.    begin
  176.     HandleSkin(NormalSkinIndex, FNormalSkin, Image);
  177.     Result:= (Image <> nil);
  178.     if (Image <> nil) then
  179.      GuiCanvas.UseImage(Image, pxRect4(FNormalRect));
  180.    end;
  181.   sdtOver:
  182.    begin
  183.     HandleSkin(OverSkinIndex, FOverSkin, Image);
  184.     Result:= (Image <> nil);
  185.     if (Image <> nil) then GuiCanvas.UseImage(Image, pxRect4(FOverRect))
  186.      else Result:= UseImage(sdtNormal);
  187.    end;
  188.   sdtDown:
  189.    begin
  190.     HandleSkin(DownSkinIndex, FDownSkin, Image);
  191.     Result:= (Image <> nil);
  192.     if (Image <> nil) then GuiCanvas.UseImage(Image, pxRect4(FDownRect))
  193.      else Result:= UseImage(sdtNormal);
  194.    end;
  195.   sdtFocused:
  196.    begin
  197.     HandleSkin(FocusedSkinIndex, FFocusedSkin, Image);
  198.     Result:= (Image <> nil);
  199.     if (Image <> nil) then GuiCanvas.UseImage(Image, pxRect4(FFocusedRect))
  200.      else Result:= UseImage(sdtNormal);
  201.    end;
  202.   sdtDisabled:
  203.    begin
  204.     HandleSkin(DisabledSkinIndex, FDisabledSkin, Image);
  205.     Result:= (Image <> nil);
  206.     if (Image <> nil) then GuiCanvas.UseImage(Image, pxRect4(FDisabledRect))
  207.      else Result:= UseImage(sdtNormal);
  208.    end;
  209.   else Result:= False;
  210.  end;
  211. end;
  212. //---------------------------------------------------------------------------
  213. procedure TGuiSkin.Assign(Source: TGuiSkin);
  214. begin
  215.  NormalSkin  := Source.NormalSkin;
  216.  NormalRect  := Source.NormalRect;
  217.  OverSkin    := Source.OverSkin;
  218.  OverRect    := Source.OverRect;
  219.  DownSkin    := Source.DownSkin;
  220.  DownRect    := Source.DownRect;
  221.  FocusedSkin := Source.FocusedSkin;
  222.  FocusedRect := Source.FocusedRect;
  223.  DisabledSkin:= Source.DisabledSkin;
  224.  DisabledRect:= Source.DisabledRect;
  225. end;
  226. //---------------------------------------------------------------------------
  227. procedure TGuiSkin.LoadFromXML(Parent: TXMLNode);
  228. var
  229.  Node: TXMLNode;
  230. begin
  231.  // -> "normal" node
  232.  Node:= Parent.ChildNode['normal'];
  233.  if (Node <> nil) then
  234.   begin
  235.    NormalSkin:= Node.FieldValue['skin'];
  236.    FNormalRect.Left  := ParseInt(Node.FieldValue['left'], 0);
  237.    FNormalRect.Top   := ParseInt(Node.FieldValue['top'], 0);
  238.    FNormalRect.Right := ParseInt(Node.FieldValue['right'], 0);
  239.    FNormalRect.Bottom:= ParseInt(Node.FieldValue['bottom'], 0);
  240.    Inc(FNormalRect.Right);
  241.    Inc(FNormalRect.Bottom);
  242.   end;
  243.  // -> "over" node
  244.  Node:= Parent.ChildNode['over'];
  245.  if (Node <> nil) then
  246.   begin
  247.    OverSkin:= Node.FieldValue['skin'];
  248.    FOverRect.Left  := ParseInt(Node.FieldValue['left'], 0);
  249.    FOverRect.Top   := ParseInt(Node.FieldValue['top'], 0);
  250.    FOverRect.Right := ParseInt(Node.FieldValue['right'], 0);
  251.    FOverRect.Bottom:= ParseInt(Node.FieldValue['bottom'], 0);
  252.    Inc(FOverRect.Right);
  253.    Inc(FOverRect.Bottom);
  254.   end;
  255.  // -> "down" node
  256.  Node:= Parent.ChildNode['down'];
  257.  if (Node <> nil) then
  258.   begin
  259.    DownSkin:= Node.FieldValue['skin'];
  260.    FDownRect.Left  := ParseInt(Node.FieldValue['left'], 0);
  261.    FDownRect.Top   := ParseInt(Node.FieldValue['top'], 0);
  262.    FDownRect.Right := ParseInt(Node.FieldValue['right'], 0);
  263.    FDownRect.Bottom:= ParseInt(Node.FieldValue['bottom'], 0);
  264.    Inc(FDownRect.Right);
  265.    Inc(FDownRect.Bottom);
  266.   end;
  267.  // -> "focused" node
  268.  Node:= Parent.ChildNode['focused'];
  269.  if (Node <> nil) then
  270.   begin
  271.    FocusedSkin:= Node.FieldValue['skin'];
  272.    FFocusedRect.Left  := ParseInt(Node.FieldValue['left'], 0);
  273.    FFocusedRect.Top   := ParseInt(Node.FieldValue['top'], 0);
  274.    FFocusedRect.Right := ParseInt(Node.FieldValue['right'], 0);
  275.    FFocusedRect.Bottom:= ParseInt(Node.FieldValue['bottom'], 0);
  276.    Inc(FFocusedRect.Right);
  277.    Inc(FFocusedRect.Bottom);
  278.   end;
  279.  // -> "disabled" node
  280.  Node:= Parent.ChildNode['disabled'];
  281.  if (Node <> nil) then
  282.   begin
  283.    DisabledSkin:= Node.FieldValue['skin'];
  284.    FDisabledRect.Left  := ParseInt(Node.FieldValue['left'], 0);
  285.    FDisabledRect.Top   := ParseInt(Node.FieldValue['top'], 0);
  286.    FDisabledRect.Right := ParseInt(Node.FieldValue['right'], 0);
  287.    FDisabledRect.Bottom:= ParseInt(Node.FieldValue['bottom'], 0);
  288.    Inc(FDisabledRect.Right);
  289.    Inc(FDisabledRect.Bottom);
  290.   end;
  291. end;
  292. //---------------------------------------------------------------------------
  293. constructor TGuiFontCol.Create();
  294. begin
  295.  inherited;
  296.  FNormal  := clWhite2;
  297.  FOver    := clUnknown2;
  298.  FDown    := clUnknown2;
  299.  FFocused := clUnknown2;
  300.  FDisabled:= clUnknown2;
  301. end;
  302. //---------------------------------------------------------------------------
  303. function TGuiFontCol.UseColor(DrawType: TSkinDrawType): TColor2;
  304. begin
  305.  case DrawType of
  306.   sdtNormal:
  307.    Result:= FNormal;
  308.   sdtOver:
  309.    if (FOver[0] <> clUnknown)or(FOver[1] <> clUnknown) then
  310.     Result:= FOver else Result:= FNormal;
  311.   sdtDown:
  312.    if (FDown[0] <> clUnknown)or(FDown[1] <> clUnknown) then
  313.     Result:= FDown else Result:= FNormal;
  314.   sdtFocused:
  315.    if (FFocused[0] <> clUnknown)or(FFocused[1] <> clUnknown) then
  316.     Result:= FFocused else Result:= FNormal;
  317.   sdtDisabled:
  318.    if (FDisabled[0] <> clUnknown)or(FDisabled[1] <> clUnknown) then
  319.     Result:= FDisabled else Result:= FNormal;
  320.  end;
  321. end;
  322. //---------------------------------------------------------------------------
  323. procedure TGuiFontCol.Assign(Source: TGuiFontCol);
  324. begin
  325.  FNormal  := Source.Normal;
  326.  FOver    := Source.Over;
  327.  FDown    := Source.Down;
  328.  FFocused := Source.Focused;
  329.  FDisabled:= Source.Disabled;
  330. end;
  331. //---------------------------------------------------------------------------
  332. procedure TGuiFontCol.LoadFromXML(Parent: TXMLNode);
  333. var
  334.  Node: TXMLNode;
  335. begin
  336.  // -> "normal" node
  337.  Node:= Parent.ChildNode['normal'];
  338.  if (Node <> nil) then
  339.   FNormal:= ParseColor2Field(Node);
  340.  // -> "over" node
  341.  Node:= Parent.ChildNode['over'];
  342.  if (Node <> nil) then
  343.   FOver:= ParseColor2Field(Node);
  344.  // -> "down" node
  345.  Node:= Parent.ChildNode['down'];
  346.  if (Node <> nil) then
  347.   FDown:= ParseColor2Field(Node);
  348.  // -> "focused" node
  349.  Node:= Parent.ChildNode['focused'];
  350.  if (Node <> nil) then
  351.   FFocused:= ParseColor2Field(Node);
  352.  // -> "disabled" node
  353.  Node:= Parent.ChildNode['disabled'];
  354.  if (Node <> nil) then
  355.   FDisabled:= ParseColor2Field(Node);
  356. end;
  357. //---------------------------------------------------------------------------
  358. end.