UCellRenderers.pas 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. unit UCellRenderers;
  2. { Copyright (c) 2018 by Herman Schoenfeld
  3. Distributed under the MIT software license, see the accompanying file LICENSE
  4. or visit http://www.opensource.org/licenses/mit-license.php.
  5. This unit is a part of the PascalCoin Project, an infinitely scalable
  6. cryptocurrency. Find us here:
  7. Web: https://www.pascalcoin.org
  8. Source: https://github.com/PascalCoin/PascalCoin
  9. THIS LICENSE HEADER MUST NOT BE REMOVED.
  10. }
  11. {$mode delphi}
  12. interface
  13. uses
  14. Classes, Forms, Controls, Graphics, Dialogs, ExtCtrls, Grids,
  15. UVisualGrid, variants;
  16. type
  17. { TCellRenderers }
  18. TCellRenderers = class
  19. // Data Sanitizers
  20. class function UnixTimeSanitizer(const CellData, RowData: Variant) : Variant;
  21. class function OperationTypeSanitizer(const CellData, RowData: Variant) : Variant;
  22. // Cell Renderers
  23. class procedure OperationTime(Sender: TObject; ACol, ARow: Longint; Canvas: TCanvas; Rect: TRect; State: TGridDrawState; const CellData, RowData: Variant; var Handled: boolean);
  24. class procedure PASC_CheckAllBalance(Sender: TObject; ACol, ARow: Longint; Canvas: TCanvas; Rect: TRect; State: TGridDrawState; const CellData, RowData: Variant; var Handled: boolean);
  25. class procedure PASC_CheckPendingBalance (Sender: TObject; ACol, ARow: Longint; Canvas: TCanvas; Rect: TRect; State: TGridDrawState; const CellData, RowData: Variant; var Handled: boolean);
  26. class procedure PASC(Sender: TObject; ACol, ARow: Longint; Canvas: TCanvas; Rect: TRect; State: TGridDrawState; const CellData, RowData: Variant; var Handled: boolean);
  27. class procedure Payload(Sender: TObject; ACol, ARow: Longint; Canvas: TCanvas; Rect: TRect; State: TGridDrawState; const CellData, RowData: Variant; var Handled: boolean);
  28. class procedure OPHASH(Sender: TObject; ACol, ARow: Longint; Canvas: TCanvas; Rect: TRect; State: TGridDrawState; const CellData, RowData: Variant; var Handled: boolean);
  29. // General purpose
  30. class function OperationShortHash(const AOpHash : AnsiString) : AnsiString;
  31. class function OperationShortText(const OpType, OpSubType : DWord) : AnsiString;
  32. class function AccountKeyShortText(const AText : AnsiString) : AnsiString;
  33. end;
  34. implementation
  35. uses
  36. SysUtils, DateUtils, UCommon, UCommon.Data, UAccounts, UNode, UConst, UCoreUtils;
  37. const
  38. CT_PASCBALANCE_POS_COL = clGreen;
  39. CT_PASCBALANCE_NEU_COL = clDefault;
  40. CT_PASCBALANCE_NEG_COL = clRed;
  41. CT_PASCBALANCE_0CONF_COL = clBlue;
  42. { TCellRenderers }
  43. class function TCellRenderers.UnixTimeSanitizer(const CellData, RowData: Variant) : Variant;
  44. var uxTime : UInt64;
  45. begin
  46. if NOT VarIsNumeric(CellData) then exit;
  47. uxTime := CellData;
  48. Result := FormatDateTime('yyy-mm-dd hh:nn:ss', UnixToDateTime(uxtime));
  49. end;
  50. class function TCellRenderers.OperationTypeSanitizer(const CellData, RowData: Variant) : Variant;
  51. var LData : TDataRowData absolute RowData;
  52. LType, LSubType : DWord;
  53. begin
  54. LType := LData.Data['Type'];
  55. LSubType := LData.Data['SubType'];
  56. Result := OperationShortText(LType, LSubType);
  57. end;
  58. class procedure TCellRenderers.OperationTime (Sender: TObject; ACol, ARow: Longint; Canvas: TCanvas; Rect: TRect; State: TGridDrawState; const CellData, RowData: Variant; var Handled: boolean);
  59. var
  60. LValue : UInt64;
  61. LTextStyle: TTextStyle;
  62. LRowData : TDataRowData;
  63. LStr : AnsiString;
  64. begin
  65. if NOT VarIsNumeric(CellData) then exit;
  66. LValue := CellData;
  67. if LValue > 0 then
  68. LStr := FormatDateTime('yyy-mm-dd hh:nn:ss', UnixToDateTime(LValue))
  69. else begin
  70. LStr := 'PENDING';
  71. Canvas.Font.Color := CT_PASCBALANCE_0CONF_COL;
  72. end;
  73. Canvas.TextRect(Rect, Rect.Left, Rect.Top, LStr, Canvas.TextStyle);
  74. Handled := true;
  75. end;
  76. class procedure TCellRenderers.PASC_CheckAllBalance (Sender: TObject; ACol, ARow: Longint; Canvas: TCanvas; Rect: TRect; State: TGridDrawState; const CellData, RowData: Variant; var Handled: boolean);
  77. var
  78. LValue : Int64;
  79. LTextStyle: TTextStyle;
  80. LRowData : TDataRowData;
  81. LStr : AnsiString;
  82. LAllBalance : boolean;
  83. begin
  84. LRowData := TDataRowData(RowData);
  85. if LRowData.HasData('AllBalance') AND TVariantTool.TryParseBool(LRowData['AllBalance'], LAllBalance) AND LAllBalance then begin
  86. Canvas.Font.Style := [fsBold];
  87. Canvas.TextRect(Rect, Rect.Left, Rect.Top, 'ALL BALANCE', Canvas.TextStyle);
  88. Handled := true;
  89. exit;
  90. end;
  91. PASC(Sender, ACol, ARow, Canvas, Rect, State, CellData, RowData, Handled);
  92. end;
  93. class procedure TCellRenderers.PASC_CheckPendingBalance (Sender: TObject; ACol, ARow: Longint; Canvas: TCanvas; Rect: TRect; State: TGridDrawState; const CellData, RowData: Variant; var Handled: boolean);
  94. var
  95. LValue : Int64;
  96. LTextStyle: TTextStyle;
  97. LRowData : TDataRowData;
  98. LStr : AnsiString;
  99. LAllBalance, LPending : boolean;
  100. begin
  101. if NOT TVariantTool.IsNumeric(CellData) then
  102. exit;
  103. LValue := CellData;
  104. LRowData := TDataRowData(RowData);
  105. if LRowData.HasData('UnixTime') AND (LRowData['UnixTime'] = 0) then
  106. LPending := true
  107. else if LRowData.HasData('LastUpdatedBlock') AND (LRowData['LastUpdatedBlock'] > TNode.Node.BlockTip) then
  108. LPending := true
  109. else
  110. LPending := false;
  111. if LPending then begin
  112. Canvas.Font.Color := CT_PASCBALANCE_0CONF_COL;
  113. LStr := '(' + TAccountComp.FormatMoney(LValue) + ')';
  114. Canvas.TextRect(Rect, Rect.Left, Rect.Top, LStr, Canvas.TextStyle);
  115. Handled := true;
  116. end else PASC(Sender, ACol, ARow, Canvas, Rect, State, CellData, RowData, Handled);
  117. end;
  118. class procedure TCellRenderers.PASC (Sender: TObject; ACol, ARow: Longint; Canvas: TCanvas; Rect: TRect; State: TGridDrawState; const CellData, RowData: Variant; var Handled: boolean);
  119. var
  120. LValue : Int64;
  121. LTextStyle: TTextStyle;
  122. LRowData : TDataRowData;
  123. LStr : AnsiString;
  124. begin
  125. if NOT TVariantTool.IsNumeric(CellData) then
  126. exit;
  127. LValue := CellData;
  128. LRowData := TDataRowData(RowData);
  129. Canvas.Font.Color := IIF (LValue < 0, CT_PASCBALANCE_NEG_COL, IIF(LValue > 0, CT_PASCBALANCE_POS_COL, CT_PASCBALANCE_NEU_COL));
  130. LStr := TAccountComp.FormatMoney(LValue);
  131. Canvas.TextRect(Rect, Rect.Left, Rect.Top, LStr, Canvas.TextStyle);
  132. Handled := true;
  133. end;
  134. class procedure TCellRenderers.Payload (Sender: TObject; ACol, ARow: Longint; Canvas: TCanvas; Rect: TRect; State: TGridDrawState; const CellData, RowData: Variant; var Handled: boolean);
  135. begin
  136. { s := opr.PrintablePayload;
  137. Canvas_TextRect(DrawGrid.Canvas,Rect,s,State,[tfLeft,tfVerticalCenter,tfSingleLine]); }
  138. Handled := False;
  139. end;
  140. class procedure TCellRenderers.OPHASH (Sender: TObject; ACol, ARow: Longint; Canvas: TCanvas; Rect: TRect; State: TGridDrawState; const CellData, RowData: Variant; var Handled: boolean);
  141. var
  142. LRowData : TDataRowData;
  143. LStr : AnsiString;
  144. begin
  145. if NOT VarIsStr(CellData) then
  146. exit;
  147. LStr := CellData;
  148. LRowData := TDataRowData(RowData);
  149. // Canvas.Font.Size := Canvas.Font.Size - 1;
  150. Canvas.Font.Color := clGrayText;
  151. Canvas.Font.Bold := true;
  152. LStr := OperationShortHash(LStr);
  153. Canvas.TextRect(Rect, Rect.Left, Rect.Top, LStr, Canvas.TextStyle);
  154. Handled := true;
  155. end;
  156. { KEY }
  157. { else if ABindingName = 'Key' then begin
  158. index := TWallet.Keys.AccountsKeyList.IndexOfAccountKey(AItem.accountInfo.accountKey);
  159. if index>=0 then
  160. Result := TWallet.Keys[index].Name
  161. else
  162. Result := TAccountComp.AccountPublicKeyExport(AItem.accountInfo.accountKey); }
  163. class function TCellRenderers.OperationShortHash(const AOpHash : AnsiString) : AnsiString;
  164. var
  165. len : SizeInt;
  166. begin
  167. len := Length(AOpHash);
  168. if len > 8 then
  169. result := AOpHash.Substring(0, 4) + '...' + AOpHash.Substring(len - 4 - 1, 4)
  170. else
  171. result := AOpHash;
  172. end;
  173. class function TCellRenderers.OperationShortText(const OpType, OpSubType : DWord) : AnsiString;
  174. begin
  175. Result := TCoreTool.GetOperationShortText(OpType, OpSubType);
  176. end;
  177. class function TCellRenderers.AccountKeyShortText(const AText : AnsiString) : AnsiString;
  178. begin
  179. If Length(AText) > 20 then
  180. Result := AText.SubString(0, 17) + '...'
  181. else
  182. Result := AText;
  183. end;
  184. end.