Kaynağa Gözat

Adding many features and improving books positioning on screen

Bernardo Magri 8 yıl önce
ebeveyn
işleme
4bd7574ac9
4 değiştirilmiş dosya ile 195 ekleme ve 109 silme
  1. 6 0
      src/bookcollection.pas
  2. 27 6
      src/main.lfm
  3. 109 50
      src/main.pas
  4. 53 53
      src/myBookShelf.lps

+ 6 - 0
src/bookcollection.pas

@@ -22,6 +22,7 @@ TBookCollection = class(TObject)
     procedure LoadData(path:String; parent:TComponent);
     procedure AddBook(book: Tbook);
     property  Books[Index: Integer]:TBook read Get;
+    procedure Remove(book:TBook);
     function Count:Integer;
     constructor Create;
     destructor Destroy;
@@ -42,6 +43,11 @@ begin
   mList.Add(book);
 End;
 
+procedure Tbookcollection.Remove(book:Tbook);
+begin
+  mList.Remove(book);
+end;
+
 function Tbookcollection.Count: Integer;
 begin
   result:=mList.Count;

+ 27 - 6
src/main.lfm

@@ -8,11 +8,12 @@ object Form1: TForm1
   ClientWidth = 817
   OnClose = FormClose
   OnCreate = FormCreate
+  OnKeyDown = FormKeyDown
   OnPaint = FormPaint
   LCLVersion = '1.6.4.0'
   object ImageToolBar: TImage
     Left = 0
-    Height = 36
+    Height = 48
     Top = 0
     Width = 817
     Align = alTop
@@ -420,9 +421,9 @@ object Form1: TForm1
   end
   object ButtonAdd: TImage
     Left = 8
-    Height = 36
-    Top = 0
-    Width = 36
+    Height = 40
+    Top = 4
+    Width = 40
     OnClick = ButtonAddClick
     Picture.Data = {
       1754506F727461626C654E6574776F726B47726170686963F521000089504E47
@@ -703,16 +704,36 @@ object Form1: TForm1
   end
   object PanelBackground: TScrollBox
     Left = 0
-    Height = 537
-    Top = 36
+    Height = 525
+    Top = 48
     Width = 817
     HorzScrollBar.Page = 1
+    HorzScrollBar.Visible = False
+    VertScrollBar.Increment = 1
     VertScrollBar.Page = 1
+    VertScrollBar.Smooth = True
     Align = alClient
     TabOrder = 0
+    OnClick = PanelBackgroundClick
     OnResize = PanelBackgroundResize
     OnPaint = PanelBackgroundPaint
   end
+  object EditSearch: TEdit
+    Left = 608
+    Height = 29
+    Top = 10
+    Width = 176
+    AutoSelect = False
+    BorderStyle = bsNone
+    OnEnter = EditSearchEnter
+    OnExit = EditSearchExit
+    OnKeyPress = EditSearchKeyPress
+    ParentShowHint = False
+    TabStop = False
+    TabOrder = 1
+    Text = 'Search...'
+    TextHintFontColor = clBtnText
+  end
   object OpenDialog1: TOpenDialog
     DefaultExt = '.pdf'
     Filter = 'PDF Books|*.pdf|DJVU Books|*.djvu|EPUB Books|*.epub'

+ 109 - 50
src/main.pas

@@ -6,7 +6,7 @@ interface
 
 uses
   Classes, Sysutils, Fileutil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
-  ComCtrls, Book, BookCollection, LCLIntf, LResources;
+  ComCtrls, Book, BookCollection, LCLIntf, LResources, StdCtrls, LCLType;
 
 
 type
@@ -14,17 +14,23 @@ type
   { Tform1 }
 
   Tform1 = class(Tform)
+    EditSearch: Tedit;
     Image1: Timage;
     ImageToolBar: Timage;
     ButtonAdd: Timage;
     Opendialog1: Topendialog;
     PanelBackground: Tscrollbox;
     procedure Buttonaddclick(Sender: Tobject);
+    procedure Editsearchenter(Sender: Tobject);
+    procedure Editsearchexit(Sender: Tobject);
+    procedure Editsearchkeypress(Sender: Tobject; var Key: Char);
     procedure Formclose(Sender: Tobject; var Closeaction: Tcloseaction);
     procedure Formcreate(Sender: Tobject);
+    procedure Formkeydown(Sender: Tobject; var Key: Word; Shift: Tshiftstate);
     procedure Formpaint(Sender: Tobject);
+    procedure Panelbackgroundclick(Sender: Tobject);
     procedure Panelbackgroundpaint(Sender: Tobject);
-    //procedure DrawBooks();
+    procedure RearrangeBooksOnScreen();
     procedure Panelbackgroundresize(Sender: Tobject);
   private
     { private declarations }
@@ -35,7 +41,7 @@ type
 var
   Form1: Tform1;
   BookList:TBookCollection;
-  X,Y, Xdelta, Ydelta:integer;
+  Xspace, Yspace:integer;
   dataPath:String;
   background:TPicture;
   bookWidth,bookHeight:Integer;
@@ -52,50 +58,66 @@ begin
  //myBook.DrawCover(PanelBackground.Canvas);
 End;
 
+procedure Tform1.Panelbackgroundclick(Sender: Tobject);
+var i:integer;
+begin
+ ActiveControl:=PanelBackground;
+
+ for i:=0 to BookList.Count-1 do
+ begin
+  BookList.Books[i].isSelected:=False;
+ end;
+ PanelBackground.Repaint;
+
+End;
+
 procedure Tform1.Panelbackgroundpaint(Sender: Tobject);
 begin
  PanelBackground.Canvas.StretchDraw(PanelBackground.Canvas.ClipRect, background.Graphic);
 End;
 
-//procedure Tform1.Drawbooks();
-//var i:integer;
-//    tempBook:TBook;
-//begin
-//   for i:=0 to BookList.Count-1 do
-// begin
-//  tempBook:=BookList.Books[i];
-//  if X+Xdelta > PanelBackground.Width-150 then
-//  begin
-//    X:=0;
-//    Y:=Y+Ydelta+200;
-//  end;
-//  tempBook.Cover.Left:=X+Xdelta;
-//  tempBook.Cover.Top:=Y+Ydelta;
-//  tempBook.Cover.Width:=150;
-//  tempBook.Cover.Height:=200;
-//  if tempBook.Cover.Parent=nil then
-//     tempBook.Cover.Parent:=PanelBackground;
-//  X:=X+Xdelta+150;
-// end;
-//end;
+procedure Tform1.Rearrangebooksonscreen;
+var i,x,y:Integer;
+begin
+
+ x:=0;
+ y:=0;
+
+ for i:= 0 to BookList.Count-1 do
+ begin
+    if X+Xspace > PanelBackground.Width-bookWidth then
+    begin
+      X:=0;
+      Y:=Y+Yspace+bookHeight;
+    end;
+    with BookList.Books[i] do
+    begin
+      Cover.Left:=X+Xspace;
+      Cover.Top:=Y+Yspace;
+      X:=X+Xspace+bookWidth;
+    end;
+  end;
+ PanelBackground.Repaint;
+
+end;
 
 procedure Tform1.Panelbackgroundresize(Sender: Tobject);
 begin
- // DrawBooks();
-End;
+ RearrangeBooksOnScreen();
+
+ EditSearch.Left:=Width-EditSearch.Width-20;
+ End;
 
 
 procedure Tform1.Formclose(Sender: Tobject; var Closeaction: Tcloseaction);
 begin
 BookList.StoreData(dataPath);
 BookList.Destroy;
-
 End;
 
 procedure Tform1.Buttonaddclick(Sender: Tobject);
 var
   book:TBook;
-  panel:TPanel;
 begin
 
 if OpenDialog1.Execute then
@@ -103,59 +125,96 @@ begin
   book:=TBook.Create(PanelBackground);
   book.FilePath:= OpenDialog1.Filename;
   BookList.AddBook(book);
-
-  book.Cover.Left:=X+Xdelta;
-  book.Cover.Top:=Y+Ydelta;
-  book.Cover.Width:=150;
-  book.Cover.Height:=200;
+  book.Cover.Width:=bookWidth;
+  book.Cover.Height:=bookHeight;
   book.Cover.Parent:=PanelBackground;
-  X:=X+Xdelta+150;
+  RearrangeBooksOnScreen();
+end;
+End;
 
+procedure Tform1.Editsearchenter(Sender: Tobject);
+begin
+EditSearch.Caption:='';
+
+End;
+
+procedure Tform1.Editsearchexit(Sender: Tobject);
+begin
+  EditSearch.Caption:='Search...';
+End;
+
+procedure Tform1.Editsearchkeypress(Sender: Tobject; var Key: Char);
+begin
+if Key = #13 then
+begin
+   //perform the search here
 end;
+
 End;
 
 procedure Tform1.Formcreate(Sender: Tobject);
-var i:integer;
-    tempBook:TBook;
+var i, X, Y:integer;
 begin
- Xdelta:=10;
- Ydelta:=10;
+ bookWidth:=150;
+ bookHeight:=200;
+ Xspace:=40;
+ Yspace:=30;
  X:=0;
  Y:=0;
 
+ Form1.KeyPreview:=True;
+ ActiveControl:=PanelBackground;
+
+
  background:=TPicture.Create;
  background.LoadFromLazarusResource('back');
 
+ //works only for linux and MacOS
  DataPath:= GetEnvironmentVariable('HOME') + '/.mybookshelf/data.dat'; //fix the data store dir
 
 if not DirectoryExists(GetEnvironmentVariable('HOME') + '/.mybookshelf/') then
     CreateDir(GetEnvironmentVariable('HOME') + '/.mybookshelf/');
 
  BookList:=TBookCollection.Create;
+
  if FileExists(dataPath) then
     BookList.LoadData(dataPath, PanelBackground);
 
 
-   for i:=0 to BookList.Count-1 do
+ for i:=0 to BookList.Count-1 do
  begin
-  tempBook:=BookList.Books[i];
-  if X+Xdelta > PanelBackground.Width-150 then
+  with BookList.Books[i] do
   begin
-    X:=0;
-    Y:=Y+Ydelta+200;
+    Cover.Width:=bookWidth;
+    Cover.Height:=bookHeight;
+    Cover.Parent:=PanelBackground;
   end;
-  tempBook.Cover.Left:=X+Xdelta;
-  tempBook.Cover.Top:=Y+Ydelta;
-  tempBook.Cover.Width:=150;
-  tempBook.Cover.Height:=200;
-  if tempBook.Cover.Parent=nil then
-     tempBook.Cover.Parent:=PanelBackground;
-  X:=X+Xdelta+150;
  end;
 
+ RearrangeBooksOnScreen();
+
+End;
+
+procedure Tform1.Formkeydown(Sender: Tobject; var Key: Word; Shift: Tshiftstate);
+var i:Integer;
+begin
+
+ if Key = VK_DELETE then
+ begin
+   for i:= BookList.Count-1 downto 0 do
+   begin
+    if BookList.Books[i].isSelected = True then
+    begin
+       BookList.Books[i].Cover.Free;
+       BookList.Remove(BookList.Books[i]);
+    end;
+   end;
+   RearrangeBooksOnScreen();
+ end;
 
 End;
 
+
 initialization
 {$i mybookshelf.lrs}
 

+ 53 - 53
src/myBookShelf.lps

@@ -8,7 +8,7 @@
         <Filename Value="myBookShelf.lpr"/>
         <IsPartOfProject Value="True"/>
         <CursorPos Y="20"/>
-        <UsageCount Value="38"/>
+        <UsageCount Value="42"/>
         <Loaded Value="True"/>
       </Unit0>
       <Unit1>
@@ -19,9 +19,9 @@
         <ResourceBaseClass Value="Form"/>
         <IsVisibleTab Value="True"/>
         <EditorIndex Value="4"/>
-        <TopLine Value="88"/>
-        <CursorPos X="7" Y="27"/>
-        <UsageCount Value="38"/>
+        <TopLine Value="61"/>
+        <CursorPos X="25" Y="70"/>
+        <UsageCount Value="42"/>
         <Loaded Value="True"/>
         <LoadedDesigner Value="True"/>
       </Unit1>
@@ -31,7 +31,7 @@
         <UnitName Value="Book"/>
         <EditorIndex Value="2"/>
         <CursorPos X="71" Y="30"/>
-        <UsageCount Value="38"/>
+        <UsageCount Value="42"/>
         <Loaded Value="True"/>
       </Unit2>
       <Unit3>
@@ -39,9 +39,9 @@
         <IsPartOfProject Value="True"/>
         <UnitName Value="bookCollection"/>
         <EditorIndex Value="3"/>
-        <TopLine Value="14"/>
-        <CursorPos X="71" Y="109"/>
-        <UsageCount Value="35"/>
+        <TopLine Value="45"/>
+        <CursorPos X="15" Y="48"/>
+        <UsageCount Value="39"/>
         <Loaded Value="True"/>
       </Unit3>
       <Unit4>
@@ -97,7 +97,7 @@
       <Unit11>
         <Filename Value="main.lfm"/>
         <EditorIndex Value="1"/>
-        <UsageCount Value="11"/>
+        <UsageCount Value="13"/>
         <Loaded Value="True"/>
         <DefaultSyntaxHighlighter Value="LFM"/>
       </Unit11>
@@ -113,123 +113,123 @@
     <JumpHistory Count="30" HistoryIndex="29">
       <Position1>
         <Filename Value="main.pas"/>
-        <Caret Line="115" TopLine="77"/>
+        <Caret Line="60" Column="61" TopLine="39"/>
       </Position1>
       <Position2>
-        <Filename Value="myBookShelf.lpr"/>
-        <Caret Line="19"/>
+        <Filename Value="main.pas"/>
+        <Caret Line="123" Column="9" TopLine="97"/>
       </Position2>
       <Position3>
-        <Filename Value="bookcollection.pas"/>
-        <Caret Line="102" TopLine="80"/>
+        <Filename Value="main.pas"/>
+        <Caret Line="122" Column="9" TopLine="96"/>
       </Position3>
       <Position4>
-        <Filename Value="bookcollection.pas"/>
-        <Caret Line="104" TopLine="80"/>
+        <Filename Value="main.pas"/>
+        <Caret Line="27" Column="25" TopLine="7"/>
       </Position4>
       <Position5>
-        <Filename Value="bookcollection.pas"/>
-        <Caret Line="105" TopLine="80"/>
+        <Filename Value="main.pas"/>
+        <Caret Line="57" Column="45" TopLine="44"/>
       </Position5>
       <Position6>
-        <Filename Value="bookcollection.pas"/>
-        <Caret Line="106" TopLine="80"/>
+        <Filename Value="main.pas"/>
+        <Caret Line="27" Column="26" TopLine="6"/>
       </Position6>
       <Position7>
-        <Filename Value="book.pas"/>
-        <Caret Line="46" Column="46"/>
+        <Filename Value="main.pas"/>
+        <Caret Line="60" Column="29" TopLine="25"/>
       </Position7>
       <Position8>
         <Filename Value="main.pas"/>
-        <Caret Line="45" Column="23" TopLine="19"/>
+        <Caret Line="63" TopLine="45"/>
       </Position8>
       <Position9>
         <Filename Value="main.pas"/>
-        <Caret Line="113" Column="42" TopLine="92"/>
+        <Caret Line="64" TopLine="45"/>
       </Position9>
       <Position10>
         <Filename Value="main.pas"/>
-        <Caret Line="114" Column="42" TopLine="93"/>
+        <Caret Line="66" TopLine="45"/>
       </Position10>
       <Position11>
         <Filename Value="main.pas"/>
-        <Caret Line="113" Column="42" TopLine="92"/>
+        <Caret Line="67" Column="32" TopLine="45"/>
       </Position11>
       <Position12>
         <Filename Value="main.pas"/>
-        <Caret Line="112" Column="42" TopLine="91"/>
+        <Caret Line="61" Column="61" TopLine="49"/>
       </Position12>
       <Position13>
-        <Filename Value="main.pas"/>
-        <Caret Line="122" Column="49" TopLine="92"/>
+        <Filename Value="book.pas"/>
+        <Caret Line="31" Column="27" TopLine="12"/>
       </Position13>
       <Position14>
-        <Filename Value="main.pas"/>
-        <Caret Line="30" Column="9" TopLine="9"/>
+        <Filename Value="book.pas"/>
+        <Caret Line="34" Column="31" TopLine="23"/>
       </Position14>
       <Position15>
-        <Filename Value="main.pas"/>
-        <Caret Line="92" Column="44" TopLine="62"/>
+        <Filename Value="book.pas"/>
+        <Caret Line="95" Column="61" TopLine="55"/>
       </Position15>
       <Position16>
         <Filename Value="main.pas"/>
-        <Caret Line="60" Column="61" TopLine="39"/>
+        <Caret Line="27" Column="39"/>
       </Position16>
       <Position17>
         <Filename Value="main.pas"/>
-        <Caret Line="123" Column="9" TopLine="97"/>
+        <Caret Line="74" Column="11" TopLine="51"/>
       </Position17>
       <Position18>
         <Filename Value="main.pas"/>
-        <Caret Line="122" Column="9" TopLine="96"/>
+        <Caret Line="180" Column="31" TopLine="155"/>
       </Position18>
       <Position19>
         <Filename Value="main.pas"/>
-        <Caret Line="27" Column="25" TopLine="7"/>
+        <Caret Line="133" Column="34" TopLine="123"/>
       </Position19>
       <Position20>
         <Filename Value="main.pas"/>
-        <Caret Line="57" Column="45" TopLine="44"/>
+        <Caret Line="93" Column="43" TopLine="64"/>
       </Position20>
       <Position21>
         <Filename Value="main.pas"/>
-        <Caret Line="27" Column="26" TopLine="6"/>
+        <Caret Line="127" Column="4" TopLine="102"/>
       </Position21>
       <Position22>
         <Filename Value="main.pas"/>
-        <Caret Line="60" Column="29" TopLine="25"/>
+        <Caret Line="91" Column="43" TopLine="68"/>
       </Position22>
       <Position23>
         <Filename Value="main.pas"/>
-        <Caret Line="63" TopLine="45"/>
+        <Caret Line="27" Column="79"/>
       </Position23>
       <Position24>
         <Filename Value="main.pas"/>
-        <Caret Line="64" TopLine="45"/>
+        <Caret Line="170" Column="4" TopLine="135"/>
       </Position24>
       <Position25>
         <Filename Value="main.pas"/>
-        <Caret Line="66" TopLine="45"/>
+        <Caret Line="171" Column="22" TopLine="139"/>
       </Position25>
       <Position26>
-        <Filename Value="main.pas"/>
-        <Caret Line="67" Column="32" TopLine="45"/>
+        <Filename Value="bookcollection.pas"/>
+        <Caret Line="25" Column="37"/>
       </Position26>
       <Position27>
-        <Filename Value="main.pas"/>
-        <Caret Line="61" Column="61" TopLine="49"/>
+        <Filename Value="bookcollection.pas"/>
+        <Caret Line="49" Column="6" TopLine="22"/>
       </Position27>
       <Position28>
-        <Filename Value="book.pas"/>
-        <Caret Line="31" Column="27" TopLine="12"/>
+        <Filename Value="main.pas"/>
+        <Caret Line="145" Column="32" TopLine="139"/>
       </Position28>
       <Position29>
-        <Filename Value="book.pas"/>
-        <Caret Line="34" Column="31" TopLine="23"/>
+        <Filename Value="main.pas"/>
+        <Caret Line="123" Column="23" TopLine="121"/>
       </Position29>
       <Position30>
-        <Filename Value="book.pas"/>
-        <Caret Line="95" Column="61" TopLine="55"/>
+        <Filename Value="main.pas"/>
+        <Caret Line="135" Column="34" TopLine="135"/>
       </Position30>
     </JumpHistory>
   </ProjectSession>