Procházet zdrojové kódy

changing books order using drag-and-drop

Bernardo Magri před 8 roky
rodič
revize
8143768c4c
5 změnil soubory, kde provedl 151 přidání a 96 odebrání
  1. 4 0
      src/book.pas
  2. 9 3
      src/bookcollection.pas
  3. 2 0
      src/main.lfm
  4. 61 19
      src/main.pas
  5. 75 74
      src/myBookShelf.lps

+ 4 - 0
src/book.pas

@@ -22,8 +22,11 @@ type
       mImageHeight : Integer;
       mImageWidth : Integer;
       mIsSelected: Boolean;
+      mLeft:Integer;
+      mTop:Integer;
       procedure Setfile(Avalue: String);
       procedure Setimage(Avalue: String);
+
     public
       constructor Create(parent:TComponent);
       procedure Bookmousedown(Sender: Tobject; Button: Tmousebutton;
@@ -100,6 +103,7 @@ begin
   if Button = TMouseButton.mbLeft then
      begin
         mIsSelected:= not mIsSelected;
+        mCover.BeginDrag(True);
         mCover.Repaint;
      end;
 End;

+ 9 - 3
src/bookcollection.pas

@@ -13,7 +13,7 @@ type
 
 TBookCollection = class(TObject)
   private
-    mList : TList;
+    mList : TFPList;
     mDataPath:String;
     function Get(Index: Integer): Tbook;
 
@@ -24,6 +24,7 @@ TBookCollection = class(TObject)
     property  Books[Index: Integer]:TBook read Get;
     procedure Remove(book:TBook);
     function Count:Integer;
+    procedure SwapBooks(Source,Dest:Integer);
     constructor Create;
     destructor Destroy;
 
@@ -43,7 +44,7 @@ begin
   mList.Add(book);
 End;
 
-procedure Tbookcollection.Remove(book:Tbook);
+procedure Tbookcollection.Remove(Book: Tbook);
 begin
   mList.Remove(book);
 end;
@@ -53,9 +54,14 @@ begin
   result:=mList.Count;
 end;
 
+procedure Tbookcollection.Swapbooks(Source, Dest: Integer);
+begin
+ mList.Move(Source,Dest);
+end;
+
 constructor Tbookcollection.Create;
 begin
-  mList:=TList.Create;
+  mList:=TFPList.Create;
 end;
 
 destructor Tbookcollection.Destroy;

+ 2 - 0
src/main.lfm

@@ -497,6 +497,8 @@ object Form1: TForm1
     Align = alClient
     TabOrder = 0
     OnClick = PanelBackgroundClick
+    OnDragDrop = PanelBackgroundDragDrop
+    OnDragOver = PanelBackgroundDragOver
     OnResize = PanelBackgroundResize
     OnPaint = PanelBackgroundPaint
   end

+ 61 - 19
src/main.pas

@@ -29,9 +29,15 @@ type
     procedure Formkeydown(Sender: Tobject; var Key: Word; Shift: Tshiftstate);
     procedure Formpaint(Sender: Tobject);
     procedure Panelbackgroundclick(Sender: Tobject);
+    procedure Panelbackgrounddragdrop(Sender, Source: Tobject; X, Y: Integer);
+    procedure Panelbackgrounddragover(Sender, Source: Tobject; X, Y: Integer;
+      State: Tdragstate; var Accept: Boolean);
     procedure Panelbackgroundpaint(Sender: Tobject);
     procedure RearrangeBooksOnScreen();
     procedure Panelbackgroundresize(Sender: Tobject);
+    function getBookIndexAtPoint(X,Y:Integer):Integer;
+    procedure UnselectAll;
+    function getCoverIndex(cover:TImage):Integer;
   private
     { private declarations }
   public
@@ -59,35 +65,32 @@ begin
 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;
+ UnselectAll;
  PanelBackground.Repaint;
-
 End;
 
-procedure Tform1.Panelbackgroundpaint(Sender: Tobject);
-var x,y:Integer;
+procedure Tform1.Panelbackgrounddragdrop(Sender, Source: Tobject; X, Y: Integer);
+var src,dest:integer;
 begin
+ src:=getCoverIndex(TImage(Source));
+ dest:=getBookIndexAtPoint(X,Y);
+   if (src > -1) and (dest > -1) then BookList.SwapBooks(src,dest);
+   UnselectAll;
+   RearrangeBooksOnScreen();
+End;
 
- //PanelBackground.Canvas.Draw(PanelBackground.Canvas.ClipRect.Left,PanelBackground.Canvas.ClipRect.Top, background.Graphic);
-
- //x:=background.Graphic.Width;
- //y:=0;
+procedure Tform1.Panelbackgrounddragover(Sender, Source: Tobject; X,
+  Y: Integer; State: Tdragstate; var Accept: Boolean);
+begin
+ Accept:=True;
+End;
 
- //while PanelBackground.Canvas.Width > background.Graphic.Width+x do
- //begin
+procedure Tform1.Panelbackgroundpaint(Sender: Tobject);
+begin
   PanelBackground.Canvas.StretchDraw(PanelBackground.Canvas.ClipRect, background.Graphic);
- // x:= background.Graphic.Width;
- //end;
-
- //if PanelBackground.Canvas.ClipRect.Width > background.Graphic.Width then
- //   PanelBackground.Canvas.Draw(PanelBackground.Canvas.ClipRect.Left + background.Graphic.Width, 0, background.Graphic);
 End;
 
 procedure Tform1.Rearrangebooksonscreen;
@@ -122,6 +125,45 @@ begin
  EditSearch.Left:=Width-EditSearch.Width-20;
  End;
 
+function Tform1.Getbookindexatpoint(X, Y: Integer): Integer;
+var i:Integer;
+    cover:TImage;
+begin
+ for i:=0 to BookList.Count-1 do
+ begin
+   cover:=BookList.Books[i].Cover;
+   if (cover.Left > X) and (cover.Left - bookWidth < X) and (cover.Top <= Y) and (cover.Top + bookHeight > Y) then
+   begin
+     result :=i;
+     exit;
+   end;
+ end;
+ result:=-1;
+end;
+
+procedure Tform1.Unselectall;
+var i:Integer;
+begin
+ for i:=0 to BookList.Count-1 do
+ begin
+  BookList.Books[i].isSelected:=False;
+ end;
+end;
+
+function Tform1.Getcoverindex(Cover: Timage): Integer;
+var i:integer;
+begin
+ for i:=0 to Booklist.count-1 do
+ begin
+  if Booklist.books[i].Cover = Cover then
+  begin
+    result:=i;
+    exit;
+  end;
+ end;
+ result:=-1;
+end;
+
 
 procedure Tform1.Formclose(Sender: Tobject; var Closeaction: Tcloseaction);
 begin

+ 75 - 74
src/myBookShelf.lps

@@ -8,7 +8,7 @@
         <Filename Value="myBookShelf.lpr"/>
         <IsPartOfProject Value="True"/>
         <CursorPos Y="21"/>
-        <UsageCount Value="56"/>
+        <UsageCount Value="62"/>
         <Loaded Value="True"/>
       </Unit0>
       <Unit1>
@@ -17,11 +17,9 @@
         <ComponentName Value="Form1"/>
         <HasResources Value="True"/>
         <ResourceBaseClass Value="Form"/>
-        <IsVisibleTab Value="True"/>
         <EditorIndex Value="4"/>
-        <TopLine Value="53"/>
-        <CursorPos X="33" Y="85"/>
-        <UsageCount Value="56"/>
+        <CursorPos X="34" Y="78"/>
+        <UsageCount Value="62"/>
         <Loaded Value="True"/>
         <LoadedDesigner Value="True"/>
       </Unit1>
@@ -30,17 +28,20 @@
         <IsPartOfProject Value="True"/>
         <UnitName Value="Book"/>
         <EditorIndex Value="2"/>
-        <CursorPos X="63" Y="4"/>
-        <UsageCount Value="56"/>
+        <TopLine Value="43"/>
+        <CursorPos X="124" Y="77"/>
+        <UsageCount Value="62"/>
         <Loaded Value="True"/>
       </Unit2>
       <Unit3>
         <Filename Value="bookcollection.pas"/>
         <IsPartOfProject Value="True"/>
         <UnitName Value="bookCollection"/>
+        <IsVisibleTab Value="True"/>
         <EditorIndex Value="3"/>
-        <CursorPos X="22" Y="125"/>
-        <UsageCount Value="53"/>
+        <TopLine Value="78"/>
+        <CursorPos X="3" Y="44"/>
+        <UsageCount Value="59"/>
         <Loaded Value="True"/>
       </Unit3>
       <Unit4>
@@ -53,7 +54,7 @@
         <EditorIndex Value="5"/>
         <TopLine Value="48"/>
         <CursorPos X="2" Y="67"/>
-        <UsageCount Value="34"/>
+        <UsageCount Value="40"/>
         <Loaded Value="True"/>
         <LoadedDesigner Value="True"/>
       </Unit4>
@@ -62,28 +63,28 @@
         <EditorIndex Value="-1"/>
         <TopLine Value="354"/>
         <CursorPos Y="378"/>
-        <UsageCount Value="9"/>
+        <UsageCount Value="8"/>
       </Unit5>
       <Unit6>
         <Filename Value="/usr/lib/lazarus/1.6.4/lcl/include/lclintf.inc"/>
         <EditorIndex Value="-1"/>
         <TopLine Value="254"/>
         <CursorPos Y="275"/>
-        <UsageCount Value="8"/>
+        <UsageCount Value="7"/>
       </Unit6>
       <Unit7>
         <Filename Value="/usr/lib/lazarus/1.6.4/lcl/interfaces/gtk2/gtk2winapi.inc"/>
         <EditorIndex Value="-1"/>
         <TopLine Value="4718"/>
         <CursorPos Y="4740"/>
-        <UsageCount Value="8"/>
+        <UsageCount Value="7"/>
       </Unit7>
       <Unit8>
         <Filename Value="/usr/lib/lazarus/1.6.4/lcl/interfaces/gtk2/gtk2widgetset.inc"/>
         <EditorIndex Value="-1"/>
         <TopLine Value="5406"/>
         <CursorPos Y="5428"/>
-        <UsageCount Value="8"/>
+        <UsageCount Value="7"/>
       </Unit8>
       <Unit9>
         <Filename Value="/usr/lib/lazarus/1.6.4/lcl/dynhasharray.pp"/>
@@ -91,26 +92,26 @@
         <EditorIndex Value="-1"/>
         <TopLine Value="598"/>
         <CursorPos Y="620"/>
-        <UsageCount Value="8"/>
+        <UsageCount Value="7"/>
       </Unit9>
       <Unit10>
         <Filename Value="/usr/lib/lazarus/1.6.4/lcl/include/customform.inc"/>
         <EditorIndex Value="-1"/>
         <TopLine Value="133"/>
         <CursorPos Y="161"/>
-        <UsageCount Value="9"/>
+        <UsageCount Value="8"/>
       </Unit10>
       <Unit11>
         <Filename Value="/usr/lib/lazarus/1.6.4/lcl/include/application.inc"/>
         <EditorIndex Value="-1"/>
         <TopLine Value="2183"/>
         <CursorPos Y="2203"/>
-        <UsageCount Value="9"/>
+        <UsageCount Value="8"/>
       </Unit11>
       <Unit12>
         <Filename Value="main.lfm"/>
         <EditorIndex Value="1"/>
-        <UsageCount Value="19"/>
+        <UsageCount Value="22"/>
         <Loaded Value="True"/>
         <DefaultSyntaxHighlighter Value="LFM"/>
       </Unit12>
@@ -120,129 +121,129 @@
         <EditorIndex Value="-1"/>
         <TopLine Value="200"/>
         <CursorPos Y="238"/>
-        <UsageCount Value="9"/>
+        <UsageCount Value="8"/>
       </Unit13>
     </Units>
     <JumpHistory Count="30" HistoryIndex="29">
       <Position1>
         <Filename Value="unitbookdialog.pas"/>
-        <Caret Line="9" Column="26" TopLine="2"/>
+        <Caret Line="55" Column="3" TopLine="52"/>
       </Position1>
       <Position2>
         <Filename Value="unitbookdialog.pas"/>
-        <Caret Line="25" Column="18" TopLine="2"/>
+        <Caret Line="61" Column="3" TopLine="42"/>
       </Position2>
       <Position3>
         <Filename Value="unitbookdialog.pas"/>
-        <Caret Line="47" Column="54" TopLine="10"/>
+        <Caret Line="65" Column="64" TopLine="43"/>
       </Position3>
       <Position4>
         <Filename Value="book.pas"/>
-        <Caret Line="84" Column="51" TopLine="58"/>
+        <Caret Line="97" Column="26" TopLine="73"/>
       </Position4>
       <Position5>
-        <Filename Value="unitbookdialog.pas"/>
-        <Caret Line="24" Column="36"/>
+        <Filename Value="main.pas"/>
+        <Caret Line="77" Column="25" TopLine="62"/>
       </Position5>
       <Position6>
-        <Filename Value="book.pas"/>
-        <Caret Line="84" Column="41" TopLine="62"/>
+        <Filename Value="main.pas"/>
+        <Caret Line="92" Column="33" TopLine="54"/>
       </Position6>
       <Position7>
-        <Filename Value="unitbookdialog.pas"/>
-        <Caret Line="50" Column="46" TopLine="12"/>
+        <Filename Value="main.pas"/>
+        <Caret Line="36" Column="50" TopLine="15"/>
       </Position7>
       <Position8>
-        <Filename Value="unitbookdialog.pas"/>
-        <Caret Line="51" Column="46" TopLine="12"/>
+        <Filename Value="main.pas"/>
+        <Caret Line="128" Column="2" TopLine="107"/>
       </Position8>
       <Position9>
-        <Filename Value="unitbookdialog.pas"/>
-        <Caret Line="50" Column="46" TopLine="12"/>
+        <Filename Value="main.pas"/>
+        <Caret Line="82" Column="25" TopLine="60"/>
       </Position9>
       <Position10>
-        <Filename Value="unitbookdialog.pas"/>
-        <Caret Line="58" Column="10" TopLine="17"/>
+        <Filename Value="main.pas"/>
+        <Caret Line="129" Column="9" TopLine="108"/>
       </Position10>
       <Position11>
-        <Filename Value="bookcollection.pas"/>
-        <Caret Line="94" Column="26" TopLine="77"/>
+        <Filename Value="main.pas"/>
+        <Caret Line="133" Column="38" TopLine="110"/>
       </Position11>
       <Position12>
-        <Filename Value="unitbookdialog.pas"/>
-        <Caret Line="67" Column="29" TopLine="26"/>
+        <Filename Value="main.pas"/>
+        <Caret Line="37" Column="46" TopLine="19"/>
       </Position12>
       <Position13>
-        <Filename Value="book.pas"/>
-        <Caret Line="84" Column="22" TopLine="55"/>
+        <Filename Value="main.pas"/>
+        <Caret Line="147" Column="25" TopLine="122"/>
       </Position13>
       <Position14>
-        <Filename Value="unitbookdialog.pas"/>
-        <Caret Line="62" Column="37" TopLine="32"/>
+        <Filename Value="bookcollection.pas"/>
+        <Caret Line="16" Column="16"/>
       </Position14>
       <Position15>
-        <Filename Value="unitbookdialog.pas"/>
-        <Caret Line="63" Column="37" TopLine="33"/>
+        <Filename Value="main.pas"/>
+        <Caret Line="143" Column="32" TopLine="3"/>
       </Position15>
       <Position16>
-        <Filename Value="unitbookdialog.pas"/>
-        <Caret Line="82" Column="38" TopLine="41"/>
+        <Filename Value="bookcollection.pas"/>
+        <Caret Line="27" Column="46" TopLine="4"/>
       </Position16>
       <Position17>
-        <Filename Value="unitbookdialog.pas"/>
-        <Caret Line="71" Column="9" TopLine="45"/>
+        <Filename Value="book.pas"/>
+        <Caret Line="89" Column="34" TopLine="63"/>
       </Position17>
       <Position18>
-        <Filename Value="unitbookdialog.pas"/>
-        <Caret Line="72" Column="9" TopLine="46"/>
+        <Filename Value="main.pas"/>
+        <Caret Line="37" Column="34" TopLine="9"/>
       </Position18>
       <Position19>
-        <Filename Value="unitbookdialog.pas"/>
-        <Caret Line="73" Column="9" TopLine="47"/>
+        <Filename Value="main.pas"/>
+        <Caret Line="85" Column="38" TopLine="56"/>
       </Position19>
       <Position20>
-        <Filename Value="unitbookdialog.pas"/>
-        <Caret Line="74" Column="9" TopLine="48"/>
+        <Filename Value="book.pas"/>
+        <Caret Line="109" Column="32" TopLine="80"/>
       </Position20>
       <Position21>
-        <Filename Value="unitbookdialog.pas"/>
-        <Caret Line="75" Column="9" TopLine="49"/>
+        <Filename Value="main.pas"/>
+        <Caret Line="83" Column="19" TopLine="58"/>
       </Position21>
       <Position22>
-        <Filename Value="unitbookdialog.pas"/>
-        <Caret Line="76" Column="9"/>
+        <Filename Value="main.pas"/>
+        <Caret Line="38" Column="55" TopLine="19"/>
       </Position22>
       <Position23>
-        <Filename Value="unitbookdialog.pas"/>
-        <Caret Line="54" Column="28" TopLine="35"/>
+        <Filename Value="main.pas"/>
+        <Caret Line="81" Column="22" TopLine="62"/>
       </Position23>
       <Position24>
-        <Filename Value="unitbookdialog.pas"/>
-        <Caret Line="55" Column="3" TopLine="52"/>
+        <Filename Value="main.pas"/>
+        <Caret Line="38" Column="27" TopLine="16"/>
       </Position24>
       <Position25>
-        <Filename Value="unitbookdialog.pas"/>
-        <Caret Line="54" Column="3" TopLine="51"/>
+        <Filename Value="main.pas"/>
+        <Caret Line="140" Column="127" TopLine="83"/>
       </Position25>
       <Position26>
-        <Filename Value="unitbookdialog.pas"/>
-        <Caret Line="55" Column="3" TopLine="52"/>
+        <Filename Value="main.pas"/>
+        <Caret Line="83" Column="35" TopLine="62"/>
       </Position26>
       <Position27>
-        <Filename Value="unitbookdialog.pas"/>
-        <Caret Line="61" Column="3" TopLine="42"/>
+        <Filename Value="main.pas"/>
+        <Caret Line="39" Column="27" TopLine="30"/>
       </Position27>
       <Position28>
-        <Filename Value="unitbookdialog.pas"/>
-        <Caret Line="65" Column="64" TopLine="43"/>
+        <Filename Value="main.pas"/>
+        <Caret Line="150" Column="6" TopLine="127"/>
       </Position28>
       <Position29>
-        <Filename Value="book.pas"/>
-        <Caret Line="97" Column="26" TopLine="73"/>
+        <Filename Value="main.pas"/>
+        <Caret Line="40" Column="50" TopLine="21"/>
       </Position29>
       <Position30>
         <Filename Value="main.pas"/>
-        <Caret Line="77" Column="25" TopLine="62"/>
+        <Caret Line="77" Column="6" TopLine="54"/>
       </Position30>
     </JumpHistory>
   </ProjectSession>