src/findreplace.pas3.4 KB · ObjectPascal
Raw
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
unit findreplace;

{$mode ObjFPC}{$H+}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, Spin,
  ExtCtrls, hugedatatypes, math, constants;

type

  { TfrmFindReplace }

  TfrmFindReplace = class(TForm)
    Button1: TButton;
    Button2: TButton;
    FindNoteCheckbox: TCheckBox;
    FindInstrCheckbox: TCheckBox;
    FindFXCodeCheckbox: TCheckBox;
    FindFXParamCheckbox: TCheckBox;
    ReplaceNoteCheckbox: TCheckBox;
    ReplaceInstrCheckbox: TCheckBox;
    ReplaceFXCodeCheckbox: TCheckBox;
    ReplaceFXParamCheckbox: TCheckBox;
    FindNoteLow: TComboBox;
    InstrReplaceOp: TComboBox;
    FXParamReplaceValue: TComboBox;
    NoteReplaceValue: TComboBox;
    FXCodeReplaceOp: TComboBox;
    FXParamReplaceOp: TComboBox;
    FindFXCodeLow: TComboBox;
    FindFXCodeHigh: TComboBox;
    FindFXParamLow: TComboBox;
    FindFXParamHigh: TComboBox;
    FindNoteHigh: TComboBox;
    NoteReplaceOp: TComboBox;
    FXCodeReplaceValue: TComboBox;
    GroupBox1: TGroupBox;
    GroupBox2: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    FindInstrLow: TSpinEdit;
    FindInstrHigh: TSpinEdit;
    InstrReplaceValue: TSpinEdit;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private

  public
    Patterns: ^TPatternMap;
  end;

var
  frmFindReplace: TfrmFindReplace;

implementation

{$R *.lfm}

{ TfrmFindReplace }

procedure TfrmFindReplace.Button2Click(Sender: TObject);
begin
  Close;
end;

procedure TfrmFindReplace.FormCreate(Sender: TObject);
begin
  if not Assigned(Patterns) then Close;
end;

procedure TfrmFindReplace.Button1Click(Sender: TObject);
var
  I, J: Integer;
  PPat: PPattern;
  DoReplace: Boolean;

  procedure ReplaceOp(Op: Integer; var Data: Integer; Operand: Integer);
  begin
    case Op of
      0: begin
        Data := Operand;
      end;
      1: begin
        Inc(Data, Operand);
      end;
      2: begin
        Dec(Data, Operand);
      end;
    end;
  end;

  procedure ReplaceOp(Op: Integer; var Data: Byte; Operand: Integer);
  begin
    case Op of
      0: begin
        Data := Operand;
      end;
      1: begin
        Inc(Data, Operand);
      end;
      2: begin
        Dec(Data, Operand);
      end;
    end;
  end;

begin
  for I := 0 to Patterns^.Count do begin
    PPat := Patterns^.Data[I];

    for J := Low(TPattern) to High(TPattern) do begin
      DoReplace := True;

      if FindNoteCheckbox.Checked then
        DoReplace := DoReplace and InRange(PPat^[J].Note, 0, 0);

      if FindInstrCheckbox.Checked then
        DoReplace := DoReplace and InRange(PPat^[J].Instrument, 0, 0);

      if FindFXCodeCheckbox.Checked then
        DoReplace := DoReplace and InRange(PPat^[J].EffectCode, 0, 0);

      if FindFXParamCheckbox.Checked then
        DoReplace := DoReplace and InRange(PPat^[J].EffectParams.Value, 0, 0);

      if DoReplace then begin
        if ReplaceNoteCheckbox.Checked then
          ReplaceOp(NoteReplaceOp.ItemIndex, PPat^[J].Note, 0);

        if ReplaceInstrCheckbox.Checked then
          ReplaceOp(InstrReplaceOp.ItemIndex, PPat^[J].Instrument, 0);

        if ReplaceFXCodeCheckbox.Checked then
          ReplaceOp(FXCodeReplaceOp.ItemIndex, PPat^[J].EffectCode, 0);

        if ReplaceFXParamCheckbox.Checked then
          ReplaceOp(FXParamReplaceOp.ItemIndex, PPat^[J].EffectParams.Value, 0);
      end;
    end;
  end;
end;

end.