Compare commits
642 Commits
4.1.1-test
...
4.3.3
| Author | SHA1 | Date | |
|---|---|---|---|
| 32c74bc5a0 | |||
| ce34fc763f | |||
| 85823fdc23 | |||
| 5f12494b95 | |||
| 8be23ff5f4 | |||
| b060000028 | |||
| ed3db29806 | |||
| 81ab122d6b | |||
| bab1b1cb0a | |||
| 15e826898b | |||
| 7c1e44010c | |||
| 4bb389e378 | |||
| 22ea57c263 | |||
|
|
019f20dcba | ||
|
|
f4fa07d589 | ||
| 44d04c5bcb | |||
| e7d15f903d | |||
| fb01686527 | |||
| 7ad606bbd4 | |||
| 723475ca9c | |||
| 6fee032bd1 | |||
| f3a690d9ae | |||
| 120793dbcc | |||
| 39a2f74f2e | |||
|
|
b49ea2c71f | ||
| 3647d80037 | |||
| b292c6cbf2 | |||
| 267eae076e | |||
| adbb2f2b11 | |||
| 568bfe3417 | |||
| e67c4b435b | |||
| 5b018a4696 | |||
| 8113eaf1e7 | |||
| 9e7e957f4f | |||
| 94f555bfa6 | |||
| 0380bc4a05 | |||
| 0ac6c90629 | |||
| 84d8ac7c9f | |||
| 7b228cf100 | |||
| b8c1914406 | |||
| abb8f4ee54 | |||
| 61455a67be | |||
| 5a8e57a56f | |||
| da32087a72 | |||
| 1087ad6dd3 | |||
| c2a9bb8207 | |||
| a3c4066d61 | |||
| 87b206ffc0 | |||
| 0b0bbefd88 | |||
| 5e051794dd | |||
|
|
e2c55a0861 | ||
| 63b39a9fe3 | |||
| 798fd4ba27 | |||
| e01510e92c | |||
| 358df6d852 | |||
| 28f3931436 | |||
| 64cd2a074f | |||
| 76e969714d | |||
| 58cd3d6b96 | |||
| 031ef20d8c | |||
| 466ad7f782 | |||
| 75f69703ef | |||
| 4f8e91b971 | |||
| d8e7883137 | |||
| 43528f4533 | |||
| a6da148d3a | |||
| f956aaaf2d | |||
| 1176978dbe | |||
| 14e87c9141 | |||
| 768222f6b7 | |||
| 5f3ca00671 | |||
| d0f32387b5 | |||
| dee1850337 | |||
| 5d63f7a3b7 | |||
| 65f9c8be9b | |||
| 3843d6c5b6 | |||
| 1238d0d5b7 | |||
| 8bc93fda5d | |||
| 33d0d71feb | |||
| 962d20e7bf | |||
| f6885e9792 | |||
| c8759e8284 | |||
| 85ce641fef | |||
| d56300fc51 | |||
| d85f93b923 | |||
| 863bb61c6f | |||
|
|
2688b8b418 | ||
|
|
b2883e4fec | ||
| 8f3fb38485 | |||
| 07fa8d3a83 | |||
| 28bd302506 | |||
| 8aa1a40b41 | |||
| 6f4fe1a823 | |||
| 506ead11f9 | |||
| 21a5636a07 | |||
| 4fd1458471 | |||
| 5592f90cf8 | |||
| 92c351494c | |||
|
|
8125cc627e | ||
|
|
a26d1d8ffd | ||
|
|
5c11af9ce6 | ||
|
|
b7bc8008f3 | ||
|
|
874ffd5822 | ||
|
|
8d8783502c | ||
|
|
bc410f33d7 | ||
|
|
92fa8e552d | ||
|
|
fa488c0a9d | ||
|
|
d03b047492 | ||
| c5e2ea040d | |||
| 38d592d7e3 | |||
| a92c22f205 | |||
| 249b0c7a02 | |||
| 2ffd360df7 | |||
| 883476827b | |||
| ddcac0cf18 | |||
| 1fe6980a80 | |||
| 8777d9d3c4 | |||
| 0387b6f20f | |||
| e701f5e18c | |||
| 5d29af4dc8 | |||
| 1d8cca19c0 | |||
|
|
bf8eaf5680 | ||
|
|
2d1ca2463e | ||
| d6bc2a96a7 | |||
| ff0e893726 | |||
| facbaa0f40 | |||
| 30cd9c0181 | |||
| b4386d35bd | |||
| 94c0ca9f6d | |||
| fcba7d93c9 | |||
| 486d9912b8 | |||
| ecc6da2533 | |||
| e04f770aa6 | |||
| 1b97df0071 | |||
| 91977c8892 | |||
| c160dc6300 | |||
| a62f180da6 | |||
| a05c01b382 | |||
| d103225d92 | |||
| 35b4cdabd0 | |||
| b38c040029 | |||
| dceb796ce9 | |||
| 07cdeb1e40 | |||
| 96f22384e2 | |||
| 1447e9eb16 | |||
| 1c6302d01c | |||
| 91d64dc9ed | |||
| bc11d6a514 | |||
|
|
463b8a7c0d | ||
| 61b56346b8 | |||
| a20454b92c | |||
| 6426a3c12a | |||
| 42fa1b5340 | |||
| 10320e99eb | |||
| b2120411e5 | |||
| 9c219e5e89 | |||
| 021283e240 | |||
| 74513723e9 | |||
| 3664a80c55 | |||
| 0bd8bab7eb | |||
| 4c565cda6c | |||
| 7484ee8438 | |||
| c22f13a271 | |||
| e0a62a88d9 | |||
| 804db2e623 | |||
|
|
89f7696704 | ||
|
|
18e13e4525 | ||
| 230b208fcb | |||
| c9354e6d27 | |||
| bad522e40a | |||
| ffac75eab7 | |||
| e2497116bf | |||
| 99fae1bb3f | |||
| 59e4da7b40 | |||
| 609a301ecc | |||
| f0a8b141b4 | |||
| 4d35438bf0 | |||
| 4863850195 | |||
|
|
d379f2ad63 | ||
| 0ac0f97688 | |||
|
|
6c606806a1 | ||
| 363c38cb8f | |||
| c039fd52a7 | |||
| 83540e1c55 | |||
| b54c797ce5 | |||
| f60d125920 | |||
| fa00f9aaf7 | |||
| 76808cc2f5 | |||
| eaa335cc04 | |||
| 6768058358 | |||
| 09c2d41118 | |||
| c9e7ef20ec | |||
| 6e55244776 | |||
| b7e2571789 | |||
|
|
e9a52da098 | ||
| 37057306bb | |||
| fe3a2b2e3b | |||
|
|
0c4f5dacca | ||
|
|
62e23facfb | ||
| a9264b8cb9 | |||
| 78f81e0498 | |||
| c055e9bbb4 | |||
| 080cd44229 | |||
| 52f42447b4 | |||
| 5947d7124e | |||
| f8d4f2f51a | |||
| 3c923f33b3 | |||
| 6b27c5d7b1 | |||
| 78810b1a22 | |||
| 0bc0d13036 | |||
| 406e4d5400 | |||
| 60daeae2f5 | |||
| 08d9c12793 | |||
| 7d81ba5be7 | |||
| 6df9804f02 | |||
| a93dd6ec6f | |||
| 6b83cc48a9 | |||
| 9ebc6eb3d3 | |||
| d47fdea23f | |||
| 8b4ae51459 | |||
| 6563221947 | |||
| 7ac6cb4072 | |||
| 6b154c3aad | |||
| fa3270e401 | |||
| 63e6b0e6f6 | |||
| c2daaad86c | |||
| c5d3dadbbb | |||
| 397d941f2f | |||
| 0f7b79f49e | |||
| 1d7fb7b0d0 | |||
| 73e4bb1685 | |||
| 7f23300b9e | |||
|
|
99bdb1f958 | ||
| 3ffaaee174 | |||
|
|
9c977dfc5d | ||
| 2efd9dc170 | |||
| 321e6b3dfe | |||
| 9f1f21c2b6 | |||
| 5136984343 | |||
| a8d82480e7 | |||
| efac507fed | |||
| 22532e0436 | |||
| 4de6b167da | |||
| 7bde95a65c | |||
| 9a47b5515c | |||
| 0db7fad640 | |||
| 1a98dae4f8 | |||
| 5cb1cff0ca | |||
| 8d4874d553 | |||
| c00d62c010 | |||
| 831bef8233 | |||
| 20e1763929 | |||
| 35218a917b | |||
| e5a2fd2d94 | |||
| 6946f20d64 | |||
| 3f9200bf01 | |||
| b2fc80215d | |||
| 74d4cc05d9 | |||
|
|
a7d86d9120 | ||
| fb21620880 | |||
| 985e7d829e | |||
| 5ceb8d78cb | |||
| dfce427891 | |||
| c72885ff55 | |||
| beba54925c | |||
| aba67f19b4 | |||
| 9708db56d6 | |||
| 1ee5b412b8 | |||
| a14613018b | |||
| 086c490bb7 | |||
| 3db4cd8a62 | |||
| 104f8b798f | |||
| 5ede18a8d3 | |||
| 375a520a14 | |||
| d41364c063 | |||
| a6cd981a51 | |||
| 9660eaafd3 | |||
| 1cc9d3bdd6 | |||
| 6790283ace | |||
| 735e99d891 | |||
| 9b4dae382d | |||
| c1ccf51258 | |||
| 61a28b1d73 | |||
| 2a5e1280f9 | |||
| 72d1374503 | |||
| c791ad4afb | |||
| 1037330324 | |||
| 7acd2edbcc | |||
| 8392fbb64e | |||
| 24dbed8864 | |||
| 4330abdf0b | |||
| 72d8bf883b | |||
| d33c85b5e6 | |||
| f557a0d341 | |||
| 56692bbdc3 | |||
| def03de995 | |||
| ebef968a65 | |||
| d832df6efd | |||
| cc3561777e | |||
| d085f3de73 | |||
| 407ec6b573 | |||
| 2803d4b8da | |||
| 48028076a8 | |||
| e435cf66dc | |||
| 766b7cd178 | |||
| 5d4ac6f523 | |||
| 29869dbb9d | |||
| d07f2a5fa4 | |||
| 708d8866ac | |||
| 2115b1fb11 | |||
| 0e810cea87 | |||
|
|
9f32a02f35 | ||
|
|
9f23c2b381 | ||
| 1f98c8df7c | |||
| da9f84d78a | |||
| 88cc3eb921 | |||
| f04130f902 | |||
| e7e810ea2b | |||
| 1de46a8296 | |||
| 5ece2b2034 | |||
| 460dcfebed | |||
| fb257212b6 | |||
| 1436e35a49 | |||
| a16248f8a4 | |||
| 7b49732405 | |||
| 1b6e02c5bf | |||
| 4d228fd331 | |||
| f6ac9752d1 | |||
| 716344cf68 | |||
| 79e0ef2b7b | |||
| 779b62a12f | |||
| 6427a32c31 | |||
| 1f8d237d40 | |||
| 04732f61c0 | |||
| 63147b2ca3 | |||
| d1d1e54022 | |||
| d175fc497e | |||
| e073764a80 | |||
| 5cf8b587ee | |||
| b715f1c54b | |||
|
|
7513667c6e | ||
|
|
0edf87c95c | ||
| 22a54cd0ed | |||
| d4fbd1b386 | |||
| 87a71fe3b3 | |||
| c7e48ae01d | |||
| cb66f5e903 | |||
| 842f0893b3 | |||
| f5a35a332a | |||
| 0ba0587e17 | |||
| c65eea12a6 | |||
| d6e01a5803 | |||
| 04aeac62f8 | |||
| 9b1b432e7c | |||
| cfafc04628 | |||
| 8450e6afa6 | |||
| 2a4d33e73f | |||
| 8c2a10ebbc | |||
| 2bec2de456 | |||
| 90dea4ed2e | |||
| 06ca1b7a97 | |||
| f9e2cea98e | |||
| 1bbf7027d3 | |||
| 90ec030f8b | |||
| 347c8ed093 | |||
| d987c840c7 | |||
| 88a28c5658 | |||
| 484a82b00b | |||
| 1506b74b01 | |||
| 09b880fff8 | |||
| c6d3742daa | |||
| 917527cbe6 | |||
| faad17470a | |||
| 9f53c2eaa6 | |||
| 6d1d4e9f23 | |||
| 753945228e | |||
| 2f409c7082 | |||
| 728fc5866c | |||
| ace24914f4 | |||
| 8b9bf53e4e | |||
| 453d3963dd | |||
| dff869cec8 | |||
| 17a6b22e55 | |||
| cb66e8a0bd | |||
| 001ce7e4e8 | |||
| 351bbc0fc1 | |||
| 824ffbca2b | |||
| d6082be71f | |||
| 6b807b24e2 | |||
| 3679e8d6eb | |||
| 335996b7d0 | |||
| aa3b102fdd | |||
| 5394e5cc57 | |||
| d2544795f5 | |||
| 06c7664a37 | |||
| 2d09b549af | |||
| 2e807c36e7 | |||
| 0a1a6e73f0 | |||
| fea69319de | |||
| 6519053648 | |||
| ef41110632 | |||
| 30cdeb89b1 | |||
| 512df973f9 | |||
| d3b71fbacc | |||
| e8f13693be | |||
| 6bd05655d6 | |||
| ebe78f0937 | |||
| abae11a30e | |||
| f8ea89a069 | |||
| 496d20d536 | |||
| 369a7801ab | |||
| 0478df3b49 | |||
| d8909b1424 | |||
| ab707c8c2b | |||
| 13d6965558 | |||
| 22cb1f6058 | |||
| 8e560805b2 | |||
| 8475623135 | |||
| e865431411 | |||
| ab8faa487e | |||
| f0e3b6b687 | |||
| 5de20aa19d | |||
| b5ae73fbeb | |||
| 28326b37c7 | |||
| 12a114450c | |||
| 768ed38ace | |||
| 19f7e3fa0e | |||
| 6d65b445dd | |||
| 2867cf0500 | |||
| 07eaebf483 | |||
| 2d116ae6c1 | |||
| ceb43da10b | |||
| 710cd9fa5c | |||
| c6688e47fb | |||
| e04b2545a9 | |||
| 9b4c3aa2ce | |||
| e6561e0a07 | |||
| 9616deb4b6 | |||
| 96d2ea6669 | |||
| d57c43a2b7 | |||
| 40eadaca35 | |||
| 21bcb67a73 | |||
| 890718fdbb | |||
| 1613825b7c | |||
| bcb399dc30 | |||
| cd581d4de9 | |||
| 41ef63ec4a | |||
| 02419bfdcb | |||
| b67fd11fd5 | |||
| 9a7a80223a | |||
| aa85ee53a8 | |||
| ac45f5eec9 | |||
| 84cc4a9208 | |||
| 795a6ca709 | |||
| dab4606e9b | |||
| 1954196ba1 | |||
| fc0edab44c | |||
| a04cf4e6d9 | |||
| e85576e5f0 | |||
| efba72002a | |||
| 4bdcb2cf3c | |||
| 8ff46e554f | |||
| 57db01aeaf | |||
| 0ceb99e121 | |||
| 83b539e7da | |||
| ce6c0a4613 | |||
| cf59aeb4eb | |||
| 17ca13cf00 | |||
|
|
b99225bd3c | ||
| 8f39710cdb | |||
| 7ec6be1969 | |||
| d9ee17c9b1 | |||
| 1543d75339 | |||
| 77eb0d84c7 | |||
| 68ddb3ffcc | |||
| 58ea0249d8 | |||
| eb01bf253e | |||
| c22ce6290b | |||
| 1f7608bf77 | |||
| 16115a455b | |||
| ce680d54f9 | |||
| a90699163f | |||
| 3edf39b4ef | |||
| f5c879b369 | |||
| 2bd9c4a440 | |||
| f494f15922 | |||
| d5df4057e9 | |||
| dc07b7cb02 | |||
| 1bb0bf7d71 | |||
| cf00d54355 | |||
| 1ea7067379 | |||
| 29ad3cc72d | |||
| dfe57bf2c3 | |||
| b37f8d7f7e | |||
| b51b248566 | |||
| 21baf598d7 | |||
| 2c6d706c58 | |||
| 1b1f7578d0 | |||
| 9275425bdf | |||
| 22b1d66c07 | |||
| a3e1d19ac3 | |||
| 762caae49f | |||
| 4e4ee205de | |||
| 9d4e19e606 | |||
| 4d142ec614 | |||
| 80cf746f90 | |||
| 3b83b335be | |||
| 1f0a0e48ff | |||
| 432215e040 | |||
| 1a65386c6b | |||
|
|
757dced302 | ||
|
|
854caafd6b | ||
| 1332107642 | |||
|
|
4825417de8 | ||
| 0001df153b | |||
| f88b38dd39 | |||
| 3f2404ec1c | |||
| 5b822194fa | |||
| 33ea9ee065 | |||
| d742e85332 | |||
|
|
8dfb1fbe2f | ||
| 4114b51d87 | |||
|
|
deec70f14b | ||
| ee0d3f87ec | |||
| 80adfd5dc1 | |||
| e81c846432 | |||
| 03d60d74f1 | |||
| 4f2c5f1bdc | |||
|
|
da03261cbb | ||
|
|
48d551424a | ||
|
|
ab6c3d37d2 | ||
| de2db98324 | |||
|
|
66d1aacbbe | ||
| 57f1b69663 | |||
|
|
cb093dcc2b | ||
| eaf268a10d | |||
|
|
1074e941a6 | ||
|
|
05cb318737 | ||
| 4ce19e25e5 | |||
| 17c152ce8b | |||
|
|
9275074e10 | ||
| e69eaa6296 | |||
| 35bc1efbad | |||
| 9420959023 | |||
| 7a16b5c52f | |||
| 24519e6560 | |||
| 2104b99208 | |||
|
|
cf549c540d | ||
|
|
4b40e3caca | ||
| 1a89c2a1a6 | |||
| b1fd1a3c3c | |||
| 50e895938b | |||
| 18d2b1edbb | |||
|
|
f91ee56d97 | ||
| 41a6a3fc04 | |||
| 1266b16d83 | |||
| 4359a9c58d | |||
| c243a30dec | |||
| f629dca03c | |||
| f2e1219a83 | |||
| e2f27c7746 | |||
| 72ba481180 | |||
| 8d41966d67 | |||
| f2a4ce3b25 | |||
| 0b2290344b | |||
| a7cb44348d | |||
| 384d4b300d | |||
| 19a1ba4289 | |||
| c160f4105d | |||
| 682a6e38d6 | |||
| e4a3a974b5 | |||
| eb38f2af05 | |||
| 7163f8ee80 | |||
| a934373f1e | |||
| ce6ded25f2 | |||
| f707fef65b | |||
| 721e6580c9 | |||
| e20572b28d | |||
| 05a6af8f86 | |||
| d4e84344c3 | |||
| f856060d3d | |||
| 49829f8d3c | |||
| 4cd3ca56e0 | |||
| 0538777ceb | |||
| d3b303c66c | |||
| 98c4e8a699 | |||
| 69b7cbe472 | |||
| 539a21ccec | |||
| eb40a32cc2 | |||
| 440b7ea88d | |||
| 36d273dd5e | |||
| 6bdc1ee51c | |||
| ecfa9a166d | |||
| 199700495c | |||
| 0bafab7f94 | |||
| dd4deff19d | |||
| 8b88573283 | |||
| 2717cf695c | |||
| 385803754f | |||
| 8ba377cf0b | |||
| c21d4dac96 | |||
| a85200338c | |||
| 5d34dd6413 | |||
| bd3daeba75 | |||
|
|
8b2a61e4b2 | ||
| 116f14845e | |||
| 77bf544c59 | |||
| f809d7c15d | |||
| 1f7f3edbba | |||
| 90f6b6a574 | |||
| 3e51ce8381 | |||
| b7df4a5801 | |||
| 980e4a17d9 | |||
| d5248f4c1b | |||
|
|
c169622806 | ||
|
|
cc54014b29 | ||
|
|
c636e0882b | ||
|
|
4120af7e24 | ||
| 09a5789c26 | |||
| fc658f324d | |||
| 2861b0573b | |||
| 2ab4ebc0e3 | |||
| e344b16aa0 | |||
| 30b65350ca | |||
| 0db8c8b1bb | |||
| 9e25584bdc | |||
| ee6d6f145f | |||
| 347f6e918f | |||
| 0fcbd15ab4 | |||
| 6bdac50059 | |||
| f45b2af260 | |||
| d744c1d978 | |||
| 0544761094 | |||
| e645c5e526 | |||
| d75fdd9f80 | |||
| 30f74db0dc | |||
| 2d0069ce18 | |||
| 48b91d1887 | |||
| 32cb3d7453 | |||
|
|
ba3071d62b | ||
|
|
dca80a3fbb | ||
| f99c0839dd |
13
.github/workflows/program-builder.yml
vendored
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
name: Building Program
|
||||||
|
run-name: Building ${{ GITHUB.REPOSITORY }}
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- "*"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
call:
|
||||||
|
uses: GXDE-OS/GXDE/.github/workflows/building-deb.yml@master
|
||||||
|
secrets: inherit
|
||||||
2
.gitignore
vendored
@@ -52,3 +52,5 @@ debian/files
|
|||||||
debian/*.substvars
|
debian/*.substvars
|
||||||
debian/spark-store
|
debian/spark-store
|
||||||
|
|
||||||
|
.vscode/*
|
||||||
|
src/spark-store
|
||||||
|
|||||||
@@ -32,8 +32,7 @@ stages:
|
|||||||
- cd ..
|
- cd ..
|
||||||
- rm -rf dtk-old-bundle
|
- rm -rf dtk-old-bundle
|
||||||
- 'mk-build-deps --install --tool "apt-get -o Debug::pkgProblemResolver=yes -y" '
|
- 'mk-build-deps --install --tool "apt-get -o Debug::pkgProblemResolver=yes -y" '
|
||||||
- sed -i 's/-j$(JOBS)/-j2/g' debian/rules
|
- dpkg-buildpackage -j2 -b -us -uc
|
||||||
- dpkg-buildpackage -b -us -uc
|
|
||||||
- cd ..
|
- cd ..
|
||||||
- ls -all
|
- ls -all
|
||||||
- pwd
|
- pwd
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ version: '1.0'
|
|||||||
name: dtk-build-release-tag-20220425
|
name: dtk-build-release-tag-20220425
|
||||||
displayName: dtk-build-release-tag
|
displayName: dtk-build-release-tag
|
||||||
triggers:
|
triggers:
|
||||||
trigger: auto
|
trigger: manual
|
||||||
push:
|
push:
|
||||||
tags:
|
tags:
|
||||||
prefix:
|
prefix:
|
||||||
@@ -33,8 +33,7 @@ stages:
|
|||||||
- rm -rf dtk-old-bundle
|
- rm -rf dtk-old-bundle
|
||||||
- ''
|
- ''
|
||||||
- 'mk-build-deps --install --tool "apt-get -o Debug::pkgProblemResolver=yes -y" '
|
- 'mk-build-deps --install --tool "apt-get -o Debug::pkgProblemResolver=yes -y" '
|
||||||
- sed -i 's/-j$(JOBS)/-j2/g' debian/rules
|
- dpkg-buildpackage -j2 -b -us -uc
|
||||||
- dpkg-buildpackage -b -us -uc
|
|
||||||
- cd ..
|
- cd ..
|
||||||
- ls -all
|
- ls -all
|
||||||
- pwd
|
- pwd
|
||||||
|
|||||||
48
.workflow/pipeline-dtk-build-aarch64.yml
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
version: '1.0'
|
||||||
|
name: pipeline-dtk-build-aarch64
|
||||||
|
displayName: dtk-build-aarch64
|
||||||
|
triggers:
|
||||||
|
trigger: manual
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
prefix:
|
||||||
|
- ''
|
||||||
|
stages:
|
||||||
|
- name: stage-2c12cce1
|
||||||
|
displayName: 编译
|
||||||
|
strategy: naturally
|
||||||
|
trigger: auto
|
||||||
|
executor: []
|
||||||
|
steps:
|
||||||
|
- step: execute@docker
|
||||||
|
name: execute_by_docker
|
||||||
|
displayName: 基于镜像的脚本执行
|
||||||
|
certificate: ''
|
||||||
|
image: docker.io/debian:buster
|
||||||
|
command:
|
||||||
|
- '# 请在此输入您想执行的脚本'
|
||||||
|
- sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
|
||||||
|
- apt update
|
||||||
|
- export DEBIAN_FRONTEND=noninteractive
|
||||||
|
- echo "安装wget qemu-user-static"
|
||||||
|
- apt install git wget qemu-user-static xz-utils binfmt-support -y
|
||||||
|
- mkdir ../spark-store-git
|
||||||
|
- mv * ../spark-store-git
|
||||||
|
- git clone https://gitlink.org.cn/shenmo7192/debian-container-aarch64.git
|
||||||
|
- mv debian-container-aarch64/DEBIANARM.tar.xz .
|
||||||
|
- rm -rf debian-container-aarch64
|
||||||
|
- tar -xf DEBIANARM.tar.xz
|
||||||
|
- mkdir -p DEBIAN/root/build-spark
|
||||||
|
- mv ../spark-store-git DEBIAN/root/build-spark/spark-store
|
||||||
|
- wget https://gitee.com/deepin-community-store/repo_auto_update_script/raw/master/spark-build-aarch64.sh && mv spark-build-aarch64.sh DEBIAN/root
|
||||||
|
- mv /usr/bin/qemu-aarch64-static DEBIAN/
|
||||||
|
- chroot DEBIAN /qemu-aarch64-static /bin/bash /root/spark-build-aarch64.sh
|
||||||
|
- ''
|
||||||
|
- ''
|
||||||
|
artifacts:
|
||||||
|
- name: BUILD_ARTIFACT
|
||||||
|
path:
|
||||||
|
- ./DEBIAN/root/build-spark/target
|
||||||
|
notify: []
|
||||||
|
strategy:
|
||||||
|
retry: '0'
|
||||||
@@ -1,328 +0,0 @@
|
|||||||
|
|
||||||
#### 说明
|
|
||||||
|
|
||||||
当前服务器线路列表(项目中包含):
|
|
||||||
|
|
||||||
```
|
|
||||||
https://d.store.deepinos.org.cn/
|
|
||||||
https://store.deepinos.org.cn/
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# 星火应用商店文档
|
|
||||||
|
|
||||||
# 目录结构
|
|
||||||
几个目录结构
|
|
||||||
```
|
|
||||||
/
|
|
||||||
/icons 图标文件夹
|
|
||||||
/tags 首页图标
|
|
||||||
/tras 多语言翻译
|
|
||||||
```
|
|
||||||
|
|
||||||
主要的文件分析
|
|
||||||
```js
|
|
||||||
spark-store.pro Qt工程配置文件
|
|
||||||
ssinstall 调用包安装器的脚本
|
|
||||||
icons.qrc 图标资源文件
|
|
||||||
main.cpp 入口文件
|
|
||||||
widget.h widget.cpp widget.ui 主要窗口控件
|
|
||||||
downloadlist.h downloadlist.cpp downloadlist.ui 单个软件的下载安装展示控件
|
|
||||||
progressload.h progressload.cpp 网页加载显示? 得在deepin上编译运行才能搞清楚
|
|
||||||
workerthreads.h workerthreads.cpp 应用信息加载线程
|
|
||||||
image_show.h image_show.cpp 应用页面截图预览控件
|
|
||||||
big_image.h big_image.cpp 大图查看控件
|
|
||||||
```
|
|
||||||
|
|
||||||
# 使用的开源库及第三方工具
|
|
||||||
* GDebi 一个 Ubuntu 软件中心的轻量级替代品 https://linux.cn/article-4982-1.html
|
|
||||||
* libnotify 系统通知 https://developer.gnome.org/libnotify/unstable/
|
|
||||||
|
|
||||||
|
|
||||||
# 源码分析
|
|
||||||
## 应用的组成部分
|
|
||||||
左侧应用分类菜单
|
|
||||||
主窗口的下拉菜单
|
|
||||||
应用列表页面
|
|
||||||
应用详情页面
|
|
||||||
应用首页,有几个链接跳转
|
|
||||||
商店设置页面
|
|
||||||
下载列表页面
|
|
||||||
|
|
||||||
## 应用初始化,及主控件加载
|
|
||||||
初始化 `DApplication` 进入事件循环。
|
|
||||||
设置关于我们弹窗 `DAboutDialog`。
|
|
||||||
主控件 Widget 根据不同屏幕大小自适应。
|
|
||||||
首页打开webview页面,如果传入了`spk://`参数,会打开应用详情页。
|
|
||||||
```cpp
|
|
||||||
// main.cpp
|
|
||||||
QString arg1=argv[1];
|
|
||||||
if(arg1.left(6)=="spk://"){
|
|
||||||
w.openUrl(QUrl(argv[1]));
|
|
||||||
}
|
|
||||||
|
|
||||||
// widget.cpp
|
|
||||||
void Widget::openUrl(QUrl u)
|
|
||||||
{
|
|
||||||
QString app=serverUrl + "store"+u.path()+"/app.json";
|
|
||||||
ui->webEngineView->setUrl(app); // 会触发 webEngineView 的
|
|
||||||
}
|
|
||||||
|
|
||||||
```
|
|
||||||
## Tags处理方式
|
|
||||||
|
|
||||||
**Tags处理方式**
|
|
||||||
```cpp
|
|
||||||
// widget.cpp
|
|
||||||
QString tags=json["Tags"].toString(); //Read the Tags
|
|
||||||
QStringList tagList=tags.split(";");
|
|
||||||
for (int i=0;i<tagList.size();i++) {
|
|
||||||
if(tagList[i]=="community")
|
|
||||||
ui->tag_community->show();//Tags icon shows like this
|
|
||||||
if(tagList[i]=="ubuntu")
|
|
||||||
ui->tag_ubuntu->show();
|
|
||||||
if(tagList[i]=="deepin")
|
|
||||||
ui->tag_deepin->show();
|
|
||||||
if(tagList[i]=="uos")
|
|
||||||
ui->tag_uos->show();
|
|
||||||
if(tagList[i]=="dtk5")
|
|
||||||
ui->tag_dtk5->show();
|
|
||||||
if(tagList[i]=="dwine2")
|
|
||||||
ui->tag_dwine2->show();
|
|
||||||
if(tagList[i]=="dwine5")
|
|
||||||
ui->tag_dwine5->show();
|
|
||||||
if(tagList[i]=="a2d")
|
|
||||||
ui->tag_a2d->show();
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
**Widget 初始化**
|
|
||||||
```cpp
|
|
||||||
void Widget::initConfig()
|
|
||||||
{
|
|
||||||
...
|
|
||||||
// 读取服务器URL并初始化菜单项的链接
|
|
||||||
QSettings readConfig(QDir::homePath()+"/.config/spark-store/config.ini",QSettings::IniFormat);
|
|
||||||
if(readConfig.value("server/choose").toString()!=""){
|
|
||||||
ui->comboBox_server->setCurrentText(readConfig.value("server/choose").toString());
|
|
||||||
appinfoLoadThread.setServer(serverUrl=readConfig.value("server/choose").toString());
|
|
||||||
}else {
|
|
||||||
appinfoLoadThread.setServer(serverUrl="http://sucdn.jerrywang.top/"); // 默认URL
|
|
||||||
}
|
|
||||||
configCanSave=true; // 防止触发保存配置信号
|
|
||||||
menuUrl[0]=serverUrl + "store/#/"; // 首页
|
|
||||||
// 下面是各个应用分类页面,直接加载的webview的
|
|
||||||
// 每个连接对应一个左侧的菜单项,在构造函数用连接到 chooseLeftMenu 槽函数
|
|
||||||
menuUrl[1]=serverUrl + "store/#/network";
|
|
||||||
...
|
|
||||||
menuUrl[12]=serverUrl + "store/#/others";
|
|
||||||
...
|
|
||||||
ui->webfoot->hide();
|
|
||||||
|
|
||||||
//初始化首页
|
|
||||||
ui->webEngineView->setUrl(menuUrl[0]);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 菜单切换逻辑
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void Widget::chooseLeftMenu(int index)
|
|
||||||
{
|
|
||||||
nowMenu=index;
|
|
||||||
updateUI();
|
|
||||||
left_list[index]->setStyleSheet("color:#FFFFFF;background-color:"+main_color.name()+";border-radius:8;border:0px");
|
|
||||||
// index <=12 加载某个分类的应用列表的webviejw
|
|
||||||
// index == 13 加载下载列表页面
|
|
||||||
if(index<=12){
|
|
||||||
if(themeIsDark){
|
|
||||||
darkurl = 夜间模式的URL
|
|
||||||
ui->webEngineView->setUrl(darkurl);
|
|
||||||
}else {
|
|
||||||
ui->webEngineView->setUrl(menuUrl[index]);
|
|
||||||
}
|
|
||||||
ui->stackedWidget->setCurrentIndex(0);
|
|
||||||
}else if (index==13) {
|
|
||||||
ui->stackedWidget->setCurrentIndex(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## 应用下载安装卸载分析
|
|
||||||
**应用详情页面加载**
|
|
||||||
```cpp
|
|
||||||
/**
|
|
||||||
* 加载单个应用的信息
|
|
||||||
*/
|
|
||||||
void Widget::on_webEngineView_urlChanged(const QUrl &arg1)
|
|
||||||
{
|
|
||||||
//分析出服务器中的分类名称
|
|
||||||
...
|
|
||||||
//如果是app.json就打开详情页
|
|
||||||
if(arg1.path().right(8)=="app.json"){
|
|
||||||
...
|
|
||||||
// 读取相应的应用信息
|
|
||||||
appinfoLoadThread.requestInterruption();
|
|
||||||
appinfoLoadThread.wait(100);
|
|
||||||
appinfoLoadThread.setUrl(arg1);
|
|
||||||
appinfoLoadThread.start();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// 设置详情页的APP信息
|
|
||||||
SpkAppInfoLoaderThread::requestSetAppInformation() -> Widget::sltAppinfoDetails()
|
|
||||||
// 设置详情页的APP图标
|
|
||||||
SpkAppInfoLoaderThread::finishedIconLoad() -> Widget::sltAppinfoIcon()
|
|
||||||
// 设置详情页的APP截图
|
|
||||||
SpkAppInfoLoaderThread::finishedScreenshotLoad() -> Widget::sltAppinfoScreenshot()
|
|
||||||
|
|
||||||
// 下载APP详情信息线程
|
|
||||||
void SpkAppInfoLoaderThread::run()
|
|
||||||
{
|
|
||||||
QProcess get_json;
|
|
||||||
get_json.start("curl -o app.json " + targetUrl.toString());
|
|
||||||
QFile app_json("app.json");
|
|
||||||
读取 app.json 里的信息,提取应用名、描述、图标、截图
|
|
||||||
处理完毕后发射相应的信号
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
**应用下载**
|
|
||||||
Widget::on_pushButton_download_clicked() 是点击下载的安装方法。
|
|
||||||
最终使用的是 `QNetwrokAccessManager` 进行GET请求获取数据写入文件。
|
|
||||||
```cpp
|
|
||||||
void Widget::on_pushButton_download_clicked()
|
|
||||||
{
|
|
||||||
if(!isBusy){
|
|
||||||
file = new QFile(fileName);
|
|
||||||
...
|
|
||||||
nowDownload+=1;
|
|
||||||
startRequest(urList.at(nowDownload-1)); // 进行链接请求
|
|
||||||
}
|
|
||||||
}
|
|
||||||
void Widget::startRequest(QUrl url)
|
|
||||||
{
|
|
||||||
reply = manager->get(QNetworkRequest(url));
|
|
||||||
// 请求响应完成,关闭文件,清理下载队列
|
|
||||||
connect(reply,SIGNAL(finished()),this,SLOT(httpFinished()));
|
|
||||||
// 接收应用下载数据
|
|
||||||
connect(reply,SIGNAL(readyRead()),this,SLOT(httpReadyRead()));
|
|
||||||
// 更新应用下载进度
|
|
||||||
connect(reply,SIGNAL(downloadProgress(qint64,qint64)),this,SLOT(updateDataReadProgress(qint64,qint64)));
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
使用 QSettings 来读取配置,更换服务源
|
|
||||||
```cpp
|
|
||||||
void Widget::on_comboBox_server_currentIndexChanged(const QString &arg1)
|
|
||||||
{
|
|
||||||
appinfoLoadThread.setServer(arg1); // 服务器信息更新
|
|
||||||
if(configCanSave){
|
|
||||||
ui->label_setting1->show();
|
|
||||||
QSettings *setConfig=new QSettings(QDir::homePath()+"/.config/spark-store/config.ini",QSettings::IniFormat);
|
|
||||||
setConfig->setValue("server/choose",arg1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
使用 `QProcess` 来调用各种小文件下载、包安装卸载的命令。
|
|
||||||
|
|
||||||
**应用安装**
|
|
||||||
```cpp
|
|
||||||
void Widget::httpFinished() // 完成下载
|
|
||||||
{
|
|
||||||
...清理资源
|
|
||||||
download_list[nowDownload-1].readyInstall();
|
|
||||||
download_list[nowDownload-1].free=true;
|
|
||||||
if(nowDownload<allDownload){ // 如果有排队则下载下一个
|
|
||||||
...队列的下一个下载请求
|
|
||||||
}
|
|
||||||
}
|
|
||||||
void downloadlist::readyInstall()
|
|
||||||
{
|
|
||||||
...将安装按钮设置为允许点击
|
|
||||||
ui->pushButton_install->setEnabled(true);
|
|
||||||
ui->pushButton_install->show();
|
|
||||||
ui->pushButton_2->hide();
|
|
||||||
Widget::sendNotification(tr("Finished downloading %1, awaiting to install").arg(ui->label->text()), 5000,
|
|
||||||
"/tmp/spark-store/icon_"+QString::number(num).toUtf8()+".png");
|
|
||||||
}
|
|
||||||
void downloadlist::on_pushButton_install_clicked()
|
|
||||||
{
|
|
||||||
//弹出菜单
|
|
||||||
menu_install->exec(cursor().pos());
|
|
||||||
}
|
|
||||||
在 downloadlist 构造函数里将三种安装方式的按钮按条件放入了 menu_install 菜单里
|
|
||||||
用户点击时,downloadlist::install() 方法
|
|
||||||
三种安装方式为: gdebi, dpkg, deepin-deb-installer
|
|
||||||
void downloadlist::install(int t)
|
|
||||||
{
|
|
||||||
QtConcurrent::run([=](){
|
|
||||||
QProcess installer;
|
|
||||||
installer.start("pkexec gdebi -n /tmp/spark-store/"+ui->label_filename->text().toUtf8());
|
|
||||||
installer.start("pkexec ssinstall /tmp/spark-store/"+ui->label_filename->text().toUtf8());
|
|
||||||
installer.start("deepin-deb-installer /tmp/spark-store/"+ui->label_filename->text().toUtf8());
|
|
||||||
});
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
**应用卸载**
|
|
||||||
```cpp
|
|
||||||
void Widget::on_pushButton_uninstall_clicked()
|
|
||||||
{
|
|
||||||
QtConcurrent::run([=](){
|
|
||||||
uninstall.start("pkexec apt purge -y "+pkgName);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
**仓库源更新**
|
|
||||||
```cpp
|
|
||||||
// 更新源列表
|
|
||||||
void Widget::on_pushButton_updateServer_clicked()
|
|
||||||
{
|
|
||||||
QtConcurrent::run([=](){
|
|
||||||
...
|
|
||||||
QFile::remove(QDir::homePath().toUtf8()+"/.config/spark-store/server.list");
|
|
||||||
system("curl -o "+QDir::homePath().toUtf8()+"/.config/spark-store/server.list http://dcstore.shenmo.tech/store/server.list");
|
|
||||||
server.open(QDir::homePath().toUtf8()+"/.config/spark-store/server.list",std::ios::in);
|
|
||||||
...
|
|
||||||
while (getline(server,lineTmp)) {
|
|
||||||
ui->comboBox_server->addItem(QString::fromStdString(lineTmp));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
// 更新星火商店apt源
|
|
||||||
void Widget::on_pushButton_updateApt_clicked()
|
|
||||||
{
|
|
||||||
QtConcurrent::run([=](){
|
|
||||||
读取 comboBox_server 的内容,写入 /tmp/spark-store/sparkstore.list 文件
|
|
||||||
创建bash脚本,内容为将 sparkstore.list 移动到 /etc/apt/sources.list.d/ 目录下
|
|
||||||
使用QProcess 执行命令 pkexec update.sh
|
|
||||||
}):
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## 发送系统通知
|
|
||||||
```cpp
|
|
||||||
#include <libnotify/notify.h>
|
|
||||||
|
|
||||||
static NotifyNotification *_notify = nullptr; // 初始化
|
|
||||||
notify_init(tr("Spark\\ Store").toLocal8Bit()); // 构造函数初始化
|
|
||||||
notify_uninit(); // 析构函数调用
|
|
||||||
|
|
||||||
void Widget::sendNotification(const QString &message, const int msTimeout, const QString &icon)
|
|
||||||
{
|
|
||||||
if(_notify == nullptr)
|
|
||||||
{
|
|
||||||
_notify = notify_notification_new(tr("Spark\\ Store").toLocal8Bit(), message.toLocal8Bit(), icon.toLocal8Bit());
|
|
||||||
notify_notification_set_timeout(_notify, msTimeout);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
notify_notification_update(_notify, tr("Spark\\ Store").toLocal8Bit(), message.toLocal8Bit(), icon.toLocal8Bit());
|
|
||||||
|
|
||||||
notify_notification_show(_notify, nullptr);
|
|
||||||
}
|
|
||||||
```
|
|
||||||
48
DOCS/json-api-doc.md
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
# 基本格式
|
||||||
|
0. 应用信息
|
||||||
|
|
||||||
|
例子:https://cdn.d.store.deepinos.org.cn/store/tools/spark-store/app.json
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"Name": "星火应用商店",
|
||||||
|
"Version": "4.2.7.1",
|
||||||
|
"Filename": "spark-store_4.2.7.1_amd64.deb",
|
||||||
|
"Torrent_address": "spark-store_4.2.7.1_amd64.deb.torrent",
|
||||||
|
"Pkgname": "spark-store",
|
||||||
|
"Author": "shenmo <shenmo@spark-app.store>",
|
||||||
|
"Contributor": "shenmo <jifengshenmo@outlook.com>",
|
||||||
|
"Website": "https://www.spark-app.store/",
|
||||||
|
"Update": "2023-09-01 23:22:23",
|
||||||
|
"Size": "590.5 KB",
|
||||||
|
"More": "* 修复:aptss加锁失败现在会正常报错\n * 新增:在aptss的特定操作时添加了提示\n * 新增:在aptss提示加粗\n * 调整:ssinstall验证支持使用cdn.d.获取",
|
||||||
|
"Tags": "community;ubuntu;deepin;uos;dtk5",
|
||||||
|
"img_urls": "[\"https://examine-spark.oss-cn-shanghai.aliyuncs.com/images/2023/09/01/411c32fd691544bb985ecba87d151ea0.png\",\"https://examine-spark.oss-cn-shanghai.aliyuncs.com/images/2023/09/01/f44b3c2242c045e28f1161980d805e0d.png\",\"https://examine-spark.oss-cn-shanghai.aliyuncs.com/images/2023/09/01/00263ba857894667bd99240558bec69c.png\",\"https://examine-spark.oss-cn-shanghai.aliyuncs.com/images/2023/09/01/6fd248ad9eea4ef18c9c4acc2a9d372d.png\"]",
|
||||||
|
"icons": "https://examine-spark.oss-cn-shanghai.aliyuncs.com/icons/2023/09/01/a88dd18cc1734396a02e7e3c6be59718.png"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
*注意:img_urls和icons的信息不保证有效!大部分是有效的,少部分app.json可能缺失此项目!*
|
||||||
|
|
||||||
|
**对于icon和截图的获取需求请参考第三点**
|
||||||
|
|
||||||
|
1. 对于某分类下的所有应用信息
|
||||||
|
`{SOURCE_URL}/{ARCH}/{CATOGARY}/applist.json`
|
||||||
|
说明:SOURCE_URL:线路链接,目前推荐 https://cdn.d.store.deepinos.org.cn,你也可以使用其他的星火线路
|
||||||
|
ARCH:架构文件夹 x86是store或amd64-store,arm是aarch64-store。特别的,如果你使用非https://cdn.d.store.deepinos.org.cn的线路,你可能会发现amd64-store会返回404,因为不是所有的服务器都支持软连接
|
||||||
|
CATOGARY:分类目录。参考 https://gitee.com/deepin-community-store/spark-store/blob/dev/DOCS/spk-doc.md 中 store 直达的对应关系
|
||||||
|
|
||||||
|
例子:https://cdn.d.store.deepinos.org.cn/aarch64-store/tools/applist.json
|
||||||
|
|
||||||
|
2. 对于单个应用的应用信息
|
||||||
|
`{SOURCE_URL}/{ARCH}/{CATOGARY}/{Package Name}/app.json`
|
||||||
|
Package Name是包名。可从上级的applist.json读取
|
||||||
|
|
||||||
|
例子:https://cdn.d.store.deepinos.org.cn/store/tools/spark-store/app.json
|
||||||
|
|
||||||
|
3. 对应用截图和icon的获取
|
||||||
|
|
||||||
|
`{SOURCE_URL}/{ARCH}/{CATOGARY}/{Package Name}/icon.png`
|
||||||
|
`{SOURCE_URL}/{ARCH}/{CATOGARY}/{Package Name}/screen_n.png`(n=1-5)(至少为1,不是所有的都有到5. 404是正常的)
|
||||||
|
|
||||||
|
|
||||||
@@ -1,25 +1,34 @@
|
|||||||
#### 调用参数(spk规则)
|
#### 调用参数(spk规则)
|
||||||
|
|
||||||
参数只有一个Url,该url应当遵循这种格式:`spk://<任意合法字符>/web分类/包名`
|
* store直达
|
||||||
|
|
||||||
|
该url应当遵循这种格式:`spk://store/web分类/包名`
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
例如:
|
例如:
|
||||||
|
|
||||||
[spk://abcdefg/games/store.spark-app.hmcl](spk://abcdefg/games/store.spark-app.hmcl)
|
[spk://store/games/store.spark-app.hmcl](spk://store/games/store.spark-app.hmcl)
|
||||||
|
|
||||||
|
|
||||||
可选的web分类:
|
可选的web分类:
|
||||||
|
|
||||||
| 分类名称 | web分类 |
|
| 分类名称 | web分类 |
|
||||||
| -------- | -------------- |
|
| -------- | -------------- |
|
||||||
| 网络应用 | network |
|
| 网络 | network |
|
||||||
| 社交沟通 | chat |
|
| 社交 | chat |
|
||||||
| 音乐欣赏 | music |
|
| 音乐 | music |
|
||||||
| 视频播放 | video |
|
| 视频 | video |
|
||||||
| 图形图像 | graphics |
|
| 图像 | image_graphics |
|
||||||
| 游戏娱乐 | games |
|
| 游戏 | games |
|
||||||
| 办公学习 | office |
|
| 办公 | office |
|
||||||
| 阅读翻译 | reading |
|
| 阅读 | reading |
|
||||||
| 编程开发 | development |
|
| 开发 | development |
|
||||||
| 系统工具 | tools |
|
| 工具 | tools |
|
||||||
| 主题美化 | beautify |
|
| 主题 | themes |
|
||||||
| 其他应用 | others |
|
| 其他 | others |
|
||||||
|
|
||||||
|
|
||||||
|
* search搜索
|
||||||
|
|
||||||
|
spk://search/pkgname
|
||||||
|
|||||||
7
DOCS/内网部署.md
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
需要修改的内容:商店默认源位置,aptss获取apt-fast.conf和sparkstore.list的地址,ssinstall做安装检查的源位置
|
||||||
|
|
||||||
|
服务器使用update.sh进行同步。
|
||||||
|
|
||||||
|
为方便使用(其实是早期屎山使然),请将仓库放置于 `/home/ftp/spark-store`
|
||||||
|
|
||||||
|
仓库管理相关代码请移步 [这里](https://gitee.com/deepin-community-store/repo_auto_update_script),update.sh请联系 @shenmo 获取
|
||||||
41
EULA
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
星火开源软件协议(Spark Opensource LICENSE)
|
||||||
|
|
||||||
|
版权所有 (C) 2023 星火社区
|
||||||
|
|
||||||
|
根据 GNU 通用公共许可证第三版(GPL v3),本软件是自由软件,您可以修改和再发布它。但是,为了维护原作者的权益并保护社区用户的权益,请遵守以下条款:
|
||||||
|
|
||||||
|
1. 对本仓库下的所有文件生效:本许可证适用于本仓库(或项目)下的所有文件。任何使用、修改或再发布本软件的个人或组织都必须遵守本许可证。
|
||||||
|
2. 版权声明和许可证文件:您不得移除、隐藏或更改本软件中包含的原作者的版权声明和许可证文件。保留原作者的权益信息对于维护开源软件生态系统至关重要。
|
||||||
|
3. 版本标注: 如果您对本软件做出修改并再发布,您必须在醒目位置标注此版本并非星火社区官方提供。这样可以避免误导使用者认为该软件为星火社区官方提供的版本。此软件仅授权用于个人非盈利用途,任何将其用于商业目的或在盈利性组织中使用的行为均需事先获得星火社区的书面许可。
|
||||||
|
4. 商标使用:您不得在再发布版本中使用“星火应用商店”、“Spark Store”或星火应用商店的Logo等可能误导使用者此软件由星火社区官方提供的信息。
|
||||||
|
5. 服务条款:您使用星火商店软件的行为将被视为您同意星火在不侵犯您隐私的前提下搜集版本、日志等信息,以便于星火社区更好地为您提供服务。
|
||||||
|
6. 仓库版权条款:为了更好的提供持续性服务,星火仅对个人用户免费开放服务仓库,如您或您的组织需要提供商业服务或者您的组织为盈利性组织,请联系星火社区获取商业授权。
|
||||||
|
7. 禁止恶意行为和批量爬取: 用户或组织在使用本软件时,严禁进行任何形式的恶意行为,包括但不限于恶意攻击、滥用、破坏、批量爬取软件仓库等。恶意行为的定义由星火社区自行判断,违反者将被追究法律责任。
|
||||||
|
8. 分发与再分发权利: 星火社区保留对其制作的软件包的分发权利。未经明确授权,禁止任何个人或组织将星火社区软件包用于商业目的或在未获得星火社区许可的情况下进行再分发。此条款旨在确保开源精神的同时,维护星火社区的知识产权。
|
||||||
|
9. 商业应用限制:您不得使用本软件的代码开发商业应用,也不得在商业应用中使用本软件的代码,除非获得星火社区和火穗(沈阳)计算机软件开发有限公司的书面许可。
|
||||||
|
10. 其他条款:除上述约定外,若您使用了星火商店的主程序或其部分代码,您应遵守 GPL v3 的所有其他条款和要求。若本协议条款的内容与GPL V3中的内容不同的,以本协议条款为准
|
||||||
|
11. 其他约定:本许可以简体中文版本为最准确释义
|
||||||
|
|
||||||
|
GPLV3许可证的完整文本可以在以下链接找到:https://www.gnu.org/licenses/gpl-3.0.html
|
||||||
|
|
||||||
|
---------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Spark Opensource LICENSE
|
||||||
|
|
||||||
|
Copyright (C) 2023 The Spark Community
|
||||||
|
|
||||||
|
This software is free software; you can modify and redistribute it under the terms of the GNU General Public License version 3 (GPL v3). However, to protect the rights of the original authors and the interests of the community users, please adhere to the following terms:
|
||||||
|
|
||||||
|
1. Applicability to all files in this repository: This license applies to all files in this repository (or project). Any individuals or organizations that use, modify, or redistribute this software must comply with this license.
|
||||||
|
2. Copyright notice and license files: You must not remove, hide, or modify the copyright notice and license files of the original authors included in this software. Preserving the rights information of the original authors is essential for maintaining the open-source software ecosystem.
|
||||||
|
3. Version annotation: If you modify and redistribute this software, you must mark in a prominent position that this version is not officially provided by the Spark community. This avoids misleading users into thinking that the software is an official version provided by the Spark community. This software is licensed for personal, non-profit use only, and any use of it for commercial purposes or in for-profit organizations requires the prior written permission of the Spark Community.
|
||||||
|
4. Trademark usage: You are not allowed to use terms such as "Spark App Store," "Spark Store," or the logo of Spark App Store in redistributed versions, as they may mislead users into believing that the software is provided by the official Spark community.
|
||||||
|
5. Terms of Service: Your use of the software of Spark Store will be deemed as your consent to collect version, log and other information on the premise of not violating your privacy, so as to facilitate the Spark community to provide you with better services.
|
||||||
|
6. Warehouse copyright terms: In order to better provide continuous services, Spark is only free for individual users to open the service warehouse, if you or your organization needs to provide commercial services or your organization is a for-profit organization, please contact Spark community to obtain commercial authorization.
|
||||||
|
7. Prohibited malicious behavior and mass crawling: Users or organizations are strictly prohibited to engage in any form of malicious behavior when using the software, including but not limited to malicious attacks, abuse, destruction, and mass crawling of software warehouses. The definition of malicious behavior is judged by the Spark community, and violators will be held legally responsible.
|
||||||
|
8. Distribution and redistribution rights: Spark Community reserves the right to distribute the software packages it produces. Any person or organization is prohibited from using the Spark Community software package for commercial purposes or redistributing it without the express authorization of the Spark Community. This clause is intended to ensure the spirit of open source while safeguarding the intellectual property rights of the Spark community.
|
||||||
|
9. Business Application Restriction: You are not permitted to utilize the code of this software for developing commercial applications, nor are you allowed to integrate the code of this software into commercial applications without obtaining written consent from both the Spark Community and Flamescion (Shenyang) Computer Software Development Co., Ltd.
|
||||||
|
10. Other Terms: In addition to the above provisions, if you use the main program or any part of the code of Spark Store, you must comply with all other terms and requirements of GPL v3. In case of any inconsistency between the terms of this agreement and those of GPL v3, the terms of this agreement shall prevail.
|
||||||
|
11. Additional Agreements: This license shall be interpreted most accurately in its Simplified Chinese version.
|
||||||
|
|
||||||
|
You can find the full text of GPLV3 license at: https://www.gnu.org/licenses/gpl-3.0.html
|
||||||
91
FAQ.md
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
# FAQ
|
||||||
|
## Spark App Store FAQ and Support Guide
|
||||||
|
|
||||||
|
### Introduction
|
||||||
|
The Spark App Store is an application store aimed at Linux users and supports multiple Linux distributions. Below are some commonly asked questions and solutions. Please note that this document is primarily intended for ordinary users who are not familiar with Linux and the APT package management system.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Communication and Feedback
|
||||||
|
**Q: Where can I join the community group?**
|
||||||
|
**A:** You can click [here](https://www.deepinos.org/) to enter the main communication platform of the Spark Store.
|
||||||
|
> ⚠️ If the above link doesn't work, you can also join our QQ groups as an alternative. The group numbers are 872690351 and 865927727. We also offer forums for communication.
|
||||||
|
|
||||||
|
#### Differences Between arm64 and amd64
|
||||||
|
|
||||||
|
arm64
|
||||||
|
|
||||||
|
* Full Name: Advanced RISC Machine 64-bit
|
||||||
|
* Main Use: Primarily used in mobile devices, embedded systems, and some new servers and desktop computers.
|
||||||
|
* Advantages: Low power consumption, high efficiency, suitable for battery-driven and heat-sensitive devices.
|
||||||
|
* Main Manufacturers: Apple, Qualcomm, HiSilicon, Phytium, etc.
|
||||||
|
|
||||||
|
amd64
|
||||||
|
|
||||||
|
* Full Name: AMD 64-bit, also known as x86_64
|
||||||
|
* Main Use: Primarily used in desktop computers, laptops, and servers.
|
||||||
|
* Advantages: High performance, suitable for computation-intensive applications.
|
||||||
|
* Main Manufacturers: Intel and AMD.
|
||||||
|
* The main differences between the two are in the instruction sets and application scenarios. amd64 is usually used for high-performance computers and servers, while arm64 is more commonly used in power-sensitive settings.
|
||||||
|
|
||||||
|
#### How to Check:
|
||||||
|
|
||||||
|
Linux:
|
||||||
|
|
||||||
|
- Open the terminal.
|
||||||
|
- Type `uname -m` or `arch` and press Enter.
|
||||||
|
- You will see your processor architecture (possibly x86_64, aarch64, etc.).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Domestic Architecture Support
|
||||||
|
**Q: I use a domestic chip architecture, how can I get applications?**
|
||||||
|
**A:** Currently, Spark Store supports **arm** architecture for domestic chips. You can download deb packages suitable for arm64 architecture.
|
||||||
|
> ⚠️ Please note that this is experimental support. If you encounter any issues, please provide feedback via Spark's communication platform, QQ group, or forums.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Dependency Issues
|
||||||
|
**Q: I get errors when installing dependencies**
|
||||||
|
**A:** If you are using UOS or deepin, please do not install the dependency packages. For Kali Linux/Kdeneon etc., temporary support is not available, please compile and install yourself.
|
||||||
|
> 💡 If errors occur, try running `sudo apt update` before attempting the installation again. If the issue persists, refer to the first question and seek help on the community platform.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Submission and App Updates
|
||||||
|
**Q: Where can I submit applications?**
|
||||||
|
**A:** You can find the "Submit Application" option in the upper-right corner menu of the app store interface.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Support for Non-deepin/UOS Users
|
||||||
|
**Q: I'm not a deepin/UOS user; can I use the Spark App Store?**
|
||||||
|
**A:** Yes, you can directly install if you're using Ubuntu 22.04. For Ubuntu 20.04/Debian10/Debian11, please install the dependencies first.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Installation Methods
|
||||||
|
**Q: Can I use dpkg -i for installation?**
|
||||||
|
**A:** No! Use `sudo apt install ./xxxx.deb` to install, or use graphical installers like gdebi.
|
||||||
|
> ⚠️ Using dpkg directly will not handle software dependencies, which is a common mistake.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### System Updates
|
||||||
|
**Q: Will the Spark Store affect normal system updates?**
|
||||||
|
**A:** No, the Spark Store has separated its application sources from system sources and will not affect regular system updates.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Reporting Issues and Removing Apps
|
||||||
|
**Q: Some apps are outdated or inactive, and I want them removed**
|
||||||
|
**A:** You can report issues [here](https://gitee.com/deepin-community-store/software_-issue).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Installing Spark App Store
|
||||||
|
If you wish to install the Spark App Store, please visit the [Release page](https://gitee.com/deepin-community-store/spark-store/releases), find the latest version, and choose the package suitable for your current system.
|
||||||
|
|
||||||
|
> ⚠️ Special Note: If you are using Debian10/Debian11 or Ubuntu 20.04, you may need to download additional dependency packages. After downloading, unzip multiple times until you see the software user guide. For operating systems later than Ubuntu 22.04, you do not need to install dependency packages. Just follow the steps above to install the main program directly.
|
||||||
|
|
||||||
|
---
|
||||||
90
FAQ.zh.md
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
# FAQ
|
||||||
|
## 星火应用商店FAQ与支持指南
|
||||||
|
|
||||||
|
### 简介
|
||||||
|
星火应用商店是一个面向 Linux 用户的应用商店,支持多种不同的 Linux 发行版。以下是一些常见问题及解决方案。请注意,该文档主要面向对 Linux 和 APT 软件包管理系统不熟悉的普通用户。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 交流与反馈
|
||||||
|
**Q: 在哪进交流群?**
|
||||||
|
**A:** 你可以点击[这里](https://www.deepinos.org/)进入星火商店的主交流平台。
|
||||||
|
> ⚠️ 如果上面的链接无法使用,你还可以加入我们的 QQ 群作为备选方案,群号是 872690351 和 865927727。我们还提供论坛作为交流平台。
|
||||||
|
|
||||||
|
arm64与amd64的区别
|
||||||
|
|
||||||
|
arm64
|
||||||
|
|
||||||
|
* 全称: Advanced RISC Machine 64-bit
|
||||||
|
* 主要用途: 主要应用于移动设备、嵌入式系统以及一些新型的服务器和桌面计算机。
|
||||||
|
* 优势: 低功耗、高效率,适合用在电池驱动和热敏感的设备。
|
||||||
|
* 主要生产商: 苹果、高通、海思、飞腾等。
|
||||||
|
|
||||||
|
amd64
|
||||||
|
|
||||||
|
* 全称: AMD 64-bit, 也被称为 x86_64
|
||||||
|
* 主要用途: 主要应用于桌面计算机、笔记本以及服务器。
|
||||||
|
* 优势: 高性能,适用于计算密集型应用。
|
||||||
|
* 主要生产商: Intel和AMD。
|
||||||
|
* 两者最主要的不同在于指令集和应用场景。amd64通常用于高性能需求的计算机和服务器,而arm64则更多应用于功耗要求更严格的场合。
|
||||||
|
|
||||||
|
查看方法:
|
||||||
|
|
||||||
|
Linux:
|
||||||
|
|
||||||
|
- 打开终端。
|
||||||
|
- 输入 uname -m 或 arch 并按回车。
|
||||||
|
- 你将看到你的处理器架构(可能是 x86_64, aarch64 等)。
|
||||||
|
---
|
||||||
|
|
||||||
|
### 国产架构支持
|
||||||
|
**Q: 我是国产架构,怎么获取应用?**
|
||||||
|
**A:** 目前,星火商店支持**arm**架构的国产芯片。你可以下载适用于 arm64 架构的deb包(软件安装包)。
|
||||||
|
> ⚠️ 请注意,这是实验性的支持。如果遇到问题,请在星火交流平台、QQ群或论坛向我们反馈。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 安装依赖问题
|
||||||
|
**Q: 安装依赖包出现错误**
|
||||||
|
**A:** 如果你使用UOS或deepin,请不要安装依赖包。对于Kali Linux/Kdeneon等,暂时不支持,请自行编译安装。
|
||||||
|
> 💡 出现错误时,尝试运行 `sudo apt update` 后再尝试安装。如果问题仍然存在,请参考第一条,进入交流平台寻求帮助。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 投稿与应用更新
|
||||||
|
**Q: 在哪里投稿?**
|
||||||
|
**A:** 你可以在应用商店界面的右上角菜单找到“投递应用”的选项。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 非deepin/UOS用户支持
|
||||||
|
**Q: 我不是deepin/UOS用户,可以使用星火应用商店吗?**
|
||||||
|
**A:** 可以,如果你是使用 Ubuntu 22.04,请直接安装。对于 Ubuntu 20.04/Debian10/Debian11,请先安装依赖包。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 安装方法
|
||||||
|
**Q: 我可以用dpkg -i安装吗?**
|
||||||
|
**A:** 不可以!使用 `sudo apt install ./xxxx.deb` 来安装,或者使用gdebi等图形化的安装器。
|
||||||
|
> ⚠️ 直接使用dpkg是不会处理软件依赖的,这是一个常见的错误。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 系统更新
|
||||||
|
**Q: 星火商店会影响系统正常更新吗?**
|
||||||
|
**A:** 不会,星火商店已经将应用源与系统源分开,不会影响系统的正常更新。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 报告问题和应用下架
|
||||||
|
**Q: 有些应用已经过时或者失效了,我想让他下架**
|
||||||
|
**A:** 你可以前往 [这里](https://gitee.com/deepin-community-store/software_-issue) 报告问题。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 安装星火应用商店
|
||||||
|
如果你想安装星火应用商店,请打开[Release页面](https://gitee.com/deepin-community-store/spark-store/releases),找到最新版本,并选择适用于当前系统的安装包下载。
|
||||||
|
|
||||||
|
> ⚠️ 特别提示: 如果你在使用 Debian10/Debian11 或 Ubuntu 20.04,你可能额外下载依赖补充包。您需要在下载完依赖包后,解压多次一直到看到内部的软件使用说明,对于 Ubuntu22.04 以后的操作系统版本,您无需安装依赖包,您需要按照上面的操作直接安装本体程序。
|
||||||
|
|
||||||
|
---
|
||||||
182
README.md
@@ -1,73 +1,167 @@
|
|||||||
# Spark App Store
|
# Spark App Store
|
||||||
[](https://gitee.com/deepin-community-store/spark-store/stargazers) [](https://gitee.com/deepin-community-store/spark-store/members)
|
[](https://gitee.com/spark-store-project/spark-store/stargazers) [](https://gitee.com/spark-store-project/spark-store/members)
|
||||||
|
|
||||||
Spark Store aims to collect Linux apps for the convieniece of Linux new comers
|
## Introduction
|
||||||
|
|
||||||
The collecting process needs everyone's help
|
Welcome to the Spark App Store! This is an app store designed for Linux users, aiming to solve the problem of dispersed and difficult-to-obtain applications in the Linux ecosystem. No matter what type of Linux distribution you are using, you may find suitable software packages here.
|
||||||
|
|
||||||
We set up this APP Store and collect APPs/tools that everyone need widely. Also we pack Windows apps with wine.
|
The number of Linux applications is relatively limited, and the availability of Wine software is also quite challenging. Excellent development and tool resources are scattered across various communities and forums, making it difficult for the entire ecosystem to improve comprehensively.
|
||||||
|
|
||||||
All packages will be shared in our repository for users to get freely.
|
The construction of the ecosystem is not dependent on the isolated efforts of individuals but requires the participation of the entire community. Only when everyone's "sparks" gather together can they ignite a "prairie fire."
|
||||||
|
|
||||||
Distrobution supported:Deepin 20 ; Ubuntu 22.04 LTS / Ubuntu 20.04 LTS(May stop support in the future) ; UniontechOS Home 21
|
To improve this situation, we have launched this app store. We have broadly included various user-demand software packages, gathered high-quality tools, and actively adapted Wine applications, all stored in our software library for easy user access.
|
||||||
|
|
||||||
*About OpenKylin and deepin 23*
|
**Currently supported Linux distributions include:**
|
||||||
|
|
||||||
The adaptation work is scheduled after their official release.
|
- **amd64 architecture:** deepin 20 / deepin 23 / Ubuntu 20.04 / Ubuntu 22.04 / UOS Home Edition 20
|
||||||
|
- **arm64 architecture:** UOS Professional Edition 1060 / Ubuntu 22.04 / deepin 23
|
||||||
|
- **loong64 architecture:** deepin 23
|
||||||
|
|
||||||
You can track our Issue resoving progress here https://gitee.com/deepin-community-store/spark-store/board
|
> Special Note: We also support all versions of Ubuntu operating systems higher than Ubuntu 22.04, such as Ubuntu 22.10, 23.04, 23.10, etc.
|
||||||
|
|
||||||
|
**Important Notice:** This software does not provide any form of warranty. If you plan to use it on UOS Professional Edition, please make sure to understand and enable Developer Mode. Make sure you have basic troubleshooting capabilities. It should be clear that we have not conducted extensive testing on the UOS operating system. Therefore, using the Spark client may lead to a series of issues like failed system updates, data loss, etc., all risks to be borne by the user.
|
||||||
|
|
||||||
We hope people who see here can also join our team,development help or submit applications are welcomed
|
## Team Collaboration: For detailed documentation related to branch management, please see [this link](https://wiki.spark-app.store/#/Dev/Spark-Store-Git-Repo).
|
||||||
|
|
||||||
If you want to submit an APP to share with others,Please [Click here](https://upload.deepinos.org/index)
|
We warmly welcome you to join our development team. Whether you want to participate in development or submit applications, you can find your place here to jointly promote the development of the Linux application ecosystem.
|
||||||
|
|
||||||
|
You can track our Issue handling status in real-time through the following link: [Gitee Issue Board](https://gitee.com/spark-store-project/spark-store/board).
|
||||||
|
|
||||||
## 🙌 A simple start
|
If you have a software package you'd like to submit, please [click here to submit](https://upload.deepinos.org.cn/index).
|
||||||
|
|
||||||
If you simply want to install the Spark Store,just enter the [Release] page, find the version you want and install.
|
## Contents
|
||||||
|
|
||||||
If you are using Debian11/Ubuntu 20.04, you will need extra dependency package. Available [here](https://code.gitlink.org.cn/shenmo7192/spark-store-dependencies/raw/branch/master/spark-store-dependencies-kylin.zip)
|
- [Read the copyright](#read-the-copyright)
|
||||||
|
- [Determine your system architecture](#determine-your-system-architecture)
|
||||||
|
- [System support and installation guide](#system-support-and-installation-guide)
|
||||||
|
- [For Deepin / UOS Users](#for-deepin-users)
|
||||||
|
- [For Ubuntu Users](#for-ubuntu-users)
|
||||||
|
- [For Debian Users](#for-debian-users)
|
||||||
|
- [Frequently Asked Questions (FAQ)](#frequently-asked-questions-faq)
|
||||||
|
- [Contact and Feedback](#contact-and-feedback)
|
||||||
|
|
||||||
---
|
---
|
||||||
#### Compile and developement
|
|
||||||
|
|
||||||
|
## Read [the copyright](LICENSE)
|
||||||
For Deepin V20/UOS 21/ Debian 11
|
|
||||||
|
|
||||||
```shell
|
|
||||||
sudo apt install git qt5-default debhelper pkg-config qtchooser libqt5core5a libqt5gui5 libqt5widgets5 libqt5network5 libqt5concurrent5 libdtkcore-dev libdtkgui-dev libdtkwidget-dev qttools5-private-dev libnotify-dev qtwebengine5-dev fakeroot qtwayland5 qtwayland5-dev-tools dde-qt5wayland-plugin
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
Ubuntu 22.04
|
|
||||||
```shell
|
|
||||||
sudo apt install git qtbase5-dev debhelper pkg-config qtchooser libqt5core5a libqt5gui5 libqt5widgets5 libqt5network5 libqt5concurrent5 libdtkcore-dev libdtkgui-dev libdtkwidget-dev qttools5-private-dev libnotify-dev qtwebengine5-dev qtwayland5 qtwayland5-dev-tools
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
Then
|
|
||||||
|
|
||||||
```shell
|
|
||||||
git clone https://gitee.com/deepin-community-store/spark-store.git
|
|
||||||
cd spark-store
|
|
||||||
dpkg-buildpackage
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## 🚀 Coorperation
|
## Determine your system architecture
|
||||||
|
|
||||||
We use Gitee as our code hosting platform. Please click here to contact us.
|
Before installing any software, you need to know what architecture your computer runs on (such as x86_64/amd64 or aarch64/arm64).
|
||||||
|
|
||||||
https://gitee.com/deepin-community-store/spark-store
|
**How to check:**
|
||||||
|
|
||||||
### Rocket Chat
|
1. Open a Linux terminal.
|
||||||
|
2. Type `uname -m` or `arch` and press Enter.
|
||||||
|
|
||||||
https://chat.shenmo.tech/
|
You will see an output, and that's your system architecture.
|
||||||
|
|
||||||
PWA Client:
|
- If you see `x86_64`, your system is AMD64 architecture.
|
||||||
|
- If you see `aarch64`, your system is ARM64 architecture.
|
||||||
|
|
||||||
spk://store/chat/store.spark-app.feedback
|
---
|
||||||
|
|
||||||
(Copy and paste to search bar or in browser address bar after installing Spark Store)
|
## System support and installation guide
|
||||||
|
|
||||||
|
### For Deepin Users
|
||||||
|
|
||||||
|
#### For Deepin Users
|
||||||
|
|
||||||
|
1. **Download and Install**
|
||||||
|
|
||||||
|
You can directly search for Spark App Store in the Deepin Store to install, or copy this link to open and install in your browser:
|
||||||
|
|
||||||
|
> appstore://deepin-home-appstore-client?app_detail_info/spark-store
|
||||||
|
|
||||||
|
To use the latest version, please visit the [Spark App Store Release page](https://gitee.com/spark-store-project/spark-store/releases) and download the latest version suitable for Deepin. Install to use.
|
||||||
|
|
||||||
|
Assuming you've downloaded to the `Downloads` folder in your user directory, we recommend you use the APT tool to install:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
cd ~/Downloads
|
||||||
|
sudo apt install ./spark-store*.deb
|
||||||
|
```
|
||||||
|
|
||||||
|
### For Ubuntu Users
|
||||||
|
|
||||||
|
#### For Ubuntu 20.04 Users
|
||||||
|
|
||||||
|
1. **Download Dependencies**
|
||||||
|
* Please visit the [Spark App Store Dependency Download page](https://gitee.com/spark-store-project/spark-store-dependencies/releases) and download the latest dependency package.
|
||||||
|
* Unzip the dependency package multiple times until you see multiple installation packages ending with `.deb`.
|
||||||
|
* Follow the instructions in the dependency package to install all the dependencies at once.
|
||||||
|
|
||||||
|
2. **Download and Install**
|
||||||
|
|
||||||
|
Visit the [Spark App Store Release page](https://gitee.com/spark-store-project/spark-store/releases), download the installation package that matches your computer's architecture, and install it.
|
||||||
|
|
||||||
|
Assuming you've downloaded to the `Downloads` folder in your user directory, we recommend you use the APT tool to install:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
cd ~/Downloads
|
||||||
|
sudo apt install ./spark-store*.deb
|
||||||
|
```
|
||||||
|
|
||||||
|
#### For Ubuntu 22.04 and Higher Version Users
|
||||||
|
|
||||||
|
1. **No Need to Install Dependencies**
|
||||||
|
|
||||||
|
2. **Download and Install**
|
||||||
|
|
||||||
|
Visit the [Spark App Store Release page](https://gitee.com/spark-store-project/spark-store/releases), download the installation package that matches your computer's architecture, and install it.
|
||||||
|
|
||||||
|
Assuming you've downloaded to the `Downloads` folder in your user directory, we recommend you use the APT tool to install:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
cd ~/Downloads
|
||||||
|
sudo apt install ./spark-store*.deb
|
||||||
|
```
|
||||||
|
|
||||||
|
### For Debian Users
|
||||||
|
|
||||||
|
#### For Debian 11 Users
|
||||||
|
|
||||||
|
1. **Download Dependencies**
|
||||||
|
* Please visit the [Spark App Store Dependency Download page](https://gitee.com/spark-store-project/spark-store-dependencies/releases) and download the latest dependency package.
|
||||||
|
* Unzip the dependency package multiple times until you see multiple installation packages ending with `.deb`.
|
||||||
|
* Follow the instructions in the dependency package to install all the dependencies at once.
|
||||||
|
|
||||||
|
2. **Download and Install**
|
||||||
|
|
||||||
|
Please visit the [Spark App Store Release page](https://gitee.com/spark-store-project/spark-store/releases) and download. Install to use.
|
||||||
|
|
||||||
|
#### For Debian 12+ Users
|
||||||
|
|
||||||
|
1. **No Need to Install Dependencies**
|
||||||
|
|
||||||
|
2. **Download and Install**
|
||||||
|
|
||||||
|
Please visit the [Spark App Store Release page](https://gitee.com/spark-store-project/spark-store/releases), download the installation package that matches your computer's architecture, and install it.
|
||||||
|
|
||||||
|
Assuming you've downloaded to the `Downloads` folder in your user directory, we recommend you use the APT tool to install:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
cd ~/Downloads
|
||||||
|
sudo apt install ./spark-store*.deb
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Frequently Asked Questions (FAQ)
|
||||||
|
|
||||||
|
Please refer to the [Spark App Store FAQ and Support Guide](https://gitee.com/spark-store-project/spark-store/blob/dev/FAQ.md).
|
||||||
|
|
||||||
|
You can also check the [Chinese version](https://gitee.com/spark-store-project/spark-store/blob/dev/FAQ.zh.md) here.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Contact and Feedback
|
||||||
|
|
||||||
|
- If you have any questions or suggestions, please submit them via email or on our [Gitee page](https://gitee.com/spark-store-project/spark-store/issues).
|
||||||
|
- If you want to follow our development progress, you can go to the [Spark App Store Board](https://gitee.com/spark-store-project/spark-store/board) for more information.
|
||||||
|
- Our [Forum](https://bbs.spark-app.store/)
|
||||||
|
- Our [QQ Group](https://blog.shenmo.tech/post/%E6%95%85%E9%9A%9C%E5%85%AC%E5%91%8A/)
|
||||||
|
- For commercial support, please leave your issue~
|
||||||
|
|
||||||
|
---
|
||||||
210
README.zh.md
@@ -1,68 +1,188 @@
|
|||||||
# 星火应用商店
|
# 星火应用商店
|
||||||
[](https://gitee.com/deepin-community-store/spark-store/stargazers) [](https://gitee.com/deepin-community-store/spark-store/members)
|
[](https://gitee.com/spark-store-project/spark-store/stargazers) [](https://gitee.com/spark-store-project/spark-store/members)
|
||||||
|
|
||||||
众所周知,国内的Linux应用比较少,wine应用难以获取,优质工具分散在民间各大论坛,无法形成合力,难以改善生态
|
|
||||||
|
|
||||||
生态构建需要的不是某一方的单打独斗,而是人人行动起来,汇聚星火,产生燎原之势
|
|
||||||
|
|
||||||
我们创建了这个应用商店,广泛收录大家需要的软件包,搜集优质小工具,主动适配wine应用,存放到储存库供大家获取
|
|
||||||
我们支持:Deepin 20 ; Ubuntu 22.04 LTS / Ubuntu 20.04 LTS(将会逐渐停止支持) ; UOS Home 21
|
|
||||||
|
|
||||||
## 关于协作:分支相关的文档见 [这里](https://deepin-community-store.gitee.io/spark-wiki/#/Dev/Spark-Store-Git-Repo)
|
|
||||||
|
|
||||||
*关于OpenKylin和deepin 23*
|
|
||||||
|
|
||||||
支持计划将会在对应系统发布正式版之后开始评估和执行
|
|
||||||
|
|
||||||
希望看到这里的人也可以加入我们的队伍,开发或者投递应用都很欢迎,共同构建Linux应用生态
|
|
||||||
|
|
||||||
在这里追踪我们的Issue处理情况 https://gitee.com/deepin-community-store/spark-store/board
|
|
||||||
|
|
||||||
如果有想要提交的软件包,请 [在这里投稿](https://upload.deepinos.org/index)
|
|
||||||
|
|
||||||
|
|
||||||
## 🙌 简单的开始
|
|
||||||
|
|
||||||
如果想安装 `星火应用商店` ,请打开右侧的 [Release] 页面,找到最新版本,并选择适用于当前系统的安装包下载。
|
## 简介
|
||||||
|
|
||||||
如果你在使用 `Debian 11/Ubuntu 20.04`,你需要额外下载[依赖补充包](https://code.gitlink.org.cn/shenmo7192/spark-store-dependencies/raw/branch/master/spark-store-dependencies-kylin.zip)
|
欢迎来到星火应用商店!这是一个为Linux用户设计的应用商店,旨在解决Linux生态下应用分散、难以获取的问题。无论你是使用什么类型的Linux发行版,这里都有可能找到适合你的软件包。
|
||||||
|
|
||||||
|
|
||||||
|
Linux 应用的数量相对有限,Wine 软件的可获得性也颇为困难。优秀的开发和工具资源散布在各大社区和论坛之间,这种分散化让整个生态系统难以得到全面的提升。
|
||||||
|
|
||||||
|
生态系统的构建并非依赖个体的孤立努力,而需要全社区共同参与。只有当大家的“星火”聚集一处,方可引发“燎原之势”。
|
||||||
|
|
||||||
|
为了改善这一现状,我们推出了这个应用商店。我们广泛地收录了各种用户需求的软件包,汇集了高质量的小工具,并主动对 Wine 应用进行了适配,一切都储存在我们的软件库中,使得用户可以方便地获取这些应用。
|
||||||
|
|
||||||
|
**当前支持的Linux发行版包括:**
|
||||||
|
|
||||||
|
- **amd64架构:** deepin 20 / deepin 23 / Ubuntu 20.04 / Ubuntu 22.04 / UOS家庭版20
|
||||||
|
- **arm64架构:** UOS专业版1060 / Ubuntu 22.04 / deepin 23
|
||||||
|
- **loong64架构:** deepin 23
|
||||||
|
|
||||||
|
> 特别说明:我们还支持所有版本高于Ubuntu 22.04的Ubuntu操作系统,例如Ubuntu 22.10、23.04、23.10等。
|
||||||
|
|
||||||
|
**重要须知:** 本软件不提供任何形式的保证。若您计划在UOS专业版上使用,请务必了解并启用开发者模式。请确保您具备基础的故障排查能力。需要明确的是,我们没有在UOS操作系统上进行广泛的测试。因此,使用星火客户端可能会导致一系列问题,如系统更新失败、数据丢失等,所有风险需由用户自行承担。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 关于团队协作
|
||||||
|
|
||||||
|
组织仓库链接:
|
||||||
|
https://gitee.com/spark-store-project/spark-store
|
||||||
|
|
||||||
|
https://gitcode.com/spark-store-project/spark-store
|
||||||
|
|
||||||
|
https://github.com/spark-store-project/spark-store
|
||||||
|
|
||||||
|
分支管理相关的详细文档可参见 [此链接](https://wiki.spark-app.store/#/Dev/Spark-Store-Git-Repo)。
|
||||||
|
|
||||||
|
我们热忱欢迎您加入我们的开发团队。无论您是想参与开发,还是想提交应用,都能在这里找到属于您的一席之地,共同推动Linux应用生态的发展。
|
||||||
|
|
||||||
|
您可以通过以下链接,实时跟踪我们的Issue处理状态:[Gitee Issue看板](https://gitee.com/spark-store-project/spark-store/board)。
|
||||||
|
|
||||||
|
若您有软件包想要提交,敬请 [点击此处进行投稿](https://wiki.spark-app.store/#/Submit/Submit)。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## 目录
|
||||||
|
|
||||||
|
- [阅读版权声明](#阅读版权声明)
|
||||||
|
- [确定你的系统架构](#确定你的系统架构)
|
||||||
|
- [系统支持与安装指引](#系统支持与安装指引)
|
||||||
|
- [对于 Deepin / UOS 用户](#对于deepin用户)
|
||||||
|
- [对于 Ubuntu 用户](#对于ubuntu用户)
|
||||||
|
- [对于 Debian 用户](#对于debian用户)
|
||||||
|
- [常见问题(FAQ)](#常见问题faq)
|
||||||
|
- [联系与反馈](#联系与反馈)
|
||||||
|
|
||||||
---
|
---
|
||||||
#### 编译安装
|
|
||||||
|
## 阅读[版权声明](LICENSE)
|
||||||
|
|
||||||
|
|
||||||
Deepin V20/UOS 21 系统下, 安装依赖
|
## 确定你的系统架构
|
||||||
|
|
||||||
```shell
|
在安装任何软件之前,你需要知道你的计算机运行的是哪种架构(如x86_64/amd64或aarch64/arm64)。
|
||||||
sudo apt install git qt5-default debhelper pkg-config qtchooser libqt5core5a libqt5gui5 libqt5widgets5 libqt5network5 libqt5concurrent5 libdtkcore-dev libdtkgui-dev libdtkwidget-dev qttools5-private-dev libnotify-dev qtwebengine5-dev fakeroot qtwayland5 qtwayland5-dev-tools dde-qt5wayland-plugin
|
|
||||||
|
|
||||||
```
|
**如何检查:**
|
||||||
|
|
||||||
Ubuntu 22.04 系统下, 安装依赖
|
1. 打开Linux终端。
|
||||||
```shell
|
2. 输入 `uname -m` 或 `arch` 并按回车。
|
||||||
sudo apt install git qtbase5-dev debhelper pkg-config qtchooser libqt5core5a libqt5gui5 libqt5widgets5 libqt5network5 libqt5concurrent5 libdtkcore-dev libdtkgui-dev libdtkwidget-dev qttools5-private-dev libnotify-dev qtwebengine5-dev qtwayland5 qtwayland5-dev-tools
|
|
||||||
|
|
||||||
```
|
你会看到一个输出,这就是你的系统架构。
|
||||||
|
|
||||||
然后
|
- 如果看到 `x86_64`,你的系统是AMD64架构。
|
||||||
```shell
|
- 如果看到 `aarch64`,你的系统是ARM64架构。
|
||||||
git clone https://gitee.com/deepin-community-store/spark-store.git
|
|
||||||
cd spark-store
|
---
|
||||||
dpkg-buildpackage
|
|
||||||
```
|
## 系统支持与安装指引
|
||||||
|
|
||||||
|
根据你的Linux发行版和系统架构,以下是安装星火应用商店的详细步骤。
|
||||||
|
|
||||||
|
### 对于 Deepin 用户
|
||||||
|
|
||||||
|
#### 对于 Deepin 用户
|
||||||
|
|
||||||
|
1. **下载并安装**
|
||||||
|
|
||||||
|
您可直接在深度商店搜索 星火应用商店 安装,或复制此链接到浏览器打开安装
|
||||||
|
|
||||||
|
> appstore://deepin-home-appstore-client?app_detail_info/spark-store
|
||||||
|
|
||||||
|
|
||||||
|
若要使用最新版本,请访问[星火应用商店的Release页面](https://gitee.com/spark-store-project/spark-store/releases)或[Gitcode的Release页面](https://gitcode.com/spark-store-project/spark-store/releases)并下载适用于Deepin的最新版本。安装后即可使用。
|
||||||
|
|
||||||
## 🚀 协作
|
假设您下载到用户目录下的 Downloads 文件夹, 我们推荐您使用 APT 工具安装:
|
||||||
|
|
||||||
非常感谢有兴趣的开发者或爱好者参与 `星火应用商店` 项目,分享你的见解与思路。
|
```shell
|
||||||
|
cd ~/Downloads
|
||||||
|
sudo apt install ./spark-store*.deb
|
||||||
|
```
|
||||||
|
|
||||||
### 交流平台
|
### 对于 Ubuntu 用户
|
||||||
|
|
||||||
https://chat.shenmo.tech/
|
#### 对于 Ubuntu 20.04 用户
|
||||||
|
|
||||||
客户端PWA:
|
1. **下载依赖包**
|
||||||
|
* 请访问[星火应用商店依赖包下载页面](https://gitee.com/spark-store-project/spark-store-dependencies/releases), 下载最新的依赖包。
|
||||||
|
* 请多次解压依赖包,直到你可以看到诸多以 deb 结尾的安装包。
|
||||||
|
* 依据依赖包内的说明,一次性安装所有的依赖包。
|
||||||
|
|
||||||
spk://store/chat/store.spark-app.feedback
|
|
||||||
|
|
||||||
(安装星火商店后在浏览器打开或复制到搜索栏打开)
|
2. **下载并安装**
|
||||||
|
|
||||||
|
请访问[星火应用商店的Release页面](https://gitee.com/spark-store-project/spark-store/releases)或[Gitcode的Release页面](https://gitcode.com/spark-store-project/spark-store/releases),下载和您电脑相同架构的安装包并安装。
|
||||||
|
|
||||||
|
假设您下载到用户目录下的 Downloads 文件夹, 我们推荐您使用 APT 工具安装:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
cd ~/Downloads
|
||||||
|
sudo apt install ./spark-store*.deb
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 对于 Ubuntu 22.04 及更高版本的 Ubuntu 用户
|
||||||
|
1. **无需安装依赖包**
|
||||||
|
|
||||||
|
|
||||||
|
2. **下载并安装**
|
||||||
|
|
||||||
|
请访问[星火应用商店的Release页面](https://gitee.com/spark-store-project/spark-store/releases)或[Gitcode的Release页面](https://gitcode.com/spark-store-project/spark-store/releases),下载和您电脑相同架构的安装包并安装。
|
||||||
|
|
||||||
|
假设您下载到用户目录下的 Downloads 文件夹, 我们推荐您使用 APT 工具安装:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
cd ~/Downloads
|
||||||
|
sudo apt install ./spark-store*.deb
|
||||||
|
```
|
||||||
|
|
||||||
|
### 对于 Debian 用户
|
||||||
|
|
||||||
|
#### 对于 Debian 11 用户
|
||||||
|
|
||||||
|
1. **下载依赖包**
|
||||||
|
* 请访问[星火应用商店依赖包下载页面](https://gitee.com/spark-store-project/spark-store-dependencies/releases), 下载最新的依赖包。
|
||||||
|
* 请多次解压依赖包,直到你可以看到诸多以 deb 结尾的安装包。
|
||||||
|
* 依据依赖包内的说明,一次性安装所有的依赖包。
|
||||||
|
|
||||||
|
2. **下载并安装**
|
||||||
|
|
||||||
|
请访问[星火应用商店的Release页面](https://gitee.com/spark-store-project/spark-store/releases)或[Gitcode的Release页面](https://gitcode.com/spark-store-project/spark-store/releases)并下载,安装后即可使用。
|
||||||
|
|
||||||
|
|
||||||
|
#### 对于 Debian 12+ 用户
|
||||||
|
|
||||||
|
1. **无需安装依赖包**
|
||||||
|
|
||||||
|
|
||||||
|
2. **下载并安装**
|
||||||
|
|
||||||
|
请访问[星火应用商店的Release页面](https://gitee.com/spark-store-project/spark-store/releases)或[Gitcode的Release页面](https://gitcode.com/spark-store-project/spark-store/releases),下载和您电脑相同架构的安装包并安装。
|
||||||
|
|
||||||
|
假设您下载到用户目录下的 Downloads 文件夹, 我们推荐您使用 APT 工具安装:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
cd ~/Downloads
|
||||||
|
sudo apt install ./spark-store*.deb
|
||||||
|
```
|
||||||
|
---
|
||||||
|
|
||||||
|
## 常见问题(FAQ)
|
||||||
|
|
||||||
|
请参见[星火应用商店FAQ与支持指南](https://gitee.com/spark-store-project/spark-store/blob/dev/FAQ.md)。
|
||||||
|
|
||||||
|
在这里可以查阅[中文版本](https://gitee.com/spark-store-project/spark-store/blob/dev/FAQ.zh.md)。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 联系与反馈
|
||||||
|
|
||||||
|
- 如果您有任何问题或建议,请通过邮件或在[Gitee页面](https://gitee.com/spark-store-project/spark-store/issues)上提交问题。
|
||||||
|
- 如果你想关注我们的开发进度,可以跳转[星火应用商店Board](https://gitee.com/spark-store-project/spark-store/board)获取更多信息。
|
||||||
|
- 我们的[论坛](https://bbs.spark-app.store/)
|
||||||
|
- 我们的QQ群 872690351
|
||||||
|
- 商业支持请留言咨询~
|
||||||
|
|
||||||
|
---
|
||||||
|
|||||||
24
build_and_install.sh
Executable file
@@ -0,0 +1,24 @@
|
|||||||
|
|
||||||
|
# Deepin V20/UOS 21 系统下, 安装依赖
|
||||||
|
|
||||||
|
# ```shell
|
||||||
|
# sudo apt install git qt5-default debhelper pkg-config qtchooser libqt5core5a libqt5gui5 libqt5widgets5 libqt5network5 libqt5concurrent5 libdtkcore-dev libdtkgui-dev libdtkwidget-dev qttools5-private-dev libnotify-dev qtwebengine5-dev fakeroot qtwayland5 qtwayland5-dev-tools dde-qt5wayland-plugin
|
||||||
|
|
||||||
|
# ```
|
||||||
|
|
||||||
|
# Ubuntu 22.04 系统下, 安装依赖
|
||||||
|
# ```shell
|
||||||
|
# sudo apt install git qtbase5-dev debhelper pkg-config qtchooser libqt5core5a libqt5gui5 libqt5widgets5 libqt5network5 libqt5concurrent5 libdtkcore-dev libdtkgui-dev libdtkwidget-dev qttools5-private-dev libnotify-dev qtwebengine5-dev qtwayland5 qtwayland5-dev-tools
|
||||||
|
|
||||||
|
# ```
|
||||||
|
|
||||||
|
echo "Deepin V20/UOS 21 系统下, 安装依赖"
|
||||||
|
echo "sudo apt install git qt5-default debhelper pkg-config qtchooser libqt5core5a libqt5gui5 libqt5widgets5 libqt5network5 libqt5concurrent5 libdtkcore-dev libdtkgui-dev libdtkwidget-dev qttools5-private-dev libnotify-dev qtwebengine5-dev fakeroot qtwayland5 qtwayland5-dev-tools dde-qt5wayland-plugin"
|
||||||
|
|
||||||
|
echo "Ubuntu 22.04 系统下, 安装依赖"
|
||||||
|
echo "sudo apt install git qtbase5-dev debhelper pkg-config qtchooser libqt5core5a libqt5gui5 libqt5widgets5 libqt5network5 libqt5concurrent5 libdtkcore-dev libdtkgui-dev libdtkwidget-dev qttools5-private-dev libnotify-dev qtwebengine5-dev qtwayland5 qtwayland5-dev-tools"
|
||||||
|
|
||||||
|
dpkg-buildpackage -j$(cat /proc/cpuinfo | grep processor | wc -l)
|
||||||
|
sudo apt reinstall ../spark-store_*.deb
|
||||||
|
|
||||||
|
rm ../spark-store_*
|
||||||
837
debian/changelog
vendored
@@ -1,77 +1,625 @@
|
|||||||
|
spark-store (4.3.3) UNRELEASED; urgency=medium
|
||||||
|
|
||||||
|
* 修复点击更新需要输入密码的问题
|
||||||
|
* 修复安装速度下降的问题
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Tue, 24 Sep 2024 11:27:08 +0800
|
||||||
|
|
||||||
|
spark-store (4.3.2.0) UNRELEASED; urgency=medium
|
||||||
|
|
||||||
|
* 后续更新请从4.3.2.0版本号开始,4.3.2版本仅用于GXDE测试
|
||||||
|
* 支持dummyapps 安装包安装
|
||||||
|
* 支持紧凑模式
|
||||||
|
* 修复部分情况下升级安装失败的问题
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Tue, 24 Sep 2024 11:27:08 +0800
|
||||||
|
|
||||||
|
spark-store (4.3.2) UNRELEASED; urgency=medium
|
||||||
|
|
||||||
|
* ssinstall支持安装conflict包
|
||||||
|
* 支持紧凑模式
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Tue, 24 Sep 2024 11:27:08 +0800
|
||||||
|
|
||||||
|
spark-store (4.3.1) UNRELEASED; urgency=medium
|
||||||
|
|
||||||
|
* 修复自提权更新问题
|
||||||
|
* 提升aptss稳定性
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Tue, 24 Sep 2024 11:27:08 +0800
|
||||||
|
|
||||||
|
spark-store (4.3.0-fix5) stable; urgency=medium
|
||||||
|
|
||||||
|
* 支持GXDE,重启空链接清理
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
spark-store (4.3.0-fix4) stable; urgency=medium
|
||||||
|
|
||||||
|
* 修复:安装失败时仍然锁定
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
|
||||||
|
|
||||||
|
|
||||||
|
spark-store (4.3.0-fix3) stable; urgency=medium
|
||||||
|
|
||||||
|
* 修复:创建快捷方式失效
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
spark-store (4.3.0-fix2) stable; urgency=medium
|
||||||
|
|
||||||
|
* aptss配置调整
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
spark-store (4.3.0-fix1) stable; urgency=medium
|
||||||
|
|
||||||
|
* 上游改为d.spark-app.store
|
||||||
|
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
|
||||||
|
|
||||||
|
spark-store (4.3) stable; urgency=medium
|
||||||
|
|
||||||
|
* 修复客户端不支持301跳转的问题
|
||||||
|
* 修复UOS下错误地提示开发者模式未启动
|
||||||
|
* 现在会记住上次的窗口大小
|
||||||
|
* 删除无用依赖,修复Debian 13依赖问题
|
||||||
|
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
|
||||||
|
|
||||||
|
spark-store (4.2.14) stable; urgency=medium
|
||||||
|
|
||||||
|
|
||||||
|
* 上游改为d.spark-app.store
|
||||||
|
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
|
||||||
|
spark-store (4.3.0) stable; urgency=medium
|
||||||
|
|
||||||
|
* 修复部分客户端启动白屏
|
||||||
|
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
|
||||||
|
spark-store (4.3) stable; urgency=medium
|
||||||
|
|
||||||
|
* 修复客户端不支持301跳转的问题
|
||||||
|
* 修复UOS下错误地提示开发者模式未启动
|
||||||
|
* 现在会记住上次的窗口大小
|
||||||
|
* 删除无用依赖,修复Debian 13依赖问题
|
||||||
|
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
|
||||||
|
spark-store (4.2.13) stable; urgency=medium
|
||||||
|
|
||||||
|
* 未经测试文案修改
|
||||||
|
* 龙芯平台并入主线
|
||||||
|
* 修复:更新过程中中断无法再次启动更新检查
|
||||||
|
* 调整:提高超时时长,适应较差的网络环境
|
||||||
|
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
|
||||||
|
spark-store (4.2.12.1) stable; urgency=medium
|
||||||
|
|
||||||
|
* 修复:龙芯自动--no-sandbox
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
|
||||||
|
|
||||||
|
spark-store (4.2.12) stable; urgency=medium
|
||||||
|
|
||||||
|
* 修复:飞腾部分设备上白屏的问题
|
||||||
|
* 修复:下载开始时长时等待(降低链接超时时长)
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
|
||||||
|
|
||||||
|
spark-store (4.2.11) stable; urgency=medium
|
||||||
|
|
||||||
|
* 修复:判断是否安装状态错误
|
||||||
|
* 修改:部分组件重构提升清晰度
|
||||||
|
* 修复:v23下部分应用图标失效
|
||||||
|
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
|
||||||
|
|
||||||
|
|
||||||
|
spark-store (4.2.10) stable; urgency=medium
|
||||||
|
|
||||||
|
* 修复:部分发行版上无法启动自动创建的桌面图标
|
||||||
|
* 修复:发行版统计信息
|
||||||
|
* 修复:Gitee反馈链接错误
|
||||||
|
* 修复:ACE下无法安装,支持ACE下软件更新
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
|
||||||
|
|
||||||
|
|
||||||
|
spark-store (4.2.9) stable; urgency=medium
|
||||||
|
|
||||||
|
* 修复:软件详情图片排序调整为服务器排序,而不是按加载顺序排序
|
||||||
|
* 修复: build error on Deepin V23
|
||||||
|
* 修复:容器内无限等待
|
||||||
|
* 新增:高分屏截图支持
|
||||||
|
* 新增:更新界面支持显示软件名称
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
|
||||||
|
|
||||||
|
spark-store (4.2.8.1) stable; urgency=medium
|
||||||
|
|
||||||
|
* 修复:A2D应用释放无效的Desktop到桌面上
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
|
||||||
|
|
||||||
|
spark-store (4.2.8) stable; urgency=medium
|
||||||
|
|
||||||
|
* 修复:在aptss上锁时支持等待释放锁而不是直接报错退出
|
||||||
|
* 调整:下载安装按钮文案修改
|
||||||
|
* 优化 KDE 深色模式支持实现方式
|
||||||
|
* 新增:ssinstall现在会自动创建desktop文件
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
|
||||||
|
|
||||||
|
spark-store (4.2.7.3) stable; urgency=medium
|
||||||
|
|
||||||
|
* 修复:aptss现在会正确地透传错误码而不是exit 0
|
||||||
|
* 修复:下载时如果卡0%(无法下载metalink),会在超时后报错中断而不是一直傻等
|
||||||
|
* 修复:排队下载时CPU占满单核的bug https://gitee.com/deepin-community-store/spark-store/issues/I7B91V
|
||||||
|
* 修复:在终端中打开的icon过大导致无法投稿到UOS
|
||||||
|
* 修复:v23下编译出错
|
||||||
|
* 薪怎:支持崩溃日志收集系统
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
spark-store (4.2.7.2) stable; urgency=medium
|
||||||
|
|
||||||
|
* 新增:内置在终端打开功能
|
||||||
|
* 调整:散列验证更改为使用sha512
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
spark-store (4.2.7.1) stable; urgency=medium
|
||||||
|
|
||||||
|
* 修复:aptss加锁失败现在会正常报错
|
||||||
|
* 新增:在aptss的特定操作时添加了提示
|
||||||
|
* 新增:在aptss提示加粗
|
||||||
|
* 调整:ssinstall验证支持使用cdn.d.获取
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
|
||||||
|
|
||||||
|
|
||||||
|
spark-store (4.2.7) stable; urgency=medium
|
||||||
|
|
||||||
|
* 修复:更新星火商店后禁止更新提醒的配置失效
|
||||||
|
* 新增:支持在设置中关闭平台不兼容提示
|
||||||
|
* 调整:更改了下载量统计的方式,减少漏数
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
|
||||||
|
|
||||||
|
|
||||||
|
spark-store (4.2.6.6) stable; urgency=medium
|
||||||
|
|
||||||
|
* 调整:文案修改:安装失败后引导查看详情而不是重新安装
|
||||||
|
* 修复:dpkg阻塞出现漏掉的安装失败,现在在安装后检测是否安装
|
||||||
|
* 修复:UOS专业版上安装成功仍然显示失败的问题:方式:忽略E:等消息,仅检查脚本报错
|
||||||
|
* 调整:卸载应用时采用autopurge以一并卸载依赖
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
|
||||||
|
|
||||||
|
|
||||||
|
spark-store (4.2.6.5) stable; urgency=medium
|
||||||
|
|
||||||
|
* 调整:ssaudit安装结束时会提示安装结束
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
|
||||||
|
|
||||||
|
|
||||||
|
spark-store (4.2.6.4) stable; urgency=medium
|
||||||
|
|
||||||
|
* 修复:关于页面的入口过时
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
|
||||||
|
|
||||||
|
|
||||||
|
spark-store (4.2.6.3) stable; urgency=medium
|
||||||
|
|
||||||
|
* 修复:部分下载统计线路失效
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
|
||||||
|
|
||||||
|
|
||||||
|
spark-store (4.2.6.2) stable; urgency=medium
|
||||||
|
|
||||||
|
* 新增:支持arm架构搜索
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
|
||||||
|
|
||||||
|
|
||||||
|
spark-store (4.2.6.1) stable; urgency=medium
|
||||||
|
|
||||||
|
* 修复:mint下更新检测不正常
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
|
||||||
|
|
||||||
|
|
||||||
|
spark-store (4.2.6) stable; urgency=medium
|
||||||
|
|
||||||
|
* 修复:截图加载失败时点击闪退
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
|
||||||
|
|
||||||
|
|
||||||
|
spark-store (4.2.5.1) stable; urgency=medium
|
||||||
|
|
||||||
|
* 调整:重写了spark-dstore-patch,速度提升,尤其对机械硬盘下
|
||||||
|
* 调整:优化了aptss源文件同步策略
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
|
||||||
|
|
||||||
|
|
||||||
|
spark-store (4.2.5) stable; urgency=medium
|
||||||
|
|
||||||
|
* 修复:ssinstall在文件不存在时仍然报安装成功
|
||||||
|
* 修复:删除不再需要的依赖:libc6-dev
|
||||||
|
* 在aarch64架构安装时也启用32位支持
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
|
||||||
|
|
||||||
|
|
||||||
|
spark-store (4.2.4) stable; urgency=medium
|
||||||
|
|
||||||
|
* 修复:ssinstall校验失败的时候仍然提示安装成功
|
||||||
|
* 新增:ssinstall可以自动刷新ssupdate以防止仓库更新中导致的安装校验失败
|
||||||
|
* 修复:在不受支持的平台安装应用时弹出提示不正确
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
|
||||||
|
|
||||||
|
|
||||||
|
spark-store (4.2.3.3) stable; urgency=medium
|
||||||
|
|
||||||
|
* aptss 不再使用bwrap,去除依赖,支持容器中启动
|
||||||
|
* aptss 支持非root模式启动
|
||||||
|
* aptss 添加transhell支持
|
||||||
|
* 关于界面自动获取分支名称
|
||||||
|
* 现在安装成功则自动删除安装包
|
||||||
|
* 完成 arm 架构大部分功能适配
|
||||||
|
* 修复依赖不完整的问题
|
||||||
|
* 4.3 roadmap 实现,在浏览不支持的应用时会出现提示
|
||||||
|
* 4.3 roadmap 实现,在下载文件夹没有读写权限时会出现提示
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
|
||||||
|
|
||||||
|
|
||||||
|
spark-store (4.2.3.2~Reason10) stable; urgency=medium
|
||||||
|
|
||||||
|
* 完成除web外大部分功能适配
|
||||||
|
* 修复依赖不完整的问题
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
|
||||||
|
|
||||||
|
|
||||||
|
spark-store (4.2.3.2~Reason9) stable; urgency=medium
|
||||||
|
|
||||||
|
* sender-d.sh
|
||||||
|
* ssinstall和ssaudit的安装测试转到upgrade-worker
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
|
||||||
|
|
||||||
|
|
||||||
|
spark-store (4.2.3.2~Reason8) stable; urgency=medium
|
||||||
|
|
||||||
|
* sender-d改用cpp重写,在aarch64上稳定运行
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
|
||||||
|
|
||||||
|
|
||||||
|
spark-store (4.2.3.2~Reason7) stable; urgency=medium
|
||||||
|
* ssinstall发现无法验证时尝试update而不是ssupdate
|
||||||
|
* 启动每日aptss update
|
||||||
|
* ssinstall在发现无法安装后尝试先进行下aptss update
|
||||||
|
* 修复:安装商店后首次启动无法安装任何软件
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
|
||||||
|
|
||||||
|
|
||||||
|
spark-store (4.2.3.2~Reason5) stable; urgency=medium
|
||||||
|
|
||||||
|
* aptss 不再使用bwrap,去除依赖,支持容器中启动
|
||||||
|
* aptss 支持非root模式启动
|
||||||
|
* aptss 添加transhell支持
|
||||||
|
* 关于界面自动获取分支名称
|
||||||
|
* 现在安装成功则自动删除安装包
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
|
||||||
|
|
||||||
|
|
||||||
|
spark-store (4.2.3.2~Reason3) stable; urgency=medium
|
||||||
|
|
||||||
|
* 现在可在x86上编译,使用同一套代码
|
||||||
|
* 暂时在aarch64上使用旧web----等待柚子
|
||||||
|
* 空间,疾疫,现在是静谧
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Sun, 5 Mar 2022 11:45:14 +0800
|
||||||
|
|
||||||
|
|
||||||
|
spark-store (4.2.3.2~only-for-test1) stable; urgency=medium
|
||||||
|
|
||||||
|
* 注意!!!!!! 此版本仅为启动测试,还需要进一步完善——hardcode需要改善——关于web界面的调用方式需要在柚子做好之后修改成新的
|
||||||
|
* fix: hardcode
|
||||||
|
* fix: sender-d
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||||
|
|
||||||
|
|
||||||
|
spark-store (4.2.3.1) stable; urgency=medium
|
||||||
|
* 修复: ssinstall验证签名出错
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||||
|
|
||||||
|
|
||||||
|
spark-store (4.2.3) stable; urgency=medium
|
||||||
|
* 修复: 编译依赖不全
|
||||||
|
* 修复: prerm导致的dpkg崩溃
|
||||||
|
* 新增: aptss 检查package配置增加sdu,store
|
||||||
|
* 新增: 一键编译并安装脚本
|
||||||
|
* 新增: 后台安装结束后退出任务栏驻留
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||||
|
|
||||||
|
|
||||||
|
spark-store (4.2.3~test4) stable; urgency=medium
|
||||||
|
|
||||||
|
* 修复: aptss 无法安装
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||||
|
|
||||||
|
|
||||||
|
spark-store (4.2.3~test3) stable; urgency=medium
|
||||||
|
|
||||||
|
* 调整:打包时从 debian/changelog 自动获取构建版本号并写入关于窗口保证与deb一致
|
||||||
|
* 新增:支持 DTK 5.6.4 关于对话框“版本特性”显示功能。目前只在deepin编译安装时开启
|
||||||
|
* 修复:修复下载列表对话框中,点击某个 item 取消下载按钮后下载列表无法再次显示的问题
|
||||||
|
* 修复:多个应用安装可能会出现某一个应用没有安装
|
||||||
|
* 修复:修复下载按钮点击/双击/拖动时,主窗口动作与下载管理对话框动作同时触发问题
|
||||||
|
* aptss 获取线路信息 转到从 d. 服务器获取
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||||
|
|
||||||
|
|
||||||
|
spark-store (4.2.3~test2) stable; urgency=medium
|
||||||
|
|
||||||
|
* 调整:开启安装包加固
|
||||||
|
* 添加:zh_TW翻译
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||||
|
|
||||||
|
|
||||||
|
spark-store (4.2.3~test1) stable; urgency=medium
|
||||||
|
|
||||||
|
* 修复:因判断安装状态错误创建多个相同任务的bug
|
||||||
|
* 测试中:尝试修复安装结束的闪退问题 https://gitee.com/deepin-community-store/spark-store/commit/cb093dcc2bb0a193db89aa0ce5f20ea9cc5d56eb
|
||||||
|
* 修复:Deepin 显示开发者模式未开启
|
||||||
|
* 修复:从托盘打开主窗口时透明度动画不流畅
|
||||||
|
* 修复:主窗口关闭后,从托盘打开关于窗口会被主窗口遮挡
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Sun, 05 Feb 2023 23:00:00 +0800
|
||||||
|
|
||||||
|
|
||||||
|
spark-store (4.2.2) stable; urgency=medium
|
||||||
|
|
||||||
|
* 调整:脚本应用的transhell支持转为source导入
|
||||||
|
* 修复:ssinstall弹窗支持wayland
|
||||||
|
* 新增:应用托盘,下载时候可以放心关闭窗口了
|
||||||
|
* 新增:支持spk://search/内容 格式链接
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||||
|
|
||||||
|
|
||||||
|
spark-store (4.2.1) stable; urgency=medium
|
||||||
|
|
||||||
|
* 调整:支持在安装前进行测试(ss-do-upgrade-worker),但是未实装到appinfo
|
||||||
|
* 修复:因依赖不完全导致在LinuxMint下无法下载统计
|
||||||
|
* 新增:脚本系列应用支持英文
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||||
|
|
||||||
|
|
||||||
|
spark-store (4.2) stable; urgency=medium
|
||||||
|
|
||||||
|
* 调整:UOS开发者模式提示现在不会那么挤了
|
||||||
|
* 修复:wayland下可正常弹出更新提示
|
||||||
|
* 调整:dwine5标签的文案改为:Wine应用
|
||||||
|
* 新增:更新软件时弹窗会显示正在更新的软件包名
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||||
|
|
||||||
|
|
||||||
|
spark-store (4.2~test3) stable; urgency=medium
|
||||||
|
|
||||||
|
* 修复: aptss ssupdates
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||||
|
|
||||||
|
|
||||||
|
spark-store (4.2~test2) stable; urgency=medium
|
||||||
|
|
||||||
|
* 修复: 420t1版本中ssinstall有时会重新下载软件包的问题
|
||||||
|
* 新增: 安装前会对软件包安装进行dry run以判断是否能正确安装
|
||||||
|
* 调整: aptss在进行任何操作前均检测是否存在Packages文件,若存在,则不进行ssupdate
|
||||||
|
* 调整: 修改apt-fast源代码以指定conf位置为/tmp/apt-fast,这部分不再使用bwrap模拟
|
||||||
|
* 新增: aptss检测Package文件支持分目录(目前指定为store)
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||||
|
|
||||||
|
|
||||||
|
spark-store (4.2~test1) stable; urgency=medium
|
||||||
|
|
||||||
|
* 新增: aptss支持显示报错
|
||||||
|
* 新增: aptss部分提示汉化
|
||||||
|
* 修复: 修复部分情况下ssinstall实际未安装但是错误显示
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||||
|
|
||||||
|
|
||||||
spark-store (4.1.2) stable; urgency=medium
|
spark-store (4.1.2) stable; urgency=medium
|
||||||
|
|
||||||
* feat: 初步的wayland支持
|
* feat: 初步的wayland支持
|
||||||
|
* feat: UOS下检测开发者模式是否开启,若未开启则拒绝安装
|
||||||
* fix: 首页的捐赠页面在中文环境下显示中文
|
* fix: 首页的捐赠页面在中文环境下显示中文
|
||||||
* chore: 新增编译依赖,测试安装时不会出现报错
|
|
||||||
* fix: 更新检测模块在aptss ssupdate操作失败后现在会正确地移除锁而不是错误的残留锁。
|
* fix: 更新检测模块在aptss ssupdate操作失败后现在会正确地移除锁而不是错误的残留锁。
|
||||||
|
* chore: ssinstall现在拒绝安装验证失败的包,审核操作现在需要改用ssaudit
|
||||||
|
* fix: Ubuntu下下载列表无法关闭
|
||||||
|
* fix: 修复进入详情页时焦点默认在分享链接按钮上的问题
|
||||||
|
* fix: 修复特定情况下的内存泄漏问题
|
||||||
|
* fix: 适配c11代码规范,消除qt编译警告
|
||||||
|
* fix: 默认服务器域名指向cdn域名
|
||||||
|
* fix: 消除内部函数的无用变量,限制作用域
|
||||||
|
* feat: aptss 除ssupdate外的操作时候如果检测到存在源文件存在则不再重复获取
|
||||||
|
* fix: 修复在apt list锁被锁定的时候异常弹出有更新可用
|
||||||
|
* chore: 去除安装依赖:g++
|
||||||
|
* fix: 修复下载列表中进度提示文字显示不完整的问题
|
||||||
|
* feat: ssinstall支持从单独文件夹中校验软件包
|
||||||
|
* feat: 支持分单文件夹下载。具体内容参见:https://gitee.com/deepin-community-store/repo_auto_update_script/blob/master/mirror-list-for-apt-fast/sources.list.d/sparkstore.list
|
||||||
|
* info: 非常感谢 @jwyh 对星火商店代码仓库设计了很多标准,参见 https://deepin-community-store.gitee.io/spark-wiki/#/Dev/Spark-Store-Git-Repo?id=%e6%9b%b4%e6%96%b0%e6%97%a5%e5%bf%97%e8%a7%84%e5%88%99 ,不过shenmo是自由的
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
|
||||||
|
* chore: 添加 Application 类,继承 DApplication,将 main 函数中设置属性、关于信息等操作移至 Application 构造函数中进行
|
||||||
|
* chore: 添加 setOrganizationName 操作,设置组织名称为 spark-union,与 SWRT 保持一致
|
||||||
|
* chore: 设置组织名称后,QStandardPaths::AppConfigLocation 等路径相应改变,修改所有配置文件和缓存文件路径
|
||||||
|
* chore: 关于对话框设置父对象后,对话框背景色受主窗口样式表影响,移动部分控件样式表设置方式与位置
|
||||||
|
* chore: 去除 .pro 文件中无效的更新翻译文件脚本调用,整理 .pro 文件,添加编译时更新 ts 文件脚本调用
|
||||||
|
* chore: 继续修复偶现关闭客户端时崩溃问题(疑似 aria2c 进程未启动,pid 未初始化为随机值,执行 kill 操作时未判断导致)
|
||||||
|
* chore: 新增编译依赖,测试安装时不会出现报错
|
||||||
|
* chore: 暂时去除没有意义的 DBus 接口,使用 DGuiApplicationHelper::newProcessInstance 获取新进程的启动参数
|
||||||
|
* chore: 更新翻译文件,去除已经不存在的翻译
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||||
|
|
||||||
|
|
||||||
|
spark-store (4.1.2~test2) stable; urgency=medium
|
||||||
|
|
||||||
|
* feat: ssinstall支持从单独文件夹中校验软件包
|
||||||
|
* feat: 支持分单文件夹下载。具体内容参见:https://gitee.com/deepin-community-store/repo_auto_update_script/blob/master/mirror-list-for-apt-fast/sources.list.d/sparkstore.list
|
||||||
|
* info: 非常感谢 @jwyh 对星火商店代码仓库设计了很多标准,参见 https://deepin-community-store.gitee.io/spark-wiki/#/Dev/Spark-Store-Git-Repo ,不过shenmo是自由的
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||||
|
|
||||||
|
|
||||||
|
spark-store (4.1.2~test1) stable; urgency=medium
|
||||||
|
|
||||||
|
* feat: 初步的wayland支持
|
||||||
|
* feat: UOS下检测开发者模式是否开启,若未开启则拒绝安装
|
||||||
|
* fix: 首页的捐赠页面在中文环境下显示中文
|
||||||
|
* fix: 更新检测模块在aptss ssupdate操作失败后现在会正确地移除锁而不是错误的残留锁。
|
||||||
|
* chore: ssinstall现在拒绝安装验证失败的包,审核操作现在需要改用ssaudit
|
||||||
|
* fix: Ubuntu下下载列表无法关闭
|
||||||
|
* fix: 修复进入详情页时焦点默认在分享链接按钮上的问题
|
||||||
|
* fix: 修复特定情况下的内存泄漏问题
|
||||||
|
* fix: 适配c11代码规范,消除qt编译警告
|
||||||
|
* fix: 默认服务器域名指向cdn域名
|
||||||
|
* fix: 消除内部函数的无用变量,限制作用域
|
||||||
|
* feat: aptss 除ssupdate外的操作时候如果检测到存在源文件存在则不再重复获取
|
||||||
|
* fix: 修复在apt list锁被锁定的时候异常弹出有更新可用
|
||||||
|
* chore: 去除安装依赖:g++
|
||||||
|
* fix: 修复下载列表中进度提示文字显示不完整的问题
|
||||||
|
|
||||||
|
|
||||||
|
* chore: 添加 Application 类,继承 DApplication,将 main 函数中设置属性、关于信息等操作移至 Application 构造函数中进行
|
||||||
|
* chore: 添加 setOrganizationName 操作,设置组织名称为 spark-union,与 SWRT 保持一致
|
||||||
|
* chore: 设置组织名称后,QStandardPaths::AppConfigLocation 等路径相应改变,修改所有配置文件和缓存文件路径
|
||||||
|
* chore: 关于对话框设置父对象后,对话框背景色受主窗口样式表影响,移动部分控件样式表设置方式与位置
|
||||||
|
* chore: 去除 .pro 文件中无效的更新翻译文件脚本调用,整理 .pro 文件,添加编译时更新 ts 文件脚本调用
|
||||||
|
* chore: 继续修复偶现关闭客户端时崩溃问题(疑似 aria2c 进程未启动,pid 未初始化为随机值,执行 kill 操作时未判断导致)
|
||||||
|
* chore: 新增编译依赖,测试安装时不会出现报错
|
||||||
|
* chore: 暂时去除没有意义的 DBus 接口,使用 DGuiApplicationHelper::newProcessInstance 获取新进程的启动参数
|
||||||
|
* chore: 更新翻译文件,去除已经不存在的翻译
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||||
|
|
||||||
|
|
||||||
spark-store (4.1.1) stable; urgency=medium
|
spark-store (4.1.1) stable; urgency=medium
|
||||||
|
|
||||||
* fix:更新失效
|
* fix:更新失效
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||||
|
|
||||||
|
|
||||||
spark-store (4.1.0) stable; urgency=medium
|
spark-store (4.1.0) stable; urgency=medium
|
||||||
|
|
||||||
* feat: 现在可以支持UOS签名包问题了
|
* feat: 现在可以支持UOS签名包问题了
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||||
|
|
||||||
|
|
||||||
spark-store (4.0.1) stable; urgency=medium
|
spark-store (4.0.1) stable; urgency=medium
|
||||||
|
|
||||||
* feat: 提升Ubuntu下的显示效果
|
* feat: 提升Ubuntu下的显示效果
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||||
|
|
||||||
|
|
||||||
spark-store (4.0.0) stable; urgency=medium
|
spark-store (4.0.0) stable; urgency=medium
|
||||||
|
|
||||||
* feat: 修复了成吨的bug后开始正式版
|
* feat: 修复了成吨的bug后开始正式版
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||||
|
|
||||||
|
|
||||||
spark-store (4.0.0~test2) stable; urgency=medium
|
spark-store (4.0.0~test2) stable; urgency=medium
|
||||||
|
|
||||||
* feat: 修复了成吨的bug后开始公测
|
* feat: 修复了成吨的bug后开始公测
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||||
|
|
||||||
|
|
||||||
spark-store (4.0.0~test1) stable; urgency=medium
|
spark-store (4.0.0~test1) stable; urgency=medium
|
||||||
|
|
||||||
* feat: 柚子过来补充一下啦
|
* feat: 柚子过来补充一下啦
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||||
|
|
||||||
|
|
||||||
spark-store (3.4~test1) stable; urgency=medium
|
spark-store (3.4~test1) stable; urgency=medium
|
||||||
|
|
||||||
* feat: aptss不再尝试安装apt-fast,转而自带
|
* feat: aptss不再尝试安装apt-fast,转而自带
|
||||||
* chore: 删除password-check模块
|
* chore: 删除password-check模块
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||||
|
|
||||||
|
|
||||||
spark-store (3.3.3) stable; urgency=medium
|
spark-store (3.3.3) stable; urgency=medium
|
||||||
|
|
||||||
* feat: 首页链接调用浏览器打开
|
* feat: 首页链接调用浏览器打开
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||||
|
|
||||||
0spark-store (3.3.3~test5) stable; urgency=medium
|
|
||||||
|
spark-store (3.3.3~test5) stable; urgency=medium
|
||||||
|
|
||||||
* 修复可能的内存泄漏问题
|
* 修复可能的内存泄漏问题
|
||||||
* 修复应用搜索为空但仍显示上一次搜索结果的问题
|
* 修复应用搜索为空但仍显示上一次搜索结果的问题
|
||||||
* 修复动画加载延后的问题
|
* 修复动画加载延后的问题
|
||||||
* 修复统计下载量卡主渲染线程的问题
|
* 修复统计下载量卡主渲染线程的问题
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||||
|
|
||||||
|
|
||||||
spark-store (3.3.3~test4) stable; urgency=medium
|
spark-store (3.3.3~test4) stable; urgency=medium
|
||||||
|
|
||||||
* Enable i386 arch support by default
|
* Enable i386 arch support by default
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||||
|
|
||||||
|
|
||||||
spark-store (3.3.3~test3) stable; urgency=medium
|
spark-store (3.3.3~test3) stable; urgency=medium
|
||||||
|
|
||||||
@@ -80,11 +628,13 @@ spark-store (3.3.3~test3) stable; urgency=medium
|
|||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||||
|
|
||||||
|
|
||||||
spark-store (3.3.3~test2) stable; urgency=medium
|
spark-store (3.3.3~test2) stable; urgency=medium
|
||||||
|
|
||||||
* bug fix: 更新和检查更新出错时不报错.此更新需要一个推送
|
* bug fix: 更新和检查更新出错时不报错.此更新需要一个推送
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||||
|
|
||||||
|
|
||||||
spark-store (3.3.3~test1) stable; urgency=medium
|
spark-store (3.3.3~test1) stable; urgency=medium
|
||||||
|
|
||||||
@@ -92,324 +642,109 @@ spark-store (3.3.3~test1) stable; urgency=medium
|
|||||||
* 图形环境中所有root权限的组件剥离到cli(可用于deepin 23 daily,只保证商店本体正常运作,不处理安装依赖不满足)
|
* 图形环境中所有root权限的组件剥离到cli(可用于deepin 23 daily,只保证商店本体正常运作,不处理安装依赖不满足)
|
||||||
* 文案更改:更新检查-->检查更新
|
* 文案更改:更新检查-->检查更新
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||||
|
|
||||||
|
|
||||||
spark-store (3.3.1~test1) stable; urgency=medium
|
spark-store (3.3.1~test1) stable; urgency=medium
|
||||||
|
|
||||||
* 安装时不再需要联网
|
* 安装时不再需要联网
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||||
|
|
||||||
|
|
||||||
spark-store (3.3.0.4) stable; urgency=medium
|
spark-store (3.3.0.4) stable; urgency=medium
|
||||||
|
|
||||||
* 为减轻服务器压力,不再单独更新某一个应用,而是作为整体更新
|
* 为减轻服务器压力,不再单独更新某一个应用,而是作为整体更新
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
|
||||||
|
|
||||||
spark-store (3.3.0.3) stable; urgency=medium
|
spark-store (3.3.0.3) stable; urgency=medium
|
||||||
|
|
||||||
* 回滚 更新中行为到进度条而不是实时输出
|
* 回滚 更新中行为到进度条而不是实时输出
|
||||||
* 更新应用时显示正在更新哪个应用
|
* 更新应用时显示正在更新哪个应用
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
|
||||||
|
|
||||||
spark-store (3.3.0.2) stable; urgency=medium
|
spark-store (3.3.0.2) stable; urgency=medium
|
||||||
|
|
||||||
* 修复 pkexec未执行
|
* 修复 pkexec未执行
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
|
||||||
|
|
||||||
spark-store (3.3.0.1) stable; urgency=medium
|
spark-store (3.3.0.1) stable; urgency=medium
|
||||||
|
|
||||||
* 修复 检查更新的更新进程未实际运行
|
* 修复 检查更新的更新进程未实际运行
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
|
||||||
|
|
||||||
spark-store (3.3) stable; urgency=medium
|
spark-store (3.3) stable; urgency=medium
|
||||||
|
|
||||||
* 修复 检查更新 未刷新软件源
|
* 修复 检查更新 未刷新软件源
|
||||||
* 把检查更新单独拿出作为左列
|
* 把检查更新单独拿出作为左列
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||||
|
|
||||||
|
|
||||||
spark-store (3.3~test3) stable; urgency=medium
|
spark-store (3.3~test3) stable; urgency=medium
|
||||||
|
|
||||||
* 把检查更新加入免密码
|
* 把检查更新加入免密码
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||||
|
|
||||||
|
|
||||||
spark-store (3.3~test2) stable; urgency=medium
|
spark-store (3.3~test2) stable; urgency=medium
|
||||||
|
|
||||||
* 更新检测功能全部更改到zenity
|
* 更新检测功能全部更改到zenity
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||||
|
|
||||||
|
|
||||||
spark-store (3.3~test1) stable; urgency=medium
|
spark-store (3.3~test1) stable; urgency=medium
|
||||||
|
|
||||||
* zenity,选择可更新应用
|
* zenity,选择可更新应用
|
||||||
* 自动更新检测现在会跳过hold
|
* 自动更新检测现在会跳过hold
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||||
|
|
||||||
|
|
||||||
spark-store (3.2.4) stable; urgency=medium
|
spark-store (3.2.4) stable; urgency=medium
|
||||||
|
|
||||||
* 修改tag相关的文案内容:wine相关环境已可自动配置了
|
* 修改tag相关的文案内容:wine相关环境已可自动配置了
|
||||||
* 准备发版
|
* 准备发版
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||||
|
|
||||||
|
|
||||||
spark-store (3.2.4~test4) stable; urgency=medium
|
spark-store (3.2.4~test4) stable; urgency=medium
|
||||||
|
|
||||||
* 现在在商店启动后点击spk链接仍会正常启动 https://gitee.com/deepin-community-store/spark-store/commit/dd6780d636042bf12d77414e6f1552cc7d1ed24c
|
* 现在在商店启动后点击spk链接仍会正常启动 https://gitee.com/deepin-community-store/spark-store/commit/dd6780d636042bf12d77414e6f1552cc7d1ed24c
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
|
||||||
|
|
||||||
spark-store (3.2.4~test3) stable; urgency=medium
|
spark-store (3.2.4~test3) stable; urgency=medium
|
||||||
|
|
||||||
* 发版,合入到master
|
* 发版,合入到master
|
||||||
* 翻译完毕
|
* 翻译完毕
|
||||||
* 合入先前的各项改动,为:客户端集成投稿器入口和支持,修复:安装依赖时间较长时错误地返回“安装完毕”结果,现在客户端版本更新时不关闭免密码登录,UOS安装进程合并正常aptss中
|
* 合入先前的各项改动,为:客户端集成投稿器入口和支持,修复:安装依赖时间较长时错误地返回“安装完毕”结果,现在客户端版本更新时不关闭免密码登录,UOS安装进程合并正常aptss中
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||||
|
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
|
||||||
|
|
||||||
spark-store (3.2.4~test2) stable; urgency=medium
|
spark-store (3.2.4~test2) stable; urgency=medium
|
||||||
|
|
||||||
* 客户端集成投稿器入口和支持
|
* 客户端集成投稿器入口和支持
|
||||||
* 修复:安装依赖时间较长时错误地返回“安装完毕”结果
|
* 修复:安装依赖时间较长时错误地返回“安装完毕”结果
|
||||||
|
|
||||||
|
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
||||||
|
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
|
||||||
|
|
||||||
spark-store (3.2.4~test1) stable; urgency=medium
|
spark-store (3.2.4~test1) stable; urgency=medium
|
||||||
|
|
||||||
* 客户端更新时不关闭免密码登录
|
* 客户端更新时不关闭免密码登录
|
||||||
* UOS合并正常aptss中
|
* U
|
||||||
|
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
|
||||||
|
|
||||||
spark-store (3.2.3) stable; urgency=medium
|
|
||||||
|
|
||||||
* 客户端异常退出时仍然占用资源问题修复
|
|
||||||
* 降低dtk依赖版本,Debian 11 stable可直接安装
|
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
|
||||||
|
|
||||||
spark-store (3.2.2) stable; urgency=medium
|
|
||||||
|
|
||||||
* aptss will now refresh the system source before doing install, policy....etc
|
|
||||||
* 启动客户端GPU加速支持
|
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
|
||||||
|
|
||||||
spark-store (3.2.1) stable; urgency=medium
|
|
||||||
|
|
||||||
* 更改刷新系统源的功能
|
|
||||||
|
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
|
||||||
|
|
||||||
spark-store (3.2) stable; urgency=medium
|
|
||||||
|
|
||||||
* 新增 下载量统计功能
|
|
||||||
* 新增 显示下载量
|
|
||||||
* 修复 spk链接生成错误
|
|
||||||
* 调整 启动时检测商店applist源
|
|
||||||
* 新增 applist cdn加速
|
|
||||||
* 调整 ssupdate不再更新/etc/aptss下的cache,如要如此,请使用aptss update
|
|
||||||
* 修复 在更新检测设置中的是否开启自动更新检测设置项的显示不随开启或关闭状态改变
|
|
||||||
* 修复 在检测更新时临时降低优先级到100,防止系统中有且版本一致的包被反复来回更新
|
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
|
||||||
|
|
||||||
spark-store (3.1.6) stable; urgency=medium
|
|
||||||
|
|
||||||
* 修复部分情况下无法选中正确的镜像源的问题
|
|
||||||
* 合入3.1.5以来的各项修改
|
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
|
||||||
|
|
||||||
spark-store (3.1.5-5) stable; urgency=medium
|
|
||||||
|
|
||||||
* 从所有镜像源中选取最快镜像源高速下载
|
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
|
||||||
|
|
||||||
|
|
||||||
spark-store (3.1.5-4) stable; urgency=medium
|
|
||||||
|
|
||||||
* 更改ss-apt-fast策略,现在只会在update,ssupdate和没有检测到配置文件的时候更新配置文件
|
|
||||||
* 新增ss-apt-fast别名:aptss
|
|
||||||
* 更新检测服务优化:从分体改为一体
|
|
||||||
* aptss 支持自动补全
|
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
|
||||||
|
|
||||||
spark-store (3.1.5-3) stable; urgency=medium
|
|
||||||
|
|
||||||
* 包内自带密钥
|
|
||||||
|
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
|
||||||
|
|
||||||
spark-store (3.1.5-2) stable; urgency=medium
|
|
||||||
|
|
||||||
* 下载软件时跳过获取大小,修复部分软件无法下载的问题
|
|
||||||
* 修复 获取key时出错,指定使用http1.1
|
|
||||||
|
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
|
||||||
|
|
||||||
spark-store (3.1.5-1) stable; urgency=medium
|
|
||||||
|
|
||||||
* 改变更新策略,UOS也下载加速,但是安装不加速
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
|
||||||
|
|
||||||
spark-store (3.1.5) stable; urgency=medium
|
|
||||||
|
|
||||||
* 改变更新策略,现在支持应用在更新时引入新依赖
|
|
||||||
* ss-apt-fast现在默认允许降级,以与apt使用体验一致
|
|
||||||
|
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
|
||||||
|
|
||||||
spark-store (3.1.4-2) stable; urgency=medium
|
|
||||||
|
|
||||||
* 客户端下载使用metalink来支持bt下载加速
|
|
||||||
* 修复使用更新和安装设置更新商店本体时出错
|
|
||||||
|
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
|
||||||
|
|
||||||
spark-store (3.1.4-1) stable; urgency=medium
|
|
||||||
|
|
||||||
* 安装脚本和检测更新脚本检查网络时间超时时间延长至5s
|
|
||||||
* 修复:ssinstall在没有安装apt-fast的情况下首次安装需要依赖的软件时安装失败
|
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
|
||||||
|
|
||||||
spark-store (3.1.4) stable; urgency=medium
|
|
||||||
|
|
||||||
* 发布正式版,同步到官网
|
|
||||||
* 修复安装时使用wget的问题
|
|
||||||
* 合并3.1.3-1和3.1.3-2的更改
|
|
||||||
* 屏蔽了ssinstall之外的安装方式
|
|
||||||
* 调整了报错框的形式
|
|
||||||
* 修复pkexec下ssinstall不处理依赖
|
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
|
||||||
|
|
||||||
spark-store (3.1.3-2) stable; urgency=medium
|
|
||||||
|
|
||||||
* 调整 现在与系统更新分开,不再导致更新失败
|
|
||||||
* 支持直接更新软件源文件,不再让d.吃全部更新流量
|
|
||||||
* ss-apt-fast不再强制root权限
|
|
||||||
* 修改ss-apt-fast的策略,现在除了安装,下载和更新都改用apt
|
|
||||||
* ssinstall 现在也会在不适用ss-apt-fast的时候模拟源了(针对UOS)
|
|
||||||
|
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
|
||||||
|
|
||||||
spark-store (3.1.3-1) stable; urgency=medium
|
|
||||||
|
|
||||||
* 修复 下载提前退出
|
|
||||||
* 移除 下载量显示
|
|
||||||
|
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
|
||||||
|
|
||||||
spark-store (3.1.3) stable; urgency=medium
|
|
||||||
|
|
||||||
* Now uses aria2 to download softwares form all mirrors
|
|
||||||
* 新增:ssinstall现在会在没有apt-fast的时候自动安装
|
|
||||||
* 新增:ss-apt-fast现在会在没有apt-fast的时候自动安装
|
|
||||||
* 修改:删除ssinstall中无用的 || dpkg -P $1
|
|
||||||
* 新增:ss-apt-fast会先下载云上的conf以确保mirror是最新的
|
|
||||||
* 修复:去除wget指令
|
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Fri, 30 Jan 2022 00:00:00 +0800
|
|
||||||
|
|
||||||
spark-store (3.1.2) stable; urgency=medium
|
|
||||||
|
|
||||||
* Now let apt-fast method support all mirrors
|
|
||||||
* Now will download dependencies and upgrade with all mirrors
|
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Mon, 17 Jan 2022 00:00:00 +0800
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
spark-store (3.1.1) stable; urgency=medium
|
|
||||||
|
|
||||||
* Now will delete the link of policy file after uninstall or upgrade
|
|
||||||
* Now ss-update-controler will create symbol link instead of hard link
|
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Mon, 17 Jan 2022 00:00:00 +0800
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
spark-store (3.1.0) stable; urgency=medium
|
|
||||||
|
|
||||||
* Add pkexec policy: ssinstall. Only will be enabled after permitted.
|
|
||||||
* Modify ssinistall script: Now will ask for password when not run as root
|
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Mon, 17 Jan 2022 00:00:00 +0800
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
spark-store (3.0.3-13) stable; urgency=medium
|
|
||||||
|
|
||||||
* Update the ssinstall script. Now support apt-fast and will temporarily increase the spark store source priority to 500 to make depends install correctly
|
|
||||||
* Change the style of About Dialog
|
|
||||||
* Modified depends to avoid Deb installers can not handle "Provides"
|
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Mon, 17 Jan 2022 00:00:00 +0800
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
spark-store (3.0.3-12) stable; urgency=medium
|
|
||||||
|
|
||||||
* Rollback to use DApplication::loadDXcbPlugin() to make titlebar behave normally in ubuntu
|
|
||||||
* Now can run on Debian 11
|
|
||||||
* Now can run on Ubuntu 22.04
|
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Mon, 17 Jan 2022 00:00:00 +0800
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
spark-store (3.0.3-11) stable; urgency=medium
|
|
||||||
|
|
||||||
* Now support autoupdate
|
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Mon, 17 Jan 2022 00:00:00 +0800
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
spark-store (3.0.3-10) stable; urgency=medium
|
|
||||||
|
|
||||||
* Now also compile dstore patch
|
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Mon, 17 Jan 2022 00:00:00 +0800
|
|
||||||
|
|
||||||
|
|
||||||
spark-store (3.0.3-9) stable; urgency=medium
|
|
||||||
|
|
||||||
* Support dpkg-buildpackage
|
|
||||||
|
|
||||||
-- shenmo <shenmo@spark-app.store> Mon, 17 Jan 2022 00:00:00 +0800
|
|
||||||
|
|||||||
50
debian/control
vendored
@@ -5,45 +5,31 @@ Priority: optional
|
|||||||
Build-Depends:
|
Build-Depends:
|
||||||
debhelper (>= 9),
|
debhelper (>= 9),
|
||||||
pkg-config,
|
pkg-config,
|
||||||
qtchooser (>= 55-gc9562a1-1~),
|
qtchooser (>= 55-gc9562a1-1~) | qt5-default,
|
||||||
libqt5core5a,
|
qtbase5-dev,
|
||||||
libqt5gui5,
|
libqt5svg5-dev,
|
||||||
libqt5widgets5,
|
qttools5-dev-tools,
|
||||||
libqt5network5,
|
|
||||||
libqt5concurrent5,
|
|
||||||
libdtkcore-dev(>=5.0),
|
|
||||||
libdtkgui-dev(>=5.0),
|
|
||||||
libdtkwidget-dev(>=5.0),
|
|
||||||
qttools5-private-dev,
|
|
||||||
qtwebengine5-dev,
|
qtwebengine5-dev,
|
||||||
qtwayland5,
|
libdtkcore-dev (>= 5.0),
|
||||||
qtwayland5-dev-tools,
|
libdtkgui-dev (>= 5.0),
|
||||||
gcc,
|
libdtkwidget-dev (>= 5.0)
|
||||||
g++
|
Standards-Version: 4.1.7
|
||||||
Standards-Version: 3.0
|
|
||||||
Homepage: https://www.spark-app.store/
|
Homepage: https://www.spark-app.store/
|
||||||
|
|
||||||
|
|
||||||
Package: spark-store
|
Package: spark-store
|
||||||
Architecture: any
|
Architecture: any
|
||||||
Depends:${shlibs:Depends}, ${misc:Depends},
|
Provides: spark-store-console-in-container
|
||||||
libqt5core5a,
|
Depends: ${shlibs:Depends}, ${misc:Depends},
|
||||||
libqt5gui5,
|
dde-qt5integration,
|
||||||
libqt5widgets5,
|
|
||||||
libqt5network5,
|
|
||||||
libqt5concurrent5,
|
|
||||||
qtwayland5,
|
|
||||||
libdtkcore5,
|
|
||||||
libdtkgui5,
|
|
||||||
libdtkwidget5,
|
|
||||||
curl,
|
curl,
|
||||||
openssl,
|
openssl,
|
||||||
dde-qt5integration,
|
|
||||||
bubblewrap,
|
|
||||||
aria2,
|
aria2,
|
||||||
gcc,
|
gnupg,
|
||||||
g++,
|
zenity,
|
||||||
zenity
|
policykit-1 | pkexec,
|
||||||
|
libnotify-bin,
|
||||||
|
qtwayland5,
|
||||||
|
desktop-file-utils,
|
||||||
|
dpkg-dev
|
||||||
Description: Spark Store
|
Description: Spark Store
|
||||||
A community powered app store, based on DTK.
|
A community powered app store, based on DTK.
|
||||||
Recommends: apt-fast
|
|
||||||
|
|||||||
26
debian/rules
vendored
@@ -1,36 +1,38 @@
|
|||||||
#!/usr/bin/make -f
|
#!/usr/bin/make -f
|
||||||
|
|
||||||
export QT_SELECT=5
|
export QT_SELECT = qt5
|
||||||
|
export DEB_BUILD_MAINT_OPTIONS = hardening=+all
|
||||||
include /usr/share/dpkg/default.mk
|
include /usr/share/dpkg/default.mk
|
||||||
|
|
||||||
DEB_BUILD_ARCH ?= $(shell dpkg-architecture -qDEB_BUILD_ARCH)
|
DEB_BUILD_ARCH ?= $(shell dpkg-architecture -qDEB_BUILD_ARCH)
|
||||||
DH_AUTO_ARGS = --parallel --buildsystem=qmake
|
DEB_HOST_MULTIARCH ?= $(shell dpkg-architecture -qDEB_HOST_MULTIARCH)
|
||||||
|
|
||||||
|
# Use realtime timestamp instead of the latest entry in debian/changelog
|
||||||
|
SOURCE_DATE_EPOCH := $(shell date +%s)
|
||||||
|
|
||||||
# Uncomment this to turn on verbose mode.
|
# Uncomment this to turn on verbose mode.
|
||||||
#export DH_VERBOSE=1
|
#export DH_VERBOSE = 1
|
||||||
|
|
||||||
%:
|
%:
|
||||||
dh $@ --parallel
|
dh $@ --parallel
|
||||||
|
|
||||||
override_dh_auto_clean:
|
override_dh_auto_clean:
|
||||||
rm -rf $(CURDIR)/build
|
rm -rf $(CURDIR)/build-$(DEB_HOST_MULTIARCH)
|
||||||
|
|
||||||
override_dh_auto_configure:
|
override_dh_auto_configure:
|
||||||
mkdir -p $(CURDIR)/build
|
mkdir -p $(CURDIR)/build-$(DEB_HOST_MULTIARCH)
|
||||||
|
|
||||||
dh_auto_configure MAKEFLAGS=-j$(JOBS) -- spark-store-project.pro \
|
|
||||||
-spec linux-g++ CONFIG+=qtquickcompiler \
|
|
||||||
-o $(CURDIR)/build/
|
|
||||||
|
|
||||||
|
qmake BUILD_VERSION=$(DEB_VERSION_UPSTREAM) spark-store-project.pro \
|
||||||
|
-spec linux-g++ CONFIG+=force_debug_info \
|
||||||
|
-o $(CURDIR)/build-$(DEB_HOST_MULTIARCH)/
|
||||||
|
|
||||||
override_dh_auto_build:
|
override_dh_auto_build:
|
||||||
make -C $(CURDIR)/build -j$(JOBS)
|
make -C $(CURDIR)/build-$(DEB_HOST_MULTIARCH) -j$(JOBS)
|
||||||
|
|
||||||
override_dh_auto_install:
|
override_dh_auto_install:
|
||||||
make -C $(CURDIR)/build install \
|
make -C $(CURDIR)/build-$(DEB_HOST_MULTIARCH) install \
|
||||||
INSTALL_ROOT=$(CURDIR)/debian/spark-store
|
INSTALL_ROOT=$(CURDIR)/debian/spark-store
|
||||||
|
|
||||||
|
|
||||||
# Ignore the dpkg-shlibdeps: warning (it uses none of the library's symbols)
|
# Ignore the dpkg-shlibdeps: warning (it uses none of the library's symbols)
|
||||||
# Qt Mutidedia lib will ref to network libraray.
|
# Qt Mutidedia lib will ref to network libraray.
|
||||||
override_dh_shlibdeps:
|
override_dh_shlibdeps:
|
||||||
|
|||||||
2
debian/source/format
vendored
@@ -1 +1 @@
|
|||||||
1.0
|
3.0 (native)
|
||||||
68
debian/spark-store.postinst
vendored
@@ -1,41 +1,48 @@
|
|||||||
#!/bin/sh
|
#!/bin/bash
|
||||||
|
|
||||||
case "$1" in
|
case "$1" in
|
||||||
configure)
|
configure)
|
||||||
|
|
||||||
# Enable i386 arch
|
case `arch` in
|
||||||
echo "Enable i386 arch..."
|
x86_64)
|
||||||
|
echo "Enabling i386 arch..."
|
||||||
dpkg --add-architecture i386
|
dpkg --add-architecture i386
|
||||||
|
;;
|
||||||
|
|
||||||
# config for aptss
|
aarch64)
|
||||||
mkdir -p /etc/aptss/sources.list.d
|
echo "Will not enable armhf since 4271"
|
||||||
ln -s -f /etc/apt/sources.list /etc/aptss/sources.list
|
;;
|
||||||
|
loongarch64)
|
||||||
|
echo "Nope we DO NOT WANT ABI1 now"
|
||||||
|
dpkg --remove-architecture loongarch64
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
echo "Unknown architecture, skip enable 32-bit arch"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
mkdir -p /var/lib/aptss/lists
|
||||||
|
|
||||||
# Remove the sources.list file
|
# Remove the sources.list file
|
||||||
if [ -e /etc/apt/sources.list.d/sparkstore.list ];then
|
rm -f /etc/apt/sources.list.d/sparkstore.list
|
||||||
rm /etc/apt/sources.list.d/sparkstore.list
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
# Check if /usr/local/bin existed
|
# Check if /usr/local/bin existed
|
||||||
mkdir -p /usr/local/bin
|
mkdir -p /usr/local/bin
|
||||||
|
## I hate /usr/local/bin. We will abandon them later
|
||||||
# Create symbol links for binary files
|
# Create symbol links for binary files
|
||||||
ln -s -f /opt/durapps/spark-store/bin/ussinstall /usr/local/bin/ussinstall
|
|
||||||
ln -s -f /opt/durapps/spark-store/bin/ussremove /usr/local/bin/ussremove
|
|
||||||
ln -s -f /opt/durapps/spark-store/bin/spark-store /usr/local/bin/spark-store
|
ln -s -f /opt/durapps/spark-store/bin/spark-store /usr/local/bin/spark-store
|
||||||
ln -s -f /opt/durapps/spark-store/bin/ssinstall /usr/local/bin/ssinstall
|
ln -s -f /opt/durapps/spark-store/bin/ssinstall /usr/local/bin/ssinstall
|
||||||
|
ln -s -f /opt/durapps/spark-store/bin/ssaudit /usr/local/bin/ssaudit
|
||||||
|
ln -s -f /opt/durapps/spark-store/bin/ssinstall /usr/bin/ssinstall
|
||||||
|
ln -s -f /opt/durapps/spark-store/bin/ssaudit /usr/bin/ssaudit
|
||||||
ln -s -f /opt/durapps/spark-store/bin/spark-dstore-patch /usr/local/bin/spark-dstore-patch
|
ln -s -f /opt/durapps/spark-store/bin/spark-dstore-patch /usr/local/bin/spark-dstore-patch
|
||||||
|
ln -s -f /opt/durapps/spark-store/bin/spark-dstore-patch /usr/bin/spark-dstore-patch
|
||||||
ln -s -f /opt/durapps/spark-store/bin/aptss /usr/local/bin/ss-apt-fast
|
ln -s -f /opt/durapps/spark-store/bin/aptss /usr/local/bin/ss-apt-fast
|
||||||
|
|
||||||
ln -s -f /opt/durapps/spark-store/bin/aptss /usr/bin/aptss
|
ln -s -f /opt/durapps/spark-store/bin/aptss /usr/bin/aptss
|
||||||
|
|
||||||
# Create symbol links for SSINSTALL
|
|
||||||
ln -s -f /opt/durapps/spark-store/bin/auto-install-policy/store.spark-app.ssinstall.policy /usr/share/polkit-1/actions/store.spark-app.ssinstall.policy
|
|
||||||
|
|
||||||
echo "Compiling the Sender module..."
|
|
||||||
|
|
||||||
gcc /opt/durapps/spark-store/bin/ss-feedback/sender-d.sh.c -o /opt/durapps/spark-store/bin/ss-feedback/sender-d
|
|
||||||
|
|
||||||
# Install key
|
# Install key
|
||||||
mkdir -p /tmp/spark-store-install/
|
mkdir -p /tmp/spark-store-install/
|
||||||
@@ -45,14 +52,10 @@ case "$1" in
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Run apt update to avoid users being fucked up by the non-exist dependency problem
|
|
||||||
# Now abandoned as aptss now run ssupdate everytime
|
|
||||||
#aptss ssupdate
|
|
||||||
|
|
||||||
|
|
||||||
# Start upgrade detect service
|
# Start upgrade detect service
|
||||||
|
systemctl daemon-reload
|
||||||
systemctl enable spark-update-notifier
|
systemctl enable spark-update-notifier
|
||||||
service spark-update-notifier start
|
systemctl start spark-update-notifier
|
||||||
|
|
||||||
|
|
||||||
# Update certain caches
|
# Update certain caches
|
||||||
@@ -62,27 +65,14 @@ case "$1" in
|
|||||||
update-mime-database /usr/share/mime || true
|
update-mime-database /usr/share/mime || true
|
||||||
|
|
||||||
# Send email for statistics
|
# Send email for statistics
|
||||||
# /tmp/spark-store-install/feedback.sh
|
#/tmp/spark-store-install/feedback.sh
|
||||||
|
|
||||||
# Remove temp dir
|
# Remove temp dir
|
||||||
rm -rf /tmp/spark-store-install
|
rm -rf /tmp/spark-store-install
|
||||||
|
|
||||||
|
|
||||||
;;
|
;;
|
||||||
|
|
||||||
triggered)
|
triggered)
|
||||||
# Quit if deepin-app-store-tool existed
|
spark-dstore-patch
|
||||||
if [ -x "/usr/bin/deepin-app-store-tool" ] ; then
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Trigger for UOS debs installation
|
|
||||||
echo '--------检测到Uniontech标准软件包,运行补丁以修正安装--------'
|
|
||||||
if [ -x "/usr/local/bin/spark-dstore-patch" ] ; then
|
|
||||||
/usr/local/bin/spark-dstore-patch
|
|
||||||
echo '-----------spark-dstore-patch补丁工具已运行完毕-----------'
|
|
||||||
else
|
|
||||||
echo '------------spark-dstore-patch补丁工具运行失败------------'
|
|
||||||
fi
|
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|||||||
2
debian/spark-store.postrm
vendored
Normal file → Executable file
@@ -1,4 +1,4 @@
|
|||||||
#!/bin/sh
|
#!/bin/bash
|
||||||
|
|
||||||
# Update certain caches
|
# Update certain caches
|
||||||
update-icon-caches /usr/share/icons/hicolor || true
|
update-icon-caches /usr/share/icons/hicolor || true
|
||||||
|
|||||||
87
debian/spark-store.prerm
vendored
@@ -1,47 +1,64 @@
|
|||||||
#!/bin/sh
|
#!/bin/bash
|
||||||
|
|
||||||
if [ "$1" = "remove" ] || [ "$1" = "purge" ];then
|
function notify-send()
|
||||||
# Remove residual symbol links
|
{
|
||||||
rm /usr/local/bin/spark-store
|
# Detect the user using such display
|
||||||
rm /usr/local/bin/ssinstall
|
local user=$(who | awk '{print $1}' | head -n 1)
|
||||||
rm /usr/local/bin/spark-dstore-patch
|
|
||||||
rm /usr/local/bin/ussinstall
|
|
||||||
rm /usr/local/bin/ussremove
|
|
||||||
rm /usr/local/bin/ss-apt-fast
|
|
||||||
rm /usr/bin/aptss
|
|
||||||
|
|
||||||
rm -rf /etc/aptss/
|
# Detect the id of the user
|
||||||
|
local uid=$(id -u $user)
|
||||||
|
|
||||||
# Remove Sender module
|
sudo -u $user DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$uid/bus notify-send "$@"
|
||||||
rm /opt/durapps/spark-store/bin/ss-feedback/sender-d
|
}
|
||||||
|
|
||||||
# Remove residual symbol links to stop upgrade detect if exist
|
if [ "$1" = "remove" -o "$1" = "purge" ] ; then
|
||||||
if [ -e /etc/xdg/autostart/spark-update-notifier.desktop ];then
|
echo "$1"
|
||||||
rm /etc/xdg/autostart/spark-update-notifier.desktop
|
echo "卸载操作,进行配置清理"
|
||||||
fi
|
|
||||||
|
|
||||||
# Shutdown services
|
# Remove residual symbol links
|
||||||
service spark-update-notifier stop
|
unlink /usr/local/bin/spark-store
|
||||||
|
unlink /usr/local/bin/ssinstall
|
||||||
|
unlink /usr/local/bin/ssaudit
|
||||||
|
unlink /usr/bin/ssinstall
|
||||||
|
unlink /usr/bin/ssaudit
|
||||||
|
unlink /usr/local/bin/spark-dstore-patch
|
||||||
|
unlink /usr/bin/spark-dstore-patch
|
||||||
|
unlink /usr/local/bin/ss-apt-fast
|
||||||
|
unlink /usr/bin/aptss
|
||||||
|
|
||||||
# Stop update detect service
|
rm -rf /etc/aptss/
|
||||||
systemctl disable spark-update-notifier
|
rm -rf /var/lib/aptss/
|
||||||
|
|
||||||
|
# Remove residual symbol links to stop upgrade detect
|
||||||
|
rm -f /etc/xdg/autostart/spark-update-notifier.desktop
|
||||||
|
# Remove config files
|
||||||
|
for username in `ls /home`
|
||||||
|
do
|
||||||
|
echo /home/$username
|
||||||
|
if [ -d /home/$username/.config/spark-union/spark-store ]
|
||||||
|
then
|
||||||
|
rm -rf /home/$username/.config/spark-union/spark-store
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
|
||||||
|
# Shutdown services
|
||||||
|
systemctl stop spark-update-notifier
|
||||||
|
# Stop update detect service
|
||||||
|
systemctl disable spark-update-notifier
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Clean the auto install polkit file if exist
|
# Remove gpg key file
|
||||||
if [ -f "/usr/share/polkit-1/actions/store.spark-app.ssinstall.policy" ] ; then
|
rm -f /etc/apt/trusted.gpg.d/spark-store.gpg
|
||||||
rm /usr/share/polkit-1/actions/store.spark-app.ssinstall.policy
|
apt-key del '9D9A A859 F750 24B1 A1EC E16E 0E41 D354 A29A 440C'
|
||||||
fi
|
|
||||||
|
|
||||||
# Remove gpg key file
|
|
||||||
if [ -f "/etc/apt/trusted.gpg.d/spark-store.gpg" ] ; then
|
|
||||||
rm /etc/apt/trusted.gpg.d/spark-store.gpg
|
|
||||||
fi
|
|
||||||
|
|
||||||
apt-key del '9D9A A859 F750 24B1 A1EC E16E 0E41 D354 A29A 440C'
|
|
||||||
|
|
||||||
else
|
else
|
||||||
|
|
||||||
echo "非卸载操作,不进行配置清理"
|
if [ ! -z "`pidof spark-store`" ] ; then
|
||||||
|
echo "关闭已有 spark-store.."
|
||||||
|
notify-send "正在升级星火商店" "请在升级结束后重启星火商店" -i spark-store
|
||||||
|
killall spark-store
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
1
debian/spark-store.triggers
vendored
@@ -1 +1,2 @@
|
|||||||
interest-noawait /opt/apps
|
interest-noawait /opt/apps
|
||||||
|
|
||||||
|
|||||||
44
patchs/README.md
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
# 补丁操作说明
|
||||||
|
|
||||||
|
- 克隆与构建本项目
|
||||||
|
|
||||||
|
> 用于 zinface-community-cmake-build-system.patch 补丁化构建方式
|
||||||
|
|
||||||
|
```shell
|
||||||
|
git clone https://gitee.com/deepin-community-store/spark-store
|
||||||
|
cd spark-store
|
||||||
|
git am < patchs/zinface-community-cmake-build-system.patch
|
||||||
|
make package
|
||||||
|
sudo dpkg -i build/*.deb
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
- 在应用补丁时,并对补丁进行的更新操作
|
||||||
|
|
||||||
|
```shell
|
||||||
|
# 切换到一个新的分支,即可开始进行补丁内的更新提交
|
||||||
|
git checkout -b cmake-build-system
|
||||||
|
|
||||||
|
# origin/dev 表示本仓库的 dev 开发分支
|
||||||
|
# 在应用过补丁,并产生了新的提交,即可在当前所在补丁更新分支内
|
||||||
|
# 相对基于 origin/dev 为参考,目前所包含的所有最新提交内容将生成为一个补丁文件(其中尾部为增量更新)
|
||||||
|
git format-patch --stdout origin/dev > patchs/zinface-community-cmake-build-system.patch
|
||||||
|
|
||||||
|
# 最后,回到你的原 dev 分支,将被改变的补丁文件进行提交
|
||||||
|
# 在推送完成后,即可放弃你在 cmake-build-system 分支中所有产生的内容(因为都已经进入补丁)
|
||||||
|
```
|
||||||
|
|
||||||
|
- 一些注意事项
|
||||||
|
|
||||||
|
```shell
|
||||||
|
# 在不了解补丁时,你需要认识一下补丁,但补丁与补丁之间有着不同的用法
|
||||||
|
# 本 patchs/zinface-community-cmake-build-system.patch 补丁为 cmake 化构建
|
||||||
|
|
||||||
|
# 关于补丁的一些方面
|
||||||
|
# 1. 首先你需要了解 git 是什么,以及简单的使用
|
||||||
|
# 2. 你需要了解补丁是什么,以及简单的使用(应用补丁)
|
||||||
|
# 3. 你需要了解如何创建一个补丁,最基本的就是相对于旧目标分支,将本分区新增的提交进行导出为补丁
|
||||||
|
# 4. 你可能只会将单个提交、或多个提交导出为补丁,但这还不够,你需要具有绝对的对于补丁的理解
|
||||||
|
# 5. 对于不同的目的补丁,应该是多个 patch 文件存在的形式
|
||||||
|
# 6. 最后,不管在什么时候,你在应用补丁前,你应该考虑是否应用到当前分支?为什么不切换到一个新的分支呢?
|
||||||
|
```
|
||||||
@@ -1 +0,0 @@
|
|||||||
deb [by-hash=force] https://d.store.deepinos.org.cn /
|
|
||||||
11
pkg/lib/systemd/system/spark-update-notifier.timer
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Timer for Spark Update Notifier
|
||||||
|
|
||||||
|
[Timer]
|
||||||
|
# 开机后第一次执行
|
||||||
|
OnBootSec=1min
|
||||||
|
# 每天执行一次
|
||||||
|
OnUnitActiveSec=1d
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=timers.target
|
||||||
12
pkg/usr/share/applications/open-me-in-terminal.desktop
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
[Desktop Entry]
|
||||||
|
Categories=Development;
|
||||||
|
Encoding=UTF-8
|
||||||
|
Exec=/opt/durapps/spark-store/bin/open-in-terminal/open-in-terminal %U
|
||||||
|
Icon=open-me-in-terminal
|
||||||
|
MimeType=application/x-desktop
|
||||||
|
Name=Open me in terminal
|
||||||
|
Name[zh_CN]=在终端中打开
|
||||||
|
NoDisplay=true
|
||||||
|
StartupWMClass=在终端中打开
|
||||||
|
Terminal=true
|
||||||
|
Type=Application
|
||||||
5
pkg/usr/share/aptss/transhell/aptss_en_US.transhell
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
TRANSHELL_CONTENT_RUNNING_IN_NOT_ROOT_USER="INFO:Running in non-root mode! If error occurs, please try to excute me as root."
|
||||||
|
TRANSHELL_CONTENT_INFO_SOURCES_LIST_D_IS_EMPTY="INFO:sources.list.d directory is empty,will not try to sync"
|
||||||
|
TRANSHELL_CONTENT_GETTING_SERVER_CONFIG_AND_MIRROR_LIST="Getting server and mirror lists..."
|
||||||
|
TRANSHELL_CONTENT_PLEASE_USE_APTSS_INSTEAD_OF_APT="Please note: Although the error message suggests using \"apt\" (such as \"apt install --fix-broken\"), please use \"aptss\" instead of \"apt\" when troubleshooting errors (for example, change to \"aptss install --fix-broken\")."
|
||||||
5
pkg/usr/share/aptss/transhell/aptss_zh_CN.transhell
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
TRANSHELL_CONTENT_RUNNING_IN_NOT_ROOT_USER="信息:正在使用非root权限模式启动!若出现问题,请尝试使用root权限执行指令"
|
||||||
|
TRANSHELL_CONTENT_INFO_SOURCES_LIST_D_IS_EMPTY="信息:sources.list.d文件夹是空的,将不会尝试同步"
|
||||||
|
TRANSHELL_CONTENT_GETTING_SERVER_CONFIG_AND_MIRROR_LIST="从服务器获取配置和镜像列表..."
|
||||||
|
TRANSHELL_CONTENT_PLEASE_USE_APTSS_INSTEAD_OF_APT="注意:尽管报错信息中提示使用apt(如apt install --fix-broken),请在排查错误的时候使用aptss而不是apt(对于例子,改为使用 aptss install --fix-broken)."
|
||||||
@@ -63,7 +63,7 @@ _aptss()
|
|||||||
# Complete a -t<SPACE><TAB>
|
# Complete a -t<SPACE><TAB>
|
||||||
case $prev in
|
case $prev in
|
||||||
-t|--target-release)
|
-t|--target-release)
|
||||||
COMPREPLY=( $( compgen -W "$( apt-cache policy -o Dir::Cache="/etc/aptss/" | egrep -o 'a=[^,]*|n=[^,]*' | cut -f2- -d= | sort -u)" -- "$cur" ) )
|
COMPREPLY=( $( compgen -W "$( apt-cache policy -o Dir::Cache="/var/lib/aptss/" | egrep -o 'a=[^,]*|n=[^,]*' | cut -f2- -d= | sort -u)" -- "$cur" ) )
|
||||||
return 0
|
return 0
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
@@ -185,12 +185,12 @@ _aptss()
|
|||||||
return 0
|
return 0
|
||||||
;;
|
;;
|
||||||
show|list|download|changelog|depends|rdepends)
|
show|list|download|changelog|depends|rdepends)
|
||||||
COMPREPLY=( $( apt-cache --no-generate pkgnames "$cur" -o Dir::Cache="/etc/aptss/" \
|
COMPREPLY=( $( apt-cache --no-generate pkgnames "$cur" -o Dir::Cache="/var/lib/aptss/" \
|
||||||
2> /dev/null ) )
|
2> /dev/null ) )
|
||||||
return 0
|
return 0
|
||||||
;;
|
;;
|
||||||
install)
|
install)
|
||||||
COMPREPLY=( $( apt-cache --no-generate pkgnames "$cur" -o Dir::Cache="/etc/aptss/" \
|
COMPREPLY=( $( apt-cache --no-generate pkgnames "$cur" -o Dir::Cache="/var/lib/aptss/" \
|
||||||
2> /dev/null ) )
|
2> /dev/null ) )
|
||||||
if [[ "$cur" == ./* || "$cur" == /* ]]; then
|
if [[ "$cur" == ./* || "$cur" == /* ]]; then
|
||||||
_filedir "deb"
|
_filedir "deb"
|
||||||
@@ -198,8 +198,8 @@ _aptss()
|
|||||||
return 0
|
return 0
|
||||||
;;
|
;;
|
||||||
source|build-dep|showsrc|policy)
|
source|build-dep|showsrc|policy)
|
||||||
COMPREPLY=( $( apt-cache --no-generate pkgnames "$cur" -o Dir::Cache="/etc/aptss/" \
|
COMPREPLY=( $( apt-cache --no-generate pkgnames "$cur" -o Dir::Cache="/var/lib/aptss/" \
|
||||||
2> /dev/null ) $( apt-cache dumpavail -o Dir::Cache="/etc/aptss/" | \
|
2> /dev/null ) $( apt-cache dumpavail -o Dir::Cache="/var/lib/aptss/" | \
|
||||||
command grep "^Source: $cur" | sort -u | cut -f2 -d" " ) )
|
command grep "^Source: $cur" | sort -u | cut -f2 -d" " ) )
|
||||||
return 0
|
return 0
|
||||||
;;
|
;;
|
||||||
|
|||||||
26
pkg/usr/share/dsg/org.deepin.dtkwidget.feature-display.json
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
{
|
||||||
|
"magic": "dsg.config.meta",
|
||||||
|
"version": "1.0",
|
||||||
|
"contents": {
|
||||||
|
"featureUpdated": {
|
||||||
|
"value": false,
|
||||||
|
"serial": 0,
|
||||||
|
"flags": [],
|
||||||
|
"name": "Whether the application has new feature updates",
|
||||||
|
"name[zh_CN]": "配置应用的更新状态",
|
||||||
|
"description": "Configure the update status of the application",
|
||||||
|
"permissions": "readwrite",
|
||||||
|
"visibility": "public"
|
||||||
|
},
|
||||||
|
"autoDisplayFeature": {
|
||||||
|
"value": false,
|
||||||
|
"serial": 0,
|
||||||
|
"flags": [],
|
||||||
|
"name": "The application automatically display new features once",
|
||||||
|
"name[zh_CN]": "配置应用是否自动展示一次新特性",
|
||||||
|
"description": "The application automatically display updated contents once",
|
||||||
|
"permissions": "readwrite",
|
||||||
|
"visibility": "public"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
After Width: | Height: | Size: 89 KiB |
@@ -1,6 +1,4 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
|
||||||
|
|
||||||
<svg
|
<svg
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
xmlns:cc="http://creativecommons.org/ns#"
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
@@ -10,12 +8,15 @@
|
|||||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
inkscape:export-ydpi="127"
|
||||||
|
inkscape:export-xdpi="127"
|
||||||
|
inkscape:export-filename="/home/zhangtianyi/Desktop/deepin-community-store.png"
|
||||||
width="200mm"
|
width="200mm"
|
||||||
height="200mm"
|
height="200mm"
|
||||||
viewBox="0 0 200 200"
|
viewBox="0 0 200 200"
|
||||||
version="1.1"
|
version="1.1"
|
||||||
id="svg8"
|
id="svg8"
|
||||||
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
|
inkscape:version="1.0 (4035a4f, 2020-05-01)"
|
||||||
sodipodi:docname="deepin-community-store.svg">
|
sodipodi:docname="deepin-community-store.svg">
|
||||||
<defs
|
<defs
|
||||||
id="defs2">
|
id="defs2">
|
||||||
@@ -170,17 +171,18 @@
|
|||||||
borderopacity="1.0"
|
borderopacity="1.0"
|
||||||
inkscape:pageopacity="0.0"
|
inkscape:pageopacity="0.0"
|
||||||
inkscape:pageshadow="2"
|
inkscape:pageshadow="2"
|
||||||
inkscape:zoom="0.35"
|
inkscape:zoom="0.7"
|
||||||
inkscape:cx="120.33119"
|
inkscape:cx="13.97476"
|
||||||
inkscape:cy="507.94585"
|
inkscape:cy="371.76152"
|
||||||
inkscape:document-units="mm"
|
inkscape:document-units="mm"
|
||||||
inkscape:current-layer="layer1"
|
inkscape:current-layer="layer2"
|
||||||
showgrid="false"
|
showgrid="false"
|
||||||
inkscape:window-width="1920"
|
inkscape:window-width="1920"
|
||||||
inkscape:window-height="1040"
|
inkscape:window-height="941"
|
||||||
inkscape:window-x="0"
|
inkscape:window-x="0"
|
||||||
inkscape:window-y="0"
|
inkscape:window-y="0"
|
||||||
inkscape:window-maximized="1" />
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:document-rotation="0" />
|
||||||
<metadata
|
<metadata
|
||||||
id="metadata5">
|
id="metadata5">
|
||||||
<rdf:RDF>
|
<rdf:RDF>
|
||||||
@@ -199,70 +201,54 @@
|
|||||||
id="layer1"
|
id="layer1"
|
||||||
transform="translate(0,-97)">
|
transform="translate(0,-97)">
|
||||||
<rect
|
<rect
|
||||||
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ebebeb;stroke-width:2.87003541;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter2201)"
|
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ebebeb;stroke-width:2.87004;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter2201)"
|
||||||
id="rect2119"
|
id="rect2119"
|
||||||
width="162.54665"
|
width="162.54665"
|
||||||
height="170.16383"
|
height="170.16383"
|
||||||
x="20.431099"
|
x="20.431099"
|
||||||
y="112.51035"
|
y="112.51035"
|
||||||
rx="30"
|
rx="30"
|
||||||
ry="30" />
|
ry="30"
|
||||||
<circle
|
transform="matrix(1.0253898,0,0,0.97932001,-4.2824724,3.4808454)" />
|
||||||
style="opacity:1;fill:#959595;fill-opacity:1;stroke:#e9e9e9;stroke-width:3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
|
||||||
id="path2121"
|
|
||||||
cx="58.208336"
|
|
||||||
cy="131.8244"
|
|
||||||
r="6.0476193" />
|
|
||||||
<circle
|
|
||||||
style="opacity:1;fill:#9c9c9c;fill-opacity:1;stroke:#eaeaea;stroke-width:3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
|
||||||
id="path2121-5"
|
|
||||||
cx="143.63095"
|
|
||||||
cy="133.71429"
|
|
||||||
r="6.0476193" />
|
|
||||||
</g>
|
</g>
|
||||||
<g
|
<g
|
||||||
inkscape:groupmode="layer"
|
inkscape:groupmode="layer"
|
||||||
id="layer2"
|
id="layer2"
|
||||||
inkscape:label="Layer 2">
|
inkscape:label="Layer 2">
|
||||||
<path
|
<path
|
||||||
style="fill:#ffc344;fill-opacity:1;stroke:none;stroke-width:0.3091144px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
style="fill:#ffc344;fill-opacity:1;stroke:none;stroke-width:0.309114px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
d="m 94.205599,42.389243 c 0,0 11.145081,-0.157476 22.599701,6.928753 11.45465,7.086223 18.11074,13.857508 20.27783,18.266716 2.16708,4.409209 9.28755,12.125332 9.13277,26.297795 -0.15488,14.172433 -3.40543,23.620763 -8.97797,31.494323 -5.57254,7.87359 -15.63405,13.85751 -27.70786,14.17247 -12.073829,0.31494 -19.813453,-7.55863 -22.444927,-11.96786 -2.631469,-4.4092 -3.715019,-13.85751 -0.464377,-20.62877 3.250645,-6.77132 8.358796,-6.77132 10.061513,-6.14141 1.702724,0.6299 2.167092,1.5747 3.095852,3.30689 0.928749,1.73219 1.547929,1.41726 2.941089,0.47243 1.39311,-0.94484 1.85748,-2.04715 1.54792,-3.46439 -0.30958,-1.417253 -2.16711,-3.149433 -3.71505,-3.621853 -1.547909,-0.47241 -3.715016,-1.88966 -6.810869,-1.41721 -3.095848,0.47238 -9.132757,2.04711 -14.240906,8.975843 -5.108153,6.92875 -4.488988,17.63684 -1.393134,22.67593 3.095849,5.0391 8.977962,14.48739 21.980539,17.79431 13.00259,3.30693 34.05435,-6.45633 41.32959,-21.57361 7.27524,-15.1173 7.43004,-22.20352 7.12048,-34.643764 C 148.22821,76.875544 137.23793,58.293884 125.00933,51.522601 112.78073,44.751315 103.64797,40.814522 94.205599,42.389243 Z"
|
d="m 94.205599,38.155907 c 0,0 11.145081,-0.157476 22.599701,6.928753 11.45465,7.086223 18.11074,13.857508 20.27783,18.266716 2.16708,4.409209 9.28755,12.125332 9.13277,26.297795 -0.15488,14.172409 -3.40543,23.620739 -8.97797,31.494299 -5.57254,7.87359 -15.63405,13.85751 -27.70786,14.17247 -12.073829,0.31494 -19.813453,-7.55863 -22.444927,-11.96786 -2.631469,-4.4092 -3.715019,-13.85751 -0.464377,-20.62877 3.250645,-6.771296 8.358796,-6.771296 10.061513,-6.141389 1.702724,0.629897 2.167092,1.574691 3.095852,3.306872 0.928749,1.732187 1.547929,1.417257 2.941089,0.472427 1.39311,-0.944834 1.85748,-2.047138 1.54792,-3.464372 -0.30958,-1.417247 -2.16711,-3.149427 -3.71505,-3.621847 -1.547909,-0.47241 -3.715016,-1.88966 -6.810869,-1.41721 -3.095848,0.47238 -9.132757,2.04711 -14.240906,8.975819 -5.108153,6.92875 -4.488988,17.63684 -1.393134,22.67593 3.095849,5.0391 8.977962,14.48739 21.980539,17.79431 13.00259,3.30693 34.05435,-6.45633 41.32959,-21.57361 7.27524,-15.1173 7.43004,-22.203505 7.12048,-34.64374 C 148.22821,72.642208 137.23793,54.060548 125.00933,47.289265 112.78073,40.517979 103.64797,36.581186 94.205599,38.155907 Z"
|
||||||
id="path1002"
|
id="path1002"
|
||||||
inkscape:connector-curvature="0" />
|
inkscape:connector-curvature="0" />
|
||||||
<path
|
<path
|
||||||
style="fill:#f06767;fill-opacity:1;stroke:none;stroke-width:0.3091144px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
style="fill:#f06767;fill-opacity:1;stroke:none;stroke-width:0.309114px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
d="m 100.67541,105.29647 c 0,0 -3.06474,-2.8951 -5.801108,2.22698 -2.736373,5.12205 -4.049827,9.68737 -1.313459,15.25486 2.736367,5.56745 8.428007,8.90792 17.184447,8.79659 8.75636,-0.11148 15.21419,-2.22699 19.0451,-8.5739 3.83094,-6.34692 6.7862,-11.02357 7.11457,-13.36191 0.32839,-2.33835 2.07965,0.33404 1.53239,2.33834 -0.54728,2.00426 -0.43783,5.9015 1.09454,5.12204 1.53237,-0.77942 2.73637,-2.00427 2.95526,-1.44753 0.21893,0.55673 -1.75127,4.00859 -2.68162,5.73449 -0.93039,1.7259 -3.83094,5.90153 -5.5275,7.51607 -1.69652,1.61458 -4.04981,3.89724 -6.84092,5.56747 -2.79109,1.67024 -7.11454,3.61887 -9.52255,4.06427 -2.40801,0.44539 -7.22403,1.39184 -9.96042,1.2805 -2.73635,-0.11137 -6.23892,-0.61243 -10.124558,-2.56104 -3.885645,-1.94859 -8.099657,-4.95505 -9.741479,-7.96148 -1.641825,-3.00643 -4.159283,-5.73449 -3.61201,-13.30623 0.547277,-7.57175 3.010008,-11.46899 4.870741,-13.25056 1.860731,-1.7816 4.597103,-2.56105 6.403105,-2.17131 1.806004,0.38971 2.955282,1.44755 3.393102,2.22697 0.43781,0.77944 1.149279,2.22699 1.532369,2.50538 z"
|
d="m 100.67541,101.06311 c 0,0 -3.06474,-2.895088 -5.801108,2.22698 -2.736373,5.12205 -4.049827,9.68737 -1.313459,15.25486 2.736367,5.56745 8.428007,8.90792 17.184447,8.79659 8.75636,-0.11148 15.21419,-2.22699 19.0451,-8.5739 3.83094,-6.34692 6.7862,-11.02357 7.11457,-13.36191 0.32839,-2.33835 2.07965,0.33404 1.53239,2.33834 -0.54728,2.00426 -0.43783,5.9015 1.09454,5.12204 1.53237,-0.77942 2.73637,-2.00427 2.95526,-1.44753 0.21893,0.55673 -1.75127,4.00859 -2.68162,5.73449 -0.93039,1.7259 -3.83094,5.90153 -5.5275,7.51607 -1.69652,1.61458 -4.04981,3.89724 -6.84092,5.56747 -2.79109,1.67024 -7.11454,3.61887 -9.52255,4.06427 -2.40801,0.44539 -7.22403,1.39184 -9.96042,1.2805 -2.73635,-0.11137 -6.23892,-0.61243 -10.124558,-2.56104 -3.885645,-1.94859 -8.099657,-4.95505 -9.741479,-7.96148 -1.641825,-3.00643 -4.159283,-5.73449 -3.61201,-13.30623 0.547277,-7.57175 3.010008,-11.46899 4.870741,-13.250551 1.860731,-1.781588 4.597103,-2.561035 6.403105,-2.171298 1.806004,0.38971 2.955282,1.447544 3.393102,2.226958 0.43781,0.779437 1.149279,2.226981 1.532369,2.505371 z"
|
||||||
id="path1012"
|
id="path1012"
|
||||||
inkscape:connector-curvature="0" />
|
inkscape:connector-curvature="0" />
|
||||||
<path
|
<path
|
||||||
style="fill:#3f62eb;fill-opacity:1;stroke:none;stroke-width:0.3091144px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
style="fill:#3f62eb;fill-opacity:1;stroke:none;stroke-width:0.309114px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
d="m 128.47695,145.38219 c 0,0 13.13457,-7.6831 19.26404,-19.82016 6.12948,-12.13707 8.7564,-19.93152 7.99021,-31.84592 -0.76619,-11.914358 -2.62692,-6.012854 -0.54728,-11.134928 2.07964,-5.122074 -1.31345,-15.254857 0.10943,-15.922949 1.42292,-0.668097 4.48765,4.453971 5.3633,8.573903 0.87562,4.119922 4.70654,16.813721 1.64181,32.959394 -3.06472,16.14564 -10.28872,22.60391 -15.10475,26.94655 -4.81603,4.34261 -15.7615,11.91437 -17.40332,11.80302 -1.64183,-0.11148 -1.86073,-0.11148 -1.31348,-1.55891 z"
|
d="m 132.18114,140.09049 c 0,0 13.13457,-7.6831 19.26404,-19.82016 6.12948,-12.13707 8.7564,-19.93152 7.99021,-31.84589 -0.76619,-11.914358 -2.62692,-6.012854 -0.54728,-11.134928 2.07964,-5.122074 -1.31345,-15.254857 0.10943,-15.922949 1.42292,-0.668097 4.48765,4.453971 5.3633,8.573903 0.87562,4.119922 4.70654,16.813721 1.64181,32.959364 -3.06472,16.14564 -10.28872,22.60391 -15.10475,26.94655 -4.81603,4.34261 -15.7615,11.91437 -17.40332,11.80302 -1.64183,-0.11148 -1.86073,-0.11148 -1.31348,-1.55891 z"
|
||||||
id="path1014"
|
id="path1014"
|
||||||
inkscape:connector-curvature="0" />
|
inkscape:connector-curvature="0" />
|
||||||
<path
|
<path
|
||||||
style="fill:#fce102;fill-opacity:1;stroke:none;stroke-width:0.3091144px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
style="fill:#fce102;fill-opacity:1;stroke:none;stroke-width:0.309114px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
d="m 104.83471,121.99883 c 0,0 7.00512,1.5589 12.36838,-1.78156 5.3633,-3.3405 9.5226,-8.79661 10.17931,-10.91225 0.65672,-2.11564 0.76619,1.89294 1.53236,-0.11125 0.76618,-2.00432 3.83093,-6.01288 2.29855,-15.366239 -1.53237,-9.35333 -1.64182,-9.798747 -4.48762,-14.809463 -2.84586,-5.010719 -9.63207,-11.91437 -13.79134,-14.141359 -4.15927,-2.226986 -9.96037,-5.567464 -17.950594,-5.344766 -7.990202,0.222699 -5.363286,-0.334048 -13.025124,1.002146 -7.661836,1.336187 -14.557491,5.010717 -16.856041,7.015006 -2.298552,2.004286 -8.428023,7.460405 -10.61712,10.46684 -2.189098,3.00643 -8.209113,9.798741 -11.383303,19.263442 -3.174189,9.464683 -4.487646,10.466823 -4.706555,16.702393 -0.21891,6.23557 0.547274,7.90578 -0.766185,8.46256 -1.31346,0.55673 -1.094547,-4.67668 -0.985094,-8.35123 0.109463,-3.6745 0.109463,-13.25056 4.925468,-23.940084 4.816015,-10.689538 13.353489,-19.597489 18.169503,-22.826622 4.816009,-3.229128 10.398208,-7.571752 19.045135,-9.687392 8.646933,-2.115635 17.293863,-1.781586 22.65716,-0.779443 5.3633,1.002145 13.68187,4.453974 18.1695,7.905802 4.48766,3.45183 9.41314,7.683099 13.13459,14.586765 3.72146,6.903648 4.70654,15.700251 4.59709,19.374771 -0.10943,3.674543 -1.97019,12.137103 -4.81601,16.257013 -2.84583,4.11993 -6.67674,9.0193 -10.61711,10.80089 -3.94039,1.78157 -8.75642,2.33833 -12.69675,0.55674 -3.94039,-1.78161 -3.72147,-2.44969 -4.3782,-4.34263 z"
|
d="m 104.83471,117.2363 c 0,0 7.00512,1.5589 12.36838,-1.78156 5.3633,-3.3405 9.5226,-8.79661 10.17931,-10.91225 0.65672,-2.11564 0.76619,1.89294 1.53236,-0.11125 0.76618,-2.00432 3.83093,-6.012871 2.29855,-15.366212 -1.53237,-9.35333 -1.64182,-9.798747 -4.48762,-14.809463 -2.84586,-5.010719 -9.63207,-11.91437 -13.79134,-14.141359 -4.15927,-2.226986 -9.96037,-5.567464 -17.950594,-5.344766 -7.990202,0.222699 -5.363286,-0.334048 -13.025124,1.002146 -7.661836,1.336187 -14.557491,5.010717 -16.856041,7.015006 -2.298552,2.004286 -8.428023,7.460405 -10.61712,10.46684 -2.189098,3.00643 -8.209113,9.798741 -11.383303,19.263442 -3.174189,9.464656 -4.487646,10.466796 -4.706555,16.702366 -0.21891,6.23557 0.547274,7.90578 -0.766185,8.46256 -1.31346,0.55673 -1.094547,-4.67668 -0.985094,-8.35123 0.109463,-3.6745 0.109463,-13.250536 4.925468,-23.940057 4.816015,-10.689538 13.353489,-19.597489 18.169503,-22.826622 4.816009,-3.229128 10.398208,-7.571752 19.045135,-9.687392 8.646933,-2.115635 17.293863,-1.781586 22.65716,-0.779443 5.3633,1.002145 13.68187,4.453974 18.1695,7.905802 4.48766,3.45183 9.41314,7.683099 13.13459,14.586765 3.72146,6.903648 4.70654,15.700251 4.59709,19.374771 -0.10943,3.674531 -1.97019,12.137076 -4.81601,16.256986 -2.84583,4.11993 -6.67674,9.0193 -10.61711,10.80089 -3.94039,1.78157 -8.75642,2.33833 -12.69675,0.55674 -3.94039,-1.78161 -3.72147,-2.44969 -4.3782,-4.34263 z"
|
||||||
id="path1016"
|
id="path1016"
|
||||||
inkscape:connector-curvature="0" />
|
inkscape:connector-curvature="0" />
|
||||||
<path
|
<path
|
||||||
style="fill:#5ed938;fill-opacity:1;stroke:none;stroke-width:0.3091144px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
style="fill:#5ed938;fill-opacity:1;stroke:none;stroke-width:0.309114px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
d="m 104.83471,121.99883 c 0,0 5.54674,1.56707 10.22918,-0.55878 4.68248,-2.12587 6.4239,-4.17301 7.54615,-5.3934 1.12223,-1.22042 3.25064,-3.50376 3.83112,-4.56669 0.58046,-1.06292 1.19962,-1.69282 1.19962,-2.08649 0,-0.39369 -1.08353,-1.33853 -0.0386,-3.62186 1.04482,-2.28333 1.97361,-7.519273 1.50922,-9.881333 -0.46438,-2.362073 -1.54792,-15.471616 -10.83547,-24.211303 -9.28753,-8.739678 -18.497709,-9.763242 -18.497709,-9.763242 0,0 14.705309,4.645415 21.593569,18.739134 6.88828,14.093741 4.64376,23.148344 0.23218,28.659854 -4.41158,5.51151 -10.68068,6.14141 -12.38342,4.72415 -1.70268,-1.41725 -5.2113,6.47164 -4.38574,7.95996 z"
|
d="m 104.83471,117.2363 c 0,0 5.54674,1.56707 10.22918,-0.55878 4.68248,-2.12587 6.4239,-4.17301 7.54615,-5.3934 1.12223,-1.22042 3.25064,-3.50376 3.83112,-4.56669 0.58046,-1.06292 1.19962,-1.69282 1.19962,-2.08649 0,-0.39369 -1.08353,-1.33853 -0.0386,-3.62186 1.04482,-2.283321 1.97361,-7.519246 1.50922,-9.881306 -0.46438,-2.362073 -1.54792,-15.471616 -10.83547,-24.211303 -9.28753,-8.739678 -18.497709,-9.763242 -18.497709,-9.763242 0,0 14.705309,4.645415 21.593569,18.739134 6.88828,14.093741 4.64376,23.148323 0.23218,28.659827 -4.41158,5.51151 -10.68068,6.14141 -12.38342,4.72415 -1.70268,-1.41725 -5.2113,6.47164 -4.38574,7.95996 z"
|
||||||
id="path1018"
|
id="path1018"
|
||||||
inkscape:connector-curvature="0" />
|
inkscape:connector-curvature="0" />
|
||||||
<path
|
<path
|
||||||
style="fill:#8fdbe9;fill-opacity:1;stroke:none;stroke-width:0.3091144px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
style="fill:#8fdbe9;fill-opacity:1;stroke:none;stroke-width:0.309114px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
d="m 86.930353,71.44277 c 0,0 -9.906718,-0.07875 -17.414156,4.881616 -7.507436,4.960371 -11.14506,8.975903 -13.23476,12.125332 -2.089697,3.149446 -4.488981,7.479909 -4.179395,7.401179 0.309585,-0.0788 9.055364,-12.2828 15.866229,-15.432236 6.81087,-3.149436 13.621741,-7.558644 22.986687,-4.330482 9.364952,3.228184 13.776542,7.716118 15.788842,6.613829 2.0123,-1.1023 2.3993,-2.440824 1.23835,-3.936804 -1.16094,-1.495979 -9.364961,-8.818417 -21.051797,-7.322434 z"
|
d="m 86.930353,66.680267 c 0,0 -9.906718,-0.07875 -17.414156,4.881616 -7.507436,4.960371 -11.14506,8.975903 -13.23476,12.125332 -2.089697,3.149446 -4.488981,7.479909 -4.179395,7.401179 0.309585,-0.0788 9.055364,-12.2828 15.866229,-15.432236 6.81087,-3.149436 13.621741,-7.558644 22.986687,-4.330482 9.364952,3.228184 13.776542,7.716118 15.788842,6.613829 2.0123,-1.1023 2.3993,-2.440824 1.23835,-3.936804 -1.16094,-1.495979 -9.364961,-8.818417 -21.051797,-7.322434 z"
|
||||||
id="path1020"
|
id="path1020"
|
||||||
inkscape:connector-curvature="0" />
|
inkscape:connector-curvature="0" />
|
||||||
<path
|
<path
|
||||||
style="fill:#fd7aff;fill-opacity:1;stroke:none;stroke-width:0.3091144px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
style="fill:#fd7aff;fill-opacity:1;stroke:none;stroke-width:0.309114px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
d="m 72.107699,134.35862 c 0.65673,0.33404 5.58219,8.90795 9.522571,10.35548 3.940372,1.44755 6.567286,1.55888 7.005104,2.227 0.437821,0.66809 0.328367,4.00858 3.830921,5.45614 3.502555,1.44753 19.920785,6.01284 24.627325,6.45824 4.70658,0.4454 0.76621,3.22911 3.61202,4.23125 2.84584,1.00217 14.99532,1.5589 17.95061,0.33405 2.95527,-1.22483 2.95527,1.1135 -2.1891,3.1178 -5.14437,2.00427 -18.71677,6.79231 -27.58261,5.67882 -8.86586,-1.1135 -19.373526,-3.00644 -25.284086,-7.23772 -5.910565,-4.23126 -8.42802,-6.1242 -6.238924,-6.45824 2.189096,-0.33407 7.990199,5.9015 10.507662,6.56959 2.517463,0.66809 4.597103,0.66809 3.064735,-0.8908 -1.532366,-1.55888 -11.492755,-8.46253 -12.477849,-8.1285 -0.985092,0.33405 -3.064737,0.55674 -4.816012,-1.78159 -1.751278,-2.33832 -10.945484,-15.25485 -10.39821,-22.1585 0.547273,-6.90365 2.298552,-5.12208 4.378195,-2.56103 2.079641,2.56103 4.487648,4.78801 4.487648,4.78801 z"
|
d="m 72.107699,130.12526 c 0.65673,0.33404 5.58219,8.90795 9.522571,10.35548 3.940372,1.44755 6.567286,1.55888 7.005104,2.227 0.437821,0.66809 0.328367,4.00858 3.830921,5.45614 3.502555,1.44753 19.920785,6.01284 24.627325,6.45824 4.70658,0.4454 0.76621,3.22911 3.61202,4.23125 2.84584,1.00217 14.99532,1.5589 17.95061,0.33405 2.95527,-1.22483 2.95527,1.1135 -2.1891,3.1178 -5.14437,2.00427 -18.71677,6.79231 -27.58261,5.67882 -8.86586,-1.1135 -19.373526,-3.00644 -25.284086,-7.23772 -5.910565,-4.23126 -8.42802,-6.1242 -6.238924,-6.45824 2.189096,-0.33407 7.990199,5.9015 10.507662,6.56959 2.517463,0.66809 4.597103,0.66809 3.064735,-0.8908 -1.532366,-1.55888 -11.492755,-8.46253 -12.477849,-8.1285 -0.985092,0.33405 -3.064737,0.55674 -4.816012,-1.78159 -1.751278,-2.33832 -10.945484,-15.25485 -10.39821,-22.1585 0.547273,-6.90365 2.298552,-5.12208 4.378195,-2.56103 2.079641,2.56103 4.487648,4.78801 4.487648,4.78801 z"
|
||||||
id="path1022"
|
id="path1022"
|
||||||
inkscape:connector-curvature="0" />
|
inkscape:connector-curvature="0" />
|
||||||
<path
|
|
||||||
style="fill:none;stroke:#939393;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
|
||||||
d="m 56.889259,34.981831 c 0,0 16.252976,26.08036 43.845241,26.83631 27.59226,0.75596 42.33333,-23.8125 42.33333,-23.8125"
|
|
||||||
id="path2138"
|
|
||||||
inkscape:connector-curvature="0" />
|
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
@@ -4,15 +4,15 @@
|
|||||||
<policyconfig>
|
<policyconfig>
|
||||||
<vendor>Spark Store</vendor>
|
<vendor>Spark Store</vendor>
|
||||||
<icon_name>x-package-repository</icon_name>
|
<icon_name>x-package-repository</icon_name>
|
||||||
<action id="store.spark-app.ss-do-upgrade-worker">
|
<action id="store.spark-app.ss-do-upgrade">
|
||||||
<description>运行ss-do-upgrade-worker需要权限</description>
|
<description>运行ss-do-upgrade需要权限</description>
|
||||||
<message>要使用ss-do-upgrade-worker需要权限</message>
|
<message>要使用ss-do-upgrade需要权限</message>
|
||||||
<defaults>
|
<defaults>
|
||||||
<allow_any>yes</allow_any>
|
<allow_any>yes</allow_any>
|
||||||
<allow_inactive>yes</allow_inactive>
|
<allow_inactive>yes</allow_inactive>
|
||||||
<allow_active>yes</allow_active>
|
<allow_active>yes</allow_active>
|
||||||
</defaults>
|
</defaults>
|
||||||
<annotate key="org.freedesktop.policykit.exec.path">/opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade-worker.sh</annotate>
|
<annotate key="org.freedesktop.policykit.exec.path">/opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade.sh</annotate>
|
||||||
<annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate>
|
<annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate>
|
||||||
</action>
|
</action>
|
||||||
</policyconfig>
|
</policyconfig>
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
TRANSHELL_CONTENT_HASH_CHECK_FAILED="Failed in checking package hash! \nPossibly reason can be the package is broken, laggy in sync of Spark Store repository, or, there is a malware attempt to attack. \nIf you don't know what happend, please try install again after execute the command below\n sudo aptss update\n\nIf the problem still happen, please click APP Feedback button in the APP information page to feedback to us.\n\n If you are in the Audition Group,Please use ssaudit instead of ssinstall to audit APPs,for ssinstall is used for password-free install now.\nIf you want to install an app that is removed from Spark Store repository,you can also use ssaudit."
|
||||||
|
TRANSHELL_CONTENT_PLEASE_RUN_AS_ROOT="Please run ssinstall as root"
|
||||||
|
TRANSHELL_CONTENT_FILE_NOT_EXIST="File not exist"
|
||||||
|
TRANSHELL_CONTENT_WILL_NOT_DELETE_DEB="No delete after install option given, will not delete the deb"
|
||||||
|
TRANSHELL_CONTENT_DEB_IS_DELETED="--delete-after-install option is given and the installation is succeeded, delete the deb file."
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
TRANSHELL_CONTENT_HASH_CHECK_FAILED="软件包校验失败!这不应该发生!\n可能是因为软件包已损坏,星火仓库未同步,或者最坏的情况:恶意软件尝试利用自动安装来入侵系统!\n如果你不清楚发生了什么,请执行 sudo aptss update 后再尝试安装。\n如果问题仍然存在,请在应用信息界面点击 应用反馈 来提交反馈给我们!\n\n 如果你是审核人员,请使用 ssaudit来替代ssinstall进行审核工作,因为现在ssinstall已经被用于免密安装。\n如果你正在尝试安装已经下架的星火应用,也可用ssaudit来替代ssinstall"
|
||||||
|
TRANSHELL_CONTENT_PLEASE_RUN_AS_ROOT="请使用root启动ssinstall"
|
||||||
|
TRANSHELL_CONTENT_FILE_NOT_EXIST="文件不存在"
|
||||||
|
TRANSHELL_CONTENT_WILL_NOT_DELETE_DEB="未指定安装后删除或安装出错,不删除deb包"
|
||||||
|
TRANSHELL_CONTENT_DEB_IS_DELETED="使用了--delete-after-install选项且安装未出错,删除deb包"
|
||||||
@@ -8,19 +8,21 @@ TARGET = spark-store
|
|||||||
TEMPLATE = subdirs
|
TEMPLATE = subdirs
|
||||||
|
|
||||||
CONFIG += ordered
|
CONFIG += ordered
|
||||||
CONFIG += wayland-compositor
|
|
||||||
|
|
||||||
SUBDIRS += \
|
SUBDIRS += \
|
||||||
src/spark-dstore-patch \
|
|
||||||
src/spark-store.pro
|
src/spark-store.pro
|
||||||
|
|
||||||
#TRANSLATIONS += \
|
# https://wiki.debian.org/Hardening
|
||||||
# translations/spark-store_fr.ts \
|
QMAKE_CFLAGS *= $(shell dpkg-buildflags --get CFLAGS)
|
||||||
# translations/spark-store_en.ts \
|
QMAKE_CPPFLAGS *= $(shell dpkg-buildflags --get CPPFLAGS)
|
||||||
# translations/spark-store_zh_CN.ts
|
QMAKE_CXXFLAGS *= $(shell dpkg-buildflags --get CXXFLAGS)
|
||||||
|
QMAKE_LFLAGS *= $(shell dpkg-buildflags --get LDFLAGS)
|
||||||
|
|
||||||
# Update translation files
|
# Update translation files
|
||||||
CONFIG(release, debug|release): system(bash $${PWD}/translate_generation.sh)
|
CONFIG(release, debug | release) {
|
||||||
|
system(bash $${PWD}/translate_update.sh)
|
||||||
|
system(bash $${PWD}/translate_generation.sh)
|
||||||
|
}
|
||||||
|
|
||||||
# Rules for deployment
|
# Rules for deployment
|
||||||
tool.files += tool/*
|
tool.files += tool/*
|
||||||
@@ -38,18 +40,25 @@ qm.path = /usr/share/spark-store/translations
|
|||||||
bash_completion.files += pkg/usr/share/bash-completion/completions/aptss
|
bash_completion.files += pkg/usr/share/bash-completion/completions/aptss
|
||||||
bash_completion.path = /usr/share/bash-completion/completions
|
bash_completion.path = /usr/share/bash-completion/completions
|
||||||
|
|
||||||
desktop.files += pkg/usr/share/applications/spark-store.desktop
|
desktop.files += pkg/usr/share/applications/*.desktop
|
||||||
desktop.path = /usr/share/applications
|
desktop.path = /usr/share/applications
|
||||||
|
|
||||||
service.files += pkg/usr/lib/systemd/system/spark-update-notifier.service
|
service.files += pkg/usr/lib/systemd/system/spark-update-notifier.service
|
||||||
service.path = /usr/lib/systemd/system/
|
service.path = /usr/lib/systemd/system/
|
||||||
|
|
||||||
polkit-1.files +=pkg/usr/share/polkit-1/actions/store.spark-app.ss-do-upgrade-worker.policy
|
polkit-1.files += pkg/usr/share/polkit-1/actions/*
|
||||||
polkit-1.path = /usr/share/polkit-1/actions/
|
polkit-1.path = /usr/share/polkit-1/actions/
|
||||||
|
|
||||||
icon.files += pkg/usr/share/icons/hicolor/scalable/apps/spark-store.svg
|
icon.files += pkg/usr/share/icons/hicolor/scalable/apps/*.svg
|
||||||
|
icon.files += pkg/usr/share/icons/hicolor/scalable/apps/*.png
|
||||||
icon.path = /usr/share/icons/hicolor/scalable/apps
|
icon.path = /usr/share/icons/hicolor/scalable/apps
|
||||||
|
|
||||||
|
ssinstall-transhell.files += pkg/usr/share/ssinstall/transhell
|
||||||
|
ssinstall-transhell.path = /usr/share/ssinstall/
|
||||||
|
|
||||||
|
aptss-transhell.files += pkg/usr/share/aptss/transhell
|
||||||
|
aptss-transhell.path = /usr/share/aptss/
|
||||||
|
|
||||||
tmp.files += pkg/tmp/spark-store-install/feedback.sh
|
tmp.files += pkg/tmp/spark-store-install/feedback.sh
|
||||||
tmp.path = /tmp/spark-store-install
|
tmp.path = /tmp/spark-store-install
|
||||||
|
|
||||||
@@ -58,7 +67,8 @@ INSTALLS += \
|
|||||||
qm \
|
qm \
|
||||||
desktop \
|
desktop \
|
||||||
icon \
|
icon \
|
||||||
# preferences \
|
ssinstall-transhell \
|
||||||
|
aptss-transhell \
|
||||||
# sourceslist \
|
# sourceslist \
|
||||||
tmp \
|
tmp \
|
||||||
service \
|
service \
|
||||||
|
|||||||
232
src/application.cpp
Normal file
@@ -0,0 +1,232 @@
|
|||||||
|
#include "application.h"
|
||||||
|
#include "mainwindow-dtk.h"
|
||||||
|
#include "utils/utils.h"
|
||||||
|
|
||||||
|
#include <QDir>
|
||||||
|
#include <QJsonArray>
|
||||||
|
#include <DPlatformWindowHandle>
|
||||||
|
#include <DLog>
|
||||||
|
#include <DGuiApplicationHelper>
|
||||||
|
#include <DAboutDialog>
|
||||||
|
#if (DTK_VERSION >= DTK_VERSION_CHECK(5, 6, 4, 0))
|
||||||
|
#include <DFeatureDisplayDialog>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <QSettings>
|
||||||
|
#include <QStandardPaths>
|
||||||
|
#include <QTranslator>
|
||||||
|
|
||||||
|
DCORE_USE_NAMESPACE
|
||||||
|
|
||||||
|
Application::Application(int &argc, char **argv)
|
||||||
|
: DApplication(argc, argv)
|
||||||
|
{
|
||||||
|
// Wayland 环境下使用,防止子控件 Native 化
|
||||||
|
if (!DPlatformWindowHandle::pluginVersion().isEmpty()) {
|
||||||
|
setAttribute(Qt::AA_DontCreateNativeWidgetSiblings, true);
|
||||||
|
}
|
||||||
|
setAttribute(Qt::AA_UseHighDpiPixmaps);
|
||||||
|
|
||||||
|
setQuitOnLastWindowClosed(false); // 启用托盘图标时,关闭窗口程序仍然运行
|
||||||
|
|
||||||
|
loadTranslator(); // 载入翻译
|
||||||
|
|
||||||
|
setOrganizationName("spark-union");
|
||||||
|
setApplicationName("spark-store"); // 影响 ~/.config/spark-union ~/.local/share/spark-union 下文件夹名称
|
||||||
|
setApplicationDisplayName(QObject::tr("Spark Store")); // 设置窗口显示标题 (Wayland 下会显示 Qt 原生标题栏)
|
||||||
|
setProductName(QObject::tr("Spark Store"));
|
||||||
|
setProductIcon(QIcon::fromTheme("spark-store"));
|
||||||
|
setApplicationHomePage("https://gitee.com/spark-store-project");
|
||||||
|
setApplicationDescription(
|
||||||
|
QObject::tr(
|
||||||
|
"<span style=' font-size:10pt;font-weight:60;'>An appstore powered by community</span><br/>"
|
||||||
|
"<a href='https://www.spark-app.store/'>https://www.spark-app.store</a><br/>"
|
||||||
|
"<span style=' font-size:12pt;'>Spark developers</span>"));
|
||||||
|
setApplicationLicense(" <a href='https://gitee.com/spark-store-project/spark-store/blob/Flamescion/LICENSE'>Spark Opensource License</a> ");
|
||||||
|
|
||||||
|
// 检查 ~/.config/spark-union/spark-store 文件夹是否存在
|
||||||
|
checkAppConfigLocation();
|
||||||
|
|
||||||
|
// 初始化日志模块 (默认日志位置 ~/.cache/spark-union/spark-store)
|
||||||
|
DLogManager::registerConsoleAppender();
|
||||||
|
DLogManager::registerFileAppender();
|
||||||
|
|
||||||
|
// 获取版本特性信息
|
||||||
|
m_featuresJsonObj = Utils::parseFeatureJsonFile();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Application::handleAboutAction()
|
||||||
|
{
|
||||||
|
if (aboutDialog() && aboutDialog()->parent() == m_mainWindow) {
|
||||||
|
DApplication::handleAboutAction();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
initAboutDialog();
|
||||||
|
#if (DTK_VERSION >= DTK_VERSION_CHECK(5, 6, 4, 0))
|
||||||
|
initFeatureDisplayDialog(); // 初始化版本特性对话框
|
||||||
|
#endif
|
||||||
|
DApplication::handleAboutAction();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Application::notify(QObject *receiver, QEvent *event)
|
||||||
|
{
|
||||||
|
if (m_mainWindow) {
|
||||||
|
m_mainWindow->notify(receiver, event);
|
||||||
|
}
|
||||||
|
|
||||||
|
return DApplication::notify(receiver, event);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Application::checkAppConfigLocation()
|
||||||
|
{
|
||||||
|
QDir dir(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation));
|
||||||
|
if (!dir.exists()) {
|
||||||
|
qWarning() << "AppConfigLocation not existed, creating...";
|
||||||
|
dir.mkpath(dir.absolutePath());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Application::setBuildDateTime(const QString &buildDateTime)
|
||||||
|
{
|
||||||
|
QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
|
||||||
|
if (config.value("build/version").toString() != QString(APP_VERSION)) {
|
||||||
|
qDebug() << "Spark Store has been updated!";
|
||||||
|
|
||||||
|
config.setValue("build/version", QString(APP_VERSION));
|
||||||
|
config.setValue("build/branch", QString(APP_BRANCH));
|
||||||
|
config.setValue("build/time", buildDateTime);
|
||||||
|
config.sync();
|
||||||
|
}
|
||||||
|
|
||||||
|
setApplicationVersion(DApplication::buildVersion(QString(APP_VERSION) + "-" + QString(APP_BRANCH) + "-" + buildDateTime));
|
||||||
|
}
|
||||||
|
|
||||||
|
void Application::setMainWindow(MainWindow *window)
|
||||||
|
{
|
||||||
|
m_mainWindow = window;
|
||||||
|
if (aboutDialog() == nullptr || aboutDialog()->parent() != m_mainWindow)
|
||||||
|
{
|
||||||
|
initAboutDialog();
|
||||||
|
}
|
||||||
|
#if (DTK_VERSION >= DTK_VERSION_CHECK(5, 6, 4, 0))
|
||||||
|
if (featureDisplayDialog() == nullptr || featureDisplayDialog()->parent() != m_mainWindow)
|
||||||
|
{
|
||||||
|
initFeatureDisplayDialog(); // 初始化版本特性对话框
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
MainWindow *Application::mainWindow()
|
||||||
|
{
|
||||||
|
return m_mainWindow;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Application::initAboutDialog()
|
||||||
|
{
|
||||||
|
if (m_mainWindow == nullptr)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (aboutDialog())
|
||||||
|
{
|
||||||
|
aboutDialog()->deleteLater();
|
||||||
|
setAboutDialog(nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 自定义 DAboutDialog
|
||||||
|
DAboutDialog *dialog = new DAboutDialog(m_mainWindow);
|
||||||
|
dialog->setProductName(productName());
|
||||||
|
dialog->setProductIcon(productIcon());
|
||||||
|
dialog->setVersion(translate("DAboutDialog", "Version: %1").arg(applicationVersion()));
|
||||||
|
if (runtimeDtkVersion() >= DTK_VERSION_CHECK(5, 6, 4, 0)) {
|
||||||
|
dialog->setVersion(applicationVersion());
|
||||||
|
}
|
||||||
|
// 根据 shenmo 要求,不显示组织 Logo
|
||||||
|
// dialog->setCompanyLogo(QPixmap(":/icon/Logo-Spark.png"));
|
||||||
|
dialog->setCompanyLogo(QPixmap());
|
||||||
|
dialog->setWebsiteName(QObject::tr("Spark Project"));
|
||||||
|
dialog->setWebsiteLink(applicationHomePage());
|
||||||
|
dialog->setDescription(applicationDescription());
|
||||||
|
dialog->setLicense(translate("DAboutDialog", "%1 is released under %2").arg(productName()).arg(applicationLicense()));
|
||||||
|
|
||||||
|
setAboutDialog(dialog);
|
||||||
|
connect(aboutDialog(), &DAboutDialog::destroyed, this, [=]() {
|
||||||
|
setAboutDialog(nullptr);
|
||||||
|
});
|
||||||
|
|
||||||
|
dialog->hide();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Application::loadTranslator()
|
||||||
|
{
|
||||||
|
DApplication::loadTranslator();
|
||||||
|
|
||||||
|
if (QLocale::system().language() == QLocale::Chinese) {
|
||||||
|
QTranslator *webengineTranslator = new QTranslator(this);
|
||||||
|
webengineTranslator->load(QLocale(QLocale::Chinese), "qtwebengine", "_", ":/translations");
|
||||||
|
installTranslator(webengineTranslator);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#if (DTK_VERSION >= DTK_VERSION_CHECK(5, 6, 4, 0))
|
||||||
|
/**
|
||||||
|
* @brief Application::initFeatureDisplayDialog 初始化版本特性对话框
|
||||||
|
*/
|
||||||
|
void Application::initFeatureDisplayDialog()
|
||||||
|
{
|
||||||
|
if (featureDisplayDialog())
|
||||||
|
{
|
||||||
|
featureDisplayDialog()->deleteLater();
|
||||||
|
setFeatureDisplayDialog(nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 自定义 DFeatureDisplayDialog
|
||||||
|
DFeatureDisplayDialog *dialog = new DFeatureDisplayDialog(m_mainWindow);
|
||||||
|
// 标题
|
||||||
|
dialog->setTitle(m_featuresJsonObj.value("title").toString());
|
||||||
|
// NOTE: json 文件中支持多语言;考虑到维护性,不放入翻译文件处理
|
||||||
|
if (m_featuresJsonObj.contains(QString("title[%1]").arg(QLocale::system().name())))
|
||||||
|
{
|
||||||
|
dialog->setTitle(m_featuresJsonObj.value(QString("title[%1]").arg(QLocale::system().name())).toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
// 特性项
|
||||||
|
QList<DFeatureItem *> items;
|
||||||
|
foreach (const QJsonValue &jsonValue, m_featuresJsonObj.value("items").toArray())
|
||||||
|
{
|
||||||
|
QJsonObject jsonObj = jsonValue.toObject();
|
||||||
|
QString name = jsonObj.value("name").toString();
|
||||||
|
if (jsonObj.contains(QString("name[%1]").arg(QLocale::system().name())))
|
||||||
|
{
|
||||||
|
name = jsonObj.value(QString("name[%1]").arg(QLocale::system().name())).toString();
|
||||||
|
}
|
||||||
|
QString description = jsonObj.value("description").toString();
|
||||||
|
if (jsonObj.contains(QString("description[%1]").arg(QLocale::system().name())))
|
||||||
|
{
|
||||||
|
description = jsonObj.value(QString("description[%1]").arg(QLocale::system().name())).toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
DFeatureItem *item = new DFeatureItem(QIcon::fromTheme("spark-store"), name, description, dialog);
|
||||||
|
items.append(item);
|
||||||
|
}
|
||||||
|
dialog->addItems(items); // NOTE: 也支持 addItem 依次添加单个 item
|
||||||
|
|
||||||
|
// “了解更多”链接按钮
|
||||||
|
dialog->setLinkUrl(m_featuresJsonObj.value("linkUrl").toString());
|
||||||
|
dialog->setLinkButtonVisible(m_featuresJsonObj.value("linkButtonVisible").toBool());
|
||||||
|
|
||||||
|
setFeatureDisplayDialog(dialog);
|
||||||
|
connect(featureDisplayDialog(), &DFeatureDisplayDialog::destroyed, this, [=]() {
|
||||||
|
setFeatureDisplayDialog(nullptr);
|
||||||
|
});
|
||||||
|
#if (DTK_VERSION >= DTK_VERSION_CHECK(5, 6, 4, 0))
|
||||||
|
connect(aboutDialog(), &DAboutDialog::featureActivated, this, [=]() {
|
||||||
|
featureDisplayDialog()->show();
|
||||||
|
});
|
||||||
|
#endif
|
||||||
|
|
||||||
|
dialog->hide();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
41
src/application.h
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
#ifndef APPLICATION_H
|
||||||
|
#define APPLICATION_H
|
||||||
|
|
||||||
|
#include <DApplication>
|
||||||
|
|
||||||
|
#include <QJsonObject>
|
||||||
|
|
||||||
|
DWIDGET_USE_NAMESPACE
|
||||||
|
|
||||||
|
class MainWindow;
|
||||||
|
class Application : public DApplication
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
Application(int &argc, char **argv);
|
||||||
|
void handleAboutAction() override;
|
||||||
|
bool notify(QObject *receiver, QEvent *event) override;
|
||||||
|
|
||||||
|
static void checkAppConfigLocation();
|
||||||
|
|
||||||
|
void setBuildDateTime(const QString &buildDateTime);
|
||||||
|
|
||||||
|
void setMainWindow(MainWindow *window);
|
||||||
|
MainWindow *mainWindow();
|
||||||
|
|
||||||
|
private:
|
||||||
|
void initAboutDialog();
|
||||||
|
#if (DTK_VERSION >= DTK_VERSION_CHECK(5, 6, 4, 0))
|
||||||
|
void initFeatureDisplayDialog();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void loadTranslator();
|
||||||
|
|
||||||
|
private:
|
||||||
|
QJsonObject m_featuresJsonObj;
|
||||||
|
|
||||||
|
MainWindow *m_mainWindow = nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // APPLICATION_H
|
||||||
@@ -1,43 +1,6 @@
|
|||||||
<RCC>
|
<RCC>
|
||||||
<qresource prefix="/">
|
<qresource prefix="/">
|
||||||
<file>icon/logo.svg</file>
|
<file>icon/Logo-Spark.png</file>
|
||||||
<file>tags/a2d-small.png</file>
|
|
||||||
<file>tags/a2d.png</file>
|
|
||||||
<file>tags/community-small.png</file>
|
|
||||||
<file>tags/community.png</file>
|
|
||||||
<file>tags/community.svg</file>
|
|
||||||
<file>tags/deepin-small.png</file>
|
|
||||||
<file>tags/deepin.svg</file>
|
|
||||||
<file>tags/dtk-small.png</file>
|
|
||||||
<file>tags/dwine2-small.png</file>
|
|
||||||
<file>tags/dwine5-small.png</file>
|
|
||||||
<file>tags/dwine5.svg</file>
|
|
||||||
<file>tags/logo_icon.svg</file>
|
|
||||||
<file>tags/ubuntu-small.png</file>
|
|
||||||
<file>tags/ubuntu.png</file>
|
|
||||||
<file>tags/uos-authorize.svg</file>
|
|
||||||
<file>tags/uos-small.png</file>
|
|
||||||
<file>tags/uos.svg</file>
|
|
||||||
<file>icon/light/back.svg</file>
|
|
||||||
<file>icon/light/download.svg</file>
|
|
||||||
<file>icon/light/leftbutton_0.svg</file>
|
|
||||||
<file>icon/light/leftbutton_1.svg</file>
|
|
||||||
<file>icon/light/leftbutton_2.svg</file>
|
|
||||||
<file>icon/light/leftbutton_3.svg</file>
|
|
||||||
<file>icon/light/leftbutton_4.svg</file>
|
|
||||||
<file>icon/light/leftbutton_5.svg</file>
|
|
||||||
<file>icon/light/leftbutton_6.svg</file>
|
|
||||||
<file>icon/light/leftbutton_7.svg</file>
|
|
||||||
<file>icon/light/leftbutton_8.svg</file>
|
|
||||||
<file>icon/light/leftbutton_9.svg</file>
|
|
||||||
<file>icon/light/leftbutton_10.svg</file>
|
|
||||||
<file>icon/light/leftbutton_11.svg</file>
|
|
||||||
<file>icon/light/leftbutton_12.svg</file>
|
|
||||||
<file>icon/light/box.svg</file>
|
|
||||||
<file>icon/light/calendar.svg</file>
|
|
||||||
<file>icon/light/globe.svg</file>
|
|
||||||
<file>icon/light/folder.svg</file>
|
|
||||||
<file>icon/light/text.svg</file>
|
|
||||||
<file>icon/dark/back.svg</file>
|
<file>icon/dark/back.svg</file>
|
||||||
<file>icon/dark/box.svg</file>
|
<file>icon/dark/box.svg</file>
|
||||||
<file>icon/dark/calendar.svg</file>
|
<file>icon/dark/calendar.svg</file>
|
||||||
@@ -58,7 +21,47 @@
|
|||||||
<file>icon/dark/leftbutton_11.svg</file>
|
<file>icon/dark/leftbutton_11.svg</file>
|
||||||
<file>icon/dark/leftbutton_12.svg</file>
|
<file>icon/dark/leftbutton_12.svg</file>
|
||||||
<file>icon/dark/text.svg</file>
|
<file>icon/dark/text.svg</file>
|
||||||
<file>icon/light/update.svg</file>
|
|
||||||
<file>icon/dark/update.svg</file>
|
<file>icon/dark/update.svg</file>
|
||||||
|
<file>icon/light/back.svg</file>
|
||||||
|
<file>icon/light/download.svg</file>
|
||||||
|
<file>icon/light/leftbutton_0.svg</file>
|
||||||
|
<file>icon/light/leftbutton_1.svg</file>
|
||||||
|
<file>icon/light/leftbutton_2.svg</file>
|
||||||
|
<file>icon/light/leftbutton_3.svg</file>
|
||||||
|
<file>icon/light/leftbutton_4.svg</file>
|
||||||
|
<file>icon/light/leftbutton_5.svg</file>
|
||||||
|
<file>icon/light/leftbutton_6.svg</file>
|
||||||
|
<file>icon/light/leftbutton_7.svg</file>
|
||||||
|
<file>icon/light/leftbutton_8.svg</file>
|
||||||
|
<file>icon/light/leftbutton_9.svg</file>
|
||||||
|
<file>icon/light/leftbutton_10.svg</file>
|
||||||
|
<file>icon/light/leftbutton_11.svg</file>
|
||||||
|
<file>icon/light/leftbutton_12.svg</file>
|
||||||
|
<file>icon/light/box.svg</file>
|
||||||
|
<file>icon/light/calendar.svg</file>
|
||||||
|
<file>icon/light/globe.svg</file>
|
||||||
|
<file>icon/light/folder.svg</file>
|
||||||
|
<file>icon/light/text.svg</file>
|
||||||
|
<file>icon/light/update.svg</file>
|
||||||
|
<file>icon/logo.svg</file>
|
||||||
|
<file>json/features.json</file>
|
||||||
|
<file>tags/a2d-small.png</file>
|
||||||
|
<file>tags/a2d.png</file>
|
||||||
|
<file>tags/community-small.png</file>
|
||||||
|
<file>tags/community.png</file>
|
||||||
|
<file>tags/community.svg</file>
|
||||||
|
<file>tags/deepin-small.png</file>
|
||||||
|
<file>tags/deepin.svg</file>
|
||||||
|
<file>tags/dtk-small.png</file>
|
||||||
|
<file>tags/dwine2-small.png</file>
|
||||||
|
<file>tags/dwine5-small.png</file>
|
||||||
|
<file>tags/dwine5.svg</file>
|
||||||
|
<file>tags/logo_icon.svg</file>
|
||||||
|
<file>tags/ubuntu-small.png</file>
|
||||||
|
<file>tags/ubuntu.png</file>
|
||||||
|
<file>tags/uos-authorize.svg</file>
|
||||||
|
<file>tags/uos-small.png</file>
|
||||||
|
<file>tags/uos.svg</file>
|
||||||
|
<file>translations/qtwebengine_zh.qm</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
</RCC>
|
</RCC>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 11 KiB |
249
src/assets/icon/logo-no-border.svg
Normal file
@@ -0,0 +1,249 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
inkscape:export-ydpi="127"
|
||||||
|
inkscape:export-xdpi="127"
|
||||||
|
inkscape:export-filename="/home/zhangtianyi/Desktop/deepin-community-store.png"
|
||||||
|
width="200mm"
|
||||||
|
height="200mm"
|
||||||
|
viewBox="0 0 200 200"
|
||||||
|
version="1.1"
|
||||||
|
id="svg8"
|
||||||
|
inkscape:version="1.3 (0e150ed, 2023-07-21)"
|
||||||
|
sodipodi:docname="logo-no-border.svg"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||||
|
<defs
|
||||||
|
id="defs2">
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
id="linearGradient1200">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#000000;stop-opacity:0.1299435"
|
||||||
|
offset="0"
|
||||||
|
id="stop1196" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#dadada;stop-opacity:0.81960785"
|
||||||
|
offset="1"
|
||||||
|
id="stop1198" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient1138"
|
||||||
|
inkscape:collect="always">
|
||||||
|
<stop
|
||||||
|
id="stop1134"
|
||||||
|
offset="0"
|
||||||
|
style="stop-color:#99e7ea;stop-opacity:1" />
|
||||||
|
<stop
|
||||||
|
id="stop1136"
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:#007ffc;stop-opacity:1" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
id="linearGradient1128">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#99e7ea;stop-opacity:1"
|
||||||
|
offset="0"
|
||||||
|
id="stop1124" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#007ffc;stop-opacity:1"
|
||||||
|
offset="1"
|
||||||
|
id="stop1126" />
|
||||||
|
</linearGradient>
|
||||||
|
<inkscape:path-effect
|
||||||
|
effect="bspline"
|
||||||
|
id="path-effect960"
|
||||||
|
is_visible="true"
|
||||||
|
weight="33.333333"
|
||||||
|
steps="2"
|
||||||
|
helper_size="0"
|
||||||
|
apply_no_weight="true"
|
||||||
|
apply_with_weight="true"
|
||||||
|
only_selected="false" />
|
||||||
|
<radialGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient1128"
|
||||||
|
id="radialGradient1130"
|
||||||
|
cx="100.35268"
|
||||||
|
cy="199.86011"
|
||||||
|
fx="100.35268"
|
||||||
|
fy="199.86011"
|
||||||
|
r="90.135414"
|
||||||
|
gradientTransform="matrix(1,0,0,0.98112945,0,3.7714702)"
|
||||||
|
gradientUnits="userSpaceOnUse" />
|
||||||
|
<radialGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient1138"
|
||||||
|
id="radialGradient1132"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(1,0,0,0.98112945,0,3.7714702)"
|
||||||
|
cx="100.35268"
|
||||||
|
cy="199.86011"
|
||||||
|
fx="100.35268"
|
||||||
|
fy="199.86011"
|
||||||
|
r="90.135414" />
|
||||||
|
<radialGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient1200"
|
||||||
|
id="radialGradient1202"
|
||||||
|
cx="100.35268"
|
||||||
|
cy="199.86011"
|
||||||
|
fx="100.35268"
|
||||||
|
fy="199.86011"
|
||||||
|
r="90.135414"
|
||||||
|
gradientTransform="matrix(1,0,0,0.98112945,0,3.7714702)"
|
||||||
|
gradientUnits="userSpaceOnUse" />
|
||||||
|
<filter
|
||||||
|
style="color-interpolation-filters:sRGB;"
|
||||||
|
inkscape:label="Drop Shadow"
|
||||||
|
id="filter1448">
|
||||||
|
<feFlood
|
||||||
|
flood-opacity="0.372549"
|
||||||
|
flood-color="rgb(145,145,145)"
|
||||||
|
result="flood"
|
||||||
|
id="feFlood1438" />
|
||||||
|
<feComposite
|
||||||
|
in="flood"
|
||||||
|
in2="SourceGraphic"
|
||||||
|
operator="in"
|
||||||
|
result="composite1"
|
||||||
|
id="feComposite1440" />
|
||||||
|
<feGaussianBlur
|
||||||
|
in="composite1"
|
||||||
|
stdDeviation="5.2918"
|
||||||
|
result="blur"
|
||||||
|
id="feGaussianBlur1442" />
|
||||||
|
<feOffset
|
||||||
|
dx="0"
|
||||||
|
dy="0"
|
||||||
|
result="offset"
|
||||||
|
id="feOffset1444" />
|
||||||
|
<feComposite
|
||||||
|
in="SourceGraphic"
|
||||||
|
in2="offset"
|
||||||
|
operator="over"
|
||||||
|
result="composite2"
|
||||||
|
id="feComposite1446" />
|
||||||
|
</filter>
|
||||||
|
<filter
|
||||||
|
style="color-interpolation-filters:sRGB;"
|
||||||
|
inkscape:label="Drop Shadow"
|
||||||
|
id="filter2201"
|
||||||
|
x="-0.06449152"
|
||||||
|
y="-0.061604632"
|
||||||
|
width="1.128983"
|
||||||
|
height="1.1232093">
|
||||||
|
<feFlood
|
||||||
|
flood-opacity="0.372549"
|
||||||
|
flood-color="rgb(145,145,145)"
|
||||||
|
result="flood"
|
||||||
|
id="feFlood2191" />
|
||||||
|
<feComposite
|
||||||
|
in="flood"
|
||||||
|
in2="SourceGraphic"
|
||||||
|
operator="in"
|
||||||
|
result="composite1"
|
||||||
|
id="feComposite2193" />
|
||||||
|
<feGaussianBlur
|
||||||
|
in="composite1"
|
||||||
|
stdDeviation="3.76995"
|
||||||
|
result="blur"
|
||||||
|
id="feGaussianBlur2195" />
|
||||||
|
<feOffset
|
||||||
|
dx="0"
|
||||||
|
dy="0"
|
||||||
|
result="offset"
|
||||||
|
id="feOffset2197" />
|
||||||
|
<feComposite
|
||||||
|
in="SourceGraphic"
|
||||||
|
in2="offset"
|
||||||
|
operator="over"
|
||||||
|
result="composite2"
|
||||||
|
id="feComposite2199" />
|
||||||
|
</filter>
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="0.98994949"
|
||||||
|
inkscape:cx="476.28692"
|
||||||
|
inkscape:cy="375.77675"
|
||||||
|
inkscape:document-units="mm"
|
||||||
|
inkscape:current-layer="layer1"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-height="974"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:document-rotation="0"
|
||||||
|
inkscape:showpageshadow="2"
|
||||||
|
inkscape:pagecheckerboard="0"
|
||||||
|
inkscape:deskcolor="#d1d1d1" />
|
||||||
|
<metadata
|
||||||
|
id="metadata5">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(0,-97)" />
|
||||||
|
<g
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer2"
|
||||||
|
inkscape:label="Layer 2">
|
||||||
|
<path
|
||||||
|
style="fill:#ffc344;fill-opacity:1;stroke:none;stroke-width:0.309114px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 94.205599,38.155907 c 0,0 11.145081,-0.157476 22.599701,6.928753 11.45465,7.086223 18.11074,13.857508 20.27783,18.266716 2.16708,4.409209 9.28755,12.125332 9.13277,26.297795 -0.15488,14.172409 -3.40543,23.620739 -8.97797,31.494299 -5.57254,7.87359 -15.63405,13.85751 -27.70786,14.17247 -12.073829,0.31494 -19.813453,-7.55863 -22.444927,-11.96786 -2.631469,-4.4092 -3.715019,-13.85751 -0.464377,-20.62877 3.250645,-6.771296 8.358796,-6.771296 10.061513,-6.141389 1.702724,0.629897 2.167092,1.574691 3.095852,3.306872 0.928749,1.732187 1.547929,1.417257 2.941089,0.472427 1.39311,-0.944834 1.85748,-2.047138 1.54792,-3.464372 -0.30958,-1.417247 -2.16711,-3.149427 -3.71505,-3.621847 -1.547909,-0.47241 -3.715016,-1.88966 -6.810869,-1.41721 -3.095848,0.47238 -9.132757,2.04711 -14.240906,8.975819 -5.108153,6.92875 -4.488988,17.63684 -1.393134,22.67593 3.095849,5.0391 8.977962,14.48739 21.980539,17.79431 13.00259,3.30693 34.05435,-6.45633 41.32959,-21.57361 7.27524,-15.1173 7.43004,-22.203505 7.12048,-34.64374 C 148.22821,72.642208 137.23793,54.060548 125.00933,47.289265 112.78073,40.517979 103.64797,36.581186 94.205599,38.155907 Z"
|
||||||
|
id="path1002"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
style="fill:#f06767;fill-opacity:1;stroke:none;stroke-width:0.309114px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 100.67541,101.06311 c 0,0 -3.06474,-2.895088 -5.801108,2.22698 -2.736373,5.12205 -4.049827,9.68737 -1.313459,15.25486 2.736367,5.56745 8.428007,8.90792 17.184447,8.79659 8.75636,-0.11148 15.21419,-2.22699 19.0451,-8.5739 3.83094,-6.34692 6.7862,-11.02357 7.11457,-13.36191 0.32839,-2.33835 2.07965,0.33404 1.53239,2.33834 -0.54728,2.00426 -0.43783,5.9015 1.09454,5.12204 1.53237,-0.77942 2.73637,-2.00427 2.95526,-1.44753 0.21893,0.55673 -1.75127,4.00859 -2.68162,5.73449 -0.93039,1.7259 -3.83094,5.90153 -5.5275,7.51607 -1.69652,1.61458 -4.04981,3.89724 -6.84092,5.56747 -2.79109,1.67024 -7.11454,3.61887 -9.52255,4.06427 -2.40801,0.44539 -7.22403,1.39184 -9.96042,1.2805 -2.73635,-0.11137 -6.23892,-0.61243 -10.124558,-2.56104 -3.885645,-1.94859 -8.099657,-4.95505 -9.741479,-7.96148 -1.641825,-3.00643 -4.159283,-5.73449 -3.61201,-13.30623 0.547277,-7.57175 3.010008,-11.46899 4.870741,-13.250551 1.860731,-1.781588 4.597103,-2.561035 6.403105,-2.171298 1.806004,0.38971 2.955282,1.447544 3.393102,2.226958 0.43781,0.779437 1.149279,2.226981 1.532369,2.505371 z"
|
||||||
|
id="path1012"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
style="fill:#3f62eb;fill-opacity:1;stroke:none;stroke-width:0.309114px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 132.18114,140.09049 c 0,0 13.13457,-7.6831 19.26404,-19.82016 6.12948,-12.13707 8.7564,-19.93152 7.99021,-31.84589 -0.76619,-11.914358 -2.62692,-6.012854 -0.54728,-11.134928 2.07964,-5.122074 -1.31345,-15.254857 0.10943,-15.922949 1.42292,-0.668097 4.48765,4.453971 5.3633,8.573903 0.87562,4.119922 4.70654,16.813721 1.64181,32.959364 -3.06472,16.14564 -10.28872,22.60391 -15.10475,26.94655 -4.81603,4.34261 -15.7615,11.91437 -17.40332,11.80302 -1.64183,-0.11148 -1.86073,-0.11148 -1.31348,-1.55891 z"
|
||||||
|
id="path1014"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
style="fill:#fce102;fill-opacity:1;stroke:none;stroke-width:0.309114px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 104.83471,117.2363 c 0,0 7.00512,1.5589 12.36838,-1.78156 5.3633,-3.3405 9.5226,-8.79661 10.17931,-10.91225 0.65672,-2.11564 0.76619,1.89294 1.53236,-0.11125 0.76618,-2.00432 3.83093,-6.012871 2.29855,-15.366212 -1.53237,-9.35333 -1.64182,-9.798747 -4.48762,-14.809463 -2.84586,-5.010719 -9.63207,-11.91437 -13.79134,-14.141359 -4.15927,-2.226986 -9.96037,-5.567464 -17.950594,-5.344766 -7.990202,0.222699 -5.363286,-0.334048 -13.025124,1.002146 -7.661836,1.336187 -14.557491,5.010717 -16.856041,7.015006 -2.298552,2.004286 -8.428023,7.460405 -10.61712,10.46684 -2.189098,3.00643 -8.209113,9.798741 -11.383303,19.263442 -3.174189,9.464656 -4.487646,10.466796 -4.706555,16.702366 -0.21891,6.23557 0.547274,7.90578 -0.766185,8.46256 -1.31346,0.55673 -1.094547,-4.67668 -0.985094,-8.35123 0.109463,-3.6745 0.109463,-13.250536 4.925468,-23.940057 4.816015,-10.689538 13.353489,-19.597489 18.169503,-22.826622 4.816009,-3.229128 10.398208,-7.571752 19.045135,-9.687392 8.646933,-2.115635 17.293863,-1.781586 22.65716,-0.779443 5.3633,1.002145 13.68187,4.453974 18.1695,7.905802 4.48766,3.45183 9.41314,7.683099 13.13459,14.586765 3.72146,6.903648 4.70654,15.700251 4.59709,19.374771 -0.10943,3.674531 -1.97019,12.137076 -4.81601,16.256986 -2.84583,4.11993 -6.67674,9.0193 -10.61711,10.80089 -3.94039,1.78157 -8.75642,2.33833 -12.69675,0.55674 -3.94039,-1.78161 -3.72147,-2.44969 -4.3782,-4.34263 z"
|
||||||
|
id="path1016"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
style="fill:#5ed938;fill-opacity:1;stroke:none;stroke-width:0.309114px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 104.83471,117.2363 c 0,0 5.54674,1.56707 10.22918,-0.55878 4.68248,-2.12587 6.4239,-4.17301 7.54615,-5.3934 1.12223,-1.22042 3.25064,-3.50376 3.83112,-4.56669 0.58046,-1.06292 1.19962,-1.69282 1.19962,-2.08649 0,-0.39369 -1.08353,-1.33853 -0.0386,-3.62186 1.04482,-2.283321 1.97361,-7.519246 1.50922,-9.881306 -0.46438,-2.362073 -1.54792,-15.471616 -10.83547,-24.211303 -9.28753,-8.739678 -18.497709,-9.763242 -18.497709,-9.763242 0,0 14.705309,4.645415 21.593569,18.739134 6.88828,14.093741 4.64376,23.148323 0.23218,28.659827 -4.41158,5.51151 -10.68068,6.14141 -12.38342,4.72415 -1.70268,-1.41725 -5.2113,6.47164 -4.38574,7.95996 z"
|
||||||
|
id="path1018"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
style="fill:#8fdbe9;fill-opacity:1;stroke:none;stroke-width:0.309114px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 86.930353,66.680267 c 0,0 -9.906718,-0.07875 -17.414156,4.881616 -7.507436,4.960371 -11.14506,8.975903 -13.23476,12.125332 -2.089697,3.149446 -4.488981,7.479909 -4.179395,7.401179 0.309585,-0.0788 9.055364,-12.2828 15.866229,-15.432236 6.81087,-3.149436 13.621741,-7.558644 22.986687,-4.330482 9.364952,3.228184 13.776542,7.716118 15.788842,6.613829 2.0123,-1.1023 2.3993,-2.440824 1.23835,-3.936804 -1.16094,-1.495979 -9.364961,-8.818417 -21.051797,-7.322434 z"
|
||||||
|
id="path1020"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
style="fill:#fd7aff;fill-opacity:1;stroke:none;stroke-width:0.309114px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 72.107699,130.12526 c 0.65673,0.33404 5.58219,8.90795 9.522571,10.35548 3.940372,1.44755 6.567286,1.55888 7.005104,2.227 0.437821,0.66809 0.328367,4.00858 3.830921,5.45614 3.502555,1.44753 19.920785,6.01284 24.627325,6.45824 4.70658,0.4454 0.76621,3.22911 3.61202,4.23125 2.84584,1.00217 14.99532,1.5589 17.95061,0.33405 2.95527,-1.22483 2.95527,1.1135 -2.1891,3.1178 -5.14437,2.00427 -18.71677,6.79231 -27.58261,5.67882 -8.86586,-1.1135 -19.373526,-3.00644 -25.284086,-7.23772 -5.910565,-4.23126 -8.42802,-6.1242 -6.238924,-6.45824 2.189096,-0.33407 7.990199,5.9015 10.507662,6.56959 2.517463,0.66809 4.597103,0.66809 3.064735,-0.8908 -1.532366,-1.55888 -11.492755,-8.46253 -12.477849,-8.1285 -0.985092,0.33405 -3.064737,0.55674 -4.816012,-1.78159 -1.751278,-2.33832 -10.945484,-15.25485 -10.39821,-22.1585 0.547273,-6.90365 2.298552,-5.12208 4.378195,-2.56103 2.079641,2.56103 4.487648,4.78801 4.487648,4.78801 z"
|
||||||
|
id="path1022"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 13 KiB |
@@ -1,6 +1,4 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
|
||||||
|
|
||||||
<svg
|
<svg
|
||||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
xmlns:cc="http://creativecommons.org/ns#"
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
@@ -10,12 +8,15 @@
|
|||||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
inkscape:export-ydpi="127"
|
||||||
|
inkscape:export-xdpi="127"
|
||||||
|
inkscape:export-filename="/home/zhangtianyi/Desktop/deepin-community-store.png"
|
||||||
width="200mm"
|
width="200mm"
|
||||||
height="200mm"
|
height="200mm"
|
||||||
viewBox="0 0 200 200"
|
viewBox="0 0 200 200"
|
||||||
version="1.1"
|
version="1.1"
|
||||||
id="svg8"
|
id="svg8"
|
||||||
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
|
inkscape:version="1.0 (4035a4f, 2020-05-01)"
|
||||||
sodipodi:docname="deepin-community-store.svg">
|
sodipodi:docname="deepin-community-store.svg">
|
||||||
<defs
|
<defs
|
||||||
id="defs2">
|
id="defs2">
|
||||||
@@ -170,17 +171,18 @@
|
|||||||
borderopacity="1.0"
|
borderopacity="1.0"
|
||||||
inkscape:pageopacity="0.0"
|
inkscape:pageopacity="0.0"
|
||||||
inkscape:pageshadow="2"
|
inkscape:pageshadow="2"
|
||||||
inkscape:zoom="0.35"
|
inkscape:zoom="0.7"
|
||||||
inkscape:cx="120.33119"
|
inkscape:cx="13.97476"
|
||||||
inkscape:cy="507.94585"
|
inkscape:cy="371.76152"
|
||||||
inkscape:document-units="mm"
|
inkscape:document-units="mm"
|
||||||
inkscape:current-layer="layer1"
|
inkscape:current-layer="layer2"
|
||||||
showgrid="false"
|
showgrid="false"
|
||||||
inkscape:window-width="1920"
|
inkscape:window-width="1920"
|
||||||
inkscape:window-height="1040"
|
inkscape:window-height="941"
|
||||||
inkscape:window-x="0"
|
inkscape:window-x="0"
|
||||||
inkscape:window-y="0"
|
inkscape:window-y="0"
|
||||||
inkscape:window-maximized="1" />
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:document-rotation="0" />
|
||||||
<metadata
|
<metadata
|
||||||
id="metadata5">
|
id="metadata5">
|
||||||
<rdf:RDF>
|
<rdf:RDF>
|
||||||
@@ -199,70 +201,54 @@
|
|||||||
id="layer1"
|
id="layer1"
|
||||||
transform="translate(0,-97)">
|
transform="translate(0,-97)">
|
||||||
<rect
|
<rect
|
||||||
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ebebeb;stroke-width:2.87003541;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter2201)"
|
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ebebeb;stroke-width:2.87004;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter2201)"
|
||||||
id="rect2119"
|
id="rect2119"
|
||||||
width="162.54665"
|
width="162.54665"
|
||||||
height="170.16383"
|
height="170.16383"
|
||||||
x="20.431099"
|
x="20.431099"
|
||||||
y="112.51035"
|
y="112.51035"
|
||||||
rx="30"
|
rx="30"
|
||||||
ry="30" />
|
ry="30"
|
||||||
<circle
|
transform="matrix(1.0253898,0,0,0.97932001,-4.2824724,3.4808454)" />
|
||||||
style="opacity:1;fill:#959595;fill-opacity:1;stroke:#e9e9e9;stroke-width:3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
|
||||||
id="path2121"
|
|
||||||
cx="58.208336"
|
|
||||||
cy="131.8244"
|
|
||||||
r="6.0476193" />
|
|
||||||
<circle
|
|
||||||
style="opacity:1;fill:#9c9c9c;fill-opacity:1;stroke:#eaeaea;stroke-width:3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
|
||||||
id="path2121-5"
|
|
||||||
cx="143.63095"
|
|
||||||
cy="133.71429"
|
|
||||||
r="6.0476193" />
|
|
||||||
</g>
|
</g>
|
||||||
<g
|
<g
|
||||||
inkscape:groupmode="layer"
|
inkscape:groupmode="layer"
|
||||||
id="layer2"
|
id="layer2"
|
||||||
inkscape:label="Layer 2">
|
inkscape:label="Layer 2">
|
||||||
<path
|
<path
|
||||||
style="fill:#ffc344;fill-opacity:1;stroke:none;stroke-width:0.3091144px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
style="fill:#ffc344;fill-opacity:1;stroke:none;stroke-width:0.309114px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
d="m 94.205599,42.389243 c 0,0 11.145081,-0.157476 22.599701,6.928753 11.45465,7.086223 18.11074,13.857508 20.27783,18.266716 2.16708,4.409209 9.28755,12.125332 9.13277,26.297795 -0.15488,14.172433 -3.40543,23.620763 -8.97797,31.494323 -5.57254,7.87359 -15.63405,13.85751 -27.70786,14.17247 -12.073829,0.31494 -19.813453,-7.55863 -22.444927,-11.96786 -2.631469,-4.4092 -3.715019,-13.85751 -0.464377,-20.62877 3.250645,-6.77132 8.358796,-6.77132 10.061513,-6.14141 1.702724,0.6299 2.167092,1.5747 3.095852,3.30689 0.928749,1.73219 1.547929,1.41726 2.941089,0.47243 1.39311,-0.94484 1.85748,-2.04715 1.54792,-3.46439 -0.30958,-1.417253 -2.16711,-3.149433 -3.71505,-3.621853 -1.547909,-0.47241 -3.715016,-1.88966 -6.810869,-1.41721 -3.095848,0.47238 -9.132757,2.04711 -14.240906,8.975843 -5.108153,6.92875 -4.488988,17.63684 -1.393134,22.67593 3.095849,5.0391 8.977962,14.48739 21.980539,17.79431 13.00259,3.30693 34.05435,-6.45633 41.32959,-21.57361 7.27524,-15.1173 7.43004,-22.20352 7.12048,-34.643764 C 148.22821,76.875544 137.23793,58.293884 125.00933,51.522601 112.78073,44.751315 103.64797,40.814522 94.205599,42.389243 Z"
|
d="m 94.205599,38.155907 c 0,0 11.145081,-0.157476 22.599701,6.928753 11.45465,7.086223 18.11074,13.857508 20.27783,18.266716 2.16708,4.409209 9.28755,12.125332 9.13277,26.297795 -0.15488,14.172409 -3.40543,23.620739 -8.97797,31.494299 -5.57254,7.87359 -15.63405,13.85751 -27.70786,14.17247 -12.073829,0.31494 -19.813453,-7.55863 -22.444927,-11.96786 -2.631469,-4.4092 -3.715019,-13.85751 -0.464377,-20.62877 3.250645,-6.771296 8.358796,-6.771296 10.061513,-6.141389 1.702724,0.629897 2.167092,1.574691 3.095852,3.306872 0.928749,1.732187 1.547929,1.417257 2.941089,0.472427 1.39311,-0.944834 1.85748,-2.047138 1.54792,-3.464372 -0.30958,-1.417247 -2.16711,-3.149427 -3.71505,-3.621847 -1.547909,-0.47241 -3.715016,-1.88966 -6.810869,-1.41721 -3.095848,0.47238 -9.132757,2.04711 -14.240906,8.975819 -5.108153,6.92875 -4.488988,17.63684 -1.393134,22.67593 3.095849,5.0391 8.977962,14.48739 21.980539,17.79431 13.00259,3.30693 34.05435,-6.45633 41.32959,-21.57361 7.27524,-15.1173 7.43004,-22.203505 7.12048,-34.64374 C 148.22821,72.642208 137.23793,54.060548 125.00933,47.289265 112.78073,40.517979 103.64797,36.581186 94.205599,38.155907 Z"
|
||||||
id="path1002"
|
id="path1002"
|
||||||
inkscape:connector-curvature="0" />
|
inkscape:connector-curvature="0" />
|
||||||
<path
|
<path
|
||||||
style="fill:#f06767;fill-opacity:1;stroke:none;stroke-width:0.3091144px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
style="fill:#f06767;fill-opacity:1;stroke:none;stroke-width:0.309114px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
d="m 100.67541,105.29647 c 0,0 -3.06474,-2.8951 -5.801108,2.22698 -2.736373,5.12205 -4.049827,9.68737 -1.313459,15.25486 2.736367,5.56745 8.428007,8.90792 17.184447,8.79659 8.75636,-0.11148 15.21419,-2.22699 19.0451,-8.5739 3.83094,-6.34692 6.7862,-11.02357 7.11457,-13.36191 0.32839,-2.33835 2.07965,0.33404 1.53239,2.33834 -0.54728,2.00426 -0.43783,5.9015 1.09454,5.12204 1.53237,-0.77942 2.73637,-2.00427 2.95526,-1.44753 0.21893,0.55673 -1.75127,4.00859 -2.68162,5.73449 -0.93039,1.7259 -3.83094,5.90153 -5.5275,7.51607 -1.69652,1.61458 -4.04981,3.89724 -6.84092,5.56747 -2.79109,1.67024 -7.11454,3.61887 -9.52255,4.06427 -2.40801,0.44539 -7.22403,1.39184 -9.96042,1.2805 -2.73635,-0.11137 -6.23892,-0.61243 -10.124558,-2.56104 -3.885645,-1.94859 -8.099657,-4.95505 -9.741479,-7.96148 -1.641825,-3.00643 -4.159283,-5.73449 -3.61201,-13.30623 0.547277,-7.57175 3.010008,-11.46899 4.870741,-13.25056 1.860731,-1.7816 4.597103,-2.56105 6.403105,-2.17131 1.806004,0.38971 2.955282,1.44755 3.393102,2.22697 0.43781,0.77944 1.149279,2.22699 1.532369,2.50538 z"
|
d="m 100.67541,101.06311 c 0,0 -3.06474,-2.895088 -5.801108,2.22698 -2.736373,5.12205 -4.049827,9.68737 -1.313459,15.25486 2.736367,5.56745 8.428007,8.90792 17.184447,8.79659 8.75636,-0.11148 15.21419,-2.22699 19.0451,-8.5739 3.83094,-6.34692 6.7862,-11.02357 7.11457,-13.36191 0.32839,-2.33835 2.07965,0.33404 1.53239,2.33834 -0.54728,2.00426 -0.43783,5.9015 1.09454,5.12204 1.53237,-0.77942 2.73637,-2.00427 2.95526,-1.44753 0.21893,0.55673 -1.75127,4.00859 -2.68162,5.73449 -0.93039,1.7259 -3.83094,5.90153 -5.5275,7.51607 -1.69652,1.61458 -4.04981,3.89724 -6.84092,5.56747 -2.79109,1.67024 -7.11454,3.61887 -9.52255,4.06427 -2.40801,0.44539 -7.22403,1.39184 -9.96042,1.2805 -2.73635,-0.11137 -6.23892,-0.61243 -10.124558,-2.56104 -3.885645,-1.94859 -8.099657,-4.95505 -9.741479,-7.96148 -1.641825,-3.00643 -4.159283,-5.73449 -3.61201,-13.30623 0.547277,-7.57175 3.010008,-11.46899 4.870741,-13.250551 1.860731,-1.781588 4.597103,-2.561035 6.403105,-2.171298 1.806004,0.38971 2.955282,1.447544 3.393102,2.226958 0.43781,0.779437 1.149279,2.226981 1.532369,2.505371 z"
|
||||||
id="path1012"
|
id="path1012"
|
||||||
inkscape:connector-curvature="0" />
|
inkscape:connector-curvature="0" />
|
||||||
<path
|
<path
|
||||||
style="fill:#3f62eb;fill-opacity:1;stroke:none;stroke-width:0.3091144px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
style="fill:#3f62eb;fill-opacity:1;stroke:none;stroke-width:0.309114px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
d="m 128.47695,145.38219 c 0,0 13.13457,-7.6831 19.26404,-19.82016 6.12948,-12.13707 8.7564,-19.93152 7.99021,-31.84592 -0.76619,-11.914358 -2.62692,-6.012854 -0.54728,-11.134928 2.07964,-5.122074 -1.31345,-15.254857 0.10943,-15.922949 1.42292,-0.668097 4.48765,4.453971 5.3633,8.573903 0.87562,4.119922 4.70654,16.813721 1.64181,32.959394 -3.06472,16.14564 -10.28872,22.60391 -15.10475,26.94655 -4.81603,4.34261 -15.7615,11.91437 -17.40332,11.80302 -1.64183,-0.11148 -1.86073,-0.11148 -1.31348,-1.55891 z"
|
d="m 132.18114,140.09049 c 0,0 13.13457,-7.6831 19.26404,-19.82016 6.12948,-12.13707 8.7564,-19.93152 7.99021,-31.84589 -0.76619,-11.914358 -2.62692,-6.012854 -0.54728,-11.134928 2.07964,-5.122074 -1.31345,-15.254857 0.10943,-15.922949 1.42292,-0.668097 4.48765,4.453971 5.3633,8.573903 0.87562,4.119922 4.70654,16.813721 1.64181,32.959364 -3.06472,16.14564 -10.28872,22.60391 -15.10475,26.94655 -4.81603,4.34261 -15.7615,11.91437 -17.40332,11.80302 -1.64183,-0.11148 -1.86073,-0.11148 -1.31348,-1.55891 z"
|
||||||
id="path1014"
|
id="path1014"
|
||||||
inkscape:connector-curvature="0" />
|
inkscape:connector-curvature="0" />
|
||||||
<path
|
<path
|
||||||
style="fill:#fce102;fill-opacity:1;stroke:none;stroke-width:0.3091144px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
style="fill:#fce102;fill-opacity:1;stroke:none;stroke-width:0.309114px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
d="m 104.83471,121.99883 c 0,0 7.00512,1.5589 12.36838,-1.78156 5.3633,-3.3405 9.5226,-8.79661 10.17931,-10.91225 0.65672,-2.11564 0.76619,1.89294 1.53236,-0.11125 0.76618,-2.00432 3.83093,-6.01288 2.29855,-15.366239 -1.53237,-9.35333 -1.64182,-9.798747 -4.48762,-14.809463 -2.84586,-5.010719 -9.63207,-11.91437 -13.79134,-14.141359 -4.15927,-2.226986 -9.96037,-5.567464 -17.950594,-5.344766 -7.990202,0.222699 -5.363286,-0.334048 -13.025124,1.002146 -7.661836,1.336187 -14.557491,5.010717 -16.856041,7.015006 -2.298552,2.004286 -8.428023,7.460405 -10.61712,10.46684 -2.189098,3.00643 -8.209113,9.798741 -11.383303,19.263442 -3.174189,9.464683 -4.487646,10.466823 -4.706555,16.702393 -0.21891,6.23557 0.547274,7.90578 -0.766185,8.46256 -1.31346,0.55673 -1.094547,-4.67668 -0.985094,-8.35123 0.109463,-3.6745 0.109463,-13.25056 4.925468,-23.940084 4.816015,-10.689538 13.353489,-19.597489 18.169503,-22.826622 4.816009,-3.229128 10.398208,-7.571752 19.045135,-9.687392 8.646933,-2.115635 17.293863,-1.781586 22.65716,-0.779443 5.3633,1.002145 13.68187,4.453974 18.1695,7.905802 4.48766,3.45183 9.41314,7.683099 13.13459,14.586765 3.72146,6.903648 4.70654,15.700251 4.59709,19.374771 -0.10943,3.674543 -1.97019,12.137103 -4.81601,16.257013 -2.84583,4.11993 -6.67674,9.0193 -10.61711,10.80089 -3.94039,1.78157 -8.75642,2.33833 -12.69675,0.55674 -3.94039,-1.78161 -3.72147,-2.44969 -4.3782,-4.34263 z"
|
d="m 104.83471,117.2363 c 0,0 7.00512,1.5589 12.36838,-1.78156 5.3633,-3.3405 9.5226,-8.79661 10.17931,-10.91225 0.65672,-2.11564 0.76619,1.89294 1.53236,-0.11125 0.76618,-2.00432 3.83093,-6.012871 2.29855,-15.366212 -1.53237,-9.35333 -1.64182,-9.798747 -4.48762,-14.809463 -2.84586,-5.010719 -9.63207,-11.91437 -13.79134,-14.141359 -4.15927,-2.226986 -9.96037,-5.567464 -17.950594,-5.344766 -7.990202,0.222699 -5.363286,-0.334048 -13.025124,1.002146 -7.661836,1.336187 -14.557491,5.010717 -16.856041,7.015006 -2.298552,2.004286 -8.428023,7.460405 -10.61712,10.46684 -2.189098,3.00643 -8.209113,9.798741 -11.383303,19.263442 -3.174189,9.464656 -4.487646,10.466796 -4.706555,16.702366 -0.21891,6.23557 0.547274,7.90578 -0.766185,8.46256 -1.31346,0.55673 -1.094547,-4.67668 -0.985094,-8.35123 0.109463,-3.6745 0.109463,-13.250536 4.925468,-23.940057 4.816015,-10.689538 13.353489,-19.597489 18.169503,-22.826622 4.816009,-3.229128 10.398208,-7.571752 19.045135,-9.687392 8.646933,-2.115635 17.293863,-1.781586 22.65716,-0.779443 5.3633,1.002145 13.68187,4.453974 18.1695,7.905802 4.48766,3.45183 9.41314,7.683099 13.13459,14.586765 3.72146,6.903648 4.70654,15.700251 4.59709,19.374771 -0.10943,3.674531 -1.97019,12.137076 -4.81601,16.256986 -2.84583,4.11993 -6.67674,9.0193 -10.61711,10.80089 -3.94039,1.78157 -8.75642,2.33833 -12.69675,0.55674 -3.94039,-1.78161 -3.72147,-2.44969 -4.3782,-4.34263 z"
|
||||||
id="path1016"
|
id="path1016"
|
||||||
inkscape:connector-curvature="0" />
|
inkscape:connector-curvature="0" />
|
||||||
<path
|
<path
|
||||||
style="fill:#5ed938;fill-opacity:1;stroke:none;stroke-width:0.3091144px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
style="fill:#5ed938;fill-opacity:1;stroke:none;stroke-width:0.309114px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
d="m 104.83471,121.99883 c 0,0 5.54674,1.56707 10.22918,-0.55878 4.68248,-2.12587 6.4239,-4.17301 7.54615,-5.3934 1.12223,-1.22042 3.25064,-3.50376 3.83112,-4.56669 0.58046,-1.06292 1.19962,-1.69282 1.19962,-2.08649 0,-0.39369 -1.08353,-1.33853 -0.0386,-3.62186 1.04482,-2.28333 1.97361,-7.519273 1.50922,-9.881333 -0.46438,-2.362073 -1.54792,-15.471616 -10.83547,-24.211303 -9.28753,-8.739678 -18.497709,-9.763242 -18.497709,-9.763242 0,0 14.705309,4.645415 21.593569,18.739134 6.88828,14.093741 4.64376,23.148344 0.23218,28.659854 -4.41158,5.51151 -10.68068,6.14141 -12.38342,4.72415 -1.70268,-1.41725 -5.2113,6.47164 -4.38574,7.95996 z"
|
d="m 104.83471,117.2363 c 0,0 5.54674,1.56707 10.22918,-0.55878 4.68248,-2.12587 6.4239,-4.17301 7.54615,-5.3934 1.12223,-1.22042 3.25064,-3.50376 3.83112,-4.56669 0.58046,-1.06292 1.19962,-1.69282 1.19962,-2.08649 0,-0.39369 -1.08353,-1.33853 -0.0386,-3.62186 1.04482,-2.283321 1.97361,-7.519246 1.50922,-9.881306 -0.46438,-2.362073 -1.54792,-15.471616 -10.83547,-24.211303 -9.28753,-8.739678 -18.497709,-9.763242 -18.497709,-9.763242 0,0 14.705309,4.645415 21.593569,18.739134 6.88828,14.093741 4.64376,23.148323 0.23218,28.659827 -4.41158,5.51151 -10.68068,6.14141 -12.38342,4.72415 -1.70268,-1.41725 -5.2113,6.47164 -4.38574,7.95996 z"
|
||||||
id="path1018"
|
id="path1018"
|
||||||
inkscape:connector-curvature="0" />
|
inkscape:connector-curvature="0" />
|
||||||
<path
|
<path
|
||||||
style="fill:#8fdbe9;fill-opacity:1;stroke:none;stroke-width:0.3091144px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
style="fill:#8fdbe9;fill-opacity:1;stroke:none;stroke-width:0.309114px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
d="m 86.930353,71.44277 c 0,0 -9.906718,-0.07875 -17.414156,4.881616 -7.507436,4.960371 -11.14506,8.975903 -13.23476,12.125332 -2.089697,3.149446 -4.488981,7.479909 -4.179395,7.401179 0.309585,-0.0788 9.055364,-12.2828 15.866229,-15.432236 6.81087,-3.149436 13.621741,-7.558644 22.986687,-4.330482 9.364952,3.228184 13.776542,7.716118 15.788842,6.613829 2.0123,-1.1023 2.3993,-2.440824 1.23835,-3.936804 -1.16094,-1.495979 -9.364961,-8.818417 -21.051797,-7.322434 z"
|
d="m 86.930353,66.680267 c 0,0 -9.906718,-0.07875 -17.414156,4.881616 -7.507436,4.960371 -11.14506,8.975903 -13.23476,12.125332 -2.089697,3.149446 -4.488981,7.479909 -4.179395,7.401179 0.309585,-0.0788 9.055364,-12.2828 15.866229,-15.432236 6.81087,-3.149436 13.621741,-7.558644 22.986687,-4.330482 9.364952,3.228184 13.776542,7.716118 15.788842,6.613829 2.0123,-1.1023 2.3993,-2.440824 1.23835,-3.936804 -1.16094,-1.495979 -9.364961,-8.818417 -21.051797,-7.322434 z"
|
||||||
id="path1020"
|
id="path1020"
|
||||||
inkscape:connector-curvature="0" />
|
inkscape:connector-curvature="0" />
|
||||||
<path
|
<path
|
||||||
style="fill:#fd7aff;fill-opacity:1;stroke:none;stroke-width:0.3091144px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
style="fill:#fd7aff;fill-opacity:1;stroke:none;stroke-width:0.309114px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
d="m 72.107699,134.35862 c 0.65673,0.33404 5.58219,8.90795 9.522571,10.35548 3.940372,1.44755 6.567286,1.55888 7.005104,2.227 0.437821,0.66809 0.328367,4.00858 3.830921,5.45614 3.502555,1.44753 19.920785,6.01284 24.627325,6.45824 4.70658,0.4454 0.76621,3.22911 3.61202,4.23125 2.84584,1.00217 14.99532,1.5589 17.95061,0.33405 2.95527,-1.22483 2.95527,1.1135 -2.1891,3.1178 -5.14437,2.00427 -18.71677,6.79231 -27.58261,5.67882 -8.86586,-1.1135 -19.373526,-3.00644 -25.284086,-7.23772 -5.910565,-4.23126 -8.42802,-6.1242 -6.238924,-6.45824 2.189096,-0.33407 7.990199,5.9015 10.507662,6.56959 2.517463,0.66809 4.597103,0.66809 3.064735,-0.8908 -1.532366,-1.55888 -11.492755,-8.46253 -12.477849,-8.1285 -0.985092,0.33405 -3.064737,0.55674 -4.816012,-1.78159 -1.751278,-2.33832 -10.945484,-15.25485 -10.39821,-22.1585 0.547273,-6.90365 2.298552,-5.12208 4.378195,-2.56103 2.079641,2.56103 4.487648,4.78801 4.487648,4.78801 z"
|
d="m 72.107699,130.12526 c 0.65673,0.33404 5.58219,8.90795 9.522571,10.35548 3.940372,1.44755 6.567286,1.55888 7.005104,2.227 0.437821,0.66809 0.328367,4.00858 3.830921,5.45614 3.502555,1.44753 19.920785,6.01284 24.627325,6.45824 4.70658,0.4454 0.76621,3.22911 3.61202,4.23125 2.84584,1.00217 14.99532,1.5589 17.95061,0.33405 2.95527,-1.22483 2.95527,1.1135 -2.1891,3.1178 -5.14437,2.00427 -18.71677,6.79231 -27.58261,5.67882 -8.86586,-1.1135 -19.373526,-3.00644 -25.284086,-7.23772 -5.910565,-4.23126 -8.42802,-6.1242 -6.238924,-6.45824 2.189096,-0.33407 7.990199,5.9015 10.507662,6.56959 2.517463,0.66809 4.597103,0.66809 3.064735,-0.8908 -1.532366,-1.55888 -11.492755,-8.46253 -12.477849,-8.1285 -0.985092,0.33405 -3.064737,0.55674 -4.816012,-1.78159 -1.751278,-2.33832 -10.945484,-15.25485 -10.39821,-22.1585 0.547273,-6.90365 2.298552,-5.12208 4.378195,-2.56103 2.079641,2.56103 4.487648,4.78801 4.487648,4.78801 z"
|
||||||
id="path1022"
|
id="path1022"
|
||||||
inkscape:connector-curvature="0" />
|
inkscape:connector-curvature="0" />
|
||||||
<path
|
|
||||||
style="fill:none;stroke:#939393;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
|
||||||
d="m 56.889259,34.981831 c 0,0 16.252976,26.08036 43.845241,26.83631 27.59226,0.75596 42.33333,-23.8125 42.33333,-23.8125"
|
|
||||||
id="path2138"
|
|
||||||
inkscape:connector-curvature="0" />
|
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
268
src/assets/icon/logo_old.svg
Normal file
@@ -0,0 +1,268 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="200mm"
|
||||||
|
height="200mm"
|
||||||
|
viewBox="0 0 200 200"
|
||||||
|
version="1.1"
|
||||||
|
id="svg8"
|
||||||
|
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
|
||||||
|
sodipodi:docname="deepin-community-store.svg">
|
||||||
|
<defs
|
||||||
|
id="defs2">
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
id="linearGradient1200">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#000000;stop-opacity:0.1299435"
|
||||||
|
offset="0"
|
||||||
|
id="stop1196" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#dadada;stop-opacity:0.81960785"
|
||||||
|
offset="1"
|
||||||
|
id="stop1198" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient1138"
|
||||||
|
inkscape:collect="always">
|
||||||
|
<stop
|
||||||
|
id="stop1134"
|
||||||
|
offset="0"
|
||||||
|
style="stop-color:#99e7ea;stop-opacity:1" />
|
||||||
|
<stop
|
||||||
|
id="stop1136"
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:#007ffc;stop-opacity:1" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
id="linearGradient1128">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#99e7ea;stop-opacity:1"
|
||||||
|
offset="0"
|
||||||
|
id="stop1124" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#007ffc;stop-opacity:1"
|
||||||
|
offset="1"
|
||||||
|
id="stop1126" />
|
||||||
|
</linearGradient>
|
||||||
|
<inkscape:path-effect
|
||||||
|
effect="bspline"
|
||||||
|
id="path-effect960"
|
||||||
|
is_visible="true"
|
||||||
|
weight="33.333333"
|
||||||
|
steps="2"
|
||||||
|
helper_size="0"
|
||||||
|
apply_no_weight="true"
|
||||||
|
apply_with_weight="true"
|
||||||
|
only_selected="false" />
|
||||||
|
<radialGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient1128"
|
||||||
|
id="radialGradient1130"
|
||||||
|
cx="100.35268"
|
||||||
|
cy="199.86011"
|
||||||
|
fx="100.35268"
|
||||||
|
fy="199.86011"
|
||||||
|
r="90.135414"
|
||||||
|
gradientTransform="matrix(1,0,0,0.98112945,0,3.7714702)"
|
||||||
|
gradientUnits="userSpaceOnUse" />
|
||||||
|
<radialGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient1138"
|
||||||
|
id="radialGradient1132"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(1,0,0,0.98112945,0,3.7714702)"
|
||||||
|
cx="100.35268"
|
||||||
|
cy="199.86011"
|
||||||
|
fx="100.35268"
|
||||||
|
fy="199.86011"
|
||||||
|
r="90.135414" />
|
||||||
|
<radialGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linearGradient1200"
|
||||||
|
id="radialGradient1202"
|
||||||
|
cx="100.35268"
|
||||||
|
cy="199.86011"
|
||||||
|
fx="100.35268"
|
||||||
|
fy="199.86011"
|
||||||
|
r="90.135414"
|
||||||
|
gradientTransform="matrix(1,0,0,0.98112945,0,3.7714702)"
|
||||||
|
gradientUnits="userSpaceOnUse" />
|
||||||
|
<filter
|
||||||
|
style="color-interpolation-filters:sRGB;"
|
||||||
|
inkscape:label="Drop Shadow"
|
||||||
|
id="filter1448">
|
||||||
|
<feFlood
|
||||||
|
flood-opacity="0.372549"
|
||||||
|
flood-color="rgb(145,145,145)"
|
||||||
|
result="flood"
|
||||||
|
id="feFlood1438" />
|
||||||
|
<feComposite
|
||||||
|
in="flood"
|
||||||
|
in2="SourceGraphic"
|
||||||
|
operator="in"
|
||||||
|
result="composite1"
|
||||||
|
id="feComposite1440" />
|
||||||
|
<feGaussianBlur
|
||||||
|
in="composite1"
|
||||||
|
stdDeviation="5.2918"
|
||||||
|
result="blur"
|
||||||
|
id="feGaussianBlur1442" />
|
||||||
|
<feOffset
|
||||||
|
dx="0"
|
||||||
|
dy="0"
|
||||||
|
result="offset"
|
||||||
|
id="feOffset1444" />
|
||||||
|
<feComposite
|
||||||
|
in="SourceGraphic"
|
||||||
|
in2="offset"
|
||||||
|
operator="over"
|
||||||
|
result="composite2"
|
||||||
|
id="feComposite1446" />
|
||||||
|
</filter>
|
||||||
|
<filter
|
||||||
|
style="color-interpolation-filters:sRGB;"
|
||||||
|
inkscape:label="Drop Shadow"
|
||||||
|
id="filter2201">
|
||||||
|
<feFlood
|
||||||
|
flood-opacity="0.372549"
|
||||||
|
flood-color="rgb(145,145,145)"
|
||||||
|
result="flood"
|
||||||
|
id="feFlood2191" />
|
||||||
|
<feComposite
|
||||||
|
in="flood"
|
||||||
|
in2="SourceGraphic"
|
||||||
|
operator="in"
|
||||||
|
result="composite1"
|
||||||
|
id="feComposite2193" />
|
||||||
|
<feGaussianBlur
|
||||||
|
in="composite1"
|
||||||
|
stdDeviation="3.76995"
|
||||||
|
result="blur"
|
||||||
|
id="feGaussianBlur2195" />
|
||||||
|
<feOffset
|
||||||
|
dx="0"
|
||||||
|
dy="0"
|
||||||
|
result="offset"
|
||||||
|
id="feOffset2197" />
|
||||||
|
<feComposite
|
||||||
|
in="SourceGraphic"
|
||||||
|
in2="offset"
|
||||||
|
operator="over"
|
||||||
|
result="composite2"
|
||||||
|
id="feComposite2199" />
|
||||||
|
</filter>
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="0.35"
|
||||||
|
inkscape:cx="120.33119"
|
||||||
|
inkscape:cy="507.94585"
|
||||||
|
inkscape:document-units="mm"
|
||||||
|
inkscape:current-layer="layer1"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-height="1040"
|
||||||
|
inkscape:window-x="0"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:window-maximized="1" />
|
||||||
|
<metadata
|
||||||
|
id="metadata5">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
<dc:title />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(0,-97)">
|
||||||
|
<rect
|
||||||
|
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:#ebebeb;stroke-width:2.87003541;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter2201)"
|
||||||
|
id="rect2119"
|
||||||
|
width="162.54665"
|
||||||
|
height="170.16383"
|
||||||
|
x="20.431099"
|
||||||
|
y="112.51035"
|
||||||
|
rx="30"
|
||||||
|
ry="30" />
|
||||||
|
<circle
|
||||||
|
style="opacity:1;fill:#959595;fill-opacity:1;stroke:#e9e9e9;stroke-width:3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
id="path2121"
|
||||||
|
cx="58.208336"
|
||||||
|
cy="131.8244"
|
||||||
|
r="6.0476193" />
|
||||||
|
<circle
|
||||||
|
style="opacity:1;fill:#9c9c9c;fill-opacity:1;stroke:#eaeaea;stroke-width:3;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
|
id="path2121-5"
|
||||||
|
cx="143.63095"
|
||||||
|
cy="133.71429"
|
||||||
|
r="6.0476193" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer2"
|
||||||
|
inkscape:label="Layer 2">
|
||||||
|
<path
|
||||||
|
style="fill:#ffc344;fill-opacity:1;stroke:none;stroke-width:0.3091144px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 94.205599,42.389243 c 0,0 11.145081,-0.157476 22.599701,6.928753 11.45465,7.086223 18.11074,13.857508 20.27783,18.266716 2.16708,4.409209 9.28755,12.125332 9.13277,26.297795 -0.15488,14.172433 -3.40543,23.620763 -8.97797,31.494323 -5.57254,7.87359 -15.63405,13.85751 -27.70786,14.17247 -12.073829,0.31494 -19.813453,-7.55863 -22.444927,-11.96786 -2.631469,-4.4092 -3.715019,-13.85751 -0.464377,-20.62877 3.250645,-6.77132 8.358796,-6.77132 10.061513,-6.14141 1.702724,0.6299 2.167092,1.5747 3.095852,3.30689 0.928749,1.73219 1.547929,1.41726 2.941089,0.47243 1.39311,-0.94484 1.85748,-2.04715 1.54792,-3.46439 -0.30958,-1.417253 -2.16711,-3.149433 -3.71505,-3.621853 -1.547909,-0.47241 -3.715016,-1.88966 -6.810869,-1.41721 -3.095848,0.47238 -9.132757,2.04711 -14.240906,8.975843 -5.108153,6.92875 -4.488988,17.63684 -1.393134,22.67593 3.095849,5.0391 8.977962,14.48739 21.980539,17.79431 13.00259,3.30693 34.05435,-6.45633 41.32959,-21.57361 7.27524,-15.1173 7.43004,-22.20352 7.12048,-34.643764 C 148.22821,76.875544 137.23793,58.293884 125.00933,51.522601 112.78073,44.751315 103.64797,40.814522 94.205599,42.389243 Z"
|
||||||
|
id="path1002"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
style="fill:#f06767;fill-opacity:1;stroke:none;stroke-width:0.3091144px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 100.67541,105.29647 c 0,0 -3.06474,-2.8951 -5.801108,2.22698 -2.736373,5.12205 -4.049827,9.68737 -1.313459,15.25486 2.736367,5.56745 8.428007,8.90792 17.184447,8.79659 8.75636,-0.11148 15.21419,-2.22699 19.0451,-8.5739 3.83094,-6.34692 6.7862,-11.02357 7.11457,-13.36191 0.32839,-2.33835 2.07965,0.33404 1.53239,2.33834 -0.54728,2.00426 -0.43783,5.9015 1.09454,5.12204 1.53237,-0.77942 2.73637,-2.00427 2.95526,-1.44753 0.21893,0.55673 -1.75127,4.00859 -2.68162,5.73449 -0.93039,1.7259 -3.83094,5.90153 -5.5275,7.51607 -1.69652,1.61458 -4.04981,3.89724 -6.84092,5.56747 -2.79109,1.67024 -7.11454,3.61887 -9.52255,4.06427 -2.40801,0.44539 -7.22403,1.39184 -9.96042,1.2805 -2.73635,-0.11137 -6.23892,-0.61243 -10.124558,-2.56104 -3.885645,-1.94859 -8.099657,-4.95505 -9.741479,-7.96148 -1.641825,-3.00643 -4.159283,-5.73449 -3.61201,-13.30623 0.547277,-7.57175 3.010008,-11.46899 4.870741,-13.25056 1.860731,-1.7816 4.597103,-2.56105 6.403105,-2.17131 1.806004,0.38971 2.955282,1.44755 3.393102,2.22697 0.43781,0.77944 1.149279,2.22699 1.532369,2.50538 z"
|
||||||
|
id="path1012"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
style="fill:#3f62eb;fill-opacity:1;stroke:none;stroke-width:0.3091144px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 128.47695,145.38219 c 0,0 13.13457,-7.6831 19.26404,-19.82016 6.12948,-12.13707 8.7564,-19.93152 7.99021,-31.84592 -0.76619,-11.914358 -2.62692,-6.012854 -0.54728,-11.134928 2.07964,-5.122074 -1.31345,-15.254857 0.10943,-15.922949 1.42292,-0.668097 4.48765,4.453971 5.3633,8.573903 0.87562,4.119922 4.70654,16.813721 1.64181,32.959394 -3.06472,16.14564 -10.28872,22.60391 -15.10475,26.94655 -4.81603,4.34261 -15.7615,11.91437 -17.40332,11.80302 -1.64183,-0.11148 -1.86073,-0.11148 -1.31348,-1.55891 z"
|
||||||
|
id="path1014"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
style="fill:#fce102;fill-opacity:1;stroke:none;stroke-width:0.3091144px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 104.83471,121.99883 c 0,0 7.00512,1.5589 12.36838,-1.78156 5.3633,-3.3405 9.5226,-8.79661 10.17931,-10.91225 0.65672,-2.11564 0.76619,1.89294 1.53236,-0.11125 0.76618,-2.00432 3.83093,-6.01288 2.29855,-15.366239 -1.53237,-9.35333 -1.64182,-9.798747 -4.48762,-14.809463 -2.84586,-5.010719 -9.63207,-11.91437 -13.79134,-14.141359 -4.15927,-2.226986 -9.96037,-5.567464 -17.950594,-5.344766 -7.990202,0.222699 -5.363286,-0.334048 -13.025124,1.002146 -7.661836,1.336187 -14.557491,5.010717 -16.856041,7.015006 -2.298552,2.004286 -8.428023,7.460405 -10.61712,10.46684 -2.189098,3.00643 -8.209113,9.798741 -11.383303,19.263442 -3.174189,9.464683 -4.487646,10.466823 -4.706555,16.702393 -0.21891,6.23557 0.547274,7.90578 -0.766185,8.46256 -1.31346,0.55673 -1.094547,-4.67668 -0.985094,-8.35123 0.109463,-3.6745 0.109463,-13.25056 4.925468,-23.940084 4.816015,-10.689538 13.353489,-19.597489 18.169503,-22.826622 4.816009,-3.229128 10.398208,-7.571752 19.045135,-9.687392 8.646933,-2.115635 17.293863,-1.781586 22.65716,-0.779443 5.3633,1.002145 13.68187,4.453974 18.1695,7.905802 4.48766,3.45183 9.41314,7.683099 13.13459,14.586765 3.72146,6.903648 4.70654,15.700251 4.59709,19.374771 -0.10943,3.674543 -1.97019,12.137103 -4.81601,16.257013 -2.84583,4.11993 -6.67674,9.0193 -10.61711,10.80089 -3.94039,1.78157 -8.75642,2.33833 -12.69675,0.55674 -3.94039,-1.78161 -3.72147,-2.44969 -4.3782,-4.34263 z"
|
||||||
|
id="path1016"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
style="fill:#5ed938;fill-opacity:1;stroke:none;stroke-width:0.3091144px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 104.83471,121.99883 c 0,0 5.54674,1.56707 10.22918,-0.55878 4.68248,-2.12587 6.4239,-4.17301 7.54615,-5.3934 1.12223,-1.22042 3.25064,-3.50376 3.83112,-4.56669 0.58046,-1.06292 1.19962,-1.69282 1.19962,-2.08649 0,-0.39369 -1.08353,-1.33853 -0.0386,-3.62186 1.04482,-2.28333 1.97361,-7.519273 1.50922,-9.881333 -0.46438,-2.362073 -1.54792,-15.471616 -10.83547,-24.211303 -9.28753,-8.739678 -18.497709,-9.763242 -18.497709,-9.763242 0,0 14.705309,4.645415 21.593569,18.739134 6.88828,14.093741 4.64376,23.148344 0.23218,28.659854 -4.41158,5.51151 -10.68068,6.14141 -12.38342,4.72415 -1.70268,-1.41725 -5.2113,6.47164 -4.38574,7.95996 z"
|
||||||
|
id="path1018"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
style="fill:#8fdbe9;fill-opacity:1;stroke:none;stroke-width:0.3091144px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 86.930353,71.44277 c 0,0 -9.906718,-0.07875 -17.414156,4.881616 -7.507436,4.960371 -11.14506,8.975903 -13.23476,12.125332 -2.089697,3.149446 -4.488981,7.479909 -4.179395,7.401179 0.309585,-0.0788 9.055364,-12.2828 15.866229,-15.432236 6.81087,-3.149436 13.621741,-7.558644 22.986687,-4.330482 9.364952,3.228184 13.776542,7.716118 15.788842,6.613829 2.0123,-1.1023 2.3993,-2.440824 1.23835,-3.936804 -1.16094,-1.495979 -9.364961,-8.818417 -21.051797,-7.322434 z"
|
||||||
|
id="path1020"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
style="fill:#fd7aff;fill-opacity:1;stroke:none;stroke-width:0.3091144px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 72.107699,134.35862 c 0.65673,0.33404 5.58219,8.90795 9.522571,10.35548 3.940372,1.44755 6.567286,1.55888 7.005104,2.227 0.437821,0.66809 0.328367,4.00858 3.830921,5.45614 3.502555,1.44753 19.920785,6.01284 24.627325,6.45824 4.70658,0.4454 0.76621,3.22911 3.61202,4.23125 2.84584,1.00217 14.99532,1.5589 17.95061,0.33405 2.95527,-1.22483 2.95527,1.1135 -2.1891,3.1178 -5.14437,2.00427 -18.71677,6.79231 -27.58261,5.67882 -8.86586,-1.1135 -19.373526,-3.00644 -25.284086,-7.23772 -5.910565,-4.23126 -8.42802,-6.1242 -6.238924,-6.45824 2.189096,-0.33407 7.990199,5.9015 10.507662,6.56959 2.517463,0.66809 4.597103,0.66809 3.064735,-0.8908 -1.532366,-1.55888 -11.492755,-8.46253 -12.477849,-8.1285 -0.985092,0.33405 -3.064737,0.55674 -4.816012,-1.78159 -1.751278,-2.33832 -10.945484,-15.25485 -10.39821,-22.1585 0.547273,-6.90365 2.298552,-5.12208 4.378195,-2.56103 2.079641,2.56103 4.487648,4.78801 4.487648,4.78801 z"
|
||||||
|
id="path1022"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
style="fill:none;stroke:#939393;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||||
|
d="m 56.889259,34.981831 c 0,0 16.252976,26.08036 43.845241,26.83631 27.59226,0.75596 42.33333,-23.8125 42.33333,-23.8125"
|
||||||
|
id="path2138"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 14 KiB |
25
src/assets/json/features.json
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"title": "Features",
|
||||||
|
"title[zh_CN]": "版本特性",
|
||||||
|
"items": [
|
||||||
|
{
|
||||||
|
"icon": "/usr/share/icons/hicolor/scalable/apps/spark-store.svg",
|
||||||
|
"name": "Feature 1",
|
||||||
|
"name[zh_CN]": "特性 1",
|
||||||
|
"description": "Please click the learn more button to check",
|
||||||
|
"description[zh_CN]": "请点击 了解更多 按钮来获取特性"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": ":/icon/logo.svg",
|
||||||
|
"name": "Feature 2",
|
||||||
|
"description": "Feature 2 detailed description..."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "spark-store",
|
||||||
|
"name": "Fix 1",
|
||||||
|
"description": "Fix 1 detailed description..."
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"linkUrl": "https://gitee.com/deepin-community-store/spark-store/releases/",
|
||||||
|
"linkButtonVisible": true
|
||||||
|
}
|
||||||
BIN
src/assets/translations/qtwebengine_zh.qm
Normal file
305
src/assets/translations/qtwebengine_zh.ts
Normal file
@@ -0,0 +1,305 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!DOCTYPE TS>
|
||||||
|
<TS version="2.1" language="zh_CN" sourcelanguage="es">
|
||||||
|
<context>
|
||||||
|
<name>QWebEnginePage</name>
|
||||||
|
<message>
|
||||||
|
<source>Cut</source>
|
||||||
|
<translation>剪切</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Back</source>
|
||||||
|
<translation>后退</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Copy</source>
|
||||||
|
<translation>复制</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Redo</source>
|
||||||
|
<translation>恢复</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Stop</source>
|
||||||
|
<translation>停止</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Undo</source>
|
||||||
|
<translation>撤销</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Back</source>
|
||||||
|
<translation>&后退</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Paste</source>
|
||||||
|
<translation>粘贴</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Copy Image URL</source>
|
||||||
|
<translation>复制图片地址</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Open Link in This Window</source>
|
||||||
|
<translation>在当前窗口中打开链接</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Toggle Mute</source>
|
||||||
|
<translation>切换静音</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Inspect Element</source>
|
||||||
|
<translation>检查元素</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Toggle Media Controls</source>
|
||||||
|
<translation>切换媒体控制</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Reload</source>
|
||||||
|
<translation>重新加载</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Copy Link URL</source>
|
||||||
|
<translation>复制链接地址</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Exit Full Screen Mode</source>
|
||||||
|
<translation>退出全屏模式</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Paste and Match Style</source>
|
||||||
|
<translation>Pegar y coincidir estilo</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Follow Link</source>
|
||||||
|
<translation>Seguir vínculo</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Open Link in New Tab</source>
|
||||||
|
<translation>在新标签页中打开链接</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Reload and Bypass Cache</source>
|
||||||
|
<translation>重新加载且绕过缓存</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Select folder to upload</source>
|
||||||
|
<translation>Seleccionar una carpeta para subir</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Save Image</source>
|
||||||
|
<translation>保存图片</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Save Media</source>
|
||||||
|
<translation>保存媒体</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Toggle Looping</source>
|
||||||
|
<translation>切换循环播放</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Close Page</source>
|
||||||
|
<translation>关闭页面</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Toggle Play/Pause</source>
|
||||||
|
<translation>切换播放/暂停</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Copy Image</source>
|
||||||
|
<translation>复制图片</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Reload</source>
|
||||||
|
<translation>&重新加载</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Select All</source>
|
||||||
|
<translation>全选</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Save Link</source>
|
||||||
|
<translation>Guardar enlace</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Copy Media URL</source>
|
||||||
|
<translation>复制媒体地址</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Forward</source>
|
||||||
|
<translation>前进</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>&Forward</source>
|
||||||
|
<translation>&前进</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Open Link in New Window</source>
|
||||||
|
<translation>在新窗口中打开链接</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Are you sure you want to leave this page?</source>
|
||||||
|
<translation>您确定要离开当前页面吗?</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>QQuickWebEngineView</name>
|
||||||
|
<message>
|
||||||
|
<source>Back</source>
|
||||||
|
<translation>后退</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Copy</source>
|
||||||
|
<translation>复制</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Copy Image URL</source>
|
||||||
|
<translation>复制图片地址</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Toggle Mute</source>
|
||||||
|
<translation>切换静音</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Inspect Element</source>
|
||||||
|
<translation>检查元素</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Toggle Media Controls</source>
|
||||||
|
<translation>切换媒体控制</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Reload</source>
|
||||||
|
<translation>重新加载</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Copy Link URL</source>
|
||||||
|
<translation>复制链接地址</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Exit Full Screen Mode</source>
|
||||||
|
<translation>退出全屏模式</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Follow Link</source>
|
||||||
|
<translation>跳转链接</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Save Image</source>
|
||||||
|
<translation>保存图片</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Save Media</source>
|
||||||
|
<translation>保存媒体</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Toggle Looping</source>
|
||||||
|
<translation>切换循环播放</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Toggle Play/Pause</source>
|
||||||
|
<translation>切换播放/暂停</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Copy Image</source>
|
||||||
|
<translation>复制图片</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Save Link</source>
|
||||||
|
<translation>保存链接</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Copy Media URL</source>
|
||||||
|
<translation>复制媒体地址</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Forward</source>
|
||||||
|
<translation>前进</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>QtWebEngineCore</name>
|
||||||
|
<message>
|
||||||
|
<source>Javascript Alert - %1</source>
|
||||||
|
<translation>Javascript 警告 - %1</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Javascript Confirm - %1</source>
|
||||||
|
<translation>Javascript 确认 - %1</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Javascript Prompt - %1</source>
|
||||||
|
<translation>Javascript 提示 - %1</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Are you sure you want to leave this page?</source>
|
||||||
|
<translation>您确定要离开当前页面吗?</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>QtWebEnginePlugin</name>
|
||||||
|
<message>
|
||||||
|
<source>Cannot create a separate instance of WebEngineDownloadItem</source>
|
||||||
|
<translation>无法创建一个 WebEngineDownloadItem 的独立实例</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Cannot create separate instance of WebEngineLoadRequest</source>
|
||||||
|
<translation>无法创建一个 WebEngineLoadRequest 的独立实例</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Cannot create a separate instance of WebEngineSettings</source>
|
||||||
|
<translation>无法创建一个 WebEngineSettings 的独立实例</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Cannot create separate instance of WebEngineNavigationRequest</source>
|
||||||
|
<translation>无法创建一个 WebEngineNavigationRequest 的独立实例</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Cannot create separate instance of WebEngineNewViewRequest</source>
|
||||||
|
<translation>无法创建一个 WebEngineNewViewRequest 的独立实例</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Cannot create separate instance of WebEngineCertificateError</source>
|
||||||
|
<translation>无法创建一个 WebEngineCertificateError 的独立实例</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Cannot create a separate instance of FullScreenRequest</source>
|
||||||
|
<translation>无法创建一个 FullScreenRequest 的独立实例</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Cannot create a separate instance of NavigationHistory</source>
|
||||||
|
<translation>无法创建一个 NavigationHistory 的独立实例</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>QtWebEngineExperimentalPlugin</name>
|
||||||
|
<message>
|
||||||
|
<source>Cannot create a separate instance of WebEngineViewExperimental</source>
|
||||||
|
<translation>无法创建一个 WebEngineViewExperimental 的独立实例</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Cannot create a separate instance of WebEngineViewport</source>
|
||||||
|
<translation>无法创建一个 WebEngineViewport 的独立实例</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>UIDelegatesManager</name>
|
||||||
|
<message>
|
||||||
|
<source>Enter username and password for "%1" at %2://%3</source>
|
||||||
|
<translation>为在 %2://%3 的“%1”输入用户名和密码</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Connect to proxy "%1" using:</source>
|
||||||
|
<translation>使用“%1”连接代理:</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>QtWebEngineTestSupportPlugin</name>
|
||||||
|
<message>
|
||||||
|
<source>Cannot create a separate instance of WebEngineErrorPage</source>
|
||||||
|
<translation>无法创建一个 WebEngineErrorPage 的独立实例</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
</TS>
|
||||||
85
src/backend/DataCollectorAndUploader.cpp
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
#include "DataCollectorAndUploader.h"
|
||||||
|
#include <QNetworkAccessManager>
|
||||||
|
#include <QNetworkRequest>
|
||||||
|
#include <QStandardPaths>
|
||||||
|
#include <QNetworkReply>
|
||||||
|
#include <QJsonDocument>
|
||||||
|
#include <QJsonObject>
|
||||||
|
#include <QSettings>
|
||||||
|
#include <QProcess>
|
||||||
|
#include <QDebug>
|
||||||
|
|
||||||
|
DataCollectorAndUploader::DataCollectorAndUploader(QObject *parent) : QObject(parent)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void DataCollectorAndUploader::collectAndUploadData()
|
||||||
|
{
|
||||||
|
collectData();
|
||||||
|
}
|
||||||
|
|
||||||
|
void DataCollectorAndUploader::collectData()
|
||||||
|
{
|
||||||
|
QString distributor_id;
|
||||||
|
QString release;
|
||||||
|
QString architecture;
|
||||||
|
|
||||||
|
QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
|
||||||
|
QString version = config.value("build/version").toString();
|
||||||
|
QString uuid = config.value("info/uuid").toString();
|
||||||
|
|
||||||
|
|
||||||
|
// Execute lsb_release --all and capture the output
|
||||||
|
QProcess lsbProcess;
|
||||||
|
lsbProcess.start("lsb_release", QStringList() << "--all");
|
||||||
|
lsbProcess.waitForFinished();
|
||||||
|
QString lsbOutput = lsbProcess.readAllStandardOutput();
|
||||||
|
|
||||||
|
QStringList lines = lsbOutput.split('\n');
|
||||||
|
for (const QString &line : lines) {
|
||||||
|
if (line.contains("Distributor ID:")) {
|
||||||
|
distributor_id = line.split(":").last().trimmed();
|
||||||
|
} else if (line.contains("Release:")) {
|
||||||
|
release = line.split(":").last().trimmed();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Execute uname -m to get the architecture
|
||||||
|
QProcess unameProcess;
|
||||||
|
unameProcess.start("uname", QStringList() << "-m");
|
||||||
|
unameProcess.waitForFinished();
|
||||||
|
architecture = unameProcess.readAllStandardOutput().trimmed();
|
||||||
|
|
||||||
|
// Create a JSON object
|
||||||
|
QJsonObject json;
|
||||||
|
json.insert("Distributor ID", distributor_id);
|
||||||
|
json.insert("Release", release);
|
||||||
|
json.insert("Architecture", architecture);
|
||||||
|
json.insert("Store_Version", version);
|
||||||
|
json.insert("UUID", uuid);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// Convert to byte array
|
||||||
|
QJsonDocument doc(json);
|
||||||
|
QByteArray jsonData = doc.toJson();
|
||||||
|
|
||||||
|
// Initialize a network request
|
||||||
|
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
|
||||||
|
QUrl url("https://status.deepinos.org.cn/upload");
|
||||||
|
|
||||||
|
QNetworkRequest request(url);
|
||||||
|
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json");
|
||||||
|
|
||||||
|
// Send the POST request
|
||||||
|
QNetworkReply *reply = manager->post(request, jsonData);
|
||||||
|
|
||||||
|
connect(reply, &QNetworkReply::finished, [=]() {
|
||||||
|
if (reply->error() == QNetworkReply::NoError) {
|
||||||
|
emit uploadSuccessful();
|
||||||
|
} else {
|
||||||
|
emit uploadFailed(reply->errorString());
|
||||||
|
}
|
||||||
|
reply->deleteLater();
|
||||||
|
});
|
||||||
|
}
|
||||||
21
src/backend/DataCollectorAndUploader.h
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
#ifndef DATACOLLECTORANDUPLOADER_H
|
||||||
|
#define DATACOLLECTORANDUPLOADER_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
|
||||||
|
class DataCollectorAndUploader : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
explicit DataCollectorAndUploader(QObject *parent = nullptr);
|
||||||
|
void collectAndUploadData();
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void uploadSuccessful();
|
||||||
|
void uploadFailed(QString errorString);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void collectData();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // DATACOLLECTORANDUPLOADER_H
|
||||||
147
src/backend/ThemeChecker.cpp
Executable file
@@ -0,0 +1,147 @@
|
|||||||
|
#include "ThemeChecker.h"
|
||||||
|
|
||||||
|
#include <QDBusConnection>
|
||||||
|
#include <QDebug>
|
||||||
|
|
||||||
|
Q_GLOBAL_STATIC(ThemeChecker, m_instance)
|
||||||
|
|
||||||
|
constexpr char kFreedesktopPortalServiceName[] = "org.freedesktop.portal.Desktop";
|
||||||
|
constexpr char kFreedesktopPortalServicePath[] = "/org/freedesktop/portal/desktop";
|
||||||
|
constexpr char kFreedesktopPortalSettingsInterface[] = "org.freedesktop.portal.Settings";
|
||||||
|
|
||||||
|
ThemeChecker::ThemeChecker(QObject *parent)
|
||||||
|
: QObject(parent)
|
||||||
|
, m_paletteType(Dtk::Gui::DGuiApplicationHelper::instance()->paletteType())
|
||||||
|
{
|
||||||
|
m_interface = new QDBusInterface(kFreedesktopPortalServiceName,
|
||||||
|
kFreedesktopPortalServicePath,
|
||||||
|
kFreedesktopPortalSettingsInterface,
|
||||||
|
QDBusConnection::sessionBus(),
|
||||||
|
this);
|
||||||
|
|
||||||
|
initThemeType();
|
||||||
|
initConnections();
|
||||||
|
}
|
||||||
|
|
||||||
|
ThemeChecker *ThemeChecker::instance()
|
||||||
|
{
|
||||||
|
return m_instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ThemeChecker::useDarkTheme()
|
||||||
|
{
|
||||||
|
if (m_paletteType == Dtk::Gui::DGuiApplicationHelper::ColorType::UnknownType) {
|
||||||
|
return m_themeType == Dtk::Gui::DGuiApplicationHelper::ColorType::DarkType;
|
||||||
|
} else {
|
||||||
|
return m_paletteType == Dtk::Gui::DGuiApplicationHelper::ColorType::DarkType;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ThemeChecker::initThemeType()
|
||||||
|
{
|
||||||
|
QVariantList args { "org.freedesktop.appearance", "color-scheme" };
|
||||||
|
QDBusMessage msg = m_interface->callWithArgumentList(QDBus::Block, "Read", args);
|
||||||
|
if (msg.type() != QDBusMessage::MessageType::ReplyMessage || msg.arguments().size() < 1) {
|
||||||
|
qWarning().noquote() << "Init color-scheme from D-Bus failed:" << msg.errorName() << msg.errorMessage();
|
||||||
|
m_themeType = Dtk::Gui::DGuiApplicationHelper::toColorType(Dtk::Gui::DGuiApplicationHelper::fetchPalette(Dtk::Gui::DGuiApplicationHelper::instance()->applicationTheme()));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
quint32 colorScheme = qvariant_cast<QDBusVariant>(qvariant_cast<QDBusVariant>(msg.arguments().first()).variant()).variant().toUInt();
|
||||||
|
switch (colorScheme) {
|
||||||
|
case 1:
|
||||||
|
m_themeType = Dtk::Gui::DGuiApplicationHelper::ColorType::DarkType;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
m_themeType = Dtk::Gui::DGuiApplicationHelper::ColorType::LightType;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
qInfo().noquote() << QString("color-scheme: %1, fetching themeType according to QPalette::Window").arg(colorScheme);
|
||||||
|
m_themeType = Dtk::Gui::DGuiApplicationHelper::toColorType(Dtk::Gui::DGuiApplicationHelper::fetchPalette(Dtk::Gui::DGuiApplicationHelper::instance()->applicationTheme()));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_paletteType == Dtk::Gui::DGuiApplicationHelper::ColorType::UnknownType) {
|
||||||
|
Dtk::Gui::DGuiApplicationHelper::instance()->setApplicationPalette(Dtk::Gui::DGuiApplicationHelper::standardPalette(m_themeType));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ThemeChecker::initConnections()
|
||||||
|
{
|
||||||
|
QDBusConnection::sessionBus().connect(kFreedesktopPortalServiceName,
|
||||||
|
kFreedesktopPortalServicePath,
|
||||||
|
kFreedesktopPortalSettingsInterface,
|
||||||
|
"SettingChanged",
|
||||||
|
this,
|
||||||
|
SLOT(slotSettingChanged(const QString &, const QString &, const QDBusVariant &)));
|
||||||
|
|
||||||
|
connect(Dtk::Gui::DGuiApplicationHelper::instance()->applicationTheme(), &Dtk::Gui::DPlatformTheme::themeNameChanged, this, &ThemeChecker::slotThemeNameChanged);
|
||||||
|
connect(Dtk::Gui::DGuiApplicationHelper::instance(), &Dtk::Gui::DGuiApplicationHelper::paletteTypeChanged, this, &ThemeChecker::slotPaletteTypeChanged);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ThemeChecker::slotSettingChanged(const QString &_namespace, const QString &key, const QDBusVariant &variant)
|
||||||
|
{
|
||||||
|
if (_namespace != "org.freedesktop.appearance" || key != "color-scheme") {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Dtk::Gui::DGuiApplicationHelper::ColorType colorType = Dtk::Gui::DGuiApplicationHelper::ColorType::UnknownType;
|
||||||
|
|
||||||
|
quint32 colorScheme = variant.variant().toUInt();
|
||||||
|
switch (colorScheme) {
|
||||||
|
case 1:
|
||||||
|
colorType = Dtk::Gui::DGuiApplicationHelper::ColorType::DarkType;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
colorType = Dtk::Gui::DGuiApplicationHelper::ColorType::LightType;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
qInfo().noquote() << QString("color-scheme: %1, fetching themeType according to QPalette::Window").arg(colorScheme);
|
||||||
|
colorType = Dtk::Gui::DGuiApplicationHelper::toColorType(Dtk::Gui::DGuiApplicationHelper::fetchPalette(Dtk::Gui::DGuiApplicationHelper::instance()->applicationTheme()));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_paletteType != Dtk::Gui::DGuiApplicationHelper::ColorType::UnknownType) {
|
||||||
|
m_themeType = colorType;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_themeType != colorType) {
|
||||||
|
Dtk::Gui::DGuiApplicationHelper::instance()->setApplicationPalette(Dtk::Gui::DGuiApplicationHelper::standardPalette(colorType));
|
||||||
|
emit themeChanged(colorType == Dtk::Gui::DGuiApplicationHelper::ColorType::DarkType);
|
||||||
|
m_themeType = colorType;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ThemeChecker::slotThemeNameChanged(const QByteArray &theme)
|
||||||
|
{
|
||||||
|
Dtk::Gui::DGuiApplicationHelper::ColorType themeType = Dtk::Gui::DGuiApplicationHelper::ColorType::LightType;
|
||||||
|
if (theme.endsWith("dark")) {
|
||||||
|
themeType = Dtk::Gui::DGuiApplicationHelper::ColorType::DarkType;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_paletteType != Dtk::Gui::DGuiApplicationHelper::ColorType::UnknownType) {
|
||||||
|
m_themeType = themeType;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_themeType != themeType) {
|
||||||
|
Dtk::Gui::DGuiApplicationHelper::instance()->setApplicationPalette(Dtk::Gui::DGuiApplicationHelper::standardPalette(themeType));
|
||||||
|
emit themeChanged(themeType == Dtk::Gui::DGuiApplicationHelper::ColorType::DarkType);
|
||||||
|
m_themeType = themeType;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ThemeChecker::slotPaletteTypeChanged(Dtk::Gui::DGuiApplicationHelper::ColorType paletteType)
|
||||||
|
{
|
||||||
|
m_paletteType = paletteType;
|
||||||
|
|
||||||
|
if (m_paletteType != Dtk::Gui::DGuiApplicationHelper::ColorType::UnknownType) {
|
||||||
|
Dtk::Gui::DGuiApplicationHelper::instance()->setApplicationPalette(Dtk::Gui::DGuiApplicationHelper::standardPalette(m_paletteType));
|
||||||
|
emit themeChanged(m_paletteType == Dtk::Gui::DGuiApplicationHelper::ColorType::DarkType);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Dtk::Gui::DGuiApplicationHelper::instance()->setApplicationPalette(Dtk::Gui::DGuiApplicationHelper::standardPalette(m_themeType));
|
||||||
|
emit themeChanged(m_themeType == Dtk::Gui::DGuiApplicationHelper::ColorType::DarkType);
|
||||||
|
}
|
||||||
40
src/backend/ThemeChecker.h
Executable file
@@ -0,0 +1,40 @@
|
|||||||
|
#ifndef THEMECHECKER_H
|
||||||
|
#define THEMECHECKER_H
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <QDBusVariant>
|
||||||
|
#include <QDBusInterface>
|
||||||
|
|
||||||
|
#include <DPlatformTheme>
|
||||||
|
#include <DGuiApplicationHelper>
|
||||||
|
|
||||||
|
class ThemeChecker : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit ThemeChecker(QObject *parent = nullptr);
|
||||||
|
static ThemeChecker *instance();
|
||||||
|
|
||||||
|
bool useDarkTheme();
|
||||||
|
|
||||||
|
private:
|
||||||
|
void initThemeType();
|
||||||
|
void initConnections();
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void themeChanged(bool isDark);
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void slotSettingChanged(const QString &_namespace, const QString &key, const QDBusVariant &variant);
|
||||||
|
void slotThemeNameChanged(const QByteArray &theme);
|
||||||
|
void slotPaletteTypeChanged(Dtk::Gui::DGuiApplicationHelper::ColorType paletteType);
|
||||||
|
|
||||||
|
private:
|
||||||
|
QDBusInterface *m_interface = nullptr;
|
||||||
|
|
||||||
|
Dtk::Gui::DGuiApplicationHelper::ColorType m_paletteType;
|
||||||
|
Dtk::Gui::DGuiApplicationHelper::ColorType m_themeType;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // THEMECHECKER_H
|
||||||
@@ -1,9 +1,12 @@
|
|||||||
#include "downloadworker.h"
|
#include "downloadworker.h"
|
||||||
#include <QEventLoop>
|
|
||||||
#include <QProcess>
|
#include <QProcess>
|
||||||
#include <QRegularExpression>
|
#include <QRegularExpression>
|
||||||
#include <QDir>
|
|
||||||
#include <QtConcurrent>
|
#include <QtConcurrent>
|
||||||
|
#include <QStandardPaths>
|
||||||
|
|
||||||
|
#define DEFAULTURL "d.store.deepinos.org.cn"
|
||||||
|
#define MAXWAITTIME 200000
|
||||||
|
|
||||||
DownloadController::DownloadController(QObject *parent)
|
DownloadController::DownloadController(QObject *parent)
|
||||||
{
|
{
|
||||||
@@ -11,7 +14,7 @@ DownloadController::DownloadController(QObject *parent)
|
|||||||
|
|
||||||
// 初始化默认域名
|
// 初始化默认域名
|
||||||
domains.clear();
|
domains.clear();
|
||||||
domains.append("d.store.deepinos.org.cn");
|
domains.append(DEFAULTURL);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
domains = {
|
domains = {
|
||||||
@@ -37,7 +40,8 @@ bool checkMeatlink(QString metaUrl)
|
|||||||
{
|
{
|
||||||
metaStatus.remove();
|
metaStatus.remove();
|
||||||
}
|
}
|
||||||
system("curl -I -s --connect-timeout 5 " + metaUrl.toUtf8() + " -w %{http_code} |tail -n1 > /tmp/spark-store/metaStatus.txt");
|
QString cmd = QString("curl -I -s --connect-timeout 5 %1 -w %{http_code} |tail -n1 > /tmp/spark-store/metaStatus.txt").arg(metaUrl);
|
||||||
|
system(cmd.toUtf8().data());
|
||||||
if (metaStatus.open(QFile::ReadOnly) && QString(metaStatus.readAll()).toUtf8() == "200")
|
if (metaStatus.open(QFile::ReadOnly) && QString(metaStatus.readAll()).toUtf8() == "200")
|
||||||
{
|
{
|
||||||
metaStatus.remove();
|
metaStatus.remove();
|
||||||
@@ -48,7 +52,7 @@ bool checkMeatlink(QString metaUrl)
|
|||||||
|
|
||||||
void gennerateDomain(QVector<QString> &domains)
|
void gennerateDomain(QVector<QString> &domains)
|
||||||
{
|
{
|
||||||
QFile serverList(QDir::homePath().toUtf8() + "/.config/spark-store/server.list");
|
QFile serverList(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/server.list");
|
||||||
if (serverList.open(QFile::ReadOnly))
|
if (serverList.open(QFile::ReadOnly))
|
||||||
{
|
{
|
||||||
QStringList list = QString(serverList.readAll()).trimmed().split("\n");
|
QStringList list = QString(serverList.readAll()).trimmed().split("\n");
|
||||||
@@ -68,9 +72,13 @@ void gennerateDomain(QVector<QString> &domains)
|
|||||||
}
|
}
|
||||||
if (domains.size() == 0)
|
if (domains.size() == 0)
|
||||||
{
|
{
|
||||||
domains.append("d.store.deepinos.org.cn");
|
domains.append(DEFAULTURL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
domains.append(DEFAULTURL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -91,40 +99,49 @@ void DownloadController::startDownload(const QString &url)
|
|||||||
QString metaUrl = url + ".metalink";
|
QString metaUrl = url + ".metalink";
|
||||||
qDebug() << "metalink" << metaUrl;
|
qDebug() << "metalink" << metaUrl;
|
||||||
bool useMetalink = false;
|
bool useMetalink = false;
|
||||||
if (checkMeatlink(metaUrl)){
|
if (checkMeatlink(metaUrl))
|
||||||
|
{
|
||||||
useMetalink = true;
|
useMetalink = true;
|
||||||
qDebug() << "useMetalink:" << useMetalink;
|
qDebug() << "useMetalink:" << useMetalink;
|
||||||
}else{
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
gennerateDomain(domains);
|
gennerateDomain(domains);
|
||||||
// qDebug() << domains << domains.size();
|
// qDebug() << domains << domains.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
QString aria2Command = "-d";
|
QString aria2Command = "-d"; //下载目录
|
||||||
QString aria2Urls = "";
|
QString aria2Urls = ""; //下载地址
|
||||||
QString aria2Verbose = "--summary-interval=1";
|
QString aria2Verbose = "--summary-interval=1"; //显示下载速度
|
||||||
QString aria2SizePerThreads = "--min-split-size=1M";
|
QString aria2SizePerThreads = "--min-split-size=1M"; //最小分片大小
|
||||||
QString aria2NoConfig = "--no-conf";
|
QString aria2NoConfig = "--no-conf"; //不使用配置文件
|
||||||
QString aria2NoSeeds = "--seed-time=0";
|
QString aria2NoSeeds = "--seed-time=0"; //不做种
|
||||||
QStringList command;
|
QStringList command;
|
||||||
QString downloadDir = "/tmp/spark-store/";
|
QString downloadDir = "/tmp/spark-store/"; //下载目录
|
||||||
QString aria2ConnectionPerServer = "--max-connection-per-server=1";
|
QString aria2ConnectionPerServer = "--max-connection-per-server=1"; //每个服务器最大连接数
|
||||||
QString aria2ConnectionMax = "--max-concurrent-downloads=16";
|
QString aria2ConnectionMax = "--max-concurrent-downloads=16"; //最大同时下载数
|
||||||
QString aria2DNSCommand = "--async-dns-server=119.29.29.29,223.5.5.5";
|
QString aria2ConnectionTimeout = "--connect-timeout=5"; // 5 秒服务器连接超时
|
||||||
|
QString aria2MaxRetry = "--max-tries=1"; //设置最大重试次数
|
||||||
|
|
||||||
if (useMetalink){
|
|
||||||
|
if (useMetalink) //如果是metalink
|
||||||
|
{
|
||||||
command.append(metaUrl.toUtf8());
|
command.append(metaUrl.toUtf8());
|
||||||
}
|
}
|
||||||
else{
|
else
|
||||||
for (int i = 0; i < domains.size(); i++)
|
{
|
||||||
|
for (int i = 0; i < domains.size(); i++) //遍历域名
|
||||||
{
|
{
|
||||||
command.append(replaceDomain(url, domains.at(i)).replace("+","%2B").toUtf8()); //对+进行转译,避免oss出错
|
command.append(replaceDomain(url, domains.at(i)).replace("+","%2B").toUtf8()); //对+进行转译,避免oss出错
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
qint64 downloadSizeRecord = 0;
|
qint64 downloadSizeRecord = 0; //下载大小记录
|
||||||
QString speedInfo = "";
|
qint8 failDownloadTimes = 0; // 记录重试次数
|
||||||
QString percentInfo = "";
|
const qint8 maxRetryTimes = 3; //最大重试次数
|
||||||
|
QString speedInfo = ""; //显示下载速度
|
||||||
|
QString percentInfo = ""; //显示下载进度
|
||||||
command.append(aria2Command.toUtf8());
|
command.append(aria2Command.toUtf8());
|
||||||
command.append(downloadDir.toUtf8());
|
command.append(downloadDir.toUtf8());
|
||||||
command.append(aria2Verbose.toUtf8());
|
command.append(aria2Verbose.toUtf8());
|
||||||
@@ -132,24 +149,47 @@ void DownloadController::startDownload(const QString &url)
|
|||||||
command.append(aria2SizePerThreads.toUtf8());
|
command.append(aria2SizePerThreads.toUtf8());
|
||||||
command.append(aria2ConnectionPerServer.toUtf8());
|
command.append(aria2ConnectionPerServer.toUtf8());
|
||||||
command.append(aria2ConnectionMax.toUtf8());
|
command.append(aria2ConnectionMax.toUtf8());
|
||||||
command.append(aria2DNSCommand.toUtf8());
|
command.append(aria2ConnectionTimeout.toUtf8());
|
||||||
if (useMetalink){
|
command.append(aria2MaxRetry.toUtf8());
|
||||||
|
|
||||||
|
if (useMetalink)
|
||||||
|
{
|
||||||
command.append(aria2NoSeeds.toUtf8());
|
command.append(aria2NoSeeds.toUtf8());
|
||||||
}
|
}
|
||||||
qDebug() << command;
|
qDebug() << command;
|
||||||
auto cmd = new QProcess(this);
|
|
||||||
cmd->setProcessChannelMode(QProcess::MergedChannels);
|
|
||||||
cmd->setProgram("aria2c");
|
|
||||||
cmd->setArguments(command);
|
|
||||||
cmd->start();
|
|
||||||
cmd->waitForStarted(); //等待启动完成
|
|
||||||
|
|
||||||
QObject::connect(cmd, &QProcess::readyReadStandardOutput,
|
bool downloadSuccess = true;
|
||||||
[&]()
|
QProcess cmd;
|
||||||
|
cmd.setProcessChannelMode(QProcess::MergedChannels);
|
||||||
|
cmd.setProgram("aria2c");
|
||||||
|
cmd.setArguments(command);
|
||||||
|
cmd.start();
|
||||||
|
cmd.waitForStarted(-1); //等待启动完成
|
||||||
|
|
||||||
|
// Timer
|
||||||
|
QTimer *timeoutTimer = new QTimer(this);
|
||||||
|
timeoutTimer->setSingleShot(true); // 单次触发
|
||||||
|
connect(timeoutTimer, &QTimer::timeout, [&]() {
|
||||||
|
if (failDownloadTimes < maxRetryTimes) {
|
||||||
|
qDebug() << "Download timeout, restarting...";
|
||||||
|
// 重新启动下载任务的代码
|
||||||
|
restartDownload(cmd, command); // 调用重新启动下载任务的函数
|
||||||
|
failDownloadTimes += 1;
|
||||||
|
timeoutTimer->start(MAXWAITTIME); // 重新启动定时器
|
||||||
|
} else{
|
||||||
|
emit errorOccur(tr("Download Failed, please retry :(")); // 下载失败
|
||||||
|
downloadSuccess = false;
|
||||||
|
cmd.close();
|
||||||
|
cmd.terminate(); // 终止当前的下载进程
|
||||||
|
cmd.waitForFinished(); // 等待进程结束
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
connect(&cmd, &QProcess::readyReadStandardOutput, [&]()
|
||||||
{
|
{
|
||||||
|
timeoutTimer->start(MAXWAITTIME); // 重置超时计时器,15秒超时
|
||||||
//通过读取输出计算下载速度
|
//通过读取输出计算下载速度
|
||||||
QString message = cmd->readAllStandardOutput().data();
|
QString message = cmd.readAllStandardOutput().data();
|
||||||
// qDebug() << message;
|
|
||||||
message = message.replace(" ", "");
|
message = message.replace(" ", "");
|
||||||
QStringList list;
|
QStringList list;
|
||||||
qint64 downloadSize = 0;
|
qint64 downloadSize = 0;
|
||||||
@@ -172,10 +212,10 @@ void DownloadController::startDownload(const QString &url)
|
|||||||
speedInfo = message.mid(speedPlace1 + 3, speedPlace2 - speedPlace1 - 3);
|
speedInfo = message.mid(speedPlace1 + 3, speedPlace2 - speedPlace1 - 3);
|
||||||
speedInfo += "/s";
|
speedInfo += "/s";
|
||||||
}
|
}
|
||||||
// qDebug() << percentInfo << speedInfo;
|
|
||||||
if (downloadSize >= downloadSizeRecord)
|
if (downloadSize >= downloadSizeRecord)
|
||||||
{
|
{
|
||||||
downloadSizeRecord = downloadSize;
|
downloadSizeRecord = downloadSize;
|
||||||
|
timeoutTimer->stop(); // 如果有进度,停止超时计时器
|
||||||
}
|
}
|
||||||
if (percentInfo == "OK")
|
if (percentInfo == "OK")
|
||||||
{
|
{
|
||||||
@@ -188,18 +228,21 @@ void DownloadController::startDownload(const QString &url)
|
|||||||
emit downloadProcess(speedInfo, downloadSizeRecord, fileSize);
|
emit downloadProcess(speedInfo, downloadSizeRecord, fileSize);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
QObject::connect(cmd, &QProcess::readyReadStandardError,
|
connect(&cmd, &QProcess::readyReadStandardError, [&]()
|
||||||
[&]()
|
|
||||||
{
|
{
|
||||||
emit errorOccur(cmd->readAllStandardError().data());
|
emit errorOccur(cmd.readAllStandardError().data());
|
||||||
return;
|
downloadSuccess = false;
|
||||||
|
cmd.close();
|
||||||
});
|
});
|
||||||
|
|
||||||
auto pidNumber = cmd->processId();
|
pidNumber = cmd.processId();
|
||||||
this->pidNumber = pidNumber;
|
|
||||||
while (cmd->waitForFinished(-1))
|
cmd.waitForFinished(-1);
|
||||||
|
cmd.close();
|
||||||
|
|
||||||
|
if(!downloadSuccess)
|
||||||
{
|
{
|
||||||
continue;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 统计下载量
|
// 统计下载量
|
||||||
@@ -209,10 +252,10 @@ void DownloadController::startDownload(const QString &url)
|
|||||||
* HD 70642 is a star with an exoplanetary companion in the southern constellation of Puppis.
|
* HD 70642 is a star with an exoplanetary companion in the southern constellation of Puppis.
|
||||||
*/
|
*/
|
||||||
QProcess mailProcess;
|
QProcess mailProcess;
|
||||||
mailProcess.start(SenderdPath.toUtf8() + " " + metaUrl.toUtf8() + " " + "HD70642");
|
mailProcess.start(SenderdPath.toUtf8(), QStringList() << metaUrl << "HD70642");
|
||||||
mailProcess.waitForStarted();
|
mailProcess.waitForStarted();
|
||||||
mailProcess.waitForFinished(3000);
|
mailProcess.waitForFinished(3000);
|
||||||
mailProcess.deleteLater();
|
mailProcess.close();
|
||||||
|
|
||||||
emit downloadFinished(); });
|
emit downloadFinished(); });
|
||||||
}
|
}
|
||||||
@@ -222,15 +265,31 @@ void DownloadController::startDownload(const QString &url)
|
|||||||
*/
|
*/
|
||||||
void DownloadController::stopDownload()
|
void DownloadController::stopDownload()
|
||||||
{
|
{
|
||||||
|
if (pidNumber < 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// 实现下载进程退出
|
// 实现下载进程退出
|
||||||
QString killCmd = QString("kill -9 %1").arg(pidNumber);
|
QString killCmd = QString("kill -9 %1").arg(pidNumber);
|
||||||
system(killCmd.toUtf8());
|
system(killCmd.toUtf8());
|
||||||
qDebug() << "kill aria2!";
|
qDebug() << "kill aria2!";
|
||||||
|
pidNumber = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void DownloadController::restartDownload(QProcess &cmd, const QStringList &command)
|
||||||
|
{
|
||||||
|
cmd.terminate(); // 终止当前的下载进程
|
||||||
|
cmd.waitForFinished(); // 等待进程结束
|
||||||
|
cmd.setArguments(command); // 重新设置参数
|
||||||
|
cmd.start(); // 重新启动下载
|
||||||
|
cmd.waitForStarted(-1); // 等待启动完成
|
||||||
}
|
}
|
||||||
|
|
||||||
qint64 DownloadController::getFileSize(const QString &url)
|
qint64 DownloadController::getFileSize(const QString &url)
|
||||||
{
|
{
|
||||||
// 已经无需使用 qtnetwork 再获取 filesize,完全交给 aria2 来计算进度。 为保证兼容性,故保留此函数。
|
// 已经无需使用 qtnetwork 再获取 filesize,完全交给 aria2 来计算进度。 为保证兼容性,故保留此函数。
|
||||||
|
qDebug() << "Begin download:" << url;
|
||||||
qint64 fileSize = 10000;
|
qint64 fileSize = 10000;
|
||||||
return fileSize;
|
return fileSize;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,9 +2,8 @@
|
|||||||
#define DOWNLOADWORKER_H
|
#define DOWNLOADWORKER_H
|
||||||
|
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QList>
|
#include <QVector>
|
||||||
#include <QFile>
|
#include <QProcess>
|
||||||
#include <QNetworkReply>
|
|
||||||
|
|
||||||
class DownloadController : public QObject
|
class DownloadController : public QObject
|
||||||
{
|
{
|
||||||
@@ -16,26 +15,23 @@ public:
|
|||||||
void setFilename(QString filename);
|
void setFilename(QString filename);
|
||||||
void startDownload(const QString &url);
|
void startDownload(const QString &url);
|
||||||
void stopDownload();
|
void stopDownload();
|
||||||
|
void restartDownload(QProcess &cmd, const QStringList &command);
|
||||||
qint64 getFileSize(const QString& url);
|
qint64 getFileSize(const QString& url);
|
||||||
QString replaceDomain(const QString& url, const QString domain);
|
QString replaceDomain(const QString& url, const QString domain);
|
||||||
|
|
||||||
private:
|
|
||||||
int threadNum;
|
|
||||||
int pidNumber;
|
|
||||||
QString filename;
|
|
||||||
qint64 fileSize;
|
|
||||||
QVector<QPair<qint64, qint64>> ranges;
|
|
||||||
QFile *file;
|
|
||||||
bool finished = false;
|
|
||||||
QVector<QString> domains;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void errorOccur(const QString& msg);
|
void errorOccur(const QString& msg);
|
||||||
void downloadProcess(QString, qint64, qint64);
|
void downloadProcess(QString, qint64, qint64);
|
||||||
void downloadFinished();
|
void downloadFinished();
|
||||||
|
|
||||||
|
private:
|
||||||
|
int threadNum;
|
||||||
|
qint64 pidNumber = -1;
|
||||||
|
QString filename;
|
||||||
|
qint64 fileSize;
|
||||||
|
QVector<QPair<qint64, qint64>> ranges;
|
||||||
|
bool finished = false;
|
||||||
|
QVector<QString> domains;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // FILEDOWNLOADWORKER_H
|
#endif // FILEDOWNLOADWORKER_H
|
||||||
|
|||||||
@@ -22,13 +22,13 @@ void image_show::setImage(QPixmap image)
|
|||||||
QImage re_screen1;
|
QImage re_screen1;
|
||||||
QImage re_screen0 = screen0.scaled(QSize(400, 300), Qt::KeepAspectRatio, Qt::SmoothTransformation);
|
QImage re_screen0 = screen0.scaled(QSize(400, 300), Qt::KeepAspectRatio, Qt::SmoothTransformation);
|
||||||
|
|
||||||
// 获取主屏幕尺寸
|
// 获取当前app所在的主屏幕尺寸
|
||||||
desktop_w = QGuiApplication::primaryScreen()->geometry().width();
|
desktop_w = QGuiApplication::screenAt(QCursor().pos())->geometry().width();
|
||||||
desktop_h = QGuiApplication::primaryScreen()->geometry().height();
|
desktop_h = QGuiApplication::screenAt(QCursor().pos())->geometry().height();
|
||||||
|
|
||||||
if (screen0.width() > (desktop_w - 20) || screen0.height() > (desktop_h - 20))
|
if (screen0.width() > int(desktop_w / 3 * 2) || screen0.height() > int(desktop_h / 3 * 2))
|
||||||
{
|
{
|
||||||
re_screen1 = screen0.scaled(QSize(desktop_w - 20, desktop_h - 20), Qt::KeepAspectRatio, Qt::SmoothTransformation);
|
re_screen1 = screen0.scaled(QSize(int(desktop_w / 3 * 2), int(desktop_h / 3 * 2)), Qt::KeepAspectRatio, Qt::SmoothTransformation);
|
||||||
m_image = QPixmap::fromImage(re_screen1);
|
m_image = QPixmap::fromImage(re_screen1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -42,12 +42,13 @@ void image_show::setImage(QPixmap image)
|
|||||||
void image_show::mousePressEvent(QMouseEvent *)
|
void image_show::mousePressEvent(QMouseEvent *)
|
||||||
{
|
{
|
||||||
m_dialog->setimage(m_image);
|
m_dialog->setimage(m_image);
|
||||||
m_dialog->showFullScreen();
|
|
||||||
|
|
||||||
// 识别主屏幕尺寸并设置 widget 大小
|
// 识别主屏幕尺寸并设置 widget 大小
|
||||||
m_dialog->setFixedSize(desktop_w, desktop_h);
|
m_dialog->setFixedSize(qMin(desktop_w, m_image.width() + int(desktop_h / 16 * m_image.width() / m_image.height())), qMin(desktop_h, m_image.height() + int(desktop_h / 16)));
|
||||||
|
|
||||||
m_dialog->move(0, 0);
|
m_dialog->move(QGuiApplication::screenAt(QCursor().pos())->geometry().center() - m_dialog->rect().center());
|
||||||
|
|
||||||
|
m_dialog->show();
|
||||||
}
|
}
|
||||||
image_show::~image_show()
|
image_show::~image_show()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,74 +1,102 @@
|
|||||||
#include "sparkapi.h"
|
#include "sparkapi.h"
|
||||||
|
|
||||||
|
#include <QSettings>
|
||||||
|
#include <QStandardPaths>
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
|
|
||||||
QString SparkAPI::serverUrl = "";
|
QString SparkAPI::serverUrl = "";
|
||||||
|
#ifdef __x86_64__
|
||||||
|
QString SparkAPI::serverUrlDir = "store";
|
||||||
|
|
||||||
|
#elif __aarch64__
|
||||||
|
QString SparkAPI::serverUrlDir = "aarch64-store";
|
||||||
|
#elif __loongarch__
|
||||||
|
QString SparkAPI::serverUrlDir = "loong64-store";
|
||||||
|
#endif
|
||||||
|
|
||||||
SparkAPI::SparkAPI(QObject *parent) : QObject(parent)
|
SparkAPI::SparkAPI(QObject *parent) : QObject(parent)
|
||||||
{
|
{
|
||||||
QSettings readConfig(QDir::homePath() + "/.config/spark-store/config.ini", QSettings::IniFormat);
|
QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
|
||||||
if (!readConfig.value("server/choose").toString().isEmpty() && readConfig.value("server/updated").toString() == "TRUE")
|
if (!config.value("server/choose").toString().isEmpty() && config.value("server/updated").toBool())
|
||||||
{
|
{
|
||||||
SparkAPI::setServerUrl(readConfig.value("server/choose").toString());
|
SparkAPI::setServerUrl(config.value("server/choose").toString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SparkAPI::get(QUrl url)
|
void SparkAPI::get(QUrl url)
|
||||||
{
|
{
|
||||||
QNetworkRequest request;
|
QNetworkRequest request;
|
||||||
HttpRequest *httprequest = new HttpRequest;
|
HttpRequest *httprequest = new HttpRequest;
|
||||||
request.setUrl(QUrl(url.toString().replace("+", "%2B")));
|
request.setUrl(QUrl(url.toString().replace("+", "%2B")));
|
||||||
|
request.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);
|
||||||
connect(httprequest, &HttpRequest::finished, [=](QString data)
|
connect(httprequest, &HttpRequest::finished, [=](QString data)
|
||||||
{
|
{
|
||||||
QByteArray arr = data.toUtf8();
|
QByteArray arr = data.toUtf8();
|
||||||
//解析Json
|
// 解析 Json
|
||||||
QJsonParseError error;
|
QJsonParseError error;
|
||||||
if(QJsonDocument::fromJson(arr,&error).isArray())
|
if(QJsonDocument::fromJson(arr,&error).isArray())
|
||||||
{
|
{
|
||||||
auto doc = QJsonDocument::fromJson(arr,&error).array();
|
auto doc = QJsonDocument::fromJson(arr,&error).array();
|
||||||
emit finished(doc);
|
emit finished(doc);
|
||||||
}else {
|
} else {
|
||||||
auto doc = QJsonDocument::fromJson(arr,&error).object();
|
auto doc = QJsonDocument::fromJson(arr,&error).object();
|
||||||
emit finishedObject(doc);
|
emit finishedObject(doc);
|
||||||
}
|
}
|
||||||
|
|
||||||
httprequest->deleteLater(); });
|
httprequest->deleteLater();
|
||||||
|
});
|
||||||
|
|
||||||
httprequest->getRequest(request);
|
httprequest->getRequest(request);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SparkAPI::getRAW(QUrl url)
|
void SparkAPI::getRAW(QUrl url)
|
||||||
{
|
{
|
||||||
QNetworkRequest request;
|
QNetworkRequest request;
|
||||||
HttpRequest *httprequest = new HttpRequest;
|
HttpRequest *httprequest = new HttpRequest;
|
||||||
request.setUrl(QUrl(url.toString().replace("+", "%2B")));
|
request.setUrl(QUrl(url.toString().replace("+", "%2B")));
|
||||||
|
request.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);
|
||||||
connect(httprequest, &HttpRequest::finished, [=](QString data)
|
connect(httprequest, &HttpRequest::finished, [=](QString data)
|
||||||
{
|
{
|
||||||
emit finishedRAW(data);
|
emit finishedRAW(data);
|
||||||
httprequest->deleteLater(); });
|
httprequest->deleteLater(); });
|
||||||
httprequest->getRequest(request);
|
httprequest->getRequest(request);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SparkAPI::getAppList(QString type)
|
void SparkAPI::getAppList(QString type)
|
||||||
{
|
{
|
||||||
get(QUrl(getServerUrl() + "store/" + type + "/applist.json"));
|
get(QUrl(getServerUrl() + SparkAPI::serverUrlDir + "/" + type + "/applist.json"));
|
||||||
}
|
}
|
||||||
|
|
||||||
void SparkAPI::getSearchList(QString keyword)
|
void SparkAPI::getSearchList(QString keyword)
|
||||||
{
|
{
|
||||||
get(QUrl("https://search.deepinos.org.cn/appinfo/search?keyword=" + keyword));
|
get(QUrl("https://search.deepinos.org.cn/appinfo/search?keyword=" + keyword));
|
||||||
}
|
}
|
||||||
|
|
||||||
void SparkAPI::getAppInfo(QUrl spk)
|
void SparkAPI::getAppInfo(QUrl spk)
|
||||||
{
|
{
|
||||||
get(QUrl(getServerUrl() + "store" + spk.path().replace("+", "%2B") + "/app.json"));
|
get(QUrl(getServerUrl() + SparkAPI::serverUrlDir + spk.path().replace("+", "%2B") + "/app.json"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString SparkAPI::getArchDir()
|
||||||
|
{
|
||||||
|
return SparkAPI::serverUrlDir;
|
||||||
|
}
|
||||||
|
|
||||||
void SparkAPI::getAppDownloadTimes(QUrl spk)
|
void SparkAPI::getAppDownloadTimes(QUrl spk)
|
||||||
{
|
{
|
||||||
getRAW(QUrl(getServerUrl() + "store" + spk.path().replace("+", "%2B") + "/download-times.txt"));
|
getRAW(QUrl(getServerUrl() + SparkAPI::serverUrlDir + spk.path().replace("+", "%2B") + "/download-times.txt"));
|
||||||
}
|
}
|
||||||
|
|
||||||
QString SparkAPI::getServerUrl()
|
QString SparkAPI::getServerUrl()
|
||||||
{
|
{
|
||||||
return SparkAPI::serverUrl;
|
return SparkAPI::serverUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
QString SparkAPI::getImgServerUrl()
|
QString SparkAPI::getImgServerUrl()
|
||||||
{
|
{
|
||||||
return SparkAPI::serverUrl;
|
return SparkAPI::serverUrl;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SparkAPI::setServerUrl(QString url)
|
void SparkAPI::setServerUrl(QString url)
|
||||||
{
|
{
|
||||||
SparkAPI::serverUrl = url;
|
SparkAPI::serverUrl = url;
|
||||||
|
|||||||
@@ -1,16 +1,21 @@
|
|||||||
#ifndef SPARKAPI_H
|
#ifndef SPARKAPI_H
|
||||||
#define SPARKAPI_H
|
#define SPARKAPI_H
|
||||||
|
|
||||||
|
#include "utils/httprequest.h"
|
||||||
|
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QJsonObject>
|
#include <QJsonObject>
|
||||||
#include <QJsonArray>
|
#include <QJsonArray>
|
||||||
#include <QJsonParseError>
|
#include <QJsonParseError>
|
||||||
#include "utils/httprequest.h"
|
|
||||||
#include <QSettings>
|
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
|
|
||||||
class SparkAPI : public QObject
|
class SparkAPI : public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
explicit SparkAPI(QObject *parent = nullptr);
|
||||||
|
|
||||||
static QString getServerUrl();
|
static QString getServerUrl();
|
||||||
static QString getImgServerUrl();
|
static QString getImgServerUrl();
|
||||||
static void setServerUrl(QString url);
|
static void setServerUrl(QString url);
|
||||||
@@ -20,17 +25,16 @@ public:
|
|||||||
void getRAW(QUrl url);
|
void getRAW(QUrl url);
|
||||||
void getAppList(QString type);
|
void getAppList(QString type);
|
||||||
void getAppInfo(QUrl spk);
|
void getAppInfo(QUrl spk);
|
||||||
explicit SparkAPI(QObject *parent = nullptr);
|
static QString getArchDir();
|
||||||
|
|
||||||
private:
|
|
||||||
static QString serverUrl;
|
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void finished(QJsonArray);
|
void finished(QJsonArray);
|
||||||
void finishedRAW(QString);
|
void finishedRAW(QString);
|
||||||
void finishedObject(QJsonObject);
|
void finishedObject(QJsonObject);
|
||||||
|
|
||||||
public slots:
|
private:
|
||||||
|
static QString serverUrl;
|
||||||
|
static QString serverUrlDir;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // SPARKAPI_H
|
#endif // SPARKAPI_H
|
||||||
|
|||||||
294
src/main.cpp
@@ -1,168 +1,212 @@
|
|||||||
|
#include "application.h"
|
||||||
#include "mainwindow-dtk.h"
|
#include "mainwindow-dtk.h"
|
||||||
|
#include "utils/utils.h"
|
||||||
|
|
||||||
|
#include <signal.h>
|
||||||
|
#include <execinfo.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <fstream>
|
||||||
|
#include <execinfo.h>
|
||||||
|
|
||||||
#include <DApplication>
|
|
||||||
#include <DLog>
|
|
||||||
#include <DPlatformWindowHandle>
|
|
||||||
#include <DApplicationSettings>
|
|
||||||
#include <DAboutDialog>
|
|
||||||
#include <QLabel>
|
|
||||||
#include <DWidgetUtil>
|
|
||||||
#include <DSysInfo>
|
#include <DSysInfo>
|
||||||
|
#include <DApplicationSettings>
|
||||||
|
|
||||||
|
#include <QDate>
|
||||||
|
#include <QProcessEnvironment>
|
||||||
|
#include <QSettings>
|
||||||
|
#include <QFile>
|
||||||
|
#include <QStandardPaths>
|
||||||
|
#include <QSurfaceFormat>
|
||||||
|
|
||||||
|
#include <backend/DataCollectorAndUploader.h>
|
||||||
|
|
||||||
DCORE_USE_NAMESPACE
|
DCORE_USE_NAMESPACE
|
||||||
DWIDGET_USE_NAMESPACE
|
DWIDGET_USE_NAMESPACE
|
||||||
|
|
||||||
|
static QString buildDateTime;
|
||||||
|
|
||||||
|
|
||||||
|
void gatherInfo(FILE *fp, std::ofstream& logFile, const char* description) {
|
||||||
|
if (fp) {
|
||||||
|
char buffer[512];
|
||||||
|
logFile << description << ":\n";
|
||||||
|
while (fgets(buffer, sizeof(buffer), fp) != NULL) {
|
||||||
|
buffer[strcspn(buffer, "\n")] = 0;
|
||||||
|
logFile << buffer << "\n";
|
||||||
|
}
|
||||||
|
pclose(fp);
|
||||||
|
} else {
|
||||||
|
logFile << "Failed to gather " << description << " info.\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void crashHandler(int sig) {
|
||||||
|
void *array[50];
|
||||||
|
size_t size = backtrace(array, 50);
|
||||||
|
if (size == 0) {
|
||||||
|
perror("backtrace");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
time_t t = time(NULL);
|
||||||
|
struct tm tm = *localtime(&t);
|
||||||
|
char filename[128];
|
||||||
|
snprintf(filename, sizeof(filename), "/tmp/spark_store_crash_log_%04d%02d%02d_%02d%02d%02d.txt",
|
||||||
|
tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
|
||||||
|
|
||||||
|
std::ofstream logFile(filename, std::ios::out);
|
||||||
|
|
||||||
|
if (!logFile.is_open()) {
|
||||||
|
perror("ofstream");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
logFile << "Please send this log to the developer. QQ Group: 872690351\n";
|
||||||
|
logFile << "Gitee: https://gitee.com/spark-store-project/spark-store/issues\n";
|
||||||
|
logFile << "Gihub: https://github.com/spark-store-project/spark-store/issues\n";
|
||||||
|
logFile << "Build Date and Time: " << buildDateTime.toStdString() << "\n";
|
||||||
|
gatherInfo(popen("cat ~/.config/spark-union/spark-store/config.ini", "r"), logFile, "User Config File");
|
||||||
|
|
||||||
|
// Collecting System Information
|
||||||
|
gatherInfo(popen("LANG=en_US.UTF-8 uname -m", "r"), logFile, "CPU Architecture");
|
||||||
|
gatherInfo(popen("LANG=en_US.UTF-8 lsb_release -a", "r"), logFile, "Distribution info");
|
||||||
|
gatherInfo(popen("LANG=en_US.UTF-8 lscpu", "r"), logFile, "All CPU Info");
|
||||||
|
gatherInfo(popen("LANG=en_US.UTF-8 free -h | grep Mem | awk '{print $2}'", "r"), logFile, "Memory Size");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
logFile << "Error: signal " << sig << ":\n";
|
||||||
|
for (size_t i = 0; i < size; i++) {
|
||||||
|
char **strings = backtrace_symbols(&array[i], 1);
|
||||||
|
if (strings != NULL && strings[0] != NULL) {
|
||||||
|
logFile << strings[0] << "\n";
|
||||||
|
} else {
|
||||||
|
logFile << "Failed to get symbol.\n";
|
||||||
|
}
|
||||||
|
free(strings);
|
||||||
|
}
|
||||||
|
|
||||||
|
logFile.close();
|
||||||
|
|
||||||
|
char openCmd[256];
|
||||||
|
snprintf(openCmd, sizeof(openCmd), "xdg-open %s", filename);
|
||||||
|
if (system(openCmd) == -1) {
|
||||||
|
perror("system");
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stderr, "Error: signal %d:\n", sig);
|
||||||
|
backtrace_symbols_fd(array, size, STDERR_FILENO);
|
||||||
|
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
|
// 崩溃处理
|
||||||
|
signal(SIGSEGV, crashHandler); // 注册SIGSEGV处理函数
|
||||||
|
|
||||||
|
|
||||||
// Get build time
|
// Get build time
|
||||||
static const QString version = "Version 4.1.2";
|
|
||||||
static const QDate buildDate = QLocale(QLocale::English).toDate(QString(__DATE__).replace(" ", " 0"), "MMM dd yyyy");
|
static const QDate buildDate = QLocale(QLocale::English).toDate(QString(__DATE__).replace(" ", " 0"), "MMM dd yyyy");
|
||||||
static const QTime buildTime = QTime::fromString(__TIME__, "hh:mm:ss");
|
static const QTime buildTime = QTime::fromString(__TIME__, "hh:mm:ss");
|
||||||
QSettings readConfig(QDir::homePath() + "/.config/spark-store/config.ini", QSettings::IniFormat);
|
buildDateTime = buildDate.toString("yyyy.MM.dd") + "-" + buildTime.toString("hh:mm:ss");
|
||||||
QSettings *setConfig = new QSettings(QDir::homePath() + "/.config/spark-store/config.ini", QSettings::IniFormat);
|
|
||||||
|
|
||||||
// 设置桌面环境环境变量
|
|
||||||
bool isDeepinOS = true;
|
|
||||||
if (!QString(qgetenv("XDG_CURRENT_DESKTOP")).toLower().startsWith("deepin"))
|
|
||||||
{
|
|
||||||
setenv("XDG_CURRENT_DESKTOP", "Deepin", 1);
|
|
||||||
isDeepinOS = false;
|
|
||||||
}
|
|
||||||
bool isWayland = false;
|
|
||||||
auto e = QProcessEnvironment::systemEnvironment();
|
|
||||||
QString XDG_SESSION_TYPE = e.value(QStringLiteral("XDG_SESSION_TYPE"));
|
|
||||||
QString WAYLAND_DISPLAY = e.value(QStringLiteral("WAYLAND_DISPLAY"));
|
|
||||||
|
|
||||||
if (XDG_SESSION_TYPE == QLatin1String("wayland") || WAYLAND_DISPLAY.contains(QLatin1String("wayland"), Qt::CaseInsensitive))
|
// NOTE: 提前设置组织名称和应用名称,避免配置文件位置错误
|
||||||
{
|
DApplication::setOrganizationName("spark-union");
|
||||||
isWayland = true;
|
DApplication::setApplicationName("spark-store");
|
||||||
}
|
Application::checkAppConfigLocation(); // 检查 ~/.config/spark-union/spark-store 文件夹是否存在
|
||||||
setConfig->setValue("build/isWayland", isWayland);
|
|
||||||
setConfig->setValue("build/isDeepinOS", isDeepinOS);
|
|
||||||
|
|
||||||
// Check config file, if there is no wayland config, then set it to default, which means use wayland if possible.
|
// 初始化 config.ini 配置文件
|
||||||
if (!readConfig.contains("build/useWayland"))
|
Utils::initConfig();
|
||||||
{
|
|
||||||
setConfig->setValue("build/useWayland", true);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool useWayland = readConfig.value("build/useWayland").toBool();
|
// 回传版本信息,不涉及个人隐私
|
||||||
qDebug() << "System Wayland enabled:" << isWayland << ". Spark Wayland enabled:" << useWayland;
|
DataCollectorAndUploader uploader;
|
||||||
|
QObject::connect(&uploader, &DataCollectorAndUploader::uploadSuccessful, [](){
|
||||||
|
qDebug() << "Data uploaded successfully";
|
||||||
|
});
|
||||||
|
QObject::connect(&uploader, &DataCollectorAndUploader::uploadFailed, [](QString error){
|
||||||
|
qDebug() << "Upload failed with error: " << error;
|
||||||
|
});
|
||||||
|
|
||||||
|
uploader.collectAndUploadData();
|
||||||
|
|
||||||
// Set display backend
|
// Set display backend
|
||||||
if (isWayland && useWayland && !(Dtk::Core::DSysInfo::isDDE() || isDeepinOS))
|
Utils::setQPAPlatform();
|
||||||
{
|
|
||||||
qputenv("QT_QPA_PLATFORM", "wayland");
|
// 龙芯机器配置,使得 DApplication 能正确加载 QtWebEngine
|
||||||
}
|
qputenv("DTK_FORCE_RASTER_WIDGETS", "FALSE");
|
||||||
else if (isWayland && useWayland && (Dtk::Core::DSysInfo::isDDE() && isDeepinOS))
|
|
||||||
{
|
|
||||||
qputenv("QT_QPA_PLATFORM", "dwayland");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
qputenv("QT_QPA_PLATFORM", "dxcb");
|
|
||||||
}
|
|
||||||
DApplication::setAttribute(Qt::AA_EnableHighDpiScaling); // 开启 Hidpi 支持
|
|
||||||
|
|
||||||
// 浏览器开启 GPU 支持
|
// 浏览器开启 GPU 支持
|
||||||
qputenv("QTWEBENGINE_CHROMIUM_FLAGS", "--ignore-gpu-blocklist --enable-gpu-rasterization --enable-native-gpu-memory-buffers --enable-accelerated-video-decode");
|
// qputenv("QTWEBENGINE_CHROMIUM_FLAGS", "--disable-features=UseModernMediaControls");
|
||||||
|
// qputenv("QTWEBENGINE_CHROMIUM_FLAGS", "--disable-web-security");
|
||||||
|
// 全平台软件渲染Webkit
|
||||||
|
qputenv("QTWEBENGINE_CHROMIUM_FLAGS", "--disable-gpu");
|
||||||
|
#ifdef __sw_64__
|
||||||
|
qputenv("QTWEBENGINE_CHROMIUM_FLAGS", "--no-sandbox");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __loongarch__
|
||||||
|
qputenv("QTWEBENGINE_CHROMIUM_FLAGS", "--no-sandbox");
|
||||||
|
#endif
|
||||||
|
/**
|
||||||
|
* NOTE: https://zhuanlan.zhihu.com/p/550285855
|
||||||
|
* 避免 wayland 环境下从 QtWebEngine 后退回到 QWidget 时黑屏闪烁
|
||||||
|
*/
|
||||||
|
if (Utils::isWayland()) {
|
||||||
|
qputenv("QMLSCENE_DEVICE", "softwarecontext");
|
||||||
|
DApplication::setAttribute(Qt::AA_UseSoftwareOpenGL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0))
|
||||||
|
// 开启 Hidpi 支持
|
||||||
|
qDebug() << "Enable HiDPI Support.";
|
||||||
|
DApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
|
||||||
|
DApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// 强制使用 DTK 平台插件
|
||||||
QVector<char *> fakeArgs(argc + 2);
|
QVector<char *> fakeArgs(argc + 2);
|
||||||
fakeArgs[0] = argv[0];
|
fakeArgs[0] = argv[0];
|
||||||
QString fakeArgs1 = "-platformtheme";
|
fakeArgs[1] = const_cast<char *>("-platformtheme");
|
||||||
QByteArray fakeArgsTemp = fakeArgs1.toLatin1(); // must
|
fakeArgs[2] = const_cast<char *>("deepin");
|
||||||
fakeArgs[1] = fakeArgsTemp.data();
|
|
||||||
fakeArgs1 = "deepin";
|
|
||||||
fakeArgsTemp = fakeArgs1.toLatin1(); // must
|
|
||||||
fakeArgs[2] = fakeArgsTemp.data();
|
|
||||||
|
|
||||||
for (int i = 1; i < argc; i++)
|
for (int i = 1; i < argc; i++)
|
||||||
|
{
|
||||||
fakeArgs[i + 2] = argv[i];
|
fakeArgs[i + 2] = argv[i];
|
||||||
int fakeArgc = argc + 2; // DApplication的argc要用引用,避免c++编译器优化
|
|
||||||
DApplication a(fakeArgc, fakeArgs.data());
|
|
||||||
|
|
||||||
// 初始化日志模块 (默认日志位置 ~/.cache/deepin/spark-store)
|
|
||||||
DLogManager::registerConsoleAppender();
|
|
||||||
DLogManager::registerFileAppender();
|
|
||||||
|
|
||||||
// Wayland 环境下使用,防止子控件 Native 化
|
|
||||||
if (!DPlatformWindowHandle::pluginVersion().isEmpty())
|
|
||||||
{
|
|
||||||
a.setAttribute(Qt::AA_DontCreateNativeWidgetSiblings, true);
|
|
||||||
}
|
}
|
||||||
a.setAttribute(Qt::AA_UseHighDpiPixmaps);
|
int fakeArgc = argc + 2; // QCoreApplication 的 argc 要用引用,避免 c++ 编译器优化
|
||||||
a.setApplicationDisplayName("Spark Store");
|
Application a(fakeArgc, fakeArgs.data());
|
||||||
|
// 设置版本和构建时间
|
||||||
|
a.setBuildDateTime(buildDateTime);
|
||||||
|
|
||||||
a.loadTranslator(); // 载入翻译
|
|
||||||
|
|
||||||
if (readConfig.value("build/version").toString() != version)
|
|
||||||
{
|
|
||||||
qDebug() << "Spark Store has been updated!";
|
|
||||||
setConfig->setValue("build/version", version);
|
|
||||||
setConfig->setValue("build/time", buildDate.toString("yyyy.MM.dd") + "-" + buildTime.toString());
|
|
||||||
}
|
|
||||||
setConfig->deleteLater();
|
|
||||||
|
|
||||||
// Customized DAboutDialog
|
|
||||||
|
|
||||||
DAboutDialog dialog;
|
|
||||||
a.setAboutDialog(&dialog);
|
|
||||||
dialog.setLicense(QObject::tr("We publish this program under GPL V3"));
|
|
||||||
dialog.setVersion(DApplication::buildVersion(readConfig.value("build/version").toString() + "-" + "Flamescion" + "-" + readConfig.value("build/time").toString()));
|
|
||||||
dialog.setProductIcon(QIcon::fromTheme("spark-store")); // 设置Logo
|
|
||||||
dialog.setProductName(QLabel::tr("Spark Store"));
|
|
||||||
dialog.setDescription(
|
|
||||||
QObject::tr(
|
|
||||||
"<span style=' font-size:10pt;font-weight:60;'>An appstore powered by community</span><br/>"
|
|
||||||
"<a href='https://www.spark-app.store/'>https://www.spark-app.store</a><br/>"
|
|
||||||
"<span style=' font-size:12pt;'>Spark developers</span>"));
|
|
||||||
|
|
||||||
dialog.setProductName(QLabel::tr("Spark Store"));
|
|
||||||
dialog.setCompanyLogo(QPixmap(":/spark-store.png"));
|
|
||||||
dialog.setWebsiteName(QObject::tr("The Spark Project"));
|
|
||||||
dialog.setWebsiteLink("https://gitee.com/deepin-community-store");
|
|
||||||
|
|
||||||
a.setOrganizationName("spark-union");
|
|
||||||
a.setProductName(QObject::tr("Spark Store"));
|
|
||||||
a.setApplicationName("Spark Store"); // 不用翻译,影响 ~/.local/share/spark-union 下文件夹名称
|
|
||||||
a.setApplicationDisplayName(QObject::tr("Spark Store")); // 设置窗口显示标题 (Wayland 下会显示 Qt 原生标题栏)
|
|
||||||
a.setWindowIcon(QIcon::fromTheme("spark-store"));
|
|
||||||
a.setApplicationDescription(
|
|
||||||
QObject::tr(
|
|
||||||
"<span style='font-size:10pt;font-weight:60;'>An appstore powered by deepin community</span><br/>"
|
|
||||||
"<a href='https://www.spark-app.store/'>https://www.spark-app.store</a><br/>"
|
|
||||||
"<span style='font-size:12pt;'>Spark developers</span><br/><br/>"
|
|
||||||
"Published under GPL V3"));
|
|
||||||
// 限制单实例运行
|
// 限制单实例运行
|
||||||
if (!a.setSingleInstance("spark-store"))
|
if (!a.setSingleInstance("spark-store"))
|
||||||
{
|
{
|
||||||
qDebug() << "The application is already running!";
|
qWarning() << "Another instance has already started, activating...";
|
||||||
QDBusInterface iface("com.gitee.spark.store",
|
|
||||||
"/com/gitee/spark/store",
|
|
||||||
"com.gitee.spark.store",
|
|
||||||
QDBusConnection::sessionBus());
|
|
||||||
|
|
||||||
QString arg1 = argv[1];
|
|
||||||
|
|
||||||
iface.asyncCall("activeWindow", arg1);
|
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
DGuiApplicationHelper::instance()->setPaletteType(DGuiApplicationHelper::LightType); // 固定主题为浅色主题
|
|
||||||
DApplicationSettings settings; // 定义 DApplicationSettings,自动保存主题设置
|
DApplicationSettings settings; // 定义 DApplicationSettings,自动保存主题设置
|
||||||
|
|
||||||
MainWindow w;
|
MainWindow w;
|
||||||
// 让打开时界面显示在正中
|
a.setMainWindow(&w); // 设置应用程序主窗口,用于初始化关于对话框
|
||||||
Dtk::Widget::moveToCenter(&w);
|
|
||||||
|
|
||||||
QString arg1 = argv[1];
|
if (argc > 1)
|
||||||
if (arg1.startsWith("spk://"))
|
|
||||||
{
|
{
|
||||||
w.openUrl(QUrl(argv[1]));
|
QString arg1 = argv[1];
|
||||||
|
if (arg1.trimmed().startsWith("spk://"))
|
||||||
|
{
|
||||||
|
w.openUrl(arg1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
w.show();
|
w.show();
|
||||||
w.setWindowTitle("Spark Store");
|
|
||||||
|
|
||||||
return a.exec();
|
return a.exec();
|
||||||
}
|
}
|
||||||
|
|||||||
510
src/mainwindow-dtk.cpp
Normal file → Executable file
@@ -1,58 +1,239 @@
|
|||||||
#include "mainwindow-dtk.h"
|
#include "mainwindow-dtk.h"
|
||||||
#include "ui_mainwindow-dtk.h"
|
#include "ui_mainwindow-dtk.h"
|
||||||
|
#include "utils/widgetanimation.h"
|
||||||
|
#include "widgets/common/progressbutton.h"
|
||||||
|
#include "widgets/downloadlistwidget.h"
|
||||||
|
#include "widgets/common/downloaditem.h"
|
||||||
|
#include "dbus/dbussparkstoreservice.h"
|
||||||
|
#include "application.h"
|
||||||
|
|
||||||
|
#include <DLabel>
|
||||||
#include <DWidgetUtil>
|
#include <DWidgetUtil>
|
||||||
#include <DGuiApplicationHelper>
|
#include <DGuiApplicationHelper>
|
||||||
#include <DApplicationSettings>
|
|
||||||
#include <QSizePolicy>
|
#include <QDesktopServices>
|
||||||
|
#include <QAbstractButton>
|
||||||
|
#include <QtConcurrent>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include <backend/ThemeChecker.h>
|
||||||
|
|
||||||
#define AppPageApplist 0
|
#define AppPageApplist 0
|
||||||
#define AppPageSearchlist 1
|
#define AppPageSearchlist 1
|
||||||
#define AppPageAppdetail 2
|
#define AppPageAppdetail 2
|
||||||
#define AppPageSettings 3
|
#define AppPageSettings 3
|
||||||
#define WaylandSearchCenter 1
|
#define UploadServerUrl "https://upload.deepinos.org.cn/"
|
||||||
#define OtherSearchCenter 2
|
|
||||||
#define RightSearchSpace 1
|
|
||||||
|
|
||||||
MainWindow::MainWindow(QWidget *parent)
|
MainWindow::MainWindow(QWidget *parent)
|
||||||
: BaseWidgetOpacity(parent), ui(new Ui::MainWindow)
|
: BaseWidgetOpacity(parent)
|
||||||
|
, ui(new Ui::MainWindow)
|
||||||
|
, downloadlistwidget(new DownloadListWidget)
|
||||||
|
, trayIcon(new QSystemTrayIcon(QIcon::fromTheme("spark-store"), this))
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
initConfig();
|
|
||||||
moveToCenter(this); // 让窗口居中显示
|
|
||||||
|
|
||||||
WidgetAnimation::widgetOpacity(this, true);
|
initUI();
|
||||||
|
initConnections();
|
||||||
|
|
||||||
|
initTmpDir();
|
||||||
|
|
||||||
downloadlistwidget = new DownloadListWidget;
|
|
||||||
downloadButton = new ProgressButton(ui->titlebar);
|
|
||||||
backButtom = new QPushButton(ui->titlebar);
|
|
||||||
ui->appintopage->setDownloadWidget(downloadlistwidget);
|
ui->appintopage->setDownloadWidget(downloadlistwidget);
|
||||||
ui->stackedWidget->setCurrentIndex(0);
|
}
|
||||||
ui->titlebar->setBackgroundTransparent(true);
|
|
||||||
// ui->titlebar->setSwitchThemeMenuVisible(false); // 去除 dtk 标题栏主题切换菜单
|
MainWindow::~MainWindow()
|
||||||
|
{
|
||||||
|
delete ui;
|
||||||
|
|
||||||
|
downloadlistwidget->deleteLater();
|
||||||
|
|
||||||
|
QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
|
||||||
|
config.setValue("window/width", width());
|
||||||
|
config.setValue("window/height", height());
|
||||||
|
config.sync();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::initDbus()
|
||||||
|
{
|
||||||
|
DBusSparkStoreService *dbusInter = new DBusSparkStoreService(this);
|
||||||
|
|
||||||
|
QDBusConnection::sessionBus().registerService("com.gitee.spark.store");
|
||||||
|
QDBusConnection::sessionBus().registerObject("/com/gitee/spark/store", "com.gitee.spark.store", this);
|
||||||
|
connect(dbusInter, &DBusSparkStoreService::sigOpenUrl, this, &MainWindow::onGetUrl);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::onGetUrl(const QString &url)
|
||||||
|
{
|
||||||
|
if (url.trimmed().startsWith("spk://"))
|
||||||
|
{
|
||||||
|
openUrl(url);
|
||||||
|
}
|
||||||
|
|
||||||
|
showWindowAnimation = false;
|
||||||
|
closeWindowAnimation = false;
|
||||||
|
|
||||||
|
setWindowState(windowState() & Qt::WindowActive);
|
||||||
|
activateWindow();
|
||||||
|
show();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::onNewProcessInstance(qint64 pid, const QStringList &arguments)
|
||||||
|
{
|
||||||
|
Q_UNUSED(pid)
|
||||||
|
|
||||||
|
onGetUrl(arguments.value(1, ""));
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::openUrl(const QString &url)
|
||||||
|
{
|
||||||
|
if (url.startsWith("spk://search/"))
|
||||||
|
{
|
||||||
|
QString keyword = url.mid(13);
|
||||||
|
if (keyword == "%")
|
||||||
|
{
|
||||||
|
qWarning() << "keyword '%' is not valid, which will cause QtWebEngine crash.";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ui->applistpage_1->getSearchList(keyword);
|
||||||
|
switchPage(AppPageSearchlist);
|
||||||
|
}
|
||||||
|
else if (url.startsWith("spk://"))
|
||||||
|
{
|
||||||
|
ui->appintopage->openUrl(QUrl::fromUserInput(url));
|
||||||
|
switchPage(AppPageAppdetail);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
QDesktopServices::openUrl(QUrl::fromUserInput(url));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool MainWindow::isCloseWindowAnimation()
|
||||||
|
{
|
||||||
|
return closeWindowAnimation;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::closeEvent(QCloseEvent *event)
|
||||||
|
{
|
||||||
|
// 判断下载任务数量,如果没有要下载的,就直接退出主程序
|
||||||
|
if(!downloadlistwidget->isDownloadInProcess()){
|
||||||
|
// 已经全部下载完成
|
||||||
|
qApp->quit();
|
||||||
|
}
|
||||||
|
|
||||||
|
BaseWidgetOpacity::closeEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::changeEvent(QEvent *event)
|
||||||
|
{
|
||||||
|
if (event->type() != QEvent::StyleChange) {
|
||||||
|
return BaseWidgetOpacity::changeEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
BaseWidgetOpacity::changeEvent(event);
|
||||||
|
downloadButton->setFixedSize(searchEdit->sizeHint().height(), searchEdit->sizeHint().height());
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::initUI()
|
||||||
|
{
|
||||||
|
QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
|
||||||
|
QSize size;
|
||||||
|
size.rwidth() = config.value("window/width").toInt();
|
||||||
|
size.rheight() = config.value("window/height").toInt();
|
||||||
|
if (!size.isEmpty()) {
|
||||||
|
resize(size);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 让打开时界面显示在正中
|
||||||
|
moveToCenter(this);
|
||||||
|
|
||||||
|
setWindowTitle(QObject::tr("Spark Store"));
|
||||||
setMaskAlpha(250);
|
setMaskAlpha(250);
|
||||||
|
|
||||||
|
initTitleBar();
|
||||||
|
initLeftMenu();
|
||||||
|
|
||||||
|
ui->stackedWidget->setCurrentIndex(0);
|
||||||
updateUi(0);
|
updateUi(0);
|
||||||
|
|
||||||
|
initTrayIcon();
|
||||||
|
|
||||||
|
refreshTheme(ThemeChecker::instance()->useDarkTheme());
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::initTitleBar()
|
||||||
|
{
|
||||||
|
ui->titlebar->setIcon(QIcon::fromTheme("spark-store"));
|
||||||
|
ui->titlebar->setBackgroundTransparent(true);
|
||||||
|
|
||||||
|
// 初始化标题栏控件
|
||||||
|
DLabel *titleLabel = new DLabel(ui->titlebar);
|
||||||
|
titleLabel->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
|
||||||
|
titleLabel->setText(tr("Spark Store"));
|
||||||
|
|
||||||
|
backButton = new DPushButton(ui->titlebar);
|
||||||
|
|
||||||
|
searchEdit = new DSearchEdit(ui->titlebar);
|
||||||
|
searchEdit->setPlaceholderText(tr("Search or enter spk://"));
|
||||||
|
searchEdit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
|
||||||
|
searchEdit->lineEdit()->setFixedWidth(350);
|
||||||
|
|
||||||
|
downloadButton = new ProgressButton(ui->titlebar);
|
||||||
|
downloadButton->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
|
||||||
|
downloadButton->setDownloadListWidget(downloadlistwidget);
|
||||||
|
downloadButton->setFocusPolicy(Qt::FocusPolicy::ClickFocus);
|
||||||
|
downloadButton->setFixedSize(searchEdit->sizeHint().height(), searchEdit->sizeHint().height());
|
||||||
|
downloadlistwidget->setFocusProxy(downloadButton);
|
||||||
|
|
||||||
|
QWidget *customWidget = new QWidget(ui->titlebar);
|
||||||
|
customWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
|
||||||
|
ui->titlebar->setCustomWidget(customWidget);
|
||||||
|
|
||||||
|
QHBoxLayout *customWidgetLayout = new QHBoxLayout(customWidget);
|
||||||
|
customWidgetLayout->setContentsMargins(8, 0, 0, 0);
|
||||||
|
customWidgetLayout->setSpacing(0);
|
||||||
|
customWidgetLayout->addWidget(titleLabel, 0, Qt::AlignLeft);
|
||||||
|
customWidgetLayout->addSpacing(8);
|
||||||
|
customWidgetLayout->addWidget(backButton, 0, Qt::AlignLeft);
|
||||||
|
QWidget *centralWidget = new QWidget(customWidget);
|
||||||
|
centralWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
|
||||||
|
customWidgetLayout->addWidget(centralWidget, 1, Qt::AlignHCenter);
|
||||||
|
|
||||||
|
QHBoxLayout *centralLayout = new QHBoxLayout(centralWidget);
|
||||||
|
centralLayout->setContentsMargins(20, 0, 10, 0);
|
||||||
|
centralLayout->setSpacing(0);
|
||||||
|
|
||||||
|
centralLayout->addWidget(searchEdit, 0, Qt::AlignHCenter);
|
||||||
|
centralLayout->addSpacing(10);
|
||||||
|
centralLayout->addWidget(downloadButton, 0, Qt::AlignHCenter);
|
||||||
|
|
||||||
|
initTitleBarMenu();
|
||||||
|
|
||||||
|
backButton->setDisabled(true);
|
||||||
|
downloadlistwidget->hide();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::initTitleBarMenu()
|
||||||
|
{
|
||||||
QAction *actionSubmission = new QAction(tr("Submit App"), this);
|
QAction *actionSubmission = new QAction(tr("Submit App"), this);
|
||||||
QAction *actionSubmissionWithClient = new QAction(tr("Submit App with client(Recommanded)"), this);
|
QAction *actionSubmissionWithClient = new QAction(tr("Submit App with client(Recommanded)"), this);
|
||||||
QAction *setting = new QAction(tr("Settings"));
|
QAction *setting = new QAction(tr("Settings"));
|
||||||
QAction *upgrade = new QAction(tr("APP Upgrade and Install Settings"));
|
QAction *upgrade = new QAction(tr("APP Upgrade and Install Settings"));
|
||||||
QMenu *menu = new QMenu;
|
QMenu *menu = new QMenu(ui->titlebar);
|
||||||
menu->addAction(setting);
|
menu->addAction(setting);
|
||||||
menu->addAction(upgrade);
|
menu->addAction(upgrade);
|
||||||
menu->addAction(actionSubmission);
|
menu->addAction(actionSubmission);
|
||||||
menu->addAction(actionSubmissionWithClient);
|
menu->addAction(actionSubmissionWithClient);
|
||||||
|
|
||||||
ui->titlebar->setMenu(menu);
|
ui->titlebar->setMenu(menu);
|
||||||
|
|
||||||
connect(actionSubmission, &QAction::triggered, this, [=]
|
connect(actionSubmission, &QAction::triggered, this, [=]
|
||||||
{ QDesktopServices::openUrl(QUrl("https://upload.deepinos.org/")); });
|
{ QDesktopServices::openUrl(QUrl(UploadServerUrl)); });
|
||||||
connect(setting, &QAction::triggered, this, [=]
|
connect(setting, &QAction::triggered, this, [=]
|
||||||
{
|
{
|
||||||
switchPage(AppPageSettings);
|
switchPage(AppPageSettings);
|
||||||
ui->settingspage->updateUI(); });
|
ui->settingspage->updateUI(); });
|
||||||
connect(upgrade, &QAction::triggered, this, [=]
|
connect(upgrade, &QAction::triggered, this, [=]
|
||||||
{ QProcess::startDetached("/opt/durapps/spark-store/bin/update-upgrade/ss-update-controler.sh"); });
|
{ QProcess::startDetached("/opt/durapps/spark-store/bin/update-upgrade/ss-update-controler.sh", QStringList()); });
|
||||||
// 投稿器
|
// 投稿器
|
||||||
connect(actionSubmissionWithClient, &QAction::triggered, this, [=]
|
connect(actionSubmissionWithClient, &QAction::triggered, this, [=]
|
||||||
{
|
{
|
||||||
@@ -61,24 +242,68 @@ MainWindow::MainWindow(QWidget *parent)
|
|||||||
if (actionSubmissionClientStatus.exists())
|
if (actionSubmissionClientStatus.exists())
|
||||||
{
|
{
|
||||||
qDebug() << "投稿器存在";
|
qDebug() << "投稿器存在";
|
||||||
QProcess::startDetached("/opt/spark-store-submitter/bin/spark-store-submitter");
|
QProcess::startDetached("/opt/spark-store-submitter/bin/spark-store-submitter", QStringList());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
qDebug() << "投稿器不存在,跳转页面";
|
qDebug() << "投稿器不存在,跳转页面";
|
||||||
openUrl(submitterSpk);
|
openUrl(submitterSpk);
|
||||||
} });
|
} });
|
||||||
|
}
|
||||||
|
|
||||||
// 主题切换
|
void MainWindow::initLeftMenu()
|
||||||
connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, this, [=](DGuiApplicationHelper::ColorType themeType)
|
{
|
||||||
|
// 侧边栏按钮
|
||||||
|
foreach (QAbstractButton *button, ui->buttonGroup->buttons())
|
||||||
{
|
{
|
||||||
if (themeType == DGuiApplicationHelper::DarkType) {
|
button->setStyleSheet("QPushButton{qproperty-icon: url(data/images/userMangaer/teacher.png);}");
|
||||||
|
connect(button, &QPushButton::toggled, [=](bool checked)
|
||||||
|
{
|
||||||
|
if (checked == true) {
|
||||||
|
searchEdit->clearEdit();
|
||||||
|
updateUi(ui->buttonGroup->buttons().indexOf(button));
|
||||||
|
} });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::initTrayIcon()
|
||||||
|
{
|
||||||
|
trayIcon->setToolTip(tr("Spark Store"));
|
||||||
|
|
||||||
|
QMenu *menu = new QMenu(this);
|
||||||
|
QAction *showAction = new QAction(QObject::tr("Show MainWindow"), menu);
|
||||||
|
QAction *aboutAction = new QAction(qApp->translate("TitleBarMenu", "About"), menu);
|
||||||
|
QAction *exitAction = new QAction(qApp->translate("TitleBarMenu", "Exit"), menu);
|
||||||
|
menu->addAction(showAction);
|
||||||
|
menu->addAction(aboutAction);
|
||||||
|
menu->addAction(exitAction);
|
||||||
|
trayIcon->setContextMenu(menu);
|
||||||
|
|
||||||
|
connect(showAction, &QAction::triggered, this, [=]()
|
||||||
|
{
|
||||||
|
showWindowAnimation = false;
|
||||||
|
closeWindowAnimation = false;
|
||||||
|
|
||||||
|
setWindowState(windowState() & Qt::WindowActive);
|
||||||
|
activateWindow();
|
||||||
|
show(); });
|
||||||
|
connect(aboutAction, &QAction::triggered, this, [=]()
|
||||||
|
{
|
||||||
|
qobject_cast<Application *>(qApp)->handleAboutAction(); });
|
||||||
|
connect(exitAction, &QAction::triggered, this, [=]()
|
||||||
|
{
|
||||||
|
qobject_cast<Application *>(qApp)->quit(); });
|
||||||
|
|
||||||
|
trayIcon->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainWindow::refreshTheme(bool isDarkMode)
|
||||||
|
{
|
||||||
|
// 使用isDarkMode变量来判断是否是深色模式
|
||||||
|
if (isDarkMode) {
|
||||||
//深色模式
|
//深色模式
|
||||||
setMaskColor(QColor("#2a2b2b"));
|
setMaskColor(QColor("#2a2b2b"));
|
||||||
this->setStyleSheet("#mainpage{background-color: transparent;border-radius:14px;}\
|
backButton->setIcon(QIcon(":/icon/dark/back.svg"));
|
||||||
QLabel#cardtitle,QLabel#title,QLabel#title_1,QLabel#title_2,QLabel#title_3 {color:#FFFFFF}\
|
|
||||||
");
|
|
||||||
backButtom->setIcon(QIcon(":/icon/dark/back.svg"));
|
|
||||||
downloadButton->setIcon(":/icon/dark/download.svg");
|
downloadButton->setIcon(":/icon/dark/download.svg");
|
||||||
downloadButton->setBackgroundColor(QColor("#444444"));
|
downloadButton->setBackgroundColor(QColor("#444444"));
|
||||||
downloadButton->setColor(QColor("#66CCFF"));
|
downloadButton->setColor(QColor("#66CCFF"));
|
||||||
@@ -98,10 +323,7 @@ MainWindow::MainWindow(QWidget *parent)
|
|||||||
} else {
|
} else {
|
||||||
//亮色模式
|
//亮色模式
|
||||||
setMaskColor(QColor("#f3f7f8"));
|
setMaskColor(QColor("#f3f7f8"));
|
||||||
this->setStyleSheet("#mainpage{background-color: transparent;border-radius:14px;}\
|
backButton->setIcon(QIcon(":/icon/light/back.svg"));
|
||||||
QLabel#cardtitle,QLabel#title,QLabel#title_1,QLabel#title_2,QLabel#title_3 {color:#000000}\
|
|
||||||
");
|
|
||||||
backButtom->setIcon(QIcon(":/icon/light/back.svg"));
|
|
||||||
downloadButton->setBackgroundColor(QColor("#e3e4e4"));
|
downloadButton->setBackgroundColor(QColor("#e3e4e4"));
|
||||||
downloadButton->setColor(QColor("#66CCFF"));
|
downloadButton->setColor(QColor("#66CCFF"));
|
||||||
downloadButton->setIcon(":/icon/light/download.svg");
|
downloadButton->setIcon(":/icon/light/download.svg");
|
||||||
@@ -120,19 +342,16 @@ MainWindow::MainWindow(QWidget *parent)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
ui->pushButton_14->setStyleSheet(ui->pushButton_4->styleSheet());
|
ui->pushButton_14->setStyleSheet(ui->pushButton_4->styleSheet());
|
||||||
ui->applistpage->setTheme(themeType == DGuiApplicationHelper::DarkType);
|
ui->applistpage->setTheme(isDarkMode);
|
||||||
ui->applistpage_1->setTheme(themeType == DGuiApplicationHelper::DarkType);
|
ui->applistpage_1->setTheme(isDarkMode);
|
||||||
ui->appintopage->setTheme(themeType == DGuiApplicationHelper::DarkType);
|
ui->appintopage->setTheme(isDarkMode);
|
||||||
ui->settingspage->setTheme(themeType == DGuiApplicationHelper::DarkType); });
|
ui->settingspage->setTheme(isDarkMode);
|
||||||
|
}
|
||||||
|
|
||||||
// 初始化标题栏控件
|
void MainWindow::initConnections()
|
||||||
connect(downloadButton, &ProgressButton::clicked, [=]()
|
{
|
||||||
{
|
// 主题切换
|
||||||
QPoint pos;
|
connect(ThemeChecker::instance(), &ThemeChecker::themeChanged, this, &MainWindow::refreshTheme);
|
||||||
pos.setX(downloadButton->mapToGlobal(QPoint(0, 0)).x() + downloadButton->width() / 2 - downloadlistwidget->width() / 2);
|
|
||||||
pos.setY(downloadButton->mapToGlobal(QPoint(0, 0)).y() + downloadButton->height() + 5);
|
|
||||||
downloadlistwidget->m_move(pos.x(), pos.y());
|
|
||||||
downloadlistwidget->show(); });
|
|
||||||
|
|
||||||
// appintopage按下下载按钮时标题栏下载列表按钮抖动
|
// appintopage按下下载按钮时标题栏下载列表按钮抖动
|
||||||
connect(ui->appintopage, &AppIntoPage::clickedDownloadBtn, [=]()
|
connect(ui->appintopage, &AppIntoPage::clickedDownloadBtn, [=]()
|
||||||
@@ -140,58 +359,15 @@ MainWindow::MainWindow(QWidget *parent)
|
|||||||
WidgetAnimation::widgetShake(downloadButton, 6); // 第一个参数是抖动的控件,第二个参数是抖动范围(像素)
|
WidgetAnimation::widgetShake(downloadButton, 6); // 第一个参数是抖动的控件,第二个参数是抖动范围(像素)
|
||||||
});
|
});
|
||||||
|
|
||||||
connect(backButtom, &QPushButton::clicked, [=]()
|
connect(backButton, &QPushButton::clicked, [=]()
|
||||||
{
|
{
|
||||||
ui->stackedWidget->setCurrentIndex(pageHistory.at(pageHistory.count() - 2));
|
ui->stackedWidget->setCurrentIndex(pageHistory.at(pageHistory.count() - 2));
|
||||||
pageHistory.removeLast();
|
pageHistory.removeLast();
|
||||||
if (pageHistory.count() > 1) {
|
if (pageHistory.count() > 1) {
|
||||||
backButtom->show();
|
backButton->setEnabled(true);
|
||||||
} else {
|
} else {
|
||||||
backButtom->hide();
|
backButton->setDisabled(true);
|
||||||
} });
|
} });
|
||||||
downloadlistwidget->hide();
|
|
||||||
backButtom->hide();
|
|
||||||
ui->titlebar->setIcon(QIcon::fromTheme(":/icon/logo.svg"));
|
|
||||||
|
|
||||||
// Check wayland configs
|
|
||||||
QSettings readConfig(QDir::homePath() + "/.config/spark-store/config.ini", QSettings::IniFormat);
|
|
||||||
|
|
||||||
QWidget *w_titlebar = new QWidget(ui->titlebar);
|
|
||||||
QHBoxLayout *ly_titlebar = new QHBoxLayout(w_titlebar);
|
|
||||||
QLabel *title = new QLabel(this);
|
|
||||||
title->setText(tr("Spark Store"));
|
|
||||||
searchEdit->setPlaceholderText(tr("Search or enter spk://"));
|
|
||||||
ly_titlebar->addWidget(title);
|
|
||||||
ly_titlebar->addWidget(backButtom);
|
|
||||||
|
|
||||||
if (!readConfig.value("build/isDeepinOS").toBool() && readConfig.value("build/useWayland").toBool())
|
|
||||||
{
|
|
||||||
// Wayland 搜索栏居中
|
|
||||||
ly_titlebar->addStretch(WaylandSearchCenter);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// dwayland dxcb 搜索栏顶部右侧居中
|
|
||||||
ly_titlebar->addStretch(OtherSearchCenter);
|
|
||||||
}
|
|
||||||
|
|
||||||
ly_titlebar->addWidget(searchEdit);
|
|
||||||
ly_titlebar->addWidget(downloadButton);
|
|
||||||
ly_titlebar->addStretch(RightSearchSpace);
|
|
||||||
ui->titlebar->setCustomWidget(w_titlebar);
|
|
||||||
// 侧边栏按钮
|
|
||||||
int i = 0;
|
|
||||||
while (i < ui->buttonGroup->buttons().size())
|
|
||||||
{
|
|
||||||
ui->buttonGroup->buttons()[i]->setStyleSheet("QPushButton{qproperty-icon: url(data/images/userMangaer/teacher.png);}");
|
|
||||||
connect(ui->buttonGroup->buttons()[i], &QPushButton::toggled, [=](bool checked)
|
|
||||||
{
|
|
||||||
if (checked == true) {
|
|
||||||
searchEdit->clearEdit();
|
|
||||||
updateUi(i);
|
|
||||||
} });
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 搜索事件
|
// 搜索事件
|
||||||
connect(searchEdit, &DSearchEdit::returnPressed, this, [=]()
|
connect(searchEdit, &DSearchEdit::returnPressed, this, [=]()
|
||||||
@@ -199,72 +375,81 @@ MainWindow::MainWindow(QWidget *parent)
|
|||||||
QString searchtext = searchEdit->text();
|
QString searchtext = searchEdit->text();
|
||||||
if (!searchtext.isEmpty()) {
|
if (!searchtext.isEmpty()) {
|
||||||
if (searchtext.startsWith("spk://")) {
|
if (searchtext.startsWith("spk://")) {
|
||||||
openUrl(QUrl(searchtext));
|
openUrl(searchtext);
|
||||||
searchEdit->clearEdit();
|
searchEdit->clearEdit();
|
||||||
} else {
|
} else {
|
||||||
|
if (searchtext == "%")
|
||||||
|
{
|
||||||
|
qWarning() << "keyword '%' matches too many results, which will cause QtWebEngine crash.";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
ui->applistpage_1->getSearchList(searchtext);
|
ui->applistpage_1->getSearchList(searchtext);
|
||||||
switchPage(AppPageSearchlist);
|
switchPage(AppPageSearchlist);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
this->setFocus(); });
|
this->setFocus(); });
|
||||||
|
|
||||||
connect(downloadlistwidget, &DownloadListWidget::downloadProgress, this, [=](int i)
|
connect(downloadlistwidget, &DownloadListWidget::downloadProgress, this, [=](int i)
|
||||||
{ downloadButton->setProgress(i); });
|
{ downloadButton->setProgress(i); });
|
||||||
// 列表点击事件
|
// 列表点击事件
|
||||||
connect(ui->applistpage, &AppListPage::clicked, this, [=](QUrl spk)
|
connect(ui->applistpage, &AppListPage::clicked, this, [=](QUrl spk)
|
||||||
{ openUrl(spk); });
|
{ openUrl(spk.toString()); });
|
||||||
connect(ui->applistpage_1, &AppListPage::clicked, this, [=](QUrl spk)
|
connect(ui->applistpage_1, &AppListPage::clicked, this, [=](QUrl spk)
|
||||||
{ openUrl(spk); });
|
{ openUrl(spk.toString()); });
|
||||||
connect(ui->settingspage, &SettingsPage::openUrl, this, [=](QUrl spk)
|
connect(ui->settingspage, &SettingsPage::openUrl, this, [=](QUrl spk)
|
||||||
{ openUrl(spk); });
|
{ openUrl(spk.toString()); });
|
||||||
emit DGuiApplicationHelper::instance()->themeTypeChanged(DGuiApplicationHelper::instance()->themeType());
|
|
||||||
|
|
||||||
initDbus();
|
// 托盘图标点击事件
|
||||||
}
|
connect(trayIcon, &QSystemTrayIcon::activated, this, [=](QSystemTrayIcon::ActivationReason reason)
|
||||||
|
|
||||||
MainWindow::~MainWindow()
|
|
||||||
{
|
|
||||||
delete searchEdit;
|
|
||||||
delete downloadlistwidget;
|
|
||||||
delete ui;
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::initDbus()
|
|
||||||
{
|
|
||||||
DBusSparkStoreService *dbusInter = new DBusSparkStoreService(this);
|
|
||||||
|
|
||||||
QDBusConnection::sessionBus().registerService("com.gitee.spark.store");
|
|
||||||
QDBusConnection::sessionBus().registerObject("/com/gitee/spark/store", "com.gitee.spark.store", this);
|
|
||||||
connect(dbusInter, &DBusSparkStoreService::sigOpenUrl, this, &MainWindow::onGetUrl);
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::onGetUrl(const QString &url)
|
|
||||||
{
|
|
||||||
if (url.left(6) == "spk://")
|
|
||||||
{
|
{
|
||||||
openUrl(QUrl(url));
|
switch (reason) {
|
||||||
}
|
case QSystemTrayIcon::Trigger:
|
||||||
|
{
|
||||||
|
showWindowAnimation = false;
|
||||||
|
closeWindowAnimation = false;
|
||||||
|
|
||||||
|
setWindowState(windowState() & Qt::WindowActive);
|
||||||
activateWindow();
|
activateWindow();
|
||||||
|
show();
|
||||||
|
|
||||||
|
Q_FALLTHROUGH();
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
} });
|
||||||
|
|
||||||
|
connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::newProcessInstance, this, &MainWindow::onNewProcessInstance);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::openUrl(QUrl url)
|
void MainWindow::initTmpDir()
|
||||||
{
|
|
||||||
if (url.toString().startsWith("spk://"))
|
|
||||||
{
|
|
||||||
ui->appintopage->openUrl(QUrl(url.toString().replace("+", "%2B")));
|
|
||||||
switchPage(AppPageAppdetail);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
QDesktopServices::openUrl(QUrl(url.toString().replace("+", "%2B")));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::initConfig()
|
|
||||||
{
|
{
|
||||||
// 新建临时文件夹
|
// 新建临时文件夹
|
||||||
QDir dir;
|
QDir dir;
|
||||||
dir.mkpath("/tmp/spark-store");
|
dir.mkpath("/tmp/spark-store");
|
||||||
|
|
||||||
|
// 检查写入权限
|
||||||
|
QFileInfo info("/tmp/spark-store");
|
||||||
|
|
||||||
|
if (info.isWritable() == false)
|
||||||
|
{
|
||||||
|
QtConcurrent::run([=]
|
||||||
|
{
|
||||||
|
sleep(3);
|
||||||
|
auto upgradeP = new QProcess();
|
||||||
|
upgradeP->startDetached("zenity", QStringList() << "--warning"
|
||||||
|
<< "--text"
|
||||||
|
<< "用户未拥有 /tmp/spark-store 写入权限,星火商店会因此工作异常,请检查!"
|
||||||
|
<< "--title"
|
||||||
|
<< "权限受限提示"
|
||||||
|
<< "--width"
|
||||||
|
<< "360"
|
||||||
|
);
|
||||||
|
upgradeP->waitForStarted();
|
||||||
|
upgradeP->waitForFinished(30);
|
||||||
|
upgradeP->deleteLater(); });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::switchPage(int now) // 临时方案,回家后修改
|
void MainWindow::switchPage(int now) // 临时方案,回家后修改
|
||||||
@@ -272,13 +457,14 @@ void MainWindow::switchPage(int now) // 临时方案,回家后修改
|
|||||||
qDebug() << pageHistory.count();
|
qDebug() << pageHistory.count();
|
||||||
if (pageHistory.count() >= 1)
|
if (pageHistory.count() >= 1)
|
||||||
{
|
{
|
||||||
backButtom->show();
|
backButton->setEnabled(true);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
backButtom->hide();
|
backButton->setDisabled(true);
|
||||||
}
|
}
|
||||||
ui->stackedWidget->setCurrentIndex(now);
|
ui->stackedWidget->setCurrentIndex(now);
|
||||||
|
ui->stackedWidget->currentWidget()->setFocus();
|
||||||
pageHistory << now;
|
pageHistory << now;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -305,17 +491,73 @@ void MainWindow::updateUi(int now)
|
|||||||
switchPage(AppPageApplist);
|
switchPage(AppPageApplist);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWindow::notify(QObject *receiver, QEvent *event)
|
||||||
|
{
|
||||||
|
if (!receiver) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Dtk::Widget::DStyle *o_ptr = qobject_cast<Dtk::Widget::DStyle *>(receiver);
|
||||||
|
if (o_ptr) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (receiver->inherits("QWidgetWindow")
|
||||||
|
|| receiver->inherits("QStyleSheetStyle")) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event->type() == QEvent::FocusIn) {
|
||||||
|
QList<QObject *> list = downloadButton->findChildren<QObject *>(QString(), Qt::FindChildrenRecursively);
|
||||||
|
list << downloadlistwidget->findChildren<QObject *>(QString(), Qt::FindChildrenRecursively);
|
||||||
|
if (receiver != downloadButton && receiver != downloadlistwidget && !list.contains(receiver)) {
|
||||||
|
downloadlistwidget->hide();
|
||||||
|
}
|
||||||
|
} else if (event->type() == QEvent::FocusOut) {
|
||||||
|
if (!downloadlistwidget->isActiveWindow() && !isActiveWindow()) {
|
||||||
|
downloadlistwidget->hide();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void MainWindow::on_pushButton_14_clicked()
|
void MainWindow::on_pushButton_14_clicked()
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* NOTE: No need to judget developmode status
|
||||||
|
*/
|
||||||
|
// Check UOS
|
||||||
|
// QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
|
||||||
|
// if (config.contains("UOS/EnableDeveloperMode") && !config.value("UOS/EnableDeveloperMode").toBool())
|
||||||
|
if (false)
|
||||||
|
{
|
||||||
|
qDebug() << "UOS Developer Mode has not been enabled!";
|
||||||
|
QtConcurrent::run([=]
|
||||||
|
{
|
||||||
|
auto upgradeP = new QProcess();
|
||||||
|
upgradeP->startDetached("zenity", QStringList() << "--info"
|
||||||
|
<< "--text"
|
||||||
|
<< "UOS开发者模式未开启,相关功能被禁用"
|
||||||
|
<< "--title"
|
||||||
|
<< "功能禁用提示"
|
||||||
|
<< "--width"
|
||||||
|
<< "360"
|
||||||
|
);
|
||||||
|
upgradeP->waitForStarted();
|
||||||
|
upgradeP->waitForFinished(30);
|
||||||
|
upgradeP->deleteLater(); });
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
QFile upgradeStatus("/tmp/spark-store/upgradeStatus.txt");
|
QFile upgradeStatus("/tmp/spark-store/upgradeStatus.txt");
|
||||||
if (!upgradeStatus.exists())
|
if (!upgradeStatus.exists())
|
||||||
{
|
{
|
||||||
QtConcurrent::run([=]
|
QtConcurrent::run([=]
|
||||||
{
|
{
|
||||||
auto upgradeP = new QProcess();
|
auto upgradeP = new QProcess();
|
||||||
upgradeP->startDetached("/opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade.sh");
|
upgradeP->startDetached("/opt/durapps/spark-store/bin/update-upgrade/ss-do-upgrade.sh", QStringList());
|
||||||
upgradeP->waitForStarted();
|
upgradeP->waitForStarted();
|
||||||
upgradeP->waitForFinished(-1);
|
upgradeP->waitForFinished(-1);
|
||||||
upgradeP->deleteLater(); });
|
upgradeP->deleteLater(); });
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
57
src/mainwindow-dtk.h
Normal file → Executable file
@@ -1,21 +1,15 @@
|
|||||||
#ifndef MAINWINDOWDTK_H
|
#ifndef MAINWINDOWDTK_H
|
||||||
#define MAINWINDOWDTK_H
|
#define MAINWINDOWDTK_H
|
||||||
|
|
||||||
|
#include "widgets/base/basewidgetopacity.h"
|
||||||
|
|
||||||
#include <DMainWindow>
|
#include <DMainWindow>
|
||||||
#include <DTitlebar>
|
#include <DTitlebar>
|
||||||
|
#include <DPushButton>
|
||||||
#include <DSearchEdit>
|
#include <DSearchEdit>
|
||||||
#include <QGraphicsDropShadowEffect>
|
|
||||||
#include <DGuiApplicationHelper>
|
#include <DGuiApplicationHelper>
|
||||||
|
|
||||||
#include <QPushButton>
|
#include <QSystemTrayIcon>
|
||||||
#include <QDir>
|
|
||||||
#include <QDesktopServices>
|
|
||||||
|
|
||||||
#include "widgets/base/basewidgetopacity.h"
|
|
||||||
#include "widgets/downloadlistwidget.h"
|
|
||||||
#include "widgets/common/progressbutton.h"
|
|
||||||
#include "utils/widgetanimation.h"
|
|
||||||
#include "dbus/dbussparkstoreservice.h"
|
|
||||||
|
|
||||||
DWIDGET_USE_NAMESPACE
|
DWIDGET_USE_NAMESPACE
|
||||||
|
|
||||||
@@ -23,36 +17,57 @@ namespace Ui {
|
|||||||
class MainWindow;
|
class MainWindow;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class ProgressButton;
|
||||||
|
class DownloadListWidget;
|
||||||
class MainWindow : public BaseWidgetOpacity
|
class MainWindow : public BaseWidgetOpacity
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit MainWindow(QWidget *parent = nullptr);
|
explicit MainWindow(QWidget *parent = nullptr);
|
||||||
~MainWindow();
|
~MainWindow() override;
|
||||||
|
|
||||||
void openUrl(QUrl);
|
void openUrl(const QString &url);
|
||||||
|
|
||||||
|
bool isCloseWindowAnimation();
|
||||||
|
Q_INVOKABLE void refreshTheme(bool isDarkMode);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void closeEvent(QCloseEvent *event) override;
|
||||||
|
void changeEvent(QEvent *event) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void initUI();
|
||||||
|
void initTitleBar();
|
||||||
|
void initTitleBarMenu();
|
||||||
|
void initLeftMenu();
|
||||||
|
void initTrayIcon();
|
||||||
|
void initConnections();
|
||||||
void initDbus();
|
void initDbus();
|
||||||
void initConfig();
|
void initTmpDir();
|
||||||
void switchPage(int now);
|
void switchPage(int now);
|
||||||
void updateUi(int now);
|
void updateUi(int now);
|
||||||
|
|
||||||
private:
|
public slots:
|
||||||
QList<int> pageHistory;
|
void notify(QObject *receiver, QEvent *event);
|
||||||
|
|
||||||
DownloadListWidget *downloadlistwidget;
|
|
||||||
ProgressButton *downloadButton;
|
|
||||||
QPushButton *backButtom;
|
|
||||||
DSearchEdit *searchEdit = new DSearchEdit;
|
|
||||||
Ui::MainWindow *ui;
|
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
//接受来自dbus的url
|
//接受来自dbus的url
|
||||||
void onGetUrl(const QString &url);
|
void onGetUrl(const QString &url);
|
||||||
|
void onNewProcessInstance(qint64 pid, const QStringList &arguments);
|
||||||
void on_pushButton_14_clicked();
|
void on_pushButton_14_clicked();
|
||||||
|
|
||||||
|
private:
|
||||||
|
Ui::MainWindow *ui;
|
||||||
|
|
||||||
|
DPushButton *backButton;
|
||||||
|
DSearchEdit *searchEdit;
|
||||||
|
ProgressButton *downloadButton;
|
||||||
|
DownloadListWidget *downloadlistwidget;
|
||||||
|
|
||||||
|
QSystemTrayIcon *trayIcon = nullptr;
|
||||||
|
|
||||||
|
QList<int> pageHistory;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // MAINWINDOWDTK_H
|
#endif // MAINWINDOWDTK_H
|
||||||
|
|||||||
@@ -7,53 +7,16 @@
|
|||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>1190</width>
|
<width>1190</width>
|
||||||
<height>651</height>
|
<height>656</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
<string>MainWindow</string>
|
<string>MainWindow</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QGridLayout" name="gridLayout">
|
<layout class="QVBoxLayout" name="m_mainWindowLayout">
|
||||||
<property name="leftMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="topMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="rightMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="bottomMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="spacing">
|
<property name="spacing">
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<item row="1" column="1">
|
|
||||||
<widget class="QWidget" name="mainpage" native="true">
|
|
||||||
<property name="autoFillBackground">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<layout class="QGridLayout" name="gridLayout_2">
|
|
||||||
<property name="leftMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="topMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="rightMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="bottomMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<item row="0" column="0">
|
|
||||||
<widget class="QStackedWidget" name="stackedWidget">
|
|
||||||
<property name="currentIndex">
|
|
||||||
<number>3</number>
|
|
||||||
</property>
|
|
||||||
<widget class="QWidget" name="page_1">
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
|
||||||
<property name="leftMargin">
|
<property name="leftMargin">
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
@@ -67,12 +30,53 @@
|
|||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<widget class="AppListPage" name="applistpage" native="true"/>
|
<widget class="DTitlebar" name="titlebar" native="true">
|
||||||
</item>
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>0</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>16777215</width>
|
||||||
|
<height>16777215</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||||
|
<property name="leftMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QWidget" name="page_3">
|
</item>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_3">
|
<item>
|
||||||
|
<widget class="QWidget" name="centralWidget" native="true">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<layout class="QHBoxLayout" name="m_centralLayout">
|
||||||
|
<property name="spacing">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
<property name="leftMargin">
|
<property name="leftMargin">
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
@@ -86,54 +90,6 @@
|
|||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<widget class="AppListPage" name="applistpage_1" native="true"/>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
<widget class="QWidget" name="page_2">
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_4">
|
|
||||||
<property name="leftMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="topMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="rightMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="bottomMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<item>
|
|
||||||
<widget class="AppIntoPage" name="appintopage" native="true"/>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
<widget class="QWidget" name="page_4">
|
|
||||||
<layout class="QGridLayout" name="gridLayout_3">
|
|
||||||
<property name="leftMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="topMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="rightMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<property name="bottomMargin">
|
|
||||||
<number>0</number>
|
|
||||||
</property>
|
|
||||||
<item row="0" column="0">
|
|
||||||
<widget class="SettingsPage" name="settingspage" native="true"/>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item row="1" column="0">
|
|
||||||
<widget class="QWidget" name="leftbar" native="true">
|
<widget class="QWidget" name="leftbar" native="true">
|
||||||
<property name="minimumSize">
|
<property name="minimumSize">
|
||||||
<size>
|
<size>
|
||||||
@@ -562,21 +518,18 @@
|
|||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="0" column="0" colspan="2">
|
<item>
|
||||||
<widget class="DTitlebar" name="titlebar" native="true">
|
<widget class="QWidget" name="mainpage" native="true">
|
||||||
<property name="minimumSize">
|
<property name="autoFillBackground">
|
||||||
<size>
|
<bool>false</bool>
|
||||||
<width>0</width>
|
|
||||||
<height>50</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
</property>
|
||||||
<property name="maximumSize">
|
<property name="styleSheet">
|
||||||
<size>
|
<string notr="true">.QWidget#mainpage {
|
||||||
<width>16777215</width>
|
background: transparent;
|
||||||
<height>50</height>
|
border-radius: 14px;
|
||||||
</size>
|
}</string>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
<layout class="QGridLayout" name="gridLayout_2">
|
||||||
<property name="leftMargin">
|
<property name="leftMargin">
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
@@ -589,6 +542,92 @@
|
|||||||
<property name="bottomMargin">
|
<property name="bottomMargin">
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="QStackedWidget" name="stackedWidget">
|
||||||
|
<property name="currentIndex">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<widget class="QWidget" name="page_1">
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||||
|
<property name="leftMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<widget class="AppListPage" name="applistpage" native="true"/>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<widget class="QWidget" name="page_3">
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_3">
|
||||||
|
<property name="leftMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<widget class="AppListPage" name="applistpage_1" native="true"/>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<widget class="QWidget" name="page_2">
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_4">
|
||||||
|
<property name="leftMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<widget class="AppIntoPage" name="appintopage" native="true"/>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<widget class="QWidget" name="page_4">
|
||||||
|
<layout class="QGridLayout" name="gridLayout_3">
|
||||||
|
<property name="leftMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="rightMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<property name="bottomMargin">
|
||||||
|
<number>0</number>
|
||||||
|
</property>
|
||||||
|
<item row="0" column="0">
|
||||||
|
<widget class="SettingsPage" name="settingspage" native="true"/>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
</layout>
|
</layout>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
|||||||
@@ -1,83 +1,48 @@
|
|||||||
#include "appintopage.h"
|
#include "appintopage.h"
|
||||||
#include "ui_appintopage.h"
|
#include "ui_appintopage.h"
|
||||||
AppIntoPage::AppIntoPage(QWidget *parent) : QWidget(parent),
|
#include "backend/sparkapi.h"
|
||||||
ui(new Ui::AppIntoPage)
|
#include "widgets/downloadlistwidget.h"
|
||||||
|
#include "widgets/common/downloaditem.h"
|
||||||
|
#include "backend/image_show.h"
|
||||||
|
#include "application.h"
|
||||||
|
#include "utils/utils.h"
|
||||||
|
#include "pages/settingspage.h"
|
||||||
|
|
||||||
|
#include <QtConcurrent>
|
||||||
|
#include <QClipboard>
|
||||||
|
#include <QFile>
|
||||||
|
|
||||||
|
#include <DSysInfo>
|
||||||
|
#include <QAtomicInt>
|
||||||
|
|
||||||
|
AppIntoPage::AppIntoPage(QWidget *parent)
|
||||||
|
: QWidget(parent)
|
||||||
|
, ui(new Ui::AppIntoPage)
|
||||||
|
, api(new SparkAPI(this))
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
initUI();
|
||||||
ui->listWidget->setViewMode(QListView::IconMode);
|
initConnections();
|
||||||
ui->listWidget->setMovement(QListView::Static);
|
m_userAgent = QString("Mozilla/5.0 Spark-Store/" + QString(APP_VERSION) + " (Linux; " + QSysInfo::prettyProductName().toUtf8() + ";)").toLatin1();
|
||||||
ui->listWidget->setMaximumHeight(200);
|
|
||||||
ui->listWidget->setFlow(QListView::TopToBottom);
|
|
||||||
api1 = new SparkAPI(this);
|
|
||||||
connect(api1, &SparkAPI::finishedRAW, [=](QString download_times)
|
|
||||||
{
|
|
||||||
download_times.remove(QRegExp("\\n"));
|
|
||||||
ui->download_times->setText(download_times);
|
|
||||||
qDebug()<<"Download Times:"+download_times; });
|
|
||||||
clear();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AppIntoPage::clear()
|
AppIntoPage::~AppIntoPage()
|
||||||
{
|
{
|
||||||
ui->tag_a2d->hide();
|
delete ui;
|
||||||
ui->tag_uos->hide();
|
|
||||||
ui->tag_dtk5->hide();
|
|
||||||
ui->tag_deepin->hide();
|
|
||||||
ui->tag_dwine2->hide();
|
|
||||||
ui->tag_dwine5->hide();
|
|
||||||
ui->tag_ubuntu->hide();
|
|
||||||
ui->tag_community->hide();
|
|
||||||
ui->icon->clear();
|
|
||||||
ui->title->clear();
|
|
||||||
ui->author->clear();
|
|
||||||
ui->label_2->clear();
|
|
||||||
ui->downloadButton->hide();
|
|
||||||
ui->downloadButton->setEnabled(true);
|
|
||||||
ui->pushButton_3->hide();
|
|
||||||
int n = ui->listWidget->count();
|
|
||||||
for (int i = 0; i < n; i++)
|
|
||||||
{
|
|
||||||
QListWidgetItem *item = ui->listWidget->takeItem(0);
|
|
||||||
QWidget *card = ui->listWidget->itemWidget(item);
|
|
||||||
delete card;
|
|
||||||
card = NULL;
|
|
||||||
delete item;
|
|
||||||
item = NULL;
|
|
||||||
}
|
|
||||||
ui->listWidget->clear();
|
|
||||||
}
|
}
|
||||||
void AppIntoPage::setDownloadWidget(DownloadListWidget *w)
|
|
||||||
{
|
void AppIntoPage::openUrl(const QUrl &url)
|
||||||
dw = w;
|
|
||||||
connect(w, &DownloadListWidget::downloadFinished, [=]()
|
|
||||||
{ isDownloading(SparkAPI::getServerUrl() + "store" + spk.path() + "/" + info["Filename"].toString()); });
|
|
||||||
}
|
|
||||||
void AppIntoPage::openUrl(QUrl url)
|
|
||||||
{
|
{
|
||||||
|
clear();
|
||||||
|
|
||||||
|
// qDebug() << url;
|
||||||
spk = url;
|
spk = url;
|
||||||
SparkAPI *api = new SparkAPI(this);
|
|
||||||
clear();
|
|
||||||
connect(api, &SparkAPI::finishedObject, [=](QJsonObject appinfo)
|
|
||||||
{
|
|
||||||
|
|
||||||
|
SparkAPI *api1 = new SparkAPI(this);
|
||||||
|
connect(api1, &SparkAPI::finishedObject, [=](const QJsonObject &appinfo)
|
||||||
|
{
|
||||||
info = appinfo;
|
info = appinfo;
|
||||||
// qDebug()<<url;
|
|
||||||
//获取图标
|
// 显示基本信息
|
||||||
QNetworkAccessManager *naManager;
|
|
||||||
QNetworkRequest request;
|
|
||||||
naManager=new QNetworkAccessManager(this);
|
|
||||||
qDebug()<<api->getImgServerUrl()+"store"+url.path().replace("+","%2B") + "/icon.png";
|
|
||||||
request.setUrl(QUrl(api->getImgServerUrl()+"store"+url.path().replace("+","%2B") + "/icon.png"));
|
|
||||||
request.setRawHeader("User-Agent", "Mozilla/5.0");
|
|
||||||
request.setRawHeader("Content-Type", "charset='utf-8'");
|
|
||||||
naManager->get(request);
|
|
||||||
QObject::connect(naManager,&QNetworkAccessManager::finished,[=](QNetworkReply *reply){
|
|
||||||
QByteArray jpegData = reply->readAll();
|
|
||||||
iconpixmap.loadFromData(jpegData);
|
|
||||||
iconpixmap.scaled(210, 200, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
|
|
||||||
ui->icon->setPixmap(iconpixmap);
|
|
||||||
ui->icon->setScaledContents(true);
|
|
||||||
});
|
|
||||||
ui->title->setText(info["Name"].toString());
|
ui->title->setText(info["Name"].toString());
|
||||||
ui->version->setText(info["Version"].toString());
|
ui->version->setText(info["Version"].toString());
|
||||||
ui->author->setText(info["Author"].toString());
|
ui->author->setText(info["Author"].toString());
|
||||||
@@ -85,31 +50,117 @@ void AppIntoPage::openUrl(QUrl url)
|
|||||||
ui->d_size->setText(info["Size"].toString());
|
ui->d_size->setText(info["Size"].toString());
|
||||||
ui->d_update->setText(info["Update"].toString());
|
ui->d_update->setText(info["Update"].toString());
|
||||||
ui->d_pkgname->setText(info["Pkgname"].toString());
|
ui->d_pkgname->setText(info["Pkgname"].toString());
|
||||||
ui->d_website->setText("<a href=\""+info["Website"].toString()+"\">"+tr("Click Open"));
|
ui->d_website->setText("<a href=\"" + info["Website"].toString() + "\">" + tr("Click Open"));
|
||||||
ui->d_contributor->setText(info["Contributor"].toString());
|
ui->d_contributor->setText(info["Contributor"].toString());
|
||||||
ui->label_2->setText(info["More"].toString());
|
ui->label_2->setText(info["More"].toString());
|
||||||
|
|
||||||
|
// 显示 tags
|
||||||
|
#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)
|
||||||
|
QStringList taglist = info["Tags"].toString().split(";", Qt::SkipEmptyParts);
|
||||||
|
#else
|
||||||
|
QStringList taglist = info["Tags"].toString().split(";", QString::SkipEmptyParts);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
setAppinfoTags(taglist);
|
||||||
|
|
||||||
|
// 获取图标和截图
|
||||||
|
QString pkgUrlBase = api->getImgServerUrl() + SparkAPI::getArchDir() + url.path();
|
||||||
|
// 创建网络请求管理器
|
||||||
|
QNetworkAccessManager *iconManager = new QNetworkAccessManager(this);
|
||||||
|
|
||||||
|
// 获取图标
|
||||||
|
QNetworkRequest iconRequest;
|
||||||
|
iconRequest.setUrl(QUrl(pkgUrlBase + "/icon.png"));
|
||||||
|
iconRequest.setHeader(QNetworkRequest::UserAgentHeader, m_userAgent);
|
||||||
|
iconRequest.setHeader(QNetworkRequest::ContentTypeHeader, "charset='utf-8'");
|
||||||
|
iconRequest.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);
|
||||||
|
|
||||||
|
iconManager->get(iconRequest);
|
||||||
|
QObject::connect(iconManager, &QNetworkAccessManager::finished, [=](QNetworkReply *reply)
|
||||||
|
{
|
||||||
|
QByteArray jpegData = reply->readAll();
|
||||||
|
iconpixmap.loadFromData(jpegData);
|
||||||
|
iconpixmap = iconpixmap.scaled(210, 200, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
|
||||||
|
ui->icon->setPixmap(iconpixmap);
|
||||||
|
ui->icon->setScaledContents(true);
|
||||||
|
|
||||||
|
iconManager->deleteLater();
|
||||||
|
reply->deleteLater();
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
for (int i = 0; i < 5 /* 魔法数字,最多五个截图 */; i++)
|
||||||
|
{
|
||||||
|
QString imgUrl = pkgUrlBase + "/screen_" + QString::number(i + 1) + ".png";
|
||||||
|
QNetworkRequest request;
|
||||||
|
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
|
||||||
|
request.setUrl(QUrl(imgUrl));
|
||||||
|
request.setHeader(QNetworkRequest::UserAgentHeader, m_userAgent);
|
||||||
|
request.setHeader(QNetworkRequest::ContentTypeHeader, "charset='utf-8'");
|
||||||
|
request.setAttribute(QNetworkRequest::FollowRedirectsAttribute, true);
|
||||||
|
manager->get(request);
|
||||||
|
QObject::connect(manager, &QNetworkAccessManager::finished, [=](QNetworkReply *reply)
|
||||||
|
{
|
||||||
|
QByteArray jpegData = reply->readAll();
|
||||||
|
QPixmap pixmap;
|
||||||
|
if (pixmap.loadFromData(jpegData))
|
||||||
|
{
|
||||||
|
pixmap.scaled(100, 100, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
|
||||||
|
image_show *img = new image_show(this);
|
||||||
|
img->setImage(pixmap);
|
||||||
|
// img->setScaledContents(true);
|
||||||
|
QListWidgetItem *pItem = new QListWidgetItem();
|
||||||
|
pItem->setSizeHint(QSize(280, 200));
|
||||||
|
ui->listWidget->insertItem(i, pItem);
|
||||||
|
ui->listWidget->setItemWidget(pItem, img);
|
||||||
|
qDebug() << imgUrl;
|
||||||
|
}
|
||||||
|
|
||||||
|
manager->deleteLater();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* NOTE: No need to judget developmode status
|
||||||
|
*/
|
||||||
|
// Check UOS
|
||||||
|
// QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
|
||||||
|
// if (config.contains("UOS/EnableDeveloperMode") && !config.value("UOS/EnableDeveloperMode").toBool()){
|
||||||
|
if (false) {
|
||||||
|
qDebug() << "UOS Developer Mode has not been enabled!";
|
||||||
|
ui->downloadButton->setText(tr("Developer Mode Disabled"));
|
||||||
|
ui->downloadButton->setEnabled(false);
|
||||||
|
ui->downloadButton->show();
|
||||||
|
}
|
||||||
|
else // 非 UOS 或 UOS 已经开启开发者模式
|
||||||
|
{
|
||||||
QProcess isInstall;
|
QProcess isInstall;
|
||||||
bool isInstalled;
|
bool isInstalled;
|
||||||
bool isUpdated;
|
bool isUpdated;
|
||||||
QString packagename = info["Pkgname"].toString();
|
QString packagename = info["Pkgname"].toString();
|
||||||
isInstall.start("dpkg -s " + info["Pkgname"].toString());
|
isInstall.start("/opt/durapps/spark-store/bin/store-helper/check-is-installed", QStringList() << info["Pkgname"].toString());
|
||||||
qDebug()<<info["Pkgname"].toString();
|
qDebug() << info["Pkgname"].toString();
|
||||||
isInstall.waitForFinished(180*1000); // 默认超时 3 分钟
|
isInstall.waitForFinished(180 * 1000); // 默认超时 3 分钟
|
||||||
int error = QString::fromStdString(isInstall.readAllStandardError().toStdString()).length();
|
|
||||||
if(error == 0)
|
int exitCode = isInstall.exitCode();
|
||||||
|
QProcess::ExitStatus exitStatus = isInstall.exitStatus();
|
||||||
|
isInstall.close();
|
||||||
|
|
||||||
|
if (exitCode == 0 && exitStatus == QProcess::NormalExit)
|
||||||
{
|
{
|
||||||
isInstalled = true;
|
isInstalled = true;
|
||||||
|
|
||||||
QProcess isUpdate;
|
QProcess isUpdate;
|
||||||
isUpdate.start("dpkg-query --showformat='${Version}' --show " + info["Pkgname"].toString());
|
isUpdate.start("dpkg-query", QStringList() << "--showformat='${Version}'"
|
||||||
isUpdate.waitForFinished(180*1000); // 默认超时 3 分钟
|
<< "--show" << info["Pkgname"].toString());
|
||||||
|
isUpdate.waitForFinished(180 * 1000); // 默认超时 3 分钟
|
||||||
QString localVersion = isUpdate.readAllStandardOutput();
|
QString localVersion = isUpdate.readAllStandardOutput();
|
||||||
localVersion.replace("'", "");
|
localVersion.replace("'", "");
|
||||||
|
|
||||||
isUpdate.start("dpkg --compare-versions " + localVersion + " ge " + info["Version"].toString());
|
isUpdate.start("dpkg", QStringList() << "--compare-versions" << localVersion << "ge" << info["Version"].toString());
|
||||||
isUpdate.waitForFinished(180*1000); // 默认超时 3 分钟
|
isUpdate.waitForFinished(180 * 1000); // 默认超时 3 分钟
|
||||||
if(!isUpdate.exitCode())
|
if (isUpdate.exitCode() == 0 && isUpdate.exitStatus() == QProcess::NormalExit)
|
||||||
{
|
{
|
||||||
isUpdated = true;
|
isUpdated = true;
|
||||||
}
|
}
|
||||||
@@ -117,6 +168,7 @@ void AppIntoPage::openUrl(QUrl url)
|
|||||||
{
|
{
|
||||||
isUpdated = false;
|
isUpdated = false;
|
||||||
}
|
}
|
||||||
|
isUpdate.close();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -124,9 +176,9 @@ void AppIntoPage::openUrl(QUrl url)
|
|||||||
isUpdated = false;
|
isUpdated = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(isInstalled)
|
if (isInstalled)
|
||||||
{
|
{
|
||||||
if(isUpdated)
|
if (isUpdated)
|
||||||
{
|
{
|
||||||
ui->downloadButton->setText(tr("Reinstall"));
|
ui->downloadButton->setText(tr("Reinstall"));
|
||||||
ui->downloadButton->setEnabled(true);
|
ui->downloadButton->setEnabled(true);
|
||||||
@@ -143,96 +195,189 @@ void AppIntoPage::openUrl(QUrl url)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ui->downloadButton->setText(tr("Download"));
|
ui->downloadButton->setText(tr("Download and Install"));
|
||||||
isDownloading(SparkAPI::getServerUrl()+"store"+spk.path()+"/"+info["Filename"].toString());
|
|
||||||
ui->downloadButton->setEnabled(true);
|
ui->downloadButton->setEnabled(true);
|
||||||
ui->downloadButton->show();
|
ui->downloadButton->show();
|
||||||
}
|
}
|
||||||
|
|
||||||
QStringList taglist = info["Tags"].toString().split(";");
|
isDownloading(SparkAPI::getServerUrl() + SparkAPI::getArchDir() + spk.path() + "/" + info["Filename"].toString());
|
||||||
QString tmp=info["img_urls"].toString();
|
|
||||||
qDebug()<<tmp;
|
|
||||||
if(tmp.left(2)=="[\"")
|
|
||||||
{
|
|
||||||
tmp.remove(0,2);
|
|
||||||
}
|
}
|
||||||
if(tmp.right(2)=="\"]")
|
|
||||||
{
|
api1->disconnect();
|
||||||
tmp.remove(tmp.size()-2,tmp.size());
|
api1->deleteLater(); });
|
||||||
}
|
|
||||||
QStringList imglist = tmp.split("\",\"");
|
api1->getAppInfo(url);
|
||||||
qDebug()<<imglist;
|
|
||||||
for(int i=0;i < imglist.size();i++)
|
api->getAppDownloadTimes(url);
|
||||||
{
|
|
||||||
QNetworkAccessManager *naManager;
|
|
||||||
QNetworkRequest request;
|
|
||||||
naManager=new QNetworkAccessManager(this);
|
|
||||||
request.setUrl(QUrl(imglist[i].replace("+","%2B")));
|
|
||||||
request.setRawHeader("User-Agent", "Mozilla/5.0");
|
|
||||||
request.setRawHeader("Content-Type", "charset='utf-8'");
|
|
||||||
naManager->get(request);
|
|
||||||
QObject::connect(naManager,&QNetworkAccessManager::finished,[=](QNetworkReply *reply){
|
|
||||||
QByteArray jpegData = reply->readAll();
|
|
||||||
QPixmap pixmap;
|
|
||||||
pixmap.loadFromData(jpegData);
|
|
||||||
pixmap.scaled(100, 100, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
|
|
||||||
image_show *img=new image_show(this);
|
|
||||||
img->setImage(pixmap);
|
|
||||||
//img->setScaledContents(true);
|
|
||||||
QListWidgetItem* pItem = new QListWidgetItem();
|
|
||||||
pItem->setSizeHint(QSize(280, 200));
|
|
||||||
ui->listWidget->addItem(pItem);
|
|
||||||
ui->listWidget->setItemWidget(pItem, img);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
this->sltAppinfoTags(&taglist);
|
|
||||||
disconnect(api,&SparkAPI::finished,nullptr,nullptr);
|
|
||||||
api->deleteLater(); });
|
|
||||||
api->getAppInfo(url);
|
|
||||||
api1->getAppDownloadTimes(url);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AppIntoPage::isDownloading(QUrl url)
|
void AppIntoPage::clear()
|
||||||
{
|
{
|
||||||
if (dw->getUrlList().lastIndexOf(url) == -1)
|
ui->tag_a2d->hide();
|
||||||
|
ui->tag_uos->hide();
|
||||||
|
ui->tag_dtk5->hide();
|
||||||
|
ui->tag_deepin->hide();
|
||||||
|
ui->tag_dwine2->hide();
|
||||||
|
ui->tag_dwine5->hide();
|
||||||
|
ui->tag_ubuntu->hide();
|
||||||
|
ui->tag_community->hide();
|
||||||
|
ui->icon->clear();
|
||||||
|
ui->title->clear();
|
||||||
|
ui->version->clear();
|
||||||
|
ui->author->clear();
|
||||||
|
ui->d_author->clear();
|
||||||
|
ui->d_size->clear();
|
||||||
|
ui->d_update->clear();
|
||||||
|
ui->d_pkgname->clear();
|
||||||
|
ui->d_website->clear();
|
||||||
|
ui->d_contributor->clear();
|
||||||
|
ui->label_2->clear();
|
||||||
|
ui->downloadButton->hide();
|
||||||
|
ui->downloadButton->setEnabled(false);
|
||||||
|
ui->pushButton_3->hide();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ui->listWidget->clear(); // NOTE: QListWidget::clear() 会析构所有 items
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppIntoPage::setTheme(bool dark)
|
||||||
|
{
|
||||||
|
if (dark)
|
||||||
|
{
|
||||||
|
QString frameStyleSheet ="#frame,#frame_2,#frame_3,#frame_4 {background-color: #252525; border-radius: 14px; border: 1px solid rgb(64, 64, 64);}\
|
||||||
|
QLabel#cardtitle,QLabel#title,QLabel#title_1,QLabel#title_2,QLabel#title_3 {color: #FFFFFF}";
|
||||||
|
ui->frame->setStyleSheet(frameStyleSheet);
|
||||||
|
ui->frame_2->setStyleSheet(frameStyleSheet);
|
||||||
|
ui->frame_3->setStyleSheet(frameStyleSheet);
|
||||||
|
ui->frame_4->setStyleSheet(frameStyleSheet);
|
||||||
|
|
||||||
|
ui->icon_1->setPixmap(QPixmap(":/icon/dark/box.svg"));
|
||||||
|
ui->icon_2->setPixmap(QPixmap(":/icon/dark/box.svg"));
|
||||||
|
ui->icon_3->setPixmap(QPixmap(":/icon/dark/calendar.svg"));
|
||||||
|
ui->icon_4->setPixmap(QPixmap(":/icon/dark/text.svg"));
|
||||||
|
ui->icon_5->setPixmap(QPixmap(":/icon/dark/folder.svg"));
|
||||||
|
ui->icon_6->setPixmap(QPixmap(":/icon/dark/globe.svg"));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//亮色模式
|
||||||
|
QString frameStyleSheet ="#frame,#frame_2,#frame_3,#frame_4 {background-color: #fbfbfb; border-radius: 14px; border: 1px solid rgb(229,229,229);}\
|
||||||
|
QLabel#cardtitle,QLabel#title,QLabel#title_1,QLabel#title_2,QLabel#title_3 {color: #000000}";
|
||||||
|
ui->frame->setStyleSheet(frameStyleSheet);
|
||||||
|
ui->frame_2->setStyleSheet(frameStyleSheet);
|
||||||
|
ui->frame_3->setStyleSheet(frameStyleSheet);
|
||||||
|
ui->frame_4->setStyleSheet(frameStyleSheet);
|
||||||
|
|
||||||
|
ui->icon_1->setPixmap(QPixmap(":/icon/light/box.svg"));
|
||||||
|
ui->icon_2->setPixmap(QPixmap(":/icon/light/box.svg"));
|
||||||
|
ui->icon_3->setPixmap(QPixmap(":/icon/light/calendar.svg"));
|
||||||
|
ui->icon_4->setPixmap(QPixmap(":/icon/light/text.svg"));
|
||||||
|
ui->icon_5->setPixmap(QPixmap(":/icon/light/folder.svg"));
|
||||||
|
ui->icon_6->setPixmap(QPixmap(":/icon/light/globe.svg"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppIntoPage::setDownloadWidget(DownloadListWidget *w)
|
||||||
|
{
|
||||||
|
if (dw)
|
||||||
|
{
|
||||||
|
dw->deleteLater();
|
||||||
|
dw = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
dw = w;
|
||||||
|
connect(w, &DownloadListWidget::downloadFinished, [=]()
|
||||||
|
{ isDownloading(SparkAPI::getServerUrl() + SparkAPI::getArchDir() + spk.path() + "/" + info["Filename"].toString()); });
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppIntoPage::initUI()
|
||||||
|
{
|
||||||
|
ui->setupUi(this);
|
||||||
|
|
||||||
|
ui->listWidget->setViewMode(QListView::IconMode);
|
||||||
|
ui->listWidget->setFlow(QListView::TopToBottom);
|
||||||
|
ui->listWidget->setMovement(QListView::Static);
|
||||||
|
ui->listWidget->setMaximumHeight(200);
|
||||||
|
|
||||||
|
clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppIntoPage::initConnections()
|
||||||
|
{
|
||||||
|
connect(api, &SparkAPI::finishedRAW, [=](QString download_times)
|
||||||
|
{
|
||||||
|
download_times = download_times.trimmed();
|
||||||
|
qDebug() << "Download Times:" + download_times;
|
||||||
|
ui->download_times->setText(download_times); });
|
||||||
|
}
|
||||||
|
|
||||||
|
void AppIntoPage::isDownloading(const QUrl &url)
|
||||||
|
{
|
||||||
|
int index = dw->getUrlList().lastIndexOf(url);
|
||||||
|
if (index == -1)
|
||||||
{
|
{
|
||||||
ui->downloadButton->setEnabled(true);
|
ui->downloadButton->setEnabled(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
ui->downloadButton->setEnabled(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
ui->pushButton_3->hide();
|
DownloadItem *item = dw->getDIList().at(index);
|
||||||
if (dw->getDIList()[dw->getUrlList().lastIndexOf(url)]->download == 2)
|
if (item == nullptr)
|
||||||
{
|
{
|
||||||
ui->downloadButton->setEnabled(true);
|
ui->downloadButton->setEnabled(true);
|
||||||
ui->downloadButton->setText(tr("Download"));
|
return;
|
||||||
}
|
}
|
||||||
if (dw->getDIList()[dw->getUrlList().lastIndexOf(url)]->download == 1)
|
|
||||||
|
ui->downloadButton->setEnabled(false);
|
||||||
|
ui->pushButton_3->hide();
|
||||||
|
if (item->download == 2)
|
||||||
|
{
|
||||||
|
ui->downloadButton->setEnabled(true);
|
||||||
|
ui->downloadButton->setText(tr("Download and Install"));
|
||||||
|
}
|
||||||
|
if (item->download == 1)
|
||||||
{
|
{
|
||||||
ui->downloadButton->setEnabled(true);
|
ui->downloadButton->setEnabled(true);
|
||||||
ui->downloadButton->setText(tr("Install"));
|
ui->downloadButton->setText(tr("Install"));
|
||||||
}
|
}
|
||||||
if (dw->getDIList()[dw->getUrlList().lastIndexOf(url)]->isInstall)
|
if (item->isInstall)
|
||||||
{
|
{
|
||||||
ui->downloadButton->setEnabled(false);
|
ui->downloadButton->setEnabled(false);
|
||||||
ui->downloadButton->setText(tr("Installing"));
|
ui->downloadButton->setText(tr("Installing"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (dw->getDIList()[dw->getUrlList().lastIndexOf(url)]->download == 3)
|
if (item->download == 3)
|
||||||
|
{
|
||||||
|
QString packageName = info["Pkgname"].toString();
|
||||||
|
QProcess process;
|
||||||
|
process.start("/opt/durapps/spark-store/bin/store-helper/check-is-installed", {packageName});
|
||||||
|
process.waitForFinished(-1);
|
||||||
|
|
||||||
|
int exitCode = process.exitCode();
|
||||||
|
QProcess::ExitStatus exitStatus = process.exitStatus();
|
||||||
|
process.close();
|
||||||
|
|
||||||
|
if (exitCode == 0 && exitStatus == QProcess::NormalExit)
|
||||||
{
|
{
|
||||||
ui->downloadButton->setEnabled(true);
|
ui->downloadButton->setEnabled(true);
|
||||||
ui->downloadButton->setText(tr("Reinstall"));
|
ui->downloadButton->setText(tr("Reinstall"));
|
||||||
ui->downloadButton->show();
|
ui->downloadButton->show();
|
||||||
ui->pushButton_3->show();
|
ui->pushButton_3->show();
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ui->downloadButton->setEnabled(true);
|
||||||
|
ui->downloadButton->setText(tr("Download and Install"));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AppIntoPage::sltAppinfoTags(QStringList *tagList)
|
void AppIntoPage::setAppinfoTags(const QStringList &tagList)
|
||||||
{
|
{
|
||||||
foreach (const QString &tag, *tagList)
|
bool ubuntuSupport = false;
|
||||||
|
bool deepinSupport = false;
|
||||||
|
bool uosSupport = false;
|
||||||
|
foreach (const QString &tag, tagList)
|
||||||
{
|
{
|
||||||
if (tag == "community")
|
if (tag == "community")
|
||||||
{
|
{
|
||||||
@@ -241,14 +386,18 @@ void AppIntoPage::sltAppinfoTags(QStringList *tagList)
|
|||||||
else if (tag == "ubuntu")
|
else if (tag == "ubuntu")
|
||||||
{
|
{
|
||||||
ui->tag_ubuntu->show();
|
ui->tag_ubuntu->show();
|
||||||
|
ubuntuSupport = true;
|
||||||
}
|
}
|
||||||
else if (tag == "deepin")
|
else if (tag == "deepin")
|
||||||
{
|
{
|
||||||
ui->tag_deepin->show();
|
ui->tag_deepin->show();
|
||||||
|
deepinSupport = true;
|
||||||
}
|
}
|
||||||
else if (tag == "uos")
|
else if (tag == "uos")
|
||||||
{
|
{
|
||||||
ui->tag_uos->show();
|
ui->tag_uos->show();
|
||||||
|
uosSupport = true;
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (tag == "dtk5")
|
else if (tag == "dtk5")
|
||||||
{
|
{
|
||||||
@@ -267,70 +416,100 @@ void AppIntoPage::sltAppinfoTags(QStringList *tagList)
|
|||||||
ui->tag_a2d->show();
|
ui->tag_a2d->show();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
notifyUserUnsupportedTags(ubuntuSupport, deepinSupport, uosSupport);
|
||||||
}
|
}
|
||||||
void AppIntoPage::setTheme(bool dark)
|
|
||||||
{
|
|
||||||
if (dark)
|
|
||||||
{
|
|
||||||
QString frameStyleSheet = "#frame,#frame_2,#frame_3,#frame_4{background-color: #252525;border-radius:14px;border:1px solid rgb(64, 64, 64);}";
|
|
||||||
ui->frame->setStyleSheet(frameStyleSheet);
|
|
||||||
ui->frame_2->setStyleSheet(frameStyleSheet);
|
|
||||||
ui->frame_3->setStyleSheet(frameStyleSheet);
|
|
||||||
ui->frame_4->setStyleSheet(frameStyleSheet);
|
|
||||||
|
|
||||||
ui->icon_1->setPixmap(QPixmap(":/icon/dark/box.svg"));
|
void AppIntoPage::notifyUserUnsupportedTags(bool ubuntuSupport, bool deepinSupport, bool uosSupport)
|
||||||
ui->icon_2->setPixmap(QPixmap(":/icon/dark/box.svg"));
|
|
||||||
ui->icon_3->setPixmap(QPixmap(":/icon/dark/calendar.svg"));
|
|
||||||
ui->icon_4->setPixmap(QPixmap(":/icon/dark/text.svg"));
|
|
||||||
ui->icon_5->setPixmap(QPixmap(":/icon/dark/folder.svg"));
|
|
||||||
ui->icon_6->setPixmap(QPixmap(":/icon/dark/globe.svg"));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// 亮色模式
|
|
||||||
QString frameStyleSheet = "#frame,#frame_2,#frame_3,#frame_4{background-color: #fbfbfb;border-radius:14px;border:1px solid rgb(229,229,229);}";
|
|
||||||
ui->frame->setStyleSheet(frameStyleSheet);
|
|
||||||
ui->frame_2->setStyleSheet(frameStyleSheet);
|
|
||||||
ui->frame_3->setStyleSheet(frameStyleSheet);
|
|
||||||
ui->frame_4->setStyleSheet(frameStyleSheet);
|
|
||||||
|
|
||||||
ui->icon_1->setPixmap(QPixmap(":/icon/light/box.svg"));
|
|
||||||
ui->icon_2->setPixmap(QPixmap(":/icon/light/box.svg"));
|
|
||||||
ui->icon_3->setPixmap(QPixmap(":/icon/light/calendar.svg"));
|
|
||||||
ui->icon_4->setPixmap(QPixmap(":/icon/light/text.svg"));
|
|
||||||
ui->icon_5->setPixmap(QPixmap(":/icon/light/folder.svg"));
|
|
||||||
ui->icon_6->setPixmap(QPixmap(":/icon/light/globe.svg"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
AppIntoPage::~AppIntoPage()
|
|
||||||
{
|
{
|
||||||
delete ui;
|
if (!SettingsPage::needUncompatibleNotification) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool isDeepin = Dtk::Core::DSysInfo::productType() == Dtk::Core::DSysInfo::Deepin;
|
||||||
|
bool isUOS = Dtk::Core::DSysInfo::productType() == Dtk::Core::DSysInfo::Uos;
|
||||||
|
bool checkdeepin = (isDeepin && !deepinSupport);
|
||||||
|
bool checkuos = (isUOS && !uosSupport);
|
||||||
|
bool isUbuntu = false;
|
||||||
|
if (!checkdeepin && !checkuos)
|
||||||
|
{
|
||||||
|
// 检查是否为 ubuntu 系统
|
||||||
|
QFile lsb("/etc/lsb-release");
|
||||||
|
if (!lsb.open(QIODevice::ReadOnly))
|
||||||
|
{
|
||||||
|
qDebug() << "打开 /etc/lsb-release 失败";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
QString lsbInfo = lsb.readAll(); // 因为使用 readAll 读取后会默认跳转到文件末尾导致读出的数据为空,所以用单独一个 string 存储
|
||||||
|
if (lsbInfo.contains("Ubuntu"))
|
||||||
|
{
|
||||||
|
isUbuntu = true;
|
||||||
|
lsb.close();
|
||||||
|
}
|
||||||
|
else if (lsbInfo.contains("GXDE"))
|
||||||
|
{
|
||||||
|
// GXDE 使用 Ubuntu 的 tag
|
||||||
|
isUbuntu = true;
|
||||||
|
lsb.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bool checkubuntu = (isUbuntu && !ubuntuSupport);
|
||||||
|
|
||||||
|
if (checkdeepin)
|
||||||
|
{
|
||||||
|
Utils::sendNotification("spark-store", tr("Warning"), tr("The current application does not support or tested on deepin, there may be problems"));
|
||||||
|
}
|
||||||
|
else if (checkuos)
|
||||||
|
{
|
||||||
|
Utils::sendNotification("spark-store", tr("Warning"), tr("The current application does not support or tested on UOS, there may be problems"));
|
||||||
|
}
|
||||||
|
else if (checkubuntu)
|
||||||
|
{
|
||||||
|
Utils::sendNotification("spark-store", tr("Warning"), tr("The current application does not support or tested on Ubuntu, there may be problems"));
|
||||||
|
}
|
||||||
|
else if (!isUbuntu && !isDeepin && !isUOS)
|
||||||
|
{
|
||||||
|
Utils::sendNotification("spark-store", tr("Warning"), tr("The current application does not support or tested on current platform, there may be problems"));
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AppIntoPage::on_downloadButton_clicked()
|
void AppIntoPage::on_downloadButton_clicked()
|
||||||
{
|
{
|
||||||
|
QString downloadUrl = SparkAPI::getServerUrl() + SparkAPI::getArchDir() + spk.path() + "/" + info["Filename"].toString();
|
||||||
if (ui->downloadButton->text() == tr("Install"))
|
if (ui->downloadButton->text() == tr("Install"))
|
||||||
{
|
{
|
||||||
dw->getDIList()[dw->getUrlList().lastIndexOf(SparkAPI::getServerUrl() + "store" + spk.path() + "/" + info["Filename"].toString())]->install(0);
|
DownloadItem *item = dw->getDIList()[dw->getUrlList().lastIndexOf(downloadUrl)];
|
||||||
isDownloading(SparkAPI::getServerUrl() + "store" + spk.path() + "/" + info["Filename"].toString());
|
if (item == nullptr)
|
||||||
QObject::connect(dw->getDIList()[dw->getUrlList().lastIndexOf(SparkAPI::getServerUrl() + "store" + spk.path() + "/" + info["Filename"].toString())], &DownloadItem::finished, [=]()
|
|
||||||
{
|
{
|
||||||
isDownloading(SparkAPI::getServerUrl()+"store"+spk.path()+"/"+info["Filename"].toString());
|
|
||||||
disconnect(dw->getDIList()[dw->getUrlList().lastIndexOf(SparkAPI::getServerUrl()+"store"+spk.path()+"/"+info["Filename"].toString())],&DownloadItem::finished,nullptr,nullptr); });
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
connect(item, &DownloadItem::finished, [=]() { isDownloading(downloadUrl); });
|
||||||
|
|
||||||
|
item->install(0);
|
||||||
|
isDownloading(downloadUrl);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
emit clickedDownloadBtn();
|
emit clickedDownloadBtn();
|
||||||
dw->addItem(info["Name"].toString(), info["Filename"].toString(), info["Pkgname"].toString(), iconpixmap, SparkAPI::getServerUrl() + "store" + spk.path() + "/" + info["Filename"].toString());
|
|
||||||
|
DownloadItem *item = dw->addItem(info["Name"].toString(), info["Filename"].toString(), info["Pkgname"].toString(), iconpixmap, downloadUrl);
|
||||||
|
if (item == nullptr)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (ui->downloadButton->text() == tr("Reinstall"))
|
if (ui->downloadButton->text() == tr("Reinstall"))
|
||||||
{
|
{
|
||||||
dw->getDIList()[dw->allDownload - 1]->reinstall = true;
|
item->reinstall = true;
|
||||||
}
|
}
|
||||||
ui->downloadButton->setEnabled(false);
|
ui->downloadButton->setEnabled(false);
|
||||||
QObject::connect(dw->getDIList()[dw->getUrlList().lastIndexOf(SparkAPI::getServerUrl() + "store" + spk.path() + "/" + info["Filename"].toString())], &DownloadItem::finished, [=]()
|
connect(item, &DownloadItem::finished, [=]() { isDownloading(downloadUrl); });
|
||||||
{
|
|
||||||
isDownloading(SparkAPI::getServerUrl()+"store"+spk.path()+"/"+info["Filename"].toString());
|
isDownloading(downloadUrl);
|
||||||
disconnect(dw->getDIList()[dw->getUrlList().lastIndexOf(SparkAPI::getServerUrl()+"store"+spk.path()+"/"+info["Filename"].toString())],&DownloadItem::finished,nullptr,nullptr); });
|
|
||||||
isDownloading(SparkAPI::getServerUrl() + "store" + spk.path() + "/" + info["Filename"].toString());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AppIntoPage::on_pushButton_3_clicked()
|
void AppIntoPage::on_pushButton_3_clicked()
|
||||||
@@ -341,42 +520,45 @@ void AppIntoPage::on_pushButton_3_clicked()
|
|||||||
ui->pushButton_3->setEnabled(false);
|
ui->pushButton_3->setEnabled(false);
|
||||||
|
|
||||||
QProcess uninstall;
|
QProcess uninstall;
|
||||||
uninstall.start("pkexec", QStringList() << "apt" << "purge" << "-y" << info["Pkgname"].toString().toLower());
|
uninstall.start("pkexec", QStringList() << "apt" << "autopurge" << "-y" << info["Pkgname"].toString().toLower());
|
||||||
uninstall.waitForFinished(-1);
|
uninstall.waitForFinished(-1);
|
||||||
|
uninstall.close();
|
||||||
|
|
||||||
QProcess check;
|
QProcess check;
|
||||||
check.start("dpkg", QStringList() << "-s" << info["Pkgname"].toString().toLower());
|
check.start("dpkg", QStringList() << "-s" << info["Pkgname"].toString().toLower());
|
||||||
check.waitForFinished(10*1000);
|
check.waitForFinished(-1);
|
||||||
|
|
||||||
if (check.readAllStandardOutput().isEmpty())
|
if (check.exitCode() != 0 || check.exitStatus() != QProcess::NormalExit)
|
||||||
{
|
{
|
||||||
ui->downloadButton->setText(tr("Install"));
|
ui->downloadButton->setText(tr("Download and Install"));
|
||||||
ui->pushButton_3->hide();
|
ui->pushButton_3->hide();
|
||||||
|
|
||||||
updatesEnabled();
|
|
||||||
Utils::sendNotification("spark-store",tr("Spark Store"),tr("Uninstall succeeded"));
|
Utils::sendNotification("spark-store",tr("Spark Store"),tr("Uninstall succeeded"));
|
||||||
}
|
}
|
||||||
|
|
||||||
ui->downloadButton->setEnabled(true);
|
ui->downloadButton->setEnabled(true);
|
||||||
ui->pushButton_3->setEnabled(true); });
|
ui->pushButton_3->setEnabled(true);
|
||||||
|
|
||||||
|
check.close();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void AppIntoPage::on_shareButton_clicked()
|
void AppIntoPage::on_shareButton_clicked()
|
||||||
{
|
{
|
||||||
qDebug() << "Share" << spk;
|
qDebug() << "Share" << spk;
|
||||||
|
Application::clipboard()->setText(spk.toString());
|
||||||
|
|
||||||
Utils::sendNotification("spark-store", tr("Spark Store"), tr("The URL has been copied to the clipboard"));
|
Utils::sendNotification("spark-store", tr("Spark Store"), tr("The URL has been copied to the clipboard"));
|
||||||
QClipboard *clipboard = QApplication::clipboard();
|
|
||||||
clipboard->setText(spk.toString());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AppIntoPage::on_updateButton_clicked()
|
void AppIntoPage::on_updateButton_clicked()
|
||||||
{
|
{
|
||||||
QString feedbackSpk = "spk://store/chat/store.spark-app.feedback";
|
QString feedbackSpk = "spk://store/chat/store.spark-app.feedback";
|
||||||
QFile actionSubmissionClientStatus("/opt/durapps/store.spark-app.feedback");
|
QFileInfo actionSubmissionClientStatus("/opt/durapps/store.spark-app.feedback");
|
||||||
if (actionSubmissionClientStatus.exists())
|
if (actionSubmissionClientStatus.exists() && actionSubmissionClientStatus.isDir())
|
||||||
{
|
{
|
||||||
qDebug() << "反馈器存在";
|
qDebug() << "反馈器存在";
|
||||||
QProcess::startDetached("sh /opt/durapps/store.spark-app.feedback/launch.sh");
|
QProcess::startDetached("sh", QStringList() << "/opt/durapps/store.spark-app.feedback/launch.sh");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -2,51 +2,55 @@
|
|||||||
#define APPINTOPAGE_H
|
#define APPINTOPAGE_H
|
||||||
|
|
||||||
#include <QWidget>
|
#include <QWidget>
|
||||||
|
#include <QJsonObject>
|
||||||
#include <QUrl>
|
#include <QUrl>
|
||||||
#include <QString>
|
|
||||||
#include <QtConcurrent>
|
|
||||||
#include <QClipboard>
|
|
||||||
#include "backend/sparkapi.h"
|
|
||||||
#include "backend/image_show.h"
|
|
||||||
#include "widgets/downloadlistwidget.h"
|
|
||||||
#include "utils/utils.h"
|
|
||||||
namespace Ui {
|
namespace Ui {
|
||||||
class AppIntoPage;
|
class AppIntoPage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class SparkAPI;
|
||||||
|
class DownloadListWidget;
|
||||||
class AppIntoPage : public QWidget
|
class AppIntoPage : public QWidget
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void clear();
|
|
||||||
void setDownloadWidget(DownloadListWidget *w);
|
|
||||||
void setTheme(bool dark);
|
|
||||||
void openUrl(QUrl url);
|
|
||||||
explicit AppIntoPage(QWidget *parent = nullptr);
|
explicit AppIntoPage(QWidget *parent = nullptr);
|
||||||
~AppIntoPage();
|
~AppIntoPage() override;
|
||||||
|
|
||||||
private slots:
|
void openUrl(const QUrl &url);
|
||||||
void on_downloadButton_clicked();
|
void clear();
|
||||||
|
void setTheme(bool dark);
|
||||||
void on_pushButton_3_clicked();
|
void setDownloadWidget(DownloadListWidget *w);
|
||||||
|
|
||||||
void on_shareButton_clicked();
|
|
||||||
|
|
||||||
void on_updateButton_clicked();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
SparkAPI *api1;
|
void initUI();
|
||||||
QJsonObject info;
|
void initConnections();
|
||||||
QPixmap iconpixmap;
|
void isDownloading(const QUrl &url);
|
||||||
QUrl spk;
|
void setAppinfoTags(const QStringList &tagList);
|
||||||
void isDownloading(QUrl url);
|
void notifyUserUnsupportedTags(bool ubuntuSupport, bool deepinSupport, bool uosSupport);
|
||||||
void sltAppinfoTags(QStringList *tagList);
|
|
||||||
DownloadListWidget *dw;
|
|
||||||
Ui::AppIntoPage *ui;
|
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void clickedDownloadBtn();
|
void clickedDownloadBtn();
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void on_downloadButton_clicked();
|
||||||
|
void on_pushButton_3_clicked();
|
||||||
|
void on_shareButton_clicked();
|
||||||
|
void on_updateButton_clicked();
|
||||||
|
|
||||||
|
private:
|
||||||
|
Ui::AppIntoPage *ui;
|
||||||
|
|
||||||
|
SparkAPI *api;
|
||||||
|
DownloadListWidget *dw = nullptr;
|
||||||
|
|
||||||
|
QJsonObject info;
|
||||||
|
QPixmap iconpixmap;
|
||||||
|
QUrl spk;
|
||||||
|
|
||||||
|
QByteArray m_userAgent;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // APPINTOPAGE_H
|
#endif // APPINTOPAGE_H
|
||||||
|
|||||||
@@ -241,7 +241,7 @@
|
|||||||
</sizepolicy>
|
</sizepolicy>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Download</string>
|
<string>Download and Install</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
@@ -426,10 +426,10 @@
|
|||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string><html><head/><body><p>Capable to Ubuntu 20.04</p></body></html></string>
|
<string><html><head/><body><p>Capable to Ubuntu 22.04</p></body></html></string>
|
||||||
</property>
|
</property>
|
||||||
<property name="whatsThis">
|
<property name="whatsThis">
|
||||||
<string><html><head/><body><p>Capable to Ubuntu 20.04</p></body></html></string>
|
<string><html><head/><body><p>Capable to Ubuntu 22.04</p></body></html></string>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string><html><head/><body><p><img src=":/tags/ubuntu-small.png"/></p></body></html></string>
|
<string><html><head/><body><p><img src=":/tags/ubuntu-small.png"/></p></body></html></string>
|
||||||
@@ -540,10 +540,10 @@
|
|||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="toolTip">
|
<property name="toolTip">
|
||||||
<string><html><head/><body><p>A deepin-wine5 app.Spark Store will automatically configure the wine kit for you</p></body></html></string>
|
<string><html><head/><body><p>A Wine app.Spark Store will automatically configure the wine kit for you</p></body></html></string>
|
||||||
</property>
|
</property>
|
||||||
<property name="whatsThis">
|
<property name="whatsThis">
|
||||||
<string><html><head/><body><p>A deepin-wine5 app.Spark Store will automatically configure the wine kit for you</p></body></html></string>
|
<string><html><head/><body><p>A Wine app.Spark Store will automatically configure the wine kit for you</p></body></html></string>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string><html><head/><body><p><img src=":/tags/dwine5-small.png"/></p></body></html></string>
|
<string><html><head/><body><p><img src=":/tags/dwine5-small.png"/></p></body></html></string>
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
#include "applistpage.h"
|
#include "applistpage.h"
|
||||||
#include "ui_applistpage.h"
|
#include "ui_applistpage.h"
|
||||||
|
|
||||||
|
#define BUILD_URL(theme, arch) \
|
||||||
|
api->getServerUrl() + SparkAPI::getArchDir() + "/#/flamescion/" + (type.isEmpty() ? "?" : "applist?type=" + type + "&") + theme + "&arch=" + arch
|
||||||
|
|
||||||
AppListPage::AppListPage(QWidget *parent) : QWidget(parent),
|
AppListPage::AppListPage(QWidget *parent) : QWidget(parent),
|
||||||
ui(new Ui::AppListPage)
|
ui(new Ui::AppListPage)
|
||||||
{
|
{
|
||||||
@@ -43,19 +46,20 @@ void AppListPage::getAppList(QString type)
|
|||||||
{
|
{
|
||||||
theme = "theme=light";
|
theme = "theme=light";
|
||||||
}
|
}
|
||||||
if (type == "")
|
|
||||||
{
|
#ifdef __aarch64__
|
||||||
url = api->getServerUrl() + "store/#/flamescion/?" + theme;
|
url = BUILD_URL(theme, "aarch64");
|
||||||
}
|
#elif __loongarch__
|
||||||
else
|
url = BUILD_URL(theme, "loong64");
|
||||||
{
|
#else
|
||||||
url = api->getServerUrl() + "store/#/flamescion/applist?type=" + type + "&" + theme;
|
url = BUILD_URL(theme, "x86");
|
||||||
}
|
#endif
|
||||||
|
|
||||||
ui->webEngineView->setUrl(url);
|
ui->webEngineView->setUrl(url);
|
||||||
|
delete api;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AppListPage::getSearchList(QString keyword)
|
void AppListPage::getSearchList(const QString &keyword)
|
||||||
{
|
{
|
||||||
isSearch = true;
|
isSearch = true;
|
||||||
nowType = keyword;
|
nowType = keyword;
|
||||||
@@ -70,8 +74,15 @@ void AppListPage::getSearchList(QString keyword)
|
|||||||
{
|
{
|
||||||
theme = "theme=light";
|
theme = "theme=light";
|
||||||
}
|
}
|
||||||
url = api->getServerUrl() + "store/#/flamescion/search?keywords=" + keyword + "&" + theme;
|
|
||||||
|
url = api->getServerUrl() + SparkAPI::getArchDir() + "/#/flamescion/search?keywords=" + QUrl::toPercentEncoding(keyword) + "&" + theme + "&" + "arch=x86";
|
||||||
|
#ifdef __aarch64__
|
||||||
|
url = api->getServerUrl() + SparkAPI::getArchDir() + "/#/flamescion/search?keywords=" + QUrl::toPercentEncoding(keyword) + "&" + theme + "&" + "arch=aarch64";
|
||||||
|
#elif __loongarch__
|
||||||
|
url = api->getServerUrl() + SparkAPI::getArchDir() + "/#/flamescion/search?keywords=" + QUrl::toPercentEncoding(keyword) + "&" + theme + "&" + "arch=loong64";
|
||||||
|
#endif
|
||||||
ui->webEngineView->setUrl(url);
|
ui->webEngineView->setUrl(url);
|
||||||
|
delete api;
|
||||||
}
|
}
|
||||||
|
|
||||||
AppListPage::~AppListPage()
|
AppListPage::~AppListPage()
|
||||||
@@ -84,7 +95,7 @@ void AppListPage::on_webEngineView_urlChanged(const QUrl &arg1)
|
|||||||
if (arg1.path().right(8) == "app.json")
|
if (arg1.path().right(8) == "app.json")
|
||||||
{
|
{
|
||||||
QString url = arg1.toString();
|
QString url = arg1.toString();
|
||||||
url = url.mid(url.indexOf("/store/"));
|
url = url.mid(url.indexOf("/" + SparkAPI::getArchDir() + "/"));
|
||||||
url = "spk:/" + url;
|
url = "spk:/" + url;
|
||||||
url = url.mid(0, url.indexOf("/app.json"));
|
url = url.mid(0, url.indexOf("/app.json"));
|
||||||
qDebug() << "程序跳转链接地址:" << url;
|
qDebug() << "程序跳转链接地址:" << url;
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ class AppListPage : public QWidget
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
void setTheme(bool dark);
|
void setTheme(bool dark);
|
||||||
void getSearchList(QString keyword);
|
void getSearchList(const QString &keyword);
|
||||||
void getAppList(QString type);
|
void getAppList(QString type);
|
||||||
explicit AppListPage(QWidget *parent = nullptr);
|
explicit AppListPage(QWidget *parent = nullptr);
|
||||||
~AppListPage();
|
~AppListPage();
|
||||||
|
|||||||
@@ -1,10 +1,25 @@
|
|||||||
#include "settingspage.h"
|
#include "settingspage.h"
|
||||||
#include "ui_settingspage.h"
|
#include "ui_settingspage.h"
|
||||||
|
#include "../backend/sparkapi.h"
|
||||||
|
#include "utils/utils.h"
|
||||||
|
|
||||||
|
#include <QSettings>
|
||||||
|
#include <QtConcurrent>
|
||||||
|
#include <QDebug>
|
||||||
|
|
||||||
|
#define TMP_PATH "/tmp/spark-store"
|
||||||
|
#define DEFAULT_SERVER_URL "https://cdn.d.store.deepinos.org.cn/"
|
||||||
|
|
||||||
|
|
||||||
|
bool SettingsPage::needUncompatibleNotification = true;
|
||||||
bool SettingsPage::isdownload = false;
|
bool SettingsPage::isdownload = false;
|
||||||
SettingsPage::SettingsPage(QWidget *parent) : QWidget(parent),
|
|
||||||
ui(new Ui::SettingsPage)
|
SettingsPage::SettingsPage(QWidget *parent)
|
||||||
|
: QWidget(parent)
|
||||||
|
, ui(new Ui::SettingsPage)
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
|
|
||||||
configCanSave = false;
|
configCanSave = false;
|
||||||
initConfig();
|
initConfig();
|
||||||
}
|
}
|
||||||
@@ -25,22 +40,25 @@ void SettingsPage::setTheme(bool dark)
|
|||||||
void SettingsPage::readServerList()
|
void SettingsPage::readServerList()
|
||||||
{
|
{
|
||||||
// 读取服务器列表并初始化
|
// 读取服务器列表并初始化
|
||||||
QFile file(QDir::homePath().toUtf8() + "/.config/spark-store/server.list");
|
QFile file(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/server.list");
|
||||||
|
|
||||||
// 判断文件是否存在
|
// 判断文件是否存在
|
||||||
if (!file.exists())
|
if (!file.exists())
|
||||||
{
|
{
|
||||||
ui->comboBox_server->addItem("https://d.store.deepinos.org.cn/");
|
ui->comboBox_server->addItem(DEFAULT_SERVER_URL);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
|
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
|
||||||
{
|
{
|
||||||
qDebug() << "无法读取server.list";
|
qWarning() << "无法读取 server.list";
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 创建QTextStream对象
|
// 创建 QTextStream 对象
|
||||||
QTextStream textStream(&file);
|
QTextStream textStream(&file);
|
||||||
|
|
||||||
|
textStream.seek(0); // 回到开头
|
||||||
QString lineData = textStream.readLine(); // 读取文件的第一行
|
QString lineData = textStream.readLine(); // 读取文件的第一行
|
||||||
ui->comboBox_server->addItem(lineData);
|
ui->comboBox_server->addItem(lineData);
|
||||||
while (!lineData.isNull())
|
while (!lineData.isNull())
|
||||||
@@ -71,14 +89,17 @@ void SettingsPage::initConfig()
|
|||||||
readServerList();
|
readServerList();
|
||||||
|
|
||||||
// 读取服务器URL并初始化菜单项的链接
|
// 读取服务器URL并初始化菜单项的链接
|
||||||
QSettings readConfig(QDir::homePath() + "/.config/spark-store/config.ini", QSettings::IniFormat);
|
QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
|
||||||
if (!readConfig.value("server/choose").toString().isEmpty() && readConfig.value("server/updated").toString() == "TRUE")
|
if (!config.value("server/choose").toString().isEmpty() && config.value("server/updated").toBool())
|
||||||
{
|
{
|
||||||
qDebug() << readConfig.value("server/choose").toString();
|
qDebug() << config.value("server/choose").toString();
|
||||||
ui->comboBox_server->setCurrentText(readConfig.value("server/choose").toString());
|
ui->comboBox_server->setCurrentText(config.value("server/choose").toString());
|
||||||
SparkAPI::setServerUrl(readConfig.value("server/choose").toString());
|
SparkAPI::setServerUrl(config.value("server/choose").toString());
|
||||||
}
|
}
|
||||||
configCanSave = true; // 防止触发保存配置信号
|
configCanSave = true; // 防止触发保存配置信号
|
||||||
|
|
||||||
|
needUncompatibleNotification = config.value("other/uncompatibleNotification", needUncompatibleNotification).toBool();
|
||||||
|
ui->checkBox->setChecked(needUncompatibleNotification);
|
||||||
}
|
}
|
||||||
|
|
||||||
SettingsPage::~SettingsPage()
|
SettingsPage::~SettingsPage()
|
||||||
@@ -91,11 +112,23 @@ void SettingsPage::on_pushButton_updateServer_clicked()
|
|||||||
QtConcurrent::run([=]()
|
QtConcurrent::run([=]()
|
||||||
{
|
{
|
||||||
ui->pushButton_updateServer->setEnabled(false);
|
ui->pushButton_updateServer->setEnabled(false);
|
||||||
|
|
||||||
|
|
||||||
|
QFile::remove(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/server.list");
|
||||||
|
auto updateSuccess = system("curl -o " + QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation).toUtf8() + "/server.list " /* 注意空格的问题 */ + DEFAULT_SERVER_URL + "store/server-and-mirror.list");
|
||||||
|
qDebug() << "Update serverlist status:" << updateSuccess;
|
||||||
|
if (updateSuccess != 0) // 更新失败不换服务器配置
|
||||||
|
{
|
||||||
|
QFile file(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/server.list");
|
||||||
|
if (file.exists())
|
||||||
|
{
|
||||||
|
file.remove();
|
||||||
|
}
|
||||||
|
// FIXME: 向用户提示更新失败
|
||||||
|
ui->pushButton_updateServer->setEnabled(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
ui->comboBox_server->clear();
|
ui->comboBox_server->clear();
|
||||||
|
|
||||||
QFile::remove(QDir::homePath().toUtf8() + "/.config/spark-store/server.list");
|
|
||||||
system("curl -o " + QDir::homePath().toUtf8() + "/.config/spark-store/server.list https://d.store.deepinos.org.cn/store/server-and-mirror.list");
|
|
||||||
|
|
||||||
ui->pushButton_updateServer->setEnabled(true);
|
ui->pushButton_updateServer->setEnabled(true);
|
||||||
readServerList();
|
readServerList();
|
||||||
ui->comboBox_server->setCurrentIndex(0); });
|
ui->comboBox_server->setCurrentIndex(0); });
|
||||||
@@ -105,14 +138,14 @@ void SettingsPage::on_comboBox_server_currentIndexChanged(const QString &arg1)
|
|||||||
{
|
{
|
||||||
SparkAPI::setServerUrl(arg1); // 服务器信息更新
|
SparkAPI::setServerUrl(arg1); // 服务器信息更新
|
||||||
qDebug() << arg1;
|
qDebug() << arg1;
|
||||||
const QString updatedInfo = "TRUE";
|
bool updatedInfo = true;
|
||||||
if (configCanSave)
|
if(configCanSave)
|
||||||
{
|
{
|
||||||
// ui->label_setting1->show();
|
// ui->label_setting1->show();
|
||||||
QSettings *setConfig = new QSettings(QDir::homePath() + "/.config/spark-store/config.ini", QSettings::IniFormat);
|
QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
|
||||||
setConfig->setValue("server/choose", arg1);
|
config.setValue("server/choose", arg1);
|
||||||
setConfig->setValue("server/updated", updatedInfo);
|
config.setValue("server/updated", updatedInfo);
|
||||||
setConfig->deleteLater();
|
config.sync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -183,7 +216,8 @@ void SettingsPage::on_pushButton_updateApt_clicked()
|
|||||||
emit openUrl(QUrl("spk://store/tools/spark-store"));
|
emit openUrl(QUrl("spk://store/tools/spark-store"));
|
||||||
ui->label_aptserver->setText(tr(""));
|
ui->label_aptserver->setText(tr(""));
|
||||||
|
|
||||||
ui->pushButton_updateApt->setEnabled(true); });
|
ui->pushButton_updateApt->setEnabled(true);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void SettingsPage::on_pushButton_clear_clicked()
|
void SettingsPage::on_pushButton_clear_clicked()
|
||||||
@@ -192,7 +226,7 @@ void SettingsPage::on_pushButton_clear_clicked()
|
|||||||
{
|
{
|
||||||
ui->pushButton_clear->setEnabled(false);
|
ui->pushButton_clear->setEnabled(false);
|
||||||
|
|
||||||
QDir tmpdir("/tmp/spark-store");
|
QDir tmpdir(QString::fromUtf8(TMP_PATH));
|
||||||
tmpdir.setFilter(QDir::Files);
|
tmpdir.setFilter(QDir::Files);
|
||||||
int quantity = int(tmpdir.count());
|
int quantity = int(tmpdir.count());
|
||||||
for(int i = 0; i < quantity; i++)
|
for(int i = 0; i < quantity; i++)
|
||||||
@@ -208,12 +242,22 @@ void SettingsPage::on_pushButton_clearWebCache_clicked()
|
|||||||
{
|
{
|
||||||
QtConcurrent::run([=]()
|
QtConcurrent::run([=]()
|
||||||
{
|
{
|
||||||
QString dataLocal = QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation);
|
QString localDataLocation = QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation) + "/QtWebEngine";
|
||||||
qDebug() << dataLocal;
|
qDebug() << localDataLocation;
|
||||||
QDir dataDir(dataLocal);
|
QDir dataDir(localDataLocation);
|
||||||
dataDir.removeRecursively();
|
dataDir.removeRecursively();
|
||||||
dataLocal = QStandardPaths::writableLocation(QStandardPaths::TempLocation);
|
|
||||||
qDebug() << dataLocal;
|
QString cacheLocation = QStandardPaths::writableLocation(QStandardPaths::CacheLocation) + "/QtWebEngine";
|
||||||
QDir cacheDir(dataLocal);
|
qDebug() << cacheLocation;
|
||||||
cacheDir.removeRecursively(); });
|
QDir cacheDir(cacheLocation);
|
||||||
|
cacheDir.removeRecursively();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void SettingsPage::on_checkBox_clicked(bool checked)
|
||||||
|
{
|
||||||
|
needUncompatibleNotification = checked;
|
||||||
|
QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
|
||||||
|
config.setValue("other/uncompatibleNotification", needUncompatibleNotification);
|
||||||
|
config.sync();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,14 +2,7 @@
|
|||||||
#define SETTINGSPAGE_H
|
#define SETTINGSPAGE_H
|
||||||
|
|
||||||
#include <QWidget>
|
#include <QWidget>
|
||||||
#include <QFile>
|
#include <QUrl>
|
||||||
#include <QDir>
|
|
||||||
#include <QDebug>
|
|
||||||
#include <QSettings>
|
|
||||||
#include <QtConcurrent>
|
|
||||||
#include "../backend/sparkapi.h"
|
|
||||||
#include "utils/utils.h"
|
|
||||||
#define TMP_PATH "/tmp/spark-store"
|
|
||||||
|
|
||||||
namespace Ui {
|
namespace Ui {
|
||||||
class SettingsPage;
|
class SettingsPage;
|
||||||
@@ -37,6 +30,11 @@ private slots:
|
|||||||
|
|
||||||
void on_pushButton_clearWebCache_clicked();
|
void on_pushButton_clearWebCache_clicked();
|
||||||
|
|
||||||
|
void on_checkBox_clicked(bool checked);
|
||||||
|
|
||||||
|
public:
|
||||||
|
static bool needUncompatibleNotification;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static bool isdownload;
|
static bool isdownload;
|
||||||
bool configCanSave;
|
bool configCanSave;
|
||||||
|
|||||||
@@ -54,7 +54,7 @@
|
|||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QScrollArea" name="scrollArea_2">
|
<widget class="QScrollArea" name="scrollArea">
|
||||||
<property name="styleSheet">
|
<property name="styleSheet">
|
||||||
<string notr="true"/>
|
<string notr="true"/>
|
||||||
</property>
|
</property>
|
||||||
@@ -67,21 +67,21 @@
|
|||||||
<property name="widgetResizable">
|
<property name="widgetResizable">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QWidget" name="scrollAreaWidgetContents_3">
|
<widget class="QWidget" name="scrollAreaWidgetContents">
|
||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>679</width>
|
<width>688</width>
|
||||||
<height>741</height>
|
<height>940</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_23">
|
<layout class="QVBoxLayout" name="verticalLayout_23">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QWidget" name="widget_6" native="true">
|
<widget class="QWidget" name="widget" native="true">
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_22">
|
<layout class="QVBoxLayout" name="verticalLayout_22">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="label_2">
|
<widget class="QLabel" name="label">
|
||||||
<property name="font">
|
<property name="font">
|
||||||
<font>
|
<font>
|
||||||
<pointsize>18</pointsize>
|
<pointsize>18</pointsize>
|
||||||
@@ -93,10 +93,10 @@
|
|||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QWidget" name="widget_7" native="true">
|
<widget class="QWidget" name="widget_2" native="true">
|
||||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="label_3">
|
<widget class="QLabel" name="label_2">
|
||||||
<property name="maximumSize">
|
<property name="maximumSize">
|
||||||
<size>
|
<size>
|
||||||
<width>100</width>
|
<width>100</width>
|
||||||
@@ -132,7 +132,7 @@
|
|||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="label_setting1">
|
<widget class="QLabel" name="label_setting">
|
||||||
<property name="maximumSize">
|
<property name="maximumSize">
|
||||||
<size>
|
<size>
|
||||||
<width>160</width>
|
<width>160</width>
|
||||||
@@ -140,12 +140,12 @@
|
|||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Take effect when restart</string>
|
<string>Take effect immediately</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<spacer name="horizontalSpacer_3">
|
<spacer name="horizontalSpacer">
|
||||||
<property name="orientation">
|
<property name="orientation">
|
||||||
<enum>Qt::Horizontal</enum>
|
<enum>Qt::Horizontal</enum>
|
||||||
</property>
|
</property>
|
||||||
@@ -161,10 +161,10 @@
|
|||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QWidget" name="widget_8" native="true">
|
<widget class="QWidget" name="widget_3" native="true">
|
||||||
<layout class="QGridLayout" name="gridLayout_3">
|
<layout class="QGridLayout" name="gridLayout_3">
|
||||||
<item row="0" column="3">
|
<item row="0" column="3">
|
||||||
<spacer name="horizontalSpacer_4">
|
<spacer name="horizontalSpacer_2">
|
||||||
<property name="orientation">
|
<property name="orientation">
|
||||||
<enum>Qt::Horizontal</enum>
|
<enum>Qt::Horizontal</enum>
|
||||||
</property>
|
</property>
|
||||||
@@ -177,7 +177,7 @@
|
|||||||
</spacer>
|
</spacer>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="0" colspan="4">
|
<item row="1" column="0" colspan="4">
|
||||||
<widget class="QLabel" name="label_7">
|
<widget class="QLabel" name="label_4">
|
||||||
<property name="styleSheet">
|
<property name="styleSheet">
|
||||||
<string notr="true">color:#808080</string>
|
<string notr="true">color:#808080</string>
|
||||||
</property>
|
</property>
|
||||||
@@ -190,7 +190,7 @@
|
|||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="0" column="0">
|
<item row="0" column="0">
|
||||||
<widget class="QLabel" name="label_6">
|
<widget class="QLabel" name="label_3">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Spark Store Update</string>
|
<string>Spark Store Update</string>
|
||||||
</property>
|
</property>
|
||||||
@@ -217,10 +217,44 @@
|
|||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QWidget" name="widget_9" native="true">
|
<widget class="QWidget" name="widget_7" native="true">
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="label_11">
|
||||||
|
<property name="font">
|
||||||
|
<font>
|
||||||
|
<pointsize>18</pointsize>
|
||||||
|
</font>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Other Settings</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QWidget" name="widget_8" native="true">
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout_3">
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="checkBox">
|
||||||
|
<property name="text">
|
||||||
|
<string>Enable notification for apps not compatible with current system</string>
|
||||||
|
</property>
|
||||||
|
<property name="checked">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QWidget" name="widget_4" native="true">
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_26">
|
<layout class="QVBoxLayout" name="verticalLayout_26">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="label_8">
|
<widget class="QLabel" name="label_5">
|
||||||
<property name="font">
|
<property name="font">
|
||||||
<font>
|
<font>
|
||||||
<pointsize>18</pointsize>
|
<pointsize>18</pointsize>
|
||||||
@@ -232,10 +266,10 @@
|
|||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QWidget" name="widget_10" native="true">
|
<widget class="QWidget" name="widget_5" native="true">
|
||||||
<layout class="QGridLayout" name="gridLayout_4">
|
<layout class="QGridLayout" name="gridLayout_4">
|
||||||
<item row="2" column="0" colspan="5">
|
<item row="2" column="0" colspan="5">
|
||||||
<widget class="QLabel" name="label_12">
|
<widget class="QLabel" name="label_8">
|
||||||
<property name="styleSheet">
|
<property name="styleSheet">
|
||||||
<string notr="true">color:#808080</string>
|
<string notr="true">color:#808080</string>
|
||||||
</property>
|
</property>
|
||||||
@@ -252,14 +286,14 @@
|
|||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="0" column="0" colspan="2">
|
<item row="0" column="0" colspan="2">
|
||||||
<widget class="QLabel" name="label_11">
|
<widget class="QLabel" name="label_6">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string>Location:/tmp/spark-store</string>
|
<string>Location:/tmp/spark-store</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="0" column="4">
|
<item row="0" column="4">
|
||||||
<spacer name="horizontalSpacer_5">
|
<spacer name="horizontalSpacer_3">
|
||||||
<property name="orientation">
|
<property name="orientation">
|
||||||
<enum>Qt::Horizontal</enum>
|
<enum>Qt::Horizontal</enum>
|
||||||
</property>
|
</property>
|
||||||
@@ -279,7 +313,7 @@
|
|||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item row="1" column="0">
|
<item row="1" column="0">
|
||||||
<widget class="QLabel" name="label_13">
|
<widget class="QLabel" name="label_7">
|
||||||
<property name="maximumSize">
|
<property name="maximumSize">
|
||||||
<size>
|
<size>
|
||||||
<width>80</width>
|
<width>80</width>
|
||||||
@@ -305,10 +339,10 @@
|
|||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QWidget" name="widget_2" native="true">
|
<widget class="QWidget" name="widget_6" native="true">
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_25">
|
<layout class="QVBoxLayout" name="verticalLayout_25">
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="label_4">
|
<widget class="QLabel" name="label_9">
|
||||||
<property name="font">
|
<property name="font">
|
||||||
<font>
|
<font>
|
||||||
<pointsize>18</pointsize>
|
<pointsize>18</pointsize>
|
||||||
@@ -320,9 +354,9 @@
|
|||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="label_5">
|
<widget class="QLabel" name="label_10">
|
||||||
<property name="text">
|
<property name="text">
|
||||||
<string><html><head/><body><p>We are <span style=" font-weight:600;">NOT</span> the official team, just like you, we are just one of the many Linux/deepin system enthusiasts and users, we develop and run the &quot;Spark Store&quot;! &quot;, is to bring the community together to share useful software, or to participate in development together, so that we all use the latest and greatest software. </p><p>We don't make a profit from this, all developers and maintainers don't get paid, and we rely on the community's donations to us for most of our expenses, which we are grateful for and which allow us not to spend too much energy worrying about funding. </p><p>Our service and software are free for everyone to use, communicate, and learn, but you must comply with local laws and regulations in the process of your use, otherwise any problems have nothing to do with us. </p><p>If any part of the store infringes your rights, please tell us &lt;jifengshenmo@outlook.com&gt; we will remove the infringing content as soon as possible. </p><p>If you'd like to get involved with us too, whether you're involved in development, design, pitching or submitting work, we welcome you to join us. </p><p>Connect us on Spark IM: <a href="https://chat.shenmo.tech"><span style=" text-decoration: underline; color:#0000ff;">https://chat.shenmo.tech<br/></span></a>Our QQ Group number:872690351</p></body></html></string>
|
<string><html><head/><body><p>Our services and software are free for individuals and non-profit organizations to use, communicate and learn, but you must comply with local laws and regulations in the process of use, otherwise any problems have nothing to do with us. </p><p>We don't make a profit from the Community version store, we rely on donations from the community for most of our operating expenses, and we appreciate that this allows us to spend less energy worrying about money. However, in order to better provide continuous service, Spark is only free for individual users to open the service warehouse, if you or your organization needs to provide commercial services or your organization is a for-profit organization, please contact us to obtain commercial authorization. </p><p>When using the Software, users or organizations are strictly forbidden to engage in any form of malicious behavior, including but not limited to malicious attacks, abuse, destruction, bulk crawling of the software warehouse, etc. The definition of malicious behavior is judged by the Spark community, and violators will be held legally responsible. Spark Community reserves the right to distribute the software packages it produces. </p><p>Any person or organization is prohibited from using the Spark Community software package for commercial purposes or redistributing it without the express authorization of the Spark Community. This clause is intended to ensure the spirit of open source while safeguarding the intellectual property rights of the Spark community. In addition to the above, if you use the Spark Store main program or part of its code, you are subject to all other terms and requirements of the GPL v3.</p><p>If any part of the store infringes your rights, please tell us <a href="mailto:jifengshenmo@outlook.com"><span style=" text-decoration: underline; color:#0082fa;">jifengshenmo@outlook.com</span></a> we will remove the infringing content as soon as possible. </p><p>If you'd like to get involved with us too, whether you're involved in development, design, pitching or submitting work, we welcome you to join us. </p><p><span style=" text-decoration: underline; color:#0000ff;"><br/></span>Our contact method can be found at <a href="https://blog.shenmo.tech/post/%E6%95%85%E9%9A%9C%E5%85%AC%E5%91%8A/"><span style=" text-decoration: underline; color:#0082fa;">Here</span></a></p></body></html></string>
|
||||||
</property>
|
</property>
|
||||||
<property name="wordWrap">
|
<property name="wordWrap">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
@@ -336,7 +370,7 @@
|
|||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<spacer name="verticalSpacer_4">
|
<spacer name="verticalSpacer">
|
||||||
<property name="orientation">
|
<property name="orientation">
|
||||||
<enum>Qt::Vertical</enum>
|
<enum>Qt::Vertical</enum>
|
||||||
</property>
|
</property>
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
TARGET = spark-dstore-patch
|
|
||||||
TEMPLATE += app
|
|
||||||
QT += widgets
|
|
||||||
SOURCES += spark-dstore-tool.cpp
|
|
||||||
|
|
||||||
# Default rules for deployment.
|
|
||||||
qnx: target.path = /tmp/spark-store/bin
|
|
||||||
else: unix:!android: target.path = /opt/durapps/spark-store/bin
|
|
||||||
!isEmpty(target.path): INSTALLS += target
|
|
||||||
@@ -1,195 +0,0 @@
|
|||||||
#include <QCoreApplication>
|
|
||||||
#include <QDir>
|
|
||||||
#include <QJsonObject>
|
|
||||||
#include <QJsonDocument>
|
|
||||||
#include <QDebug>
|
|
||||||
#include <QDirIterator>
|
|
||||||
#include <QProcess>
|
|
||||||
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
QList<QJsonObject> enumAppInfoList()
|
|
||||||
{
|
|
||||||
QList<QJsonObject> appInfoList;
|
|
||||||
QDir apps("/opt/apps");
|
|
||||||
auto list = apps.entryList(QDir::Dirs | QDir::NoDotAndDotDot);
|
|
||||||
for (auto &appID : list) {
|
|
||||||
auto infoPath = apps.absoluteFilePath(appID + "/info");
|
|
||||||
QFile infoFile(infoPath);
|
|
||||||
if (!infoFile.open(QIODevice::ReadOnly)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
auto doc = QJsonDocument::fromJson(infoFile.readAll());
|
|
||||||
appInfoList.push_back(doc.object());
|
|
||||||
}
|
|
||||||
return appInfoList;
|
|
||||||
}
|
|
||||||
//这段是去找appid和info,没看懂用来干啥的,在此之后info文件也没再用过
|
|
||||||
//可能以后版本的实现会用到,等官方加功能再说
|
|
||||||
void linkDir(const QString &source, const QString &target)
|
|
||||||
{
|
|
||||||
auto ensureTargetDir = [](const QString &targetFile) {
|
|
||||||
QFileInfo t(targetFile);
|
|
||||||
QDir tDir(t.dir());
|
|
||||||
tDir.mkpath(".");
|
|
||||||
};
|
|
||||||
|
|
||||||
QDir sourceDir(source);
|
|
||||||
QDir targetDir(target);
|
|
||||||
QDirIterator iter(source, QDir::Files | QDir::NoDotAndDotDot, QDirIterator::Subdirectories);
|
|
||||||
while (iter.hasNext()) {
|
|
||||||
auto sourceFile = iter.next();
|
|
||||||
auto targetFile = targetDir.absoluteFilePath(sourceDir.relativeFilePath(sourceFile));
|
|
||||||
|
|
||||||
QFileInfo tfi(targetFile);
|
|
||||||
// if (tfi.isSymLink() && (tfi.canonicalFilePath() == sourceFile)) {
|
|
||||||
//这里官方应该是写错了,否则会每触发一次就把所有软链接都删了重新创建一次
|
|
||||||
if (tfi.isSymLink() && (tfi.symLinkTarget() == sourceFile)) {
|
|
||||||
continue;
|
|
||||||
} else {
|
|
||||||
QFile::remove(targetFile);
|
|
||||||
}
|
|
||||||
|
|
||||||
ensureTargetDir(targetFile);
|
|
||||||
auto ret = symlink(sourceFile.toStdString().c_str(), targetFile.toStdString().c_str());
|
|
||||||
if (0 != ret) {
|
|
||||||
qDebug() << "link failed" << sourceFile << "=>" << targetFile << ret;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//reset Dynamic library rpath
|
|
||||||
void setRpath(const QString &file, const QString &path)
|
|
||||||
{
|
|
||||||
if (!QFileInfo::exists(path))
|
|
||||||
return;
|
|
||||||
QProcess p;
|
|
||||||
auto cmd = "patchelf " + file + " --set-rpath " + path;
|
|
||||||
p.start("bash", QStringList {"-c", cmd});
|
|
||||||
p.waitForFinished();
|
|
||||||
}
|
|
||||||
|
|
||||||
QString getGlic()
|
|
||||||
{
|
|
||||||
//get arch & glibc
|
|
||||||
QProcess p;
|
|
||||||
auto cmd = "gcc -dumpmachine";
|
|
||||||
p.start("bash", QStringList {"-c", cmd});
|
|
||||||
p.waitForFinished();
|
|
||||||
return p.readAll();
|
|
||||||
}
|
|
||||||
|
|
||||||
void linkApp(const QJsonObject &app)
|
|
||||||
{
|
|
||||||
auto appID = app.value("appid").toString();
|
|
||||||
auto appEntriesDir = QDir("/opt/apps/" + appID + "/entries");
|
|
||||||
auto appLibsDir = QDir("/opt/apps/" + appID + "/files/lib");
|
|
||||||
auto autoStartDir = QDir(appEntriesDir.absoluteFilePath("autostart"));
|
|
||||||
|
|
||||||
bool autoStart = app.value("permissions").toObject().value("autostart").toBool();
|
|
||||||
if (autoStart) {
|
|
||||||
linkDir(appEntriesDir.absoluteFilePath("autostart"), "/etc/xdg/autostart");
|
|
||||||
}
|
|
||||||
|
|
||||||
// link application
|
|
||||||
auto sysShareDir = QDir("/usr/share");
|
|
||||||
linkDir(appEntriesDir.absoluteFilePath("applications"), sysShareDir.absoluteFilePath("applications"));
|
|
||||||
linkDir(appEntriesDir.absoluteFilePath("icons"), sysShareDir.absoluteFilePath("icons"));
|
|
||||||
linkDir(appEntriesDir.absoluteFilePath("mime"), sysShareDir.absoluteFilePath("mime"));
|
|
||||||
linkDir(appEntriesDir.absoluteFilePath("glib-2.0"), sysShareDir.absoluteFilePath("glib-2.0"));
|
|
||||||
linkDir(appEntriesDir.absoluteFilePath("services"), sysShareDir.absoluteFilePath("dbus-1/services"));
|
|
||||||
linkDir(appEntriesDir.absoluteFilePath("GConf"), sysShareDir.absoluteFilePath("GConf"));
|
|
||||||
linkDir(appEntriesDir.absoluteFilePath("help"), sysShareDir.absoluteFilePath("help"));
|
|
||||||
linkDir(appEntriesDir.absoluteFilePath("locale"), sysShareDir.absoluteFilePath("locale"));
|
|
||||||
linkDir(appEntriesDir.absoluteFilePath("fcitx"), sysShareDir.absoluteFilePath("fcitx"));
|
|
||||||
linkDir(appEntriesDir.absoluteFilePath("polkit"), sysShareDir.absoluteFilePath("polkit-1"));
|
|
||||||
linkDir(appEntriesDir.absoluteFilePath("fonts/conf"), "/etc/fonts/conf.d");
|
|
||||||
linkDir(appEntriesDir.absoluteFilePath("fonts/files"), sysShareDir.absoluteFilePath("fonts"));
|
|
||||||
|
|
||||||
|
|
||||||
//原来会导致Gtk相关应用翻译缺失,补足了
|
|
||||||
|
|
||||||
|
|
||||||
auto pluginDir = QDir(appEntriesDir.absoluteFilePath("plugins"));
|
|
||||||
if (pluginDir.exists()) {
|
|
||||||
QString arch = getGlic();
|
|
||||||
// if (pluginDir.exists()) {
|
|
||||||
// QDirIterator iter(pluginDir.absolutePath(), QDir::Files | QDir::NoDotAndDotDot, QDirIterator::Subdirectories);
|
|
||||||
// while (iter.hasNext()) {
|
|
||||||
// auto sourceFile = iter.next();
|
|
||||||
// setRpath(sourceFile, appLibsDir.absolutePath()); //set rpath
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
linkDir(appEntriesDir.absoluteFilePath("plugins/fcitx"), "/usr/lib/" + arch + "/fcitx");
|
|
||||||
linkDir(appEntriesDir.absoluteFilePath("plugins/browser"), "/usr/lib/mozilla/plugins");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void cleanLink()
|
|
||||||
{
|
|
||||||
auto cleanDirBrokenLink = [](const QString &dir) {
|
|
||||||
QProcess p;
|
|
||||||
auto cmd = "find " + dir + " -xtype l -delete";
|
|
||||||
p.start("bash", QStringList {"-c", cmd});
|
|
||||||
p.waitForFinished();
|
|
||||||
};
|
|
||||||
|
|
||||||
QString arch = getGlic();
|
|
||||||
auto sysShareDir = QDir("/usr/share");
|
|
||||||
cleanDirBrokenLink(sysShareDir.absoluteFilePath("applications"));
|
|
||||||
cleanDirBrokenLink(sysShareDir.absoluteFilePath("icons"));
|
|
||||||
cleanDirBrokenLink(sysShareDir.absoluteFilePath("mime/packages"));
|
|
||||||
cleanDirBrokenLink(sysShareDir.absoluteFilePath("glib-2.0"));
|
|
||||||
cleanDirBrokenLink(sysShareDir.absoluteFilePath("dbus-1/services"));
|
|
||||||
cleanDirBrokenLink("/etc/xdg/autostart");
|
|
||||||
cleanDirBrokenLink(sysShareDir.absoluteFilePath("fcitx"));
|
|
||||||
cleanDirBrokenLink(sysShareDir.absoluteFilePath("help"));
|
|
||||||
cleanDirBrokenLink(sysShareDir.absoluteFilePath("locale"));
|
|
||||||
cleanDirBrokenLink("/usr/lib/" + arch + "/fcitx");
|
|
||||||
cleanDirBrokenLink("/usr/lib/mozilla/plugins");
|
|
||||||
cleanDirBrokenLink(sysShareDir.absoluteFilePath("polkit-1/actions"));
|
|
||||||
cleanDirBrokenLink(sysShareDir.absoluteFilePath("fonts"));
|
|
||||||
cleanDirBrokenLink("/etc/fonts/conf.d");
|
|
||||||
}
|
|
||||||
|
|
||||||
void update()
|
|
||||||
{
|
|
||||||
QProcess p;
|
|
||||||
auto cmd = "glib-compile-schemas /usr/share/glib-2.0/schemas/";
|
|
||||||
p.start("bash", QStringList {"-c", cmd});
|
|
||||||
p.waitForFinished();
|
|
||||||
|
|
||||||
cmd = "update-icon-caches /usr/share/icons/*";
|
|
||||||
p.start("bash", QStringList {"-c", cmd});
|
|
||||||
p.waitForFinished();
|
|
||||||
|
|
||||||
cmd = "update-desktop-database -q";
|
|
||||||
p.start("bash", QStringList {"-c", cmd});
|
|
||||||
p.waitForFinished();
|
|
||||||
|
|
||||||
cmd = "update-mime-database -V /usr/share/mime";
|
|
||||||
p.start("bash", QStringList {"-c", cmd});
|
|
||||||
p.waitForFinished();
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
|
||||||
{
|
|
||||||
QCoreApplication app(argc, argv);
|
|
||||||
|
|
||||||
cleanLink();
|
|
||||||
|
|
||||||
for (auto &a : enumAppInfoList()) {
|
|
||||||
linkApp(a);
|
|
||||||
}
|
|
||||||
qInfo()<<"Spark dstore patch (c) The Spark Project 2022-Now. Modified from deepin-app-store-tool";
|
|
||||||
|
|
||||||
// trigger
|
|
||||||
update();
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
@@ -4,7 +4,7 @@
|
|||||||
#
|
#
|
||||||
#-------------------------------------------------
|
#-------------------------------------------------
|
||||||
|
|
||||||
QT += core gui network concurrent webenginewidgets dbus svg
|
QT += core gui concurrent dbus network svg webenginewidgets
|
||||||
|
|
||||||
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
|
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
|
||||||
|
|
||||||
@@ -22,78 +22,86 @@ DEFINES += QT_DEPRECATED_WARNINGS
|
|||||||
# You can also select to disable deprecated APIs only up to a certain version of Qt.
|
# You can also select to disable deprecated APIs only up to a certain version of Qt.
|
||||||
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
|
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
|
||||||
|
|
||||||
DEFINES += QT_APP_DEBUG
|
# Get build version from qmake
|
||||||
|
VERSION = $$BUILD_VERSION
|
||||||
|
isEmpty(VERSION): VERSION = 4.0.0
|
||||||
|
DEFINES += APP_VERSION=\\\"'$${VERSION}'\\\"
|
||||||
|
DEFINES += APP_BRANCH=\\\"'$$system(git symbolic-ref --short -q HEAD)'\\\"
|
||||||
|
# Disable qWarning / qDebug output in Release
|
||||||
|
#CONFIG(release, debug | release): DEFINES += QT_NO_WARNING_OUTPUT QT_NO_DEBUG_OUTPUT
|
||||||
|
|
||||||
CONFIG += c++11 link_pkgconfig
|
CONFIG += c++11 link_pkgconfig
|
||||||
PKGCONFIG += dtkcore dtkgui dtkwidget
|
PKGCONFIG += dtkcore dtkgui dtkwidget
|
||||||
|
|
||||||
# Disable qWarning / qDebug output in Release
|
|
||||||
CONFIG(release, debug|release): DEFINES += QT_NO_WARNING_OUTPUT QT_NO_DEBUG_OUTPUT
|
|
||||||
|
|
||||||
# Update translation files
|
|
||||||
CONFIG(release, debug|release): system(bash $${PWD}/translate_generation.sh)
|
|
||||||
|
|
||||||
TRANSLATIONS += \
|
|
||||||
../translations/spark-store_en.ts \
|
|
||||||
../translations/spark-store_fr.ts \
|
|
||||||
../translations/spark-store_zh_CN.ts
|
|
||||||
|
|
||||||
SOURCES += \
|
SOURCES += \
|
||||||
dbus/dbussparkstoreservice.cpp \
|
backend/DataCollectorAndUploader.cpp \
|
||||||
main.cpp \
|
backend/ThemeChecker.cpp \
|
||||||
mainwindow-dtk.cpp \
|
backend/downloadworker.cpp \
|
||||||
|
backend/image_show.cpp \
|
||||||
backend/sparkapi.cpp \
|
backend/sparkapi.cpp \
|
||||||
|
dbus/dbussparkstoreservice.cpp \
|
||||||
|
pages/appintopage.cpp \
|
||||||
|
pages/applistpage.cpp \
|
||||||
pages/settingspage.cpp \
|
pages/settingspage.cpp \
|
||||||
|
utils/httprequest.cpp \
|
||||||
utils/utils.cpp \
|
utils/utils.cpp \
|
||||||
utils/widgetanimation.cpp \
|
utils/widgetanimation.cpp \
|
||||||
widgets/common/progressbutton.cpp \
|
widgets/base/basewidgetopacity.cpp \
|
||||||
widgets/common/webenginepage.cpp \
|
|
||||||
widgets/common/webengineview.cpp \
|
|
||||||
widgets/downloadlistwidget.cpp \
|
|
||||||
widgets/common/downloaditem.cpp \
|
widgets/common/downloaditem.cpp \
|
||||||
|
widgets/common/progressbutton.cpp \
|
||||||
widgets/common/smoothlistwidget.cpp \
|
widgets/common/smoothlistwidget.cpp \
|
||||||
widgets/common/smoothscrollbar.cpp \
|
widgets/common/smoothscrollbar.cpp \
|
||||||
utils/httprequest.cpp \
|
widgets/common/webenginepage.cpp \
|
||||||
pages/applistpage.cpp \
|
widgets/common/webengineview.cpp \
|
||||||
backend/downloadworker.cpp \
|
|
||||||
pages/appintopage.cpp \
|
|
||||||
widgets/big_image.cpp \
|
widgets/big_image.cpp \
|
||||||
backend/image_show.cpp \
|
widgets/downloadlistwidget.cpp \
|
||||||
widgets/base/basewidgetopacity.cpp
|
application.cpp \
|
||||||
|
main.cpp \
|
||||||
|
mainwindow-dtk.cpp
|
||||||
|
|
||||||
HEADERS += \
|
HEADERS += \
|
||||||
dbus/dbussparkstoreservice.h \
|
backend/DataCollectorAndUploader.h \
|
||||||
mainwindow-dtk.h \
|
backend/ThemeChecker.h \
|
||||||
|
backend/downloadworker.h \
|
||||||
|
backend/image_show.h \
|
||||||
backend/sparkapi.h \
|
backend/sparkapi.h \
|
||||||
|
dbus/dbussparkstoreservice.h \
|
||||||
|
pages/appintopage.h \
|
||||||
|
pages/applistpage.h \
|
||||||
pages/settingspage.h \
|
pages/settingspage.h \
|
||||||
|
utils/httprequest.h \
|
||||||
utils/utils.h \
|
utils/utils.h \
|
||||||
utils/widgetanimation.h \
|
utils/widgetanimation.h \
|
||||||
widgets/common/progressbutton.h \
|
widgets/base/basewidgetopacity.h \
|
||||||
widgets/common/webenginepage.h \
|
|
||||||
widgets/common/webengineview.h \
|
|
||||||
widgets/downloadlistwidget.h \
|
|
||||||
widgets/common/downloaditem.h \
|
widgets/common/downloaditem.h \
|
||||||
|
widgets/common/progressbutton.h \
|
||||||
widgets/common/smoothlistwidget.h \
|
widgets/common/smoothlistwidget.h \
|
||||||
widgets/common/smoothscrollbar.h \
|
widgets/common/smoothscrollbar.h \
|
||||||
utils/httprequest.h \
|
widgets/common/webenginepage.h \
|
||||||
pages/applistpage.h \
|
widgets/common/webengineview.h \
|
||||||
backend/downloadworker.h \
|
|
||||||
pages/appintopage.h \
|
|
||||||
widgets/big_image.h \
|
widgets/big_image.h \
|
||||||
backend/image_show.h \
|
widgets/downloadlistwidget.h \
|
||||||
widgets/base/basewidgetopacity.h
|
application.h \
|
||||||
|
mainwindow-dtk.h
|
||||||
|
|
||||||
FORMS += \
|
FORMS += \
|
||||||
mainwindow-dtk.ui \
|
pages/appintopage.ui \
|
||||||
pages/settingspage.ui \
|
|
||||||
widgets/downloadlistwidget.ui \
|
|
||||||
widgets/common/downloaditem.ui \
|
|
||||||
pages/applistpage.ui \
|
pages/applistpage.ui \
|
||||||
pages/appintopage.ui
|
pages/settingspage.ui \
|
||||||
|
widgets/common/downloaditem.ui \
|
||||||
|
widgets/downloadlistwidget.ui \
|
||||||
|
mainwindow-dtk.ui
|
||||||
|
|
||||||
RESOURCES += \
|
RESOURCES += \
|
||||||
assets/assets.qrc
|
assets/assets.qrc
|
||||||
|
|
||||||
|
TRANSLATIONS += \
|
||||||
|
../translations/spark-store_en.ts \
|
||||||
|
../translations/spark-store_es.ts \
|
||||||
|
../translations/spark-store_fr.ts \
|
||||||
|
../translations/spark-store_zh_CN.ts \
|
||||||
|
../translations/spark-store_zh_TW.ts
|
||||||
|
|
||||||
# Default rules for deployment.
|
# Default rules for deployment.
|
||||||
qnx: target.path = /tmp/$${TARGET}/bin
|
qnx: target.path = /tmp/$${TARGET}/bin
|
||||||
else: unix:!android: target.path = /opt/durapps/$${TARGET}/bin
|
else: unix:!android: target.path = /opt/durapps/$${TARGET}/bin
|
||||||
|
|||||||
@@ -1,14 +1,21 @@
|
|||||||
#include "httprequest.h"
|
#include "httprequest.h"
|
||||||
|
|
||||||
HttpRequest::HttpRequest()
|
HttpRequest::HttpRequest(QObject *parent):QObject(parent)
|
||||||
{
|
{
|
||||||
|
QString headers = "Mozilla/5.0 Spark-Store/"+ QString(APP_VERSION)+" (Linux; "+QSysInfo::prettyProductName().toUtf8()+");";
|
||||||
|
QByteArray ba = headers.toLatin1();
|
||||||
|
rawHeaders = strdup(ba.data());
|
||||||
|
}
|
||||||
|
// 在析构函数中释放 rawHeaders 的内存
|
||||||
|
HttpRequest::~HttpRequest()
|
||||||
|
{
|
||||||
|
free(rawHeaders);
|
||||||
}
|
}
|
||||||
|
|
||||||
void HttpRequest::getRequest(QNetworkRequest request)
|
void HttpRequest::getRequest(QNetworkRequest request)
|
||||||
{
|
{
|
||||||
QNetworkAccessManager *naManager = new QNetworkAccessManager(this);
|
QNetworkAccessManager *naManager = new QNetworkAccessManager(this);
|
||||||
|
request.setRawHeader("User-Agent", rawHeaders);
|
||||||
request.setRawHeader("User-Agent", "Mozilla/5.0");
|
|
||||||
request.setRawHeader("Content-Type", "charset='utf-8'");
|
request.setRawHeader("Content-Type", "charset='utf-8'");
|
||||||
request.setRawHeader("Content-Type", "application/json");
|
request.setRawHeader("Content-Type", "application/json");
|
||||||
|
|
||||||
@@ -26,6 +33,7 @@ QString HttpRequest::postRequest(QString url, QString jsondata)
|
|||||||
QNetworkAccessManager *naManager = new QNetworkAccessManager(this);
|
QNetworkAccessManager *naManager = new QNetworkAccessManager(this);
|
||||||
QUrl strUrl = url.replace("+", "%2B");
|
QUrl strUrl = url.replace("+", "%2B");
|
||||||
request.setUrl(strUrl);
|
request.setUrl(strUrl);
|
||||||
|
request.setRawHeader("User-Agent", rawHeaders);
|
||||||
request.setRawHeader("Content-Type", "charset='utf-8'");
|
request.setRawHeader("Content-Type", "charset='utf-8'");
|
||||||
request.setRawHeader("Content-Type", "application/json");
|
request.setRawHeader("Content-Type", "application/json");
|
||||||
|
|
||||||
|
|||||||
@@ -10,8 +10,11 @@
|
|||||||
class HttpRequest : public QObject
|
class HttpRequest : public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
private:
|
||||||
|
char* rawHeaders;
|
||||||
public:
|
public:
|
||||||
HttpRequest();
|
HttpRequest(QObject *parent = nullptr);
|
||||||
|
~HttpRequest();
|
||||||
|
|
||||||
void getRequest(QNetworkRequest request);
|
void getRequest(QNetworkRequest request);
|
||||||
|
|
||||||
|
|||||||
@@ -1,19 +1,34 @@
|
|||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
#include "application.h"
|
||||||
|
|
||||||
Utils::Utils()
|
#include <DSysInfo>
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
// Author: chatGPT
|
#include <QDBusInterface>
|
||||||
void Utils::sendNotification(QString icon, QString title, QString body)
|
#include <QProcessEnvironment>
|
||||||
|
#include <QSettings>
|
||||||
|
#include <QStandardPaths>
|
||||||
|
#include <QFile>
|
||||||
|
#include <QUuid>
|
||||||
|
#include <QJsonDocument>
|
||||||
|
|
||||||
|
#define UOSDeveloperModeFile "/var/lib/deepin/developer-mode/enabled"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author chatGPT
|
||||||
|
* @brief Utils::sendNotification 发送系统通知
|
||||||
|
* @param icon 图标名称
|
||||||
|
* @param title 通知标题
|
||||||
|
* @param body 通知内容
|
||||||
|
*/
|
||||||
|
void Utils::sendNotification(const QString &icon, const QString &title, const QString &body)
|
||||||
{
|
{
|
||||||
QDBusInterface iface("org.freedesktop.Notifications",
|
QDBusInterface interface("org.freedesktop.Notifications",
|
||||||
"/org/freedesktop/Notifications",
|
"/org/freedesktop/Notifications",
|
||||||
"org.freedesktop.Notifications");
|
"org.freedesktop.Notifications");
|
||||||
|
|
||||||
QVariantList args;
|
QVariantList args;
|
||||||
args << QCoreApplication::applicationName() // the name of the application
|
args << Application::applicationName() // the name of the application
|
||||||
<< (uint)0 // replaces the previous notification with the same ID
|
<< static_cast<quint32>(0) // replaces the previous notification with the same ID
|
||||||
<< icon // the application icon of the notification
|
<< icon // the application icon of the notification
|
||||||
<< title // the title of the notification
|
<< title // the title of the notification
|
||||||
<< body // the body of the notification
|
<< body // the body of the notification
|
||||||
@@ -21,5 +36,228 @@ void Utils::sendNotification(QString icon, QString title, QString body)
|
|||||||
<< QVariantMap() // no hints
|
<< QVariantMap() // no hints
|
||||||
<< -1; // no timeout
|
<< -1; // no timeout
|
||||||
|
|
||||||
iface.callWithArgumentList(QDBus::AutoDetect, "Notify", args);
|
interface.callWithArgumentList(QDBus::AutoDetect, "Notify", args);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Utils::isDDE 判断是否使用 DDE 桌面环境
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
bool Utils::isDDE()
|
||||||
|
{
|
||||||
|
bool isDDE = true;
|
||||||
|
if (!QString::fromUtf8(qgetenv("XDG_CURRENT_DESKTOP")).toLower().startsWith("deepin"))
|
||||||
|
{
|
||||||
|
qputenv("XDG_CURRENT_DESKTOP", "Deepin");
|
||||||
|
isDDE = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return isDDE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Utils::isWayland 判断是否使用 wayland 显示协议
|
||||||
|
* @return bool true: 使用 wayland 显示协议 false: 使用 x11 显示协议
|
||||||
|
*/
|
||||||
|
bool Utils::isWayland()
|
||||||
|
{
|
||||||
|
bool isWayland = false;
|
||||||
|
QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
|
||||||
|
QString XDG_SESSION_TYPE = env.value(QStringLiteral("XDG_SESSION_TYPE"));
|
||||||
|
QString WAYLAND_DISPLAY = env.value(QStringLiteral("WAYLAND_DISPLAY"));
|
||||||
|
if (XDG_SESSION_TYPE == QLatin1String("wayland") || WAYLAND_DISPLAY.contains(QLatin1String("wayland"), Qt::CaseInsensitive))
|
||||||
|
{
|
||||||
|
isWayland = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return isWayland;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 判断是否使用 TreeLand 混合器
|
||||||
|
* @return bool true: 使用 TreeLand 混合器 false: 非 TreeLand 混合器
|
||||||
|
*/
|
||||||
|
bool Utils::isTreeLand()
|
||||||
|
{
|
||||||
|
bool isTreeLand = false;
|
||||||
|
if (qgetenv("DDE_CURRENT_COMPOSITOR").toLower() == "treeland") {
|
||||||
|
isTreeLand = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return isTreeLand;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Utils::isPhytium()
|
||||||
|
{
|
||||||
|
bool isPhytium = false;
|
||||||
|
QProcess process;
|
||||||
|
process.start("lscpu");
|
||||||
|
process.waitForFinished();
|
||||||
|
|
||||||
|
|
||||||
|
QString output = process.readAllStandardOutput();
|
||||||
|
if (output.contains(QLatin1String("Phytium")))
|
||||||
|
{
|
||||||
|
isPhytium = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return isPhytium;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @brief Utils::initConfig 初始化 config.ini 配置文件,去除废弃字段
|
||||||
|
*/
|
||||||
|
void Utils::initConfig()
|
||||||
|
{
|
||||||
|
// WARNING: 请在 组织名称 和 应用程序名称 初始化完成后调用
|
||||||
|
bool useWayland = true;
|
||||||
|
|
||||||
|
QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
|
||||||
|
if (config.contains("build/useWayland"))
|
||||||
|
{
|
||||||
|
useWayland = config.value("build/useWayland").toBool();
|
||||||
|
}
|
||||||
|
config.remove("build/isDeepinOS");
|
||||||
|
config.remove("build/isWayland");
|
||||||
|
config.remove("build/useWayland");
|
||||||
|
|
||||||
|
config.setValue("runtime/isDDE", isDDE());
|
||||||
|
config.setValue("runtime/isWayland", isWayland());
|
||||||
|
// Check config file, if there is no wayland config, then set it to default, which means use wayland if possible.
|
||||||
|
if (!config.contains("runtime/useWayland"))
|
||||||
|
{
|
||||||
|
config.setValue("runtime/useWayland", useWayland);
|
||||||
|
}
|
||||||
|
|
||||||
|
// check uuid
|
||||||
|
if (!config.contains("info/uuid")){
|
||||||
|
config.setValue("info/uuid", initUUID());
|
||||||
|
}
|
||||||
|
config.sync(); // 写入更改至 config.ini,并同步最新内容
|
||||||
|
|
||||||
|
checkUOSDeveloperMode(); // Check UOS developer mode
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Utils::isUOS 判断是否为 UOS 操作系统
|
||||||
|
* @return bool true: UOS 操作系统 false: 非 UOS 操作系统
|
||||||
|
*/
|
||||||
|
bool Utils::isUOS()
|
||||||
|
{
|
||||||
|
// WARNING: 请在 组织名称 和 应用程序名称 初始化完成后调用
|
||||||
|
bool isUOS = false;
|
||||||
|
|
||||||
|
QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
|
||||||
|
if (Dtk::Core::DSysInfo::productType() == Dtk::Core::DSysInfo::Uos)
|
||||||
|
{
|
||||||
|
isUOS = true;
|
||||||
|
config.setValue("UOS/isUOS", true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
isUOS = false;
|
||||||
|
config.remove("UOS");
|
||||||
|
}
|
||||||
|
config.sync(); // 写入更改至 config.ini,并同步最新内容
|
||||||
|
|
||||||
|
return isUOS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Utils::initUUID 生成 UUID
|
||||||
|
*/
|
||||||
|
QString Utils::initUUID(){
|
||||||
|
QUuid uuid = QUuid::createUuid();
|
||||||
|
return uuid.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Utils::setQPAPlatform Set display backend
|
||||||
|
*/
|
||||||
|
void Utils::setQPAPlatform()
|
||||||
|
{
|
||||||
|
// WARNING: 请在 initConfig() 执行后调用
|
||||||
|
bool isDDE = Utils::isDDE(); // WARNING: 只能执行一次,后续执行时环境变量已经被覆盖,导致判断错误
|
||||||
|
bool isWayland = Utils::isWayland();
|
||||||
|
|
||||||
|
QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
|
||||||
|
bool useWayland = config.value("runtime/useWayland").toBool();
|
||||||
|
|
||||||
|
qDebug() << "System Wayland enabled:" << isWayland << "Spark Wayland enabled:" << useWayland;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* NOTE: https://github.com/linuxdeepin/developer-center/issues/7217#issuecomment-1922653903
|
||||||
|
* DDE Wayland has been deprecated, so using wayland plugin only
|
||||||
|
*/
|
||||||
|
if (isWayland && useWayland /*&& !(Dtk::Core::DSysInfo::isDeepin() || isDDE)*/)
|
||||||
|
{
|
||||||
|
qputenv("QT_QPA_PLATFORM", "wayland");
|
||||||
|
}
|
||||||
|
// else if (isWayland && useWayland && (Dtk::Core::DSysInfo::isDeepin() && isDDE))
|
||||||
|
// {
|
||||||
|
// qputenv("QT_QPA_PLATFORM", "dwayland");
|
||||||
|
// }
|
||||||
|
else
|
||||||
|
{
|
||||||
|
qputenv("QT_QPA_PLATFORM", "dxcb");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Utils::checkUOSDeveloperMode Check UOS developer mode
|
||||||
|
*/
|
||||||
|
void Utils::checkUOSDeveloperMode()
|
||||||
|
{
|
||||||
|
QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
|
||||||
|
|
||||||
|
QFile file(UOSDeveloperModeFile);
|
||||||
|
if (Utils::isUOS() && file.exists() && file.open(QFile::ReadOnly | QFile::Text))
|
||||||
|
{
|
||||||
|
QString lineData = QString::fromUtf8(file.readLine());
|
||||||
|
bool devmode = lineData.trimmed().toInt();
|
||||||
|
qDebug() << "UOS Developer Mode Status:" << devmode;
|
||||||
|
config.setValue("UOS/EnableDeveloperMode", devmode);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* NOTE: Utils::isUOS() 中,判断为非 UOS 时已经从 config 中删除 UOS 组,
|
||||||
|
* 此处若包含该字段则一定是 UOS,直接写入开发者模式开关状态即可
|
||||||
|
*/
|
||||||
|
if (config.contains("UOS/EnableDeveloperMode"))
|
||||||
|
{
|
||||||
|
config.setValue("UOS/EnableDeveloperMode", false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
file.close();
|
||||||
|
config.sync(); // 写入更改至 config.ini,并同步最新内容
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Utils::parseFeatureJsonFile 解析版本特性 json 文件
|
||||||
|
* @return 返回 QJsonObject
|
||||||
|
*/
|
||||||
|
QJsonObject Utils::parseFeatureJsonFile()
|
||||||
|
{
|
||||||
|
QFile file(":/json/features.json");
|
||||||
|
if (!file.open(QFile::ReadOnly))
|
||||||
|
{
|
||||||
|
qWarning() << Q_FUNC_INFO << "features.json open failed";
|
||||||
|
return QJsonObject();
|
||||||
|
}
|
||||||
|
|
||||||
|
QJsonParseError error;
|
||||||
|
QJsonDocument jsonDoc = QJsonDocument::fromJson(file.readAll(), &error);
|
||||||
|
if (error.error != QJsonParseError::NoError || jsonDoc.isNull())
|
||||||
|
{
|
||||||
|
qWarning() << Q_FUNC_INFO << "features.json validate failed:" << error.errorString();
|
||||||
|
return QJsonObject();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (jsonDoc.isEmpty() || !jsonDoc.isObject())
|
||||||
|
{
|
||||||
|
qWarning() << Q_FUNC_INFO << "features jsonDoc parse failed:" << jsonDoc;
|
||||||
|
return QJsonObject();
|
||||||
|
}
|
||||||
|
|
||||||
|
return jsonDoc.object();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,13 +2,22 @@
|
|||||||
#define UTILS_H
|
#define UTILS_H
|
||||||
|
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QtDBus>
|
#include <QJsonObject>
|
||||||
|
|
||||||
class Utils
|
class Utils
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Utils();
|
static void sendNotification(const QString &icon, const QString &title, const QString &body);
|
||||||
static void sendNotification(QString icon,QString title,QString body);
|
static bool isDDE();
|
||||||
|
static bool isWayland();
|
||||||
|
static bool isTreeLand();
|
||||||
|
static void initConfig();
|
||||||
|
static bool isUOS();
|
||||||
|
static bool isPhytium();
|
||||||
|
static QString initUUID();
|
||||||
|
static void setQPAPlatform();
|
||||||
|
static void checkUOSDeveloperMode();
|
||||||
|
static QJsonObject parseFeatureJsonFile();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // UTILS_H
|
#endif // UTILS_H
|
||||||
|
|||||||
@@ -1,8 +1,5 @@
|
|||||||
#include "widgetanimation.h"
|
#include "widgetanimation.h"
|
||||||
|
#include "widgets/base/basewidgetopacity.h"
|
||||||
WidgetAnimation::WidgetAnimation()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void WidgetAnimation::widgetShake(QWidget *pWidget, int nRange)
|
void WidgetAnimation::widgetShake(QWidget *pWidget, int nRange)
|
||||||
{
|
{
|
||||||
@@ -28,27 +25,35 @@ void WidgetAnimation::widgetShake(QWidget *pWidget, int nRange)
|
|||||||
QPropertyAnimation *WidgetAnimation::createWidgetOpacity(QWidget *pWidget, bool isAppear)
|
QPropertyAnimation *WidgetAnimation::createWidgetOpacity(QWidget *pWidget, bool isAppear)
|
||||||
{
|
{
|
||||||
QPropertyAnimation *animation = new QPropertyAnimation(pWidget, "windowOpacity", pWidget);
|
QPropertyAnimation *animation = new QPropertyAnimation(pWidget, "windowOpacity", pWidget);
|
||||||
// 设置动画效果
|
|
||||||
animation->setEasingCurve(QEasingCurve::Linear);
|
|
||||||
// 设置动画时间(单位:毫秒)
|
// 设置动画时间(单位:毫秒)
|
||||||
animation->setDuration(500);
|
animation->setDuration(500);
|
||||||
// 设置动画步长值,以及在该位置时显示的透明度
|
|
||||||
if (isAppear)
|
if (isAppear)
|
||||||
{
|
{
|
||||||
animation->setKeyValueAt(0, 0);
|
// 设置动画效果
|
||||||
// m_animation->setKeyValueAt(0.5, 0);
|
animation->setEasingCurve(QEasingCurve::Linear);
|
||||||
animation->setKeyValueAt(1, 1);
|
// 设置动画步长值,以及在该位置时显示的透明度(即动画关键帧)
|
||||||
|
animation->setKeyValueAt(0.0, 0.0);
|
||||||
|
animation->setKeyValueAt(1.0, 1.0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
animation->setKeyValueAt(0, 1);
|
animation->setEasingCurve(QEasingCurve::OutQuart);
|
||||||
animation->setKeyValueAt(1, 0);
|
animation->setKeyValueAt(0.0, 1.0);
|
||||||
|
animation->setKeyValueAt(1.0, 0.0);
|
||||||
|
|
||||||
|
QObject::connect(animation, &QPropertyAnimation::finished, pWidget, [=]() { pWidget->close(); });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QObject::connect(animation, &QPropertyAnimation::valueChanged, pWidget, [=]()
|
||||||
|
{
|
||||||
|
pWidget->update(); // NOTE: 保证窗口透明度动画平滑
|
||||||
|
});
|
||||||
|
|
||||||
return animation;
|
return animation;
|
||||||
}
|
}
|
||||||
|
|
||||||
void WidgetAnimation::widgetOpacity(QWidget *pWidget, bool isAppear)
|
void WidgetAnimation::widgetOpacity(QWidget *pWidget, bool isAppear)
|
||||||
{
|
{
|
||||||
// 开始动画
|
// 启动/关闭动画
|
||||||
createWidgetOpacity(pWidget, isAppear)->start();
|
createWidgetOpacity(pWidget, isAppear)->start(QPropertyAnimation::DeleteWhenStopped);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,14 +1,12 @@
|
|||||||
#ifndef WIDGETANIMATION_H
|
#ifndef WIDGETANIMATION_H
|
||||||
#define WIDGETANIMATION_H
|
#define WIDGETANIMATION_H
|
||||||
|
|
||||||
#include <QObject>
|
|
||||||
#include <QWidget>
|
#include <QWidget>
|
||||||
#include <QPropertyAnimation>
|
#include <QPropertyAnimation>
|
||||||
|
|
||||||
class WidgetAnimation
|
class WidgetAnimation
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
WidgetAnimation();
|
|
||||||
static void widgetShake(QWidget *pWidget, int nRange);
|
static void widgetShake(QWidget *pWidget, int nRange);
|
||||||
|
|
||||||
static QPropertyAnimation* createWidgetOpacity(QWidget *pWidget, bool isAppear);
|
static QPropertyAnimation* createWidgetOpacity(QWidget *pWidget, bool isAppear);
|
||||||
|
|||||||
@@ -1,37 +1,57 @@
|
|||||||
#include "basewidgetopacity.h"
|
#include "basewidgetopacity.h"
|
||||||
|
#include "utils/widgetanimation.h"
|
||||||
|
#include "utils/utils.h"
|
||||||
|
|
||||||
#include <QCloseEvent>
|
#include <QSettings>
|
||||||
|
#include <QStandardPaths>
|
||||||
#include <QPropertyAnimation>
|
#include <QPropertyAnimation>
|
||||||
|
#include <QCloseEvent>
|
||||||
|
|
||||||
BaseWidgetOpacity::BaseWidgetOpacity(QWidget *parent) : DBlurEffectWidget(parent)
|
BaseWidgetOpacity::BaseWidgetOpacity(QWidget *parent) : DBlurEffectWidget(parent)
|
||||||
{
|
{
|
||||||
// WidgetAnimation::widgetOpacity(this,true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @brief 窗口关闭事件
|
/**
|
||||||
/// @param event
|
* @brief 窗口显示事件
|
||||||
|
* @param event
|
||||||
|
*/
|
||||||
|
void BaseWidgetOpacity::showEvent(QShowEvent *event)
|
||||||
|
{
|
||||||
|
// FIXME: wayland 不支持直接设置窗口透明度,需要调用 wayland 相关库(考虑抄控制中心“窗口移动时启用透明特效”代码?)
|
||||||
|
QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
|
||||||
|
bool isWayland = Utils::isWayland();
|
||||||
|
if (!isWayland)
|
||||||
|
{
|
||||||
|
if (!showWindowAnimation)
|
||||||
|
{
|
||||||
|
showWindowAnimation = true;
|
||||||
|
WidgetAnimation::widgetOpacity(this, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DBlurEffectWidget::showEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief 窗口关闭事件
|
||||||
|
* @param event
|
||||||
|
*/
|
||||||
void BaseWidgetOpacity::closeEvent(QCloseEvent *event)
|
void BaseWidgetOpacity::closeEvent(QCloseEvent *event)
|
||||||
{
|
{
|
||||||
|
// FIXME: wayland 不支持直接设置窗口透明度,需要调用 wayland 相关库(考虑抄控制中心“窗口移动时启用透明特效”代码?)
|
||||||
|
QSettings config(QStandardPaths::writableLocation(QStandardPaths::AppConfigLocation) + "/config.ini", QSettings::IniFormat);
|
||||||
|
bool isWayland = Utils::isWayland();
|
||||||
|
if (isWayland)
|
||||||
|
{
|
||||||
|
closeWindowAnimation = true;
|
||||||
|
return DBlurEffectWidget::closeEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
if (!closeWindowAnimation)
|
if (!closeWindowAnimation)
|
||||||
{
|
{
|
||||||
closeWindowAnimation = true;
|
closeWindowAnimation = true;
|
||||||
|
WidgetAnimation::widgetOpacity(this, false);
|
||||||
|
|
||||||
QPropertyAnimation *animation = new QPropertyAnimation(this, "windowOpacity");
|
|
||||||
animation->setEasingCurve(QEasingCurve::OutQuart);
|
|
||||||
animation->setDuration(500);
|
|
||||||
animation->setStartValue(1.0);
|
|
||||||
animation->setEndValue(0.0);
|
|
||||||
|
|
||||||
QObject::connect(animation, &QPropertyAnimation::valueChanged, this, [=](const QVariant &value)
|
|
||||||
{
|
|
||||||
this->update();
|
|
||||||
// setWindowTitle(QString("ヾ(⌒∇⌒*)See You♪ - %1%").arg(int(value.toFloat() * 100)));
|
|
||||||
});
|
|
||||||
|
|
||||||
QObject::connect(animation, &QPropertyAnimation::finished, this, [=]()
|
|
||||||
{ this->close(); });
|
|
||||||
|
|
||||||
animation->start();
|
|
||||||
event->ignore();
|
event->ignore();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -8,17 +8,17 @@ DWIDGET_USE_NAMESPACE
|
|||||||
class BaseWidgetOpacity : public DBlurEffectWidget
|
class BaseWidgetOpacity : public DBlurEffectWidget
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit BaseWidgetOpacity(QWidget *parent = nullptr);
|
explicit BaseWidgetOpacity(QWidget *parent = nullptr);
|
||||||
|
|
||||||
signals:
|
|
||||||
|
|
||||||
public slots:
|
|
||||||
|
|
||||||
// QWidget interface
|
|
||||||
protected:
|
protected:
|
||||||
bool closeWindowAnimation = false;
|
void showEvent(QShowEvent *event) override;
|
||||||
void closeEvent(QCloseEvent *event) override;
|
void closeEvent(QCloseEvent *event) override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool showWindowAnimation = false;
|
||||||
|
bool closeWindowAnimation = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // BASEWIDGETOPACITY_H
|
#endif // BASEWIDGETOPACITY_H
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
#include "big_image.h"
|
#include "big_image.h"
|
||||||
|
#include "qapplication.h"
|
||||||
|
|
||||||
#include <QHBoxLayout>
|
#include <QHBoxLayout>
|
||||||
|
#include <QScreen>
|
||||||
#include <QtConcurrent>
|
#include <QtConcurrent>
|
||||||
|
|
||||||
big_image::big_image(DBlurEffectWidget *parent) : DBlurEffectWidget(parent),
|
big_image::big_image(DBlurEffectWidget *parent) : DBlurEffectWidget(parent),
|
||||||
@@ -17,13 +19,16 @@ big_image::big_image(DBlurEffectWidget *parent) : DBlurEffectWidget(parent),
|
|||||||
layout->addWidget(m_image);
|
layout->addWidget(m_image);
|
||||||
layout->setMargin(0);
|
layout->setMargin(0);
|
||||||
|
|
||||||
// m_image->setParent(this);
|
// Make sure the image has a parent so that it will be freed.
|
||||||
|
m_image->setParent(this);
|
||||||
// m_image->setMaximumSize(1360,768);
|
// m_image->setMaximumSize(1360,768);
|
||||||
m_image->setAlignment(Qt::AlignCenter);
|
m_image->setAlignment(Qt::AlignCenter);
|
||||||
}
|
}
|
||||||
|
|
||||||
void big_image::setimage(QPixmap image)
|
void big_image::setimage(QPixmap image)
|
||||||
{
|
{
|
||||||
|
QScreen *screen = QApplication::primaryScreen();
|
||||||
|
image.setDevicePixelRatio(screen->devicePixelRatio());
|
||||||
m_image->setPixmap(image);
|
m_image->setPixmap(image);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -22,6 +22,9 @@ DownloadItem::DownloadItem(QWidget *parent) : QWidget(parent),
|
|||||||
ui->pushButton_3->hide();
|
ui->pushButton_3->hide();
|
||||||
ui->widget_spinner->start();
|
ui->widget_spinner->start();
|
||||||
ui->widget_spinner->hide();
|
ui->widget_spinner->hide();
|
||||||
|
|
||||||
|
ui->label->setElideMode(Qt::TextElideMode::ElideRight);
|
||||||
|
ui->label_2->setElideMode(Qt::TextElideMode::ElideRight);
|
||||||
}
|
}
|
||||||
|
|
||||||
DownloadItem::~DownloadItem()
|
DownloadItem::~DownloadItem()
|
||||||
@@ -33,10 +36,12 @@ void DownloadItem::setValue(qint64 value)
|
|||||||
{
|
{
|
||||||
ui->progressBar->setValue(qint32(value));
|
ui->progressBar->setValue(qint32(value));
|
||||||
ui->label_2->setText(QString::number(double(value) / 100) + "% (" + speed + ")");
|
ui->label_2->setText(QString::number(double(value) / 100) + "% (" + speed + ")");
|
||||||
|
ui->label_2->setToolTip(QString::number(double(value) / 100) + "% (" + speed + ")");
|
||||||
if (ui->label_2->text().left(4) == "100%")
|
if (ui->label_2->text().left(4) == "100%")
|
||||||
{
|
{
|
||||||
download = 1;
|
download = 1;
|
||||||
ui->label_2->setText(tr("Download Complete."));
|
ui->label_2->setText(tr("Download Complete."));
|
||||||
|
ui->label_2->setToolTip(tr("Download Complete."));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -48,6 +53,7 @@ void DownloadItem::setMax(qint64 max)
|
|||||||
void DownloadItem::setName(QString name)
|
void DownloadItem::setName(QString name)
|
||||||
{
|
{
|
||||||
ui->label->setText(name);
|
ui->label->setText(name);
|
||||||
|
ui->label->setToolTip(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
QString DownloadItem::getName()
|
QString DownloadItem::getName()
|
||||||
@@ -55,8 +61,21 @@ QString DownloadItem::getName()
|
|||||||
return ui->label_filename->text();
|
return ui->label_filename->text();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DownloadItem::readyInstall()
|
|
||||||
|
/***************************************************************
|
||||||
|
* @brief 告知界面,准备安装
|
||||||
|
* @param
|
||||||
|
* @note 如果正在安装,返回-1
|
||||||
|
* @Sample usage: DownloadItem::install(0);
|
||||||
|
**************************************************************/
|
||||||
|
int DownloadItem::readyInstall()
|
||||||
{
|
{
|
||||||
|
// 检查是否正在安装,如果是返回错误 -1
|
||||||
|
if (isInstall)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
if (!close)
|
if (!close)
|
||||||
{
|
{
|
||||||
ui->progressBar->hide();
|
ui->progressBar->hide();
|
||||||
@@ -64,7 +83,9 @@ void DownloadItem::readyInstall()
|
|||||||
ui->pushButton_install->show();
|
ui->pushButton_install->show();
|
||||||
DownloadItem::install(0);
|
DownloadItem::install(0);
|
||||||
ui->pushButton_2->hide();
|
ui->pushButton_2->hide();
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void DownloadItem::setFileName(QString fileName)
|
void DownloadItem::setFileName(QString fileName)
|
||||||
@@ -87,6 +108,12 @@ void DownloadItem::setSpeed(QString s)
|
|||||||
speed = s;
|
speed = s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***************************************************************
|
||||||
|
* @brief 安装当前应用
|
||||||
|
* @param int t, t为安装方式,可以为 0,1,2
|
||||||
|
* @note 执行这个函数时,需要已经检查是否可以安装,但该函数仍然会再检测一次!
|
||||||
|
* @Sample usage: DownloadItem::install(0);
|
||||||
|
**************************************************************/
|
||||||
void DownloadItem::install(int t)
|
void DownloadItem::install(int t)
|
||||||
{
|
{
|
||||||
if (!isInstall)
|
if (!isInstall)
|
||||||
@@ -96,75 +123,13 @@ void DownloadItem::install(int t)
|
|||||||
ui->widget_spinner->show();
|
ui->widget_spinner->show();
|
||||||
qDebug() << "/tmp/spark-store/" + ui->label_filename->text().toUtf8();
|
qDebug() << "/tmp/spark-store/" + ui->label_filename->text().toUtf8();
|
||||||
ui->label_2->setText(tr("Installing"));
|
ui->label_2->setText(tr("Installing"));
|
||||||
|
ui->label_2->setToolTip(tr("Installing"));
|
||||||
|
|
||||||
QtConcurrent::run([=]()
|
QtConcurrent::run([=]()
|
||||||
{
|
{
|
||||||
QProcess installer;
|
slotAsyncInstall(t);
|
||||||
switch(t)
|
});
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
installer.start("pkexec", QStringList() << "ssinstall" << "/tmp/spark-store/" + ui->label_filename->text().toUtf8());
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
installer.start("deepin-deb-installer", QStringList() << "/tmp/spark-store/" + ui->label_filename->text().toUtf8());
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
installer.start("pkexec", QStringList() << "gdebi" << "-n" << "/tmp/spark-store/" + ui->label_filename->text().toUtf8());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool haveError = false;
|
|
||||||
bool notRoot = false;
|
|
||||||
installer.waitForFinished(-1); // 不设置超时
|
|
||||||
out = installer.readAllStandardOutput();
|
|
||||||
|
|
||||||
QStringList everyOut = out.split("\n");
|
|
||||||
for(int i=0;i<everyOut.size();i++)
|
|
||||||
{
|
|
||||||
if(everyOut[i].left(2) == "E:")
|
|
||||||
{
|
|
||||||
haveError = true;
|
|
||||||
}
|
|
||||||
if(everyOut[i].right(14) == "Not authorized")
|
|
||||||
{
|
|
||||||
notRoot = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QProcess isInstall;
|
|
||||||
isInstall.start("dpkg -s " + pkgName);
|
|
||||||
isInstall.waitForFinished(180*1000); // 默认超时 3 分钟
|
|
||||||
int error = QString::fromStdString(isInstall.readAllStandardError().toStdString()).length();
|
|
||||||
if(error == 0)
|
|
||||||
{
|
|
||||||
ui->pushButton_install->hide();
|
|
||||||
Utils::sendNotification("spark-store",tr("Spark Store"),ui->label->text() + " " + tr("Installation complete."));
|
|
||||||
ui->label_2->setText(tr("Finish"));
|
|
||||||
download = 3;
|
|
||||||
ui->pushButton_3->show();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ui->pushButton_install->show();
|
|
||||||
ui->pushButton_install->setText(tr("Retry"));
|
|
||||||
download = 1;
|
|
||||||
Utils::sendNotification("spark-store",tr("Spark Store"),tr("Error happened in dpkg progress , you can try it again."));
|
|
||||||
ui->label_2->setText(tr("Error happened in dpkg progress , you can try it again"));
|
|
||||||
ui->pushButton_3->show();
|
|
||||||
}
|
|
||||||
|
|
||||||
if(notRoot)
|
|
||||||
{
|
|
||||||
Utils::sendNotification("spark-store",tr("Spark Store"),tr("dpkg progress had been aborted,you can retry installation."));
|
|
||||||
ui->label_2->setText(tr("dpkg progress had been aborted,you can retry installation"));
|
|
||||||
ui->pushButton_install->show();
|
|
||||||
ui->pushButton_3->hide();
|
|
||||||
}
|
|
||||||
|
|
||||||
ui->widget_spinner->hide();
|
|
||||||
DownloadItem::isInstall = false;
|
|
||||||
emit finished(); });
|
|
||||||
// emit finished();
|
|
||||||
qDebug() << ui->label_filename->text().toUtf8();
|
qDebug() << ui->label_filename->text().toUtf8();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -177,6 +142,7 @@ void DownloadItem::on_pushButton_install_clicked()
|
|||||||
void DownloadItem::on_pushButton_2_clicked()
|
void DownloadItem::on_pushButton_2_clicked()
|
||||||
{
|
{
|
||||||
ui->label_2->setText(tr("Download canceled"));
|
ui->label_2->setText(tr("Download canceled"));
|
||||||
|
ui->label_2->setToolTip(tr("Download canceled"));
|
||||||
download = 2;
|
download = 2;
|
||||||
ui->pushButton_2->setEnabled(false);
|
ui->pushButton_2->setEnabled(false);
|
||||||
ui->progressBar->hide();
|
ui->progressBar->hide();
|
||||||
@@ -196,3 +162,90 @@ void DownloadItem::on_pushButton_3_clicked()
|
|||||||
output_w->layout()->addWidget(textbrowser);
|
output_w->layout()->addWidget(textbrowser);
|
||||||
output_w->show();
|
output_w->show();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***************************************************************
|
||||||
|
* @brief 实际安装应用
|
||||||
|
* @param int t, t为安装方式,可以为 0,1,2
|
||||||
|
* @note 备注
|
||||||
|
* @Sample usage: slotAsyncInstall(0);
|
||||||
|
**************************************************************/
|
||||||
|
void DownloadItem::slotAsyncInstall(int t)
|
||||||
|
{
|
||||||
|
QProcess installer;
|
||||||
|
switch (t)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
installer.start("pkexec", QStringList() << "/usr/local/bin/ssinstall"
|
||||||
|
<< "/tmp/spark-store/" + ui->label_filename->text().toUtf8() << "--delete-after-install");
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
installer.start("deepin-deb-installer", QStringList() << "/tmp/spark-store/" + ui->label_filename->text().toUtf8());
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
installer.start("pkexec", QStringList() << "gdebi"
|
||||||
|
<< "-n"
|
||||||
|
<< "/tmp/spark-store/" + ui->label_filename->text().toUtf8());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool haveError = false;
|
||||||
|
bool notRoot = false;
|
||||||
|
installer.waitForFinished(-1); // 不设置超时
|
||||||
|
out = installer.readAllStandardOutput();
|
||||||
|
|
||||||
|
QStringList everyOut = out.split("\n");
|
||||||
|
QString tempOutput;
|
||||||
|
for (int i = 0; i < everyOut.size(); i++)
|
||||||
|
{
|
||||||
|
tempOutput = everyOut[i];
|
||||||
|
if (tempOutput.contains("OMG-IT-GOES-WRONG"))
|
||||||
|
{
|
||||||
|
haveError = true;
|
||||||
|
}
|
||||||
|
if (tempOutput.contains("Not authorized"))
|
||||||
|
{
|
||||||
|
notRoot = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QProcess isInstall;
|
||||||
|
isInstall.start("dpkg", QStringList() << "-s" << pkgName);
|
||||||
|
isInstall.waitForFinished(180 * 1000); // 默认超时 3 分钟
|
||||||
|
int error = QString::fromStdString(isInstall.readAllStandardError().toStdString()).length();
|
||||||
|
if (error == 0 && !haveError)
|
||||||
|
{
|
||||||
|
ui->pushButton_install->hide();
|
||||||
|
Utils::sendNotification("spark-store", tr("Spark Store"), ui->label->text() + " " + tr("Installation complete."));
|
||||||
|
ui->label_2->setText(tr("Finish"));
|
||||||
|
ui->label_2->setToolTip(tr("Finish"));
|
||||||
|
download = 3;
|
||||||
|
ui->pushButton_3->show();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ui->pushButton_install->show();
|
||||||
|
ui->pushButton_install->setText(tr("Retry"));
|
||||||
|
download = 1;
|
||||||
|
Utils::sendNotification("spark-store", tr("Spark Store"), tr("Error happened in dpkg progress , please check the install info or try to reinstall."));
|
||||||
|
ui->label_2->setText(tr("Error happened in dpkg progress , please check the install info or try to reinstall."));
|
||||||
|
ui->label_2->setToolTip(tr("Error happened in dpkg progress , please check the install info or try to reinstall."));
|
||||||
|
ui->pushButton_3->show();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (notRoot)
|
||||||
|
{
|
||||||
|
Utils::sendNotification("spark-store", tr("Spark Store"), tr("dpkg progress had been aborted, please check the install info or try to reinstall."));
|
||||||
|
ui->label_2->setText(tr("dpkg progress had been aborted, please check the install info or try to reinstall."));
|
||||||
|
ui->label_2->setToolTip(tr("dpkg progress had been aborted, please check the install info or try to reinstall."));
|
||||||
|
ui->pushButton_install->show();
|
||||||
|
ui->pushButton_3->hide();
|
||||||
|
}
|
||||||
|
|
||||||
|
ui->widget_spinner->hide();
|
||||||
|
DownloadItem::isInstall = false;
|
||||||
|
|
||||||
|
installer.deleteLater();
|
||||||
|
isInstall.deleteLater();
|
||||||
|
|
||||||
|
emit finished(error == 0 && !haveError && !notRoot);
|
||||||
|
}
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ public:
|
|||||||
void setMax(qint64);
|
void setMax(qint64);
|
||||||
void setName(QString);
|
void setName(QString);
|
||||||
QString getName();
|
QString getName();
|
||||||
void readyInstall();
|
int readyInstall();
|
||||||
|
|
||||||
void setFileName(QString);
|
void setFileName(QString);
|
||||||
void seticon(const QPixmap);
|
void seticon(const QPixmap);
|
||||||
@@ -59,8 +59,10 @@ private slots:
|
|||||||
void on_pushButton_2_clicked();
|
void on_pushButton_2_clicked();
|
||||||
void on_pushButton_3_clicked();
|
void on_pushButton_3_clicked();
|
||||||
|
|
||||||
|
void slotAsyncInstall(int t);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void finished();
|
void finished(bool success);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // DOWNLOADITEM_H
|
#endif // DOWNLOADITEM_H
|
||||||
|
|||||||
@@ -7,13 +7,25 @@
|
|||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>666</width>
|
<width>666</width>
|
||||||
<height>54</height>
|
<height>56</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>0</width>
|
||||||
|
<height>56</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
<property name="maximumSize">
|
<property name="maximumSize">
|
||||||
<size>
|
<size>
|
||||||
<width>16777215</width>
|
<width>16777215</width>
|
||||||
<height>54</height>
|
<height>56</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="windowTitle">
|
<property name="windowTitle">
|
||||||
@@ -40,10 +52,22 @@
|
|||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="label_3">
|
<widget class="QLabel" name="label_3">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>48</width>
|
||||||
|
<height>48</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
<property name="maximumSize">
|
<property name="maximumSize">
|
||||||
<size>
|
<size>
|
||||||
<width>48</width>
|
<width>48</width>
|
||||||
<height>16777215</height>
|
<height>48</height>
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="text">
|
<property name="text">
|
||||||
@@ -52,6 +76,9 @@
|
|||||||
<property name="scaledContents">
|
<property name="scaledContents">
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="alignment">
|
||||||
|
<set>Qt::AlignCenter</set>
|
||||||
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
@@ -70,6 +97,31 @@
|
|||||||
</property>
|
</property>
|
||||||
</spacer>
|
</spacer>
|
||||||
</item>
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="DLabel" name="label">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>120</width>
|
||||||
|
<height>48</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>120</width>
|
||||||
|
<height>48</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Name</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="label_filename">
|
<widget class="QLabel" name="label_filename">
|
||||||
<property name="maximumSize">
|
<property name="maximumSize">
|
||||||
@@ -83,33 +135,6 @@
|
|||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
|
||||||
<widget class="QLabel" name="label">
|
|
||||||
<property name="minimumSize">
|
|
||||||
<size>
|
|
||||||
<width>80</width>
|
|
||||||
<height>0</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="maximumSize">
|
|
||||||
<size>
|
|
||||||
<width>16777215</width>
|
|
||||||
<height>16777215</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
<property name="font">
|
|
||||||
<font>
|
|
||||||
<pointsize>13</pointsize>
|
|
||||||
</font>
|
|
||||||
</property>
|
|
||||||
<property name="text">
|
|
||||||
<string>Name</string>
|
|
||||||
</property>
|
|
||||||
<property name="wordWrap">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
<item>
|
||||||
<spacer name="horizontalSpacer_2">
|
<spacer name="horizontalSpacer_2">
|
||||||
<property name="orientation">
|
<property name="orientation">
|
||||||
@@ -153,11 +178,14 @@
|
|||||||
<property name="leftMargin">
|
<property name="leftMargin">
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="topMargin">
|
||||||
|
<number>8</number>
|
||||||
|
</property>
|
||||||
<property name="rightMargin">
|
<property name="rightMargin">
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="bottomMargin">
|
<property name="bottomMargin">
|
||||||
<number>0</number>
|
<number>8</number>
|
||||||
</property>
|
</property>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QProgressBar" name="progressBar">
|
<widget class="QProgressBar" name="progressBar">
|
||||||
@@ -188,7 +216,7 @@
|
|||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="QLabel" name="label_2">
|
<widget class="DLabel" name="label_2">
|
||||||
<property name="font">
|
<property name="font">
|
||||||
<font>
|
<font>
|
||||||
<pointsize>9</pointsize>
|
<pointsize>9</pointsize>
|
||||||
@@ -297,6 +325,11 @@
|
|||||||
<header location="global">dspinner.h</header>
|
<header location="global">dspinner.h</header>
|
||||||
<container>1</container>
|
<container>1</container>
|
||||||
</customwidget>
|
</customwidget>
|
||||||
|
<customwidget>
|
||||||
|
<class>DLabel</class>
|
||||||
|
<extends>QLabel</extends>
|
||||||
|
<header>dlabel.h</header>
|
||||||
|
</customwidget>
|
||||||
</customwidgets>
|
</customwidgets>
|
||||||
<resources/>
|
<resources/>
|
||||||
<connections/>
|
<connections/>
|
||||||
|
|||||||
@@ -1,20 +1,16 @@
|
|||||||
#include "progressbutton.h"
|
#include "progressbutton.h"
|
||||||
|
#include "widgets/downloadlistwidget.h"
|
||||||
|
|
||||||
#include <QPainter>
|
#include <QPainter>
|
||||||
#include <QPainterPath>
|
#include <QPainterPath>
|
||||||
#include <QRect>
|
#include <QMoveEvent>
|
||||||
#include <QConicalGradient>
|
|
||||||
#include <QVariantAnimation>
|
|
||||||
#include <QSvgRenderer>
|
#include <QSvgRenderer>
|
||||||
|
|
||||||
ProgressButton::ProgressButton(QWidget *parent)
|
ProgressButton::ProgressButton(QWidget *parent)
|
||||||
: QWidget{parent}
|
: QWidget{parent}
|
||||||
{
|
{
|
||||||
// this->setWindowFlags(Qt::FramelessWindowHint);
|
|
||||||
this->setAttribute(Qt::WA_TranslucentBackground, true);
|
|
||||||
setMinimumWidth(36);
|
|
||||||
setMinimumHeight(36);
|
|
||||||
svgPath = "";
|
svgPath = "";
|
||||||
backColor = Qt::transparent;
|
backColor = Qt::transparent;
|
||||||
setMouseTracking(true);
|
|
||||||
|
|
||||||
connect(this, &ProgressButton::startProcessing, this, &ProgressButton::operationProcessing, Qt::QueuedConnection);
|
connect(this, &ProgressButton::startProcessing, this, &ProgressButton::operationProcessing, Qt::QueuedConnection);
|
||||||
}
|
}
|
||||||
@@ -23,69 +19,6 @@ ProgressButton::~ProgressButton()
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void ProgressButton::paintEvent(QPaintEvent *event)
|
|
||||||
{
|
|
||||||
QPainter painter(this);
|
|
||||||
painter.setRenderHint(QPainter::Antialiasing, true);
|
|
||||||
auto rect = event->rect();
|
|
||||||
|
|
||||||
if (buttonState == state::normal || buttonState == state::hover)
|
|
||||||
{
|
|
||||||
auto radiu = (rect.height() - 6) / 2;
|
|
||||||
painter.translate(rect.center());
|
|
||||||
painter.setPen(Qt::transparent);
|
|
||||||
painter.setBrush(QColor(buttonState == state::normal ? color : color.darker()));
|
|
||||||
// painter.drawEllipse(QPoint(0,0),radiu,radiu);
|
|
||||||
|
|
||||||
// radiu -= 3;
|
|
||||||
painter.setBrush(backColor);
|
|
||||||
painter.drawEllipse(QPoint(0, 0), radiu, radiu);
|
|
||||||
|
|
||||||
QSvgRenderer m_svgRender;
|
|
||||||
m_svgRender.load(svgPath);
|
|
||||||
m_svgRender.render(&painter, QRectF(-radiu / 2, -radiu / 2, radiu, radiu));
|
|
||||||
}
|
|
||||||
else if (buttonState == state::openProgress)
|
|
||||||
{
|
|
||||||
painter.translate(rect.center());
|
|
||||||
auto radiu = (rect.height() - 6) / 2 - 3;
|
|
||||||
painter.setBrush(backColor);
|
|
||||||
painter.setPen(QPen(backColor, 3));
|
|
||||||
painter.drawEllipse(QPoint(0, 0), radiu, radiu);
|
|
||||||
|
|
||||||
painter.setPen(QPen(backColor, 3));
|
|
||||||
|
|
||||||
QSvgRenderer m_svgRender;
|
|
||||||
m_svgRender.load(svgPath);
|
|
||||||
m_svgRender.render(&painter, QRectF(-radiu / 2, -radiu / 2, radiu, radiu));
|
|
||||||
|
|
||||||
QRect rect = QRect(-radiu, -radiu,
|
|
||||||
radiu * 2, radiu * 2);
|
|
||||||
|
|
||||||
painter.setPen(QPen(color.darker(100), 3));
|
|
||||||
auto angle = progress * 360 / 100;
|
|
||||||
painter.drawArc(rect.adjusted(-3, -3, 3, 3), 90 * 16, -static_cast<int>(angle * 16));
|
|
||||||
}
|
|
||||||
else if (buttonState == state::closeProgress)
|
|
||||||
{
|
|
||||||
auto radiu = (rect.height() - 6) / 2;
|
|
||||||
painter.translate(rect.center());
|
|
||||||
painter.setPen(Qt::transparent);
|
|
||||||
painter.setBrush(QColor(0, 0, 0, 63));
|
|
||||||
painter.drawEllipse(QPoint(0, 0), radiu, radiu);
|
|
||||||
|
|
||||||
radiu -= 3;
|
|
||||||
painter.setBrush(backColor);
|
|
||||||
painter.drawEllipse(QPoint(0, 0), radiu, radiu);
|
|
||||||
|
|
||||||
painter.setPen(QPen(color, 3, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
|
|
||||||
painter.drawLine(QPoint(-radiu / 3, 0),
|
|
||||||
QPoint(-radiu / 5, radiu / 3));
|
|
||||||
painter.drawLine(QPoint(-radiu / 5, radiu / 3),
|
|
||||||
QPoint(radiu / 4, -radiu / 4));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ProgressButton::setProgress(int progress)
|
void ProgressButton::setProgress(int progress)
|
||||||
{
|
{
|
||||||
buttonState = state::openProgress;
|
buttonState = state::openProgress;
|
||||||
@@ -99,14 +32,19 @@ void ProgressButton::setProgress(int progress)
|
|||||||
{
|
{
|
||||||
buttonState = state::closeProgress;
|
buttonState = state::closeProgress;
|
||||||
update();
|
update();
|
||||||
auto waterDrop = new WaterDrop();
|
WaterDrop *waterDrop = new WaterDrop(parentWidget());
|
||||||
waterDrop->move(this->mapToGlobal(this->rect().center()));
|
waterDrop->move(QRectF(geometry()).center());
|
||||||
waterDrop->show();
|
waterDrop->show();
|
||||||
}
|
}
|
||||||
repaint();
|
repaint();
|
||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ProgressButton::setDownloadListWidget(DownloadListWidget *widget)
|
||||||
|
{
|
||||||
|
m_downloadListWidget = widget;
|
||||||
|
}
|
||||||
|
|
||||||
void ProgressButton::setIcon(QString svgPATH)
|
void ProgressButton::setIcon(QString svgPATH)
|
||||||
{
|
{
|
||||||
svgPath = svgPATH;
|
svgPath = svgPATH;
|
||||||
@@ -125,6 +63,53 @@ void ProgressButton::setColor(QColor color)
|
|||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ProgressButton::mousePressEvent(QMouseEvent *event)
|
||||||
|
{
|
||||||
|
m_mouseMoved = false;
|
||||||
|
m_isDownloadListWidgetVisible = m_downloadListWidget->isVisible();
|
||||||
|
m_downloadListWidget->hide();
|
||||||
|
QWidget::mousePressEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProgressButton::mouseReleaseEvent(QMouseEvent *event)
|
||||||
|
{
|
||||||
|
if (buttonState == state::hover
|
||||||
|
|| buttonState == state::normal
|
||||||
|
|| buttonState == state::closeProgress)
|
||||||
|
{
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_mouseMoved) {
|
||||||
|
return QWidget::mouseReleaseEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (m_isDownloadListWidgetVisible) {
|
||||||
|
m_downloadListWidget->hide();
|
||||||
|
} else {
|
||||||
|
QPoint pos(this->mapToGlobal(QPoint(0, 0)));
|
||||||
|
pos += QPoint(width() / 2 - m_downloadListWidget->width() / 2, height() + 5);
|
||||||
|
m_downloadListWidget->m_move(pos.x(), pos.y());
|
||||||
|
m_downloadListWidget->setWindowState(windowState() & Qt::WindowState::WindowActive);
|
||||||
|
m_downloadListWidget->activateWindow();
|
||||||
|
m_downloadListWidget->show();
|
||||||
|
m_downloadListWidget->raise();
|
||||||
|
}
|
||||||
|
m_isDownloadListWidgetVisible = m_downloadListWidget->isVisible();
|
||||||
|
QWidget::mouseReleaseEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProgressButton::mouseDoubleClickEvent(QMouseEvent *event)
|
||||||
|
{
|
||||||
|
event->accept();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProgressButton::mouseMoveEvent(QMouseEvent *event)
|
||||||
|
{
|
||||||
|
m_mouseMoved = true;
|
||||||
|
QWidget::mouseMoveEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
void ProgressButton::leaveEvent(QEvent *event)
|
void ProgressButton::leaveEvent(QEvent *event)
|
||||||
{
|
{
|
||||||
if (buttonState == state::hover)
|
if (buttonState == state::hover)
|
||||||
@@ -135,53 +120,92 @@ void ProgressButton::leaveEvent(QEvent *event)
|
|||||||
QWidget::leaveEvent(event);
|
QWidget::leaveEvent(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ProgressButton::mousePressEvent(QMouseEvent *event)
|
void ProgressButton::paintEvent(QPaintEvent *event)
|
||||||
{
|
{
|
||||||
if (buttonState == state::hover || buttonState == state::normal)
|
QPainter painter(this);
|
||||||
|
painter.setRenderHint(QPainter::Antialiasing, true);
|
||||||
|
QRectF rect = this->rect();
|
||||||
|
|
||||||
|
if (buttonState == state::normal || buttonState == state::hover)
|
||||||
{
|
{
|
||||||
widthChangeValue = (this->width() - 6) / 2;
|
qreal radius = rect.height() / 2;
|
||||||
update();
|
painter.translate(rect.center());
|
||||||
|
painter.setPen(Qt::transparent);
|
||||||
|
painter.setBrush(backColor);
|
||||||
|
painter.drawEllipse(QPointF(0, 0), radius, radius);
|
||||||
|
|
||||||
|
QSvgRenderer m_svgRender;
|
||||||
|
m_svgRender.load(svgPath);
|
||||||
|
m_svgRender.render(&painter, QRectF(-radius / 2, -radius / 2, radius, radius));
|
||||||
|
}
|
||||||
|
else if (buttonState == state::openProgress)
|
||||||
|
{
|
||||||
|
qreal radius = rect.height() / 2 - 1;
|
||||||
|
painter.translate(rect.center());
|
||||||
|
painter.setPen(QPen(backColor.darker(), 2));
|
||||||
|
painter.setBrush(backColor);
|
||||||
|
painter.drawEllipse(QPointF(0, 0), radius, radius);
|
||||||
|
|
||||||
|
QRectF rectF = QRectF(-radius, -radius, radius * 2, radius * 2);
|
||||||
|
painter.setPen(QPen(color.darker(100), 2));
|
||||||
|
qreal angle = progress * 360 / 100 * 1.0;
|
||||||
|
painter.drawArc(rectF, 90 * 16, -qIntCast(angle * 16));
|
||||||
|
|
||||||
|
QSvgRenderer m_svgRender;
|
||||||
|
m_svgRender.load(svgPath);
|
||||||
|
m_svgRender.render(&painter, QRectF(-radius / 2, -radius / 2, radius, radius));
|
||||||
}
|
}
|
||||||
else if (buttonState == state::closeProgress)
|
else if (buttonState == state::closeProgress)
|
||||||
{
|
{
|
||||||
update();
|
qreal radius = rect.height() / 2 - 1;
|
||||||
|
painter.translate(rect.center());
|
||||||
|
painter.setPen(QPen(color.darker(100), 2));
|
||||||
|
painter.setBrush(backColor);
|
||||||
|
painter.drawEllipse(QPointF(0, 0), radius, radius);
|
||||||
|
|
||||||
|
painter.setPen(QPen(color, 2, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin));
|
||||||
|
painter.drawLine(QPointF(-radius / 3, 0),
|
||||||
|
QPointF(-radius / 5, radius / 3));
|
||||||
|
painter.drawLine(QPointF(-radius / 5, radius / 3),
|
||||||
|
QPointF(radius / 4, -radius / 4));
|
||||||
}
|
}
|
||||||
emit clicked();
|
QWidget::paintEvent(event);
|
||||||
QWidget::mousePressEvent(event);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ProgressButton::operationProcessing()
|
void ProgressButton::operationProcessing()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
const int RADIUS = 60;
|
const int RADIUS = 30;
|
||||||
WaterDrop::WaterDrop(QWidget *parent)
|
WaterDrop::WaterDrop(QWidget *parent)
|
||||||
: QWidget(parent), m_waterDropAnimation(nullptr), m_animationRadius(0)
|
: QWidget(parent)
|
||||||
|
, m_waterDropAnimation(new QVariantAnimation(this))
|
||||||
|
, m_animationRadius(0)
|
||||||
{
|
{
|
||||||
this->setFixedSize(QSize(RADIUS * 2, RADIUS * 2));
|
this->setFixedSize(QSize(RADIUS * 2, RADIUS * 2));
|
||||||
this->setWindowFlags(Qt::FramelessWindowHint | Qt::Tool);
|
// this->setWindowFlags(Qt::FramelessWindowHint | Qt::Tool);
|
||||||
this->setAttribute(Qt::WA_TranslucentBackground);
|
// this->setAttribute(Qt::WA_TranslucentBackground);
|
||||||
this->setAttribute(Qt::WA_DeleteOnClose);
|
// this->setAttribute(Qt::WA_DeleteOnClose);
|
||||||
m_waterDropAnimation = new QVariantAnimation(this);
|
|
||||||
// m_waterDropAnimation->setEasingCurve(QEasingCurve(static_cast<QEasingCurve::Type>(QRandomGenerator::global()->bounded(40))));
|
// m_waterDropAnimation->setEasingCurve(QEasingCurve(static_cast<QEasingCurve::Type>(QRandomGenerator::global()->bounded(40))));
|
||||||
}
|
}
|
||||||
|
|
||||||
// 把鼠标点击的点转换为圆心点坐标
|
// 把鼠标点击的点转换为圆心点坐标
|
||||||
void WaterDrop::move(const QPoint &point)
|
void WaterDrop::move(const QPointF &point)
|
||||||
{
|
{
|
||||||
QPoint translatePoint = point - QPoint(RADIUS, RADIUS);
|
QPointF translatePoint = point - QRectF(rect()).center();
|
||||||
QWidget::move(translatePoint);
|
QWidget::move(qRound(translatePoint.x()), qRound(translatePoint.y()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void WaterDrop::show()
|
void WaterDrop::show()
|
||||||
{
|
{
|
||||||
m_waterDropAnimation->setStartValue(0);
|
m_waterDropAnimation->setStartValue(0);
|
||||||
m_waterDropAnimation->setEndValue(RADIUS);
|
m_waterDropAnimation->setEndValue(RADIUS - 2);
|
||||||
m_waterDropAnimation->setDuration(350);
|
m_waterDropAnimation->setDuration(350);
|
||||||
|
|
||||||
connect(m_waterDropAnimation, &QVariantAnimation::valueChanged, this, &WaterDrop::onRaduisChanged);
|
connect(m_waterDropAnimation, &QVariantAnimation::valueChanged, this, &WaterDrop::onRadiusChanged);
|
||||||
connect(m_waterDropAnimation, &QVariantAnimation::finished, this, &WaterDrop::close);
|
connect(m_waterDropAnimation, &QVariantAnimation::finished, this, &WaterDrop::deleteLater);
|
||||||
m_waterDropAnimation->start();
|
m_waterDropAnimation->start(QVariantAnimation::DeleteWhenStopped);
|
||||||
QWidget::show();
|
QWidget::show();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -189,14 +213,14 @@ void WaterDrop::paintEvent(QPaintEvent *event)
|
|||||||
{
|
{
|
||||||
QPainter painter(this);
|
QPainter painter(this);
|
||||||
painter.setRenderHint(QPainter::Antialiasing);
|
painter.setRenderHint(QPainter::Antialiasing);
|
||||||
QPen pen;
|
QPen pen(QBrush(QColor("#ffff80")), 4.0);
|
||||||
pen.setColor(QColor(0xffffff80));
|
|
||||||
pen.setWidth(5);
|
|
||||||
painter.setPen(pen);
|
painter.setPen(pen);
|
||||||
painter.drawEllipse(event->rect().center(), m_animationRadius, m_animationRadius);
|
painter.drawEllipse(QRectF(rect()).center(), m_animationRadius, m_animationRadius);
|
||||||
|
|
||||||
|
QWidget::paintEvent(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
void WaterDrop::onRaduisChanged(QVariant value)
|
void WaterDrop::onRadiusChanged(const QVariant &value)
|
||||||
{
|
{
|
||||||
m_animationRadius = value.toInt();
|
m_animationRadius = value.toInt();
|
||||||
update();
|
update();
|
||||||
|
|||||||
@@ -1,53 +1,61 @@
|
|||||||
#ifndef PROGRESSBUTTON_H
|
#ifndef PROGRESSBUTTON_H
|
||||||
#define PROGRESSBUTTON_H
|
#define PROGRESSBUTTON_H
|
||||||
|
|
||||||
|
#include <QWidget>
|
||||||
#include <QtWidgets/QWidget>
|
|
||||||
|
|
||||||
#include <QPaintEvent>
|
|
||||||
|
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
#include <QTimerEvent>
|
#include <QVariantAnimation>
|
||||||
#include<QColor>
|
|
||||||
#include <QList>
|
|
||||||
#include <QMouseEvent>
|
|
||||||
|
|
||||||
|
|
||||||
|
class DownloadListWidget;
|
||||||
class ProgressButton : public QWidget
|
class ProgressButton : public QWidget
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ProgressButton(QWidget *parent = nullptr);
|
explicit ProgressButton(QWidget *parent = nullptr);
|
||||||
|
~ProgressButton() override;
|
||||||
|
|
||||||
void setIcon(QString svgPATH);
|
void setIcon(QString svgPATH);
|
||||||
void setBackgroundColor(QColor color);
|
void setBackgroundColor(QColor color);
|
||||||
void setColor(QColor color);
|
void setColor(QColor color);
|
||||||
void setProgress(int progress);
|
void setProgress(int progress);
|
||||||
~ProgressButton();
|
|
||||||
|
void setDownloadListWidget(DownloadListWidget *widget);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void mousePressEvent(QMouseEvent *event) override;
|
||||||
|
void mouseReleaseEvent(QMouseEvent *event) override;
|
||||||
|
void mouseDoubleClickEvent(QMouseEvent *event) override;
|
||||||
|
void mouseMoveEvent(QMouseEvent *event) override;
|
||||||
|
void leaveEvent(QEvent *event) override;
|
||||||
|
void paintEvent(QPaintEvent *event) override;
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void startProcessing();
|
void startProcessing();
|
||||||
void clicked();
|
void clicked();
|
||||||
|
|
||||||
protected:
|
private slots:
|
||||||
void paintEvent(QPaintEvent *event)override;
|
void operationProcessing();
|
||||||
void leaveEvent(QEvent *event)override;
|
|
||||||
void mousePressEvent(QMouseEvent *event)override;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
enum class state
|
enum state
|
||||||
{
|
{
|
||||||
normal,
|
normal,
|
||||||
hover,
|
hover,
|
||||||
openProgress,
|
openProgress,
|
||||||
closeProgress,
|
closeProgress,
|
||||||
recovery
|
recovery
|
||||||
}
|
};
|
||||||
buttonState{state::normal};
|
|
||||||
|
DownloadListWidget *m_downloadListWidget = nullptr;
|
||||||
|
|
||||||
|
state buttonState{state::normal};
|
||||||
QColor backColor;
|
QColor backColor;
|
||||||
QColor color;
|
QColor color;
|
||||||
QString svgPath;
|
QString svgPath;
|
||||||
int widthChangeValue{0};
|
|
||||||
void operationProcessing();
|
|
||||||
int progress{0};//处理百分比
|
int progress{0};//处理百分比
|
||||||
|
|
||||||
|
bool m_mouseMoved = false;
|
||||||
|
bool m_isDownloadListWidgetVisible = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
class WaterDrop : public QWidget
|
class WaterDrop : public QWidget
|
||||||
@@ -55,19 +63,19 @@ class WaterDrop : public QWidget
|
|||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
WaterDrop(QWidget *parent = Q_NULLPTR);
|
explicit WaterDrop(QWidget *parent = nullptr);
|
||||||
void show();
|
void show();
|
||||||
void move(const QPoint &point);
|
void move(const QPointF &point);
|
||||||
|
|
||||||
private:
|
protected:
|
||||||
void paintEvent(QPaintEvent *event);
|
void paintEvent(QPaintEvent *event);
|
||||||
void onRaduisChanged(QVariant value);
|
|
||||||
|
private slots:
|
||||||
|
void onRadiusChanged(const QVariant &value);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
class QVariantAnimation* m_waterDropAnimation;
|
QVariantAnimation *m_waterDropAnimation = nullptr;
|
||||||
int m_animationRadius;
|
int m_animationRadius;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif // PROGRESSBUTTON_H
|
#endif // PROGRESSBUTTON_H
|
||||||
|
|||||||
@@ -16,7 +16,6 @@ void SmoothListWidget::wheelEvent(QWheelEvent *e)
|
|||||||
}
|
}
|
||||||
void SmoothListWidget::onSliderChanged(int p)
|
void SmoothListWidget::onSliderChanged(int p)
|
||||||
{
|
{
|
||||||
int startRow = count();
|
|
||||||
if (p == vScrollBar->maximum())
|
if (p == vScrollBar->maximum())
|
||||||
{
|
{
|
||||||
emit reachedBottom(); // 1
|
emit reachedBottom(); // 1
|
||||||
|
|||||||
@@ -7,20 +7,7 @@
|
|||||||
WebEnginePage::WebEnginePage(QObject *parent)
|
WebEnginePage::WebEnginePage(QObject *parent)
|
||||||
: QWebEnginePage(parent)
|
: QWebEnginePage(parent)
|
||||||
{
|
{
|
||||||
QLocale ql;
|
initHttpAcceptLanguage();
|
||||||
switch (ql.language())
|
|
||||||
{
|
|
||||||
case QLocale::Chinese:
|
|
||||||
{
|
|
||||||
// 系统语言是中文,获取网页为中文 @momen @uniartisan
|
|
||||||
QWebEngineProfile *profile = QWebEngineProfile::defaultProfile();
|
|
||||||
qDebug() << profile->httpAcceptLanguage();
|
|
||||||
profile->setHttpAcceptLanguage("zh-CN,zh;q=0.8,en;q=0.6");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
WebEnginePage::~WebEnginePage()
|
WebEnginePage::~WebEnginePage()
|
||||||
@@ -47,6 +34,18 @@ QWebEnginePage *WebEnginePage::createWindow(QWebEnginePage::WebWindowType type)
|
|||||||
return page;
|
return page;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WebEnginePage::initHttpAcceptLanguage()
|
||||||
|
{
|
||||||
|
switch (QLocale::system().language()) {
|
||||||
|
case QLocale::Chinese: {
|
||||||
|
// 系统语言是中文,获取网页为中文 @momen @uniartisan
|
||||||
|
profile()->setHttpAcceptLanguage("zh-CN,zh;q=0.8,en;q=0.6");
|
||||||
|
} break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void WebEnginePage::slotUrlChanged(const QUrl &url)
|
void WebEnginePage::slotUrlChanged(const QUrl &url)
|
||||||
{
|
{
|
||||||
if (m_currentUrl == url)
|
if (m_currentUrl == url)
|
||||||
|
|||||||
@@ -16,6 +16,9 @@ public:
|
|||||||
protected:
|
protected:
|
||||||
QWebEnginePage *createWindow(WebWindowType type) override;
|
QWebEnginePage *createWindow(WebWindowType type) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void initHttpAcceptLanguage();
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void slotUrlChanged(const QUrl &url);
|
void slotUrlChanged(const QUrl &url);
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
#include "webengineview.h"
|
#include "webengineview.h"
|
||||||
#include "webenginepage.h"
|
#include "webenginepage.h"
|
||||||
|
|
||||||
#include <QDesktopServices>
|
|
||||||
|
|
||||||
WebEngineView::WebEngineView(QWidget *parent)
|
WebEngineView::WebEngineView(QWidget *parent)
|
||||||
: QWebEngineView(parent)
|
: QWebEngineView(parent)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,13 +1,21 @@
|
|||||||
#include "downloadlistwidget.h"
|
#include "downloadlistwidget.h"
|
||||||
#include "ui_downloadlistwidget.h"
|
#include "ui_downloadlistwidget.h"
|
||||||
#include <QGraphicsOpacityEffect>
|
#include "widgets/common/downloaditem.h"
|
||||||
#include <QPropertyAnimation>
|
#include "backend/sparkapi.h"
|
||||||
|
#include "backend/downloadworker.h"
|
||||||
|
#include "utils/utils.h"
|
||||||
|
#include "application.h"
|
||||||
|
#include "mainwindow-dtk.h"
|
||||||
|
|
||||||
|
#include <QDesktopServices>
|
||||||
|
#include <QtConcurrent>
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
|
|
||||||
DownloadListWidget::DownloadListWidget(QWidget *parent) : DBlurEffectWidget(parent),
|
DownloadListWidget::DownloadListWidget(QWidget *parent) : DBlurEffectWidget(parent),
|
||||||
ui(new Ui::DownloadListWidget)
|
ui(new Ui::DownloadListWidget)
|
||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
setWindowTitle("Download list");
|
setWindowTitle(QObject::tr("Download list"));
|
||||||
installEventFilter(this);
|
installEventFilter(this);
|
||||||
this->setAttribute(Qt::WA_Hover, true);
|
this->setAttribute(Qt::WA_Hover, true);
|
||||||
setFocus();
|
setFocus();
|
||||||
@@ -54,37 +62,43 @@ DownloadListWidget::~DownloadListWidget()
|
|||||||
{
|
{
|
||||||
if (downloadController)
|
if (downloadController)
|
||||||
{
|
{
|
||||||
|
downloadController->disconnect();
|
||||||
downloadController->stopDownload();
|
downloadController->stopDownload();
|
||||||
downloadController->deleteLater();
|
// 这里没有释放 downloadController,使用懒汉式单例
|
||||||
}
|
}
|
||||||
|
|
||||||
|
clearItem();
|
||||||
delete ui;
|
delete ui;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool DownloadListWidget::isDownloadInProcess()
|
||||||
|
{
|
||||||
|
if (toDownload > 0)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void DownloadListWidget::clearItem()
|
void DownloadListWidget::clearItem()
|
||||||
{
|
{
|
||||||
ui->listWidget->vScrollBar->scrollTop();
|
|
||||||
int n = ui->listWidget->count();
|
|
||||||
for (int i = 0; i < n; i++)
|
|
||||||
{
|
|
||||||
QListWidgetItem *item = ui->listWidget->takeItem(0);
|
|
||||||
QWidget *card = ui->listWidget->itemWidget(item);
|
|
||||||
delete card;
|
|
||||||
card = NULL;
|
|
||||||
delete item;
|
|
||||||
item = NULL;
|
|
||||||
}
|
|
||||||
ui->listWidget->clear();
|
ui->listWidget->clear();
|
||||||
}
|
}
|
||||||
void DownloadListWidget::addItem(QString name, QString fileName, QString pkgName, const QPixmap icon, QString downloadurl)
|
|
||||||
|
DownloadItem* DownloadListWidget::addItem(QString name, QString fileName, QString pkgName, const QPixmap icon, QString downloadurl)
|
||||||
{
|
{
|
||||||
if (fileName.isEmpty())
|
if (fileName.isEmpty())
|
||||||
{
|
{
|
||||||
return;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
urList.append(downloadurl);
|
urList.append(downloadurl);
|
||||||
allDownload += 1;
|
allDownload += 1;
|
||||||
DownloadItem *di = new DownloadItem(this);
|
toDownload += 1;
|
||||||
|
|
||||||
|
DownloadItem *di = new DownloadItem;
|
||||||
|
connect(di, &DownloadItem::finished, this, &DownloadListWidget::slotInstallFinished, Qt::QueuedConnection);
|
||||||
|
|
||||||
dlist << downloadurl;
|
dlist << downloadurl;
|
||||||
downloaditemlist << di;
|
downloaditemlist << di;
|
||||||
di->setName(name);
|
di->setName(name);
|
||||||
@@ -92,7 +106,7 @@ void DownloadListWidget::addItem(QString name, QString fileName, QString pkgName
|
|||||||
di->pkgName = pkgName;
|
di->pkgName = pkgName;
|
||||||
di->seticon(icon);
|
di->seticon(icon);
|
||||||
QListWidgetItem *pItem = new QListWidgetItem();
|
QListWidgetItem *pItem = new QListWidgetItem();
|
||||||
pItem->setSizeHint(QSize(240, 50));
|
pItem->setSizeHint(QSize(240, 56)); // ui 中单个 downloaditem 高度固定 56px(上下 margin 8px,图片固定 48x48)
|
||||||
ui->listWidget->addItem(pItem);
|
ui->listWidget->addItem(pItem);
|
||||||
ui->listWidget->setItemWidget(pItem, di);
|
ui->listWidget->setItemWidget(pItem, di);
|
||||||
if (!isBusy)
|
if (!isBusy)
|
||||||
@@ -100,6 +114,8 @@ void DownloadListWidget::addItem(QString name, QString fileName, QString pkgName
|
|||||||
nowDownload += 1;
|
nowDownload += 1;
|
||||||
startRequest(urList.at(nowDownload - 1), fileName); // 进行链接请求
|
startRequest(urList.at(nowDownload - 1), fileName); // 进行链接请求
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return di;
|
||||||
}
|
}
|
||||||
|
|
||||||
QList<DownloadItem *> DownloadListWidget::getDIList()
|
QList<DownloadItem *> DownloadListWidget::getDIList()
|
||||||
@@ -120,7 +136,17 @@ void DownloadListWidget::startRequest(QUrl url, QString fileName)
|
|||||||
isdownload = true;
|
isdownload = true;
|
||||||
downloaditemlist[allDownload - 1]->free = false;
|
downloaditemlist[allDownload - 1]->free = false;
|
||||||
|
|
||||||
downloadController = new DownloadController(this); // 并发下载,在点击下载按钮的时候才会初始化
|
// 使用懒汉式单例来存储downloadController
|
||||||
|
if (downloadController == nullptr)
|
||||||
|
{
|
||||||
|
downloadController = new DownloadController; // 并发下载,在第一次点击下载按钮的时候才会初始化
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
downloadController->disconnect();
|
||||||
|
downloadController->stopDownload();
|
||||||
|
}
|
||||||
|
|
||||||
connect(downloadController, &DownloadController::downloadProcess, this, &DownloadListWidget::updateDataReadProgress);
|
connect(downloadController, &DownloadController::downloadProcess, this, &DownloadListWidget::updateDataReadProgress);
|
||||||
connect(downloadController, &DownloadController::downloadFinished, this, &DownloadListWidget::httpFinished);
|
connect(downloadController, &DownloadController::downloadFinished, this, &DownloadListWidget::httpFinished);
|
||||||
// connect(downloadController, &DownloadController::errorOccur, this, [=](QString msg){this->sendNotification(msg);});
|
// connect(downloadController, &DownloadController::errorOccur, this, [=](QString msg){this->sendNotification(msg);});
|
||||||
@@ -128,30 +154,43 @@ void DownloadListWidget::startRequest(QUrl url, QString fileName)
|
|||||||
downloadController->startDownload(url.toString());
|
downloadController->startDownload(url.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***************************************************************
|
||||||
|
* @brief 下载列表完成下载的回调函数
|
||||||
|
* @param
|
||||||
|
* @note 如果正在安装,则在新开的线程空间中等待上一个安装完
|
||||||
|
* @Sample usage:
|
||||||
|
**************************************************************/
|
||||||
void DownloadListWidget::httpFinished() // 完成下载
|
void DownloadListWidget::httpFinished() // 完成下载
|
||||||
{
|
{
|
||||||
isdownload = false;
|
isdownload = false;
|
||||||
isBusy = false;
|
isBusy = false;
|
||||||
downloaditemlist[nowDownload - 1]->readyInstall();
|
|
||||||
|
QtConcurrent::run([=]()
|
||||||
|
{
|
||||||
|
while (downloaditemlist[nowDownload - 1]->readyInstall() == -1) // 安装当前应用,堵塞安装,后面的下载suspend
|
||||||
|
{
|
||||||
|
QThread::msleep(500); // 休眠500ms,减少CPU负担
|
||||||
|
continue;
|
||||||
|
}
|
||||||
downloaditemlist[nowDownload - 1]->free = true;
|
downloaditemlist[nowDownload - 1]->free = true;
|
||||||
emit downloadFinished();
|
emit downloadFinished();
|
||||||
|
|
||||||
if (nowDownload < allDownload)
|
if (nowDownload < allDownload)
|
||||||
{
|
{
|
||||||
// 如果有排队则下载下一个
|
// 如果有排队则下载下一个
|
||||||
qDebug() << "切换下一个下载...";
|
qDebug() << "Download: 切换下一个下载...";
|
||||||
nowDownload += 1;
|
nowDownload += 1;
|
||||||
while (downloaditemlist[nowDownload - 1]->close)
|
while (nowDownload <= allDownload && downloaditemlist[nowDownload - 1]->close)
|
||||||
{
|
{
|
||||||
nowDownload += 1;
|
nowDownload += 1;
|
||||||
if (nowDownload >= allDownload)
|
}
|
||||||
|
if (nowDownload <= allDownload)
|
||||||
{
|
{
|
||||||
nowDownload = allDownload;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
QString fileName = downloaditemlist[nowDownload - 1]->getName();
|
QString fileName = downloaditemlist[nowDownload - 1]->getName();
|
||||||
startRequest(urList.at(nowDownload - 1), fileName);
|
startRequest(urList.at(nowDownload - 1), fileName);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void DownloadListWidget::updateDataReadProgress(QString speedInfo, qint64 bytesRead, qint64 totalBytes)
|
void DownloadListWidget::updateDataReadProgress(QString speedInfo, qint64 bytesRead, qint64 totalBytes)
|
||||||
@@ -182,21 +221,7 @@ void DownloadListWidget::m_move(int x, int y)
|
|||||||
move(x, y);
|
move(x, y);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
bool DownloadListWidget::eventFilter(QObject *watched, QEvent *event)
|
|
||||||
{
|
|
||||||
if (Q_NULLPTR == watched)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (QEvent::ActivationChange == event->type())
|
|
||||||
{
|
|
||||||
if (QApplication::activeWindow() != this)
|
|
||||||
{
|
|
||||||
this->close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return QWidget::eventFilter(watched, event);
|
|
||||||
}
|
|
||||||
void DownloadListWidget::mouseMoveEvent(QMouseEvent *event)
|
void DownloadListWidget::mouseMoveEvent(QMouseEvent *event)
|
||||||
{
|
{
|
||||||
setGeometry(m_rect);
|
setGeometry(m_rect);
|
||||||
@@ -206,3 +231,27 @@ void DownloadListWidget::on_pushButton_clicked()
|
|||||||
{
|
{
|
||||||
QDesktopServices::openUrl(QUrl("file:///tmp/spark-store", QUrl::TolerantMode));
|
QDesktopServices::openUrl(QUrl("file:///tmp/spark-store", QUrl::TolerantMode));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DownloadListWidget::slotInstallFinished(bool success)
|
||||||
|
{
|
||||||
|
// NOTE: 仅在安装成功后判断是否需要退出后台
|
||||||
|
if (!success) {
|
||||||
|
qDebug() << "Download: install failed";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (toDownload > 0) {
|
||||||
|
toDownload -= 1;
|
||||||
|
qDebug() << "Download: toDownload" << toDownload;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (toDownload == 0) {
|
||||||
|
Application *app = qobject_cast<Application *>(qApp);
|
||||||
|
MainWindow *mainWindow = app->mainWindow();
|
||||||
|
if (mainWindow->isCloseWindowAnimation() == true)
|
||||||
|
{
|
||||||
|
qDebug() << "Download: 后台安装结束,退出程序";
|
||||||
|
qApp->quit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,33 +1,38 @@
|
|||||||
#ifndef DOWNLOADLISTWIDGET_H
|
#ifndef DOWNLOADLISTWIDGET_H
|
||||||
#define DOWNLOADLISTWIDGET_H
|
#define DOWNLOADLISTWIDGET_H
|
||||||
|
|
||||||
|
#include <DBlurEffectWidget>
|
||||||
|
|
||||||
#include <QWidget>
|
#include <QWidget>
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
#include <DBlurEffectWidget>
|
|
||||||
#include <QNetworkAccessManager>
|
|
||||||
#include <QDesktopServices>
|
|
||||||
#include "widgets/common/downloaditem.h"
|
|
||||||
#include "backend/sparkapi.h"
|
|
||||||
#include "backend/downloadworker.h"
|
|
||||||
#include "utils/utils.h"
|
|
||||||
DWIDGET_USE_NAMESPACE
|
|
||||||
namespace Ui {
|
namespace Ui {
|
||||||
class DownloadListWidget;
|
class DownloadListWidget;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DWIDGET_USE_NAMESPACE
|
||||||
|
|
||||||
|
class DownloadItem;
|
||||||
|
class DownloadController;
|
||||||
class DownloadListWidget : public DBlurEffectWidget
|
class DownloadListWidget : public DBlurEffectWidget
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
void addItem(QString name, QString fileName, QString pkgName, const QPixmap icon, QString downloadurl);
|
DownloadItem *addItem(QString name, QString fileName, QString pkgName, const QPixmap icon, QString downloadurl);
|
||||||
int nowDownload = 0;
|
int nowDownload = 0;
|
||||||
int allDownload = 0;
|
int allDownload = 0;
|
||||||
|
int toDownload = 0;
|
||||||
QList<DownloadItem *> getDIList();
|
QList<DownloadItem *> getDIList();
|
||||||
QList<QUrl> getUrlList();
|
QList<QUrl> getUrlList();
|
||||||
void m_move(int x, int y);
|
void m_move(int x, int y);
|
||||||
explicit DownloadListWidget(QWidget *parent = nullptr);
|
explicit DownloadListWidget(QWidget *parent = nullptr);
|
||||||
~DownloadListWidget();
|
~DownloadListWidget() override;
|
||||||
|
|
||||||
|
bool isDownloadInProcess();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void mouseMoveEvent(QMouseEvent *event) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int isdownload = false;
|
int isdownload = false;
|
||||||
@@ -35,7 +40,7 @@ private:
|
|||||||
QStringList dlist;
|
QStringList dlist;
|
||||||
QList<QUrl> urList;
|
QList<QUrl> urList;
|
||||||
QList<DownloadItem *> downloaditemlist;
|
QList<DownloadItem *> downloaditemlist;
|
||||||
DownloadController *downloadController;
|
DownloadController *downloadController = nullptr;
|
||||||
int nowdownload = 0;
|
int nowdownload = 0;
|
||||||
QString theSpeed;
|
QString theSpeed;
|
||||||
QTimer download_speed;
|
QTimer download_speed;
|
||||||
@@ -48,13 +53,14 @@ private:
|
|||||||
void clearItem();
|
void clearItem();
|
||||||
QRect m_rect;
|
QRect m_rect;
|
||||||
Ui::DownloadListWidget *ui;
|
Ui::DownloadListWidget *ui;
|
||||||
private slots:
|
|
||||||
bool eventFilter(QObject *, QEvent *);
|
|
||||||
void mouseMoveEvent(QMouseEvent *event);
|
|
||||||
void on_pushButton_clicked();
|
|
||||||
signals:
|
signals:
|
||||||
void downloadFinished();
|
void downloadFinished();
|
||||||
void downloadProgress(int i);
|
void downloadProgress(int i);
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void on_pushButton_clicked();
|
||||||
|
void slotInstallFinished(bool success);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // DOWNLOADLISTWIDGET_H
|
#endif // DOWNLOADLISTWIDGET_H
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ QListWidget::item::selected
|
|||||||
}</string>
|
}</string>
|
||||||
</property>
|
</property>
|
||||||
<property name="frameShape">
|
<property name="frameShape">
|
||||||
<enum>QFrame::StyledPanel</enum>
|
<enum>QFrame::NoFrame</enum>
|
||||||
</property>
|
</property>
|
||||||
<property name="verticalScrollBarPolicy">
|
<property name="verticalScrollBarPolicy">
|
||||||
<enum>Qt::ScrollBarAsNeeded</enum>
|
<enum>Qt::ScrollBarAsNeeded</enum>
|
||||||
@@ -99,9 +99,15 @@ QListWidget::item::selected
|
|||||||
<property name="autoScrollMargin">
|
<property name="autoScrollMargin">
|
||||||
<number>10</number>
|
<number>10</number>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="editTriggers">
|
||||||
|
<set>QAbstractItemView::NoEditTriggers</set>
|
||||||
|
</property>
|
||||||
<property name="resizeMode">
|
<property name="resizeMode">
|
||||||
<enum>QListView::Fixed</enum>
|
<enum>QListView::Fixed</enum>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="spacing">
|
||||||
|
<number>4</number>
|
||||||
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
|
|||||||
@@ -1,155 +0,0 @@
|
|||||||
###################################################################
|
|
||||||
# CONFIGURATION OPTIONS
|
|
||||||
###################################################################
|
|
||||||
# Every item has a default value besides MIRRORS (which is unset).
|
|
||||||
|
|
||||||
# Use aptitude, apt-get, or apt?
|
|
||||||
# Note that apt-get is used as a fallback for outputting the
|
|
||||||
# package URI list for e.g. aptitude, which can't do this
|
|
||||||
# Optionally add the FULLPATH to apt-get or apt-rpm or aptitude
|
|
||||||
# e.g. /usr/bin/aptitude
|
|
||||||
#
|
|
||||||
# Default: apt-get
|
|
||||||
#
|
|
||||||
_APTMGR=apt
|
|
||||||
|
|
||||||
|
|
||||||
####
|
|
||||||
#
|
|
||||||
# UOS sources auth config
|
|
||||||
#
|
|
||||||
#
|
|
||||||
if grep -Eqi "UnionTech" /etc/issue || grep -Eq "UnionTech" /etc/*-release;then
|
|
||||||
AUTH_UOS_USER="uos-https://license.chinauos.com-apt"
|
|
||||||
AUTH_UOS_PASSWD="`cat /etc/apt/auth.conf.d/uos.conf | grep home-packages.chinauos.com`"
|
|
||||||
AUTH_UOS_PASSWD=`echo ${AUTH_UOS_PASSWD#*password }`
|
|
||||||
|
|
||||||
fi
|
|
||||||
# Enable DOWNLOADBEFORE to suppress apt-fast confirmation dialog and download
|
|
||||||
# packages directly.
|
|
||||||
#
|
|
||||||
# Default: dialog enabled
|
|
||||||
#
|
|
||||||
DOWNLOADBEFORE=true
|
|
||||||
|
|
||||||
|
|
||||||
# Choose mirror list to speed up downloads from same archive. To select some
|
|
||||||
# mirrors take a look at your distribution's archive mirror lists.
|
|
||||||
# Debian: http://www.debian.org/mirror/list
|
|
||||||
# Ubuntu: https://launchpad.net/ubuntu/+archivemirrors
|
|
||||||
#
|
|
||||||
# It is required to add mirrors in the sources.list to this array as well, so
|
|
||||||
# apt-fast can destinguish between different distributions.
|
|
||||||
#
|
|
||||||
# Examples:
|
|
||||||
#
|
|
||||||
# Different distributions (as in operating systems):
|
|
||||||
#
|
|
||||||
# sources.list:
|
|
||||||
# deb http://deb.debian.org/debian/ unstable main non-free contrib
|
|
||||||
# deb http://de.archive.ubuntu.com/ubuntu/ bionic main universe
|
|
||||||
#
|
|
||||||
# apt-fast.conf:
|
|
||||||
# MIRRORS=( 'http://deb.debian.org/debian','http://ftp.debian.org/debian,http://ftp2.de.debian.org/debian,http://ftp.de.debian.org/debian,ftp://ftp.uni-kl.de/debian'
|
|
||||||
# 'http://archive.ubuntu.com/ubuntu,http://de.archive.ubuntu.com/ubuntu,http://ftp.halifax.rwth-aachen.de/ubuntu,http://ftp.uni-kl.de/pub/linux/ubuntu,http://mirror.informatik.uni-mannheim.de/pub/linux/distributions/ubuntu/' )
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# Single distribution:
|
|
||||||
#
|
|
||||||
# sources.list:
|
|
||||||
# deb http://fr.archive.ubuntu.com/ubuntu/ bionic main
|
|
||||||
# deb http://fr.archive.ubuntu.com/ubuntu/ artful main
|
|
||||||
#
|
|
||||||
# apt-fast.conf:
|
|
||||||
# MIRRORS=( 'http://fr.archive.ubuntu.com/ubuntu,http://bouyguestelecom.ubuntu.lafibre.info/ubuntu,http://mirror.ovh.net/ubuntu,http://ubuntu-archive.mirrors.proxad.net/ubuntu' )
|
|
||||||
#
|
|
||||||
# Default: disabled
|
|
||||||
#
|
|
||||||
MIRRORS=( 'https://d.store.deepinos.org.cn/,https://mirrors.sdu.edu.cn/spark-store-repository/,http://cdn.dl.uniartisan.com:9000/deepinos/,https://d1.store.deepinos.org.cn/,https://d2.store.deepinos.org.cn/,https://d4.store.deepinos.org.cn/,https://d5.store.deepinos.org.cn/' )
|
|
||||||
|
|
||||||
|
|
||||||
# Maximum number of connections
|
|
||||||
# You can use this value in _DOWNLOADER command. Escape with ${}: ${_MAXNUM}
|
|
||||||
#
|
|
||||||
# Default: 5
|
|
||||||
#
|
|
||||||
_MAXNUM=5
|
|
||||||
|
|
||||||
|
|
||||||
# Maximum number of connections per server
|
|
||||||
# Default: 10
|
|
||||||
#
|
|
||||||
_MAXCONPERSRV=1
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Split size i.e. size of each piece
|
|
||||||
# Possible Values: 1M-1024M
|
|
||||||
#
|
|
||||||
_MINSPLITSZ=1M
|
|
||||||
|
|
||||||
|
|
||||||
# Piece selection algorithm to use
|
|
||||||
# Available values are: default, inorder, geom
|
|
||||||
# default: selects piece so that it reduces the number of establishing connection, reasonable for most cases
|
|
||||||
# inorder: selects pieces in sequential order starting from first piece
|
|
||||||
# geom: selects piece which has minimum index like inorder, but it exponentially increasingly keeps space from previously selected pieces
|
|
||||||
#
|
|
||||||
_PIECEALGO=default
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Downloadmanager listfile
|
|
||||||
# You can use this value in _DOWNLOADER command. Escape with ${}: ${DLLIST}
|
|
||||||
#
|
|
||||||
# Default: /tmp/apt-fast.list
|
|
||||||
#
|
|
||||||
DLLIST='/tmp/apt-fast.list'
|
|
||||||
|
|
||||||
|
|
||||||
# Download command to use. Temporary download list is designed for aria2. But
|
|
||||||
# you can choose another download command or download manager. It has to
|
|
||||||
# support following input file syntax (\t is tab character):
|
|
||||||
#
|
|
||||||
# # Comment
|
|
||||||
# MIRROR1\tMIRROR2\tMIRROR3...
|
|
||||||
# out=FILENAME1
|
|
||||||
# MIRROR1\tMIRROR2\tMIRROR3...
|
|
||||||
# out=FILENAME2
|
|
||||||
# ...
|
|
||||||
#
|
|
||||||
# Examples:
|
|
||||||
# aria2c with a proxy (set username, proxy, ip and password!)
|
|
||||||
# _DOWNLOADER='aria2c --no-conf -c -j ${_MAXNUM} -x ${_MAXCONPERSRV} -s ${_SPLITCON} --min-split-size=${_MINSPLITSZ} --stream-piece-selector=${_PIECEALGO} --http-proxy=http://username:password@proxy_ip:proxy_port -i ${DLLIST}'
|
|
||||||
#
|
|
||||||
# Default: _DOWNLOADER='aria2c --no-conf -c -j ${_MAXNUM} -x ${_MAXCONPERSRV} -s ${_SPLITCON} --min-split-size=${_MINSPLITSZ} --stream-piece-selector=${_PIECEALGO} -i ${DLLIST} --connect-timeout=600 --timeout=600 -m0'
|
|
||||||
#
|
|
||||||
_DOWNLOADER='aria2c --no-conf -c -j ${_MAXNUM} -x ${_MAXCONPERSRV} --min-split-size=${_MINSPLITSZ} --stream-piece-selector=${_PIECEALGO} -i ${DLLIST} --connect-timeout=600 --timeout=600 -m0 --http-user ${AUTH_UOS_USER} --http-passwd ${AUTH_UOS_PASSWD}'
|
|
||||||
|
|
||||||
|
|
||||||
# Download temp folder for Downloadmanager
|
|
||||||
# example /tmp/apt-fast. Standard is /var/cache/apt-fast
|
|
||||||
#
|
|
||||||
# Default: /var/cache/apt/apt-fast
|
|
||||||
#
|
|
||||||
DLDIR='/var/cache/apt/apt-fast'
|
|
||||||
|
|
||||||
|
|
||||||
# APT archives cache directory
|
|
||||||
#
|
|
||||||
# Default /var/cache/apt/archives
|
|
||||||
# (APT configuration items Dir::Cache and Dir::Cache::archives)
|
|
||||||
#
|
|
||||||
APTCACHE='/var/cache/apt/archives'
|
|
||||||
|
|
||||||
|
|
||||||
# apt-fast colors
|
|
||||||
# Colors are disabled when not using a terminal.
|
|
||||||
#
|
|
||||||
# Default colors are:
|
|
||||||
# cGreen='\e[0;32m'
|
|
||||||
# cRed='\e[0;31m'
|
|
||||||
# cBlue='\e[0;34m'
|
|
||||||
# endColor='\e[0m'
|
|
||||||
14
tool/apt-fast-conf/aptss-apt.conf
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
Debug::RunScripts true;
|
||||||
|
Dir::Cache::archives "/var/cache/apt/archives";
|
||||||
|
Dir::Cache "/var/lib/aptss/";
|
||||||
|
Dir::Etc::SourceParts "/opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/";
|
||||||
|
Dir::State::lists "/var/lib/aptss/lists/";
|
||||||
|
|
||||||
|
APT::Get::Fix-Broken true;
|
||||||
|
APT::Get::List-Cleanup="0";
|
||||||
|
|
||||||
|
#clear APT::Update::Post-Invoke-Success;
|
||||||
|
|
||||||
|
#clear DPkg::Post-Invoke;
|
||||||
|
|
||||||
|
#clear DPkg::Pre-Install-Pkgs;
|
||||||
@@ -52,7 +52,7 @@ for argument in "$@"; do
|
|||||||
option="source"
|
option="source"
|
||||||
root=0
|
root=0
|
||||||
;;
|
;;
|
||||||
changelog)
|
changelog|search|policy|show)
|
||||||
root=0
|
root=0
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
@@ -114,7 +114,11 @@ fi
|
|||||||
# permissions.
|
# permissions.
|
||||||
# We need lock for non-root commands too, because we only have one download
|
# We need lock for non-root commands too, because we only have one download
|
||||||
# list file.
|
# list file.
|
||||||
LCK_FILE="/tmp/apt-fast"
|
if [ "$IS_ACE_ENV" != "" ];then
|
||||||
|
LCK_FILE="/tmp/apt-fast-in-container.lock"
|
||||||
|
else
|
||||||
|
LCK_FILE="/tmp/apt-fast.lock"
|
||||||
|
fi
|
||||||
LCK_FD=99
|
LCK_FD=99
|
||||||
|
|
||||||
# Set default package manager, APT cache, temporary download dir,
|
# Set default package manager, APT cache, temporary download dir,
|
||||||
@@ -130,7 +134,11 @@ else
|
|||||||
fi
|
fi
|
||||||
# Currently not needed.
|
# Currently not needed.
|
||||||
eval "$(apt-config shell LISTDIR Dir::State::lists/d)"
|
eval "$(apt-config shell LISTDIR Dir::State::lists/d)"
|
||||||
|
if [ "$IS_ACE_ENV" != "" ];then
|
||||||
|
DLLIST="/tmp/apt-fast-in-container.list"
|
||||||
|
else
|
||||||
DLLIST="/tmp/apt-fast.list"
|
DLLIST="/tmp/apt-fast.list"
|
||||||
|
fi
|
||||||
_MAXNUM=5
|
_MAXNUM=5
|
||||||
_MAXCONPERSRV=10
|
_MAXCONPERSRV=10
|
||||||
_SPLITCON=8
|
_SPLITCON=8
|
||||||
@@ -158,10 +166,11 @@ DOWNLOADBEFORE=
|
|||||||
VERBOSE_OUTPUT=
|
VERBOSE_OUTPUT=
|
||||||
|
|
||||||
# Download command.
|
# Download command.
|
||||||
_DOWNLOADER='aria2c --no-conf -c -j ${_MAXNUM} -x ${_MAXCONPERSRV} -s ${_SPLITCON} -i ${DLLIST} --min-split-size=${_MINSPLITSZ} --stream-piece-selector=${_PIECEALGO} --connect-timeout=600 --timeout=600 -m0'
|
_DOWNLOADER='aria2c --no-conf -c -j ${_MAXNUM} -x ${_MAXCONPERSRV} -s ${_SPLITCON} -i ${DLLIST} --min-split-size=${_MINSPLITSZ} --stream-piece-selector=${_PIECEALGO} --connect-timeout=60 --timeout=600 -m0'
|
||||||
|
|
||||||
# Load config file.
|
# Load config file.
|
||||||
CONFFILE="/etc/apt-fast.conf"
|
CONFFILE="/tmp/aptss-conf/apt-fast.conf"
|
||||||
|
#### Spark Store apt-fast conf is in /tmp
|
||||||
if [ -e "$CONFFILE" ]; then
|
if [ -e "$CONFFILE" ]; then
|
||||||
source "$CONFFILE"
|
source "$CONFFILE"
|
||||||
fi
|
fi
|
||||||
@@ -206,15 +215,15 @@ fi
|
|||||||
|
|
||||||
msg_already_running()
|
msg_already_running()
|
||||||
{
|
{
|
||||||
msg "apt-fast already running!" "warning"
|
msg "Other aptss is running. Waited $timer senconds..." "normal"
|
||||||
msg "Verify that all apt-fast processes are finished then remove $LCK_FILE.lock and try again." "hint"
|
msg "有其他的aptss正在运行。已经等待了$timer秒" "normal"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Check if a lock file exists.
|
# Check if a lock file exists.
|
||||||
if [ -f "$LCK_FILE.lock" ]; then
|
#if [ -f "$LCK_FILE.lock" ]; then
|
||||||
msg_already_running
|
# msg_already_running
|
||||||
exit 1
|
# exit 1
|
||||||
fi
|
#fi
|
||||||
|
|
||||||
|
|
||||||
# create the lock file and lock it, die on failure
|
# create the lock file and lock it, die on failure
|
||||||
@@ -222,10 +231,17 @@ _create_lock()
|
|||||||
{
|
{
|
||||||
eval "exec $LCK_FD>\"$LCK_FILE.lock\""
|
eval "exec $LCK_FD>\"$LCK_FILE.lock\""
|
||||||
|
|
||||||
trap "cleanup_aptfast; exit_cleanup_state" EXIT
|
# trap "cleanup_aptfast; exit_cleanup_state" EXIT
|
||||||
|
# This will hide the exit code
|
||||||
|
trap "cleanup_aptfast" EXIT
|
||||||
trap "cleanup_aptfast; exit 1" INT TERM
|
trap "cleanup_aptfast; exit 1" INT TERM
|
||||||
|
timer=0
|
||||||
flock -n $LCK_FD || { msg_already_running; exit 1; }
|
until $(flock -xn $LCK_FD);do
|
||||||
|
msg_already_running
|
||||||
|
sleep 1
|
||||||
|
let timer+=1
|
||||||
|
done
|
||||||
|
unset timer
|
||||||
}
|
}
|
||||||
|
|
||||||
# unlock and remove the lock file
|
# unlock and remove the lock file
|
||||||
@@ -246,6 +262,7 @@ cleanup_dllist()
|
|||||||
if ! rm -f -- "$DLLIST" 2>/dev/null
|
if ! rm -f -- "$DLLIST" 2>/dev/null
|
||||||
then
|
then
|
||||||
msg "Could not clean up download list file." "warning"
|
msg "Could not clean up download list file." "warning"
|
||||||
|
msg "无法清除下载列表文件." "warning"
|
||||||
CLEANUP_STATE=1
|
CLEANUP_STATE=1
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
@@ -272,6 +289,7 @@ urldecode()
|
|||||||
}
|
}
|
||||||
|
|
||||||
# Check if mirrors are available. And if so add all mirrors to download list.
|
# Check if mirrors are available. And if so add all mirrors to download list.
|
||||||
|
############ SPARK ADJUST: Now we ignore the first config for business request
|
||||||
get_mirrors(){
|
get_mirrors(){
|
||||||
# Check all mirror lists.
|
# Check all mirror lists.
|
||||||
for mirrorstr in "${MIRRORS[@]}"; do
|
for mirrorstr in "${MIRRORS[@]}"; do
|
||||||
@@ -284,7 +302,7 @@ get_mirrors(){
|
|||||||
if [[ "$1" == "$mirror"* ]]; then
|
if [[ "$1" == "$mirror"* ]]; then
|
||||||
filepath=${1#${mirror}}
|
filepath=${1#${mirror}}
|
||||||
# Build list for aria download list.
|
# Build list for aria download list.
|
||||||
list="${mirrors[*]}"
|
list="${mirrors[*]:1}"
|
||||||
echo -e "${list// /${filepath}\\t}$filepath\n"
|
echo -e "${list// /${filepath}\\t}$filepath\n"
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
@@ -293,23 +311,27 @@ get_mirrors(){
|
|||||||
# No other mirrors found.
|
# No other mirrors found.
|
||||||
echo "$1"
|
echo "$1"
|
||||||
}
|
}
|
||||||
|
##########SPARK ADJUST: END
|
||||||
# Globals to save package name, version, size and overall size.
|
# Globals to save package name, version, size and overall size.
|
||||||
DOWNLOAD_DISPLAY=
|
DOWNLOAD_DISPLAY=
|
||||||
DOWNLOAD_SIZE=0
|
DOWNLOAD_SIZE=0
|
||||||
|
|
||||||
# Get the package URLs.
|
# Get the package URLs.
|
||||||
get_uris(){
|
get_uris(){
|
||||||
|
|
||||||
if [ ! -d "$(dirname "$DLLIST")" ]
|
if [ ! -d "$(dirname "$DLLIST")" ]
|
||||||
then
|
then
|
||||||
if ! mkdir -p -- "$(dirname "$DLLIST")"
|
if ! mkdir -p -- "$(dirname "$DLLIST")"
|
||||||
then
|
then
|
||||||
msg "Could not create download file directory." "warning"
|
msg "Could not create download file directory." "warning"
|
||||||
|
msg "无法创建下载文件夹" "warning"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
elif [ -f "$DLLIST" ]; then
|
elif [ -f "$DLLIST" ]; then
|
||||||
if ! rm -f -- "$DLLIST" 2>/dev/null && ! touch -- "$DLLIST" 2>/dev/null
|
if ! rm -f -- "$DLLIST" 2>/dev/null && ! touch -- "$DLLIST" 2>/dev/null
|
||||||
then
|
then
|
||||||
msg "Unable to write to download file. Try restarting with root permissions or run 'apt-fast clean' first." "warning"
|
msg "Unable to write to download file. Try restarting with root permissions or run 'aptss clean' first." "warning"
|
||||||
|
msg "无法下载文件。尝试使用root权限,或者运行 'aptss clean'" "warning"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
@@ -318,15 +340,19 @@ get_uris(){
|
|||||||
echo "# apt-fast mirror list: $(date)" > "$DLLIST"
|
echo "# apt-fast mirror list: $(date)" > "$DLLIST"
|
||||||
#NOTE: aptitude doesn't have this functionality, so we use apt-get to get
|
#NOTE: aptitude doesn't have this functionality, so we use apt-get to get
|
||||||
# package URIs.
|
# package URIs.
|
||||||
case "$_APTMGR" in
|
# case "$_APTMGR" in
|
||||||
apt|apt-get) uri_mgr=$_APTMGR;;
|
# apt|apt-get) uri_mgr=$_APTMGR;;
|
||||||
*) uri_mgr=apt-get;;
|
# *) uri_mgr=apt-get;;
|
||||||
esac
|
# esac
|
||||||
|
# NOTE:apt可能出现变动,不建议在脚本中使用,因此在此统一改用apt-get
|
||||||
|
uri_mgr=apt-get
|
||||||
uris_full="$("$uri_mgr" "${APT_SCRIPT_WARNING[@]}" -y --print-uris "$@")"
|
uris_full="$("$uri_mgr" "${APT_SCRIPT_WARNING[@]}" -y --print-uris "$@")"
|
||||||
uris_full_ret="$?"
|
uris_full_ret="$?"
|
||||||
if [ "$uris_full_ret" -ne 0 ]
|
if [ "$uris_full_ret" -ne 0 ]
|
||||||
then
|
then
|
||||||
msg "Package manager quit with exit code." "warning"
|
msg "Package manager quit with exit code.Here is the log" "warning"
|
||||||
|
msg "包管理器以错误代码退出.日志如下" "warning"
|
||||||
|
msg "${uris_full}"
|
||||||
exit "$uris_full_ret"
|
exit "$uris_full_ret"
|
||||||
fi
|
fi
|
||||||
while read -r pkg_uri_info
|
while read -r pkg_uri_info
|
||||||
@@ -396,6 +422,7 @@ get_uris(){
|
|||||||
checksum="$(echo "$patch_checksum" | cut -d' ' -f2)"
|
checksum="$(echo "$patch_checksum" | cut -d' ' -f2)"
|
||||||
else
|
else
|
||||||
msg "Couldn't get supported checksum for $pkg_name ($pkg_version)." "warning"
|
msg "Couldn't get supported checksum for $pkg_name ($pkg_version)." "warning"
|
||||||
|
msg "无法获得 $pkg_name ($pkg_version) 的受支持的散列验证值" "warning"
|
||||||
REMOVE_WORKING_MESSAGE=
|
REMOVE_WORKING_MESSAGE=
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
@@ -434,9 +461,11 @@ display_downloadfile(){
|
|||||||
done <<<"$(echo -e "$DOWNLOAD_DISPLAY" | sort "${DISPLAY_SORT_OPTIONS[@]}")"
|
done <<<"$(echo -e "$DOWNLOAD_DISPLAY" | sort "${DISPLAY_SORT_OPTIONS[@]}")"
|
||||||
fi
|
fi
|
||||||
msg "Download size: $(echo "$DOWNLOAD_SIZE" | numfmt --to=iec-i --suffix=B)" "normal"
|
msg "Download size: $(echo "$DOWNLOAD_SIZE" | numfmt --to=iec-i --suffix=B)" "normal"
|
||||||
|
msg "下载大小: $(echo "$DOWNLOAD_SIZE" | numfmt --to=iec-i --suffix=B)" "normal"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Create and insert a PID number to lockfile.
|
# Create and insert a PID number to lockfile.
|
||||||
|
|
||||||
_create_lock
|
_create_lock
|
||||||
|
|
||||||
# Make sure aria2c (in general first parameter from _DOWNLOADER) is available.
|
# Make sure aria2c (in general first parameter from _DOWNLOADER) is available.
|
||||||
@@ -477,6 +506,7 @@ if [ "$CMD" == "aria2c" ]; then
|
|||||||
done
|
done
|
||||||
if [ -z "$HASH_SUPPORTED" ]; then
|
if [ -z "$HASH_SUPPORTED" ]; then
|
||||||
msg "Couldn't find supported checksum algorithm from aria2c. Checksums disabled." "warning"
|
msg "Couldn't find supported checksum algorithm from aria2c. Checksums disabled." "warning"
|
||||||
|
msg "无法找到aria2c支持的散列验证算法. 散列验证已被禁用." "warning"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -531,10 +561,10 @@ fi
|
|||||||
if [ "$option" == "install" ]; then
|
if [ "$option" == "install" ]; then
|
||||||
msg
|
msg
|
||||||
msg "Working... this may take a while." "normal"
|
msg "Working... this may take a while." "normal"
|
||||||
|
msg "正在工作中,请稍等" "normal"
|
||||||
REMOVE_WORKING_MESSAGE=y
|
REMOVE_WORKING_MESSAGE=y
|
||||||
|
|
||||||
get_uris "$@"
|
get_uris "$@"
|
||||||
|
|
||||||
[ -t 1 ] && [ -n "$REMOVE_WORKING_MESSAGE" ] && tput cuu 1 && tput el && tput cuu 1
|
[ -t 1 ] && [ -n "$REMOVE_WORKING_MESSAGE" ] && tput cuu 1 && tput el && tput cuu 1
|
||||||
# Test /tmp/apt-fast.list file exists and not just the apt-fast comment line.
|
# Test /tmp/apt-fast.list file exists and not just the apt-fast comment line.
|
||||||
# Then download all files from the list.
|
# Then download all files from the list.
|
||||||
@@ -570,9 +600,18 @@ if [ "$option" == "install" ]; then
|
|||||||
|
|
||||||
eval "${_DOWNLOADER}" # execute downloadhelper command
|
eval "${_DOWNLOADER}" # execute downloadhelper command
|
||||||
if [ "$(find "$DLDIR" -printf . | wc -c)" -gt 1 ]; then
|
if [ "$(find "$DLDIR" -printf . | wc -c)" -gt 1 ]; then
|
||||||
|
|
||||||
|
# Delete incomplete/corrupted downloaded files, if any: Not recursive, as we don't expect any dirs to exist within $DLDIR.
|
||||||
|
|
||||||
|
# When Aria2c downloads a file and detects it is corrupted, its filename won't be renamed back to its actual name,
|
||||||
|
# preserving .aria2 file extension, which also indicates when a file hasn't been completely downloaded.
|
||||||
|
for x in *.aria2; do
|
||||||
|
rm -f "$x" "${x%.aria2}"
|
||||||
|
done
|
||||||
|
|
||||||
# Move all packages to the apt install directory by force to ensure
|
# Move all packages to the apt install directory by force to ensure
|
||||||
# already existing debs which may be incomplete are replaced
|
# already existing debs which may be incomplete are replaced
|
||||||
find . -type f -name "*.deb" -execdir mv -ft "$APTCACHE" {} \+
|
find . -type f \( -name '*.deb' -o -name '*.ddeb' \) -execdir mv -ft "$APTCACHE" {} \+
|
||||||
fi
|
fi
|
||||||
cd - &>/dev/null || msg "Failed to change back directory" "warning"
|
cd - &>/dev/null || msg "Failed to change back directory" "warning"
|
||||||
fi
|
fi
|
||||||
@@ -598,6 +637,7 @@ elif [ "$option" == "clean" ]; then
|
|||||||
elif [ "$option" == "download" ]; then
|
elif [ "$option" == "download" ]; then
|
||||||
msg
|
msg
|
||||||
msg "Working... this may take a while." "normal"
|
msg "Working... this may take a while." "normal"
|
||||||
|
msg "正在工作中,请稍等" "normal"
|
||||||
REMOVE_WORKING_MESSAGE=y
|
REMOVE_WORKING_MESSAGE=y
|
||||||
|
|
||||||
get_uris "$@"
|
get_uris "$@"
|
||||||
@@ -616,6 +656,7 @@ elif [ "$option" == "download" ]; then
|
|||||||
elif [ "$option" == "source" ]; then
|
elif [ "$option" == "source" ]; then
|
||||||
msg
|
msg
|
||||||
msg "Working... this may take a while." "normal"
|
msg "Working... this may take a while." "normal"
|
||||||
|
msg "正在工作中,请稍等" "normal"
|
||||||
REMOVE_WORKING_MESSAGE=y
|
REMOVE_WORKING_MESSAGE=y
|
||||||
|
|
||||||
get_uris "$@"
|
get_uris "$@"
|
||||||
|
|||||||
125
tool/aptss
@@ -1,88 +1,121 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
SPARK_DOWNLOAD_SERVER_URL="https://d.spark-app.store/"
|
||||||
|
SPARK_DOWNLOAD_SERVER_URL_NO_PROTOCOL="d.spark-app.store"
|
||||||
|
source /opt/durapps/spark-store/bin/bashimport/transhell.amber
|
||||||
|
load_transhell
|
||||||
|
|
||||||
|
case `arch` in
|
||||||
|
x86_64)
|
||||||
|
STORE_URL="store"
|
||||||
|
STORE_LIST_URL=""
|
||||||
|
;;
|
||||||
|
aarch64)
|
||||||
|
STORE_URL="aarch64-store"
|
||||||
|
STORE_LIST_URL="-aarch64"
|
||||||
|
;;
|
||||||
|
loongarch64)
|
||||||
|
STORE_URL="loong64-store"
|
||||||
|
STORE_LIST_URL="-loong64"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
SS_APT_FAST="/opt/durapps/spark-store/bin/apt-fast/ss-apt-fast"
|
||||||
|
|
||||||
|
|
||||||
|
is_empty_dir(){
|
||||||
|
return `ls -A $1|wc -w`
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if [ "$(id -u)" != "0" ];then
|
||||||
|
#############################无root权限时
|
||||||
|
echo -e "\e[1;32m${TRANSHELL_CONTENT_RUNNING_IN_NOT_ROOT_USER}\e[0m"
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
|
||||||
|
ln -sf /etc/apt/sources.list.d/* /opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d
|
||||||
|
###让这里和系统同步,先链接,然后清除无效链接
|
||||||
|
find /opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d -xtype l -delete
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
if [ ! -e "/tmp/aptss-conf/apt-fast.conf" ];then
|
if [ ! -e "/tmp/aptss-conf/apt-fast.conf" ];then
|
||||||
###刷新apt-fast配置
|
###刷新apt-fast配置
|
||||||
mkdir -p /tmp/aptss-conf/
|
mkdir -p /tmp/aptss-conf/
|
||||||
echo "从服务器获取配置和镜像列表..."
|
echo -e "\e[1;32m${TRANSHELL_CONTENT_GETTING_SERVER_CONFIG_AND_MIRROR_LIST}\e[0m"
|
||||||
echo "Getting server and mirror lists..."
|
|
||||||
echo
|
echo
|
||||||
curl --progress-bar -o /tmp/aptss-conf/apt-fast.conf "https://gitee.com/deepin-community-store/repo_auto_update_script/raw/master/mirror-list-for-apt-fast/apt-fast.conf"
|
curl --progress-bar -o /tmp/aptss-conf/apt-fast.conf "${SPARK_DOWNLOAD_SERVER_URL}/apt-fast.conf"
|
||||||
chmod -R 755 /tmp/aptss-conf
|
chmod -R 755 /tmp/aptss-conf
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
if [ ! -e "/var/lib/aptss/lists/${SPARK_DOWNLOAD_SERVER_URL_NO_PROTOCOL}_${STORE_URL}_Packages" ] && [ ! -e "/var/lib/aptss/lists/d.store.deepinos.org.cn_${STORE_URL}_Packages" ] && [ ! -e "/var/lib/aptss/lists/mirrors.sdu.edu.cn_spark-store-repository_${STORE_URL}_Packages" ];then
|
||||||
|
|
||||||
|
mkdir -p /tmp/aptss-conf/
|
||||||
|
echo -e "\e[1;32m${TRANSHELL_CONTENT_GETTING_SERVER_CONFIG_AND_MIRROR_LIST}\e[0m"
|
||||||
|
echo
|
||||||
|
curl --silent -o /tmp/aptss-conf/apt-fast.conf "${SPARK_DOWNLOAD_SERVER_URL}/apt-fast.conf"
|
||||||
|
chmod -R 755 /tmp/aptss-conf
|
||||||
|
|
||||||
|
curl --silent -o /opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list "${SPARK_DOWNLOAD_SERVER_URL}/sparkstore${STORE_LIST_URL}.list"
|
||||||
|
/usr/bin/apt update -c /opt/durapps/spark-store/bin/apt-fast-conf/aptss-apt.conf
|
||||||
|
|
||||||
|
#只更新星火源
|
||||||
|
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if [ "$1" = "install" ] || [ "$1" = "upgrade" ] || [ "$1" = "full-upgrade" ] ; then
|
|
||||||
|
if [ "$1" = "install" ] || [ "$1" = "upgrade" ] || [ "$1" = "full-upgrade" ] || [ "$1" = "dist-upgrade" ]; then
|
||||||
|
|
||||||
|
|
||||||
sudo bwrap --dev-bind / / --bind '/opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list' /etc/apt/sources.list.d/sparkstore.list apt update -o Dir::Etc::sourcelist="sources.list.d/sparkstore.list" -o Dir::etc::sourceparts="-" -o APT::Get::List-Cleanup="0"
|
|
||||||
|
|
||||||
###执行
|
###执行
|
||||||
bwrap --dev-bind / / \
|
|
||||||
--bind '/tmp/aptss-conf/apt-fast.conf' /etc/apt-fast.conf \
|
${SS_APT_FAST} "$@" --allow-downgrades -c /opt/durapps/spark-store/bin/apt-fast-conf/aptss-apt.conf
|
||||||
--bind '/opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list' /etc/apt/sources.list.d/sparkstore.list \
|
ret="$?"
|
||||||
/opt/durapps/spark-store/bin/apt-fast/ss-apt-fast "$@" --allow-downgrades
|
if [ "$ret" -ne 0 ];then
|
||||||
|
echo -e "\e[1;33m$TRANSHELL_CONTENT_PLEASE_USE_APTSS_INSTEAD_OF_APT\e[0m"
|
||||||
|
exit $ret
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
elif [ "$1" = "download" ];then
|
|
||||||
|
|
||||||
###执行
|
|
||||||
bwrap --dev-bind / / \
|
|
||||||
--bind '/tmp/aptss-conf/apt-fast.conf' /etc/apt-fast.conf \
|
|
||||||
--bind '/opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list' /etc/apt/sources.list.d/sparkstore.list \
|
|
||||||
/opt/durapps/spark-store/bin/apt-fast/ss-apt-fast "$@" --allow-downgrades
|
|
||||||
|
|
||||||
|
|
||||||
elif [ "$1" = "policy" ] || [ "$1" = "search" ];then
|
|
||||||
sudo bwrap --dev-bind / / --bind '/opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list' /etc/apt/sources.list.d/sparkstore.list apt update -o Dir::Etc::sourcelist="sources.list.d/sparkstore.list" -o Dir::etc::sourceparts="-" -o APT::Get::List-Cleanup="0"
|
|
||||||
|
|
||||||
###执行
|
|
||||||
bwrap --dev-bind / / \
|
|
||||||
--bind '/tmp/aptss-conf/apt-fast.conf' /etc/apt-fast.conf \
|
|
||||||
--bind '/opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list' /etc/apt/sources.list.d/sparkstore.list \
|
|
||||||
apt "$@" --allow-downgrades
|
|
||||||
|
|
||||||
elif [ "$1" = "ssupdate" ];then
|
elif [ "$1" = "ssupdate" ];then
|
||||||
|
|
||||||
mkdir -p /tmp/aptss-conf/
|
mkdir -p /tmp/aptss-conf/
|
||||||
echo "从服务器获取配置和镜像列表..."
|
echo -e "\e[1;32m${TRANSHELL_CONTENT_GETTING_SERVER_CONFIG_AND_MIRROR_LIST}\e[0m"
|
||||||
echo "Getting server and mirror lists..."
|
|
||||||
echo
|
echo
|
||||||
curl --silent -o /tmp/aptss-conf/apt-fast.conf "https://gitee.com/deepin-community-store/repo_auto_update_script/raw/master/mirror-list-for-apt-fast/apt-fast.conf"
|
curl --silent -o /tmp/aptss-conf/apt-fast.conf "${SPARK_DOWNLOAD_SERVER_URL}/apt-fast.conf"
|
||||||
chmod -R 755 /tmp/aptss-conf
|
chmod -R 755 /tmp/aptss-conf
|
||||||
|
|
||||||
sudo curl --silent -o /opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list "https://gitee.com/deepin-community-store/repo_auto_update_script/raw/master/mirror-list-for-apt-fast/sources.list.d/sparkstore.list"
|
curl --silent -o /opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list "${SPARK_DOWNLOAD_SERVER_URL}/sparkstore${STORE_LIST_URL}.list"
|
||||||
sudo bwrap --dev-bind / / --bind '/opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list' /etc/apt/sources.list.d/sparkstore.list apt update -o Dir::Etc::sourcelist="sources.list.d/sparkstore.list" -o Dir::Etc::sourceparts="-" -o APT::Get::List-Cleanup="0"
|
|
||||||
|
|
||||||
|
/usr/bin/apt update -c /opt/durapps/spark-store/bin/apt-fast-conf/aptss-apt.conf -o Dir::Etc::sourceparts="-" -o APT::Get::List-Cleanup="0" -o Dir::Etc::sourcelist="/opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list"
|
||||||
|
|
||||||
#只更新星火源
|
#只更新星火源
|
||||||
|
|
||||||
elif [ "$1" = "update" ];then
|
elif [ "$1" = "update" ];then
|
||||||
sudo curl --progress-bar -o /opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list "https://gitee.com/deepin-community-store/repo_auto_update_script/raw/master/mirror-list-for-apt-fast/sources.list.d/sparkstore.list"
|
|
||||||
|
|
||||||
|
echo -e "\e[1;32m${TRANSHELL_CONTENT_GETTING_SERVER_CONFIG_AND_MIRROR_LIST}\e[0m"
|
||||||
mkdir -p /tmp/aptss-conf/
|
|
||||||
echo "从服务器获取配置和镜像列表..."
|
|
||||||
echo "Getting server and mirror lists..."
|
|
||||||
echo
|
echo
|
||||||
curl --progress-bar -o /tmp/aptss-conf/apt-fast.conf "https://gitee.com/deepin-community-store/repo_auto_update_script/raw/master/mirror-list-for-apt-fast/apt-fast.conf"
|
curl --progress-bar -o /opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list "${SPARK_DOWNLOAD_SERVER_URL}/sparkstore${STORE_LIST_URL}.list"
|
||||||
|
mkdir -p /tmp/aptss-conf/
|
||||||
|
curl --progress-bar -o /tmp/aptss-conf/apt-fast.conf "${SPARK_DOWNLOAD_SERVER_URL}/apt-fast.conf"
|
||||||
chmod -R 755 /tmp/aptss-conf
|
chmod -R 755 /tmp/aptss-conf
|
||||||
### 额外一份拿来给aptss自动补全用
|
### 额外一份拿来给aptss自动补全用
|
||||||
bwrap --dev-bind / / \
|
|
||||||
--bind '/opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list' /etc/apt/sources.list.d/sparkstore.list \
|
|
||||||
apt "$@" -o APT::Get::List-Cleanup="0"
|
|
||||||
|
|
||||||
bwrap --dev-bind / / \
|
${SS_APT_FAST} "$@" -c /opt/durapps/spark-store/bin/apt-fast-conf/aptss-apt.conf
|
||||||
--bind '/opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list' /etc/apt/sources.list.d/sparkstore.list \
|
|
||||||
apt "$@" -o APT::Get::List-Cleanup="0" -o Dir::Cache="/etc/aptss/"
|
|
||||||
|
|
||||||
else
|
else
|
||||||
bwrap --dev-bind / / \
|
${SS_APT_FAST} "$@" -c /opt/durapps/spark-store/bin/apt-fast-conf/aptss-apt.conf
|
||||||
--bind '/opt/durapps/spark-store/bin/apt-fast-conf/sources.list.d/sparkstore.list' /etc/apt/sources.list.d/sparkstore.list \
|
|
||||||
apt "$@"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
31
tool/bashimport/transhell.amber
Executable file
@@ -0,0 +1,31 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
##load transhell
|
||||||
|
function load_transhell_debug()
|
||||||
|
{
|
||||||
|
local WORK_PATH="$(cd "$(dirname "${0}")" && pwd)"
|
||||||
|
local CURRENT_LANG="$(echo ${LANG%.*})"
|
||||||
|
if [ -e "/usr/share/$(basename $0)/transhell/$(basename $0)_en_US.transhell" ]; then source /usr/share/$(basename $0)/transhell/$(basename $0)_en_US.transhell; echo "Loading transhell from /usr/share/$(basename $0)/transhell/$(basename $0)_en_US.transhell ..."; fi
|
||||||
|
if [ -e "/usr/share/$(basename $0)/transhell/$(basename $0)_$CURRENT_LANG.transhell" ]; then source /usr/share/$(basename $0)/transhell/$(basename $0)_$CURRENT_LANG.transhell; echo "Loading transhell from /usr/share/$(basename $0)/transhell/$(basename $0)_$CURRENT_LANG.transhell ..."; fi
|
||||||
|
if [ -e "${WORK_PATH}/transhell/$(basename $0)_en_US.transhell" ]; then source ${WORK_PATH}/transhell/$(basename $0)_en_US.transhell; echo "Loading transhell from ${WORK_PATH}/transhell/$(basename $0)_en_US.transhell ..."; fi
|
||||||
|
if [ -e "${WORK_PATH}/transhell/$(basename $0)_$CURRENT_LANG.transhell" ]; then source ${WORK_PATH}/transhell/$(basename $0)_$CURRENT_LANG.transhell; echo "Loading transhell from ${WORK_PATH}/transhell/$(basename $0)_$CURRENT_LANG.transhell ..."; fi
|
||||||
|
|
||||||
|
echo "-----------------------------------------------------------------------------"
|
||||||
|
}
|
||||||
|
|
||||||
|
function load_transhell()
|
||||||
|
{
|
||||||
|
local WORK_PATH="$(cd "$(dirname "${0}")" && pwd)"
|
||||||
|
local CURRENT_LANG="$(echo ${LANG%.*})"
|
||||||
|
if [ -e "/usr/share/$(basename $0)/transhell/$(basename $0)_en_US.transhell" ]; then source /usr/share/$(basename $0)/transhell/$(basename $0)_en_US.transhell; fi
|
||||||
|
if [ -e "/usr/share/$(basename $0)/transhell/$(basename $0)_$CURRENT_LANG.transhell" ]; then source /usr/share/$(basename $0)/transhell/$(basename $0)_$CURRENT_LANG.transhell; fi
|
||||||
|
if [ -e "${WORK_PATH}/transhell/$(basename $0)_en_US.transhell" ]; then source ${WORK_PATH}/transhell/$(basename $0)_en_US.transhell; fi
|
||||||
|
if [ -e "${WORK_PATH}/transhell/$(basename $0)_$CURRENT_LANG.transhell" ]; then source ${WORK_PATH}/transhell/$(basename $0)_$CURRENT_LANG.transhell; fi
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function update_transhell()
|
||||||
|
{
|
||||||
|
load_transhell $@
|
||||||
|
}
|
||||||
|
|
||||||
33
tool/open-in-terminal/open-in-terminal
Executable file
@@ -0,0 +1,33 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
source /opt/durapps/spark-store/bin/bashimport/transhell.amber
|
||||||
|
load_transhell
|
||||||
|
# 检查是否传入了路径参数
|
||||||
|
if [ -z "$1" ]; then
|
||||||
|
echo "${TRANSHELL_CONTENT_PLEASE_PROVIDE_FILE_PATH}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
DESKTOP_FILE_PATH=$1
|
||||||
|
|
||||||
|
if [[ $DESKTOP_FILE_PATH == file://* ]]; then
|
||||||
|
# 如果是,移除 'file://' 部分并输出结果
|
||||||
|
DESKTOP_FILE_PATH="${DESKTOP_FILE_PATH#file://}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 获取文件内容中第一个 Exec= 后的命令
|
||||||
|
exec_command=$(grep -m 1 -oP "(?<=Exec=).*" "$DESKTOP_FILE_PATH")
|
||||||
|
|
||||||
|
# 删除 exec_command 中最后的 % 及其后面的内容
|
||||||
|
exec_command="${exec_command%\%*}"
|
||||||
|
|
||||||
|
# 打印提取的命令
|
||||||
|
echo "$exec_command"
|
||||||
|
|
||||||
|
# 在默认终端执行命令
|
||||||
|
eval "$exec_command"
|
||||||
|
|
||||||
|
echo --------------------------------------
|
||||||
|
echo "${TRANSHELL_CONTENT_ABOVE_IS_TERMINAL_OUTPUT}"
|
||||||
|
echo "${TRANSHELL_CONTENT_PRESS_ENTER_TO_FINISH}"
|
||||||
|
read
|
||||||
|
|
||||||