diff --git a/tim2view.dpr b/tim2view.dpr index 1b6a6af..0bb4b83 100644 --- a/tim2view.dpr +++ b/tim2view.dpr @@ -15,7 +15,8 @@ uses uDrawTIM in 'units\uDrawTIM.pas', uEventWaitThread in 'units\uEventWaitThread.pas', uBrowseForFolder in 'units\uBrowseForFolder.pas', - uScanResult in 'units\uScanResult.pas'; + uScanResult in 'units\uScanResult.pas', + uSettings in 'units\uSettings.pas'; {$R *.res} diff --git a/tim2view.dproj b/tim2view.dproj index 51de921..01adc29 100644 --- a/tim2view.dproj +++ b/tim2view.dproj @@ -128,6 +128,7 @@ + Cfg_2 Base diff --git a/units/uCommon.pas b/units/uCommon.pas index 7d99c3a..29fd2be 100644 --- a/units/uCommon.pas +++ b/units/uCommon.pas @@ -7,7 +7,7 @@ uses const cProgramName = 'Tim2View by [Lab 313]'; - cProgramVersion = '2.0 r48 Release'; + cProgramVersion = '2.0 Stable'; cExtractedTimsDir = 'TIMS'; cMaxFileSize = $2EAEED80; diff --git a/units/uMain.dfm b/units/uMain.dfm index bb3a8be..a7ee639 100644 --- a/units/uMain.dfm +++ b/units/uMain.dfm @@ -547,6 +547,7 @@ object frmMain: TfrmMain Enabled = False TabOrder = 0 OnChange = cbbFilesChange + OnCloseUp = actReturnFocusExecute end object pnlMain: TPanel Left = 0 @@ -610,7 +611,6 @@ object frmMain: TfrmMain ViewStyle = vsReport OnChange = lvListChange OnData = lvListData - OnSelectItem = lvListSelectItem end end object pnlImage: TPanel @@ -701,7 +701,8 @@ object frmMain: TfrmMain ItemIndex = 0 TabOrder = 1 Text = 'Real' - OnChange = cbbBitModeChange + OnChange = actDrawSelectedTimExecute + OnCloseUp = actReturnFocusExecute Items.Strings = ( 'Real' '4 BPP' @@ -709,7 +710,7 @@ object frmMain: TfrmMain '16 BPP' '24 BPP') end - object cbbTransparenceMode: TComboBox + object cbbTranspMode: TComboBox AlignWithMargins = True Left = 83 Top = 3 @@ -724,7 +725,8 @@ object frmMain: TfrmMain ItemIndex = 0 TabOrder = 2 Text = 'Full transparence' - OnChange = cbbTransparenceModeChange + OnChange = cbbTranspModeChange + OnCloseUp = actReturnFocusExecute Items.Strings = ( 'Full transparence' 'Black Transparence' @@ -746,6 +748,7 @@ object frmMain: TfrmMain DropDownCount = 16 ParentDoubleBuffered = False TabOrder = 3 + OnCloseUp = actReturnFocusExecute end end end @@ -924,6 +927,14 @@ object frmMain: TfrmMain object actChangeBackColor: TAction Caption = '&Change Background Color' end + object actReturnFocus: TAction + Caption = 'actReturnFocus' + OnExecute = actReturnFocusExecute + end + object actDrawSelectedTim: TAction + Caption = 'actDrawSelectedTim' + OnExecute = actDrawSelectedTimExecute + end end object pmList: TPopupMenu Left = 640 diff --git a/units/uMain.pas b/units/uMain.pas index c94d4d5..7faef91 100644 --- a/units/uMain.pas +++ b/units/uMain.pas @@ -8,7 +8,8 @@ uses Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Grids, Vcl.ComCtrls, Vcl.ExtCtrls, Vcl.Menus, Vcl.StdCtrls, uScanThread, uCommon, 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 WM_COMMANDARRIVED = WM_USER + 1; @@ -46,7 +47,7 @@ type pnlList: TPanel; lvList: TListView; pnlImageOptions: TPanel; - cbbTransparenceMode: TComboBox; + cbbTranspMode: TComboBox; grdCurrClut: TDrawGrid; pnlImage: TPanel; splImageClut: TSplitter; @@ -83,6 +84,8 @@ type btnShowClut: TButton; cbbCLUT: TComboBox; actChangeBackColor: TAction; + actReturnFocus: TAction; + actDrawSelectedTim: TAction; procedure btnStopScanClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure lvListData(Sender: TObject; Item: TListItem); @@ -101,18 +104,17 @@ type procedure actTim2PngExecute(Sender: TObject); procedure actOpenRepoExecute(Sender: TObject); procedure actOpenLabExecute(Sender: TObject); - procedure cbbBitModeChange(Sender: TObject); procedure actAboutExecute(Sender: TObject); procedure actStretchExecute(Sender: TObject); procedure actTimInfoExecute(Sender: TObject); procedure actAssocTimsExecute(Sender: TObject); procedure actExtractListExecute(Sender: TObject); - procedure lvListSelectItem(Sender: TObject; Item: TListItem; - Selected: Boolean); - procedure cbbTransparenceModeChange(Sender: TObject); + procedure cbbTranspModeChange(Sender: TObject); procedure btnShowClutClick(Sender: TObject); procedure lvListChange(Sender: TObject; Item: TListItem; Change: TItemChange); + procedure actReturnFocusExecute(Sender: TObject); + procedure actDrawSelectedTimExecute(Sender: TObject); private { Private declarations } // pResult: PNativeXml; @@ -121,6 +123,7 @@ type LastDir: string; WaitThread: TEventWaitThread; StartedScans: Integer; + Settings: TSettings; function ScanRes: TScanResult; procedure SetListCount(Count: Integer); @@ -281,11 +284,11 @@ begin actTimInfo.Enabled := False; actTimInfo.Caption := 'TIM Info'; lvList.Column[0].Caption := '# / 0'; + + UpdateCLUTInfo; DrawSelTim; DrawSelClut; - SetCLUTListToNoCLUT; - cbbFiles.Items.Delete(cbbFiles.ItemIndex); CheckButtonsAndMainMenu; @@ -307,6 +310,11 @@ begin end; end; +procedure TfrmMain.actDrawSelectedTimExecute(Sender: TObject); +begin + DrawSelTim; +end; + procedure TfrmMain.actExitExecute(Sender: TObject); begin Close; @@ -381,6 +389,11 @@ begin MessageBeep(MB_ICONINFORMATION); end; +procedure TfrmMain.actReturnFocusExecute(Sender: TObject); +begin + if lvList.Enabled then lvList.SetFocus; +end; + procedure TfrmMain.actScanDirExecute(Sender: TObject); var SelectedDir: string; @@ -405,7 +418,8 @@ end; procedure TfrmMain.actStretchExecute(Sender: TObject); begin - DrawSelTim; + Settings.StretchMode := actStretch.Checked; + actDrawSelectedTimExecute(Self); end; procedure TfrmMain.actTim2PngExecute(Sender: TObject); @@ -482,6 +496,7 @@ procedure TfrmMain.btnShowClutClick(Sender: TObject); begin grdCurrClut.Visible := not grdCurrClut.Visible; DrawSelClut; + actReturnFocusExecute(Self); end; procedure TfrmMain.btnStopScanClick(Sender: TObject); @@ -489,31 +504,28 @@ begin if ScanThreads.Count = 0 then Exit; ScanThreads.First.StopScan := True; + actReturnFocusExecute(Self); end; procedure TfrmMain.cbbFilesChange(Sender: TObject); begin SetListCount(ScanRes.Count); - lvList.SetFocus; + actReturnFocusExecute(Self); lvList.Selected := nil; lvList.Items[0].Focused := True; lvList.Items[0].Selected := True; end; -procedure TfrmMain.cbbTransparenceModeChange(Sender: TObject); +procedure TfrmMain.cbbTranspModeChange(Sender: TObject); begin - DrawSelTim; -end; - -procedure TfrmMain.cbbBitModeChange(Sender: TObject); -begin - DrawSelTim; + Settings.TranspMode := cbbTranspMode.ItemIndex; + actDrawSelectedTimExecute(Self); end; procedure TfrmMain.cbbCLUTChange(Sender: TObject); begin - DrawSelTim; + actDrawSelectedTimExecute(Self); DrawSelClut; end; @@ -544,7 +556,8 @@ begin actExtractTim.Enabled := actReplaceTim.Enabled; cbbCLUT.Enabled := actReplaceTim.Enabled; - cbbTransparenceMode.Enabled := actReplaceTim.Enabled; + btnShowClut.Enabled := actReplaceTim.Enabled; + cbbTranspMode.Enabled := actReplaceTim.Enabled; cbbBitMode.Enabled := actReplaceTim.Enabled; //actStretch.Enabled := actReplaceTim.Enabled; end; @@ -629,7 +642,7 @@ begin else Index := cbbCLUT.ItemIndex; - TimToPNG(TIM, Index, PNG, cbbTransparenceMode.ItemIndex); + TimToPNG(TIM, Index, PNG, cbbTranspMode.ItemIndex); PNG.AssignTo(pbTim.Picture.Bitmap); FreeTIM(TIM); @@ -649,12 +662,21 @@ begin if PNG^ <> nil then PNG^.Free; Dispose(PNG); + + Settings.SaveToFile; + Settings.Free; end; procedure TfrmMain.FormCreate(Sender: TObject); var hGridRect: TGridRect; begin + Settings := TSettings.Create; + Settings.LoadFromFile; + + actStretch.Checked := Settings.StretchMode; + cbbTranspMode.ItemIndex := Settings.TranspMode; + hGridRect.Top := -1; hGridRect.Left := -1; hGridRect.Right := -1; @@ -809,15 +831,6 @@ begin Item.SubItems.Add(Format('%.2d', [TimIdx(Item.Index).Cluts])); 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); begin lvList.Items.BeginUpdate; @@ -952,10 +965,10 @@ begin cbbCLUT.Items.Add(Format('CLUT [%.2d/%.2d]', [I, CLUTS])); cbbCLUT.Items.EndUpdate; - cbbCLUT.ItemIndex := 0; - if CLUTS = 0 then SetCLUTListToNoCLUT; + cbbCLUT.ItemIndex := 0; + FreeTIM(TIM); end; diff --git a/units/uSettings.pas b/units/uSettings.pas new file mode 100644 index 0000000..9eee8a1 --- /dev/null +++ b/units/uSettings.pas @@ -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.