340 lines
9.0 KiB
ObjectPascal
340 lines
9.0 KiB
ObjectPascal
{ Apophysis AV "Phoenix Edition" Copyright (C) 2021-2022 Alice V. Koryagina }
|
|
|
|
unit VarOrderForm;
|
|
|
|
interface
|
|
|
|
uses
|
|
Winapi.Windows, Winapi.Messages, System.SysUtils, StrUtils, System.Variants,
|
|
System.Classes, Vcl.Graphics, Vcl.Forms, Vcl.Dialogs, Vcl.Buttons,
|
|
Vcl.Controls, Vcl.StdCtrls,Vcl.ComCtrls, Vcl.ExtCtrls, Editor;
|
|
|
|
type
|
|
TVarOrder = class(TForm)
|
|
pnlVarList: TPanel;
|
|
VarListView: TListView;
|
|
btnOK: TButton;
|
|
btnCancel: TButton;
|
|
btnTop: TSpeedButton;
|
|
btnMoveUp: TSpeedButton;
|
|
btnMoveDown: TSpeedButton;
|
|
btnBottom: TSpeedButton;
|
|
btnSort: TSpeedButton;
|
|
btnDefOrder: TSpeedButton;
|
|
procedure FormCreate(Sender: TObject);
|
|
procedure FormShow(Sender: TObject);
|
|
procedure btnMoveUpClick(Sender: TObject);
|
|
procedure VarListViewChange(Sender: TObject; Item: TListItem;
|
|
Change: TItemChange);
|
|
procedure btnMoveDownClick(Sender: TObject);
|
|
procedure btnTopClick(Sender: TObject);
|
|
procedure btnBottomClick(Sender: TObject);
|
|
procedure btnSortClick(Sender: TObject);
|
|
procedure btnDefOrderClick(Sender: TObject);
|
|
procedure VarListViewDragDrop(Sender, Source: TObject; X, Y: Integer);
|
|
procedure VarListViewDragOver(Sender, Source: TObject; X, Y: Integer;
|
|
State: TDragState; var Accept: Boolean);
|
|
procedure VarListViewCustomDrawItem(Sender: TCustomListView;
|
|
Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
|
|
procedure FormDestroy(Sender: TObject);
|
|
private
|
|
{ Private declarations }
|
|
totVars: integer;
|
|
usedVars: TStringList;
|
|
procedure ExchangeVars(const i, j: integer);
|
|
procedure SetVarIcon(const s: string; ListItem: TListItem);
|
|
procedure ShowSelected(const i: integer);
|
|
public
|
|
{ Public declarations }
|
|
Changed: boolean;
|
|
end;
|
|
|
|
var
|
|
VarOrder: TVarOrder;
|
|
|
|
implementation
|
|
|
|
uses
|
|
XFormMan, Global, Translation; // to get default variation order
|
|
|
|
{$R *.dfm}
|
|
|
|
procedure TVarOrder.btnBottomClick(Sender: TObject);
|
|
var i: integer;
|
|
begin
|
|
if not assigned(VarListView.Selected) then
|
|
begin
|
|
Application.MessageBox(PChar(TextByKey('varorder-noselected')),
|
|
'Apophysis AV', MB_ICONWARNING);
|
|
exit;
|
|
end;
|
|
|
|
i := VarListView.Selected.Index;
|
|
ExchangeVars(i, totVars);
|
|
ShowSelected(totVars);
|
|
end;
|
|
|
|
procedure TVarOrder.btnDefOrderClick(Sender: TObject);
|
|
var
|
|
i, j: integer;
|
|
s, cap: string;
|
|
begin
|
|
VarListView.Items.BeginUpdate;
|
|
|
|
if assigned(VarListView.Selected) then
|
|
cap := VarListView.Selected.Caption
|
|
else
|
|
cap := 'linear';
|
|
j := 0;
|
|
|
|
for i := 0 to totVars do
|
|
begin
|
|
s := Varnames(i);
|
|
VarListView.Items[i].Caption := s;
|
|
SetVarIcon(s, VarListView.Items[i]);
|
|
if s = cap then j := i;
|
|
end;
|
|
VarListView.Selected := VarListView.Items[j];
|
|
ShowSelected(j);
|
|
|
|
VarListView.Items.EndUpdate;
|
|
Changed := True;
|
|
end;
|
|
|
|
procedure TVarOrder.btnMoveDownClick(Sender: TObject);
|
|
var i: integer;
|
|
begin
|
|
if not assigned(VarListView.Selected) then
|
|
begin
|
|
Application.MessageBox(PChar(TextByKey('varorder-noselected')),
|
|
'Apophysis AV', MB_ICONWARNING);
|
|
exit;
|
|
end;
|
|
|
|
i := VarListView.Selected.Index;
|
|
ExchangeVars(i, i + 1);
|
|
ShowSelected(i + 1);
|
|
end;
|
|
|
|
procedure TVarOrder.btnMoveUpClick(Sender: TObject);
|
|
var i: integer;
|
|
begin
|
|
if not assigned(VarListView.Selected) then
|
|
begin
|
|
Application.MessageBox(PChar(TextByKey('varorder-noselected')),
|
|
'Apophysis AV', MB_ICONWARNING);
|
|
exit;
|
|
end;
|
|
|
|
i := VarListView.Selected.Index;
|
|
ExchangeVars(i, i - 1);
|
|
ShowSelected(i - 1);
|
|
end;
|
|
|
|
procedure TVarOrder.btnSortClick(Sender: TObject);
|
|
begin
|
|
VarListView.Items.BeginUpdate;
|
|
VarListView.SortType := stText;
|
|
VarListView.SortType := stNone;
|
|
if not assigned(VarListView.Selected) then
|
|
VarListView.Selected := VarListView.Items[0];
|
|
ShowSelected(VarListView.Selected.Index);
|
|
VarListView.Items.EndUpdate;
|
|
Changed := True;
|
|
end;
|
|
|
|
procedure TVarOrder.btnTopClick(Sender: TObject);
|
|
var i: integer;
|
|
begin
|
|
if not assigned(VarListView.Selected) then
|
|
begin
|
|
Application.MessageBox(PChar(TextByKey('varorder-noselected')),
|
|
'Apophysis AV', MB_ICONWARNING);
|
|
exit;
|
|
end;
|
|
|
|
i := VarListView.Selected.Index;
|
|
ExchangeVars(i, 0);
|
|
ShowSelected(0);
|
|
end;
|
|
|
|
procedure TVarOrder.ExchangeVars(const i, j: integer);
|
|
var
|
|
tmpVarItem: TListItem;
|
|
n: integer;
|
|
begin
|
|
VarListView.Items.BeginUpdate;
|
|
tmpVarItem := TListItem.Create(VarListView.Items);
|
|
try
|
|
if (i < j) then
|
|
for n := i to (j - 1) do
|
|
begin
|
|
tmpVarItem.Assign(VarListView.Items.Item[n]);
|
|
VarListView.Items.Item[n] := VarListView.Items.Item[n + 1];
|
|
VarListView.Items.Item[n + 1] := tmpVarItem;
|
|
end
|
|
else // if (i > j) then
|
|
for n := i downto (j + 1) do
|
|
begin
|
|
tmpVarItem.Assign(VarListView.Items.Item[n]);
|
|
VarListView.Items.Item[n] := VarListView.Items.Item[n - 1];
|
|
VarListView.Items.Item[n - 1] := tmpVarItem;
|
|
end;
|
|
VarListView.Selected := VarListView.Items[j];
|
|
Changed := True;
|
|
finally
|
|
tmpVarItem.Free;
|
|
VarListView.Items.EndUpdate;
|
|
end;
|
|
end;
|
|
|
|
procedure TVarOrder.FormCreate(Sender: TObject);
|
|
begin
|
|
btnOK.Caption := TextByKey('common-ok');
|
|
btnCancel.Caption := TextByKey('common-cancel');
|
|
btnMoveUp.Caption := TextByKey('favscripts-moveup');
|
|
btnMoveDown.Caption := TextByKey('favscripts-movedown');
|
|
btnTop.Caption := TextByKey('varorder-totop');
|
|
btnBottom.Caption := TextByKey('varorder-tobottom');
|
|
btnSort.Caption := TextByKey('varorder-byname');
|
|
btnSort.Hint := TextByKey('varorder-bynamehint');
|
|
btnDefOrder.Caption := TextByKey('varorder-byindex');
|
|
btnDefOrder.Hint := TextByKey('varorder-byindexhint');
|
|
self.Caption := TextByKey('varorder-title');
|
|
usedVars := TStringList.Create;
|
|
end;
|
|
|
|
procedure TVarOrder.FormDestroy(Sender: TObject);
|
|
begin
|
|
usedVars.Free;
|
|
end;
|
|
|
|
procedure TVarOrder.FormShow(Sender: TObject);
|
|
var
|
|
ListItem: TListItem;
|
|
i, SelTX: integer;
|
|
s: string;
|
|
begin
|
|
Changed := False;
|
|
SelTX := EditForm.cbTransforms.ItemIndex;
|
|
if SelTX < EditForm.cp.NumXForms then
|
|
begin
|
|
s := TextByKey('editor-common-transform') + ' ' + IntToStr(SelTX + 1);
|
|
//if (EditForm.txtName.Text <> '') then
|
|
// s := s + ' - ' + EditForm.txtName.Text;
|
|
end else
|
|
s := TextByKey('editor-common-transform') + ' ' +
|
|
TextByKey('editor-common-finalxformlistitem');
|
|
VarListView.Column[0].Caption := s;
|
|
totVars := NrVar - 1;
|
|
VarListView.Items.BeginUpdate;
|
|
VarListView.Items.Clear;
|
|
usedVars.Clear;
|
|
for i := 0 to totVars do
|
|
begin
|
|
ListItem := VarListView.Items.Add;
|
|
s := EditForm.cp.xform[SelTX].ifs[i];
|
|
ListItem.Caption := s;
|
|
SetVarIcon(s, ListItem);
|
|
ListItem.Indent := 1;
|
|
if EditForm.cp.xform[SelTX].GetVariation(i) <> 0 then
|
|
usedVars.Add(Varnames(i));
|
|
end;
|
|
VarListView.Items.EndUpdate;
|
|
VarListView.Selected := VarListView.Items[0];
|
|
end;
|
|
|
|
procedure TVarOrder.SetVarIcon(const s: string; ListItem: TListItem);
|
|
begin
|
|
if (LeftStr(s, 4) = 'pre_') or (s = 'flatten') then
|
|
ListItem.ImageIndex := 7 // red
|
|
else if LeftStr(s, 5) = 'post_' then
|
|
ListItem.ImageIndex := 4 // blue
|
|
else if (s = 'trianglecrop') or (s = 'projective')
|
|
or (s = 'affine3D') or (s = 'spherecrop') then
|
|
ListItem.ImageIndex := 6 // violet
|
|
else
|
|
ListItem.ImageIndex := 5 // green;
|
|
end;
|
|
|
|
procedure TVarOrder.ShowSelected(const i: integer);
|
|
begin
|
|
try
|
|
VarListView.Items[i].MakeVisible(false);
|
|
finally
|
|
VarListView.SetFocus;
|
|
end;
|
|
end;
|
|
|
|
procedure TVarOrder.VarListViewChange(Sender: TObject; Item: TListItem;
|
|
Change: TItemChange);
|
|
begin
|
|
if (Item.Index = totVars) or (Item.Index < 0) then
|
|
begin
|
|
btnMoveDown.Enabled := False;
|
|
btnBottom.Enabled := False;
|
|
end else begin
|
|
btnMoveDown.Enabled := True;
|
|
btnBottom.Enabled := True;
|
|
end;
|
|
if (Item.Index <= 0) then
|
|
begin
|
|
btnMoveUp.Enabled := False;
|
|
btnTop.Enabled := False;
|
|
end else begin
|
|
btnMoveUp.Enabled := True;
|
|
btnTop.Enabled := True;
|
|
end;
|
|
end;
|
|
|
|
procedure TVarOrder.VarListViewCustomDrawItem(Sender: TCustomListView;
|
|
Item: TListItem; State: TCustomDrawState; var DefaultDraw: Boolean);
|
|
var
|
|
vRect: TRect;
|
|
begin
|
|
DefaultDraw := True;
|
|
if (usedVars.Count = 0) then exit;
|
|
vRect := Item.DisplayRect(drLabel);
|
|
if usedVars.IndexOf(Item.Caption) >= 0 then
|
|
with VarListView.Canvas do
|
|
begin
|
|
if (CurrentStyle = 'Windows') then
|
|
Brush.Color := $0002B076
|
|
else
|
|
Brush.Color := BrightColor;
|
|
FillRect(vRect);
|
|
if (CurrentStyle = 'Auric') then // make the text more visible
|
|
Font.Color := WinColor
|
|
else
|
|
Font.Color := TextColor;
|
|
TextOut(vRect.Left + 2, vRect.Top + 2, Item.Caption);
|
|
end;
|
|
end;
|
|
|
|
procedure TVarOrder.VarListViewDragDrop(Sender, Source: TObject; X, Y: Integer);
|
|
var
|
|
i, j: integer;
|
|
begin
|
|
if not assigned(VarListView.Selected) then exit;
|
|
|
|
if Source = VarListView then
|
|
begin
|
|
try
|
|
i := VarListView.Selected.Index;
|
|
j := VarListView.GetItemAt(X,Y).Index;
|
|
if (j >= 0) and (i >= 0) and (i <> j) then
|
|
ExchangeVars(i, j);
|
|
except
|
|
Beep;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
procedure TVarOrder.VarListViewDragOver(Sender, Source: TObject; X, Y: Integer;
|
|
State: TDragState; var Accept: Boolean);
|
|
begin
|
|
Accept := (Source = VarListView);
|
|
end;
|
|
|
|
end.
|