Added settings functionality; Added restoring of list's focus.

This commit is contained in:
meffi@lab313.ru
2014-04-09 20:53:14 +00:00
parent b94624971c
commit c062ecc92b
6 changed files with 190 additions and 37 deletions

View File

@@ -15,7 +15,8 @@ uses
uDrawTIM in 'units\uDrawTIM.pas', uDrawTIM in 'units\uDrawTIM.pas',
uEventWaitThread in 'units\uEventWaitThread.pas', uEventWaitThread in 'units\uEventWaitThread.pas',
uBrowseForFolder in 'units\uBrowseForFolder.pas', uBrowseForFolder in 'units\uBrowseForFolder.pas',
uScanResult in 'units\uScanResult.pas'; uScanResult in 'units\uScanResult.pas',
uSettings in 'units\uSettings.pas';
{$R *.res} {$R *.res}

View File

@@ -128,6 +128,7 @@
<DCCReference Include="units\uEventWaitThread.pas"/> <DCCReference Include="units\uEventWaitThread.pas"/>
<DCCReference Include="units\uBrowseForFolder.pas"/> <DCCReference Include="units\uBrowseForFolder.pas"/>
<DCCReference Include="units\uScanResult.pas"/> <DCCReference Include="units\uScanResult.pas"/>
<DCCReference Include="units\uSettings.pas"/>
<BuildConfiguration Include="Release"> <BuildConfiguration Include="Release">
<Key>Cfg_2</Key> <Key>Cfg_2</Key>
<CfgParent>Base</CfgParent> <CfgParent>Base</CfgParent>

View File

@@ -7,7 +7,7 @@ uses
const const
cProgramName = 'Tim2View by [Lab 313]'; cProgramName = 'Tim2View by [Lab 313]';
cProgramVersion = '2.0 r48 Release'; cProgramVersion = '2.0 Stable';
cExtractedTimsDir = 'TIMS'; cExtractedTimsDir = 'TIMS';
cMaxFileSize = $2EAEED80; cMaxFileSize = $2EAEED80;

View File

@@ -547,6 +547,7 @@ object frmMain: TfrmMain
Enabled = False Enabled = False
TabOrder = 0 TabOrder = 0
OnChange = cbbFilesChange OnChange = cbbFilesChange
OnCloseUp = actReturnFocusExecute
end end
object pnlMain: TPanel object pnlMain: TPanel
Left = 0 Left = 0
@@ -610,7 +611,6 @@ object frmMain: TfrmMain
ViewStyle = vsReport ViewStyle = vsReport
OnChange = lvListChange OnChange = lvListChange
OnData = lvListData OnData = lvListData
OnSelectItem = lvListSelectItem
end end
end end
object pnlImage: TPanel object pnlImage: TPanel
@@ -701,7 +701,8 @@ object frmMain: TfrmMain
ItemIndex = 0 ItemIndex = 0
TabOrder = 1 TabOrder = 1
Text = 'Real' Text = 'Real'
OnChange = cbbBitModeChange OnChange = actDrawSelectedTimExecute
OnCloseUp = actReturnFocusExecute
Items.Strings = ( Items.Strings = (
'Real' 'Real'
'4 BPP' '4 BPP'
@@ -709,7 +710,7 @@ object frmMain: TfrmMain
'16 BPP' '16 BPP'
'24 BPP') '24 BPP')
end end
object cbbTransparenceMode: TComboBox object cbbTranspMode: TComboBox
AlignWithMargins = True AlignWithMargins = True
Left = 83 Left = 83
Top = 3 Top = 3
@@ -724,7 +725,8 @@ object frmMain: TfrmMain
ItemIndex = 0 ItemIndex = 0
TabOrder = 2 TabOrder = 2
Text = 'Full transparence' Text = 'Full transparence'
OnChange = cbbTransparenceModeChange OnChange = cbbTranspModeChange
OnCloseUp = actReturnFocusExecute
Items.Strings = ( Items.Strings = (
'Full transparence' 'Full transparence'
'Black Transparence' 'Black Transparence'
@@ -746,6 +748,7 @@ object frmMain: TfrmMain
DropDownCount = 16 DropDownCount = 16
ParentDoubleBuffered = False ParentDoubleBuffered = False
TabOrder = 3 TabOrder = 3
OnCloseUp = actReturnFocusExecute
end end
end end
end end
@@ -924,6 +927,14 @@ object frmMain: TfrmMain
object actChangeBackColor: TAction object actChangeBackColor: TAction
Caption = '&Change Background Color' Caption = '&Change Background Color'
end end
object actReturnFocus: TAction
Caption = 'actReturnFocus'
OnExecute = actReturnFocusExecute
end
object actDrawSelectedTim: TAction
Caption = 'actDrawSelectedTim'
OnExecute = actDrawSelectedTimExecute
end
end end
object pmList: TPopupMenu object pmList: TPopupMenu
Left = 640 Left = 640

View File

@@ -8,7 +8,8 @@ uses
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Grids, Vcl.ComCtrls, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Grids, Vcl.ComCtrls,
Vcl.ExtCtrls, Vcl.Menus, Vcl.StdCtrls, uScanThread, uCommon, Vcl.ExtCtrls, Vcl.Menus, Vcl.StdCtrls, uScanThread, uCommon,
Winapi.ShellAPI, uDrawTIM, Vcl.ExtDlgs, uTIM, System.Actions, Winapi.ShellAPI, uDrawTIM, Vcl.ExtDlgs, uTIM, System.Actions,
Vcl.ActnList, uScanResult, System.Types, System.Generics.Collections; Vcl.ActnList, uScanResult, System.Types, System.Generics.Collections,
uSettings;
const const
WM_COMMANDARRIVED = WM_USER + 1; WM_COMMANDARRIVED = WM_USER + 1;
@@ -46,7 +47,7 @@ type
pnlList: TPanel; pnlList: TPanel;
lvList: TListView; lvList: TListView;
pnlImageOptions: TPanel; pnlImageOptions: TPanel;
cbbTransparenceMode: TComboBox; cbbTranspMode: TComboBox;
grdCurrClut: TDrawGrid; grdCurrClut: TDrawGrid;
pnlImage: TPanel; pnlImage: TPanel;
splImageClut: TSplitter; splImageClut: TSplitter;
@@ -83,6 +84,8 @@ type
btnShowClut: TButton; btnShowClut: TButton;
cbbCLUT: TComboBox; cbbCLUT: TComboBox;
actChangeBackColor: TAction; actChangeBackColor: TAction;
actReturnFocus: TAction;
actDrawSelectedTim: TAction;
procedure btnStopScanClick(Sender: TObject); procedure btnStopScanClick(Sender: TObject);
procedure FormCreate(Sender: TObject); procedure FormCreate(Sender: TObject);
procedure lvListData(Sender: TObject; Item: TListItem); procedure lvListData(Sender: TObject; Item: TListItem);
@@ -101,18 +104,17 @@ type
procedure actTim2PngExecute(Sender: TObject); procedure actTim2PngExecute(Sender: TObject);
procedure actOpenRepoExecute(Sender: TObject); procedure actOpenRepoExecute(Sender: TObject);
procedure actOpenLabExecute(Sender: TObject); procedure actOpenLabExecute(Sender: TObject);
procedure cbbBitModeChange(Sender: TObject);
procedure actAboutExecute(Sender: TObject); procedure actAboutExecute(Sender: TObject);
procedure actStretchExecute(Sender: TObject); procedure actStretchExecute(Sender: TObject);
procedure actTimInfoExecute(Sender: TObject); procedure actTimInfoExecute(Sender: TObject);
procedure actAssocTimsExecute(Sender: TObject); procedure actAssocTimsExecute(Sender: TObject);
procedure actExtractListExecute(Sender: TObject); procedure actExtractListExecute(Sender: TObject);
procedure lvListSelectItem(Sender: TObject; Item: TListItem; procedure cbbTranspModeChange(Sender: TObject);
Selected: Boolean);
procedure cbbTransparenceModeChange(Sender: TObject);
procedure btnShowClutClick(Sender: TObject); procedure btnShowClutClick(Sender: TObject);
procedure lvListChange(Sender: TObject; Item: TListItem; procedure lvListChange(Sender: TObject; Item: TListItem;
Change: TItemChange); Change: TItemChange);
procedure actReturnFocusExecute(Sender: TObject);
procedure actDrawSelectedTimExecute(Sender: TObject);
private private
{ Private declarations } { Private declarations }
// pResult: PNativeXml; // pResult: PNativeXml;
@@ -121,6 +123,7 @@ type
LastDir: string; LastDir: string;
WaitThread: TEventWaitThread; WaitThread: TEventWaitThread;
StartedScans: Integer; StartedScans: Integer;
Settings: TSettings;
function ScanRes: TScanResult; function ScanRes: TScanResult;
procedure SetListCount(Count: Integer); procedure SetListCount(Count: Integer);
@@ -281,11 +284,11 @@ begin
actTimInfo.Enabled := False; actTimInfo.Enabled := False;
actTimInfo.Caption := 'TIM Info'; actTimInfo.Caption := 'TIM Info';
lvList.Column[0].Caption := '# / 0'; lvList.Column[0].Caption := '# / 0';
UpdateCLUTInfo;
DrawSelTim; DrawSelTim;
DrawSelClut; DrawSelClut;
SetCLUTListToNoCLUT;
cbbFiles.Items.Delete(cbbFiles.ItemIndex); cbbFiles.Items.Delete(cbbFiles.ItemIndex);
CheckButtonsAndMainMenu; CheckButtonsAndMainMenu;
@@ -307,6 +310,11 @@ begin
end; end;
end; end;
procedure TfrmMain.actDrawSelectedTimExecute(Sender: TObject);
begin
DrawSelTim;
end;
procedure TfrmMain.actExitExecute(Sender: TObject); procedure TfrmMain.actExitExecute(Sender: TObject);
begin begin
Close; Close;
@@ -381,6 +389,11 @@ begin
MessageBeep(MB_ICONINFORMATION); MessageBeep(MB_ICONINFORMATION);
end; end;
procedure TfrmMain.actReturnFocusExecute(Sender: TObject);
begin
if lvList.Enabled then lvList.SetFocus;
end;
procedure TfrmMain.actScanDirExecute(Sender: TObject); procedure TfrmMain.actScanDirExecute(Sender: TObject);
var var
SelectedDir: string; SelectedDir: string;
@@ -405,7 +418,8 @@ end;
procedure TfrmMain.actStretchExecute(Sender: TObject); procedure TfrmMain.actStretchExecute(Sender: TObject);
begin begin
DrawSelTim; Settings.StretchMode := actStretch.Checked;
actDrawSelectedTimExecute(Self);
end; end;
procedure TfrmMain.actTim2PngExecute(Sender: TObject); procedure TfrmMain.actTim2PngExecute(Sender: TObject);
@@ -482,6 +496,7 @@ procedure TfrmMain.btnShowClutClick(Sender: TObject);
begin begin
grdCurrClut.Visible := not grdCurrClut.Visible; grdCurrClut.Visible := not grdCurrClut.Visible;
DrawSelClut; DrawSelClut;
actReturnFocusExecute(Self);
end; end;
procedure TfrmMain.btnStopScanClick(Sender: TObject); procedure TfrmMain.btnStopScanClick(Sender: TObject);
@@ -489,31 +504,28 @@ begin
if ScanThreads.Count = 0 then Exit; if ScanThreads.Count = 0 then Exit;
ScanThreads.First.StopScan := True; ScanThreads.First.StopScan := True;
actReturnFocusExecute(Self);
end; end;
procedure TfrmMain.cbbFilesChange(Sender: TObject); procedure TfrmMain.cbbFilesChange(Sender: TObject);
begin begin
SetListCount(ScanRes.Count); SetListCount(ScanRes.Count);
lvList.SetFocus; actReturnFocusExecute(Self);
lvList.Selected := nil; lvList.Selected := nil;
lvList.Items[0].Focused := True; lvList.Items[0].Focused := True;
lvList.Items[0].Selected := True; lvList.Items[0].Selected := True;
end; end;
procedure TfrmMain.cbbTransparenceModeChange(Sender: TObject); procedure TfrmMain.cbbTranspModeChange(Sender: TObject);
begin begin
DrawSelTim; Settings.TranspMode := cbbTranspMode.ItemIndex;
end; actDrawSelectedTimExecute(Self);
procedure TfrmMain.cbbBitModeChange(Sender: TObject);
begin
DrawSelTim;
end; end;
procedure TfrmMain.cbbCLUTChange(Sender: TObject); procedure TfrmMain.cbbCLUTChange(Sender: TObject);
begin begin
DrawSelTim; actDrawSelectedTimExecute(Self);
DrawSelClut; DrawSelClut;
end; end;
@@ -544,7 +556,8 @@ begin
actExtractTim.Enabled := actReplaceTim.Enabled; actExtractTim.Enabled := actReplaceTim.Enabled;
cbbCLUT.Enabled := actReplaceTim.Enabled; cbbCLUT.Enabled := actReplaceTim.Enabled;
cbbTransparenceMode.Enabled := actReplaceTim.Enabled; btnShowClut.Enabled := actReplaceTim.Enabled;
cbbTranspMode.Enabled := actReplaceTim.Enabled;
cbbBitMode.Enabled := actReplaceTim.Enabled; cbbBitMode.Enabled := actReplaceTim.Enabled;
//actStretch.Enabled := actReplaceTim.Enabled; //actStretch.Enabled := actReplaceTim.Enabled;
end; end;
@@ -629,7 +642,7 @@ begin
else else
Index := cbbCLUT.ItemIndex; Index := cbbCLUT.ItemIndex;
TimToPNG(TIM, Index, PNG, cbbTransparenceMode.ItemIndex); TimToPNG(TIM, Index, PNG, cbbTranspMode.ItemIndex);
PNG.AssignTo(pbTim.Picture.Bitmap); PNG.AssignTo(pbTim.Picture.Bitmap);
FreeTIM(TIM); FreeTIM(TIM);
@@ -649,12 +662,21 @@ begin
if PNG^ <> nil then PNG^.Free; if PNG^ <> nil then PNG^.Free;
Dispose(PNG); Dispose(PNG);
Settings.SaveToFile;
Settings.Free;
end; end;
procedure TfrmMain.FormCreate(Sender: TObject); procedure TfrmMain.FormCreate(Sender: TObject);
var var
hGridRect: TGridRect; hGridRect: TGridRect;
begin begin
Settings := TSettings.Create;
Settings.LoadFromFile;
actStretch.Checked := Settings.StretchMode;
cbbTranspMode.ItemIndex := Settings.TranspMode;
hGridRect.Top := -1; hGridRect.Top := -1;
hGridRect.Left := -1; hGridRect.Left := -1;
hGridRect.Right := -1; hGridRect.Right := -1;
@@ -809,15 +831,6 @@ begin
Item.SubItems.Add(Format('%.2d', [TimIdx(Item.Index).Cluts])); Item.SubItems.Add(Format('%.2d', [TimIdx(Item.Index).Cluts]));
end; end;
procedure TfrmMain.lvListSelectItem(Sender: TObject; Item: TListItem;
Selected: Boolean);
begin
(*if Item = nil then Exit;
if Selected then
lvListClick(Self); *)
end;
procedure TfrmMain.SetListCount(Count: Integer); procedure TfrmMain.SetListCount(Count: Integer);
begin begin
lvList.Items.BeginUpdate; lvList.Items.BeginUpdate;
@@ -952,10 +965,10 @@ begin
cbbCLUT.Items.Add(Format('CLUT [%.2d/%.2d]', [I, CLUTS])); cbbCLUT.Items.Add(Format('CLUT [%.2d/%.2d]', [I, CLUTS]));
cbbCLUT.Items.EndUpdate; cbbCLUT.Items.EndUpdate;
cbbCLUT.ItemIndex := 0;
if CLUTS = 0 then SetCLUTListToNoCLUT; if CLUTS = 0 then SetCLUTListToNoCLUT;
cbbCLUT.ItemIndex := 0;
FreeTIM(TIM); FreeTIM(TIM);
end; end;

127
units/uSettings.pas Normal file
View File

@@ -0,0 +1,127 @@
unit uSettings;
interface
uses Classes;
{$M+}
type
TCustomSettings = class
private
procedure LoadFromStream(const Stream: TStream) ;
procedure SaveToStream(const Stream: TStream) ;
public
procedure LoadFromFile() ;
procedure SaveToFile() ;
end;
TSettings = class(TCustomSettings)
private
FTranspMode: Integer;
FStretchMode: Boolean;
public
constructor Create;
published
property TranspMode: Integer read FTranspMode write FTranspMode;
property StretchMode: Boolean read FStretchMode write FStretchMode;
end;
var
Settings: TSettings;
implementation
uses TypInfo, Sysutils;
const FileName = 'settings.t2v';
{ TSettings }
procedure TCustomSettings.LoadFromFile() ;
var
Stream: TStream;
begin
if not FileExists(FileName) then Exit;
Stream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite) ;
try
LoadFromStream(Stream) ;
finally
Stream.Free;
end;
end;
procedure TCustomSettings.LoadFromStream(const Stream: TStream) ;
var
Reader: TReader;
PropName, PropValue: string;
begin
Reader := TReader.Create(Stream, $FFF) ;
Stream.Position := 0;
Reader.ReadListBegin;
while not Reader.EndOfList do
begin
PropName := Reader.ReadString;
PropValue := Reader.ReadString;
SetPropValue(Self, PropName, PropValue) ;
end;
FreeAndNil(Reader) ;
end;
procedure TCustomSettings.SaveToFile() ;
var
Stream: TStream;
begin
Stream := TFileStream.Create(FileName, fmCreate) ;
try
SaveToStream(Stream) ;
finally
Stream.Free;
end;
end;
procedure TCustomSettings.SaveToStream(const Stream: TStream) ;
var
PropName, PropValue: string;
cnt: Integer;
lPropInfo: PPropInfo;
lPropCount: Integer;
lPropList: PPropList;
lPropType: PPTypeInfo;
Writer: TWriter;
begin
lPropCount := GetPropList(PTypeInfo(ClassInfo), lPropList) ;
Writer := TWriter.Create(Stream, $FFF) ;
Stream.Size := 0;
Writer.WriteListBegin;
for cnt := 0 to lPropCount - 1 do
begin
lPropInfo := lPropList^[cnt];
lPropType := lPropInfo^.PropType;
if lPropType^.Kind = tkMethod then Continue;
PropName := lPropInfo.Name;
PropValue := GetPropValue(Self, lPropInfo) ;
Writer.WriteString(PropName) ;
Writer.WriteString(PropValue) ;
end;
Writer.WriteListEnd;
FreeAndNil(Writer) ;
end;
{ TSettings }
constructor TSettings.Create;
begin
FTranspMode := 0;
FStretchMode := False;
end;
initialization
Settings := TSettings.Create;
finalization
FreeAndNil(Settings) ;
end.