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 0000000000..93412f6b88 Binary files /dev/null and b/components/onlinepackagemanager/images/Tree_Buttons/StarEmpty.png differ diff --git a/components/onlinepackagemanager/images/Tree_Buttons/StarFull.png b/components/onlinepackagemanager/images/Tree_Buttons/StarFull.png new file mode 100644 index 0000000000..23ef76263e Binary files /dev/null and b/components/onlinepackagemanager/images/Tree_Buttons/StarFull.png differ 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 0000000000..de08224769 Binary files /dev/null and b/components/onlinepackagemanager/images/Tree_Buttons/StarFull_Blue.png differ diff --git a/components/onlinepackagemanager/images/Tree_Buttons/StarHalfFull.png b/components/onlinepackagemanager/images/Tree_Buttons/StarHalfFull.png new file mode 100644 index 0000000000..17ea54bd47 Binary files /dev/null and b/components/onlinepackagemanager/images/Tree_Buttons/StarHalfFull.png differ diff --git a/components/onlinepackagemanager/opkman_const.pas b/components/onlinepackagemanager/opkman_const.pas index 6a7697b2bb..e89df0e233 100644 --- a/components/onlinepackagemanager/opkman_const.pas +++ b/components/onlinepackagemanager/opkman_const.pas @@ -65,6 +65,7 @@ resourcestring rsMainFrm_VSTHeaderColumn_Update = 'Update'; rsMainFrm_VSTHeaderColumn_Data = 'Status/Data'; rsMainFrm_VSTHeaderColumn_Button = ''; + rsMainFrm_VSTHeaderColumn_Rating = 'Rating'; rsMainFrm_VSTText_PackageCategory = 'Package category'; rsMainFrm_VSTText_PackageStatus = 'Package status'; rsMainFrm_VSTText_Version = 'Version'; @@ -179,6 +180,7 @@ resourcestring rsMainFrm_rsPackageDependency1 = 'Resolve dependency?'; rsMainFrm_rsPackageDependency2 = 'Not resolving dependencies might lead to install failure!'; rsMainFrm_rsPackageDependency4 = 'dependency list. Unchecking it might lead to installing failure. Do you wish to continue?'; + rsMainFrm_rsPackageRating = 'Your vote for package "%s" is: %s. Thank you for voting!'; //progress form rsProgressFrm_Caption0 = 'Downloading packages'; diff --git a/components/onlinepackagemanager/opkman_mainfrm.lfm b/components/onlinepackagemanager/opkman_mainfrm.lfm index ebbb92a6d8..ad75759b80 100644 --- a/components/onlinepackagemanager/opkman_mainfrm.lfm +++ b/components/onlinepackagemanager/opkman_mainfrm.lfm @@ -2,10 +2,10 @@ object MainFrm: TMainFrm Left = 463 Height = 640 Top = 164 - Width = 850 + Width = 900 Caption = 'Online Package Manager' ClientHeight = 640 - ClientWidth = 850 + ClientWidth = 900 Color = clBtnFace Constraints.MinHeight = 400 Constraints.MinWidth = 600 @@ -20,11 +20,11 @@ object MainFrm: TMainFrm Left = 0 Height = 570 Top = 0 - Width = 850 + Width = 900 Align = alClient BevelOuter = bvNone ClientHeight = 570 - ClientWidth = 850 + ClientWidth = 900 TabOrder = 0 OnResize = pnMainResize object pnMessage: TPanel @@ -49,18 +49,18 @@ object MainFrm: TMainFrm Left = 0 Height = 60 Top = 0 - Width = 850 + Width = 900 Align = alTop BevelOuter = bvNone ClientHeight = 60 - ClientWidth = 850 + ClientWidth = 900 Color = clBtnFace ParentColor = False TabOrder = 0 OnResize = pnTopResize object spExpand: TSpeedButton Tag = 1 - Left = 802 + Left = 852 Height = 20 Top = 13 Width = 21 @@ -125,7 +125,7 @@ object MainFrm: TMainFrm end object spCollapse: TSpeedButton Tag = 2 - Left = 824 + Left = 874 Height = 20 Top = 13 Width = 21 @@ -370,7 +370,7 @@ object MainFrm: TMainFrm Left = 0 Height = 510 Top = 60 - Width = 850 + Width = 900 Align = alClient Color = clBtnFace PopupMenu = pmMemo @@ -384,10 +384,10 @@ object MainFrm: TMainFrm Left = 0 Height = 70 Top = 570 - Width = 850 + Width = 900 Align = alBottom ClientHeight = 70 - ClientWidth = 850 + ClientWidth = 900 TabOrder = 1 OnResize = pnToolBarResize object tbButtons: TToolBar @@ -542,7 +542,7 @@ object MainFrm: TMainFrm left = 64 top = 163 Bitmap = { - 4C69140000001000000010000000A38D780095806C12B3A18B9FC5B49FFEC6B5 + 4C69190000001000000010000000A38D780095806C12B3A18B9FC5B49FFEC6B5 A0FFC6B5A0FFC6B5A0FFC6B5A1FFBEAD98E3A5917C4BFFFFFF00988674000000 0000000000000000000000000000FFEAD300AC9A886AD5C9BBF9E3D9CBFFE2D9 CAFFE2D9CAFFE2D9CAFFE3D9CAFFE0D6C8FFC3B4A4CB84715C189B8874000000 @@ -1182,7 +1182,167 @@ object MainFrm: TMainFrm 1CFFFFBB19FF9B5005CC0000001A0000001900000016000000130000000E0000 000A000000050000000200000000FFFFFF00000000130000002F723A02A6974C 02CC974C02CC723A02A600000033000000320000002C000000250000001C0000 - 00130000000A0000000400000000 + 00130000000A0000000400000000000000000000000000000000000000000000 + 000000000000000203011A699B401C6DA2400002030100000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000000000100082131022AA4F2CF2AA5F3CF0925380200000100000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 0000000203001B70A75228A4F4FD28A4F4FD1C75AD5200020300000000000000 + 0000000000000000000000000000000000000000000000000000000000000001 + 0100071F2E0226A0EFCD26A3F3FE26A3F3FE26A1F0CD08243502000101000000 + 0000000000000000000000000000000102000001020000020301000204010414 + 1F021C7EBD6725A0F0FD25A1F1FE25A2F2FE25A0F0FD1D81C267041621020002 + 04010002030100010200000102000F456820145C8B4A1973AC6F1E89CF93229C + EAC0239EEEFC239FEFFE24A0F0FF24A0F0FF239FEFFE239EEEFC229CEBC01E8A + D0931973AD6F145D8D4A0F4669202294DED7219DECFC219EEDFD219EEEFE219E + EEFE219EEEFE229EEEFE229EEEFF229EEEFF229EEEFE219EEEFE219EEEFE219E + EEFE219EEDFD219DECFC2294DED70F3D5B1F2093DCD91F9CEBFE209CECFE209D + EDFF209DEDFF209DEDFF209DEDFF209DEDFF209DEDFF209DEDFF209DEDFF209C + ECFE1F9CEBFE2093DCD91041611F000203000E38551B1E90D9D51D9AE9FE1E9A + EAFE1E9BEBFF1E9BEBFF1E9BEBFF1E9BEBFF1E9BEBFF1E9BEBFF1E9AEAFE1D9A + E9FE1E91DAD50F3C591B0002030000000000000102000C354F191C91DCDD1C98 + E8FE1C99E9FF1C99E9FF1C99E9FF1C99E9FF1C99E9FF1C99E9FF1C98E8FE1C92 + DCDD0D3A55190001020000000000000000000000000000020401146EA6791A96 + E6FE1B97E7FF1B97E7FF1B97E7FF1B97E7FF1B97E7FF1B97E7FF1A96E6FE1572 + AD790002040100000000000000000000000000000000000203011270AC7C1894 + E4FD1995E5FF1995E5FF1995E5FF1995E5FF1995E5FF1995E5FF1894E4FD1374 + B37C0002030100000000000000000000000000000000000203011486D0A71692 + E2FE1792E2FE1792E2FE1792E2FE1792E2FE1792E2FE1792E2FE1692E2FE158A + D5A7000305010000000000000000000000000000000002111A01148EDDD11590 + E0FE1490DFFD158AD5F01474B2981473B198158AD5F01490DFFD1590E0FE148E + DDD1021521010000000000000000000000000000000005273E06138DDBF51489 + D5F41472AE8D09314C160004060100030501092F48161371AC8D1489D5F4138D + DBF5062B4406000000000000000000000000000001000621330B126BA4870B39 + 561F0006090100010100000000000000000000010100000508010A37531F126B + A3870624380B00000100000000004D4D4D004D4D4D004D4D4D004D4D4D004D4D + 4D004D4D4D004E4E4E019A9A9A409D9D9D404E4E4E014D4D4D004D4D4D004D4D + 4D004D4D4D004D4D4D004D4D4D004D4D4D004D4D4D004D4D4D004D4D4D004D4D + 4D004D4D4D0064646402C6C6C6CFC6C6C6CF686868024D4D4D004D4D4D004D4D + 4D004D4D4D004D4D4D004D4D4D004D4D4D004D4D4D004D4D4D004D4D4D004D4D + 4D004E4E4E009F9F9F52C6C6C6FDC6C6C6FDA3A3A3524E4E4E004D4D4D004D4D + 4D004D4D4D004D4D4D004D4D4D004D4D4D004D4D4D004D4D4D004D4D4D004D4D + 4D0063636302C3C3C3CDC5C5C5FEC5C5C5FEC3C3C3CD666666024D4D4D004D4D + 4D004D4D4D004D4D4D004D4D4D004D4D4D004D4D4D004E4E4E014E4E4E015B5B + 5B02AAAAAA67C3C3C3FDC3C3C3FEC4C4C4FEC3C3C3FDACACAC675D5D5D024E4E + 4E014E4E4E014D4D4D004D4D4D00808080209090904AA1A1A16FB2B2B293C0C0 + C0C0C1C1C1FCC2C2C2FEC3C3C3FFC3C3C3FFC2C2C2FEC1C1C1FCC0C0C0C0B3B3 + B393A2A2A26F9292924A80808020BABABAD7C1C1C1FCC1C1C1FDC1C1C1FEC1C1 + C1FEC1C1C1FEC1C1C1FEC1C1C1FFC1C1C1FFC1C1C1FEC1C1C1FEC1C1C1FEC1C1 + C1FEC1C1C1FDC1C1C1FCBABABAD77979791FB9B9B9D9C0C0C0FEC0C0C0FEC1C1 + C1FFC1C1C1FFC1C1C1FFC1C1C1FFC1C1C1FFC1C1C1FFC1C1C1FFC1C1C1FFC0C0 + C0FEC0C0C0FEB9B9B9D97C7C7C1F4E4E4E007676761BB7B7B7D5BFBFBFFEBFBF + BFFEBFBFBFFFBFBFBFFFBFBFBFFFBFBFBFFFBFBFBFFFBFBFBFFFBFBFBFFEBFBF + BFFEB8B8B8D57979791B4E4E4E004D4D4D004D4D4D0074747419B8B8B8DDBDBD + BDFEBEBEBEFFBEBEBEFFBEBEBEFFBEBEBEFFBEBEBEFFBEBEBEFFBDBDBDFEB8B8 + B8DD767676194D4D4D004D4D4D004D4D4D004D4D4D004E4E4E019E9E9E79BCBC + BCFEBDBDBDFFBDBDBDFFBDBDBDFFBDBDBDFFBDBDBDFFBDBDBDFFBCBCBCFEA1A1 + A1794E4E4E014D4D4D004D4D4D004D4D4D004D4D4D004E4E4E01A0A0A07CBABA + BAFDBBBBBBFFBBBBBBFFBBBBBBFFBBBBBBFFBBBBBBFFBBBBBBFFBABABAFDA3A3 + A37C4E4E4E014D4D4D004D4D4D004D4D4D004D4D4D004E4E4E01B1B1B1A7B9B9 + B9FEB9B9B9FEB9B9B9FEB9B9B9FEB9B9B9FEB9B9B9FEB9B9B9FEB9B9B9FEB3B3 + B3A74F4F4F014D4D4D004D4D4D004D4D4D004D4D4D0058585801B6B6B6D1B8B8 + B8FEB8B8B8FDB3B3B3F0A3A3A398A2A2A298B3B3B3F0B8B8B8FDB8B8B8FEB6B6 + B6D15C5C5C014D4D4D004D4D4D004D4D4D004D4D4D006A6A6A06B6B6B6F5B3B3 + B3F4A1A1A18D717171164F4F4F014F4F4F0170707016A0A0A08DB3B3B3F4B6B6 + B6F56D6D6D064D4D4D004D4D4D004D4D4D004D4D4D006565650B9C9C9C877676 + 761F515151014D4D4D004D4D4D004D4D4D004D4D4D00505050017575751F9C9C + 9C876767670B4D4D4D004D4D4D00000000000000000000000000000000000000 + 000000000000000203011A699B401A699B404E4E4E014D4D4D004D4D4D004D4D + 4D004D4D4D004D4D4D004D4D4D00000000000000000000000000000000000000 + 000000000100082031022BA4F1CF2BA4F1CF686868024D4D4D004D4D4D004D4D + 4D004D4D4D004D4D4D004D4D4D00000000000000000000000000000000000000 + 0000000203001A6FA6522BA5F3FD2BA5F3FDA3A3A3524E4E4E004D4D4D004D4D + 4D004D4D4D004D4D4D004D4D4D00000000000000000000000000000000000001 + 0100061F2E0225A0EECD2BA4F2FE2BA4F2FEC3C3C3CD666666024D4D4D004D4D + 4D004D4D4D004D4D4D004D4D4D00000102000001020000020301000204010414 + 1F021C7DBD6724A0F0FD2AA3F2FE2AA3F2FEC3C3C3FDACACAC675D5D5D024E4E + 4E014E4E4E014D4D4D004D4D4D000F456820135C8B4A1872AC6F1E89CE93229C + EAC0229EEEFC229FEFFE28A1F0FF28A1F0FFC2C2C2FEC1C1C1FCC0C0C0C0B3B3 + B393A2A2A26F9292924A808080202193DDD7209CEBFC209DECFD209DEDFE209D + EDFE219DEDFE219EEEFE26A0EEFF26A0EEFFC1C1C1FEC1C1C1FEC1C1C1FEC1C1 + C1FEC1C1C1FDC1C1C1FCBABABAD70F3D5B1F1F92DBD91F9BEAFE1F9BEBFE1F9C + ECFF1F9CECFF209CECFF249EECFF249EECFFC1C1C1FFC1C1C1FFC1C1C1FFC0C0 + C0FEC0C0C0FEB9B9B9D97C7C7C1F000203000D38551B1E90D9D51D99E8FE1E99 + E9FE1E9AEAFF1E9AEAFF239CEAFF239CEAFFBFBFBFFFBFBFBFFFBFBFBFFEBFBF + BFFEB8B8B8D57979791B4E4E4E0000000000000102000C354F191C91DCDD1B98 + E8FE1C98E8FF1C98E8FF219AE8FF219AE8FFBEBEBEFFBEBEBEFFBDBDBDFEB8B8 + B8DD767676194D4D4D004D4D4D00000000000000000000020401146EA6791996 + E6FE1A97E7FF1A97E7FF1F98E6FF1F98E6FFBDBDBDFFBDBDBDFFBCBCBCFEA1A1 + A1794E4E4E014D4D4D004D4D4D000000000000000000000203011270AC7C1894 + E4FD1895E5FF1995E5FF1D97E4FF1D97E4FFBBBBBBFFBBBBBBFFBABABAFDA3A3 + A37C4E4E4E014D4D4D004D4D4D000000000000000000000203011486D0A71692 + E2FE1792E2FE1792E2FE1893E2FE1893E2FEB9B9B9FEB9B9B9FEB9B9B9FEB3B3 + B3A74F4F4F014D4D4D004D4D4D00000000000000000002111A01148EDDD11590 + E0FE1490DFFD158AD5F01575B2981575B298B3B3B3F0B8B8B8FDB8B8B8FEB6B6 + B6D15C5C5C014D4D4D004D4D4D00000000000000000005273E06138DDBF5148A + D5F41472AE8D09314C16000406010004060170707016A0A0A08DB3B3B3F4B6B6 + B6F56D6D6D064D4D4D004D4D4D0000000000000001000621330B126BA4870B39 + 561F000609010001010000000000000000004D4D4D00505050017575751F9C9C + 9C876767670B4D4D4D004D4D4D00000000000000000000000000000000000000 + 000000000000030100019B4C1A40A2511C400301000100000000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 00000101000031180802F2782ACFF3782ACF381C090201010000000000000000 + 0000000000000000000000000000000000000000000000000000000000000000 + 000003010000A7521B52F47828FDF47828FDAD541C5203010000000000000000 + 0000000000000000000000000000000000000000000000000000000000000100 + 00002E160702EF7526CDF37626FEF37626FEF07526CD35190802010000000000 + 0000000000000000000000000000020100000201000003010001040200011F0F + 0402BD5B1C67F07525FDF17525FEF27525FEF07525FDC25E1D67210F04020402 + 000103010001020100000201000068320F208B43144AAC52196FCF641E93EA70 + 22C0EE7323FCEF7323FEF07424FFF07424FFEF7323FEEE7323FCEB7122C0D064 + 1E93AD53196F8D44144A69320F20DE6C22D7EC7021FCED7021FDEE7121FEEE71 + 21FEEE7121FEEE7222FEEE7222FFEE7222FFEE7222FEEE7121FEEE7121FEEE71 + 21FEED7021FDEC7021FCDE6C22D75B2D0F1FDC6920D9EB6E1FFEEC7020FEED70 + 20FFED7020FFED7020FFED7020FFED7020FFED7020FFED7020FFED7020FFEC70 + 20FEEB6E1FFEDC6920D96130101F03010000552B0E1BD9671ED5E96C1DFEEA6E + 1EFEEB6E1EFFEB6E1EFFEB6E1EFFEB6E1EFFEB6E1EFFEB6E1EFFEA6E1EFEE96C + 1DFEDA671ED5592C0F1B0301000000000000020100004F260C19DC671CDDE86C + 1CFEE96C1CFFE96C1CFFE96C1CFFE96C1CFFE96C1CFFE96C1CFFE86C1CFEDC66 + 1CDD55280D190201000000000000000000000000000004020001A64C1479E66A + 1AFEE76B1BFFE76B1BFFE76B1BFFE76B1BFFE76B1BFFE76B1BFFE66A1AFEAD50 + 1579040200010000000000000000000000000000000003010001AC4E127CE468 + 18FDE56919FFE56919FFE56919FFE56919FFE56919FFE56919FFE46818FDB352 + 137C030100010000000000000000000000000000000003010001D05E14A7E266 + 16FEE26717FEE26717FEE26717FEE26717FEE26717FEE26717FEE26616FED560 + 15A705020001000000000000000000000000000000001A0B0201DD6314D1E065 + 15FEDF6314FDD56015F0B2521498B1521498D56015F0DF6314FDE06515FEDD63 + 14D1210E0201000000000000000000000000000000003E1C0506DB6113F5D560 + 14F4AE50148D4C240916060200010502000148220916AC4E138DD56014F4DB61 + 13F5441F0606000000000000000000000000010100003318060BA44B12875628 + 0B1F09030001010000000000000000000000010000000803000153260A1FA34A + 1287381A060B01010000000000004D4D4D004D4D4D004D4D4D004D4D4D004D4D + 4D004D4D4D004E4E4E019A9A9A409D9D9D404E4E4E014D4D4D004D4D4D004D4D + 4D004D4D4D004D4D4D004D4D4D004D4D4D004D4D4D004D4D4D004D4D4D004D4D + 4D004D4D4D0064646402C6C6C6CFC6C6C6CF686868024D4D4D004D4D4D004D4D + 4D004D4D4D004D4D4D004D4D4D004D4D4D004D4D4D004D4D4D004D4D4D004D4D + 4D004E4E4E009F9F9F52C6C6C6FDC6C6C6FDA3A3A3524E4E4E004D4D4D004D4D + 4D004D4D4D004D4D4D004D4D4D004D4D4D004D4D4D004D4D4D004D4D4D004D4D + 4D0063636302C3C3C3CDC5C5C5FEC5C5C5FEC3C3C3CD666666024D4D4D004D4D + 4D004D4D4D004D4D4D004D4D4D004D4D4D004D4D4D004E4E4E014E4E4E015B5B + 5B02AAAAAA67C3C3C3FDC3C3C3FEC4C4C4FEC3C3C3FDACACAC675D5D5D024E4E + 4E014E4E4E014D4D4D004D4D4D00808080209090904AA1A1A16FB2B2B293C0C0 + C0C0C1C1C1FCC2C2C2FEC3C3C3FFC3C3C3FFC2C2C2FEC1C1C1FCC0C0C0C0B3B3 + B393A2A2A26F9292924A80808020BABABAD7C1C1C1FCC1C1C1FDC1C1C1FEC1C1 + C1FEC1C1C1FEC1C1C1FEC1C1C1FFC1C1C1FFC1C1C1FEC1C1C1FEC1C1C1FEC1C1 + C1FEC1C1C1FDC1C1C1FCBABABAD77979791FB9B9B9D9C0C0C0FEC0C0C0FEC1C1 + C1FFC1C1C1FFC1C1C1FFC1C1C1FFC1C1C1FFC1C1C1FFC1C1C1FFC1C1C1FFC0C0 + C0FEC0C0C0FEB9B9B9D97C7C7C1F4E4E4E007676761BB7B7B7D5BFBFBFFEBFBF + BFFEBFBFBFFFBFBFBFFFBFBFBFFFBFBFBFFFBFBFBFFFBFBFBFFFBFBFBFFEBFBF + BFFEB8B8B8D57979791B4E4E4E004D4D4D004D4D4D0074747419B8B8B8DDBDBD + BDFEBEBEBEFFBEBEBEFFBEBEBEFFBEBEBEFFBEBEBEFFBEBEBEFFBDBDBDFEB8B8 + B8DD767676194D4D4D004D4D4D004D4D4D004D4D4D004E4E4E019E9E9E79BCBC + BCFEBDBDBDFFBDBDBDFFBDBDBDFFBDBDBDFFBDBDBDFFBDBDBDFFBCBCBCFEA1A1 + A1794E4E4E014D4D4D004D4D4D004D4D4D004D4D4D004E4E4E01A0A0A07CBABA + BAFDBBBBBBFFBBBBBBFFBBBBBBFFBBBBBBFFBBBBBBFFBBBBBBFFBABABAFDA3A3 + A37C4E4E4E014D4D4D004D4D4D004D4D4D004D4D4D004E4E4E01B1B1B1A7B9B9 + B9FEB9B9B9FEB9B9B9FEB9B9B9FEB9B9B9FEB9B9B9FEB9B9B9FEB9B9B9FEB3B3 + B3A74F4F4F014D4D4D004D4D4D004D4D4D004D4D4D0058585801B6B6B6D1B8B8 + B8FEB8B8B8FDB3B3B3F0A3A3A398A2A2A298B3B3B3F0B8B8B8FDB8B8B8FEB6B6 + B6D15C5C5C014D4D4D004D4D4D004D4D4D004D4D4D006A6A6A06B6B6B6F5B3B3 + B3F4A1A1A18D717171164F4F4F014F4F4F0170707016A0A0A08DB3B3B3F4B6B6 + B6F56D6D6D064D4D4D004D4D4D004D4D4D004D4D4D006565650B9C9C9C877676 + 761F515151014D4D4D004D4D4D004D4D4D004D4D4D00505050017575751F9C9C + 9C876767670B4D4D4D004D4D4D00 } end object imTBNor: TImageList diff --git a/components/onlinepackagemanager/opkman_serializablepackages.pas b/components/onlinepackagemanager/opkman_serializablepackages.pas index 007b312835..f4ef8e2eaf 100644 --- a/components/onlinepackagemanager/opkman_serializablepackages.pas +++ b/components/onlinepackagemanager/opkman_serializablepackages.pas @@ -207,6 +207,7 @@ type FUpdateSize: Int64; FIsDirZipped: Boolean; FZippedBaseDir: String; + FRating: Integer; FPackageFiles: TCollection; function GetDownloadable: Boolean; function GetExtractable: Boolean; @@ -226,6 +227,7 @@ type property DownloadZipURL: String read FDownloadZipURL write FDownloadZipURL; property HasUpdate: Boolean read FHasUpdate write FHasUpdate; property DisableInOPM: Boolean read FDisableInOPM write FDisableInOPM; + property Rating: Integer read FRating write FRating; published property Name: String read FName write FName; property DisplayName: String read FDisplayName write FDisplayName; diff --git a/components/onlinepackagemanager/opkman_updates.pas b/components/onlinepackagemanager/opkman_updates.pas index c53a0dd2f3..de709f7a6d 100644 --- a/components/onlinepackagemanager/opkman_updates.pas +++ b/components/onlinepackagemanager/opkman_updates.pas @@ -250,6 +250,7 @@ begin HasUpdate := False; Package.DownloadZipURL := FXML.GetValue(Path + 'DownloadZipURL', ''); Package.DisableInOPM := FXML.GetValue(Path + 'DisableInOPM', False); + Package.Rating := FXML.GetValue(Path + 'Rating', 0); PackageFileCount := FXML.GetValue(Path + 'Count', 0); for J := 0 to PackageFileCount - 1 do begin @@ -296,6 +297,7 @@ begin FXML.SetDeleteValue(Path + 'Name', Package.Name, ''); FXML.SetDeleteValue(Path + 'DownloadZipURL', Package.DownloadZipURL, ''); FXML.SetDeleteValue(Path + 'DisableInOPM', Package.DisableInOPM, False); + FXML.SetDeleteValue(Path + 'Rating', Package.Rating, 0); FXML.SetDeleteValue(Path + 'Count', SerializablePackages.Items[I].PackageFiles.Count, 0); for J := 0 to SerializablePackages.Items[I].PackageFiles.Count - 1 do begin diff --git a/components/onlinepackagemanager/opkman_visualtree.pas b/components/onlinepackagemanager/opkman_visualtree.pas index 63547423c2..6c5efedc20 100644 --- a/components/onlinepackagemanager/opkman_visualtree.pas +++ b/components/onlinepackagemanager/opkman_visualtree.pas @@ -31,7 +31,8 @@ interface uses Classes, SysUtils, Controls, Graphics, Menus, Dialogs, Forms, LCLIntf, contnrs, - PackageIntf, Buttons, opkman_VirtualTrees, opkman_common, opkman_serializablepackages; + PackageIntf, Buttons, Math, opkman_VirtualTrees, opkman_VTGraphics, opkman_common, + opkman_serializablepackages; type @@ -69,6 +70,7 @@ type InstallState: Integer; ButtonID: Integer; Button: TSpeedButton; + Rating: Integer; end; TFilterBy = (fbPackageName, fbPackageFileName, fbPackageCategory, fbPackageState, @@ -81,12 +83,14 @@ type private FVST: TVirtualStringTree; FHoverNode: PVirtualNode; + FHoverP: TPoint; FHoverColumn: Integer; FLink: String; FLinkClicked: Boolean; FSortCol: Integer; FSortDir: opkman_VirtualTrees.TSortDirection; FCheckingNodes: Boolean; + FLeaving: Boolean; FOnChecking: TOnChecking; FOnChecked: TNotifyEvent; procedure VSTBeforeCellPaint(Sender: TBaseVirtualTree; @@ -109,6 +113,8 @@ type {%H-}TextType: TVSTTextType); procedure VSTFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode); procedure VSTMouseMove(Sender: TObject; {%H-}Shift: TShiftState; X, Y: Integer); + procedure VSTMouseEnter(Sender: TObject); + procedure VSTMouseLeave(Sender: TObject); procedure VSTMouseDown(Sender: TObject; Button: TMouseButton; {%H-}Shift: TShiftState; X, Y: Integer); procedure VSTGetHint(Sender: TBaseVirtualTree; Node: PVirtualNode; Column: TColumnIndex; var LineBreakStyle: TVTTooltipLineBreakStyle; var HintText: String); @@ -117,13 +123,15 @@ type procedure VSTCollapsed(Sender: TBaseVirtualTree; {%H-}Node: PVirtualNode); procedure VSTExpanding(Sender: TBaseVirtualTree; {%H-}Node: PVirtualNode; var {%H-}Allowed: Boolean); procedure VSTCollapsing(Sender: TBaseVirtualTree; {%H-}Node: PVirtualNode; var {%H-}Allowed: Boolean); - procedure VSTOnDblClick(Sender: TObject); + procedure VSTDblClick(Sender: TObject); procedure VSTScroll(Sender: TBaseVirtualTree; {%H-}DeltaX, {%H-}DeltaY: Integer); function GetDisplayString(const AStr: String): String; function IsAllChecked(const AChecking: PVirtualNode): Boolean; procedure ButtonClick(Sender: TObject); procedure ShowButtons; procedure HideButtons; + procedure DrawStars(ACanvas: TCanvas; AStartIndex: Integer; P: TPoint; AAvarage: Double); + function GetColumn(const AX: Integer): Integer; function TranslateCategories(const AStr: String): String; public constructor Create(const AParent: TWinControl; const AImgList: TImageList; @@ -173,6 +181,7 @@ begin DefaultText := ''; Header.AutoSizeIndex := 4; Header.Height := 25; + with Header.Columns.Add do begin Position := 0; @@ -213,9 +222,10 @@ begin with Header.Columns.Add do begin Position := 5; - Width := 25; + Alignment := taCenter; + Width := 88; Options := Options - [coResizable]; - Text := rsMainFrm_VSTHeaderColumn_Button; + Text := rsMainFrm_VSTHeaderColumn_Rating; end; Header.Options := [hoAutoResize, hoColumnResize, hoRestrictDrag, hoShowSortGlyphs, hoVisible, hoAutoSpring]; {$IFDEF LCLCarbon} @@ -226,7 +236,7 @@ begin ShowHint := True; TabOrder := 2; TreeOptions.MiscOptions := [toCheckSupport, toFullRepaintOnResize, toInitOnSave, toToggleOnDblClick, toWheelPanning]; - TreeOptions.PaintOptions := [toHideFocusRect, toAlwaysHideSelection, toPopupMode, toShowButtons, toShowDropmark, toShowRoot, toThemeAware, toUseBlendedImages]; + TreeOptions.PaintOptions := [toHideFocusRect, toAlwaysHideSelection, toPopupMode, toShowButtons, toShowDropmark, toShowRoot, toThemeAware]; TreeOptions.SelectionOptions := [toFullRowSelect, toRightClickSelect]; TreeOptions.AutoOptions := [toAutoTristateTracking]; OnBeforeCellPaint := @VSTBeforeCellPaint; @@ -238,8 +248,10 @@ begin OnGetImageIndex := @VSTGetImageIndex; OnHeaderClick := @VSTHeaderClick; OnMouseMove := @VSTMouseMove; + OnMouseLeave := @VSTMouseLeave; + OnMouseEnter := @VSTMouseEnter; OnMouseDown := @VSTMouseDown; - OnDblClick := @VSTOnDblClick; + OnDblClick := @VSTDblClick; OnGetHint := @VSTGetHint; OnAfterCellPaint := @VSTAfterCellPaint; OnCollapsed := @VSTCollapsed; @@ -299,6 +311,7 @@ begin Data^.InstallState := SerializablePackages.GetPackageInstallState(SerializablePackages.Items[I]); Data^.HasUpdate := SerializablePackages.Items[I].HasUpdate; Data^.DisableInOPM := SerializablePackages.Items[I].DisableInOPM; + Data^.Rating := SerializablePackages.Items[I].Rating; FVST.IsDisabled[Node] := Data^.DisableInOPM; Data^.DataType := 1; for J := 0 to SerializablePackages.Items[I].PackageFiles.Count - 1 do @@ -606,6 +619,70 @@ begin HideButtons; end; +procedure TVisualTree.DrawStars(ACanvas: TCanvas; AStartIndex: Integer; + P: TPoint; AAvarage: Double); + + procedure Draw(const AX, AY: Integer; ATyp, ACnt: Integer); + var + Bmp: TBitMap; + I: Integer; + begin + Bmp := TBitmap.Create; + try + Bmp.Width := 16; + Bmp.Height := 16; + if AStartIndex + ATyp > 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);