123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219 |
- unit UCellRenderers;
- { Copyright (c) 2018 by Herman Schoenfeld
- Distributed under the MIT software license, see the accompanying file LICENSE
- or visit http://www.opensource.org/licenses/mit-license.php.
- This unit is a part of the PascalCoin Project, an infinitely scalable
- cryptocurrency. Find us here:
- Web: https://www.pascalcoin.org
- Source: https://github.com/PascalCoin/PascalCoin
- THIS LICENSE HEADER MUST NOT BE REMOVED.
- }
- {$mode delphi}
- interface
- uses
- Classes, Forms, Controls, Graphics, Dialogs, ExtCtrls, Grids,
- UVisualGrid, variants;
- type
- { TCellRenderers }
- TCellRenderers = class
- // Data Sanitizers
- class function UnixTimeSanitizer(const CellData, RowData: Variant) : Variant;
- class function OperationTypeSanitizer(const CellData, RowData: Variant) : Variant;
- // Cell Renderers
- class procedure OperationTime(Sender: TObject; ACol, ARow: Longint; Canvas: TCanvas; Rect: TRect; State: TGridDrawState; const CellData, RowData: Variant; var Handled: boolean);
- class procedure PASC_CheckAllBalance(Sender: TObject; ACol, ARow: Longint; Canvas: TCanvas; Rect: TRect; State: TGridDrawState; const CellData, RowData: Variant; var Handled: boolean);
- class procedure PASC_CheckPendingBalance (Sender: TObject; ACol, ARow: Longint; Canvas: TCanvas; Rect: TRect; State: TGridDrawState; const CellData, RowData: Variant; var Handled: boolean);
- class procedure PASC(Sender: TObject; ACol, ARow: Longint; Canvas: TCanvas; Rect: TRect; State: TGridDrawState; const CellData, RowData: Variant; var Handled: boolean);
- class procedure Payload(Sender: TObject; ACol, ARow: Longint; Canvas: TCanvas; Rect: TRect; State: TGridDrawState; const CellData, RowData: Variant; var Handled: boolean);
- class procedure OPHASH(Sender: TObject; ACol, ARow: Longint; Canvas: TCanvas; Rect: TRect; State: TGridDrawState; const CellData, RowData: Variant; var Handled: boolean);
- // General purpose
- class function OperationShortHash(const AOpHash : AnsiString) : AnsiString;
- class function OperationShortText(const OpType, OpSubType : DWord) : AnsiString;
- class function AccountKeyShortText(const AText : AnsiString) : AnsiString;
- end;
- implementation
- uses
- SysUtils, DateUtils, UCommon, UCommon.Data, UAccounts, UNode, UConst, UCoreUtils;
- const
- CT_PASCBALANCE_POS_COL = clGreen;
- CT_PASCBALANCE_NEU_COL = clDefault;
- CT_PASCBALANCE_NEG_COL = clRed;
- CT_PASCBALANCE_0CONF_COL = clBlue;
- { TCellRenderers }
- class function TCellRenderers.UnixTimeSanitizer(const CellData, RowData: Variant) : Variant;
- var uxTime : UInt64;
- begin
- if NOT VarIsNumeric(CellData) then exit;
- uxTime := CellData;
- Result := FormatDateTime('yyy-mm-dd hh:nn:ss', UnixToDateTime(uxtime));
- end;
- class function TCellRenderers.OperationTypeSanitizer(const CellData, RowData: Variant) : Variant;
- var LData : TDataRowData absolute RowData;
- LType, LSubType : DWord;
- begin
- LType := LData.Data['Type'];
- LSubType := LData.Data['SubType'];
- Result := OperationShortText(LType, LSubType);
- end;
- class procedure TCellRenderers.OperationTime (Sender: TObject; ACol, ARow: Longint; Canvas: TCanvas; Rect: TRect; State: TGridDrawState; const CellData, RowData: Variant; var Handled: boolean);
- var
- LValue : UInt64;
- LTextStyle: TTextStyle;
- LRowData : TDataRowData;
- LStr : AnsiString;
- begin
- if NOT VarIsNumeric(CellData) then exit;
- LValue := CellData;
- if LValue > 0 then
- LStr := FormatDateTime('yyy-mm-dd hh:nn:ss', UnixToDateTime(LValue))
- else begin
- LStr := 'PENDING';
- Canvas.Font.Color := CT_PASCBALANCE_0CONF_COL;
- end;
- Canvas.TextRect(Rect, Rect.Left, Rect.Top, LStr, Canvas.TextStyle);
- Handled := true;
- end;
- class procedure TCellRenderers.PASC_CheckAllBalance (Sender: TObject; ACol, ARow: Longint; Canvas: TCanvas; Rect: TRect; State: TGridDrawState; const CellData, RowData: Variant; var Handled: boolean);
- var
- LValue : Int64;
- LTextStyle: TTextStyle;
- LRowData : TDataRowData;
- LStr : AnsiString;
- LAllBalance : boolean;
- begin
- LRowData := TDataRowData(RowData);
- if LRowData.HasData('AllBalance') AND TVariantTool.TryParseBool(LRowData['AllBalance'], LAllBalance) AND LAllBalance then begin
- Canvas.Font.Style := [fsBold];
- Canvas.TextRect(Rect, Rect.Left, Rect.Top, 'ALL BALANCE', Canvas.TextStyle);
- Handled := true;
- exit;
- end;
- PASC(Sender, ACol, ARow, Canvas, Rect, State, CellData, RowData, Handled);
- end;
- class procedure TCellRenderers.PASC_CheckPendingBalance (Sender: TObject; ACol, ARow: Longint; Canvas: TCanvas; Rect: TRect; State: TGridDrawState; const CellData, RowData: Variant; var Handled: boolean);
- var
- LValue : Int64;
- LTextStyle: TTextStyle;
- LRowData : TDataRowData;
- LStr : AnsiString;
- LAllBalance, LPending : boolean;
- begin
- if NOT TVariantTool.IsNumeric(CellData) then
- exit;
- LValue := CellData;
- LRowData := TDataRowData(RowData);
- if LRowData.HasData('UnixTime') AND (LRowData['UnixTime'] = 0) then
- LPending := true
- else if LRowData.HasData('LastUpdatedBlock') AND (LRowData['LastUpdatedBlock'] > TNode.Node.BlockTip) then
- LPending := true
- else
- LPending := false;
- if LPending then begin
- Canvas.Font.Color := CT_PASCBALANCE_0CONF_COL;
- LStr := '(' + TAccountComp.FormatMoney(LValue) + ')';
- Canvas.TextRect(Rect, Rect.Left, Rect.Top, LStr, Canvas.TextStyle);
- Handled := true;
- end else PASC(Sender, ACol, ARow, Canvas, Rect, State, CellData, RowData, Handled);
- end;
- class procedure TCellRenderers.PASC (Sender: TObject; ACol, ARow: Longint; Canvas: TCanvas; Rect: TRect; State: TGridDrawState; const CellData, RowData: Variant; var Handled: boolean);
- var
- LValue : Int64;
- LTextStyle: TTextStyle;
- LRowData : TDataRowData;
- LStr : AnsiString;
- begin
- if NOT TVariantTool.IsNumeric(CellData) then
- exit;
- LValue := CellData;
- LRowData := TDataRowData(RowData);
- Canvas.Font.Color := IIF (LValue < 0, CT_PASCBALANCE_NEG_COL, IIF(LValue > 0, CT_PASCBALANCE_POS_COL, CT_PASCBALANCE_NEU_COL));
- LStr := TAccountComp.FormatMoney(LValue);
- Canvas.TextRect(Rect, Rect.Left, Rect.Top, LStr, Canvas.TextStyle);
- Handled := true;
- end;
- class procedure TCellRenderers.Payload (Sender: TObject; ACol, ARow: Longint; Canvas: TCanvas; Rect: TRect; State: TGridDrawState; const CellData, RowData: Variant; var Handled: boolean);
- begin
- { s := opr.PrintablePayload;
- Canvas_TextRect(DrawGrid.Canvas,Rect,s,State,[tfLeft,tfVerticalCenter,tfSingleLine]); }
- Handled := False;
- end;
- class procedure TCellRenderers.OPHASH (Sender: TObject; ACol, ARow: Longint; Canvas: TCanvas; Rect: TRect; State: TGridDrawState; const CellData, RowData: Variant; var Handled: boolean);
- var
- LRowData : TDataRowData;
- LStr : AnsiString;
- begin
- if NOT VarIsStr(CellData) then
- exit;
- LStr := CellData;
- LRowData := TDataRowData(RowData);
- // Canvas.Font.Size := Canvas.Font.Size - 1;
- Canvas.Font.Color := clGrayText;
- Canvas.Font.Bold := true;
- LStr := OperationShortHash(LStr);
- Canvas.TextRect(Rect, Rect.Left, Rect.Top, LStr, Canvas.TextStyle);
- Handled := true;
- end;
- { KEY }
- { else if ABindingName = 'Key' then begin
- index := TWallet.Keys.AccountsKeyList.IndexOfAccountKey(AItem.accountInfo.accountKey);
- if index>=0 then
- Result := TWallet.Keys[index].Name
- else
- Result := TAccountComp.AccountPublicKeyExport(AItem.accountInfo.accountKey); }
- class function TCellRenderers.OperationShortHash(const AOpHash : AnsiString) : AnsiString;
- var
- len : SizeInt;
- begin
- len := Length(AOpHash);
- if len > 8 then
- result := AOpHash.Substring(0, 4) + '...' + AOpHash.Substring(len - 4 - 1, 4)
- else
- result := AOpHash;
- end;
- class function TCellRenderers.OperationShortText(const OpType, OpSubType : DWord) : AnsiString;
- begin
- Result := TCoreTool.GetOperationShortText(OpType, OpSubType);
- end;
- class function TCellRenderers.AccountKeyShortText(const AText : AnsiString) : AnsiString;
- begin
- If Length(AText) > 20 then
- Result := AText.SubString(0, 17) + '...'
- else
- Result := AText;
- end;
- end.
|