main.pas 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. unit main;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, Sysutils, Fileutil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  6. Book, BookCollection, LCLIntf, LResources, StdCtrls, LCLType, IniFiles, unitSettingsDialog;
  7. type
  8. { Tform1 }
  9. Tform1 = class(Tform)
  10. EditSearch: Tedit;
  11. ButtonSettings: Timage;
  12. ImageToolBar: Timage;
  13. ButtonAdd: Timage;
  14. Opendialog1: Topendialog;
  15. PanelBackground: Tscrollbox;
  16. procedure Buttonaddclick(Sender: Tobject);
  17. procedure Buttonaddmouseenter(Sender: Tobject);
  18. procedure Buttonaddmouseleave(Sender: Tobject);
  19. procedure ButtonSettingsClick(Sender: TObject);
  20. procedure Buttonsettingsmouseenter(Sender: Tobject);
  21. procedure Buttonsettingsmouseleave(Sender: Tobject);
  22. procedure Editsearchenter(Sender: Tobject);
  23. procedure Editsearchexit(Sender: Tobject);
  24. procedure Editsearchkeypress(Sender: Tobject; var Key: Char);
  25. procedure Formclose(Sender: Tobject; var Closeaction: Tcloseaction);
  26. procedure Formcreate(Sender: Tobject);
  27. procedure Formkeydown(Sender: Tobject; var Key: Word; Shift: Tshiftstate);
  28. procedure Panelbackgroundclick(Sender: Tobject);
  29. procedure Panelbackgrounddragdrop(Sender, Source: Tobject; X, Y: Integer);
  30. procedure Panelbackgrounddragover(Sender, Source: Tobject; X, Y: Integer;
  31. State: Tdragstate; var Accept: Boolean);
  32. procedure Panelbackgroundpaint(Sender: Tobject);
  33. procedure RearrangeBooksOnScreen();
  34. procedure Panelbackgroundresize(Sender: Tobject);
  35. function getBookIndexAtPoint(X,Y:Integer):Integer;
  36. procedure UnselectAll;
  37. function getCoverIndex(cover:TImage):Integer;
  38. private
  39. mAdd,mAddHover,mGear,mGearHover:TPicture;
  40. public
  41. { public declarations }
  42. end;
  43. var
  44. Form1: Tform1;
  45. BookList:TBookCollection;
  46. Xspace, Yspace:integer;
  47. dataPath:String;
  48. background,toolbar:TPicture;
  49. bookWidth,bookHeight:Integer;
  50. implementation
  51. {$R *.lfm}
  52. { Tform1 }
  53. procedure Tform1.Panelbackgroundclick(Sender: Tobject);
  54. begin
  55. ActiveControl:=PanelBackground;
  56. UnselectAll;
  57. PanelBackground.Repaint;
  58. End;
  59. procedure Tform1.Panelbackgrounddragdrop(Sender, Source: Tobject; X, Y: Integer);
  60. var src,dest:integer;
  61. begin
  62. src:=getCoverIndex(TImage(Source));
  63. dest:=getBookIndexAtPoint(X,Y);
  64. if (src > -1) and (dest > -1) then BookList.SwapBooks(src,dest);
  65. UnselectAll;
  66. RearrangeBooksOnScreen();
  67. End;
  68. procedure Tform1.Panelbackgrounddragover(Sender, Source: Tobject; X,
  69. Y: Integer; State: Tdragstate; var Accept: Boolean);
  70. begin
  71. Accept:=True;
  72. End;
  73. procedure Tform1.Panelbackgroundpaint(Sender: Tobject);
  74. var w,h:Integer;
  75. x,y:Integer;
  76. begin
  77. x:=0;
  78. y:=0;
  79. w:=background.Width;
  80. h:=background.Height;
  81. while x < PanelBackground.Canvas.Width do
  82. begin
  83. while y < PanelBackground.Canvas.Height do
  84. begin
  85. PanelBackground.Canvas.Draw(x,y,background.Graphic);
  86. y:=y+h;
  87. end;
  88. x:=x+w;
  89. y:=0;
  90. end;
  91. End;
  92. procedure Tform1.Rearrangebooksonscreen;
  93. var i,x,y:Integer;
  94. begin
  95. x:=0;
  96. y:=0;
  97. for i:= 0 to BookList.Count-1 do
  98. begin
  99. if X+Xspace > PanelBackground.Width-bookWidth then
  100. begin
  101. X:=0;
  102. Y:=Y+Yspace+bookHeight+26;
  103. end;
  104. with BookList.Books[i] do
  105. begin
  106. Cover.Left:=X+Xspace;
  107. Cover.Top:=Y+Yspace;
  108. X:=X+Xspace+bookWidth;
  109. end;
  110. end;
  111. PanelBackground.Repaint;
  112. end;
  113. procedure Tform1.Panelbackgroundresize(Sender: Tobject);
  114. begin
  115. RearrangeBooksOnScreen();
  116. EditSearch.Left:=Width-EditSearch.Width-20;
  117. End;
  118. function Tform1.Getbookindexatpoint(X, Y: Integer): Integer;
  119. var i:Integer;
  120. cover:TImage;
  121. begin
  122. for i:=0 to BookList.Count-1 do
  123. begin
  124. cover:=BookList.Books[i].Cover;
  125. if (cover.Left > X) and (cover.Left - bookWidth < X) and (cover.Top <= Y) and (cover.Top + bookHeight > Y) then
  126. begin
  127. result :=i;
  128. exit;
  129. end;
  130. end;
  131. result:=-1;
  132. end;
  133. procedure Tform1.Unselectall;
  134. var i:Integer;
  135. begin
  136. for i:=0 to BookList.Count-1 do
  137. begin
  138. BookList.Books[i].isSelected:=False;
  139. end;
  140. end;
  141. function Tform1.Getcoverindex(Cover: Timage): Integer;
  142. var i:integer;
  143. begin
  144. for i:=0 to Booklist.count-1 do
  145. begin
  146. if Booklist.books[i].Cover = Cover then
  147. begin
  148. result:=i;
  149. exit;
  150. end;
  151. end;
  152. result:=-1;
  153. end;
  154. procedure Tform1.Formclose(Sender: Tobject; var Closeaction: Tcloseaction);
  155. begin
  156. BookList.StoreData(dataPath);
  157. BookList.Destroy;
  158. End;
  159. procedure Tform1.Buttonaddclick(Sender: Tobject);
  160. var
  161. book:TBook;
  162. i:Integer;
  163. begin
  164. if OpenDialog1.Execute then
  165. begin
  166. for i:= 0 to Opendialog1.Files.Count-1 do
  167. begin
  168. book:=TBook.Create(PanelBackground);
  169. book.FilePath:= OpenDialog1.Files.Strings[i];
  170. BookList.AddBook(book);
  171. book.Cover.Width:=bookWidth;
  172. book.Cover.Height:=bookHeight;
  173. book.Cover.Parent:=PanelBackground;
  174. end;
  175. RearrangeBooksOnScreen();
  176. end;
  177. End;
  178. procedure Tform1.Buttonaddmouseenter(Sender: Tobject);
  179. begin
  180. Buttonadd.Picture:=mAddHover;
  181. End;
  182. procedure Tform1.Buttonaddmouseleave(Sender: Tobject);
  183. begin
  184. Buttonadd.Picture:=mAdd;
  185. End;
  186. procedure Tform1.ButtonSettingsClick(Sender: TObject);
  187. begin
  188. SettingsDialog := TSettingsDialog.Create(Self);
  189. try
  190. SettingsDialog.ShowModal;
  191. finally
  192. SettingsDialog.Free;
  193. end;
  194. end;
  195. procedure Tform1.Buttonsettingsmouseenter(Sender: Tobject);
  196. begin
  197. ButtonSettings.Picture:=mGearHover;
  198. End;
  199. procedure Tform1.Buttonsettingsmouseleave(Sender: Tobject);
  200. begin
  201. ButtonSettings.Picture:=mGear;
  202. End;
  203. procedure Tform1.Editsearchenter(Sender: Tobject);
  204. begin
  205. EditSearch.Caption:='';
  206. End;
  207. procedure Tform1.Editsearchexit(Sender: Tobject);
  208. begin
  209. EditSearch.Caption:='Search...';
  210. End;
  211. procedure Tform1.Editsearchkeypress(Sender: Tobject; var Key: Char);
  212. begin
  213. if Key = #13 then
  214. begin
  215. //perform the search here
  216. end;
  217. End;
  218. procedure Tform1.Formcreate(Sender: Tobject);
  219. var
  220. i:integer;
  221. cfgDir, cfgPath, dataDir: String;
  222. ini: TIniFile;
  223. begin
  224. bookWidth:=150;
  225. bookHeight:=200;
  226. Xspace:=40;
  227. Yspace:=25;
  228. Form1.KeyPreview:=True;
  229. ActiveControl:=PanelBackground;
  230. background:=TPicture.Create;
  231. background.LoadFromLazarusResource('shelf');
  232. mAdd:=TPicture.Create;
  233. mAddHover:=Tpicture.Create;
  234. mGear:=Tpicture.Create;
  235. mGearHover:=Tpicture.Create;
  236. mAdd.LoadFromLazarusResource('add');
  237. mAddHover.LoadFromLazarusResource('add_hover');
  238. mGear.LoadFromLazarusResource('gear');
  239. mGearHover.LoadFromLazarusResource('gear_hover');
  240. ButtonAdd.Picture:=mAdd;
  241. ButtonSettings.Picture:=mGear;
  242. // Load config.ini if present to resolve dataPath and options
  243. {$IFDEF MSWINDOWS}
  244. cfgDir := GetEnvironmentVariableUTF8('APPDATA') + DirectorySeparator + 'mybookshelf' + DirectorySeparator;
  245. {$ENDIF}
  246. {$IFDEF UNIX}
  247. cfgDir := GetEnvironmentVariableUTF8('HOME') + DirectorySeparator + '.mybookshelf' + DirectorySeparator;
  248. {$ENDIF}
  249. if not DirectoryExistsUTF8(cfgDir) then CreateDirUTF8(cfgDir);
  250. cfgPath := cfgDir + 'config.ini';
  251. ini := TIniFile.Create(cfgPath);
  252. try
  253. dataDir := ini.ReadString('general', 'data_dir', cfgDir);
  254. // You can also read autoPdfCover if you want it here:
  255. // autoPdfCover := ini.ReadBool('general', 'auto_pdf_cover', True);
  256. finally
  257. ini.Free;
  258. end;
  259. if not DirectoryExistsUTF8(dataDir) then CreateDirUTF8(dataDir);
  260. dataPath := IncludeTrailingPathDelimiter(dataDir) + 'data.dat';
  261. BookList:=TBookCollection.Create;
  262. if FileExistsUTF8(dataPath) then
  263. BookList.LoadData(dataPath, PanelBackground);
  264. for i:=0 to BookList.Count-1 do
  265. begin
  266. with BookList.Books[i] do
  267. begin
  268. Cover.Width:=bookWidth;
  269. Cover.Height:=bookHeight;
  270. Cover.Parent:=PanelBackground;
  271. end;
  272. end;
  273. RearrangeBooksOnScreen();
  274. End;
  275. procedure Tform1.Formkeydown(Sender: Tobject; var Key: Word; Shift: Tshiftstate);
  276. var i:Integer;
  277. begin
  278. if Key = VK_DELETE then
  279. begin
  280. for i:= BookList.Count-1 downto 0 do
  281. begin
  282. if BookList.Books[i].isSelected = True then
  283. begin
  284. BookList.Books[i].Cover.Free;
  285. BookList.Remove(BookList.Books[i]);
  286. end;
  287. end;
  288. RearrangeBooksOnScreen();
  289. end;
  290. End;
  291. initialization
  292. {$i mybookshelf.lrs}
  293. end.