Переглянути джерело

Bug: fixed bugs in SendPASC wizard.

Ugochukwu Mmaduekwe 7 роки тому
батько
коміт
5d2abce840

+ 5 - 0
src/gui/wizards/UWIZModels.pas

@@ -49,6 +49,10 @@ type
 
     TChangeKeyMode = (akaTransferAccountOwnership, akaChangeAccountPrivateKey);
 
+     { TSendPASCMode }
+
+    TSendPASCMode = (akaAllBalance, akaSpecifiedAmount);
+
     { TAccountModel }
 
     TAccountModel = class(TComponent)
@@ -62,6 +66,7 @@ type
     public
       SingleAmountToSend: int64;
       DestinationAccount: TAccount;
+      SendPASCMode: TSendPASCMode;
     end;
 
     { TChangeKeyModel }

+ 40 - 34
src/gui/wizards/operations/UWIZSendPASC.pas

@@ -2,13 +2,14 @@ unit UWIZSendPASC;
 
 {$mode delphi}
 
-{ Copyright (c) 2018 by Ugochukwu Mmaduekwe
+{ Copyright (c) 2018 Sphere 10 Software (http://www.sphere10.com/)
 
   Distributed under the MIT software license, see the accompanying file LICENSE
   or visit http://www.opensource.org/licenses/mit-license.php.
 
   Acknowledgements:
-    Herman Schoenfeld <[email protected]>: added grid-based layout
+  Ugochukwu Mmaduekwe - main developer
+  Herman Schoenfeld - designer <[email protected]>: added grid-based layout
 }
 
 interface
@@ -22,11 +23,9 @@ type
 
   TWIZSendPASCWizard = class(TWizard<TWIZOperationsModel>)
   private
-    function UpdatePayload(const SenderAccount: TAccount;
-      var errors: string): boolean;
+    function UpdatePayload(const SenderAccount: TAccount; var errors: string): boolean;
     function UpdateOperationOptions(var errors: string): boolean;
-    function UpdateOpTransaction(const SenderAccount: TAccount;
-      var DestAccount: TAccount; var amount: int64; var errors: string): boolean;
+    function UpdateOpTransaction(const SenderAccount: TAccount; var DestAccount: TAccount; var amount: int64; var errors: string): boolean;
     procedure SendPASC();
   public
     constructor Create(AOwner: TComponent); override;
@@ -109,8 +108,7 @@ begin
   UpdatePayload(sender_account, e);
 end;
 
-function TWIZSendPASCWizard.UpdateOpTransaction(const SenderAccount: TAccount;
-  var DestAccount: TAccount; var amount: int64; var errors: string): boolean;
+function TWIZSendPASCWizard.UpdateOpTransaction(const SenderAccount: TAccount; var DestAccount: TAccount; var amount: int64; var errors: string): boolean;
 var
   c: cardinal;
 begin
@@ -119,13 +117,16 @@ begin
 
   DestAccount := Model.SendPASC.DestinationAccount;
 
-  if Length(Model.Account.SelectedAccounts) = 1 then
-  begin
-    amount := Model.SendPASC.SingleAmountToSend;
-  end
-  else
-  begin
-    amount := 0; // ALL BALANCE
+  case Model.SendPASC.SendPASCMode of
+    akaAllBalance:
+    begin
+      amount := 0; // ALL BALANCE
+    end;
+
+    akaSpecifiedAmount:
+    begin
+      amount := Model.SendPASC.SingleAmountToSend;
+    end;
   end;
 
   if DestAccount.account = SenderAccount.account then
@@ -134,14 +135,17 @@ begin
     Exit;
   end;
 
-  if (Length(Model.Account.SelectedAccounts) = 1) then
-  begin
-    if (SenderAccount.balance < (amount + Model.Fee.SingleOperationFee)) then
+  case Model.SendPASC.SendPASCMode of
+    akaSpecifiedAmount:
     begin
-      errors := 'Insufficient funds';
-      Exit;
+      if (SenderAccount.balance < (amount + Model.Fee.SingleOperationFee)) then
+      begin
+        errors := 'Insufficient funds';
+        Exit;
+      end;
     end;
   end;
+
   Result := True;
 end;
 
@@ -195,27 +199,30 @@ begin
 
       if not UpdateOpTransaction(account, destAccount, _amount, errors) then
         raise Exception.Create(errors);
-      if Length(Model.Account.SelectedAccounts) > 1 then
+
+      if account.balance > 0 then
       begin
-        if account.balance > 0 then
+        if account.balance > Model.Fee.SingleOperationFee then
         begin
-          if account.balance > Model.Fee.SingleOperationFee then
-          begin
-            _amount := account.balance - Model.Fee.SingleOperationFee;
-            _fee := Model.Fee.SingleOperationFee;
-          end
-          else
-          begin
-            _amount := account.balance;
-            _fee := 0;
+          case Model.SendPASC.SendPASCMode of
+            akaAllBalance:
+            begin
+              _amount := account.balance - Model.Fee.SingleOperationFee;
+              _fee := Model.Fee.SingleOperationFee;
+            end;
           end;
         end
         else
-          dooperation := False;
+        begin
+          _amount := account.balance;
+          _fee := 0;
+        end;
       end
       else
       begin
+        dooperation := False;
       end;
+
       if dooperation then
       begin
         op := TOpTransaction.CreateTransaction(
@@ -316,8 +323,7 @@ begin
   end;
 end;
 
-function TWIZSendPASCWizard.UpdatePayload(const SenderAccount: TAccount;
-  var errors: string): boolean;
+function TWIZSendPASCWizard.UpdatePayload(const SenderAccount: TAccount; var errors: string): boolean;
 var
   valid: boolean;
   payload_encrypted, payload_u: string;

+ 42 - 38
src/gui/wizards/operations/UWIZSendPASC_Confirmation.pas

@@ -31,7 +31,7 @@ type
     lblSgnAcc: TLabel;
     paGrid: TPanel;
   private
-    FSendersGrid : TVisualGrid;
+    FSendersGrid: TVisualGrid;
   public
     procedure OnPresent; override;
   end;
@@ -48,97 +48,101 @@ type
   { TAccountSenderDataSource }
 
   TAccountSenderDataSource = class(TAccountsDataSourceBase)
-    private
-      FModel : TWIZOperationsModel;
-    protected
-      function GetColumns : TDataColumns; override;
-    public
-      property Model : TWIZOperationsModel read FModel write FModel;
-      procedure FetchAll(const AContainer : TList<TAccount>); override;
-      function GetItemField(constref AItem: TAccount; const ABindingName : AnsiString) : Variant; override;
+  private
+    FModel: TWIZOperationsModel;
+  protected
+    function GetColumns: TDataColumns; override;
+  public
+    property Model: TWIZOperationsModel read FModel write FModel;
+    procedure FetchAll(const AContainer: TList<TAccount>); override;
+    function GetItemField(constref AItem: TAccount; const ABindingName: ansistring): variant; override;
   end;
 
 { TWIZSendPASC_Confirmation }
 
 procedure TWIZSendPASC_Confirmation.OnPresent;
 var
-  data : TAccountSenderDataSource;
+  Data: TAccountSenderDataSource;
 begin
   FSendersGrid := TVisualGrid.Create(Self);
-  FSendersGrid.CanSearch:= False;
+  FSendersGrid.CanSearch := False;
   FSendersGrid.SortMode := smMultiColumn;
   FSendersGrid.FetchDataInThread := False;
   FSendersGrid.AutoPageSize := True;
   FSendersGrid.SelectionType := stNone;
   FSendersGrid.Options := [vgoColAutoFill, vgoColSizing, vgoSortDirectionAllowNone, vgoAutoHidePaging];
-  with FSendersGrid.AddColumn('Sender') do begin
+  with FSendersGrid.AddColumn('Sender') do
+  begin
     Binding := 'SenderAccount';
     Filters := SORTABLE_NUMERIC_FILTER;
     Width := 100;
     HeaderFontStyles := [fsBold];
     DataFontStyles := [fsBold];
   end;
-  with FSendersGrid.AddColumn('Balance') do begin
+  with FSendersGrid.AddColumn('Balance') do
+  begin
     Filters := SORTABLE_NUMERIC_FILTER;
     Width := 100;
     Renderer := TCellRenderers.PASC;
   end;
-  with FSendersGrid.AddColumn('Amount To Send') do begin
+  with FSendersGrid.AddColumn('Amount To Send') do
+  begin
     Binding := 'AmountToSend';
     Filters := SORTABLE_TEXT_FILTER;
     Width := 100;
   end;
-  with FSendersGrid.AddColumn('Fee') do begin
+  with FSendersGrid.AddColumn('Fee') do
+  begin
     Filters := SORTABLE_TEXT_FILTER;
     Width := 100;
   end;
 
-   data := TAccountSenderDataSource.Create(FSendersGrid);
-   data.Model := Model;
-   FSendersGrid.DataSource := data;
-   paGrid.AddControlDockCenter(FSendersGrid);
-   lblSgnAcc.Caption := TAccountComp.AccountNumberToAccountTxtNumber(Model.Signer.SignerAccount.account);
-   lblDestAcc.Caption := TAccountComp.AccountNumberToAccountTxtNumber(Model.SendPASC.DestinationAccount.account);
+  Data := TAccountSenderDataSource.Create(FSendersGrid);
+  Data.Model := Model;
+  FSendersGrid.DataSource := Data;
+  paGrid.AddControlDockCenter(FSendersGrid);
+  lblSgnAcc.Caption := TAccountComp.AccountNumberToAccountTxtNumber(Model.Signer.SignerAccount.account);
+  lblDestAcc.Caption := TAccountComp.AccountNumberToAccountTxtNumber(Model.SendPASC.DestinationAccount.account);
 end;
 
 { TAccountSenderDataSource }
 
-function TAccountSenderDataSource.GetColumns : TDataColumns;
+function TAccountSenderDataSource.GetColumns: TDataColumns;
 begin
   Result := TDataColumns.Create(
     TDataColumn.From('SenderAccount'),
     TDataColumn.From('Balance'),
     TDataColumn.From('AmountToSend'),
     TDataColumn.From('Fee')
-  );
+    );
 end;
 
-function TAccountSenderDataSource.GetItemField(constref AItem: TAccount; const ABindingName : AnsiString) : Variant;
+function TAccountSenderDataSource.GetItemField(constref AItem: TAccount; const ABindingName: ansistring): variant;
 var
-  index : Integer;
+  index: integer;
 begin
-   if ABindingName = 'SenderAccount' then
-     Result := TAccountComp.AccountNumberToAccountTxtNumber(AItem.account)
-   else if ABindingName = 'Balance' then
-     Result := TAccountComp.FormatMoney(AItem.Balance)
-   else if ABindingName = 'AmountToSend' then
-     Result := TAccountComp.FormatMoney(Model.SendPASC.SingleAmountToSend)
-     else if ABindingName = 'Fee' then
-     Result := TAccountComp.FormatMoney(Model.Fee.SingleOperationFee)
-   else raise Exception.Create(Format('Field not found [%s]', [ABindingName]));
+  if ABindingName = 'SenderAccount' then
+    Result := TAccountComp.AccountNumberToAccountTxtNumber(AItem.account)
+  else if ABindingName = 'Balance' then
+    Result := TAccountComp.FormatMoney(AItem.Balance)
+  else if ABindingName = 'AmountToSend' then
+    Result := IIF(Model.SendPASC.SendPASCMode = akaAllBalance, 'ALL BALANCE', TAccountComp.FormatMoney(Model.SendPASC.SingleAmountToSend))
+  else if ABindingName = 'Fee' then
+    Result := TAccountComp.FormatMoney(Model.Fee.SingleOperationFee)
+  else
+    raise Exception.Create(Format('Field not found [%s]', [ABindingName]));
 end;
 
 
-procedure TAccountSenderDataSource.FetchAll(const AContainer : TList<TAccount>);
+procedure TAccountSenderDataSource.FetchAll(const AContainer: TList<TAccount>);
 var
-  i: Integer;
+  i: integer;
 begin
   for i := Low(Model.Account.SelectedAccounts) to High(Model.Account.SelectedAccounts) do
   begin
-    AContainer.Add( Model.Account.SelectedAccounts[i] );
+    AContainer.Add(Model.Account.SelectedAccounts[i]);
   end;
 end;
 
 
 end.
-

+ 2 - 0
src/gui/wizards/operations/UWIZSendPASC_EnterQuantity.pas

@@ -59,11 +59,13 @@ begin
   begin
     edtAmt.Text := 'ALL BALANCE';
     edtAmt.Enabled := False;
+    Model.SendPASC.SendPASCMode := akaAllBalance;
   end
   else
   begin
     edtAmt.Text := TAccountComp.FormatMoney(0);
     edtAmt.Enabled := True;
+    Model.SendPASC.SendPASCMode := akaSpecifiedAmount;
   end;
 
   Model.Payload.HasPayload := IIF(chkAttachPayload.Checked, True, False);