ACS.pas
上传用户:yj_qiu
上传日期:2022-08-08
资源大小:23636k
文件大小:23k
源码类别:

游戏引擎

开发平台:

Delphi

  1. (*
  2.  @Abstract(ACS GUI library unit)
  3.  (C) 2006 George "Mirage" Bakhtadze. <a href="http://www.casteng.com">www.casteng.com</a> <br>
  4.  The source code may be used under either MPL 1.1 or LGPL 2.1 license. See included license.txt file <br>
  5.  Unit contains simple GUI controls
  6. *)
  7. {$Include GDefines.inc}
  8. unit ACS;
  9. interface
  10. uses
  11.   SysUtils,
  12.   TextFile, 
  13.   BaseTypes, Basics, Base3D, BaseGraph, BaseClasses, BaseMsg, Props, ACSBase, GUIFitter;
  14. type
  15.   TValueDelegate = function(Caller: TGUIItem): Integer of object;
  16.   TGUIPoint = class(TGUIItem)
  17.   end;
  18.   TGUILine = class(TGUIItem)
  19.     procedure Draw; override;
  20.   end;
  21.   TLabel = class(TTextGUIItem)
  22.     procedure Draw; override;
  23.   end;
  24.   TPanel = class(TUVGUIItem)
  25.     procedure Draw; override;
  26.   end;
  27.   TButton = class(TPanel)
  28.   protected
  29.     procedure UpdateVisualParameters; override;
  30.   end;
  31.   TSwitchButton = class(TButton)
  32.   private
  33.     BaseFrame: Integer;
  34.     FVariantIndex, TotalVariants: Integer;
  35.     procedure SetVariantIndex(const Value: Integer); virtual;
  36.   public
  37.     function GUIHandleMessage(const Msg: TMessage): Boolean; override;
  38.     procedure AddProperties(const Result: Props.TProperties); override;
  39.     procedure SetProperties(Properties: Props.TProperties); override;
  40.     property VariantIndex: Integer read FVariantIndex write SetVariantIndex;
  41.   end;
  42.   TCheckBox = class(TButton)
  43.   private
  44.     BaseFrame: Integer;
  45.     FChecked: Boolean;
  46.     procedure SetChecked(const Value: Boolean);
  47.   public
  48.     function GUIHandleMessage(const Msg: TMessage): Boolean; override;
  49.     procedure AddProperties(const Result: Props.TProperties); override;
  50.     procedure SetProperties(Properties: Props.TProperties); override;
  51.     procedure Draw; override;
  52.     property Checked: Boolean read FChecked write SetChecked;
  53.   end;
  54.   TTrackBar = class(TUVGUIItem)
  55.   private
  56.     FMinValue, FMaxValue: Integer;
  57.     FValue: Integer;
  58.     BarColor: BaseTypes.TColor;
  59.     BarFrame: Integer;
  60.     Vertical: Boolean;
  61.     procedure SetMinValue(const Value: Integer);
  62.     procedure SetMaxValue(const Value: Integer);
  63.     procedure SetValue(const Value: Integer);
  64.     function GetMaxValue: Integer;
  65.     function GetMinValue: Integer;
  66.     function GetValue: Integer;
  67.   public
  68.     OnGetMinValue, OnGetMaxValue, OnGetValue: TValueDelegate;         // Used instead of fields if assigned
  69.     procedure AddProperties(const Result: Props.TProperties); override;
  70.     procedure SetProperties(Properties: Props.TProperties); override;
  71.     property MinValue: Integer read GetMinValue write SetMinValue;
  72.     property MaxValue: Integer read GetMaxValue write SetMaxValue;
  73.     property Value: Integer read GetValue write SetValue;
  74.   end;
  75.   TProgressBar = class(TTrackBar)
  76.     procedure Draw; override;
  77.   end;
  78.   TSlider = class(TTrackBar)
  79.   private
  80.     BarSize, SliderSize: Single;
  81.   public
  82.     function GUIHandleMessage(const Msg: TMessage): Boolean; override;
  83.     procedure AddProperties(const Result: Props.TProperties); override;
  84.     procedure SetProperties(Properties: Props.TProperties); override;
  85.     procedure Draw; override;
  86.   end;
  87.   TEdit = class(TPanel)
  88.   private
  89.     Changed: Boolean;
  90.     function GetTextItem: TTextGUIItem;
  91.     function GetText: string;
  92.     procedure SetText(const Value: string);
  93.   public
  94.     MaxLength: Integer;
  95.     FocusedLinesColor, CursorColor: BaseTypes.TColor;
  96.     Counter: Longword;
  97.     CursorHeight: Single;
  98.     constructor Create(AManager: TItemsManager); override;
  99.     constructor Construct(AManager: TItemsManager); override;
  100.     function GUIHandleMessage(const Msg: TMessage): Boolean; override;
  101.     procedure Process(const DeltaT: Float); override;
  102.     procedure Draw; override;
  103.     procedure AddProperties(const Result: Props.TProperties); override;
  104.     procedure SetProperties(Properties: Props.TProperties); override;
  105.     property Text: string read GetText write SetText;
  106.   end;
  107.   TCursorPicture = class(TGUIItem)
  108.   private
  109.     HotX, HotY: Single;
  110.     WindowX1, WindowY1, WindowX2, WindowY2: Single;
  111.     procedure CheckPosition;
  112.   public
  113.     function GUIHandleMessage(const Msg: TMessage): Boolean; override;
  114.     procedure AddProperties(const Result: Props.TProperties); override;
  115.     procedure SetProperties(Properties: Props.TProperties); override;
  116.     procedure SetWindow(const X1, Y1, X2, Y2: Single); virtual;
  117.   end;
  118.   TCaptionArea = class(TGUIItem)
  119.     procedure HandleMessage(const Msg: TMessage); override;
  120.   end;
  121.   TClientArea = class(TGUIItem)
  122.     procedure HandleMessage(const Msg: TMessage); override;
  123.   end;
  124.   TWindow = class(TGUIItem)
  125.   private
  126.     CaptionArea: TCaptionArea;
  127.     ClientArea: TClientArea;
  128.   public
  129.     constructor Create(AManager: TItemsManager); override;
  130.     constructor Construct(AManager: TItemsManager); override;
  131.     function SetChild(Index: Integer; AItem: TItem): TItem; override;
  132.     procedure Draw; override;
  133.     procedure Process(const DeltaT: Float); override;
  134.   end;
  135.   // Returns list of classes introduced by the unit
  136.   function GetUnitClassList: TClassArray;
  137. implementation
  138. uses GUIMsg;
  139. function GetUnitClassList: TClassArray;
  140. begin
  141.   Result := GetClassList([TGUIItem, TGUIRootItem,
  142.                           T2DFitter,
  143.                           TGUIPoint, TGUILine, TCursorPicture,
  144.                           TLabel, TPanel, TButton, TSwitchButton, TCheckBox,
  145.                           TProgressBar, TSlider, TEdit,
  146.                           TWindow, TCaptionArea, TClientArea
  147.                           ]);
  148. end;
  149. { TGUILine }
  150. procedure TGUILine.Draw;
  151. var i, PCnt: Integer; Point: TGUIPoint;
  152. begin
  153.   inherited;
  154.   PCnt := 0;
  155.   for i := 0 to TotalChilds-1 do if (Childs[i] is TGUIPoint) and (isVisible in Childs[i].State) then begin
  156.     Point := Childs[i] as TGUIPoint;
  157.     Screen.SetColor(Point.Color);
  158.     if PCnt = 0 then Screen.MoveTo(Point.PxX, Point.PxY) else Screen.LineTo(Point.PxX, Point.PxY);
  159.     Inc(PCnt);
  160.   end;
  161. end;
  162. { TLabel }
  163. procedure TLabel.Draw;
  164. begin
  165.   inherited;
  166.   Screen.SetColor(Color);
  167.   Screen.SetFont(Font);
  168.   DrawText(0, 0);
  169. end;
  170. { TPanel }
  171. procedure TPanel.Draw;
  172. begin
  173.   inherited;
  174.   Screen.SetColor(Color);
  175.   Screen.SetUV(UVMap^[Frame]);
  176.   Screen.Bar(0, 0, PxWidth, PxHeight);
  177.   Screen.SetUV(DefaultUV);
  178. end;
  179. { TButton }
  180. procedure TButton.UpdateVisualParameters;
  181. begin
  182.   inherited;
  183. {  if csPressed in GetStatesSource.ControlState then begin
  184.     if GetStatesSource.GetHover then begin
  185.       Color := PressedColor;
  186.       if frPressed in UsedFrames then
  187.         Frame := NormalFrame + Ord(frHover in UsedFrames) + Ord(frFocused in UsedFrames) + Ord(frDisabled in UsedFrames) + 1;
  188.     end;
  189.   end else Frame := NormalFrame + Ord(frHover in UsedFrames) * Ord(GetStatesSource.GetHover);}
  190. end;
  191. { TSwitchButton }
  192. procedure TSwitchButton.SetVariantIndex(const Value: Integer);
  193. begin
  194.   if Value = FVariantIndex then Exit;
  195.   if (Value >= 0) and (Value < TotalVariants) then FVariantIndex := Value;
  196.   NormalFrame := BaseFrame + (Ord(frHover in UsedFrames) + Ord(frPushed in UsedFrames) + Ord(frFocused in UsedFrames) + Ord(frDisabled in UsedFrames) + 1) * VariantIndex;
  197.   Frame := NormalFrame;
  198.   UpdateVisualParameters;
  199.   if isVisibleAndEnabled then ReturnMessage(TGUIChangeMsg.Create(Self));
  200. end;
  201. function TSwitchButton.GUIHandleMessage(const Msg: TMessage): Boolean;
  202. begin
  203.   Result := inherited GUIHandleMessage(Msg);
  204.   if not Result then Exit;
  205.   if Msg.ClassType = TMouseClickMsg then with TMouseClickMsg(Msg) do begin
  206.     if (Button = IK_MOUSELEFT) and Hover then if VariantIndex < TotalVariants-1 then VariantIndex := VariantIndex + 1 else VariantIndex := 0;
  207.   end;
  208. end;
  209. procedure TSwitchButton.AddProperties(const Result: Props.TProperties);
  210. begin
  211.   inherited;
  212.   if not Assigned(Result) then Exit;
  213.   Result.Add('Base frame',     vtInt, [], IntToStr(BaseFrame),     '');
  214.   Result.Add('Variant index',  vtInt, [], IntToStr(VariantIndex),  '');
  215.   Result.Add('Total variants', vtInt, [], IntToStr(TotalVariants), '');
  216. end;
  217. procedure TSwitchButton.SetProperties(Properties: Props.TProperties);
  218. begin
  219.   inherited;
  220.   if Properties.Valid('Base frame')     then BaseFrame     := StrToIntDef(Properties['Base frame'],     0);
  221.   if Properties.Valid('Variant index')  then VariantIndex  := StrToIntDef(Properties['Variant index'],  0);
  222.   if Properties.Valid('Total variants') then TotalVariants := StrToIntDef(Properties['Total variants'], 0);
  223.   UpdateVisualParameters;
  224.   VariantIndex := VariantIndex;
  225. end;
  226. { TCheckBox }
  227. procedure TCheckBox.SetChecked(const Value: Boolean);
  228. begin
  229.   if FChecked = Value then Exit;
  230.   FChecked := Value;
  231.   NormalFrame := BaseFrame + (Ord(frHover in UsedFrames) + Ord(frPushed in UsedFrames) + Ord(frFocused in UsedFrames) + Ord(frDisabled in UsedFrames) + 1) * Ord(Checked);
  232.   Frame := NormalFrame;
  233.   UpdateVisualParameters;
  234.   if isVisibleAndEnabled then ReturnMessage(TGUIChangeMsg.Create(Self));
  235. end;
  236. function TCheckBox.GUIHandleMessage(const Msg: TMessage): Boolean;
  237. begin
  238.   Result := inherited GUIHandleMessage(Msg);
  239.   if Hover and (Msg.ClassType = TMouseClickMsg) and (TMouseClickMsg(Msg).Button = IK_MOUSELEFT) then
  240.     Checked := not Checked;
  241. end;
  242. procedure TCheckBox.AddProperties(const Result: Props.TProperties);
  243. begin
  244.   inherited;
  245.   if not Assigned(Result) then Exit;
  246.   Result.Add('Base frame',     vtInt,     [], IntToStr(BaseFrame),     '');
  247.   Result.Add('Checked',        vtBoolean, [], OnOffStr[Checked],       '');
  248. end;
  249. procedure TCheckBox.SetProperties(Properties: Props.TProperties);
  250. begin
  251.   inherited;
  252.   if Properties.Valid('Base frame') then BaseFrame := StrToIntDef(Properties['Base frame'], 0);
  253.   if Properties.Valid('Checked')    then Checked   := Properties.GetAsInteger('Checked') > 0;
  254.   UpdateVisualParameters;
  255. end;
  256. procedure TCheckBox.Draw;
  257. begin
  258.   inherited;
  259. end;
  260. { TWindow }
  261. constructor TWindow.Create(AManager: TItemsManager);
  262. begin
  263.   inherited;
  264. end;
  265. constructor TWindow.Construct(AManager: TItemsManager);
  266. begin
  267.   inherited;
  268.   CaptionArea := TCaptionArea.Create(AManager);
  269. //  CaptionArea.Name := 'CaptionArea';
  270.   ClientArea := TClientArea.Create(AManager);
  271. //  ClientArea.Name := 'ClientArea';
  272.   AddChild(CaptionArea);
  273.   AddChild(ClientArea);
  274. end;
  275. procedure TWindow.Draw;
  276. begin
  277.   inherited;
  278.   Screen.SetColor(Color);
  279.   Screen.MoveTo(-0*PxWidth * 0.5, -0*PxHeight * 0.5);
  280.   Screen.LineTo(   PxWidth * 1,   -0*PxHeight * 0.5);
  281.   Screen.LineTo(   PxWidth * 1,      PxHeight * 1);
  282.   Screen.LineTo(-0*PxWidth * 0.5,    PxHeight * 1);
  283.   Screen.LineTo(-0*PxWidth * 0.5, -0*PxHeight * 0.5);
  284. end;
  285. procedure TWindow.Process(const DeltaT: Float);
  286. begin
  287.   inherited;
  288. //  Angle := Angle + 30*pi/180;
  289. end;
  290. function TWindow.SetChild(Index: Integer; AItem: TItem): TItem;
  291. procedure SetArea(var AreaItem: TGUIItem; NewAreaItem: TGUIItem);
  292. begin
  293.   if AreaItem = NewAreaItem then Exit;
  294.   if AreaItem <> nil then FreeAndNil(AreaItem);
  295.   AreaItem := NewAreaItem;
  296. end;
  297. begin
  298. //  Assert((Index <= 1) and (AItem is TClientArea), ClassName + '.SetChild: Only two childs of class TClientArea allowed');
  299. //  Result := nil;
  300. //  if (Index > 1) or not (AItem is TClientArea) then Exit;
  301.   Result := inherited SetChild(Index, AItem);
  302.   case Index of
  303.     0: if (CaptionArea <> AItem) and (AItem is TCaptionArea) then begin
  304.       if CaptionArea <> nil then FreeAndNil(CaptionArea);
  305.       CaptionArea := AItem as TCaptionArea;
  306.     end;
  307.     1: if (ClientArea <> AItem) and (AItem is TClientArea) then begin
  308.       if ClientArea <> nil then FreeAndNil(ClientArea);
  309.       ClientArea := AItem as TClientArea;
  310.     end;
  311.   end;
  312. end;
  313. { TCursorPicture }
  314. procedure TCursorPicture.CheckPosition;
  315. var WX1, WY1, WX2, WY2: Single;
  316. begin
  317.   Exit;
  318.   if WindowX1 = 0 then WX1 := -HotX else WX1 := WindowX1-HotX;
  319.   if WindowY1 = 0 then WY1 := -HotY else WY1 := WindowY1-HotY;
  320.   if WindowX2 = 0 then WX2 := Screen.Width-1-HotX  else WX2 := WindowX2-HotX;
  321.   if WindowY2 = 0 then WY2 := Screen.Height-1-HotY else WY2 := WindowY2-HotY;
  322.   X := MinS(MaxS(X, WX1), WX2) + 0.5;
  323.   Y := MinS(MaxS(Y, WY1), WY2) + 0.5;
  324. end;
  325. function TCursorPicture.GUIHandleMessage(const Msg: TMessage): Boolean;
  326. begin
  327.   Enabled := False;                            // To prevent mouse occlusion
  328.   Result := inherited GUIHandleMessage(Msg);
  329.   Enabled := True;
  330.   if not Result then Exit;
  331.   if (Msg.ClassType = TMouseMoveMsg) then with TMouseMoveMsg(Msg) do begin
  332.     Self.X := X - HotX;
  333.     Self.Y := Y - HotY;
  334.     CheckPosition;
  335.   end;
  336. end;
  337. procedure TCursorPicture.AddProperties(const Result: Props.TProperties);
  338. begin
  339.   inherited;
  340.   if not Assigned(Result) then Exit;
  341.   Result.Add('Hot X', vtSingle, [], FloatToStr(HotX), '');
  342.   Result.Add('Hot Y', vtSingle, [], FloatToStr(HotY), '');
  343. end;
  344. procedure TCursorPicture.SetProperties(Properties: Props.TProperties);
  345. begin
  346.   inherited;
  347.   if Properties.Valid('Hot X') then HotX := StrToFloatDef(Properties['Hot X'], 0);
  348.   if Properties.Valid('Hot Y') then HotX := StrToFloatDef(Properties['Hot Y'], 0);
  349. end;
  350. procedure TCursorPicture.SetWindow(const X1, Y1, X2, Y2: Single);
  351. begin
  352.   WindowX1 := X1; WindowY1 := Y1; WindowX2 := X2; WindowY2 := Y2;
  353.   if WindowX1 > WindowX2 then Swap(WindowX1, WindowX2);
  354.   if WindowY1 > WindowY2 then Swap(WindowY1, WindowY2);
  355.   CheckPosition;
  356. end;
  357. { TCaptionArea }
  358. procedure TCaptionArea.HandleMessage(const Msg: TMessage);
  359. begin
  360.   inherited;
  361.   if Msg.ClassType = TWindowResizeMsg then with TWindowResizeMsg(Msg) do begin
  362.     PxWidth :=  NewWidth;
  363.     PxX     := -NewWidth*0.5;
  364.     PxY     := -NewHeight*0.5 - PxHeight;
  365.   end;
  366. end;
  367. { TClientArea }
  368. procedure TClientArea.HandleMessage(const Msg: TMessage);
  369. begin
  370.   inherited;
  371.   if Msg.ClassType = TWindowResizeMsg then with TWindowResizeMsg(Msg) do begin
  372.     PxWidth  :=  NewWidth;
  373.     PxHeight :=  NewHeight;
  374.     PxX      := -NewWidth*0.5;
  375.     PxY      := -NewHeight*0.5;
  376.   end;
  377. end;
  378. { TTrackBar }
  379. function TTrackBar.GetMinValue: Integer;
  380. begin
  381.   if Assigned(OnGetMinValue) then FMinValue := OnGetMinValue(Self);
  382.   Result := FMinValue;
  383. end;
  384. function TTrackBar.GetMaxValue: Integer;
  385. begin
  386.   if Assigned(OnGetMaxValue) then FMaxValue := OnGetMaxValue(Self);
  387.   Result := FMaxValue;
  388. end;
  389. function TTrackBar.GetValue: Integer;
  390. begin
  391.   if Assigned(OnGetValue) then FValue := OnGetValue(Self);
  392.   Result := FValue;
  393. end;
  394. procedure TTrackBar.SetMinValue(const Value: Integer);
  395. begin
  396.   FMinValue := MinI(MaxValue, Value);
  397. end;
  398. procedure TTrackBar.SetMaxValue(const Value: Integer);
  399. begin
  400.   FMaxValue := MaxI(MinValue, Value);
  401. end;
  402. procedure TTrackBar.SetValue(const Value: Integer);
  403. var OldValue: Integer;
  404. begin
  405.   OldValue := FValue;
  406.   FValue := MaxI(MinValue, MinI(MaxValue, Value));
  407.   if (OldValue <> FValue) and isVisibleAndEnabled then ReturnMessage(TGUIChangeMsg.Create(Self));
  408. //  FValue := Value;
  409. end;
  410. procedure TTrackBar.AddProperties(const Result: Props.TProperties);
  411. begin
  412.   inherited;
  413.   if not Assigned(Result) then Exit;
  414.   Result.Add('Value',        vtInt,     [], IntToStr(FValue),   '');
  415.   Result.Add('ValueMin',    vtInt,     [], IntToStr(MinValue), '');
  416.   Result.Add('ValueMax',    vtInt,     [], IntToStr(MaxValue), '');
  417.   AddColorProperty(Result, 'ColorBar', BarColor);
  418.   Result.Add('UVBar frame', vtInt,     [], IntToStr(BarFrame),          '');
  419.   Result.Add('Vertical',     vtBoolean, [], OnOffStr[Vertical],          '');
  420. end;
  421. procedure TTrackBar.SetProperties(Properties: Props.TProperties);
  422. begin
  423.   inherited;
  424.   if Properties.Valid('ValueMin')    then MinValue := StrToIntDef(Properties['ValueMin'], 0);
  425.   if Properties.Valid('ValueMax')    then MaxValue := StrToIntDef(Properties['ValueMax'], 0);
  426.   if Properties.Valid('Value')        then Value    := StrToIntDef(Properties['Value'],     0);
  427.   SetColorProperty(Properties, 'ColorBar', BarColor);
  428.   if Properties.Valid('UVBar frame') then BarFrame := StrToIntDef(Properties['UVBar frame'], 0);
  429.   if Properties.Valid('Vertical')     then Vertical := Properties.GetAsInteger('Vertical') > 0;
  430. end;
  431. { TProgressBar }
  432. procedure TProgressBar.Draw;
  433. var Temp: Single; UV: TUV;
  434. begin
  435.   inherited;
  436.   if MaxValue = 0 then Temp := 0 else Temp := Value / MaxValue;
  437.   if Vertical then begin
  438.     UV.U := UVMap^[Frame].U; UV.W := UVMap^[Frame].W;
  439.     UV.V := UVMap^[Frame].V; UV.H := UVMap^[Frame].H * (1-Temp);
  440.     Screen.SetUV(UV);
  441.     Screen.SetColor(Color);
  442.     Screen.Bar(0, 0, PxWidth, PxHeight - PxHeight * Temp);
  443.     UV.U := UVMap^[BarFrame].U; UV.W := UVMap^[BarFrame].W;
  444.     UV.V := UVMap^[BarFrame].V + UVMap^[BarFrame].H * (1-Temp); UV.H := UVMap^[BarFrame].H * Temp;
  445.     Screen.SetUV(UV);
  446.     Screen.SetColor(BarColor);
  447.     Screen.Bar(0, PxHeight - PxHeight * Temp, PxWidth, PxHeight);
  448.   end else begin
  449.     UV.U := UVMap^[Frame].U; UV.W := UVMap^[Frame].W * Temp;
  450.     UV.V := UVMap^[Frame].V; UV.H := UVMap^[Frame].H;
  451.     Screen.SetUV(UV);
  452.     Screen.SetColor(Color);
  453.     Screen.Bar(0, 0, PxWidth * Temp, PxHeight);
  454.     UV.U := UVMap^[BarFrame].U + UVMap^[BarFrame].W * Temp; UV.W := UVMap^[BarFrame].W * (1 - Temp);
  455.     UV.V := UVMap^[BarFrame].V; UV.H := UVMap^[BarFrame].H;
  456.     Screen.SetUV(UV);
  457.     Screen.SetColor(BarColor);
  458.     Screen.Bar(PxWidth * Temp, 0, PxWidth, PxHeight);
  459.   end;
  460.   Screen.SetUV(DefaultUV);
  461. end;
  462. { TSlider }
  463. function TSlider.GUIHandleMessage(const Msg: TMessage): Boolean;
  464. var MX, MY: Single;
  465. begin
  466.   if (Msg.ClassType = TMouseMoveMsg) then with TMouseMoveMsg(Msg) do begin
  467.     MX := X; MY := Y;
  468.   end;
  469.   Result := inherited GUIHandleMessage(Msg);
  470.   if not Result then Exit;
  471.   if (Msg.ClassType = TMouseMoveMsg) then with TMouseMoveMsg(Msg) do begin
  472.     if Pushed {and GetHover} then begin
  473.       ScreenToClient(MX, MY);
  474.       if Vertical then
  475.         Value := Trunc(0.5 + MY / PxHeight * MaxValue) else
  476.           Value := Trunc(0.5 + MX / PxWidth * MaxValue);
  477.       UpdateVisualParameters;
  478.     end;
  479.   end;
  480.   if Msg.ClassType = TMouseDownMsg then with TMouseDownMsg(Msg) do begin
  481.     if (Button = IK_MOUSELEFT) and Hover then begin
  482.       Pushed := True;
  483.       UpdateVisualParameters;
  484.     end;
  485.   end;
  486.   if Msg.ClassType = TMouseUpMsg then with TMouseDownMsg(Msg) do begin
  487.     if (Button = IK_MOUSELEFT) then begin
  488.       Pushed := False;
  489.       UpdateVisualParameters;
  490.     end;
  491.   end;
  492. end;
  493. procedure TSlider.AddProperties(const Result: Props.TProperties);
  494. begin
  495.   inherited;
  496.   if not Assigned(Result) then Exit;
  497.   Result.Add('Bar size',    vtSingle, [], FloatToStr(BarSize),    '');
  498.   Result.Add('Slider size', vtSingle, [], FloatToStr(SliderSize), '');
  499. end;
  500. procedure TSlider.SetProperties(Properties: Props.TProperties);
  501. begin
  502.   inherited;
  503.   if Properties.Valid('Bar size')    then BarSize    := StrToFloatDef(Properties['Bar size'],    0);
  504.   if Properties.Valid('Slider size') then SliderSize := StrToFloatDef(Properties['Slider size'], 0);
  505. end;
  506. procedure TSlider.Draw;
  507. var Temp: Single;
  508. begin
  509.   inherited;
  510.   if MaxValue = 0 then Temp := 0 else Temp := Value / MaxValue;
  511.   if Vertical then begin
  512.     Screen.SetUV(UVMap^[BarFrame]);
  513.     Screen.SetColor(BarColor);
  514.     Screen.Bar((PxWidth - BarSize) * 0.5, 0, (PxWidth + BarSize) * 0.5, PxHeight);
  515.     Screen.SetUV(UVMap^[Frame]);
  516.     Screen.SetColor(Color);
  517.     Screen.Bar((PxWidth - SliderSize)*0.5, PxHeight * Temp - SliderSize*0.5, (PxWidth + SliderSize)*0.5, PxHeight * Temp + SliderSize*0.5);
  518.   end else begin
  519.     Screen.SetUV(UVMap^[BarFrame]);
  520.     Screen.SetColor(BarColor);
  521.     Screen.Bar(0, (PxHeight - BarSize) * 0.5, PxWidth, (PxHeight + BarSize) * 0.5);
  522.     Screen.SetUV(UVMap^[Frame]);
  523.     Screen.SetColor(Color);
  524.     Screen.Bar(PxWidth * Temp - SliderSize*0.5, (PxHeight - SliderSize)*0.5, PxWidth * Temp + SliderSize*0.5, (PxHeight + SliderSize)*0.5);
  525.   end;
  526.   Screen.SetUV(DefaultUV);
  527. end;
  528.  { TEditor }
  529. function TEdit.GetTextItem: TTextGUIItem;
  530. var Item: TItem;
  531. begin
  532.   Item := GetChildByName('Text', False);
  533.   if not (Item is TTextGUIItem) then begin
  534.     {$IFDEF LOGGING} Log.Log(ClassName + '.GetTextItem: Can''t find a child item of class descendant from TTextGUIItem', lkError); {$ENDIF}
  535.     Result := nil;
  536.   end else Result := TTextGUIItem(Item);
  537. end;
  538. function TEdit.GetText: string;
  539. begin
  540.   if GetTextItem <> nil then Result := GetTextItem.Text else Result := '';
  541. end;
  542. procedure TEdit.SetText(const Value: string);
  543. begin
  544. //  Changed := Changed or (Value <> Text);
  545.   if GetTextItem <> nil then GetTextItem.Text := Value;
  546. end;
  547. constructor TEdit.Create(AManager: TItemsManager);
  548. begin
  549.   inherited;
  550.   CanFocus := True;
  551.   CursorHeight := 2;
  552.   MaxLength := 255;
  553. end;
  554. constructor TEdit.Construct(AManager: TItemsManager);
  555. begin
  556.   inherited;
  557.   AddChild(TLabel.Construct(AManager)).Name := 'Text';  
  558. end;
  559. function TEdit.GUIHandleMessage(const Msg: TMessage): Boolean;
  560. begin
  561.   Result := inherited GUIHandleMessage(Msg);
  562.   if not Result then Exit;
  563.   if Focused and (Msg.ClassType = TCharInputMsg) then with TCharInputMsg(Msg) do begin
  564.     if Character = #8 then begin
  565.       if (Length(Text) > 0) then begin
  566.         Text := Copy(Text, 0, Length(Text)-1);
  567.         Changed := True;
  568.       end;
  569.     end else if not (Character in [#9, #13, #27]) then Text := Text + Character;
  570.   end;
  571. end;
  572. procedure TEdit.AddProperties(const Result: Props.TProperties);
  573. begin
  574.   inherited;
  575.   if not Assigned(Result) then Exit;
  576.   Result.Add('Max length',          vtInt,   [], IntToStr(MaxLength), '');
  577.   AddColorProperty(Result, 'ColorFocused lines', FocusedLinesColor);
  578. end;
  579. procedure TEdit.SetProperties(Properties: Props.TProperties);
  580. begin
  581.   inherited;
  582.   if Properties.Valid('Max length')          then MaxLength         := StrToIntDef(Properties['Max length'], 0);
  583.   SetColorProperty(Properties, 'ColorFocused lines', FocusedLinesColor);
  584. end;
  585. procedure TEdit.Process(const DeltaT: Float);
  586. begin
  587.   inherited;
  588.   if Odd(Round(TimeProcessed*2)) then CursorColor.C := $FF000000 else CursorColor.C := $FFFFFFFF;
  589. end;
  590. procedure TEdit.Draw;
  591. var TextItem: TTextGUIItem; CursorX2, CursorW, TextWidth, TextHeight: Single;
  592. begin
  593.   inherited;
  594.   if Focused then begin
  595.     TextItem := GetTextItem;
  596.     if TextItem.Font = nil then Exit;
  597.     Screen.SetColor(CursorColor);
  598.     TextItem.Font.GetTextExtent(Text, TextWidth, TextHeight);
  599.     CursorW  := MaxS(1, MinS(PxWidth, PxHeight * 0.5));
  600.     if TextItem.X + TextWidth < 0 then begin
  601.       TextItem.X := Trunc(0.5 + MinS(0, TextItem.X - TextItem.X - TextWidth + PxWidth*0.5)) + Frac(TextItem.X);
  602.     end;
  603.     CursorX2 := TextItem.X + TextWidth + CursorW;
  604.     if CursorX2 > PxWidth then begin
  605.       TextItem.X := Trunc(0.5 + TextItem.X - (CursorX2 - PxWidth)) + Frac(TextItem.X);
  606.       CursorX2   := CursorX2   - (CursorX2 - PxWidth);
  607.     end;
  608. // Draw cursor
  609.     Screen.Bar(TextItem.X + TextWidth, TextItem.Y + PxHeight - 1 - CursorHeight,
  610.                CursorX2, TextItem.Y + PxHeight - 1);
  611.   end;
  612. end;
  613. begin
  614.   GlobalClassList.Add('ACS', GetUnitClassList);
  615. end.