Explorar el Código

add persistent Settings dialog (data folder + PDF cover option)

Bernardo Magri hace 4 meses
padre
commit
bb97d20408
Se han modificado 2 ficheros con 132 adiciones y 25 borrados
  1. 31 21
      src/main.pas
  2. 101 4
      src/unitsettingsdialog.pas

+ 31 - 21
src/main.pas

@@ -6,7 +6,7 @@ interface
 
 uses
   Classes, Sysutils, Fileutil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
-  Book, BookCollection, LCLIntf, LResources, StdCtrls, LCLType, unitSettingsDialog;
+  Book, BookCollection, LCLIntf, LResources, StdCtrls, LCLType, IniFiles, unitSettingsDialog;
 
 
 type
@@ -223,10 +223,13 @@ Buttonadd.Picture:=mAdd;
 End;
 
 procedure Tform1.ButtonSettingsClick(Sender: TObject);
-var SettingsDialog: TSettingsDialog;
 begin
-     SettingsDialog:=TSettingsDialog.Create(nil);
-     SettingsDialog.ShowModal;
+SettingsDialog := TSettingsDialog.Create(Self);
+  try
+    SettingsDialog.ShowModal;
+  finally
+    SettingsDialog.Free;
+  end;
 end;
 
 procedure Tform1.Buttonsettingsmouseenter(Sender: Tobject);
@@ -259,7 +262,10 @@ end;
 End;
 
 procedure Tform1.Formcreate(Sender: Tobject);
-var i:integer;
+var 
+ i:integer;
+ cfgDir, cfgPath, dataDir: String;
+ ini: TIniFile;
 begin
  bookWidth:=150;
  bookHeight:=200;
@@ -284,23 +290,27 @@ begin
  ButtonAdd.Picture:=mAdd;
  ButtonSettings.Picture:=mGear;
 
- {$IFDEF MSWINDOWS}
- DataPath:= GetEnvironmentVariableUTF8('appdata') + '\mybookshelf'; //fix the data store dir
-
-if not DirectoryExistsUTF8(dataPath) then
-    CreateDirUTF8(dataPath);
-
-dataPath:= dataPath + '\data.dat';
- {$ENDIF}
-
- {$IFDEF UNIX}
- DataPath:= GetEnvironmentVariableUTF8('HOME') + '/.mybookshelf/';
-
- if not DirectoryExistsUTF8(DataPath) then
-    CreateDirUTF8(dataPath);
+ // Load config.ini if present to resolve dataPath and options
+  {$IFDEF MSWINDOWS}
+  cfgDir := GetEnvironmentVariableUTF8('APPDATA') + DirectorySeparator + 'mybookshelf' + DirectorySeparator;
+  {$ENDIF}
+  {$IFDEF UNIX}
+  cfgDir := GetEnvironmentVariableUTF8('HOME') + DirectorySeparator + '.mybookshelf' + DirectorySeparator;
+  {$ENDIF}
+  if not DirectoryExistsUTF8(cfgDir) then CreateDirUTF8(cfgDir);
+
+  cfgPath := cfgDir + 'config.ini';
+  ini := TIniFile.Create(cfgPath);
+  try
+    dataDir := ini.ReadString('general', 'data_dir', cfgDir);
+    // You can also read autoPdfCover if you want it here:
+    // autoPdfCover := ini.ReadBool('general', 'auto_pdf_cover', True);
+  finally
+    ini.Free;
+  end;
 
- dataPath:= dataPath + 'data.dat';
- {$ENDIF}
+  if not DirectoryExistsUTF8(dataDir) then CreateDirUTF8(dataDir);
+  dataPath := IncludeTrailingPathDelimiter(dataDir) + 'data.dat';
 
  BookList:=TBookCollection.Create;
 

+ 101 - 4
src/unitsettingsdialog.pas

@@ -5,14 +5,26 @@ unit unitSettingsDialog;
 interface
 
 uses
-  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs;
+  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs,
+  StdCtrls, Buttons, IniFiles;
 
 type
   TSettingsDialog = class(TForm)
   private
-    { private declarations }
+    lblDataDir: TLabel;
+    edtDataDir: TEdit;
+    btnBrowse: TButton;
+    chkPdfCovers: TCheckBox;
+    btnOK: TBitBtn;
+    btnCancel: TBitBtn;
+    procedure FormCreate(Sender: TObject);
+    procedure BtnBrowseClick(Sender: TObject);
+    procedure BtnOKClick(Sender: TObject);
+    function  ConfigDir: String;
+    function  ConfigPath: String;
+    procedure LoadSettings;
+    procedure SaveSettings;
   public
-    { public declarations }
   end;
 
 var
@@ -22,5 +34,90 @@ implementation
 
 {$R *.lfm}
 
-end.
+procedure TSettingsDialog.FormCreate(Sender: TObject);
+begin
+  Caption := 'Settings';
+  BorderStyle := bsDialog;
+  Position := poScreenCenter;
+  ClientWidth := 520; ClientHeight := 180;
+
+  lblDataDir := TLabel.Create(Self); lblDataDir.Parent := Self;
+  lblDataDir.Caption := 'Data folder (where data.dat is saved):';
+  lblDataDir.Left := 16; lblDataDir.Top := 16;
+
+  edtDataDir := TEdit.Create(Self); edtDataDir.Parent := Self;
+  edtDataDir.Left := 16; edtDataDir.Top := 40; edtDataDir.Width := 410;
+
+  btnBrowse := TButton.Create(Self); btnBrowse.Parent := Self;
+  btnBrowse.Left := 436; btnBrowse.Top := 38; btnBrowse.Caption := 'Browse...';
+  btnBrowse.OnClick := @BtnBrowseClick;
+
+  chkPdfCovers := TCheckBox.Create(Self); chkPdfCovers.Parent := Self;
+  chkPdfCovers.Caption := 'Auto-extract PDF cover on import (requires pdftoppm)';
+  chkPdfCovers.Left := 16; chkPdfCovers.Top := 80;
+
+  btnOK := TBitBtn.Create(Self); btnOK.Parent := Self;
+  btnOK.Kind := bkOK; btnOK.Left := ClientWidth - 180; btnOK.Top := 130;
+  btnOK.OnClick := @BtnOKClick;
+
+  btnCancel := TBitBtn.Create(Self); btnCancel.Parent := Self;
+  btnCancel.Kind := bkCancel; btnCancel.Left := ClientWidth - 92; btnCancel.Top := 130;
+
+  LoadSettings;
+end;
+
+procedure TSettingsDialog.BtnBrowseClick(Sender: TObject);
+var dir: String;
+begin
+  dir := edtDataDir.Text;
+  if SelectDirectory('Choose data folder', '', dir) then
+    edtDataDir.Text := dir;
+end;
 
+procedure TSettingsDialog.BtnOKClick(Sender: TObject);
+begin
+  SaveSettings;
+  ModalResult := mrOK;
+end;
+
+function TSettingsDialog.ConfigDir: String;
+begin
+  {$IFDEF MSWINDOWS}
+  Result := GetEnvironmentVariableUTF8('APPDATA') + DirectorySeparator + 'mybookshelf' + DirectorySeparator;
+  {$ENDIF}
+  {$IFDEF UNIX}
+  Result := GetEnvironmentVariableUTF8('HOME') + DirectorySeparator + '.mybookshelf' + DirectorySeparator;
+  {$ENDIF}
+  if not DirectoryExistsUTF8(Result) then CreateDirUTF8(Result);
+end;
+
+function TSettingsDialog.ConfigPath: String;
+begin
+  Result := ConfigDir + 'config.ini';
+end;
+
+procedure TSettingsDialog.LoadSettings;
+var ini: TIniFile;
+begin
+  ini := TIniFile.Create(ConfigPath);
+  try
+    edtDataDir.Text := ini.ReadString('general', 'data_dir', '');
+    chkPdfCovers.Checked := ini.ReadBool('general', 'auto_pdf_cover', True);
+  finally
+    ini.Free;
+  end;
+end;
+
+procedure TSettingsDialog.SaveSettings;
+var ini: TIniFile;
+begin
+  ini := TIniFile.Create(ConfigPath);
+  try
+    ini.WriteString('general', 'data_dir', edtDataDir.Text);
+    ini.WriteBool('general', 'auto_pdf_cover', chkPdfCovers.Checked);
+  finally
+    ini.Free;
+  end;
+end;
+
+end.