From ca254979a99c2d66e4b8157b08694cd19fb9f6fb Mon Sep 17 00:00:00 2001 From: balazs Date: Fri, 16 Dec 2016 09:12:24 +0000 Subject: [PATCH] Opkman: Voting system implemented locally. git-svn-id: trunk@53697 - --- .gitattributes | 4 + .../images/Tree_Buttons/StarEmpty.png | Bin 0 -> 584 bytes .../images/Tree_Buttons/StarFull.png | Bin 0 -> 637 bytes .../images/Tree_Buttons/StarFull_Blue.png | Bin 0 -> 699 bytes .../images/Tree_Buttons/StarHalfFull.png | Bin 0 -> 762 bytes .../onlinepackagemanager/opkman_const.pas | 2 + .../onlinepackagemanager/opkman_mainfrm.lfm | 186 ++++++++++++- .../opkman_serializablepackages.pas | 2 + .../onlinepackagemanager/opkman_updates.pas | 2 + .../opkman_visualtree.pas | 256 +++++++++++++----- .../vst/opkman_VirtualTrees.pas | 33 ++- 11 files changed, 400 insertions(+), 85 deletions(-) create mode 100644 components/onlinepackagemanager/images/Tree_Buttons/StarEmpty.png create mode 100644 components/onlinepackagemanager/images/Tree_Buttons/StarFull.png create mode 100644 components/onlinepackagemanager/images/Tree_Buttons/StarFull_Blue.png create mode 100644 components/onlinepackagemanager/images/Tree_Buttons/StarHalfFull.png diff --git a/.gitattributes b/.gitattributes index 1782d3ea39..39a9e69804 100644 --- a/.gitattributes +++ b/.gitattributes @@ -3290,6 +3290,10 @@ components/onlinepackagemanager/images/Tree_Buttons/Info.png -text svneol=unset# components/onlinepackagemanager/images/Tree_Buttons/Ok.png -text svneol=unset#image/png components/onlinepackagemanager/images/Tree_Buttons/Refresh.png -text svneol=unset#image/png components/onlinepackagemanager/images/Tree_Buttons/Refresh1.png -text svneol=unset#image/png +components/onlinepackagemanager/images/Tree_Buttons/StarEmpty.png -text svneol=unset#image/png +components/onlinepackagemanager/images/Tree_Buttons/StarFull.png -text svneol=unset#image/png +components/onlinepackagemanager/images/Tree_Buttons/StarFull_Blue.png -text svneol=unset#image/png +components/onlinepackagemanager/images/Tree_Buttons/StarHalfFull.png -text svneol=unset#image/png components/onlinepackagemanager/languages/opkman_VirtualTrees.fi.po svneol=native#text/plain components/onlinepackagemanager/languages/opkman_VirtualTrees.hu.po svneol=native#text/plain components/onlinepackagemanager/languages/opkman_VirtualTrees.po svneol=native#text/plain diff --git a/components/onlinepackagemanager/images/Tree_Buttons/StarEmpty.png b/components/onlinepackagemanager/images/Tree_Buttons/StarEmpty.png new file mode 100644 index 0000000000000000000000000000000000000000..93412f6b88493381532af682d8e549988f50203d GIT binary patch literal 584 zcmV-O0=NB%P)N2bZe?^J zG%heMF)~90YwQ330mVr~K~y+Tb&@%20$~t_*DY+)3&Fztl+=P}C8(9hiXc%?VPOlq zRDzf$h_{6xHY#`@@$5oKAt6QnLyDwxcQbF2T}=EG9vJ3*XJ%(UIh)PK#BR463WdUT zsZ_c~%<=$c5(I-mez)5_fk-66vpj&Aq={UmQgKtU3>uAw8#$JjnG6I1{Cd59+-|oD zKpYN-nO~s?*b{iYUcS|82~;E#%4V}c1G(L93x2_kdbX6h+HuG}&W_cYjyTK$O0Wb%@Px7lo_%;$5J z1vGeQ;H7>O=_;o>K6Bc_--3XLXKixgT6SyT`t1<~H5LRwak;3|;zK}6D`Ec$`m z)TT`>Bq9h2NeeZlQv4}XXP9v`?`bikj52fJJ|6d;d)|HLJ)i(A1G#^tJofNvMa(jg zLcF{X00*jFv(g_Oia(AHwbc1cAqA5+X@Kizg6#&{B-EyB?ZI}FmzhUE1Zb%Anv>0e zZc>F*X>0U%AFOeWDhhR)qjba3v*U*6+B!YOQxqdu;}@9LWSF(?n$UnLIPyvYf*B zt(SjKSR=pE%QK5Q&|2@F^4hwa1ON(2>>saQ&4wCDNKu_uGeKP?jYI-QRH__Hw( zi@IkWizS5wNFtHO414vYp9=wY6h3nGB)K+YZZS3T+~?QMy80-NRk X5jP@i`sLx`00000NkvXXu0mjf+mRkk literal 0 HcmV?d00001 diff --git a/components/onlinepackagemanager/images/Tree_Buttons/StarFull_Blue.png b/components/onlinepackagemanager/images/Tree_Buttons/StarFull_Blue.png new file mode 100644 index 0000000000000000000000000000000000000000..de08224769ed71c5bb3f6728a2ab12391fb9914d GIT binary patch literal 699 zcmV;s0!00ZP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E-^Ag1Z(U700JvXL_t(IPh-Fd7?~NRd}cey1TJy_v7w?w z0!Bs#4hcght%^_QwJJWJ=ajKv0*Mh17?~NQgO&$rRDAgh!ZIOigFs?L0!9XQF+C== z()VZ8%0B-CS2ja`F3rDkUHOgD{8< z5>qOCeLybd!eq(dwfQ10yZ zwLm=}y$t-i(eetJcW%n(z5b_A@CJzA{>P8s`~#~6>JczVln42pfloVBS}y(ORoR@E z|K##s0rBhq*zv1>U^VHtuJY?dN+V(h7#KWi{*p53ckasMy!a=R^YTA-43tZ|bC*{m zR1zG3C;%9`B0kG1rLvy=lg@tr9~%bAi3Y5#1jhsh07i|F-T;vu&$R=#Yc>Ri4B-KSs6K% zJj8_k*7SnpKx)|JUD%-7pa7WD*d&a(g}j%vb8CdjGca=kZ9ujJ$Y$nXN2bZe?^J zG%heMF)~90YwQ330(VJ7K~y+Tjni*P6LA;^@Vje`WQC+R+otYrW`Af9NCfqw=uK~= zIT7kj+grDYwINIxEbvv5u~=K?)N^gl^v&o+1M%PHzt>j27&2@WqGr0*GJUuEUBBnI zHWVlHz~{|z&-Z@!Ja^P_b%LSj!AF`qprxgSHW&<4Ic1B+n)p-9?-BhcV6|GAa?PM@ z;iprhc1_!#cX|;-B9S(HivJ6s@#C*@awZ$Pu(Ug(M__SrajCt%z3eF{1~&kBXBoz^ zGA91C&XNl?io2032;cxQ8jV`aW-|lxI5-o^dbg5)VXAJ9cBt$hpKJZwLc?4(*pUDA zwgKhBmnE>Uuz=?0=ks&8VzHQiczD?E^ZA;)y1IBO?bogB2z)*>#EU`62!V--iKNTrs)fyvf*~5OpH_c)RhQlh)S|6G zokR@ih(sbm#N%;jPIq>8s!KyG7HnYj3G3Q?qekERG!obha0G57W@ctkI2?8z+Cs5l zjZsIHd;PUa+~`$F8@+02y|12_o}MP~(BPwT9~9j>c>n+a07*qoM6N<$g7gbneE 25 then + ShowMessage('crap'); + TImageList(FVST.Images).GetBitmap(AStartIndex + ATyp, Bmp); + for I := 0 to ACnt - 1 do + ACanvas.Draw(AX + I*16 + 5, AY, Bmp); + finally + Bmp.Free; + end; + end; + +var + F: Double; + I, X, Y: Integer; + Stars, NoStars: Integer; + HalfStar: Boolean; +begin + HalfStar := False; + F := Frac(AAvarage); + I := Trunc(AAvarage); + case CompareValue(F, 0.25, 0.005) of + -1: + begin + Stars := I; + NoStars := 5 - Stars; + end; + 0, 1: + begin + if CompareValue(F, 0.75, 0.005) = -1 then + begin + Stars := I; + NoStars := 5 - Stars - 1; + HalfStar := True; + end + else + begin + Stars := I + 1; + NoStars := 5 - Stars; + end; + end; + end; + X := P.X; + Y := P.Y; + Draw(X, Y, 0, Stars); + Inc(X, Stars*16); + if HalfStar then + begin + Draw(X, Y, 2, 1); + Inc(X, 16); + end; + Draw(X, Y, 1, NoStars); +end; + procedure TVisualTree.VSTAfterCellPaint(Sender: TBaseVirtualTree; TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex; const CellRect: TRect); @@ -613,17 +690,19 @@ var Data: PData; R: TRect; Text: String; + P: TPoint; + Stars: Integer; begin - if Column = 5 then + if Column = 4 then begin Data := FVST.GetNodeData(Node); if Assigned(Data^.Button) then begin - R := FVST.GetDisplayRect(Node, Column, false); - Data^.Button.Left := R.Left + 1; - Data^.Button.Width := R.Right - R.Left -2; + R := FVST.GetDisplayRect(Node, Column, False); + Data^.Button.Width := 25; + Data^.Button.Left := R.Right - Data^.Button.Width - 1; Data^.Button.Top := R.Top + 1; - Data^.Button.Height := R.Bottom - R.Top - 2; + Data^.Button.Height := R.Bottom - R.Top - 1; case Data^.DataType of 3: Text := Data^.Description; 9: Text := Data^.License; @@ -631,6 +710,25 @@ begin Data^.Button.Visible := ((R.Bottom > FVST.Top) and (R.Bottom < FVST.Top + FVST.Height)) and (Trim(Text) <> ''); Data^.Button.Enabled := not FVST.IsDisabled[Node]; end; + end + else if Column = 5 then + begin + Data := FVST.GetNodeData(Node); + if Data^.DataType = 1 then + begin + R := FVST.GetDisplayRect(Node, Column, False); + P.X := R.Left + 1; + P.Y := ((R.Bottom - R.Top - 16) div 2) + 1; + if (Node = FHoverNode) and (not FLeaving) and (FHoverP.X >= P.X + 1) and (Abs(FHoverP.X - P.X) <= R.Right - R.Bottom) then + begin + Stars := Trunc((FHoverP.X - P.X)/16) + 1; + if Stars > 5 then + Stars := 5; + DrawStars(TargetCanvas, 23, P, Stars) + end + else + DrawStars(TargetCanvas, 20, P, Data^.Rating); + end end; end; @@ -1020,6 +1118,7 @@ begin Data^.DownloadZipURL := Package.DownloadZipURL; Data^.HasUpdate := Package.HasUpdate; Data^.DisableInOPM := Package.DisableInOPM; + Data^.Rating := Package.Rating; FVST.IsDisabled[Node] := Data^.DisableInOPM; FVST.ReinitNode(Node, False); FVST.RepaintNode(Node); @@ -1068,52 +1167,23 @@ procedure TVisualTree.VSTBeforeCellPaint(Sender: TBaseVirtualTree; var Data: PData; begin - Data := Sender.GetNodeData(Node); - if (Data^.DataType = 0) or (Data^.DataType = 1) or (Data^.DataType = 2) then + if CellPaintMode = cpmPaint then begin - if (Node = Sender.FocusedNode) then - begin - case Column of - 0: begin - if Data^.DataType = 0 then - TargetCanvas.Brush.Color := $00E5E5E5 //00D8D8D8 - else - TargetCanvas.Brush.Color := $00E5E5E5; - TargetCanvas.FillRect(CellRect); - TargetCanvas.Brush.Color := FVST.Colors.FocusedSelectionColor; - TargetCanvas.FillRect(ContentRect) - end - else - begin - TargetCanvas.Brush.Color := FVST.Colors.FocusedSelectionColor; - TargetCanvas.FillRect(CellRect) - end; - end; - end + Data := Sender.GetNodeData(Node); + + if (Data^.DataType = 0) or (Data^.DataType = 1) or (Data^.DataType = 2) then + TargetCanvas.Brush.Color := $00E5E5E5 else - begin - if Data^.DataType = 0 then - TargetCanvas.Brush.Color := $00E5E5E5 //00D8D8D8 - else if Data^.DataType = 1 then - TargetCanvas.Brush.Color := $00E5E5E5; - TargetCanvas.FillRect(CellRect); - end; - end - else - begin + TargetCanvas.Brush.Color := clBtnFace; + TargetCanvas.FillRect(CellRect); if (Node = Sender.FocusedNode) then begin TargetCanvas.Brush.Color := FVST.Colors.FocusedSelectionColor; if Column = 0 then TargetCanvas.FillRect(ContentRect) - else - TargetCanvas.FillRect(CellRect); + else + TargetCanvas.FillRect(CellRect); end - else - begin - TargetCanvas.Brush.Style := bsClear; - TargetCanvas.FillRect(CellRect); - end; end; end; @@ -1498,6 +1568,13 @@ begin TargetCanvas.Font.Color := clGreen else TargetCanvas.Font.Color := clWhite; + end + else + begin + if Node <> Sender.FocusedNode then + TargetCanvas.Font.Color := clBlack + else + TargetCanvas.Font.Color := clWhite; end; end else @@ -1520,57 +1597,94 @@ begin Finalize(Data^); end; -procedure TVisualTree.VSTMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); +function TVisualTree.GetColumn(const AX: Integer): Integer; var - I, L, R: Integer; + I: Integer; + L, R: Integer; begin - FHoverColumn := -1; - FHoverNode:= VST.GetNodeAt(X, Y); + Result := -1; for I := 0 to VST.Header.Columns.Count - 1 do begin VST.Header.Columns.GetColumnBounds(I, L, R); - if (X >= L) and (X <= R) then + if (AX >= L) and (AX <= R) then begin - FHoverColumn := I; + Result := I; Break; end; end; end; + +procedure TVisualTree.VSTMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); +begin + FHoverColumn := -1; + FHoverP.X := X; + FHoverP.Y := Y; + FHoverNode:= VST.GetNodeAt(X, Y); + FHoverColumn := GetColumn(X); + if (FHoverColumn = 5) and (FHoverNode <> nil) then + begin + FVST.ReinitNode(FHoverNode, False); + FVST.RepaintNode(FHoverNode); + end; +end; + +procedure TVisualTree.VSTMouseEnter(Sender: TObject); +begin + FLeaving := False; +end; + +procedure TVisualTree.VSTMouseLeave(Sender: TObject); +begin + if Assigned(FHoverNode) then + begin + FLeaving := True; + FVST.ReinitNode(FHoverNode, False); + FVST.RepaintNode(FHoverNode) + end; +end; + procedure TVisualTree.VSTMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var Node: PVirtualNode; Data: PData; - I, L, R: Integer; MenuItem: TMenuItem; + DownColumn: Integer; + R: TRect; + PackageName: String; + Package: TPackage; begin Node := FVST.GetNodeAt(X, Y); if Node <> nil then begin + DownColumn := GetColumn(X); Data := FVST.GetNodeData(Node); if Button = mbLeft then begin - if (Data^.DataType = 17) or (Data^.DataType = 18) then - begin - for I := 0 to VST.Header.Columns.Count - 1 do - begin - VST.Header.Columns.GetColumnBounds(I, L, R); - if (X >= L) and (X <= R) and (I = 4) then + case DownColumn of + 4: if (Data^.DataType = 17) or (Data^.DataType = 18) and (DownColumn = 4) then begin FLinkClicked := True; if (Data^.DataType = 17) and (Trim(Data^.HomePageURL) <> '') then - begin - FLink := Data^.HomePageURL; - Break - end + FLink := Data^.HomePageURL else if (Data^.DataType = 18) and (Trim(Data^.DownloadURL) <> '') then - begin FLink := Data^.DownloadURL; - Break; - end; end; - end; + 5: begin + R := FVST.GetDisplayRect(Node, DownColumn, False); + Data^.Rating := Trunc((FHoverP.X - R.Left - 1)/16) + 1; + if Data^.Rating > 5 then + Data^.Rating := 5; + Package := SerializablePackages.FindPackage(Data^.PackageName, fpbPackageName); + if Package <> nil then + Package.Rating := Data^.Rating; + if Data^.PackageDisplayName <> '' then + PackageName := Data^.PackageDisplayName + else + PackageName := Data^.PackageName; + MessageDlgEx(Format(rsMainFrm_rsPackageRating, [PackageName, InttoStr(Data^.Rating)]), mtInformation, [mbOk], TForm(FVST.Parent.Parent)); + end; end; end else if Button = mbRight then @@ -1601,7 +1715,7 @@ begin end; end; -procedure TVisualTree.VSTOnDblClick(Sender: TObject); +procedure TVisualTree.VSTDblClick(Sender: TObject); begin if FLinkClicked then begin diff --git a/components/onlinepackagemanager/vst/opkman_VirtualTrees.pas b/components/onlinepackagemanager/vst/opkman_VirtualTrees.pas index 04ef9e5ed2..f5e700321e 100644 --- a/components/onlinepackagemanager/vst/opkman_VirtualTrees.pas +++ b/components/onlinepackagemanager/vst/opkman_VirtualTrees.pas @@ -2354,6 +2354,8 @@ type // search, sort FOnCompareNodes: TVTCompareEvent; // used during sort FOnIncrementalSearch: TVTIncrementalSearchEvent; // triggered on every key press (not key down) + FOnMouseEnter: TNotifyEvent; + FOnMouseLeave: TNotifyEvent; procedure AdjustCoordinatesByIndent(var PaintInfo: TVTPaintInfo; Indent: Integer); procedure AdjustImageBorder(ImageWidth, ImageHeight: Integer; BidiMode: TBidiMode; VAlign: Integer; var R: TRect; @@ -2480,6 +2482,7 @@ type procedure CMHintShow(var Message: TCMHintShow); message CM_HINTSHOW; procedure CMMouseLeave(var Message: TLMessage); message CM_MOUSELEAVE; procedure CMMouseWheel(var Message: TLMMouseEvent); message LM_MOUSEWHEEL; + procedure CMMouseEnter(var Message: TLMessage); message CM_MOUSEENTER; {$ifdef EnableNativeTVM} procedure TVMGetItem(var Message: TLMessage); message TVM_GETITEM; procedure TVMGetItemRect(var Message: TLMessage); message TVM_GETITEMRECT; @@ -2640,6 +2643,8 @@ type function DoKeyAction(var CharCode: Word; var Shift: TShiftState): Boolean; virtual; procedure DoLoadUserData(Node: PVirtualNode; Stream: TStream); virtual; procedure DoMeasureItem(TargetCanvas: TCanvas; Node: PVirtualNode; var NodeHeight: Integer); virtual; + procedure DoMouseEnter(); virtual; + procedure DoMouseLeave(); virtual; procedure DoNodeCopied(Node: PVirtualNode); virtual; function DoNodeCopying(Node, NewParent: PVirtualNode): Boolean; virtual; function DoNodeHeightDblClickResize(Node: PVirtualNode; Column: TColumnIndex; Shift: TShiftState; @@ -2917,6 +2922,8 @@ type property OnKeyAction: TVTKeyActionEvent read FOnKeyAction write FOnKeyAction; property OnLoadNode: TVTSaveNodeEvent read FOnLoadNode write FOnLoadNode; property OnMeasureItem: TVTMeasureItemEvent read FOnMeasureItem write FOnMeasureItem; + property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter; + property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave; property OnNodeCopied: TVTNodeCopiedEvent read FOnNodeCopied write FOnNodeCopied; property OnNodeCopying: TVTNodeCopyingEvent read FOnNodeCopying write FOnNodeCopying; property OnNodeExport: TVTNodeExportEvent read FOnNodeExport write FOnNodeExport; @@ -3585,6 +3592,8 @@ type property OnMouseMove; property OnMouseUp; property OnMouseWheel; + property OnMouseEnter; + property OnMouseLeave; property OnNewText; property OnNodeCopied; property OnNodeCopying; @@ -15044,6 +15053,12 @@ begin end; end; +procedure TBaseVirtualTree.CMMouseEnter(var Message: TLMessage); +begin + DoMouseEnter(); + inherited; +end; + //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.CMMouseLeave(var Message: TLMessage); @@ -15075,7 +15090,7 @@ begin Header.FColumns.FDownIndex := NoColumn; Header.FColumns.FHoverIndex := NoColumn; - + DoMouseLeave(); inherited CMMouseLeave(Message); {$ifdef DEBUG_VTV}Logger.ExitMethod([lcMessages],'CMMouseLeave');{$endif} end; @@ -18973,6 +18988,22 @@ begin FOnMeasureItem(Self, TargetCanvas, Node, NodeHeight); end; +procedure TBaseVirtualTree.DoMouseEnter(); + +begin + if Assigned(FOnMouseEnter) then + FOnMouseEnter(Self); +end; + +//---------------------------------------------------------------------------------------------------------------------- + +procedure TBaseVirtualTree.DoMouseLeave; + +begin + if Assigned(FOnMouseLeave) then + FOnMouseLeave(Self); +end; + //---------------------------------------------------------------------------------------------------------------------- procedure TBaseVirtualTree.DoNodeCopied(Node: PVirtualNode);