Compare commits
1499 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
985ff74ccf | ||
|
|
a9aa10f4c2 | ||
|
|
7b30229355 | ||
|
|
4a0b636148 | ||
|
|
544c624f07 | ||
|
|
bbde511603 | ||
|
|
ee3a526adb | ||
|
|
e2c960238d | ||
|
|
62bc6fced7 | ||
|
|
dd83812b29 | ||
|
|
88db64451e | ||
|
|
1a96a06cb6 | ||
|
|
00f88d9666 | ||
|
|
664d02edd4 | ||
|
|
72e5c566b7 | ||
|
|
e78133b7b2 | ||
|
|
f9ad1d7801 | ||
|
|
34b68d6eab | ||
|
|
f8143d5419 | ||
|
|
d01ffe3bee | ||
|
|
87cffe5d40 | ||
|
|
d47d87e4b8 | ||
|
|
3b0f6f92a9 | ||
|
|
12cb417682 | ||
|
|
a674eea1cd | ||
|
|
a2854a7740 | ||
|
|
cd984881e5 | ||
|
|
eb22a9aef6 | ||
|
|
d709230510 | ||
|
|
d467b21960 | ||
|
|
893af516b2 | ||
|
|
9fd5002886 | ||
|
|
39c8407e0c | ||
|
|
e922a1e5bc | ||
|
|
66e10e022b | ||
|
|
3342fd6596 | ||
|
|
c1977c51fa | ||
|
|
dc1e76d60c | ||
|
|
6c073b2833 | ||
|
|
11004ebaa0 | ||
|
|
2583408420 | ||
|
|
dec0442007 | ||
|
|
c020f82a6c | ||
|
|
c1555c30cc | ||
|
|
d6cb127320 | ||
|
|
c2373eb7de | ||
|
|
d5843ff7d3 | ||
|
|
c135782001 | ||
|
|
79c208da4f | ||
|
|
b67c4a0c84 | ||
|
|
6b9105b813 | ||
|
|
6c6e0333a9 | ||
|
|
d55387d087 | ||
|
|
bf9560f8ea | ||
|
|
949ed40006 | ||
|
|
f2a9dd4db4 | ||
|
|
ed67081b74 | ||
|
|
705d931231 | ||
|
|
d1367c9dd4 | ||
|
|
31402ee9f8 | ||
|
|
b7cbac88b3 | ||
|
|
fe8c88771f | ||
|
|
befcd9eadf | ||
|
|
46e5aea61c | ||
|
|
103db689ff | ||
|
|
bc34470d3c | ||
|
|
646bddfea3 | ||
|
|
ec196715e0 | ||
|
|
cb63f0e6ea | ||
|
|
c941b2dfde | ||
|
|
671b932804 | ||
|
|
f76d3b4834 | ||
|
|
c248f79971 | ||
|
|
0566677a9d | ||
|
|
268998961b | ||
|
|
716d6f7f25 | ||
|
|
ceb7c91844 | ||
|
|
0a78dcf460 | ||
|
|
da7d23c127 | ||
|
|
64d80b2c53 | ||
|
|
f2a029a0c6 | ||
|
|
c1b60959ae | ||
|
|
d53728c0a8 | ||
|
|
a7ad4386e4 | ||
|
|
4e90a38c52 | ||
|
|
4947548224 | ||
|
|
991b69cc51 | ||
|
|
df1fa27127 | ||
|
|
936eba01cd | ||
|
|
9f8dd99cac | ||
|
|
90e5adde29 | ||
|
|
ddbed9ea14 | ||
|
|
c305432ab2 | ||
|
|
e836b154eb | ||
|
|
782589523e | ||
|
|
bb105d2ef6 | ||
|
|
483bb7354a | ||
|
|
7d9f9b43a7 | ||
|
|
7fd5cbe9d7 | ||
|
|
a16d17a8bf | ||
|
|
faf24cd531 | ||
|
|
979d76aa47 | ||
|
|
0a55bcd586 | ||
|
|
f41a6f06fe | ||
|
|
349d584228 | ||
|
|
fcad7763ff | ||
|
|
1bec4234c3 | ||
|
|
0be5ba8cf6 | ||
|
|
7245dced84 | ||
|
|
e2f611ea9a | ||
|
|
1f21eb0200 | ||
|
|
f2378636e2 | ||
|
|
509b2356d1 | ||
|
|
30b802bd10 | ||
|
|
e857421fdf | ||
|
|
8dcdc8fad2 | ||
|
|
f964ce2c68 | ||
|
|
eb9b439d11 | ||
|
|
a13ed7e4d6 | ||
|
|
8cfa5c8e0e | ||
|
|
2878559ee6 | ||
|
|
6ff39bccf8 | ||
|
|
952131a1e9 | ||
|
|
5edbcc1970 | ||
|
|
04f6d9168e | ||
|
|
cea1327dac | ||
|
|
1c41cbff82 | ||
|
|
06e8451fc0 | ||
|
|
3ff6918b1f | ||
|
|
ac3af4c6cd | ||
|
|
41bb861417 | ||
|
|
6e63418798 | ||
|
|
65781b7cac | ||
|
|
d7e6c613c6 | ||
|
|
8da0713bf0 | ||
|
|
08da925fde | ||
|
|
fb58c435ef | ||
|
|
6bf593ef4b | ||
|
|
6b3b7750cb | ||
|
|
541db8e214 | ||
|
|
644c828f00 | ||
|
|
ed6636ae26 | ||
|
|
1a543e946d | ||
|
|
9bdefd6055 | ||
|
|
8fd691968c | ||
|
|
7abc698d09 | ||
|
|
5b23248fb8 | ||
|
|
46a5cee9c9 | ||
|
|
6c2c9888be | ||
|
|
44ff9e9956 | ||
|
|
f848df74c3 | ||
|
|
6c98c29855 | ||
|
|
c34d479d5c | ||
|
|
a7a97e6978 | ||
|
|
ec018a4c70 | ||
|
|
0fabebb0fe | ||
|
|
521e1fbe39 | ||
|
|
5f2aeaef00 | ||
|
|
818e568f4a | ||
|
|
5d6831d179 | ||
|
|
a2c94c16b5 | ||
|
|
68f1084bf0 | ||
|
|
761bfc50d6 | ||
|
|
59b4dfb89c | ||
|
|
bfa5124999 | ||
|
|
234cf9ac58 | ||
|
|
8f77f4b42a | ||
|
|
fa94da00d4 | ||
|
|
40beef964b | ||
|
|
420baeedfe | ||
|
|
0f8096e314 | ||
|
|
9ec97a8867 | ||
|
|
55ef6ef863 | ||
|
|
c0985f6497 | ||
|
|
2f1ef61f82 | ||
|
|
62d2dd213d | ||
|
|
3c941a2312 | ||
|
|
4634b5617c | ||
|
|
2178b52621 | ||
|
|
61573cba16 | ||
|
|
2d2de53dcd | ||
|
|
0d10c6e2d9 | ||
|
|
767933d0cb | ||
|
|
7a362b7ee3 | ||
|
|
77ed9b0661 | ||
|
|
65600a4dcd | ||
|
|
ac1879d5cb | ||
|
|
f00ef60fb3 | ||
|
|
1a1352e456 | ||
|
|
65ae86a46d | ||
|
|
e239cdb354 | ||
|
|
7140e5e32a | ||
|
|
f5cfe9e05a | ||
|
|
be727c5890 | ||
|
|
f4fc0dab29 | ||
|
|
39bc7f1780 | ||
|
|
364ee33f9c | ||
|
|
cb5e9f60a1 | ||
|
|
2760fb1fe9 | ||
|
|
8a82e4cf57 | ||
|
|
0627b3183f | ||
|
|
df1bc94d9e | ||
|
|
6924e69b6b | ||
|
|
0a6c58fd66 | ||
|
|
bf22e54fc3 | ||
|
|
4307f48d99 | ||
|
|
4bdc04e9d8 | ||
|
|
1c6d86e70f | ||
|
|
6e642ec423 | ||
|
|
0b3c3f0123 | ||
|
|
957afe3a07 | ||
|
|
4ab726fee3 | ||
|
|
8d4507e9d8 | ||
|
|
5a00eece87 | ||
|
|
e2929ade14 | ||
|
|
b801f0655d | ||
|
|
f6ccaba6aa | ||
|
|
21189759dd | ||
|
|
047ea3c494 | ||
|
|
f71c8ffe5d | ||
|
|
381acb2449 | ||
|
|
09e4e6fa5a | ||
|
|
b9479dbd3d | ||
|
|
34cc91a9af | ||
|
|
36cdf4a252 | ||
|
|
85f65b3f1a | ||
|
|
92da2eb8bd | ||
|
|
27edfe63ee | ||
|
|
5517822008 | ||
|
|
702702cbfd | ||
|
|
c552fef134 | ||
|
|
916df28fcd | ||
|
|
c08d91687a | ||
|
|
ccbde05fb7 | ||
|
|
1049576349 | ||
|
|
0bfee09b17 | ||
|
|
87954e4459 | ||
|
|
0301e345b4 | ||
|
|
f9b5ef8d89 | ||
|
|
0ed1f8f429 | ||
|
|
659537916e | ||
|
|
0cac9ac507 | ||
|
|
7a79ecab8a | ||
|
|
1186d2b78c | ||
|
|
b46768537a | ||
|
|
44115d4bd9 | ||
|
|
f2d8e17981 | ||
|
|
7890a408f4 | ||
|
|
a940fc29c6 | ||
|
|
c6595563af | ||
|
|
cb24317010 | ||
|
|
fb1e427ab7 | ||
|
|
9d28a4d0d5 | ||
|
|
df34b0eb2b | ||
|
|
db3dc80170 | ||
|
|
db16c5f1b5 | ||
|
|
d28ca1e7a1 | ||
|
|
e84b4a8146 | ||
|
|
46e0d832f8 | ||
|
|
7e63919c08 | ||
|
|
1873dde358 | ||
|
|
6362d14da6 | ||
|
|
1f48f0f3ad | ||
|
|
82695d1b3d | ||
|
|
08b0f8ad54 | ||
|
|
54c2bd0c30 | ||
|
|
d8784a22b7 | ||
|
|
bc9f136f20 | ||
|
|
7192a06eb8 | ||
|
|
a4c6f1d16c | ||
|
|
009af32e61 | ||
|
|
fab41828ab | ||
|
|
cae42939c8 | ||
|
|
7b30322946 | ||
|
|
2730c135ea | ||
|
|
9c30169c42 | ||
|
|
624d21d001 | ||
|
|
378c647952 | ||
|
|
bbfe99ce7d | ||
|
|
97d675cb24 | ||
|
|
bbfad308e5 | ||
|
|
858cdb2d66 | ||
|
|
9f5e06ae13 | ||
|
|
2cd451c53c | ||
|
|
302ee59d67 | ||
|
|
60d915a99f | ||
|
|
47e4a6065a | ||
|
|
a2a328e3c7 | ||
|
|
dba6e6c869 | ||
|
|
aee68c167a | ||
|
|
5a185268c4 | ||
|
|
8bc2236f4f | ||
|
|
f39b3095aa | ||
|
|
384e29dcec | ||
|
|
e060d99d96 | ||
|
|
8d30fc9c3c | ||
|
|
ca1d3fcd38 | ||
|
|
b82d23e59c | ||
|
|
6d8e396e92 | ||
|
|
0b5840309f | ||
|
|
ac1a0962d3 | ||
|
|
260a2ddb24 | ||
|
|
7b9f9e10e5 | ||
|
|
3fded82f26 | ||
|
|
07d0bdc8ed | ||
|
|
5caa5db273 | ||
|
|
f554df9e7a | ||
|
|
7f58877a47 | ||
|
|
b50e2017e6 | ||
|
|
e4a71982d9 | ||
|
|
7dee00f89b | ||
|
|
3b8775fd86 | ||
|
|
d5ffd8f6a7 | ||
|
|
296c7edbd0 | ||
|
|
2563b9e874 | ||
|
|
f304ed7f70 | ||
|
|
9174339b68 | ||
|
|
407c70a8c5 | ||
|
|
87f5b6127b | ||
|
|
d010fe7a95 | ||
|
|
8e7b7f536e | ||
|
|
38dfd519c9 | ||
|
|
4600af712b | ||
|
|
21d8a3dcdb | ||
|
|
0c9773ab54 | ||
|
|
65a645b2cc | ||
|
|
a61d5bd8c0 | ||
|
|
c646d13b14 | ||
|
|
f132255492 | ||
|
|
208c804db1 | ||
|
|
89cca4c36a | ||
|
|
64bd9021d9 | ||
|
|
5a9f23a9ad | ||
|
|
0073870480 | ||
|
|
6cdea82a40 | ||
|
|
95b627e83e | ||
|
|
2569e0aa05 | ||
|
|
be86a772ce | ||
|
|
eda610409a | ||
|
|
44a5873415 | ||
|
|
e1368be645 | ||
|
|
1b2b90396a | ||
|
|
bd0b2ad483 | ||
|
|
9c537340c5 | ||
|
|
1bf698478d | ||
|
|
a79abbdb48 | ||
|
|
a8783084f9 | ||
|
|
3f11f74324 | ||
|
|
99854f686e | ||
|
|
35f212a788 | ||
|
|
32eaf93692 | ||
|
|
6f5e33a2ad | ||
|
|
279a9d7df9 | ||
|
|
c0247fc02a | ||
|
|
27d71eecac | ||
|
|
5e59a6dc3a | ||
|
|
409d4489cc | ||
|
|
04ea1c68a7 | ||
|
|
1922395b4b | ||
|
|
3b97fdc2ce | ||
|
|
716207f600 | ||
|
|
159579fb48 | ||
|
|
d2c08aca70 | ||
|
|
b5a179555a | ||
|
|
9c14c62637 | ||
|
|
7c1d04f7be | ||
|
|
9f153af5bb | ||
|
|
7d79ea2770 | ||
|
|
983afc4d1e | ||
|
|
540961b8dd | ||
|
|
fda5887d50 | ||
|
|
22f609cfa6 | ||
|
|
0d78303713 | ||
|
|
fbd25a83f1 | ||
|
|
28745fa2f8 | ||
|
|
8e46431b35 | ||
|
|
225b1ff2bb | ||
|
|
08714ddc3f | ||
|
|
94b80423d7 | ||
|
|
bfad80c540 | ||
|
|
da6bf2b9ab | ||
|
|
075ef6187f | ||
|
|
782af9a1fc | ||
|
|
2370d79ca6 | ||
|
|
760c0365e0 | ||
|
|
fba9c7ce5d | ||
|
|
44790307d8 | ||
|
|
d1d801cf16 | ||
|
|
8d670577a9 | ||
|
|
af4a3ef2a8 | ||
|
|
1189945ef1 | ||
|
|
f4bfa0f3c5 | ||
|
|
6adce7337b | ||
|
|
1eaeed6c56 | ||
|
|
ae5a75bc3f | ||
|
|
b70fc7b3e8 | ||
|
|
38ee87f762 | ||
|
|
b85a6b55d9 | ||
|
|
6cf05c3438 | ||
|
|
f6b77f5c3c | ||
|
|
a012426f9b | ||
|
|
ee2ef8ac69 | ||
|
|
2a97833d02 | ||
|
|
c2bd56e2e9 | ||
|
|
85da93c2fe | ||
|
|
c80174e7e5 | ||
|
|
3f256f7249 | ||
|
|
85d7b3047c | ||
|
|
2d67e9e1e5 | ||
|
|
da9062ef62 | ||
|
|
f20c3bc63a | ||
|
|
11223bf664 | ||
|
|
c94155fb06 | ||
|
|
822ad48152 | ||
|
|
ea8e442153 | ||
|
|
eb008be404 | ||
|
|
f5ac29c19e | ||
|
|
f22d62a85b | ||
|
|
5199fa45d1 | ||
|
|
b2399bb279 | ||
|
|
b14d3ff30f | ||
|
|
b43770de37 | ||
|
|
875a358600 | ||
|
|
cd58e6e9b5 | ||
|
|
43c8d69281 | ||
|
|
293bf9b74f | ||
|
|
00e4dc14ba | ||
|
|
8ef696f6f2 | ||
|
|
c3aefff3b4 | ||
|
|
44bfc56471 | ||
|
|
a74d8acb42 | ||
|
|
fafa52a1ba | ||
|
|
54c7c7e2a5 | ||
|
|
314ed4bbf2 | ||
|
|
0fbbef7609 | ||
|
|
6eb46250b1 | ||
|
|
14acd0fe4a | ||
|
|
7774aaa75a | ||
|
|
ebdd950b4e | ||
|
|
8e8ead0b4f | ||
|
|
ff0b32a8e0 | ||
|
|
f549a92c01 | ||
|
|
93d0d4b1c2 | ||
|
|
b6d7f868ac | ||
|
|
bc1f12ba93 | ||
|
|
537828ef3d | ||
|
|
6444e7424f | ||
|
|
10a75b0413 | ||
|
|
9eb9ee4071 | ||
|
|
7ed3f8b2d1 | ||
|
|
7319c52d4d | ||
|
|
8974b1a299 | ||
|
|
63fed89f26 | ||
|
|
866ccb2c4e | ||
|
|
cbc43e5e0e | ||
|
|
3a3c3a96d6 | ||
|
|
0cbc810a5a | ||
|
|
d83ec7c66f | ||
|
|
118e79e7ec | ||
|
|
1c69685257 | ||
|
|
fde8007174 | ||
|
|
60e0201060 | ||
|
|
90b92900a1 | ||
|
|
96a5443a02 | ||
|
|
ffe6eccb05 | ||
|
|
14312442db | ||
|
|
bb630ca605 | ||
|
|
e3117121cc | ||
|
|
a8a40f0bee | ||
|
|
9f9d9792aa | ||
|
|
4399f6ea29 | ||
|
|
754a41d118 | ||
|
|
b0544be068 | ||
|
|
f9b62234b0 | ||
|
|
ac8cf863a0 | ||
|
|
91190e8744 | ||
|
|
efb87c868b | ||
|
|
ad0c2103bf | ||
|
|
5b3ad7e5db | ||
|
|
589a62fe15 | ||
|
|
b51c56e286 | ||
|
|
84ca7b18a0 | ||
|
|
8610a64b51 | ||
|
|
ae55013566 | ||
|
|
60526f2293 | ||
|
|
6c27115de8 | ||
|
|
62d3d73651 | ||
|
|
8fc333806a | ||
|
|
412f24537b | ||
|
|
a74e03451f | ||
|
|
3cd0265df6 | ||
|
|
53e8010732 | ||
|
|
880a7f13b5 | ||
|
|
7f6fa0c96c | ||
|
|
8ac8d63b96 | ||
|
|
0e6971e2ae | ||
|
|
32f9b4664b | ||
|
|
b567f6c5d2 | ||
|
|
c850e36025 | ||
|
|
2bb1589ca2 | ||
|
|
40dccdb5ae | ||
|
|
3d4d677494 | ||
|
|
6e143de09d | ||
|
|
ea0eac0e38 | ||
|
|
f69b1e1ef8 | ||
|
|
87324846cd | ||
|
|
060313c11f | ||
|
|
59108ed245 | ||
|
|
68a3bcde08 | ||
|
|
68e5aec912 | ||
|
|
6998c0e585 | ||
|
|
4d3328e468 | ||
|
|
06bcf2cd48 | ||
|
|
5df2467592 | ||
|
|
48163d2679 | ||
|
|
f3305b95d2 | ||
|
|
8e5e974669 | ||
|
|
773f186a7f | ||
|
|
6b85b2b505 | ||
|
|
ee97b03e53 | ||
|
|
0e5329fd3e | ||
|
|
ac311d6d45 | ||
|
|
f0f3caeb32 | ||
|
|
d394930d74 | ||
|
|
19192541f9 | ||
|
|
8ddabc4cc8 | ||
|
|
42498b2021 | ||
|
|
daa52e109e | ||
|
|
263c73188a | ||
|
|
9a69955124 | ||
|
|
b950b8a209 | ||
|
|
dfc2714d3b | ||
|
|
4841d9b896 | ||
|
|
214c415fa2 | ||
|
|
489f72aa0c | ||
|
|
883d5b5198 | ||
|
|
3ef1ac97c2 | ||
|
|
621e5e7789 | ||
|
|
22402e79f5 | ||
|
|
54b9a8dc50 | ||
|
|
dc05ec3acf | ||
|
|
84c6afa428 | ||
|
|
1097d65959 | ||
|
|
6ae14fada3 | ||
|
|
a2e9c1aa9c | ||
|
|
60c22000a8 | ||
|
|
3ec395fe79 | ||
|
|
fac81265bf | ||
|
|
c1df05b55d | ||
|
|
af549d8ca9 | ||
|
|
9bfd77a206 | ||
|
|
37edf47c4b | ||
|
|
be4e5a88a6 | ||
|
|
a279e71535 | ||
|
|
5ddb02cc8e | ||
|
|
ecccba4536 | ||
|
|
0087a1b360 | ||
|
|
8bfb98ea20 | ||
|
|
de4a59d45a | ||
|
|
068797dbb0 | ||
|
|
302fcd1435 | ||
|
|
1d9902b690 | ||
|
|
9735f41b1a | ||
|
|
4a77580b07 | ||
|
|
1a903e74f2 | ||
|
|
e4565034fb | ||
|
|
052d3cecb9 | ||
|
|
fde133c25e | ||
|
|
6e35a9e7a7 | ||
|
|
bfab7e495a | ||
|
|
3e9dc7f4d6 | ||
|
|
da8f17cce2 | ||
|
|
3cd6d766f8 | ||
|
|
82c98a3f91 | ||
|
|
c11a496278 | ||
|
|
d27783e2f1 | ||
|
|
efd88565a9 | ||
|
|
f3bb1b17d0 | ||
|
|
518cee9d0a | ||
|
|
6302ab03d8 | ||
|
|
2afca346b0 | ||
|
|
89ff0ad311 | ||
|
|
6caeac2cb4 | ||
|
|
a0f0640c9f | ||
|
|
d3f5879119 | ||
|
|
df74686287 | ||
|
|
75d58b3ea3 | ||
|
|
bedd25021c | ||
|
|
0e566cb8a3 | ||
|
|
23f80334f6 | ||
|
|
7063909cee | ||
|
|
a284e3bd65 | ||
|
|
823887daf8 | ||
|
|
78a4166e42 | ||
|
|
3d3b694040 | ||
|
|
ad06241c9d | ||
|
|
6a1ea6c7de | ||
|
|
931719c474 | ||
|
|
70ef00932a | ||
|
|
a1bc4a063b | ||
|
|
abf7224582 | ||
|
|
7ab4c9af2e | ||
|
|
d5fefaa35f | ||
|
|
3c4af9c6af | ||
|
|
12ec819aeb | ||
|
|
e6fc1c14bd | ||
|
|
6fb45c055c | ||
|
|
535b926095 | ||
|
|
b15bc26a63 | ||
|
|
1d90e8e823 | ||
|
|
6b3027401d | ||
|
|
e35bd65a91 | ||
|
|
8888f6800b | ||
|
|
2afe62ec77 | ||
|
|
4b27af959b | ||
|
|
0df1a41a1d | ||
|
|
21badd592e | ||
|
|
a110d53a53 | ||
|
|
0270993782 | ||
|
|
2c0d899b2a | ||
|
|
1abe101ef7 | ||
|
|
0ebc170cfa | ||
|
|
ee6ddfadc3 | ||
|
|
720b5f0c72 | ||
|
|
aceabd8455 | ||
|
|
ab4869a0e1 | ||
|
|
adf5793ccd | ||
|
|
31e26c2c1c | ||
|
|
de05ddd203 | ||
|
|
03a8eaa44f | ||
|
|
48e79f12a7 | ||
|
|
89aa3d5251 | ||
|
|
87b0596ebc | ||
|
|
a08857804a | ||
|
|
dbca6d79cf | ||
|
|
a24221c002 | ||
|
|
5f89dd0465 | ||
|
|
0b82ff30fe | ||
|
|
130b0de646 | ||
|
|
b5b251dffb | ||
|
|
0c44accb44 | ||
|
|
bbdf0ef29d | ||
|
|
401e8cf492 | ||
|
|
83cdc69fc8 | ||
|
|
1e3af06bb0 | ||
|
|
2c8abee668 | ||
|
|
5af7492b67 | ||
|
|
8d1465a81f | ||
|
|
5ead4684f5 | ||
|
|
fc91502162 | ||
|
|
3a99bdcfb4 | ||
|
|
487e23e190 | ||
|
|
511132ee4f | ||
|
|
edc89555bc | ||
|
|
ad30211dae | ||
|
|
48406da6ea | ||
|
|
aff0bd6e25 | ||
|
|
3969d28d92 | ||
|
|
d0c100995e | ||
|
|
f54e4c8ac2 | ||
|
|
b39cd2d81b | ||
|
|
0e8e563654 | ||
|
|
2f041a0eed | ||
|
|
2c7b5982b5 | ||
|
|
ffa0105d3e | ||
|
|
bac0698581 | ||
|
|
be3180df6f | ||
|
|
6179832a2b | ||
|
|
13853573ea | ||
|
|
b6b4c626e8 | ||
|
|
bd41ec1627 | ||
|
|
b54dab7df2 | ||
|
|
e66ef604a7 | ||
|
|
e03674fd4b | ||
|
|
3f69fedd1f | ||
|
|
a614e3cc3d | ||
|
|
ebde50b492 | ||
|
|
2a6bd306cb | ||
|
|
8a27a5596b | ||
|
|
f835ffd978 | ||
|
|
97215705f5 | ||
|
|
6ee97e64d7 | ||
|
|
a1c4812619 | ||
|
|
b0c8edbd82 | ||
|
|
a4190ecbf0 | ||
|
|
d8c6efaada | ||
|
|
0312682e07 | ||
|
|
8d14068df7 | ||
|
|
fe1d9a493f | ||
|
|
e55ad49db8 | ||
|
|
018ce2001e | ||
|
|
c8fe4c46dd | ||
|
|
1781fa671d | ||
|
|
75910e910e | ||
|
|
899e06be1c | ||
|
|
66687dc8b6 | ||
|
|
b8fe620276 | ||
|
|
1a50ea9892 | ||
|
|
0a096869fe | ||
|
|
44dc76bd19 | ||
|
|
aedbaec497 | ||
|
|
04aa622111 | ||
|
|
3564229482 | ||
|
|
637db7f4f9 | ||
|
|
f6d3d6d34a | ||
|
|
92369bdb26 | ||
|
|
8f95447108 | ||
|
|
0e3c3bab45 | ||
|
|
3a5c965306 | ||
|
|
0c88457037 | ||
|
|
46fa22dc6a | ||
|
|
f3d32399e5 | ||
|
|
b320bb17d1 | ||
|
|
81afe2d3cb | ||
|
|
5fad43377b | ||
|
|
f543318232 | ||
|
|
ab385a782a | ||
|
|
c370875128 | ||
|
|
1c261515db | ||
|
|
37cbae84ca | ||
|
|
f5759716b4 | ||
|
|
f645fe725a | ||
|
|
fdedd7d92a | ||
|
|
044a43d793 | ||
|
|
6846c96146 | ||
|
|
8fe9461872 | ||
|
|
fbde4edcd2 | ||
|
|
68742681f7 | ||
|
|
bbb3f99bc3 | ||
|
|
e0f6f3013f | ||
|
|
6eb497fb64 | ||
|
|
ae15757765 | ||
|
|
be294b4867 | ||
|
|
70738f7549 | ||
|
|
42dc529ce1 | ||
|
|
65058d3a48 | ||
|
|
48c4106b7f | ||
|
|
175b48569f | ||
|
|
89c6abb5ce | ||
|
|
55f23799bc | ||
|
|
646211cc4c | ||
|
|
423bab9954 | ||
|
|
831d90ebf5 | ||
|
|
abdc0dc0dd | ||
|
|
175c836c93 | ||
|
|
76304172ab | ||
|
|
0eb3978aee | ||
|
|
73f42d55ca | ||
|
|
059a055483 | ||
|
|
dcf1ee393e | ||
|
|
04aecb3693 | ||
|
|
533d174abc | ||
|
|
48fb999bd0 | ||
|
|
5443e5f998 | ||
|
|
543d226ba3 | ||
|
|
03b1848b43 | ||
|
|
05ab8d2067 | ||
|
|
c28a27c81c | ||
|
|
1b42048135 | ||
|
|
bfe6b9bd26 | ||
|
|
08a8cee1c6 | ||
|
|
835a532e75 | ||
|
|
d383ade03c | ||
|
|
6d9c4cee02 | ||
|
|
a565239c4a | ||
|
|
ba69f3e6b9 | ||
|
|
14c29f695c | ||
|
|
703a9b3e12 | ||
|
|
0eca1b0433 | ||
|
|
691c9683ce | ||
|
|
1a11e5ddcd | ||
|
|
a4d281dbb6 | ||
|
|
8361f90dce | ||
|
|
04b4ff8b4b | ||
|
|
121248c3c5 | ||
|
|
c44d0c87e3 | ||
|
|
c6cf9487ba | ||
|
|
c78cc17730 | ||
|
|
81a0234b05 | ||
|
|
f72a8568c5 | ||
|
|
11aec65967 | ||
|
|
40636d1e05 | ||
|
|
75841415a3 | ||
|
|
edc799bc54 | ||
|
|
1d0b20337f | ||
|
|
4a6d2d3514 | ||
|
|
8443414ae3 | ||
|
|
81c99745d4 | ||
|
|
d6831caea4 | ||
|
|
aa25e1fd56 | ||
|
|
0459aff34f | ||
|
|
aeb0a27401 | ||
|
|
50e3ef3dd8 | ||
|
|
9974256d71 | ||
|
|
8cf4134125 | ||
|
|
ef5b22c616 | ||
|
|
42161c807a | ||
|
|
acfc96f57c | ||
|
|
e6e83d5775 | ||
|
|
5b2bc2297b | ||
|
|
2de3e7e3be | ||
|
|
0d242297ff | ||
|
|
e2080b5cfc | ||
|
|
679fa81f6d | ||
|
|
6d0f14e1a5 | ||
|
|
281127c2c3 | ||
|
|
8e621f1f20 | ||
|
|
0948f73bf8 | ||
|
|
4bc1a18db2 | ||
|
|
80eb628ea3 | ||
|
|
d811915a0c | ||
|
|
0225563b46 | ||
|
|
da20405a6a | ||
|
|
ace6d69695 | ||
|
|
7baf0f90e8 | ||
|
|
2ad92ce958 | ||
|
|
50c4a8ed48 | ||
|
|
59d6a64098 | ||
|
|
3de877fe56 | ||
|
|
e2cebd9dcf | ||
|
|
58744408f0 | ||
|
|
e36655a7ab | ||
|
|
ffed6a9c5f | ||
|
|
38d8e6aa25 | ||
|
|
c109ef836a | ||
|
|
caa1a9f330 | ||
|
|
e71884b23d | ||
|
|
d04c386948 | ||
|
|
6a25de327c | ||
|
|
e63d1b1683 | ||
|
|
fa2ab356e1 | ||
|
|
80f92e5697 | ||
|
|
0c13402516 | ||
|
|
97e3d72566 | ||
|
|
682aaf66eb | ||
|
|
c939df73fa | ||
|
|
fdf169ce9a | ||
|
|
4b730a4949 | ||
|
|
788c357cc0 | ||
|
|
e3844b8d6c | ||
|
|
ff3fcdcacd | ||
|
|
a9268e6bf7 | ||
|
|
0227bd1786 | ||
|
|
227037e42a | ||
|
|
cd495a14ec | ||
|
|
312a8cf500 | ||
|
|
2fc8bbe9c9 | ||
|
|
f5c4b26aab | ||
|
|
c4d2d72e92 | ||
|
|
f90f0b0427 | ||
|
|
d360b4ced2 | ||
|
|
f074ea9d67 | ||
|
|
2e8137ad85 | ||
|
|
a65b1bdcaf | ||
|
|
4041aa72cc | ||
|
|
4d2de7bb2a | ||
|
|
bcb7118710 | ||
|
|
45390506dd | ||
|
|
f58a3d4401 | ||
|
|
a3e979a8ad | ||
|
|
adb72737e8 | ||
|
|
e626a7e302 | ||
|
|
8b6df4aaa5 | ||
|
|
ccf8ea9d1e | ||
|
|
dfb8543aee | ||
|
|
277e06627b | ||
|
|
ea9b39a9dd | ||
|
|
1848ffa35a | ||
|
|
c53be0e97d | ||
|
|
ae999f132e | ||
|
|
9aa958e8b0 | ||
|
|
5652c8440e | ||
|
|
26f4c9b049 | ||
|
|
ce11fa9d10 | ||
|
|
6a393955cd | ||
|
|
6b5f364864 | ||
|
|
333d2920db | ||
|
|
25eb02d07c | ||
|
|
3b2f940efa | ||
|
|
9dcbe91f02 | ||
|
|
4da810ba7c | ||
|
|
819f1effc5 | ||
|
|
ba94ef3493 | ||
|
|
36bcbded54 | ||
|
|
0127fd89a3 | ||
|
|
eee9ebb41d | ||
|
|
79cb889d83 | ||
|
|
cdb8926673 | ||
|
|
b3307d81ca | ||
|
|
40374178c9 | ||
|
|
516465aefb | ||
|
|
e760d3e967 | ||
|
|
c5333a2414 | ||
|
|
0d406ece7c | ||
|
|
7c03b1b936 | ||
|
|
427b5a0be0 | ||
|
|
3011c0c030 | ||
|
|
b8b6db632c | ||
|
|
04ca4ae674 | ||
|
|
3a0c2a3113 | ||
|
|
789f78354a | ||
|
|
14f5426299 | ||
|
|
d418d92ef4 | ||
|
|
726d73b2c2 | ||
|
|
115e67edc4 | ||
|
|
4a8b5dd7ab | ||
|
|
4c75168152 | ||
|
|
64a2024513 | ||
|
|
056e1ef947 | ||
|
|
a9965bf6dc | ||
|
|
f54869fbf7 | ||
|
|
835a20f03f | ||
|
|
aa7976dac6 | ||
|
|
067338ef23 | ||
|
|
b7e7c0ccc3 | ||
|
|
cb18bc0d91 | ||
|
|
07464ce05c | ||
|
|
62ce9dca5d | ||
|
|
985d164cd1 | ||
|
|
0c9a1ee3f2 | ||
|
|
0bd20883df | ||
|
|
1d8a1e9bb8 | ||
|
|
3adabaec81 | ||
|
|
5695d0d305 | ||
|
|
f1792820e1 | ||
|
|
e091be0b76 | ||
|
|
e4c5eac146 | ||
|
|
cbd2fcb0d3 | ||
|
|
47029190dc | ||
|
|
80aee638c9 | ||
|
|
cdc863e962 | ||
|
|
ef855e3843 | ||
|
|
842d417e8d | ||
|
|
52a64350e6 | ||
|
|
79831d482b | ||
|
|
a4fbaf413b | ||
|
|
b982947cf4 | ||
|
|
bc2ac48eab | ||
|
|
ddbdb83821 | ||
|
|
85626c9a21 | ||
|
|
8bf8309949 | ||
|
|
528f48e6d1 | ||
|
|
28dfcc2a62 | ||
|
|
0bfa2eb88e | ||
|
|
27bbe9f7f5 | ||
|
|
92dbcec7c0 | ||
|
|
2be2f2bc6f | ||
|
|
a083d778bd | ||
|
|
d4770a7d41 | ||
|
|
37365caf8e | ||
|
|
3f5bfc3139 | ||
|
|
4ac7291831 | ||
|
|
b5e9096387 | ||
|
|
19c8e9ffcc | ||
|
|
6a815a836c | ||
|
|
277d3fffe4 | ||
|
|
9502e7bf6c | ||
|
|
8aae6bf70b | ||
|
|
a668fe2f73 | ||
|
|
12bb7b73e9 | ||
|
|
dbf90a4233 | ||
|
|
19331ebe2b | ||
|
|
16a149b436 | ||
|
|
1f995299f0 | ||
|
|
7a17aba42d | ||
|
|
9fe1dd6a88 | ||
|
|
7c2d1891a2 | ||
|
|
998fe9fa11 | ||
|
|
28dc374fc2 | ||
|
|
1b6e449b4a | ||
|
|
0e88467f94 | ||
|
|
d0f4ce3248 | ||
|
|
542618fd4e | ||
|
|
661d0c4356 | ||
|
|
dceaa155c4 | ||
|
|
c541f2c69b | ||
|
|
37d305e50d | ||
|
|
4adef2b774 | ||
|
|
1c2383f8eb | ||
|
|
6c687d28de | ||
|
|
708add3ff5 | ||
|
|
e85b4167bd | ||
|
|
59c783831a | ||
|
|
4cb1931ace | ||
|
|
fe10b570d3 | ||
|
|
f3c5d51380 | ||
|
|
34cb2ae917 | ||
|
|
8cc9cc25ad | ||
|
|
c90fb9413c | ||
|
|
dec170ed24 | ||
|
|
3ffbbfb6d0 | ||
|
|
e8332575f8 | ||
|
|
8c12d912b4 | ||
|
|
fd28f0f751 | ||
|
|
3f09d5c6ea | ||
|
|
3407945f19 | ||
|
|
ce01e6b4a6 | ||
|
|
3428a4b8b4 | ||
|
|
2b9377b5ee | ||
|
|
d4a18003d9 | ||
|
|
2c15d5dacd | ||
|
|
f236de3277 | ||
|
|
93394577d0 | ||
|
|
f387c6aebc | ||
|
|
41173d067b | ||
|
|
5b60e39ed3 | ||
|
|
1916bd726d | ||
|
|
3efc5f2ada | ||
|
|
3eba02597c | ||
|
|
65eeffd5e1 | ||
|
|
ff1439c719 | ||
|
|
7ba20f37b7 | ||
|
|
a4ef161f4f | ||
|
|
8a16230213 | ||
|
|
8113bf63ba | ||
|
|
2770837adc | ||
|
|
c4872c6b10 | ||
|
|
efb9b879dd | ||
|
|
d10d59a8e2 | ||
|
|
b61f50982a | ||
|
|
ae72f5e47d | ||
|
|
9d7c692398 | ||
|
|
474dd13855 | ||
|
|
72496ebd48 | ||
|
|
b727274cd9 | ||
|
|
094fa37135 | ||
|
|
6a8b26f415 | ||
|
|
acb423872a | ||
|
|
505f14a601 | ||
|
|
05c58a4ca9 | ||
|
|
b8ed70fa33 | ||
|
|
b510686fe2 | ||
|
|
50652b05b0 | ||
|
|
66795f2b12 | ||
|
|
bc5e0ba7d8 | ||
|
|
d722482913 | ||
|
|
1d68e27558 | ||
|
|
1dbd3f3f06 | ||
|
|
68b0958119 | ||
|
|
6c3f82547d | ||
|
|
9fe8f291fb | ||
|
|
102e65a548 | ||
|
|
4f62794946 | ||
|
|
dd06d84206 | ||
|
|
d4c179c48e | ||
|
|
ff68ad95a6 | ||
|
|
8f696ea36a | ||
|
|
ce1e8c8beb | ||
|
|
98ebdbea50 | ||
|
|
418d0740d2 | ||
|
|
50c3066eaa | ||
|
|
29ebc83b35 | ||
|
|
03bd4a4505 | ||
|
|
407af06a4a | ||
|
|
9af9e43a5d | ||
|
|
4c928071af | ||
|
|
ea03b988e0 | ||
|
|
e1044c3e91 | ||
|
|
8057d25f35 | ||
|
|
592193fc91 | ||
|
|
5cf4aa77d8 | ||
|
|
616e50c3f5 | ||
|
|
1de42a9766 | ||
|
|
f07fcddd78 | ||
|
|
225ab943bb | ||
|
|
3fe31ca62d | ||
|
|
d1f17e60f7 | ||
|
|
8f78e608d1 | ||
|
|
a5e8011222 | ||
|
|
0305d8a221 | ||
|
|
25e8d8691f | ||
|
|
084c5c5995 | ||
|
|
65c080ae8e | ||
|
|
f9927cef29 | ||
|
|
5778dfe929 | ||
|
|
c33c09eab1 | ||
|
|
2150ebf45e | ||
|
|
6021ee8094 | ||
|
|
eebb2a6297 | ||
|
|
0fb1363b1a | ||
|
|
2ca03cc56d | ||
|
|
4a2768015c | ||
|
|
861ce67725 | ||
|
|
c530a4a4ec | ||
|
|
2378f46067 | ||
|
|
ea707369a0 | ||
|
|
7640e9bdcf | ||
|
|
4a0266bc76 | ||
|
|
6d1f97649e | ||
|
|
2af4b1f75c | ||
|
|
c0cde1e31e | ||
|
|
ee809da7a7 | ||
|
|
a253e4a0b5 | ||
|
|
779c4b928c | ||
|
|
056f04d408 | ||
|
|
e085a29484 | ||
|
|
ffd35cbce3 | ||
|
|
8c1f065f3f | ||
|
|
5af6b4e324 | ||
|
|
b47a777f5c | ||
|
|
5b3a0a28df | ||
|
|
02143eac71 | ||
|
|
5e230d8874 | ||
|
|
a45a035bb3 | ||
|
|
05f8ce15a2 | ||
|
|
45af8867b2 | ||
|
|
8e522ce311 | ||
|
|
178603e3ba | ||
|
|
552cee514d | ||
|
|
4105f70089 | ||
|
|
0bd34a5a6e | ||
|
|
a5dd566b37 | ||
|
|
1724f7f5ec | ||
|
|
6cd09addae | ||
|
|
93382350db | ||
|
|
db90e5415f | ||
|
|
9679fd67cc | ||
|
|
c84c98f49a | ||
|
|
716acd5f68 | ||
|
|
e782b4813b | ||
|
|
b27a24b3c4 | ||
|
|
18c65cdf34 | ||
|
|
e049cb0353 | ||
|
|
8d42e7777d | ||
|
|
e682ab8ea5 | ||
|
|
c6ff7f5230 | ||
|
|
309fe1a14a | ||
|
|
6b45274686 | ||
|
|
0f72fabe67 | ||
|
|
d3ad17d2c6 | ||
|
|
a8e0f1904f | ||
|
|
2ee7deb6d5 | ||
|
|
2e88d8651e | ||
|
|
232b6b9a61 | ||
|
|
5978aaaedc | ||
|
|
3332f6050e | ||
|
|
a1de28c969 | ||
|
|
8af53b4199 | ||
|
|
bddf4c417d | ||
|
|
e345773cfc | ||
|
|
c1816bf507 | ||
|
|
4f97e07eb6 | ||
|
|
2fe542c3ef | ||
|
|
07f9c6d016 | ||
|
|
8ea7c265a7 | ||
|
|
3cd12ce1d3 | ||
|
|
1be8f2861d | ||
|
|
e15af4101a | ||
|
|
4504457da2 | ||
|
|
f497944d2c | ||
|
|
aee9fb1c95 | ||
|
|
316d9a00b5 | ||
|
|
b353c210ee | ||
|
|
490e853435 | ||
|
|
7393addf64 | ||
|
|
a2b9650469 | ||
|
|
ca39ab0b44 | ||
|
|
ae997d3d75 | ||
|
|
c48cf3875d | ||
|
|
46fb18fc58 | ||
|
|
8da6904dcd | ||
|
|
2a51359159 | ||
|
|
ec48140309 | ||
|
|
fe64f407c0 | ||
|
|
136d6d966c | ||
|
|
05ff005613 | ||
|
|
3ff154aff1 | ||
|
|
de645b3cca | ||
|
|
f6174faebb | ||
|
|
0d3ec46095 | ||
|
|
53fed8b765 | ||
|
|
5752bfb58b | ||
|
|
5378d90ba7 | ||
|
|
ae96bbc0a0 | ||
|
|
c10ff7c688 | ||
|
|
d2fb1579a5 | ||
|
|
156cc71040 | ||
|
|
909c189d7f | ||
|
|
50c529b77f | ||
|
|
84b501205a | ||
|
|
664a1674ab | ||
|
|
0c5ef5e158 | ||
|
|
b776fc24a6 | ||
|
|
c5e7104413 | ||
|
|
2c7764ecf7 | ||
|
|
bed99eacc2 | ||
|
|
dae677e479 | ||
|
|
a05078c947 | ||
|
|
3fcf05fb29 | ||
|
|
cdca8c2ac0 | ||
|
|
53ec8b896a | ||
|
|
6e6c1512a6 | ||
|
|
8e0ea57319 | ||
|
|
9bd55cc15a | ||
|
|
c8d4487a95 | ||
|
|
12b0182337 | ||
|
|
a2b07fd97f | ||
|
|
078905181e | ||
|
|
7c9ed9b624 | ||
|
|
ac164c3a97 | ||
|
|
2b7232c9b3 | ||
|
|
6cc7d79832 | ||
|
|
0b88843d76 | ||
|
|
554f26a614 | ||
|
|
10fbb6f302 | ||
|
|
bf27207dd9 | ||
|
|
97f02d39e6 | ||
|
|
64231d037d | ||
|
|
6eb869014e | ||
|
|
a564ca5ce5 | ||
|
|
365b989364 | ||
|
|
a3baf7dcf6 | ||
|
|
538e690c22 | ||
|
|
b1309da89a | ||
|
|
d2f751ef87 | ||
|
|
35c1b04c58 | ||
|
|
0de1a9ccae | ||
|
|
c45327aafd | ||
|
|
8853c751d6 | ||
|
|
e978a32a09 | ||
|
|
ca5683f5bf | ||
|
|
c630a59afe | ||
|
|
b9b8ff9c76 | ||
|
|
e2c5204d00 | ||
|
|
5ee94d7602 | ||
|
|
69894f3f88 | ||
|
|
641946bff5 | ||
|
|
27dd7a1b75 | ||
|
|
5425f2b9e1 | ||
|
|
4320e350c8 | ||
|
|
8351aa11e7 | ||
|
|
e98fd5bcb3 | ||
|
|
a012af2aac | ||
|
|
df285dd385 | ||
|
|
a6ed4354a9 | ||
|
|
1fccb943fe | ||
|
|
7bd3765fa7 | ||
|
|
9b56ca08e1 | ||
|
|
49a7682e74 | ||
|
|
e25bf2eac2 | ||
|
|
f7c8384b73 | ||
|
|
9bd06401d9 | ||
|
|
b44a7e75ca | ||
|
|
c9645ef85b | ||
|
|
fd09a681c4 | ||
|
|
e113790bbe | ||
|
|
957dce5d1f | ||
|
|
e352ce559b | ||
|
|
0c3ef64d3e | ||
|
|
f72e2ce058 | ||
|
|
befdcce343 | ||
|
|
6fc8964ffc | ||
|
|
6cb1f33451 | ||
|
|
ee616c2541 | ||
|
|
7dd2a3c83c | ||
|
|
9db502e652 | ||
|
|
1ad6caeb8a | ||
|
|
4dde545c8f | ||
|
|
b7a5918974 | ||
|
|
ddfa6c2a43 | ||
|
|
275520ae29 | ||
|
|
1078387f5d | ||
|
|
c33dddbd47 | ||
|
|
2570a880af | ||
|
|
40a8d9e6b4 | ||
|
|
9af6622466 | ||
|
|
4fa89374c4 | ||
|
|
1aaa56ef29 | ||
|
|
d298a47bda | ||
|
|
146b65206a | ||
|
|
616ad9f86e | ||
|
|
aa9762718c | ||
|
|
f26bee6677 | ||
|
|
fb18de4868 | ||
|
|
e204e10113 | ||
|
|
a06a14d6cd | ||
|
|
88d4bea2c1 | ||
|
|
b8ad2f7577 | ||
|
|
32e5d599f7 | ||
|
|
48382ccd82 | ||
|
|
e37e4fdf57 | ||
|
|
c9a97534a8 | ||
|
|
8f54dd2a82 | ||
|
|
c0d6f959ec | ||
|
|
8570139cd1 | ||
|
|
b38919e909 | ||
|
|
b19cc98c84 | ||
|
|
f3f5b668e5 | ||
|
|
82d15fbe29 | ||
|
|
01533a9f85 | ||
|
|
fb9f1d851b | ||
|
|
6fb80fdeb7 | ||
|
|
e94cf9bcb7 | ||
|
|
da0ec6dd4b | ||
|
|
80efed693e | ||
|
|
653f475e72 | ||
|
|
87e3777e37 | ||
|
|
71f66ea6dc | ||
|
|
0b3f419c80 | ||
|
|
f69af82a49 | ||
|
|
854f542164 | ||
|
|
b9265fccec | ||
|
|
b3a272110a | ||
|
|
316e5324ad | ||
|
|
6843703484 | ||
|
|
115a9a5b3d | ||
|
|
a4838a41ac | ||
|
|
74b9d35c7b | ||
|
|
c973482b2b | ||
|
|
188624440b | ||
|
|
72ec61a043 | ||
|
|
0ac19ebdfb | ||
|
|
bc6ffcc02c | ||
|
|
a9246f7ce4 | ||
|
|
3f5697554a | ||
|
|
5e6c82b68d | ||
|
|
268f8655a1 | ||
|
|
1dfabb3bef | ||
|
|
6617cf6f19 | ||
|
|
81523b0346 | ||
|
|
927be9a7d9 | ||
|
|
ada3d6b3b5 | ||
|
|
30bbd26d0a | ||
|
|
8637c89a6b | ||
|
|
11e5f9c95a | ||
|
|
9bfb3fbea1 | ||
|
|
9c95e34df5 | ||
|
|
ceebda7431 | ||
|
|
75288af88c | ||
|
|
7c67d71f68 | ||
|
|
548dfb363a | ||
|
|
9fec2bd515 | ||
|
|
fc04aa2411 | ||
|
|
c3a5e3ef21 | ||
|
|
0e85431405 | ||
|
|
b3b6d20d96 | ||
|
|
272bbe275e | ||
|
|
496aec211e | ||
|
|
b9b72df9d4 | ||
|
|
fcb1846bf5 | ||
|
|
9f1b2c122a | ||
|
|
6ec38b48ef | ||
|
|
b93e723a83 | ||
|
|
1a47918bdb | ||
|
|
ff9d965726 | ||
|
|
77d2cebe39 | ||
|
|
5d380708e1 | ||
|
|
aa7b36dbd1 | ||
|
|
c9123c3640 | ||
|
|
67199a81f4 | ||
|
|
72ee4a53df | ||
|
|
0b963d1540 | ||
|
|
9cd2584de5 | ||
|
|
3f40c997e5 | ||
|
|
6b93ae9c39 | ||
|
|
f5b3c0556d | ||
|
|
5b3841a038 | ||
|
|
9d00a278e6 | ||
|
|
b470dd5f99 | ||
|
|
7b4a19b943 | ||
|
|
8eceed9aa3 | ||
|
|
4188d69356 | ||
|
|
3fc7c195c3 | ||
|
|
f823b67a4a | ||
|
|
064cab405a | ||
|
|
75ad302d21 | ||
|
|
18a4f17fbf | ||
|
|
6266cd3290 | ||
|
|
8a401ebd68 | ||
|
|
805e97946e | ||
|
|
e878bb47ed | ||
|
|
dae852d9f9 | ||
|
|
8a014a6c2d | ||
|
|
9676eeb1bf | ||
|
|
412f13e1c4 | ||
|
|
11a30806f6 | ||
|
|
b9257bbe93 | ||
|
|
78e81b02fd | ||
|
|
52c23dafd5 | ||
|
|
bc37a2788e | ||
|
|
051c379e4a | ||
|
|
844c853768 | ||
|
|
990d3235c5 | ||
|
|
fd76e9e62b | ||
|
|
a3ff1ae8ee | ||
|
|
17dff82d12 | ||
|
|
9af86c4136 | ||
|
|
aa8a52b845 | ||
|
|
9adc524a42 | ||
|
|
549646d113 | ||
|
|
7ba3c1f244 | ||
|
|
c532c24f79 | ||
|
|
c5ea5c80b1 | ||
|
|
1b1c636107 | ||
|
|
2277ba3630 | ||
|
|
5dcd15e2b9 | ||
|
|
a652deba71 | ||
|
|
1cd1e7d6ec | ||
|
|
16bd1a3bd2 | ||
|
|
b6ee26adc2 | ||
|
|
0d6f469a36 | ||
|
|
338b10695a | ||
|
|
239bd4781b | ||
|
|
97571e4be8 | ||
|
|
c57d14d0d7 | ||
|
|
a0849dd19f | ||
|
|
52aedfed31 | ||
|
|
fade9d7b7c | ||
|
|
a8ccbfa407 | ||
|
|
f9f064dd71 | ||
|
|
fac5661280 | ||
|
|
df85c8bee0 | ||
|
|
e0a442263e | ||
|
|
2c9ceb8645 | ||
|
|
b31c5f1f3d | ||
|
|
c14352e7c1 | ||
|
|
f0584ff0c5 | ||
|
|
4a0c176327 | ||
|
|
94a6f5e2f1 | ||
|
|
842cef2675 | ||
|
|
ca64286117 | ||
|
|
5dc935f650 | ||
|
|
ad49745b18 | ||
|
|
938afb7357 | ||
|
|
0edc1b4499 | ||
|
|
d0fc4ace07 | ||
|
|
70a7a7b352 | ||
|
|
b93d2fbd48 | ||
|
|
635b96a2ae | ||
|
|
72fc9cd79a | ||
|
|
268c49af3b | ||
|
|
025bedfb65 | ||
|
|
df97d17844 | ||
|
|
2bf1a51627 | ||
|
|
a4de5c5560 | ||
|
|
0716020ab4 | ||
|
|
7f5e393cfb | ||
|
|
f4c0d38ba4 | ||
|
|
411e4002f1 | ||
|
|
3fd20fad16 | ||
|
|
889d9bff5b | ||
|
|
68b93f6fa9 | ||
|
|
abc8468989 | ||
|
|
5dc8c616e9 | ||
|
|
70e614b561 | ||
|
|
9e27d0b224 | ||
|
|
6420381354 | ||
|
|
0317c3ebeb | ||
|
|
0be013bca2 | ||
|
|
c27c0713f2 | ||
|
|
c07242cd5f | ||
|
|
65d1454c8c | ||
|
|
4c65bde599 | ||
|
|
5c9b383af8 | ||
|
|
f983a6ff85 | ||
|
|
3a5cd2118a | ||
|
|
1fb78aa873 | ||
|
|
c3e96cfa67 | ||
|
|
a1225545e4 | ||
|
|
94b1fc85fc | ||
|
|
8c3a00d7b5 | ||
|
|
e04b5c7900 | ||
|
|
180ed31fc4 | ||
|
|
9c530dcc58 | ||
|
|
86c23c6269 | ||
|
|
0bd5dc57fa | ||
|
|
5041f5076a | ||
|
|
823028c6aa | ||
|
|
fffc84374a | ||
|
|
14a80f1753 | ||
|
|
932ec71ad8 | ||
|
|
f2a352c305 | ||
|
|
0eea083f07 | ||
|
|
f110ad8ec7 | ||
|
|
d8dc37b788 | ||
|
|
0105ee1de7 | ||
|
|
40727028d6 | ||
|
|
a8383d14d0 | ||
|
|
1566782173 | ||
|
|
0d50bf8ac0 | ||
|
|
195b34c0ca | ||
|
|
ac80242545 | ||
|
|
2a1bc4c43b | ||
|
|
34891e746e | ||
|
|
158dac5309 | ||
|
|
5ab1751f9b | ||
|
|
d29bdd1438 | ||
|
|
3d9e3c2efc | ||
|
|
4debaaaf85 | ||
|
|
6c587ff8c4 | ||
|
|
a566ea64be | ||
|
|
45f269835b | ||
|
|
4ce04ecf2b | ||
|
|
69dca97333 | ||
|
|
f2f5de707c | ||
|
|
d2d2467101 | ||
|
|
9c958d0d22 | ||
|
|
21f316577f | ||
|
|
afb5abd635 |
146
.clang-format
Normal file
@@ -0,0 +1,146 @@
|
|||||||
|
---
|
||||||
|
AccessModifierOffset: -4
|
||||||
|
AlignAfterOpenBracket: Align
|
||||||
|
AlignConsecutiveMacros: None
|
||||||
|
AlignConsecutiveAssignments: None
|
||||||
|
AlignConsecutiveDeclarations: None
|
||||||
|
AlignEscapedNewlines: Right
|
||||||
|
AlignOperands: Align
|
||||||
|
AlignTrailingComments: true
|
||||||
|
|
||||||
|
AllowAllArgumentsOnNextLine: true
|
||||||
|
AllowAllParametersOfDeclarationOnNextLine: true
|
||||||
|
AllowShortBlocksOnASingleLine: Never
|
||||||
|
AllowShortCaseLabelsOnASingleLine: true
|
||||||
|
AllowShortFunctionsOnASingleLine: InlineOnly
|
||||||
|
AllowShortIfStatementsOnASingleLine: Never
|
||||||
|
AllowShortLambdasOnASingleLine: Inline
|
||||||
|
AllowShortLoopsOnASingleLine: false
|
||||||
|
|
||||||
|
AlwaysBreakAfterReturnType: None
|
||||||
|
AlwaysBreakBeforeMultilineStrings: false
|
||||||
|
AlwaysBreakTemplateDeclarations: Yes
|
||||||
|
|
||||||
|
BinPackArguments: true
|
||||||
|
BinPackParameters: true
|
||||||
|
|
||||||
|
BraceWrapping:
|
||||||
|
AfterCaseLabel: true
|
||||||
|
AfterClass: true
|
||||||
|
AfterControlStatement: Always
|
||||||
|
AfterEnum: true
|
||||||
|
AfterFunction: true
|
||||||
|
AfterNamespace: true
|
||||||
|
AfterStruct: true
|
||||||
|
AfterUnion: true
|
||||||
|
AfterExternBlock: true
|
||||||
|
BeforeCatch: true
|
||||||
|
BeforeElse: true
|
||||||
|
BeforeLambdaBody: false
|
||||||
|
IndentBraces: false
|
||||||
|
SplitEmptyFunction: false
|
||||||
|
SplitEmptyRecord: false
|
||||||
|
SplitEmptyNamespace: false
|
||||||
|
|
||||||
|
BreakBeforeBinaryOperators: NonAssignment
|
||||||
|
BreakBeforeBraces: Custom
|
||||||
|
BreakBeforeTernaryOperators: false
|
||||||
|
BreakConstructorInitializers: BeforeColon
|
||||||
|
BreakInheritanceList: AfterColon
|
||||||
|
BreakStringLiterals: true
|
||||||
|
|
||||||
|
ColumnLimit: 82
|
||||||
|
CommentPragmas: '^(!.*|@c)'
|
||||||
|
|
||||||
|
CompactNamespaces: false
|
||||||
|
|
||||||
|
ConstructorInitializerAllOnOneLineOrOnePerLine: true
|
||||||
|
ContinuationIndentWidth: 4
|
||||||
|
Cpp11BracedListStyle: true
|
||||||
|
|
||||||
|
FixNamespaceComments: true
|
||||||
|
|
||||||
|
IncludeBlocks: Regroup
|
||||||
|
IncludeCategories:
|
||||||
|
- Regex: '^<windows(\.h)?>' # windows headers
|
||||||
|
Priority: -1
|
||||||
|
- Regex: '^<labbcan[[:alnum:]._/]+' # labbcan headers
|
||||||
|
Priority: 1
|
||||||
|
- Regex: '^<diag[[:alnum:]._/]+' # usl headers
|
||||||
|
Priority: 1
|
||||||
|
- Regex: '^<usl[[:alnum:]._/]+' # usl headers
|
||||||
|
Priority: 1
|
||||||
|
- Regex: '^<qt5compat[[:alnum:]._/]+' # qtlabb headers
|
||||||
|
Priority: 2
|
||||||
|
- Regex: '^<qtcoreaddons[[:alnum:]._/]+' # qtlabb headers
|
||||||
|
Priority: 2
|
||||||
|
- Regex: '^<qtlabb[[:alnum:]._/]+' # qtlabb headers
|
||||||
|
Priority: 2
|
||||||
|
- Regex: '<Q[[:alnum:].]+>' # Qt headers
|
||||||
|
Priority: 3
|
||||||
|
- Regex: '^<sila_cpp[[:alnum:]._/]+' # sila_cpp headers
|
||||||
|
Priority: 4
|
||||||
|
- Regex: '<[[:alnum:]._/]+\.h>' # other headers
|
||||||
|
Priority: 5
|
||||||
|
- Regex: '<[[:alnum:]._/]+>' # system headers
|
||||||
|
Priority: 6
|
||||||
|
- Regex: '.*'
|
||||||
|
Priority: 7
|
||||||
|
|
||||||
|
IncludeIsMainRegex: '(_p)?$'
|
||||||
|
|
||||||
|
IndentCaseBlocks: false
|
||||||
|
IndentCaseLabels: false
|
||||||
|
IndentPPDirectives: AfterHash
|
||||||
|
IndentWidth: 4
|
||||||
|
IndentWrappedFunctionNames: false
|
||||||
|
|
||||||
|
KeepEmptyLinesAtTheStartOfBlocks: false
|
||||||
|
MaxEmptyLinesToKeep: 1
|
||||||
|
|
||||||
|
NamespaceIndentation: None
|
||||||
|
|
||||||
|
PenaltyBreakAssignment: 20
|
||||||
|
PenaltyBreakBeforeFirstCallParameter: 15
|
||||||
|
PenaltyBreakComment: 10
|
||||||
|
PenaltyBreakFirstLessLess: 5
|
||||||
|
# PenaltyBreakOpenParenthesis: 30
|
||||||
|
PenaltyBreakString: 150
|
||||||
|
PenaltyBreakTemplateDeclaration: 10
|
||||||
|
PenaltyExcessCharacter: 100
|
||||||
|
PenaltyIndentedWhitespace: 0
|
||||||
|
PenaltyReturnTypeOnItsOwnLine: 150
|
||||||
|
|
||||||
|
PointerAlignment: Left
|
||||||
|
ReflowComments: true
|
||||||
|
|
||||||
|
SortIncludes: CaseSensitive
|
||||||
|
SortUsingDeclarations: true
|
||||||
|
|
||||||
|
SpaceAfterCStyleCast: false
|
||||||
|
SpaceAfterLogicalNot: false
|
||||||
|
SpaceAfterTemplateKeyword: false
|
||||||
|
|
||||||
|
SpaceBeforeAssignmentOperators: true
|
||||||
|
SpaceBeforeCpp11BracedList: false
|
||||||
|
SpaceBeforeCtorInitializerColon: true
|
||||||
|
SpaceBeforeInheritanceColon: true
|
||||||
|
SpaceBeforeParens: ControlStatements
|
||||||
|
SpaceBeforeRangeBasedForLoopColon: true
|
||||||
|
SpaceBeforeSquareBrackets: false
|
||||||
|
SpaceInEmptyBlock: false
|
||||||
|
SpaceInEmptyParentheses: false
|
||||||
|
|
||||||
|
SpacesBeforeTrailingComments: 2
|
||||||
|
SpacesInAngles: Never
|
||||||
|
SpacesInCStyleCastParentheses: false
|
||||||
|
SpacesInConditionalStatement: false
|
||||||
|
SpacesInParentheses: false
|
||||||
|
SpacesInSquareBrackets: false
|
||||||
|
|
||||||
|
Standard: c++17
|
||||||
|
|
||||||
|
StatementMacros: [ 'Q_UNUSED', 'PIMPL_D', 'PIMPL_Q', 'OD_ENTRY', 'OD_ENTRY_PROCIMG' ]
|
||||||
|
|
||||||
|
TabWidth: 4
|
||||||
|
UseTab: Never
|
||||||
1
.gitattributes
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
PyQtAds/_version.py export-subst
|
||||||
84
.github/workflows/linux-builds.yml
vendored
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
name: linux-builds
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build_ubuntu_2204_cmake:
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
|
||||||
|
env:
|
||||||
|
QT_VERSION: 6.4.2
|
||||||
|
QT_DIR: ${{ github.workspace }}/Qt
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout source
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0 # Fetch full history and tags
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y build-essential cmake ninja-build libgl1-mesa-dev libxkbcommon-x11-0 libx11-dev
|
||||||
|
|
||||||
|
- name: Install Qt
|
||||||
|
uses: jurplel/install-qt-action@v3
|
||||||
|
with:
|
||||||
|
version: ${{ env.QT_VERSION }}
|
||||||
|
target: desktop
|
||||||
|
host: linux
|
||||||
|
arch: gcc_64
|
||||||
|
dir: ${{ env.QT_DIR }}
|
||||||
|
setup-python: false
|
||||||
|
|
||||||
|
- name: Configure with CMake
|
||||||
|
run: |
|
||||||
|
cmake -S . -B build \
|
||||||
|
-DCMAKE_PREFIX_PATH="${{ env.QT_DIR }}/Qt/${{ env.QT_VERSION }}/gcc_64" \
|
||||||
|
-DCMAKE_INSTALL_PREFIX=${{ github.workspace }}/install \
|
||||||
|
-DCMAKE_BUILD_TYPE=Release \
|
||||||
|
-G Ninja
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
run: cmake --build build
|
||||||
|
|
||||||
|
- name: Run CMake install (optional)
|
||||||
|
run: cmake --install build
|
||||||
|
|
||||||
|
build_ubuntu_2204:
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- name: Cache Qt
|
||||||
|
id: cache-qt-6-4
|
||||||
|
uses: actions/cache@v3
|
||||||
|
with:
|
||||||
|
path: ../Qt/6.4.2
|
||||||
|
key: ${{ runner.os }}-QtCache-Qt6-4
|
||||||
|
|
||||||
|
- name: Install Qt
|
||||||
|
uses: jurplel/install-qt-action@v2
|
||||||
|
with:
|
||||||
|
version: '6.4.2'
|
||||||
|
host: 'linux'
|
||||||
|
target: 'desktop'
|
||||||
|
install-deps: true
|
||||||
|
cached: ${{ steps.cache-qt-6-4.outputs.cache-hit }}
|
||||||
|
setup-python: true
|
||||||
|
tools: ''
|
||||||
|
tools-only: false
|
||||||
|
|
||||||
|
- name: Install needed xkbcommon symlink
|
||||||
|
run: sudo apt-get install libxkbcommon-dev -y
|
||||||
|
|
||||||
|
- name: Ubuntu and Qt version
|
||||||
|
run: |
|
||||||
|
cat /etc/issue
|
||||||
|
echo number of processors: $(nproc)
|
||||||
|
qmake -v
|
||||||
|
- name: qmake
|
||||||
|
run: qmake
|
||||||
|
- name: make
|
||||||
|
run: make -j$(nproc)
|
||||||
102
.github/workflows/windows-cmake.yml
vendored
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
name: windows-builds
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build_windows_msvc:
|
||||||
|
name: Build with MSVC and Ninja
|
||||||
|
runs-on: windows-2022
|
||||||
|
|
||||||
|
env:
|
||||||
|
QT_VERSION: 6.4.2
|
||||||
|
QT_DIR: ${{ github.workspace }}\Qt
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: 📦 Checkout source code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: ⚙️ Install Ninja build system
|
||||||
|
run: choco install ninja --no-progress
|
||||||
|
|
||||||
|
- name: 📥 Install Qt for MSVC
|
||||||
|
uses: jurplel/install-qt-action@v3
|
||||||
|
with:
|
||||||
|
version: ${{ env.QT_VERSION }}
|
||||||
|
target: desktop
|
||||||
|
host: windows
|
||||||
|
arch: win64_msvc2019_64
|
||||||
|
dir: ${{ env.QT_DIR }}
|
||||||
|
setup-python: false
|
||||||
|
|
||||||
|
- name: 🏗️ Setup MSVC Developer Environment
|
||||||
|
uses: TheMrMilchmann/setup-msvc-dev@v3
|
||||||
|
with:
|
||||||
|
arch: x64
|
||||||
|
|
||||||
|
- name: 🛠️ Configure CMake with Ninja + MSVC
|
||||||
|
run: |
|
||||||
|
cmake -S . -B build -G Ninja `
|
||||||
|
-DCMAKE_PREFIX_PATH="${{ env.QT_DIR }}\Qt\${{ env.QT_VERSION }}\msvc2019_64" `
|
||||||
|
-DCMAKE_INSTALL_PREFIX="${{ github.workspace }}\install" `
|
||||||
|
-DCMAKE_BUILD_TYPE=Release
|
||||||
|
shell: powershell
|
||||||
|
|
||||||
|
- name: 🔨 Build with Ninja + MSVC
|
||||||
|
run: cmake --build build
|
||||||
|
shell: powershell
|
||||||
|
|
||||||
|
- name: 📦 Install built files
|
||||||
|
run: cmake --install build
|
||||||
|
shell: powershell
|
||||||
|
|
||||||
|
build_windows_mingw:
|
||||||
|
name: Build with Qt's MinGW and CMake (no Ninja)
|
||||||
|
runs-on: windows-2022
|
||||||
|
|
||||||
|
env:
|
||||||
|
QT_VERSION: 6.8.3
|
||||||
|
QT_DIR: ${{ github.workspace }}\Qt
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: 📦 Checkout source code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: 📥 Install Qt + MinGW
|
||||||
|
uses: jurplel/install-qt-action@v4
|
||||||
|
with:
|
||||||
|
aqtversion: '==3.1.19'
|
||||||
|
version: ${{ env.QT_VERSION }}
|
||||||
|
target: desktop
|
||||||
|
host: windows
|
||||||
|
arch: win64_mingw
|
||||||
|
dir: ${{ env.QT_DIR }}
|
||||||
|
tools: 'tools_mingw1310'
|
||||||
|
setup-python: false
|
||||||
|
|
||||||
|
- name: ➕ Add Qt-bundled MinGW to PATH
|
||||||
|
shell: powershell
|
||||||
|
run: |
|
||||||
|
echo "${{ env.QT_DIR }}\Tools\mingw1310_64\bin" >> $env:GITHUB_PATH
|
||||||
|
|
||||||
|
- name: 🛠️ Configure CMake (MinGW)
|
||||||
|
shell: powershell
|
||||||
|
run: |
|
||||||
|
cmake -S . -B build-mingw `
|
||||||
|
-DCMAKE_PREFIX_PATH="${{ env.QT_DIR }}\Qt\${{ env.QT_VERSION }}\mingw_64" `
|
||||||
|
-DCMAKE_INSTALL_PREFIX=${{ github.workspace }}\install `
|
||||||
|
-DCMAKE_BUILD_TYPE=Release `
|
||||||
|
-G "MinGW Makefiles"
|
||||||
|
|
||||||
|
- name: 🔨 Build with CMake (MinGW)
|
||||||
|
shell: powershell
|
||||||
|
run: cmake --build build-mingw -- -j2
|
||||||
|
|
||||||
|
- name: 📦 Install built files (MinGW)
|
||||||
|
shell: powershell
|
||||||
|
run: cmake --install build-mingw
|
||||||
390
.gitignore
vendored
@@ -1 +1,389 @@
|
|||||||
*.pro.user
|
*.pro.user*
|
||||||
|
/build
|
||||||
|
*.o
|
||||||
|
*.dylib
|
||||||
|
*.app
|
||||||
|
qrc_*
|
||||||
|
moc_*
|
||||||
|
ui_*
|
||||||
|
Makefile
|
||||||
|
*.dll
|
||||||
|
*.a
|
||||||
|
build*
|
||||||
|
|
||||||
|
# IDEs
|
||||||
|
.idea
|
||||||
|
|
||||||
|
# Python
|
||||||
|
.eggs
|
||||||
|
*.pyc
|
||||||
|
*.pyd
|
||||||
|
__pycache__
|
||||||
|
PyQtAds/rc.py
|
||||||
|
/.cproject
|
||||||
|
|
||||||
|
|
||||||
|
## Ignore Visual Studio temporary files, build results, and
|
||||||
|
## files generated by popular Visual Studio add-ons.
|
||||||
|
##
|
||||||
|
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
|
||||||
|
|
||||||
|
# User-specific files
|
||||||
|
*.rsuser
|
||||||
|
*.suo
|
||||||
|
*.user
|
||||||
|
*.userosscache
|
||||||
|
*.sln.docstates
|
||||||
|
|
||||||
|
# User-specific files (MonoDevelop/Xamarin Studio)
|
||||||
|
*.userprefs
|
||||||
|
|
||||||
|
# Mono auto generated files
|
||||||
|
mono_crash.*
|
||||||
|
|
||||||
|
# Build results
|
||||||
|
[Dd]ebug/
|
||||||
|
[Dd]ebugPublic/
|
||||||
|
[Rr]elease/
|
||||||
|
[Rr]eleases/
|
||||||
|
x64/
|
||||||
|
x86/
|
||||||
|
[Ww][Ii][Nn]32/
|
||||||
|
[Aa][Rr][Mm]/
|
||||||
|
[Aa][Rr][Mm]64/
|
||||||
|
bld/
|
||||||
|
[Bb]in/
|
||||||
|
[Oo]bj/
|
||||||
|
[Ll]og/
|
||||||
|
[Ll]ogs/
|
||||||
|
|
||||||
|
# Visual Studio 2015/2017 cache/options directory
|
||||||
|
.vs/
|
||||||
|
# Uncomment if you have tasks that create the project's static files in wwwroot
|
||||||
|
#wwwroot/
|
||||||
|
|
||||||
|
# Visual Studio 2017 auto generated files
|
||||||
|
Generated\ Files/
|
||||||
|
|
||||||
|
# MSTest test Results
|
||||||
|
[Tt]est[Rr]esult*/
|
||||||
|
[Bb]uild[Ll]og.*
|
||||||
|
|
||||||
|
# NUnit
|
||||||
|
*.VisualState.xml
|
||||||
|
TestResult.xml
|
||||||
|
nunit-*.xml
|
||||||
|
|
||||||
|
# Build Results of an ATL Project
|
||||||
|
[Dd]ebugPS/
|
||||||
|
[Rr]eleasePS/
|
||||||
|
dlldata.c
|
||||||
|
|
||||||
|
# Benchmark Results
|
||||||
|
BenchmarkDotNet.Artifacts/
|
||||||
|
|
||||||
|
# .NET Core
|
||||||
|
project.lock.json
|
||||||
|
project.fragment.lock.json
|
||||||
|
artifacts/
|
||||||
|
|
||||||
|
# ASP.NET Scaffolding
|
||||||
|
ScaffoldingReadMe.txt
|
||||||
|
|
||||||
|
# StyleCop
|
||||||
|
StyleCopReport.xml
|
||||||
|
|
||||||
|
# Files built by Visual Studio
|
||||||
|
*_i.c
|
||||||
|
*_p.c
|
||||||
|
*_h.h
|
||||||
|
*.ilk
|
||||||
|
*.meta
|
||||||
|
*.obj
|
||||||
|
*.iobj
|
||||||
|
*.pch
|
||||||
|
*.pdb
|
||||||
|
*.ipdb
|
||||||
|
*.pgc
|
||||||
|
*.pgd
|
||||||
|
*.rsp
|
||||||
|
*.sbr
|
||||||
|
*.tlb
|
||||||
|
*.tli
|
||||||
|
*.tlh
|
||||||
|
*.tmp
|
||||||
|
*.tmp_proj
|
||||||
|
*_wpftmp.csproj
|
||||||
|
*.log
|
||||||
|
*.vspscc
|
||||||
|
*.vssscc
|
||||||
|
.builds
|
||||||
|
*.pidb
|
||||||
|
*.svclog
|
||||||
|
*.scc
|
||||||
|
|
||||||
|
# Chutzpah Test files
|
||||||
|
_Chutzpah*
|
||||||
|
|
||||||
|
# Visual C++ cache files
|
||||||
|
ipch/
|
||||||
|
*.aps
|
||||||
|
*.ncb
|
||||||
|
*.opendb
|
||||||
|
*.opensdf
|
||||||
|
*.sdf
|
||||||
|
*.cachefile
|
||||||
|
*.VC.db
|
||||||
|
*.VC.VC.opendb
|
||||||
|
|
||||||
|
# Visual Studio profiler
|
||||||
|
*.psess
|
||||||
|
*.vsp
|
||||||
|
*.vspx
|
||||||
|
*.sap
|
||||||
|
|
||||||
|
# Visual Studio Trace Files
|
||||||
|
*.e2e
|
||||||
|
|
||||||
|
# TFS 2012 Local Workspace
|
||||||
|
$tf/
|
||||||
|
|
||||||
|
# Guidance Automation Toolkit
|
||||||
|
*.gpState
|
||||||
|
|
||||||
|
# ReSharper is a .NET coding add-in
|
||||||
|
_ReSharper*/
|
||||||
|
*.[Rr]e[Ss]harper
|
||||||
|
*.DotSettings.user
|
||||||
|
|
||||||
|
# TeamCity is a build add-in
|
||||||
|
_TeamCity*
|
||||||
|
|
||||||
|
# DotCover is a Code Coverage Tool
|
||||||
|
*.dotCover
|
||||||
|
|
||||||
|
# AxoCover is a Code Coverage Tool
|
||||||
|
.axoCover/*
|
||||||
|
!.axoCover/settings.json
|
||||||
|
|
||||||
|
# Coverlet is a free, cross platform Code Coverage Tool
|
||||||
|
coverage*[.json, .xml, .info]
|
||||||
|
|
||||||
|
# Visual Studio code coverage results
|
||||||
|
*.coverage
|
||||||
|
*.coveragexml
|
||||||
|
|
||||||
|
# NCrunch
|
||||||
|
_NCrunch_*
|
||||||
|
.*crunch*.local.xml
|
||||||
|
nCrunchTemp_*
|
||||||
|
|
||||||
|
# MightyMoose
|
||||||
|
*.mm.*
|
||||||
|
AutoTest.Net/
|
||||||
|
|
||||||
|
# Web workbench (sass)
|
||||||
|
.sass-cache/
|
||||||
|
|
||||||
|
# Installshield output folder
|
||||||
|
[Ee]xpress/
|
||||||
|
|
||||||
|
# DocProject is a documentation generator add-in
|
||||||
|
DocProject/buildhelp/
|
||||||
|
DocProject/Help/*.HxT
|
||||||
|
DocProject/Help/*.HxC
|
||||||
|
DocProject/Help/*.hhc
|
||||||
|
DocProject/Help/*.hhk
|
||||||
|
DocProject/Help/*.hhp
|
||||||
|
DocProject/Help/Html2
|
||||||
|
DocProject/Help/html
|
||||||
|
|
||||||
|
# Click-Once directory
|
||||||
|
publish/
|
||||||
|
|
||||||
|
# Publish Web Output
|
||||||
|
*.[Pp]ublish.xml
|
||||||
|
*.azurePubxml
|
||||||
|
# Note: Comment the next line if you want to checkin your web deploy settings,
|
||||||
|
# but database connection strings (with potential passwords) will be unencrypted
|
||||||
|
*.pubxml
|
||||||
|
*.publishproj
|
||||||
|
|
||||||
|
# Microsoft Azure Web App publish settings. Comment the next line if you want to
|
||||||
|
# checkin your Azure Web App publish settings, but sensitive information contained
|
||||||
|
# in these scripts will be unencrypted
|
||||||
|
PublishScripts/
|
||||||
|
|
||||||
|
# NuGet Packages
|
||||||
|
*.nupkg
|
||||||
|
# NuGet Symbol Packages
|
||||||
|
*.snupkg
|
||||||
|
# The packages folder can be ignored because of Package Restore
|
||||||
|
**/[Pp]ackages/*
|
||||||
|
# except build/, which is used as an MSBuild target.
|
||||||
|
!**/[Pp]ackages/build/
|
||||||
|
# Uncomment if necessary however generally it will be regenerated when needed
|
||||||
|
#!**/[Pp]ackages/repositories.config
|
||||||
|
# NuGet v3's project.json files produces more ignorable files
|
||||||
|
*.nuget.props
|
||||||
|
*.nuget.targets
|
||||||
|
|
||||||
|
# Microsoft Azure Build Output
|
||||||
|
csx/
|
||||||
|
*.build.csdef
|
||||||
|
|
||||||
|
# Microsoft Azure Emulator
|
||||||
|
ecf/
|
||||||
|
rcf/
|
||||||
|
|
||||||
|
# Windows Store app package directories and files
|
||||||
|
AppPackages/
|
||||||
|
BundleArtifacts/
|
||||||
|
Package.StoreAssociation.xml
|
||||||
|
_pkginfo.txt
|
||||||
|
*.appx
|
||||||
|
*.appxbundle
|
||||||
|
*.appxupload
|
||||||
|
|
||||||
|
# Visual Studio cache files
|
||||||
|
# files ending in .cache can be ignored
|
||||||
|
*.[Cc]ache
|
||||||
|
# but keep track of directories ending in .cache
|
||||||
|
!?*.[Cc]ache/
|
||||||
|
|
||||||
|
# Others
|
||||||
|
ClientBin/
|
||||||
|
~$*
|
||||||
|
*~
|
||||||
|
*.dbmdl
|
||||||
|
*.dbproj.schemaview
|
||||||
|
*.jfm
|
||||||
|
*.pfx
|
||||||
|
*.publishsettings
|
||||||
|
orleans.codegen.cs
|
||||||
|
|
||||||
|
# Including strong name files can present a security risk
|
||||||
|
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
|
||||||
|
#*.snk
|
||||||
|
|
||||||
|
# Since there are multiple workflows, uncomment next line to ignore bower_components
|
||||||
|
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
|
||||||
|
#bower_components/
|
||||||
|
|
||||||
|
# RIA/Silverlight projects
|
||||||
|
Generated_Code/
|
||||||
|
|
||||||
|
# Backup & report files from converting an old project file
|
||||||
|
# to a newer Visual Studio version. Backup files are not needed,
|
||||||
|
# because we have git ;-)
|
||||||
|
_UpgradeReport_Files/
|
||||||
|
Backup*/
|
||||||
|
UpgradeLog*.XML
|
||||||
|
UpgradeLog*.htm
|
||||||
|
ServiceFabricBackup/
|
||||||
|
*.rptproj.bak
|
||||||
|
|
||||||
|
# SQL Server files
|
||||||
|
*.mdf
|
||||||
|
*.ldf
|
||||||
|
*.ndf
|
||||||
|
|
||||||
|
# Business Intelligence projects
|
||||||
|
*.rdl.data
|
||||||
|
*.bim.layout
|
||||||
|
*.bim_*.settings
|
||||||
|
*.rptproj.rsuser
|
||||||
|
*- [Bb]ackup.rdl
|
||||||
|
*- [Bb]ackup ([0-9]).rdl
|
||||||
|
*- [Bb]ackup ([0-9][0-9]).rdl
|
||||||
|
|
||||||
|
# Microsoft Fakes
|
||||||
|
FakesAssemblies/
|
||||||
|
|
||||||
|
# GhostDoc plugin setting file
|
||||||
|
*.GhostDoc.xml
|
||||||
|
|
||||||
|
# Node.js Tools for Visual Studio
|
||||||
|
.ntvs_analysis.dat
|
||||||
|
node_modules/
|
||||||
|
|
||||||
|
# Visual Studio 6 build log
|
||||||
|
*.plg
|
||||||
|
|
||||||
|
# Visual Studio 6 workspace options file
|
||||||
|
*.opt
|
||||||
|
|
||||||
|
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
|
||||||
|
*.vbw
|
||||||
|
|
||||||
|
# Visual Studio LightSwitch build output
|
||||||
|
**/*.HTMLClient/GeneratedArtifacts
|
||||||
|
**/*.DesktopClient/GeneratedArtifacts
|
||||||
|
**/*.DesktopClient/ModelManifest.xml
|
||||||
|
**/*.Server/GeneratedArtifacts
|
||||||
|
**/*.Server/ModelManifest.xml
|
||||||
|
_Pvt_Extensions
|
||||||
|
|
||||||
|
# Paket dependency manager
|
||||||
|
.paket/paket.exe
|
||||||
|
paket-files/
|
||||||
|
|
||||||
|
# FAKE - F# Make
|
||||||
|
.fake/
|
||||||
|
|
||||||
|
# CodeRush personal settings
|
||||||
|
.cr/personal
|
||||||
|
|
||||||
|
# Python Tools for Visual Studio (PTVS)
|
||||||
|
__pycache__/
|
||||||
|
*.pyc
|
||||||
|
|
||||||
|
# Cake - Uncomment if you are using it
|
||||||
|
# tools/**
|
||||||
|
# !tools/packages.config
|
||||||
|
|
||||||
|
# Tabs Studio
|
||||||
|
*.tss
|
||||||
|
|
||||||
|
# Telerik's JustMock configuration file
|
||||||
|
*.jmconfig
|
||||||
|
|
||||||
|
# BizTalk build output
|
||||||
|
*.btp.cs
|
||||||
|
*.btm.cs
|
||||||
|
*.odx.cs
|
||||||
|
*.xsd.cs
|
||||||
|
|
||||||
|
# OpenCover UI analysis results
|
||||||
|
OpenCover/
|
||||||
|
|
||||||
|
# Azure Stream Analytics local run output
|
||||||
|
ASALocalRun/
|
||||||
|
|
||||||
|
# MSBuild Binary and Structured Log
|
||||||
|
*.binlog
|
||||||
|
|
||||||
|
# NVidia Nsight GPU debugger configuration file
|
||||||
|
*.nvuser
|
||||||
|
|
||||||
|
# MFractors (Xamarin productivity tool) working folder
|
||||||
|
.mfractor/
|
||||||
|
|
||||||
|
# Local History for Visual Studio
|
||||||
|
.localhistory/
|
||||||
|
|
||||||
|
# BeatPulse healthcheck temp database
|
||||||
|
healthchecksdb
|
||||||
|
|
||||||
|
# Backup folder for Package Reference Convert tool in Visual Studio 2017
|
||||||
|
MigrationBackup/
|
||||||
|
|
||||||
|
# Ionide (cross platform F# VS Code tools) working folder
|
||||||
|
.ionide/
|
||||||
|
|
||||||
|
# Fody - auto-generated XML schema
|
||||||
|
FodyWeavers.xsd
|
||||||
|
/ build
|
||||||
|
/Settings.ini
|
||||||
|
.vscode/settings.json
|
||||||
|
/.settings
|
||||||
|
|||||||
27
.project
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<projectDescription>
|
||||||
|
<name>QtAdvancedDockingSystem</name>
|
||||||
|
<comment></comment>
|
||||||
|
<projects>
|
||||||
|
</projects>
|
||||||
|
<buildSpec>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
|
||||||
|
<triggers>clean,full,incremental,</triggers>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
<buildCommand>
|
||||||
|
<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
|
||||||
|
<triggers>full,incremental,</triggers>
|
||||||
|
<arguments>
|
||||||
|
</arguments>
|
||||||
|
</buildCommand>
|
||||||
|
</buildSpec>
|
||||||
|
<natures>
|
||||||
|
<nature>org.eclipse.cdt.core.cnature</nature>
|
||||||
|
<nature>org.eclipse.cdt.core.ccnature</nature>
|
||||||
|
<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
|
||||||
|
<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
|
||||||
|
</natures>
|
||||||
|
</projectDescription>
|
||||||
16
.travis.yml
@@ -1,16 +0,0 @@
|
|||||||
# Build with Qt5
|
|
||||||
language:
|
|
||||||
- cpp
|
|
||||||
|
|
||||||
compiler:
|
|
||||||
- g++
|
|
||||||
|
|
||||||
before_install:
|
|
||||||
- sudo add-apt-repository --yes ppa:ubuntu-sdk-team/ppa
|
|
||||||
- sudo apt-get update -qq
|
|
||||||
- sudo apt-get install -qq qtbase5-dev qtdeclarative5-dev libqt5webkit5-dev libsqlite3-dev
|
|
||||||
- sudo apt-get install -qq qt5-default qttools5-dev-tools
|
|
||||||
|
|
||||||
script:
|
|
||||||
- qmake -qt=qt5 -r build.pro
|
|
||||||
- make
|
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
TARGET = AdvancedDockingSystem
|
|
||||||
#VERSION = 0.1.0
|
|
||||||
CONFIG += adsBuildShared
|
|
||||||
|
|
||||||
QT += core gui
|
|
||||||
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
|
|
||||||
|
|
||||||
TEMPLATE = lib
|
|
||||||
|
|
||||||
adsBuildShared {
|
|
||||||
CONFIG += shared
|
|
||||||
DEFINES += ADS_EXPORT
|
|
||||||
}
|
|
||||||
!adsBuildShared {
|
|
||||||
CONFIG += staticlib
|
|
||||||
}
|
|
||||||
|
|
||||||
INCLUDEPATH += $$PWD/src
|
|
||||||
INCLUDEPATH += $$PWD/include
|
|
||||||
|
|
||||||
greaterThan(QT_MAJOR_VERSION, 4): DEFINES += ADS_NAMESPACE_ENABLED
|
|
||||||
|
|
||||||
windows {
|
|
||||||
# MinGW
|
|
||||||
*-g++* {
|
|
||||||
QMAKE_CXXFLAGS += -std=c++11
|
|
||||||
QMAKE_CXXFLAGS += -Wall -Wextra -pedantic
|
|
||||||
}
|
|
||||||
# MSVC
|
|
||||||
*-msvc* {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SOURCES += \
|
|
||||||
src/API.cpp \
|
|
||||||
src/ContainerWidget.cpp \
|
|
||||||
src/SectionWidget.cpp \
|
|
||||||
src/SectionContent.cpp \
|
|
||||||
src/SectionTitleWidget.cpp \
|
|
||||||
src/SectionContentWidget.cpp \
|
|
||||||
src/DropOverlay.cpp \
|
|
||||||
src/FloatingWidget.cpp \
|
|
||||||
src/Internal.cpp
|
|
||||||
|
|
||||||
HEADERS += \
|
|
||||||
include/ads/API.h \
|
|
||||||
include/ads/ContainerWidget.h \
|
|
||||||
include/ads/SectionWidget.h \
|
|
||||||
include/ads/SectionContent.h \
|
|
||||||
include/ads/SectionTitleWidget.h \
|
|
||||||
include/ads/SectionContentWidget.h \
|
|
||||||
include/ads/DropOverlay.h \
|
|
||||||
include/ads/FloatingWidget.h \
|
|
||||||
include/ads/Internal.h
|
|
||||||
|
|
||||||
RESOURCES += \
|
|
||||||
res/ads.qrc
|
|
||||||
@@ -1,62 +0,0 @@
|
|||||||
#ifndef ADS_API_H
|
|
||||||
#define ADS_API_H
|
|
||||||
|
|
||||||
#include <QFlags>
|
|
||||||
class QWidget;
|
|
||||||
class QSplitter;
|
|
||||||
|
|
||||||
// DLL Export API
|
|
||||||
#ifdef _WIN32
|
|
||||||
#ifdef ADS_EXPORT
|
|
||||||
#define ADS_EXPORT_API __declspec(dllexport)
|
|
||||||
#else
|
|
||||||
#define ADS_EXPORT_API __declspec(dllimport)
|
|
||||||
#endif
|
|
||||||
#else
|
|
||||||
#define ADS_EXPORT_API
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Use namespace
|
|
||||||
// Disabled with Qt4!
|
|
||||||
#ifdef ADS_NAMESPACE_ENABLED
|
|
||||||
#define ADS_NAMESPACE_BEGIN namespace ads {
|
|
||||||
#define ADS_NAMESPACE_END }
|
|
||||||
#define ADS_NS ::ads
|
|
||||||
#else
|
|
||||||
#define ADS_NAMESPACE_BEGIN
|
|
||||||
#define ADS_NAMESPACE_END
|
|
||||||
#define ADS_NS
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Width of the native window frame border (based on OS).
|
|
||||||
#define ADS_WINDOW_FRAME_BORDER_WIDTH 7
|
|
||||||
|
|
||||||
// Indicates whether ADS should include animations.
|
|
||||||
//#define ADS_ANIMATIONS_ENABLED 1
|
|
||||||
//#define ADS_ANIMATION_DURATION 150
|
|
||||||
|
|
||||||
ADS_NAMESPACE_BEGIN
|
|
||||||
class ContainerWidget;
|
|
||||||
class SectionWidget;
|
|
||||||
|
|
||||||
enum DropArea
|
|
||||||
{
|
|
||||||
InvalidDropArea = 0,
|
|
||||||
TopDropArea = 1,
|
|
||||||
RightDropArea = 2,
|
|
||||||
BottomDropArea = 4,
|
|
||||||
LeftDropArea = 8,
|
|
||||||
CenterDropArea = 16,
|
|
||||||
|
|
||||||
AllAreas = TopDropArea | RightDropArea | BottomDropArea | LeftDropArea | CenterDropArea
|
|
||||||
};
|
|
||||||
Q_DECLARE_FLAGS(DropAreas, DropArea)
|
|
||||||
|
|
||||||
void deleteEmptySplitter(ContainerWidget* container);
|
|
||||||
ContainerWidget* findParentContainerWidget(QWidget* w);
|
|
||||||
SectionWidget* findParentSectionWidget(QWidget* w);
|
|
||||||
QSplitter* findParentSplitter(QWidget* w);
|
|
||||||
QSplitter* findImmediateSplitter(QWidget* w);
|
|
||||||
|
|
||||||
ADS_NAMESPACE_END
|
|
||||||
#endif
|
|
||||||
@@ -1,158 +0,0 @@
|
|||||||
#ifndef ADS_CONTAINERWIDGET_H
|
|
||||||
#define ADS_CONTAINERWIDGET_H
|
|
||||||
|
|
||||||
#include <QList>
|
|
||||||
#include <QHash>
|
|
||||||
#include <QPointer>
|
|
||||||
#include <QFrame>
|
|
||||||
class QPoint;
|
|
||||||
class QSplitter;
|
|
||||||
class QMenu;
|
|
||||||
class QGridLayout;
|
|
||||||
|
|
||||||
#include "ads/API.h"
|
|
||||||
#include "ads/Internal.h"
|
|
||||||
#include "ads/SectionContent.h"
|
|
||||||
#include "ads/FloatingWidget.h"
|
|
||||||
|
|
||||||
ADS_NAMESPACE_BEGIN
|
|
||||||
class SectionWidget;
|
|
||||||
class InternalContentData;
|
|
||||||
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* ContainerWidget is the main container to provide the docking
|
|
||||||
* functionality. It manages multiple sections with all possible areas.
|
|
||||||
*/
|
|
||||||
class ADS_EXPORT_API ContainerWidget : public QFrame
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
Q_PROPERTY(Qt::Orientation orientation READ orientation WRITE setOrientation NOTIFY orientationChanged)
|
|
||||||
|
|
||||||
friend class SectionContent;
|
|
||||||
friend class SectionWidget;
|
|
||||||
friend class FloatingWidget;
|
|
||||||
friend class SectionTitleWidget;
|
|
||||||
friend class SectionContentWidget;
|
|
||||||
|
|
||||||
public:
|
|
||||||
explicit ContainerWidget(QWidget *parent = NULL);
|
|
||||||
virtual ~ContainerWidget();
|
|
||||||
|
|
||||||
//
|
|
||||||
// Public API
|
|
||||||
//
|
|
||||||
|
|
||||||
Qt::Orientation orientation() const;
|
|
||||||
void setOrientation(Qt::Orientation orientation);
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* Adds the section-content <em>sc</em> to this container-widget into the section-widget <em>sw</em>.
|
|
||||||
* If <em>sw</em> is not NULL, the <em>area</em> is used to indicate how the content should be arranged.
|
|
||||||
* Returns a pointer to the SectionWidget of the added SectionContent. Do not use it for anything else than adding more
|
|
||||||
* SectionContent elements with this method.
|
|
||||||
*/
|
|
||||||
SectionWidget* addSectionContent(const SectionContent::RefPtr& sc, SectionWidget* sw = NULL, DropArea area = CenterDropArea);
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* Shows the specific SectionContent in UI.
|
|
||||||
* Independed of the current state, whether it is used inside a section or is floating.
|
|
||||||
*/
|
|
||||||
bool showSectionContent(const SectionContent::RefPtr& sc);
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* Closes the specified SectionContent from UI.
|
|
||||||
* Independed of the current state, whether it is used inside a section or is floating.
|
|
||||||
*/
|
|
||||||
bool hideSectionContent(const SectionContent::RefPtr& sc);
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* Selects the specific SectionContent as current, if it is part of a SectionWidget.
|
|
||||||
* If SC is floating, it does nothing (or should we show it?)
|
|
||||||
*/
|
|
||||||
bool raiseSectionContent(const SectionContent::RefPtr& sc);
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* Creates a QMenu based on available SectionContents.
|
|
||||||
* The caller is responsible to delete the menu.
|
|
||||||
*/
|
|
||||||
QMenu* createContextMenu() const;
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* Serializes the current state of contents and returns it as a plain byte array.
|
|
||||||
* \see restoreState(const QByteArray&)
|
|
||||||
*/
|
|
||||||
QByteArray saveState() const;
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* Deserilizes the state of contents from <em>data</em>, which was written with <em>saveState()</em>.
|
|
||||||
* \see saveState()
|
|
||||||
*/
|
|
||||||
bool restoreState(const QByteArray& data);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Advanced Public API
|
|
||||||
// You usually should not need access to this methods
|
|
||||||
//
|
|
||||||
|
|
||||||
// Outer DropAreas
|
|
||||||
QRect outerTopDropRect() const;
|
|
||||||
QRect outerRightDropRect() const;
|
|
||||||
QRect outerBottomDropRect() const;
|
|
||||||
QRect outerLeftDropRect() const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
//
|
|
||||||
// Internal Stuff Begins Here
|
|
||||||
//
|
|
||||||
|
|
||||||
SectionWidget* newSectionWidget();
|
|
||||||
SectionWidget* dropContent(const InternalContentData& data, SectionWidget* targetSection, DropArea area, bool autoActive = true);
|
|
||||||
void addSection(SectionWidget* section);
|
|
||||||
SectionWidget* sectionAt(const QPoint& pos) const;
|
|
||||||
SectionWidget* dropContentOuterHelper(QLayout* l, const InternalContentData& data, Qt::Orientation orientation, bool append);
|
|
||||||
|
|
||||||
// Serialization
|
|
||||||
void saveFloatingWidgets(QDataStream& out) const;
|
|
||||||
void saveSectionWidgets(QDataStream& out, QWidget* widget) const;
|
|
||||||
bool restoreFloatingWidgets(QDataStream& in, int version, QList<FloatingWidget*>& floatings);
|
|
||||||
bool restoreSectionWidgets(QDataStream& in, int version, QSplitter* currentSplitter, QList<SectionWidget*>& sections, QList<SectionContent::RefPtr>& contentsToHide);
|
|
||||||
|
|
||||||
bool takeContent(const SectionContent::RefPtr& sc, InternalContentData& data);
|
|
||||||
|
|
||||||
private slots:
|
|
||||||
void onActiveTabChanged();
|
|
||||||
void onActionToggleSectionContentVisibility(bool visible);
|
|
||||||
|
|
||||||
signals:
|
|
||||||
void orientationChanged();
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* Emits whenever the "isActiveTab" state of a SectionContent changes.
|
|
||||||
* Whenever the users sets another tab as active, this signal gets invoked
|
|
||||||
* for the old tab and the new active tab (the order is unspecified).
|
|
||||||
*/
|
|
||||||
void activeTabChanged(const SectionContent::RefPtr& sc, bool active);
|
|
||||||
|
|
||||||
private:
|
|
||||||
// Elements inside container.
|
|
||||||
QList<SectionWidget*> _sections;
|
|
||||||
QList<FloatingWidget*> _floatings;
|
|
||||||
QHash<int, HiddenSectionItem> _hiddenSectionContents;
|
|
||||||
|
|
||||||
|
|
||||||
// Helper lookup maps, restricted to this container.
|
|
||||||
QHash<int, SectionContent::WeakPtr> _scLookupMapById;
|
|
||||||
QHash<QString, SectionContent::WeakPtr> _scLookupMapByName;
|
|
||||||
QHash<int, SectionWidget*> _swLookupMapById;
|
|
||||||
|
|
||||||
|
|
||||||
// Layout stuff
|
|
||||||
QGridLayout* _mainLayout;
|
|
||||||
Qt::Orientation _orientation;
|
|
||||||
QPointer<QSplitter> _splitter; // $mfreiholz: I'd like to remove this variable entirely,
|
|
||||||
// because it changes during user interaction anyway.
|
|
||||||
};
|
|
||||||
|
|
||||||
ADS_NAMESPACE_END
|
|
||||||
#endif
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
#ifndef DROP_OVERLAY_H
|
|
||||||
#define DROP_OVERLAY_H
|
|
||||||
|
|
||||||
#include <QRect>
|
|
||||||
#include <QFrame>
|
|
||||||
|
|
||||||
#include "ads/API.h"
|
|
||||||
|
|
||||||
ADS_NAMESPACE_BEGIN
|
|
||||||
class DropSplitAreas;
|
|
||||||
|
|
||||||
// DropOverlay paints a translucent rectangle over another widget.
|
|
||||||
// It can also show different types of drop area indicators.
|
|
||||||
class DropOverlay : public QFrame
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
DropOverlay(DropAreas areas, QWidget* parent);
|
|
||||||
virtual ~DropOverlay();
|
|
||||||
void setFullAreaDropEnabled(bool enabled) { _fullAreaDrop = enabled; }
|
|
||||||
DropArea cursorLocation() const;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
virtual void paintEvent(QPaintEvent *e);
|
|
||||||
virtual void resizeEvent(QResizeEvent* e);
|
|
||||||
virtual void moveEvent(QMoveEvent* e);
|
|
||||||
|
|
||||||
private:
|
|
||||||
DropSplitAreas* _splitAreas;
|
|
||||||
bool _fullAreaDrop;
|
|
||||||
};
|
|
||||||
|
|
||||||
// AbstractDropAreas is used as base for drop area indicator widgets.
|
|
||||||
class AbstractDropAreas : public QWidget
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
AbstractDropAreas(QWidget* parent) : QWidget(parent) {}
|
|
||||||
virtual DropArea cursorLocation() const = 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
// DropSplitAreas shows a cross with 5 different drop area possibilities.
|
|
||||||
class DropSplitAreas : public AbstractDropAreas
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
DropSplitAreas(DropAreas areas, QWidget* parent);
|
|
||||||
virtual DropArea cursorLocation() const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
QWidget* _top;
|
|
||||||
QWidget* _right;
|
|
||||||
QWidget* _bottom;
|
|
||||||
QWidget* _left;
|
|
||||||
QWidget* _center;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
DropArea showDropOverlay(QWidget* parent, DropAreas areas = AllAreas);
|
|
||||||
void showDropOverlay(QWidget* parent, const QRect& areaRect, DropAreas areas = AllAreas);
|
|
||||||
void hideDropOverlay();
|
|
||||||
|
|
||||||
ADS_NAMESPACE_END
|
|
||||||
#endif
|
|
||||||
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
#ifndef FLOATINGWIDGET_H
|
|
||||||
#define FLOATINGWIDGET_H
|
|
||||||
|
|
||||||
#include <QWidget>
|
|
||||||
class QBoxLayout;
|
|
||||||
|
|
||||||
#include "ads/API.h"
|
|
||||||
#include "ads/SectionContent.h"
|
|
||||||
|
|
||||||
ADS_NAMESPACE_BEGIN
|
|
||||||
class ContainerWidget;
|
|
||||||
class SectionTitleWidget;
|
|
||||||
class SectionContentWidget;
|
|
||||||
class InternalContentData;
|
|
||||||
|
|
||||||
// FloatingWidget holds and displays SectionContent as a floating window.
|
|
||||||
// It can be resized, moved and dropped back into a SectionWidget.
|
|
||||||
class FloatingWidget : public QWidget
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
friend class ContainerWidget;
|
|
||||||
|
|
||||||
public:
|
|
||||||
FloatingWidget(ContainerWidget* container, SectionContent::RefPtr sc, SectionTitleWidget* titleWidget, SectionContentWidget* contentWidget, QWidget* parent = NULL);
|
|
||||||
virtual ~FloatingWidget();
|
|
||||||
|
|
||||||
SectionContent::RefPtr content() const { return _content; }
|
|
||||||
|
|
||||||
public://private:
|
|
||||||
bool takeContent(InternalContentData& data);
|
|
||||||
|
|
||||||
private:
|
|
||||||
ContainerWidget* _container;
|
|
||||||
SectionContent::RefPtr _content;
|
|
||||||
SectionTitleWidget* _titleWidget;
|
|
||||||
SectionContentWidget* _contentWidget;
|
|
||||||
|
|
||||||
QBoxLayout* _titleLayout;
|
|
||||||
};
|
|
||||||
|
|
||||||
ADS_NAMESPACE_END
|
|
||||||
#endif
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
#ifndef ADS_INTERNAL_HEADER
|
|
||||||
#define ADS_INTERNAL_HEADER
|
|
||||||
|
|
||||||
#include <QSharedPointer>
|
|
||||||
#include <QWeakPointer>
|
|
||||||
|
|
||||||
#include "ads/API.h"
|
|
||||||
|
|
||||||
#if QT_VERSION >= 0x050000
|
|
||||||
#else
|
|
||||||
#include "ads/SectionContent.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define SCLookupMapById(X) X->_scLookupMapById
|
|
||||||
#define SCLookupMapByName(X) X->_scLookupMapByName
|
|
||||||
#define SWLookupMapById(X) X->_swLookupMapById
|
|
||||||
|
|
||||||
ADS_NAMESPACE_BEGIN
|
|
||||||
class SectionContent;
|
|
||||||
class SectionTitleWidget;
|
|
||||||
class SectionContentWidget;
|
|
||||||
|
|
||||||
|
|
||||||
class InternalContentData
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
typedef QSharedPointer<InternalContentData> RefPtr;
|
|
||||||
typedef QWeakPointer<InternalContentData> WeakPtr;
|
|
||||||
|
|
||||||
InternalContentData();
|
|
||||||
~InternalContentData();
|
|
||||||
|
|
||||||
QSharedPointer<SectionContent> content;
|
|
||||||
SectionTitleWidget* titleWidget;
|
|
||||||
SectionContentWidget* contentWidget;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
class HiddenSectionItem
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
HiddenSectionItem() :
|
|
||||||
preferredSectionId(-1),
|
|
||||||
preferredSectionIndex(-1)
|
|
||||||
{}
|
|
||||||
|
|
||||||
int preferredSectionId;
|
|
||||||
int preferredSectionIndex;
|
|
||||||
InternalContentData data;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
ADS_NAMESPACE_END
|
|
||||||
#endif
|
|
||||||
@@ -1,64 +0,0 @@
|
|||||||
#ifndef SECTIONCONTENT_H
|
|
||||||
#define SECTIONCONTENT_H
|
|
||||||
|
|
||||||
#include <QSharedPointer>
|
|
||||||
#include <QWeakPointer>
|
|
||||||
#include <QPointer>
|
|
||||||
class QWidget;
|
|
||||||
|
|
||||||
#include "ads/API.h"
|
|
||||||
|
|
||||||
ADS_NAMESPACE_BEGIN
|
|
||||||
class ContainerWidget;
|
|
||||||
|
|
||||||
class ADS_EXPORT_API SectionContent
|
|
||||||
{
|
|
||||||
friend class ContainerWidget;
|
|
||||||
|
|
||||||
private:
|
|
||||||
SectionContent();
|
|
||||||
SectionContent(const SectionContent&);
|
|
||||||
SectionContent& operator=(const SectionContent&);
|
|
||||||
|
|
||||||
public:
|
|
||||||
typedef QSharedPointer<SectionContent> RefPtr;
|
|
||||||
typedef QWeakPointer<SectionContent> WeakPtr;
|
|
||||||
|
|
||||||
/*!
|
|
||||||
* Creates new content, associates it to <em>container</em> and takes ownership of
|
|
||||||
* <em>title</em>- and <em>content</em>- widgets.
|
|
||||||
* \param uniqueName An unique identifier across the entire process.
|
|
||||||
* \param container The parent ContainerWidget in which this content will be active.
|
|
||||||
* \param title The widget to use as title.
|
|
||||||
* \param content The widget to use as content.
|
|
||||||
* \return May return a invalid ref-pointer in case of invalid parameters.
|
|
||||||
*/
|
|
||||||
static RefPtr newSectionContent(const QString& uniqueName, ContainerWidget* container, QWidget* title, QWidget* content);
|
|
||||||
|
|
||||||
virtual ~SectionContent();
|
|
||||||
int uid() const;
|
|
||||||
QString uniqueName() const;
|
|
||||||
ContainerWidget* containerWidget() const;
|
|
||||||
QWidget* titleWidget() const;
|
|
||||||
QWidget* contentWidget() const;
|
|
||||||
|
|
||||||
QString visibleTitle() const;
|
|
||||||
QString title() const;
|
|
||||||
void setTitle(const QString& title);
|
|
||||||
|
|
||||||
private:
|
|
||||||
const int _uid;
|
|
||||||
QString _uniqueName;
|
|
||||||
|
|
||||||
QPointer<ContainerWidget> _containerWidget;
|
|
||||||
QPointer<QWidget> _titleWidget;
|
|
||||||
QPointer<QWidget> _contentWidget;
|
|
||||||
|
|
||||||
// Optional attributes
|
|
||||||
QString _title;
|
|
||||||
|
|
||||||
static int GetNextUid();
|
|
||||||
};
|
|
||||||
|
|
||||||
ADS_NAMESPACE_END
|
|
||||||
#endif
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
#ifndef SECTION_CONTENT_WIDGET_H
|
|
||||||
#define SECTION_CONTENT_WIDGET_H
|
|
||||||
|
|
||||||
#include <QFrame>
|
|
||||||
|
|
||||||
#include "ads/API.h"
|
|
||||||
#include "ads/SectionContent.h"
|
|
||||||
|
|
||||||
ADS_NAMESPACE_BEGIN
|
|
||||||
class ContainerWidget;
|
|
||||||
class SectionWidget;
|
|
||||||
|
|
||||||
class SectionContentWidget : public QFrame
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
friend class ContainerWidget;
|
|
||||||
|
|
||||||
public:
|
|
||||||
SectionContentWidget(SectionContent::RefPtr c, QWidget* parent = 0);
|
|
||||||
virtual ~SectionContentWidget();
|
|
||||||
|
|
||||||
private:
|
|
||||||
SectionContent::RefPtr _content;
|
|
||||||
};
|
|
||||||
|
|
||||||
ADS_NAMESPACE_END
|
|
||||||
#endif
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
#ifndef SECTION_TITLE_WIDGET_H
|
|
||||||
#define SECTION_TITLE_WIDGET_H
|
|
||||||
|
|
||||||
#include <QPointer>
|
|
||||||
#include <QPoint>
|
|
||||||
#include <QFrame>
|
|
||||||
|
|
||||||
#include "ads/API.h"
|
|
||||||
#include "ads/SectionContent.h"
|
|
||||||
|
|
||||||
ADS_NAMESPACE_BEGIN
|
|
||||||
class ContainerWidget;
|
|
||||||
class SectionWidget;
|
|
||||||
class FloatingWidget;
|
|
||||||
|
|
||||||
class SectionTitleWidget : public QFrame
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
Q_PROPERTY(bool activeTab READ isActiveTab WRITE setActiveTab NOTIFY activeTabChanged)
|
|
||||||
|
|
||||||
friend class ContainerWidget;
|
|
||||||
friend class SectionWidget;
|
|
||||||
|
|
||||||
SectionContent::RefPtr _content;
|
|
||||||
|
|
||||||
// Drag & Drop (Floating)
|
|
||||||
QPointer<FloatingWidget> _fw;
|
|
||||||
QPoint _dragStartPos;
|
|
||||||
|
|
||||||
// Drag & Drop (Title/Tabs)
|
|
||||||
bool _tabMoving;
|
|
||||||
|
|
||||||
// Property values
|
|
||||||
bool _activeTab;
|
|
||||||
|
|
||||||
public:
|
|
||||||
SectionTitleWidget(SectionContent::RefPtr content, QWidget* parent);
|
|
||||||
virtual ~SectionTitleWidget();
|
|
||||||
|
|
||||||
bool isActiveTab() const;
|
|
||||||
void setActiveTab(bool active);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
virtual void mousePressEvent(QMouseEvent* ev);
|
|
||||||
virtual void mouseReleaseEvent(QMouseEvent* ev);
|
|
||||||
virtual void mouseMoveEvent(QMouseEvent* ev);
|
|
||||||
|
|
||||||
signals:
|
|
||||||
void activeTabChanged();
|
|
||||||
void clicked();
|
|
||||||
};
|
|
||||||
|
|
||||||
ADS_NAMESPACE_END
|
|
||||||
#endif
|
|
||||||
@@ -1,75 +0,0 @@
|
|||||||
#ifndef SECTION_WIDGET_H
|
|
||||||
#define SECTION_WIDGET_H
|
|
||||||
|
|
||||||
#include <QDebug>
|
|
||||||
#include <QPointer>
|
|
||||||
#include <QList>
|
|
||||||
#include <QFrame>
|
|
||||||
class QBoxLayout;
|
|
||||||
class QStackedLayout;
|
|
||||||
|
|
||||||
#include "ads/API.h"
|
|
||||||
#include "ads/Internal.h"
|
|
||||||
#include "ads/SectionContent.h"
|
|
||||||
|
|
||||||
ADS_NAMESPACE_BEGIN
|
|
||||||
class ContainerWidget;
|
|
||||||
class SectionTitleWidget;
|
|
||||||
class SectionContentWidget;
|
|
||||||
|
|
||||||
// SectionWidget manages multiple instances of SectionContent.
|
|
||||||
// It displays a title TAB, which is clickable and will switch to
|
|
||||||
// the contents associated to the title when clicked.
|
|
||||||
class ADS_EXPORT_API SectionWidget : public QFrame
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
friend class ContainerWidget;
|
|
||||||
|
|
||||||
explicit SectionWidget(ContainerWidget* parent);
|
|
||||||
|
|
||||||
public:
|
|
||||||
virtual ~SectionWidget();
|
|
||||||
|
|
||||||
int uid() const;
|
|
||||||
ContainerWidget* containerWidget() const;
|
|
||||||
|
|
||||||
QRect titleAreaGeometry() const;
|
|
||||||
QRect contentAreaGeometry() const;
|
|
||||||
|
|
||||||
const QList<SectionContent::RefPtr>& contents() const { return _contents; }
|
|
||||||
void addContent(const SectionContent::RefPtr& c);
|
|
||||||
void addContent(const InternalContentData& data, bool autoActivate);
|
|
||||||
bool takeContent(int uid, InternalContentData& data);
|
|
||||||
int indexOfContent(const SectionContent::RefPtr& c) const;
|
|
||||||
int indexOfContentByTitlePos(const QPoint& pos, QWidget* exclude = NULL) const;
|
|
||||||
|
|
||||||
int currentIndex() const;
|
|
||||||
void moveContent(int from, int to);
|
|
||||||
|
|
||||||
public slots:
|
|
||||||
void setCurrentIndex(int index);
|
|
||||||
|
|
||||||
private slots:
|
|
||||||
void onSectionTitleClicked();
|
|
||||||
void onCloseButtonClicked();
|
|
||||||
|
|
||||||
private:
|
|
||||||
const int _uid;
|
|
||||||
|
|
||||||
QPointer<ContainerWidget> _container;
|
|
||||||
QList<SectionContent::RefPtr> _contents;
|
|
||||||
QList<SectionTitleWidget*> _sectionTitles;
|
|
||||||
QList<SectionContentWidget*> _sectionContents;
|
|
||||||
|
|
||||||
QBoxLayout *_tabsLayout;
|
|
||||||
QStackedLayout *_contentsLayout;
|
|
||||||
|
|
||||||
QPoint _mousePressPoint;
|
|
||||||
SectionContent::RefPtr _mousePressContent;
|
|
||||||
SectionTitleWidget* _mousePressTitleWidget;
|
|
||||||
|
|
||||||
static int GetNextUid();
|
|
||||||
};
|
|
||||||
|
|
||||||
ADS_NAMESPACE_END
|
|
||||||
#endif
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
<RCC>
|
|
||||||
<qresource prefix="/">
|
|
||||||
<file>img/dnd-thumbnail.png</file>
|
|
||||||
<file>img/dock-bottom.png</file>
|
|
||||||
<file>img/dock-center.png</file>
|
|
||||||
<file>img/dock-left.png</file>
|
|
||||||
<file>img/dock-right.png</file>
|
|
||||||
<file>img/dock-top.png</file>
|
|
||||||
<file>img/split-bottom.png</file>
|
|
||||||
<file>img/split-left.png</file>
|
|
||||||
<file>img/split-right.png</file>
|
|
||||||
<file>img/split-top.png</file>
|
|
||||||
<file>img/splitter-horizontal.png</file>
|
|
||||||
<file>img/splitter-vertical.png</file>
|
|
||||||
<file>stylesheets/default-windows.css</file>
|
|
||||||
<file>stylesheets/vendor-partsolutions.css</file>
|
|
||||||
<file>stylesheets/modern-windows.css</file>
|
|
||||||
</qresource>
|
|
||||||
</RCC>
|
|
||||||
|
Before Width: | Height: | Size: 249 B |
|
Before Width: | Height: | Size: 489 B |
|
Before Width: | Height: | Size: 402 B |
|
Before Width: | Height: | Size: 527 B |
|
Before Width: | Height: | Size: 516 B |
|
Before Width: | Height: | Size: 498 B |
|
Before Width: | Height: | Size: 628 B |
|
Before Width: | Height: | Size: 638 B |
|
Before Width: | Height: | Size: 647 B |
|
Before Width: | Height: | Size: 619 B |
|
Before Width: | Height: | Size: 326 B |
|
Before Width: | Height: | Size: 406 B |
@@ -1,71 +0,0 @@
|
|||||||
/*
|
|
||||||
* Default style sheet on Windows Platforms
|
|
||||||
* Note: Always use CSS-classes with and without "ads--" namespace to support Qt4 & Qt5
|
|
||||||
*/
|
|
||||||
|
|
||||||
ads--ContainerWidget,
|
|
||||||
ContainerWidget
|
|
||||||
{
|
|
||||||
background: palette(dark);
|
|
||||||
}
|
|
||||||
|
|
||||||
ads--ContainerWidget QSplitter::handle,
|
|
||||||
ContainerWidget QSplitter::handle
|
|
||||||
{
|
|
||||||
background: palette(dark);
|
|
||||||
}
|
|
||||||
|
|
||||||
ads--SectionWidget,
|
|
||||||
SectionWidget
|
|
||||||
{
|
|
||||||
background: palette(window);
|
|
||||||
border: 1px solid palette(light);
|
|
||||||
}
|
|
||||||
|
|
||||||
ads--SectionTitleWidget,
|
|
||||||
SectionTitleWidget
|
|
||||||
{
|
|
||||||
background: palette(window);
|
|
||||||
border-color: palette(light);
|
|
||||||
border-style: solid;
|
|
||||||
border-width: 0 1px 0 0;
|
|
||||||
padding: 0 9px;
|
|
||||||
}
|
|
||||||
|
|
||||||
ads--SectionTitleWidget[activeTab="true"],
|
|
||||||
SectionTitleWidget[activeTab="true"]
|
|
||||||
{
|
|
||||||
/* background: palette(light);*/
|
|
||||||
/* background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:1, stop:0 rgba(255, 255, 255, 255), stop:1 rgba(240, 240, 240, 255));*/
|
|
||||||
background: qlineargradient(spread:pad, x1:0, y1:0, x2:0, y2:0.5, stop:0 palette(window), stop:1 palette(light));
|
|
||||||
}
|
|
||||||
|
|
||||||
ads--SectionContentWidget,
|
|
||||||
SectionContentWidget
|
|
||||||
{
|
|
||||||
background: palette(light);
|
|
||||||
border-color: palette(light);
|
|
||||||
border-style: solid;
|
|
||||||
border-width: 1px 0 0 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Special: QLabels inside SectionTitleWidget
|
|
||||||
*/
|
|
||||||
ads--SectionTitleWidget QLabel,
|
|
||||||
SectionTitleWidget QLabel
|
|
||||||
{
|
|
||||||
color: palette(dark);
|
|
||||||
}
|
|
||||||
ads--SectionTitleWidget[activeTab="true"] QLabel,
|
|
||||||
SectionTitleWidget[activeTab="true"] QLabel
|
|
||||||
{
|
|
||||||
color: palette(foreground);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Special: QLabels inside SectionTitleWidget, which is floating
|
|
||||||
*/
|
|
||||||
ads--FloatingWidget ads--SectionTitleWidget QLabel,
|
|
||||||
FloatingWidget SectionTitleWidget QLabel
|
|
||||||
{
|
|
||||||
color: palette(foreground);
|
|
||||||
}
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
QSplitter::handle {
|
|
||||||
background: palette(light);
|
|
||||||
}
|
|
||||||
|
|
||||||
ads--ContainerWidget, ContainerWidget {
|
|
||||||
background: palette(light);
|
|
||||||
}
|
|
||||||
|
|
||||||
ads--SectionWidget, SectionWidget {
|
|
||||||
background: palette(light);
|
|
||||||
}
|
|
||||||
|
|
||||||
ads--SectionTitleWidget, SectionTitleWidget {
|
|
||||||
background: #ffffff;
|
|
||||||
}
|
|
||||||
ads--SectionTitleWidget QLabel, SectionTitleWidget QLabel {
|
|
||||||
color: #000000;
|
|
||||||
}
|
|
||||||
|
|
||||||
ads--SectionTitleWidget[activeTab="true"], SectionTitleWidget[activeTab="true"] {
|
|
||||||
background: #000000;
|
|
||||||
border-right: 1px solid #000000;
|
|
||||||
padding: 9px;
|
|
||||||
}
|
|
||||||
ads--SectionTitleWidget[activeTab="true"] QLabel, SectionTitleWidget[activeTab="true"] QLabel {
|
|
||||||
color: #ffffff;
|
|
||||||
}
|
|
||||||
|
|
||||||
ads--SectionContentWidget, SectionContentWidget {
|
|
||||||
border: 1px solid #000000;
|
|
||||||
}
|
|
||||||
|
|
||||||
QAbstractItemView {
|
|
||||||
border: 0;
|
|
||||||
}
|
|
||||||
@@ -1,63 +0,0 @@
|
|||||||
/*
|
|
||||||
* Style sheet used by CADENAS PARTsolutions product line
|
|
||||||
* Requires Qt4 compatibility
|
|
||||||
*/
|
|
||||||
|
|
||||||
QSplitter::handle:vertical {
|
|
||||||
image: url(:/img/splitter-horizontal.png);
|
|
||||||
}
|
|
||||||
|
|
||||||
QSplitter::handle:horizontal {
|
|
||||||
image: url(:/img/splitter-vertical.png);
|
|
||||||
}
|
|
||||||
|
|
||||||
ads--ContainerWidget, ContainerWidget {
|
|
||||||
background: #9ab6ca;
|
|
||||||
border: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
ads--SectionWidget, SectionWidget {
|
|
||||||
background: #7c9eb3;
|
|
||||||
border-color: #ffffff;
|
|
||||||
border-style: solid;
|
|
||||||
border-width: 1px;
|
|
||||||
}
|
|
||||||
|
|
||||||
ads--SectionTitleWidget, SectionTitleWidget {
|
|
||||||
background: #7c9eb3;
|
|
||||||
border-right: 1px solid #E7F3F8;
|
|
||||||
padding: 6px 6px;
|
|
||||||
}
|
|
||||||
|
|
||||||
ads--SectionTitleWidget[activeTab="true"], SectionTitleWidget[activeTab="true"] {
|
|
||||||
background: #E7F3F8;
|
|
||||||
border: 1px solid #E7F3F8;
|
|
||||||
}
|
|
||||||
|
|
||||||
ads--SectionWidget QPushButton#closeButton, SectionWidget QPushButton#closeButton,
|
|
||||||
ads--FloatingWidget QPushButton#closeButton, FloatingWidget QPushButton#closeButton {
|
|
||||||
background: #ff0000;
|
|
||||||
border: 1px solid red;
|
|
||||||
}
|
|
||||||
|
|
||||||
ads--SectionContentWidget, SectionContentWidget {
|
|
||||||
background: #ffffff;
|
|
||||||
border: 0px solid #E7F3F8;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Special */
|
|
||||||
|
|
||||||
IconTitleWidget {
|
|
||||||
padding: 0;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
ads--SectionTitleWidget QLabel, SectionTitleWidget QLabel {
|
|
||||||
color: #ffffff;
|
|
||||||
background: #7c9eb3;
|
|
||||||
}
|
|
||||||
|
|
||||||
ads--SectionTitleWidget[activeTab="true"] QLabel, SectionTitleWidget[activeTab="true"] QLabel {
|
|
||||||
color: #000000;
|
|
||||||
background: #E7F3F8;
|
|
||||||
}
|
|
||||||
@@ -1,115 +0,0 @@
|
|||||||
#include "ads/API.h"
|
|
||||||
|
|
||||||
#include <QWidget>
|
|
||||||
#include <QSplitter>
|
|
||||||
#include <QLayout>
|
|
||||||
#include <QVariant>
|
|
||||||
|
|
||||||
#include "ads/ContainerWidget.h"
|
|
||||||
#include "ads/SectionWidget.h"
|
|
||||||
|
|
||||||
ADS_NAMESPACE_BEGIN
|
|
||||||
|
|
||||||
static bool splitterContainsSectionWidget(QSplitter* splitter)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < splitter->count(); ++i)
|
|
||||||
{
|
|
||||||
QWidget* w = splitter->widget(i);
|
|
||||||
QSplitter* sp = qobject_cast<QSplitter*>(w);
|
|
||||||
SectionWidget* sw = NULL;
|
|
||||||
if (sp && splitterContainsSectionWidget(sp))
|
|
||||||
return true;
|
|
||||||
else if ((sw = qobject_cast<SectionWidget*>(w)) != NULL)
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void deleteEmptySplitter(ContainerWidget* container)
|
|
||||||
{
|
|
||||||
bool doAgain = false;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
doAgain = false;
|
|
||||||
QList<QSplitter*> splitters = container->findChildren<QSplitter*>();
|
|
||||||
for (int i = 0; i < splitters.count(); ++i)
|
|
||||||
{
|
|
||||||
QSplitter* sp = splitters.at(i);
|
|
||||||
if (!sp->property("ads-splitter").toBool())
|
|
||||||
continue;
|
|
||||||
if (sp->count() > 0 && splitterContainsSectionWidget(sp))
|
|
||||||
continue;
|
|
||||||
delete splitters[i];
|
|
||||||
doAgain = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
while (doAgain);
|
|
||||||
}
|
|
||||||
|
|
||||||
ContainerWidget* findParentContainerWidget(QWidget* w)
|
|
||||||
{
|
|
||||||
ContainerWidget* cw = 0;
|
|
||||||
QWidget* next = w;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
if ((cw = dynamic_cast<ContainerWidget*>(next)) != 0)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
next = next->parentWidget();
|
|
||||||
}
|
|
||||||
while (next);
|
|
||||||
return cw;
|
|
||||||
}
|
|
||||||
|
|
||||||
SectionWidget* findParentSectionWidget(class QWidget* w)
|
|
||||||
{
|
|
||||||
SectionWidget* cw = 0;
|
|
||||||
QWidget* next = w;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
if ((cw = dynamic_cast<SectionWidget*>(next)) != 0)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
next = next->parentWidget();
|
|
||||||
}
|
|
||||||
while (next);
|
|
||||||
return cw;
|
|
||||||
}
|
|
||||||
|
|
||||||
QSplitter* findParentSplitter(class QWidget* w)
|
|
||||||
{
|
|
||||||
QSplitter* cw = 0;
|
|
||||||
QWidget* next = w;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
if ((cw = dynamic_cast<QSplitter*>(next)) != 0)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
next = next->parentWidget();
|
|
||||||
}
|
|
||||||
while (next);
|
|
||||||
return cw;
|
|
||||||
}
|
|
||||||
|
|
||||||
QSplitter* findImmediateSplitter(class QWidget* w)
|
|
||||||
{
|
|
||||||
QSplitter* sp = NULL;
|
|
||||||
QLayout* l = w->layout();
|
|
||||||
if (!l || l->count() <= 0)
|
|
||||||
return sp;
|
|
||||||
for (int i = 0; i < l->count(); ++i)
|
|
||||||
{
|
|
||||||
QLayoutItem* li = l->itemAt(0);
|
|
||||||
if (!li->widget())
|
|
||||||
continue;
|
|
||||||
if ((sp = dynamic_cast<QSplitter*>(li->widget())) != NULL)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return sp;
|
|
||||||
}
|
|
||||||
|
|
||||||
ADS_NAMESPACE_END
|
|
||||||
@@ -1,300 +0,0 @@
|
|||||||
#include "ads/DropOverlay.h"
|
|
||||||
|
|
||||||
#include <QDebug>
|
|
||||||
#include <QPointer>
|
|
||||||
#include <QPaintEvent>
|
|
||||||
#include <QResizeEvent>
|
|
||||||
#include <QMoveEvent>
|
|
||||||
#include <QPainter>
|
|
||||||
#include <QGridLayout>
|
|
||||||
#include <QCursor>
|
|
||||||
#include <QIcon>
|
|
||||||
#include <QLabel>
|
|
||||||
|
|
||||||
ADS_NAMESPACE_BEGIN
|
|
||||||
|
|
||||||
// Helper /////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
static QWidget* createDropWidget(const QString& img)
|
|
||||||
{
|
|
||||||
QLabel* label = new QLabel();
|
|
||||||
label->setObjectName("DropAreaLabel");
|
|
||||||
label->setPixmap(QPixmap(img));
|
|
||||||
return label;
|
|
||||||
}
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
DropOverlay::DropOverlay(DropAreas areas, QWidget *parent) :
|
|
||||||
QFrame(parent),
|
|
||||||
_splitAreas(NULL),
|
|
||||||
_fullAreaDrop(false)
|
|
||||||
{
|
|
||||||
setWindowFlags(Qt::Tool | Qt::FramelessWindowHint);
|
|
||||||
setWindowOpacity(0.2);
|
|
||||||
setWindowTitle("DropOverlay");
|
|
||||||
|
|
||||||
QBoxLayout* l = new QBoxLayout(QBoxLayout::TopToBottom);
|
|
||||||
l->setContentsMargins(0, 0, 0, 0);
|
|
||||||
l->setSpacing(0);
|
|
||||||
setLayout(l);
|
|
||||||
|
|
||||||
_splitAreas = new DropSplitAreas(areas, parent);
|
|
||||||
_splitAreas->move(pos());
|
|
||||||
_splitAreas->resize(size());
|
|
||||||
_splitAreas->setVisible(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
DropOverlay::~DropOverlay()
|
|
||||||
{
|
|
||||||
if (_splitAreas)
|
|
||||||
{
|
|
||||||
delete _splitAreas;
|
|
||||||
_splitAreas = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
DropArea DropOverlay::cursorLocation() const
|
|
||||||
{
|
|
||||||
DropArea loc = InvalidDropArea;
|
|
||||||
if (_splitAreas)
|
|
||||||
{
|
|
||||||
loc = _splitAreas->cursorLocation();
|
|
||||||
}
|
|
||||||
return loc;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DropOverlay::paintEvent(QPaintEvent*)
|
|
||||||
{
|
|
||||||
QPainter p(this);
|
|
||||||
|
|
||||||
// Always draw drop-rect over the entire rect()
|
|
||||||
if (_fullAreaDrop)
|
|
||||||
{
|
|
||||||
QRect r = rect();
|
|
||||||
p.fillRect(r, QBrush(QColor(0, 100, 255), Qt::Dense4Pattern));
|
|
||||||
p.setBrush(QBrush(QColor(0, 100, 255)));
|
|
||||||
p.drawRect(r);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Draw rect based on location
|
|
||||||
QRect r = rect();
|
|
||||||
const DropArea da = cursorLocation();
|
|
||||||
switch (da)
|
|
||||||
{
|
|
||||||
case ADS_NS::TopDropArea:
|
|
||||||
r.setHeight(r.height() / 2);
|
|
||||||
break;
|
|
||||||
case ADS_NS::RightDropArea:
|
|
||||||
r.setX(r.width() / 2);
|
|
||||||
break;
|
|
||||||
case ADS_NS::BottomDropArea:
|
|
||||||
r.setY(r.height() / 2);
|
|
||||||
break;
|
|
||||||
case ADS_NS::LeftDropArea:
|
|
||||||
r.setWidth(r.width() / 2);
|
|
||||||
break;
|
|
||||||
case ADS_NS::CenterDropArea:
|
|
||||||
r = rect();
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
r = QRect();
|
|
||||||
}
|
|
||||||
if (!r.isNull())
|
|
||||||
{
|
|
||||||
p.fillRect(r, QBrush(QColor(0, 100, 255), Qt::Dense4Pattern));
|
|
||||||
p.setBrush(QBrush(QColor(0, 100, 255)));
|
|
||||||
p.drawRect(r);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Draw rect over the entire size + border.
|
|
||||||
// auto r = rect();
|
|
||||||
// r.setWidth(r.width() - 1);
|
|
||||||
// r.setHeight(r.height() - 1);
|
|
||||||
|
|
||||||
// p.fillRect(r, QBrush(QColor(0, 100, 255), Qt::Dense4Pattern));
|
|
||||||
// p.setBrush(QBrush(QColor(0, 100, 255)));
|
|
||||||
// p.drawRect(r);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DropOverlay::resizeEvent(QResizeEvent* e)
|
|
||||||
{
|
|
||||||
// Keep it in center of DropOverlay
|
|
||||||
if (_splitAreas)
|
|
||||||
{
|
|
||||||
_splitAreas->resize(e->size());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void DropOverlay::moveEvent(QMoveEvent* e)
|
|
||||||
{
|
|
||||||
// Keep it in center of DropOverlay
|
|
||||||
if (_splitAreas)
|
|
||||||
{
|
|
||||||
_splitAreas->move(e->pos());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
DropSplitAreas::DropSplitAreas(DropAreas areas, QWidget* parent) :
|
|
||||||
AbstractDropAreas(parent),
|
|
||||||
_top(0),
|
|
||||||
_right(0),
|
|
||||||
_bottom(0),
|
|
||||||
_left(0),
|
|
||||||
_center(0)
|
|
||||||
{
|
|
||||||
setWindowFlags(Qt::Tool | Qt::FramelessWindowHint);
|
|
||||||
setWindowTitle("DropSplitAreas");
|
|
||||||
|
|
||||||
setAttribute(Qt::WA_TranslucentBackground);
|
|
||||||
|
|
||||||
QGridLayout* grid = new QGridLayout();
|
|
||||||
grid->setContentsMargins(0, 0, 0, 0);
|
|
||||||
grid->setSpacing(6);
|
|
||||||
|
|
||||||
if (areas.testFlag(ADS_NS::TopDropArea))
|
|
||||||
{
|
|
||||||
_top = createDropWidget(":/img/split-top.png");
|
|
||||||
grid->addWidget(_top, 0, 1, Qt::AlignHCenter | Qt::AlignBottom);
|
|
||||||
}
|
|
||||||
if (areas.testFlag(ADS_NS::RightDropArea))
|
|
||||||
{
|
|
||||||
_right = createDropWidget(":/img/split-right.png");
|
|
||||||
grid->addWidget(_right, 1, 2, Qt::AlignLeft | Qt::AlignVCenter);
|
|
||||||
}
|
|
||||||
if (areas.testFlag(ADS_NS::BottomDropArea))
|
|
||||||
{
|
|
||||||
_bottom = createDropWidget(":/img/split-bottom.png");
|
|
||||||
grid->addWidget(_bottom, 2, 1, Qt::AlignHCenter | Qt::AlignTop);
|
|
||||||
}
|
|
||||||
if (areas.testFlag(ADS_NS::LeftDropArea))
|
|
||||||
{
|
|
||||||
_left = createDropWidget(":/img/split-left.png");
|
|
||||||
grid->addWidget(_left, 1, 0, Qt::AlignRight | Qt::AlignVCenter);
|
|
||||||
}
|
|
||||||
if (areas.testFlag(ADS_NS::CenterDropArea))
|
|
||||||
{
|
|
||||||
_center = createDropWidget(":/img/dock-center.png");
|
|
||||||
grid->addWidget(_center, 1, 1, Qt::AlignCenter);
|
|
||||||
}
|
|
||||||
|
|
||||||
QBoxLayout* bl1 = new QBoxLayout(QBoxLayout::TopToBottom);
|
|
||||||
bl1->setContentsMargins(0, 0, 0, 0);
|
|
||||||
bl1->setSpacing(0);
|
|
||||||
setLayout(bl1);
|
|
||||||
|
|
||||||
QBoxLayout* bl2 = new QBoxLayout(QBoxLayout::LeftToRight);
|
|
||||||
bl2->setContentsMargins(0, 0, 0, 0);
|
|
||||||
bl2->setSpacing(0);
|
|
||||||
|
|
||||||
bl1->addStretch(1);
|
|
||||||
bl1->addLayout(bl2);
|
|
||||||
bl2->addStretch(1);
|
|
||||||
bl2->addLayout(grid, 0);
|
|
||||||
bl2->addStretch(1);
|
|
||||||
bl1->addStretch(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
DropArea DropSplitAreas::cursorLocation() const
|
|
||||||
{
|
|
||||||
DropArea loc = InvalidDropArea;
|
|
||||||
QPoint pos = mapFromGlobal(QCursor::pos());
|
|
||||||
if (_top && _top->geometry().contains(pos))
|
|
||||||
{
|
|
||||||
loc = TopDropArea;
|
|
||||||
}
|
|
||||||
else if (_right && _right->geometry().contains(pos))
|
|
||||||
{
|
|
||||||
loc = RightDropArea;
|
|
||||||
}
|
|
||||||
else if (_bottom && _bottom->geometry().contains(pos))
|
|
||||||
{
|
|
||||||
loc = BottomDropArea;
|
|
||||||
}
|
|
||||||
else if (_left && _left->geometry().contains(pos))
|
|
||||||
{
|
|
||||||
loc = LeftDropArea;
|
|
||||||
}
|
|
||||||
else if (_center && _center->geometry().contains(pos))
|
|
||||||
{
|
|
||||||
loc = CenterDropArea;
|
|
||||||
}
|
|
||||||
return loc;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Globals ////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
static QPointer<DropOverlay> MyOverlay;
|
|
||||||
static QPointer<QWidget> MyOverlayParent;
|
|
||||||
static QRect MyOverlayParentRect;
|
|
||||||
static DropArea MyOverlayLastLocation = InvalidDropArea;
|
|
||||||
|
|
||||||
DropArea showDropOverlay(QWidget* parent, DropAreas areas)
|
|
||||||
{
|
|
||||||
if (MyOverlay)
|
|
||||||
{
|
|
||||||
if (MyOverlayParent == parent)
|
|
||||||
{
|
|
||||||
// Hint: We could update geometry of overlay here.
|
|
||||||
DropArea da = MyOverlay->cursorLocation();
|
|
||||||
if (da != MyOverlayLastLocation)
|
|
||||||
{
|
|
||||||
MyOverlay->repaint();
|
|
||||||
MyOverlayLastLocation = da;
|
|
||||||
}
|
|
||||||
return da;
|
|
||||||
}
|
|
||||||
hideDropOverlay();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create new overlay and move it directly over the "parent" widget.
|
|
||||||
MyOverlay = new DropOverlay(areas, parent);
|
|
||||||
MyOverlay->resize(parent->size());
|
|
||||||
MyOverlay->move(parent->mapToGlobal(parent->rect().topLeft()));
|
|
||||||
MyOverlay->show();
|
|
||||||
MyOverlayParent = parent;
|
|
||||||
return MyOverlay->cursorLocation();
|
|
||||||
}
|
|
||||||
|
|
||||||
void showDropOverlay(QWidget* parent, const QRect& areaRect, DropAreas areas)
|
|
||||||
{
|
|
||||||
if (MyOverlay)
|
|
||||||
{
|
|
||||||
if (MyOverlayParent == parent && MyOverlayParentRect == areaRect)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
hideDropOverlay();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create overlay and move it to the parent's areaRect
|
|
||||||
MyOverlay = new DropOverlay(areas, parent);
|
|
||||||
MyOverlay->setFullAreaDropEnabled(true);
|
|
||||||
MyOverlay->resize(areaRect.size());
|
|
||||||
MyOverlay->move(parent->mapToGlobal(QPoint(areaRect.x(), areaRect.y())));
|
|
||||||
MyOverlay->show();
|
|
||||||
MyOverlayParent = parent;
|
|
||||||
MyOverlayParentRect = areaRect;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
void hideDropOverlay()
|
|
||||||
{
|
|
||||||
if (MyOverlay)
|
|
||||||
{
|
|
||||||
MyOverlay->hide();
|
|
||||||
delete MyOverlay;
|
|
||||||
#if QT_VERSION >= 0x050000
|
|
||||||
MyOverlayParent.clear();
|
|
||||||
#else
|
|
||||||
MyOverlayParent = 0;
|
|
||||||
#endif
|
|
||||||
MyOverlayParentRect = QRect();
|
|
||||||
MyOverlayLastLocation = InvalidDropArea;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ADS_NAMESPACE_END
|
|
||||||
@@ -1,76 +0,0 @@
|
|||||||
|
|
||||||
#include "ads/FloatingWidget.h"
|
|
||||||
|
|
||||||
#include <QDebug>
|
|
||||||
#include <QBoxLayout>
|
|
||||||
#include <QPushButton>
|
|
||||||
#include <QSizePolicy>
|
|
||||||
#include <QMouseEvent>
|
|
||||||
#include <QStyle>
|
|
||||||
|
|
||||||
#include "ads/ContainerWidget.h"
|
|
||||||
#include "ads/SectionTitleWidget.h"
|
|
||||||
#include "ads/SectionContentWidget.h"
|
|
||||||
#include "ads/Internal.h"
|
|
||||||
|
|
||||||
ADS_NAMESPACE_BEGIN
|
|
||||||
|
|
||||||
FloatingWidget::FloatingWidget(ContainerWidget* container, SectionContent::RefPtr sc, SectionTitleWidget* titleWidget, SectionContentWidget* contentWidget, QWidget* parent) :
|
|
||||||
QWidget(parent, Qt::CustomizeWindowHint | Qt::Tool),
|
|
||||||
_container(container),
|
|
||||||
_content(sc),
|
|
||||||
_titleWidget(titleWidget),
|
|
||||||
_contentWidget(contentWidget)
|
|
||||||
{
|
|
||||||
QBoxLayout* l = new QBoxLayout(QBoxLayout::TopToBottom);
|
|
||||||
l->setContentsMargins(0, 0, 0, 0);
|
|
||||||
l->setSpacing(0);
|
|
||||||
setLayout(l);
|
|
||||||
|
|
||||||
// Title + Controls
|
|
||||||
_titleLayout = new QBoxLayout(QBoxLayout::LeftToRight);
|
|
||||||
_titleLayout->addWidget(titleWidget, 1);
|
|
||||||
l->addLayout(_titleLayout, 0);
|
|
||||||
titleWidget->setActiveTab(false);
|
|
||||||
|
|
||||||
QPushButton* closeButton = new QPushButton();
|
|
||||||
closeButton->setObjectName("closeButton");
|
|
||||||
closeButton->setFlat(true);
|
|
||||||
closeButton->setIcon(style()->standardIcon(QStyle::SP_TitleBarCloseButton));
|
|
||||||
closeButton->setToolTip(tr("Close"));
|
|
||||||
closeButton->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
|
|
||||||
_titleLayout->addWidget(closeButton);
|
|
||||||
//QObject::connect(closeButton, &QPushButton::clicked, this, &FloatingWidget::close);
|
|
||||||
QObject::connect(closeButton, SIGNAL(clicked()), this, SLOT(close()));
|
|
||||||
|
|
||||||
// Content
|
|
||||||
l->addWidget(contentWidget, 1);
|
|
||||||
contentWidget->show();
|
|
||||||
|
|
||||||
// _container->_floatingWidgets.append(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
FloatingWidget::~FloatingWidget()
|
|
||||||
{
|
|
||||||
qDebug() << Q_FUNC_INFO;
|
|
||||||
_container->_floatings.removeAll(this); // Note: I don't like this here, but we have to remove it from list...
|
|
||||||
}
|
|
||||||
|
|
||||||
bool FloatingWidget::takeContent(InternalContentData& data)
|
|
||||||
{
|
|
||||||
data.content = _content;
|
|
||||||
data.titleWidget = _titleWidget;
|
|
||||||
data.contentWidget = _contentWidget;
|
|
||||||
|
|
||||||
_titleLayout->removeWidget(_titleWidget);
|
|
||||||
_titleWidget->setParent(_container);
|
|
||||||
_titleWidget = NULL;
|
|
||||||
|
|
||||||
layout()->removeWidget(_contentWidget);
|
|
||||||
_contentWidget->setParent(_container);
|
|
||||||
_contentWidget = NULL;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
ADS_NAMESPACE_END
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
#include "ads/Internal.h"
|
|
||||||
|
|
||||||
ADS_NAMESPACE_BEGIN
|
|
||||||
|
|
||||||
InternalContentData::InternalContentData() :
|
|
||||||
titleWidget(NULL),
|
|
||||||
contentWidget(NULL)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
InternalContentData::~InternalContentData()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
ADS_NAMESPACE_END
|
|
||||||
@@ -1,105 +0,0 @@
|
|||||||
#include "ads/SectionContent.h"
|
|
||||||
|
|
||||||
#include <QDebug>
|
|
||||||
#include <QWidget>
|
|
||||||
#include <QLabel>
|
|
||||||
|
|
||||||
#include "ads/Internal.h"
|
|
||||||
#include "ads/ContainerWidget.h"
|
|
||||||
|
|
||||||
ADS_NAMESPACE_BEGIN
|
|
||||||
|
|
||||||
SectionContent::SectionContent() :
|
|
||||||
_uid(GetNextUid())
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
SectionContent::RefPtr SectionContent::newSectionContent(const QString& uniqueName, ContainerWidget* container, QWidget* title, QWidget* content)
|
|
||||||
{
|
|
||||||
if (uniqueName.isEmpty())
|
|
||||||
{
|
|
||||||
qFatal("Can not create SectionContent with empty uniqueName");
|
|
||||||
return RefPtr();
|
|
||||||
}
|
|
||||||
else if (SCLookupMapByName(container).contains(uniqueName))
|
|
||||||
{
|
|
||||||
qFatal("Can not create SectionContent with already used uniqueName");
|
|
||||||
return RefPtr();
|
|
||||||
}
|
|
||||||
else if (!container || !title || !content)
|
|
||||||
{
|
|
||||||
qFatal("Can not create SectionContent with NULL values");
|
|
||||||
return RefPtr();
|
|
||||||
}
|
|
||||||
|
|
||||||
QSharedPointer<SectionContent> sc(new SectionContent());
|
|
||||||
sc->_uniqueName = uniqueName;
|
|
||||||
sc->_containerWidget = container;
|
|
||||||
sc->_titleWidget = title;
|
|
||||||
sc->_contentWidget = content;
|
|
||||||
|
|
||||||
SCLookupMapById(container).insert(sc->uid(), sc);
|
|
||||||
SCLookupMapByName(container).insert(sc->uniqueName(), sc);
|
|
||||||
return sc;
|
|
||||||
}
|
|
||||||
|
|
||||||
SectionContent::~SectionContent()
|
|
||||||
{
|
|
||||||
if (_containerWidget)
|
|
||||||
{
|
|
||||||
SCLookupMapById(_containerWidget).remove(_uid);
|
|
||||||
SCLookupMapByName(_containerWidget).remove(_uniqueName);
|
|
||||||
}
|
|
||||||
delete _titleWidget;
|
|
||||||
delete _contentWidget;
|
|
||||||
}
|
|
||||||
|
|
||||||
int SectionContent::uid() const
|
|
||||||
{
|
|
||||||
return _uid;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString SectionContent::uniqueName() const
|
|
||||||
{
|
|
||||||
return _uniqueName;
|
|
||||||
}
|
|
||||||
|
|
||||||
ContainerWidget* SectionContent::containerWidget() const
|
|
||||||
{
|
|
||||||
return _containerWidget;
|
|
||||||
}
|
|
||||||
|
|
||||||
QWidget* SectionContent::titleWidget() const
|
|
||||||
{
|
|
||||||
return _titleWidget;
|
|
||||||
}
|
|
||||||
|
|
||||||
QWidget* SectionContent::contentWidget() const
|
|
||||||
{
|
|
||||||
return _contentWidget;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString SectionContent::visibleTitle() const
|
|
||||||
{
|
|
||||||
if (_title.isEmpty())
|
|
||||||
return _uniqueName;
|
|
||||||
return _title;
|
|
||||||
}
|
|
||||||
|
|
||||||
QString SectionContent::title() const
|
|
||||||
{
|
|
||||||
return _title;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SectionContent::setTitle(const QString& title)
|
|
||||||
{
|
|
||||||
_title = title;
|
|
||||||
}
|
|
||||||
|
|
||||||
int SectionContent::GetNextUid()
|
|
||||||
{
|
|
||||||
static int NextUid = 0;
|
|
||||||
return ++NextUid;
|
|
||||||
}
|
|
||||||
|
|
||||||
ADS_NAMESPACE_END
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
#include "ads/SectionContentWidget.h"
|
|
||||||
|
|
||||||
#include <QDebug>
|
|
||||||
#include <QBoxLayout>
|
|
||||||
|
|
||||||
ADS_NAMESPACE_BEGIN
|
|
||||||
|
|
||||||
SectionContentWidget::SectionContentWidget(SectionContent::RefPtr c, QWidget* parent) :
|
|
||||||
QFrame(parent),
|
|
||||||
_content(c)
|
|
||||||
{
|
|
||||||
qDebug() << Q_FUNC_INFO;
|
|
||||||
|
|
||||||
QBoxLayout* l = new QBoxLayout(QBoxLayout::TopToBottom);
|
|
||||||
l->setContentsMargins(0, 0, 0, 0);
|
|
||||||
l->setSpacing(0);
|
|
||||||
l->addWidget(_content->contentWidget());
|
|
||||||
setLayout(l);
|
|
||||||
}
|
|
||||||
|
|
||||||
SectionContentWidget::~SectionContentWidget()
|
|
||||||
{
|
|
||||||
qDebug() << Q_FUNC_INFO;
|
|
||||||
}
|
|
||||||
|
|
||||||
ADS_NAMESPACE_END
|
|
||||||
@@ -1,292 +0,0 @@
|
|||||||
#include "ads/SectionTitleWidget.h"
|
|
||||||
|
|
||||||
#include <QDebug>
|
|
||||||
#include <QString>
|
|
||||||
#include <QApplication>
|
|
||||||
#include <QBoxLayout>
|
|
||||||
#include <QMouseEvent>
|
|
||||||
#include <QMimeData>
|
|
||||||
#include <QDrag>
|
|
||||||
#include <QCursor>
|
|
||||||
#include <QStyle>
|
|
||||||
#include <QSplitter>
|
|
||||||
|
|
||||||
#ifdef ADS_ANIMATIONS_ENABLED
|
|
||||||
#include <QPropertyAnimation>
|
|
||||||
#include <QParallelAnimationGroup>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "ads/Internal.h"
|
|
||||||
#include "ads/DropOverlay.h"
|
|
||||||
#include "ads/SectionContent.h"
|
|
||||||
#include "ads/SectionWidget.h"
|
|
||||||
#include "ads/FloatingWidget.h"
|
|
||||||
#include "ads/ContainerWidget.h"
|
|
||||||
|
|
||||||
ADS_NAMESPACE_BEGIN
|
|
||||||
|
|
||||||
SectionTitleWidget::SectionTitleWidget(SectionContent::RefPtr content, QWidget* parent) :
|
|
||||||
QFrame(parent),
|
|
||||||
_content(content),
|
|
||||||
_tabMoving(false),
|
|
||||||
_activeTab(false)
|
|
||||||
{
|
|
||||||
qDebug() << Q_FUNC_INFO;
|
|
||||||
|
|
||||||
QBoxLayout* l = new QBoxLayout(QBoxLayout::LeftToRight);
|
|
||||||
l->setContentsMargins(0, 0, 0, 0);
|
|
||||||
l->setSpacing(0);
|
|
||||||
l->addWidget(content->titleWidget());
|
|
||||||
setLayout(l);
|
|
||||||
}
|
|
||||||
|
|
||||||
SectionTitleWidget::~SectionTitleWidget()
|
|
||||||
{
|
|
||||||
qDebug() << Q_FUNC_INFO;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool SectionTitleWidget::isActiveTab() const
|
|
||||||
{
|
|
||||||
return _activeTab;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SectionTitleWidget::setActiveTab(bool active)
|
|
||||||
{
|
|
||||||
if (active != _activeTab)
|
|
||||||
{
|
|
||||||
_activeTab = active;
|
|
||||||
|
|
||||||
style()->unpolish(this);
|
|
||||||
style()->polish(this);
|
|
||||||
update();
|
|
||||||
|
|
||||||
emit activeTabChanged();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void SectionTitleWidget::mousePressEvent(QMouseEvent* ev)
|
|
||||||
{
|
|
||||||
// qDebug() << Q_FUNC_INFO << ev->pos();
|
|
||||||
if (ev->button() == Qt::LeftButton)
|
|
||||||
{
|
|
||||||
_dragStartPos = ev->pos();
|
|
||||||
ev->accept();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
QFrame::mousePressEvent(ev);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SectionTitleWidget::mouseReleaseEvent(QMouseEvent* ev)
|
|
||||||
{
|
|
||||||
// qDebug() << Q_FUNC_INFO << ev->pos();
|
|
||||||
SectionWidget* section = NULL;
|
|
||||||
|
|
||||||
// Drop contents of FloatingWidget into SectionWidget.
|
|
||||||
if (_fw)
|
|
||||||
{
|
|
||||||
ContainerWidget* cw = findParentContainerWidget(this);
|
|
||||||
SectionWidget* sw = cw->sectionAt(cw->mapFromGlobal(ev->globalPos()));
|
|
||||||
if (sw)
|
|
||||||
{
|
|
||||||
DropArea loc = showDropOverlay(sw);
|
|
||||||
if (loc != InvalidDropArea)
|
|
||||||
{
|
|
||||||
#if !defined(ADS_ANIMATIONS_ENABLED)
|
|
||||||
InternalContentData data;
|
|
||||||
_fw->takeContent(data);
|
|
||||||
_fw->deleteLater();
|
|
||||||
#if QT_VERSION >= 0x050000
|
|
||||||
_fw.clear();
|
|
||||||
#else
|
|
||||||
_fw = 0;
|
|
||||||
#endif
|
|
||||||
cw->dropContent(data, sw, loc, true);
|
|
||||||
#else
|
|
||||||
QPropertyAnimation* moveAnim = new QPropertyAnimation(_fw, "pos", this);
|
|
||||||
moveAnim->setStartValue(_fw->pos());
|
|
||||||
moveAnim->setEndValue(sw->mapToGlobal(sw->rect().topLeft()));
|
|
||||||
moveAnim->setDuration(ADS_ANIMATION_DURATION);
|
|
||||||
|
|
||||||
QPropertyAnimation* resizeAnim = new QPropertyAnimation(_fw, "size", this);
|
|
||||||
resizeAnim->setStartValue(_fw->size());
|
|
||||||
resizeAnim->setEndValue(sw->size());
|
|
||||||
resizeAnim->setDuration(ADS_ANIMATION_DURATION);
|
|
||||||
|
|
||||||
QParallelAnimationGroup* animGroup = new QParallelAnimationGroup(this);
|
|
||||||
QObject::connect(animGroup, &QPropertyAnimation::finished, [this, data, sw, loc]()
|
|
||||||
{
|
|
||||||
InternalContentData data = _fw->takeContent();
|
|
||||||
_fw->deleteLater();
|
|
||||||
_fw.clear();
|
|
||||||
cw->dropContent(data, sw, loc);
|
|
||||||
});
|
|
||||||
animGroup->addAnimation(moveAnim);
|
|
||||||
animGroup->addAnimation(resizeAnim);
|
|
||||||
animGroup->start(QAbstractAnimation::DeleteWhenStopped);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Mouse is over a outer-edge drop area
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DropArea dropArea = ADS_NS::InvalidDropArea;
|
|
||||||
if (cw->outerTopDropRect().contains(cw->mapFromGlobal(ev->globalPos())))
|
|
||||||
dropArea = ADS_NS::TopDropArea;
|
|
||||||
if (cw->outerRightDropRect().contains(cw->mapFromGlobal(ev->globalPos())))
|
|
||||||
dropArea = ADS_NS::RightDropArea;
|
|
||||||
if (cw->outerBottomDropRect().contains(cw->mapFromGlobal(ev->globalPos())))
|
|
||||||
dropArea = ADS_NS::BottomDropArea;
|
|
||||||
if (cw->outerLeftDropRect().contains(cw->mapFromGlobal(ev->globalPos())))
|
|
||||||
dropArea = ADS_NS::LeftDropArea;
|
|
||||||
|
|
||||||
if (dropArea != ADS_NS::InvalidDropArea)
|
|
||||||
{
|
|
||||||
#if !defined(ADS_ANIMATIONS_ENABLED)
|
|
||||||
InternalContentData data;
|
|
||||||
_fw->takeContent(data);
|
|
||||||
_fw->deleteLater();
|
|
||||||
#if QT_VERSION >= 0x050000
|
|
||||||
_fw.clear();
|
|
||||||
#else
|
|
||||||
_fw = 0;
|
|
||||||
#endif
|
|
||||||
cw->dropContent(data, NULL, dropArea, true);
|
|
||||||
#else
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// End of tab moving, change order now
|
|
||||||
else if (_tabMoving
|
|
||||||
&& (section = findParentSectionWidget(this)) != NULL)
|
|
||||||
{
|
|
||||||
qDebug() << "Stop tab move";
|
|
||||||
|
|
||||||
// Find tab under mouse
|
|
||||||
QPoint pos = ev->globalPos();
|
|
||||||
pos = section->mapFromGlobal(pos);
|
|
||||||
const int fromIndex = section->indexOfContent(_content);
|
|
||||||
const int toIndex = section->indexOfContentByTitlePos(pos, this);
|
|
||||||
qDebug() << "from" << fromIndex << "to" << toIndex;
|
|
||||||
section->moveContent(fromIndex, toIndex);
|
|
||||||
section->layout()->update();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!_dragStartPos.isNull())
|
|
||||||
emit clicked();
|
|
||||||
|
|
||||||
// Reset
|
|
||||||
_dragStartPos = QPoint();
|
|
||||||
_tabMoving = false;
|
|
||||||
hideDropOverlay();
|
|
||||||
QFrame::mouseReleaseEvent(ev);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SectionTitleWidget::mouseMoveEvent(QMouseEvent* ev)
|
|
||||||
{
|
|
||||||
ContainerWidget* cw = findParentContainerWidget(this);
|
|
||||||
SectionWidget* section = NULL;
|
|
||||||
|
|
||||||
// Move already existing FloatingWidget
|
|
||||||
if (_fw)
|
|
||||||
{
|
|
||||||
const QPoint moveToPos = ev->globalPos() - (_dragStartPos + QPoint(ADS_WINDOW_FRAME_BORDER_WIDTH, ADS_WINDOW_FRAME_BORDER_WIDTH));
|
|
||||||
_fw->move(moveToPos);
|
|
||||||
|
|
||||||
// Show drop indicator
|
|
||||||
if (true)
|
|
||||||
{
|
|
||||||
// Mouse is over a SectionWidget
|
|
||||||
section = cw->sectionAt(cw->mapFromGlobal(QCursor::pos()));
|
|
||||||
if (section)
|
|
||||||
{
|
|
||||||
showDropOverlay(section);
|
|
||||||
}
|
|
||||||
// Mouse is at the edge of the ContainerWidget
|
|
||||||
// Top, Right, Bottom, Left
|
|
||||||
else if (cw->outerTopDropRect().contains(cw->mapFromGlobal(QCursor::pos())))
|
|
||||||
{
|
|
||||||
showDropOverlay(cw, cw->outerTopDropRect(), ADS_NS::TopDropArea);
|
|
||||||
}
|
|
||||||
else if (cw->outerRightDropRect().contains(cw->mapFromGlobal(QCursor::pos())))
|
|
||||||
{
|
|
||||||
showDropOverlay(cw, cw->outerRightDropRect(), ADS_NS::RightDropArea);
|
|
||||||
}
|
|
||||||
else if (cw->outerBottomDropRect().contains(cw->mapFromGlobal(QCursor::pos())))
|
|
||||||
{
|
|
||||||
showDropOverlay(cw, cw->outerBottomDropRect(), ADS_NS::BottomDropArea);
|
|
||||||
}
|
|
||||||
else if (cw->outerLeftDropRect().contains(cw->mapFromGlobal(QCursor::pos())))
|
|
||||||
{
|
|
||||||
showDropOverlay(cw, cw->outerLeftDropRect(), ADS_NS::LeftDropArea);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
hideDropOverlay();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ev->accept();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Begin to drag/float the SectionContent.
|
|
||||||
else if (!_fw && !_dragStartPos.isNull() && (ev->buttons() & Qt::LeftButton)
|
|
||||||
&& (section = findParentSectionWidget(this)) != NULL
|
|
||||||
&& !section->titleAreaGeometry().contains(section->mapFromGlobal(ev->globalPos())))
|
|
||||||
{
|
|
||||||
// Create floating widget.
|
|
||||||
InternalContentData data;
|
|
||||||
if (!section->takeContent(_content->uid(), data))
|
|
||||||
{
|
|
||||||
qWarning() << "THIS SHOULD NOT HAPPEN!!" << _content->uid() << _content->uniqueName();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
_fw = new FloatingWidget(cw, data.content, data.titleWidget, data.contentWidget, cw);
|
|
||||||
_fw->resize(section->size());
|
|
||||||
cw->_floatings.append(_fw); // Note: I don't like this...
|
|
||||||
//setActiveTab(false);
|
|
||||||
|
|
||||||
const QPoint moveToPos = ev->globalPos() - (_dragStartPos + QPoint(ADS_WINDOW_FRAME_BORDER_WIDTH, ADS_WINDOW_FRAME_BORDER_WIDTH));
|
|
||||||
_fw->move(moveToPos);
|
|
||||||
_fw->show();
|
|
||||||
|
|
||||||
// Delete old section, if it is empty now.
|
|
||||||
if (section->contents().isEmpty())
|
|
||||||
{
|
|
||||||
delete section;
|
|
||||||
section = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Delete old splitter, if it is empty now
|
|
||||||
deleteEmptySplitter(cw);
|
|
||||||
|
|
||||||
ev->accept();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// Handle movement of this tab
|
|
||||||
else if (_tabMoving
|
|
||||||
&& (section = findParentSectionWidget(this)) != NULL)
|
|
||||||
{
|
|
||||||
int left, top, right, bottom;
|
|
||||||
getContentsMargins(&left, &top, &right, &bottom);
|
|
||||||
QPoint moveToPos = mapToParent(ev->pos()) - _dragStartPos;
|
|
||||||
moveToPos.setY(0/* + top*/);
|
|
||||||
move(moveToPos);
|
|
||||||
ev->accept();
|
|
||||||
}
|
|
||||||
// Begin to drag title inside the title area to switch its position inside the SectionWidget.
|
|
||||||
else if (!_dragStartPos.isNull() && (ev->buttons() & Qt::LeftButton)
|
|
||||||
&& (ev->pos() - _dragStartPos).manhattanLength() >= QApplication::startDragDistance() // Wait a few pixels before start moving
|
|
||||||
&& (section = findParentSectionWidget(this)) != NULL
|
|
||||||
&& section->titleAreaGeometry().contains(section->mapFromGlobal(ev->globalPos())))
|
|
||||||
{
|
|
||||||
// Raise current title-widget above other tabs
|
|
||||||
_tabMoving = true;
|
|
||||||
raise();
|
|
||||||
ev->accept();
|
|
||||||
}
|
|
||||||
QFrame::mouseMoveEvent(ev);
|
|
||||||
}
|
|
||||||
|
|
||||||
ADS_NAMESPACE_END
|
|
||||||
@@ -1,346 +0,0 @@
|
|||||||
#include "ads/SectionWidget.h"
|
|
||||||
|
|
||||||
#include <QApplication>
|
|
||||||
#include <QBoxLayout>
|
|
||||||
#include <QStackedLayout>
|
|
||||||
#include <QMouseEvent>
|
|
||||||
#include <QDragEnterEvent>
|
|
||||||
#include <QMimeData>
|
|
||||||
#include <QPainter>
|
|
||||||
#include <QStyle>
|
|
||||||
#include <QSplitter>
|
|
||||||
#include <QPushButton>
|
|
||||||
|
|
||||||
#if defined(ADS_ANIMATIONS_ENABLED)
|
|
||||||
#include <QGraphicsDropShadowEffect>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "ads/Internal.h"
|
|
||||||
#include "ads/DropOverlay.h"
|
|
||||||
#include "ads/SectionContent.h"
|
|
||||||
#include "ads/SectionTitleWidget.h"
|
|
||||||
#include "ads/SectionContentWidget.h"
|
|
||||||
#include "ads/FloatingWidget.h"
|
|
||||||
#include "ads/ContainerWidget.h"
|
|
||||||
|
|
||||||
ADS_NAMESPACE_BEGIN
|
|
||||||
|
|
||||||
//int SectionWidget::NextUid = 1;
|
|
||||||
//QHash<int, SectionWidget*> SectionWidget::LookupMap;
|
|
||||||
//QHash<ContainerWidget*, QHash<int, SectionWidget*> > SectionWidget::LookupMapByContainer;
|
|
||||||
|
|
||||||
SectionWidget::SectionWidget(ContainerWidget* parent) :
|
|
||||||
QFrame(parent),
|
|
||||||
_uid(GetNextUid()),
|
|
||||||
_container(parent),
|
|
||||||
_tabsLayout(NULL),
|
|
||||||
_contentsLayout(NULL),
|
|
||||||
_mousePressTitleWidget(NULL)
|
|
||||||
{
|
|
||||||
QBoxLayout* l = new QBoxLayout(QBoxLayout::TopToBottom);
|
|
||||||
l->setContentsMargins(0, 0, 0, 0);
|
|
||||||
l->setSpacing(0);
|
|
||||||
setLayout(l);
|
|
||||||
|
|
||||||
_tabsLayout = new QBoxLayout(QBoxLayout::LeftToRight);
|
|
||||||
_tabsLayout->setContentsMargins(0, 0, 0, 0);
|
|
||||||
_tabsLayout->setSpacing(0);
|
|
||||||
_tabsLayout->addStretch(1);
|
|
||||||
l->addLayout(_tabsLayout);
|
|
||||||
|
|
||||||
QPushButton* closeButton = new QPushButton();
|
|
||||||
closeButton->setObjectName("closeButton");
|
|
||||||
closeButton->setFlat(true);
|
|
||||||
closeButton->setIcon(style()->standardIcon(QStyle::SP_TitleBarCloseButton));
|
|
||||||
closeButton->setToolTip(tr("Close"));
|
|
||||||
closeButton->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
|
|
||||||
_tabsLayout->addWidget(closeButton);
|
|
||||||
#if QT_VERSION >= 0x050000
|
|
||||||
QObject::connect(closeButton, &QPushButton::clicked, this, &SectionWidget::onCloseButtonClicked);
|
|
||||||
#else
|
|
||||||
QObject::connect(closeButton, SIGNAL(clicked(bool)), this, SLOT(onCloseButtonClicked()));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
_contentsLayout = new QStackedLayout();
|
|
||||||
_contentsLayout->setContentsMargins(0, 0, 0, 0);
|
|
||||||
_contentsLayout->setSpacing(0);
|
|
||||||
l->addLayout(_contentsLayout, 1);
|
|
||||||
|
|
||||||
#if defined(ADS_ANIMATIONS_ENABLED)
|
|
||||||
QGraphicsDropShadowEffect* shadow = new QGraphicsDropShadowEffect(this);
|
|
||||||
shadow->setOffset(0, 0);
|
|
||||||
shadow->setBlurRadius(8);
|
|
||||||
setGraphicsEffect(shadow);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
SWLookupMapById(_container).insert(_uid, this);
|
|
||||||
}
|
|
||||||
|
|
||||||
SectionWidget::~SectionWidget()
|
|
||||||
{
|
|
||||||
qDebug() << Q_FUNC_INFO;
|
|
||||||
if (_container)
|
|
||||||
{
|
|
||||||
SWLookupMapById(_container).remove(_uid);
|
|
||||||
_container->_sections.removeAll(this); // Note: I don't like this here, but we have to remove it from list...
|
|
||||||
}
|
|
||||||
|
|
||||||
// Delete empty QSplitter.
|
|
||||||
QSplitter* splitter = findParentSplitter(this);
|
|
||||||
if (splitter && splitter->count() == 0)
|
|
||||||
{
|
|
||||||
splitter->deleteLater();
|
|
||||||
qDebug() << "Delete empty splitter";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int SectionWidget::uid() const
|
|
||||||
{
|
|
||||||
return _uid;
|
|
||||||
}
|
|
||||||
|
|
||||||
ContainerWidget* SectionWidget::containerWidget() const
|
|
||||||
{
|
|
||||||
return _container;
|
|
||||||
}
|
|
||||||
|
|
||||||
QRect SectionWidget::titleAreaGeometry() const
|
|
||||||
{
|
|
||||||
return _tabsLayout->geometry();
|
|
||||||
}
|
|
||||||
|
|
||||||
QRect SectionWidget::contentAreaGeometry() const
|
|
||||||
{
|
|
||||||
return _contentsLayout->geometry();
|
|
||||||
}
|
|
||||||
|
|
||||||
void SectionWidget::addContent(const SectionContent::RefPtr& c)
|
|
||||||
{
|
|
||||||
_contents.append(c);
|
|
||||||
|
|
||||||
SectionTitleWidget* title = new SectionTitleWidget(c, NULL);
|
|
||||||
_sectionTitles.append(title);
|
|
||||||
_tabsLayout->insertWidget(_tabsLayout->count() - 2, title);
|
|
||||||
#if QT_VERSION >= 0x050000
|
|
||||||
QObject::connect(title, &SectionTitleWidget::clicked, this, &SectionWidget::onSectionTitleClicked);
|
|
||||||
#else
|
|
||||||
QObject::connect(title, SIGNAL(clicked()), this, SLOT(onSectionTitleClicked()));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
SectionContentWidget* content = new SectionContentWidget(c, NULL);
|
|
||||||
_sectionContents.append(content);
|
|
||||||
_contentsLayout->addWidget(content);
|
|
||||||
|
|
||||||
// Active first TAB.
|
|
||||||
if (_contents.size() == 1)
|
|
||||||
setCurrentIndex(0);
|
|
||||||
// Switch to newest.
|
|
||||||
// else
|
|
||||||
// setCurrentIndex(_contentsLayout->count() - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SectionWidget::addContent(const InternalContentData& data, bool autoActivate)
|
|
||||||
{
|
|
||||||
_contents.append(data.content);
|
|
||||||
|
|
||||||
// Add title-widget to tab-bar
|
|
||||||
// #FIX: Make it visible, since it is possible that it was hidden previously.
|
|
||||||
_sectionTitles.append(data.titleWidget);
|
|
||||||
_tabsLayout->insertWidget(_tabsLayout->count() - 2, data.titleWidget);
|
|
||||||
data.titleWidget->setVisible(true);
|
|
||||||
#if QT_VERSION >= 0x050000
|
|
||||||
QObject::connect(data.titleWidget, &SectionTitleWidget::clicked, this, &SectionWidget::onSectionTitleClicked);
|
|
||||||
#else
|
|
||||||
QObject::connect(data.titleWidget, SIGNAL(clicked()), this, SLOT(onSectionTitleClicked()));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Add content-widget to stack.
|
|
||||||
// Visibility is managed by QStackedWidget.
|
|
||||||
_sectionContents.append(data.contentWidget);
|
|
||||||
_contentsLayout->addWidget(data.contentWidget);
|
|
||||||
|
|
||||||
// Activate first TAB.
|
|
||||||
if (_contents.size() == 1)
|
|
||||||
setCurrentIndex(0);
|
|
||||||
// Switch to just added TAB.
|
|
||||||
else if (autoActivate)
|
|
||||||
setCurrentIndex(_contents.count() - 1);
|
|
||||||
// Mark it as inactive tab.
|
|
||||||
else
|
|
||||||
data.titleWidget->setActiveTab(false); // or: setCurrentIndex(currentIndex())
|
|
||||||
}
|
|
||||||
|
|
||||||
bool SectionWidget::takeContent(int uid, InternalContentData& data)
|
|
||||||
{
|
|
||||||
// Find SectionContent.
|
|
||||||
SectionContent::RefPtr sc;
|
|
||||||
int index = -1;
|
|
||||||
for (int i = 0; i < _contents.count(); i++)
|
|
||||||
{
|
|
||||||
if (_contents[i]->uid() != uid)
|
|
||||||
continue;
|
|
||||||
index = i;
|
|
||||||
sc = _contents.takeAt(i);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (!sc)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Title wrapper widget (TAB)
|
|
||||||
SectionTitleWidget* title = _sectionTitles.takeAt(index);
|
|
||||||
if (title)
|
|
||||||
{
|
|
||||||
_tabsLayout->removeWidget(title);
|
|
||||||
title->disconnect(this);
|
|
||||||
title->setParent(_container);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Content wrapper widget (CONTENT)
|
|
||||||
SectionContentWidget* content = _sectionContents.takeAt(index);
|
|
||||||
if (content)
|
|
||||||
{
|
|
||||||
_contentsLayout->removeWidget(content);
|
|
||||||
content->disconnect(this);
|
|
||||||
content->setParent(_container);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Select the previous tab as activeTab.
|
|
||||||
if (_contents.size() > 0 && title->isActiveTab())
|
|
||||||
{
|
|
||||||
if (index > 0)
|
|
||||||
setCurrentIndex(index - 1);
|
|
||||||
else
|
|
||||||
setCurrentIndex(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
data.content = sc;
|
|
||||||
data.titleWidget = title;
|
|
||||||
data.contentWidget = content;
|
|
||||||
return !data.content.isNull();
|
|
||||||
}
|
|
||||||
|
|
||||||
int SectionWidget::indexOfContent(const SectionContent::RefPtr& c) const
|
|
||||||
{
|
|
||||||
return _contents.indexOf(c);
|
|
||||||
}
|
|
||||||
|
|
||||||
int SectionWidget::indexOfContentByTitlePos(const QPoint& p, QWidget* exclude) const
|
|
||||||
{
|
|
||||||
int index = -1;
|
|
||||||
for (int i = 0; i < _sectionTitles.size(); ++i)
|
|
||||||
{
|
|
||||||
if (_sectionTitles[i]->geometry().contains(p) && (exclude == NULL || _sectionTitles[i] != exclude))
|
|
||||||
{
|
|
||||||
index = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return index;
|
|
||||||
}
|
|
||||||
|
|
||||||
int SectionWidget::currentIndex() const
|
|
||||||
{
|
|
||||||
return _contentsLayout->currentIndex();
|
|
||||||
}
|
|
||||||
|
|
||||||
void SectionWidget::moveContent(int from, int to)
|
|
||||||
{
|
|
||||||
if (from >= _contents.size() || from < 0 || to >= _contents.size() || to < 0 || from == to)
|
|
||||||
{
|
|
||||||
qCritical() << "Invalid index for tab movement" << from << to;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
SectionContent::RefPtr sc = _contents.at(from);
|
|
||||||
_contents.move(from, to);
|
|
||||||
_sectionTitles.move(from, to);
|
|
||||||
_sectionContents.move(from, to);
|
|
||||||
|
|
||||||
QLayoutItem* liFrom = NULL;
|
|
||||||
|
|
||||||
liFrom = _tabsLayout->takeAt(from);
|
|
||||||
#if QT_VERSION >= 0x050000
|
|
||||||
_tabsLayout->insertItem(to, liFrom);
|
|
||||||
#else
|
|
||||||
_tabsLayout->insertWidget(to, liFrom->widget());
|
|
||||||
delete liFrom;
|
|
||||||
liFrom = NULL;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
liFrom = _contentsLayout->takeAt(from);
|
|
||||||
_contentsLayout->insertWidget(to, liFrom->widget());
|
|
||||||
delete liFrom;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SectionWidget::setCurrentIndex(int index)
|
|
||||||
{
|
|
||||||
if (index < 0 || index > _contents.count() - 1)
|
|
||||||
{
|
|
||||||
qWarning() << Q_FUNC_INFO << "Invalid index" << index;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
qDebug() << Q_FUNC_INFO << index << QString("section=%1; content=%2").arg(_uid).arg(_contents.at(index)->uniqueName());
|
|
||||||
|
|
||||||
// Set active TAB
|
|
||||||
for (int i = 0; i < _tabsLayout->count(); ++i)
|
|
||||||
{
|
|
||||||
QLayoutItem* item = _tabsLayout->itemAt(i);
|
|
||||||
if (item->widget())
|
|
||||||
{
|
|
||||||
SectionTitleWidget* stw = dynamic_cast<SectionTitleWidget*>(item->widget());
|
|
||||||
if (stw)
|
|
||||||
{
|
|
||||||
if (i == index)
|
|
||||||
stw->setActiveTab(true);
|
|
||||||
else
|
|
||||||
stw->setActiveTab(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set active CONTENT
|
|
||||||
_contentsLayout->setCurrentIndex(index);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SectionWidget::onSectionTitleClicked()
|
|
||||||
{
|
|
||||||
SectionTitleWidget* stw = qobject_cast<SectionTitleWidget*>(sender());
|
|
||||||
if (stw)
|
|
||||||
{
|
|
||||||
int index = _tabsLayout->indexOf(stw);
|
|
||||||
setCurrentIndex(index);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void SectionWidget::onCloseButtonClicked()
|
|
||||||
{
|
|
||||||
qDebug() << Q_FUNC_INFO << currentIndex();
|
|
||||||
const int index = currentIndex();
|
|
||||||
if (index < 0 || index > _contents.size() - 1)
|
|
||||||
return;
|
|
||||||
SectionContent::RefPtr sc = _contents.at(index);
|
|
||||||
if (sc.isNull())
|
|
||||||
return;
|
|
||||||
_container->hideSectionContent(sc);
|
|
||||||
}
|
|
||||||
|
|
||||||
int SectionWidget::GetNextUid()
|
|
||||||
{
|
|
||||||
static int NextUid = 0;
|
|
||||||
return ++NextUid;
|
|
||||||
}
|
|
||||||
|
|
||||||
//QHash<int, SectionWidget*>& SectionWidget::GetLookupMap()
|
|
||||||
//{
|
|
||||||
// static QHash<int, SectionWidget*> LookupMap;
|
|
||||||
// return LookupMap;
|
|
||||||
|
|
||||||
//}
|
|
||||||
|
|
||||||
//QHash<ContainerWidget*, QHash<int, SectionWidget*> >& SectionWidget::GetLookupMapByContainer()
|
|
||||||
//{
|
|
||||||
// static QHash<ContainerWidget*, QHash<int, SectionWidget*> > LookupMapByContainer;
|
|
||||||
// return LookupMapByContainer;
|
|
||||||
//}
|
|
||||||
|
|
||||||
ADS_NAMESPACE_END
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
TARGET = AdvancedDockingSystemDemo
|
|
||||||
|
|
||||||
QT += core gui
|
|
||||||
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
|
|
||||||
|
|
||||||
TEMPLATE = app
|
|
||||||
|
|
||||||
INCLUDEPATH += $$PWD/src
|
|
||||||
|
|
||||||
greaterThan(QT_MAJOR_VERSION, 4): DEFINES += ADS_NAMESPACE_ENABLED
|
|
||||||
|
|
||||||
windows {
|
|
||||||
# MinGW
|
|
||||||
*-g++* {
|
|
||||||
QMAKE_CXXFLAGS += -std=c++11
|
|
||||||
}
|
|
||||||
# MSVC
|
|
||||||
*-msvc* {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SOURCES += \
|
|
||||||
src/main.cpp \
|
|
||||||
src/mainwindow.cpp \
|
|
||||||
src/icontitlewidget.cpp
|
|
||||||
|
|
||||||
HEADERS += \
|
|
||||||
src/mainwindow.h \
|
|
||||||
src/icontitlewidget.h
|
|
||||||
|
|
||||||
FORMS += \
|
|
||||||
src/mainwindow.ui
|
|
||||||
|
|
||||||
|
|
||||||
# Dependency: AdvancedDockingSystem (staticlib)
|
|
||||||
#win32:CONFIG(release, debug|release): LIBS += -L$$OUT_PWD/../AdvancedDockingSystem/release/ -lAdvancedDockingSystem
|
|
||||||
#else:win32:CONFIG(debug, debug|release): LIBS += -L$$OUT_PWD/../AdvancedDockingSystem/debug/ -lAdvancedDockingSystem
|
|
||||||
#else:unix: LIBS += -L$$OUT_PWD/../AdvancedDockingSystem/ -lAdvancedDockingSystem
|
|
||||||
|
|
||||||
#INCLUDEPATH += $$PWD/../AdvancedDockingSystem/include
|
|
||||||
#DEPENDPATH += $$PWD/../AdvancedDockingSystem/include
|
|
||||||
|
|
||||||
#win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$OUT_PWD/../AdvancedDockingSystem/release/libAdvancedDockingSystem.a
|
|
||||||
#else:win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$OUT_PWD/../AdvancedDockingSystem/debug/libAdvancedDockingSystem.a
|
|
||||||
#else:win32:!win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$OUT_PWD/../AdvancedDockingSystem/release/AdvancedDockingSystem.lib
|
|
||||||
#else:win32:!win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$OUT_PWD/../AdvancedDockingSystem/debug/AdvancedDockingSystem.lib
|
|
||||||
#else:unix: PRE_TARGETDEPS += $$OUT_PWD/../AdvancedDockingSystem/libAdvancedDockingSystem.a
|
|
||||||
|
|
||||||
# Dependency: AdvancedDockingSystem (shared)
|
|
||||||
win32:CONFIG(release, debug|release): LIBS += -L$$OUT_PWD/../AdvancedDockingSystem/release/ -lAdvancedDockingSystem
|
|
||||||
else:win32:CONFIG(debug, debug|release): LIBS += -L$$OUT_PWD/../AdvancedDockingSystem/debug/ -lAdvancedDockingSystem
|
|
||||||
else:unix: LIBS += -L$$OUT_PWD/../AdvancedDockingSystem/ -lAdvancedDockingSystem
|
|
||||||
|
|
||||||
INCLUDEPATH += $$PWD/../AdvancedDockingSystem/include
|
|
||||||
DEPENDPATH += $$PWD/../AdvancedDockingSystem/include
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
#include "icontitlewidget.h"
|
|
||||||
|
|
||||||
#include <QIcon>
|
|
||||||
#include <QString>
|
|
||||||
#include <QBoxLayout>
|
|
||||||
#include <QLabel>
|
|
||||||
#include <QStyle>
|
|
||||||
|
|
||||||
IconTitleWidget::IconTitleWidget(const QIcon& icon, const QString& title, QWidget *parent) :
|
|
||||||
QFrame(parent)
|
|
||||||
{
|
|
||||||
QBoxLayout* l = new QBoxLayout(QBoxLayout::LeftToRight);
|
|
||||||
l->setContentsMargins(0, 0, 0, 0);
|
|
||||||
setLayout(l);
|
|
||||||
|
|
||||||
_iconLabel = new QLabel();
|
|
||||||
l->addWidget(_iconLabel);
|
|
||||||
|
|
||||||
_titleLabel = new QLabel();
|
|
||||||
l->addWidget(_titleLabel, 1);
|
|
||||||
|
|
||||||
setIcon(icon);
|
|
||||||
setTitle(title);
|
|
||||||
}
|
|
||||||
|
|
||||||
void IconTitleWidget::setIcon(const QIcon& icon)
|
|
||||||
{
|
|
||||||
if (icon.isNull())
|
|
||||||
{
|
|
||||||
_iconLabel->setPixmap(QPixmap());
|
|
||||||
_iconLabel->setVisible(false);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_iconLabel->setPixmap(icon.pixmap(16, 16));
|
|
||||||
_iconLabel->setVisible(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void IconTitleWidget::setTitle(const QString& title)
|
|
||||||
{
|
|
||||||
if (title.isEmpty())
|
|
||||||
{
|
|
||||||
_titleLabel->setText(QString());
|
|
||||||
_titleLabel->setVisible(false);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_titleLabel->setText(title);
|
|
||||||
_titleLabel->setVisible(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void IconTitleWidget::polishUpdate()
|
|
||||||
{
|
|
||||||
QList<QWidget*> widgets;
|
|
||||||
widgets.append(_iconLabel);
|
|
||||||
widgets.append(_titleLabel);
|
|
||||||
foreach (QWidget* w, widgets)
|
|
||||||
{
|
|
||||||
w->style()->unpolish(w);
|
|
||||||
w->style()->polish(w);
|
|
||||||
w->update();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
#ifndef ICONTITLEWIDGET_H
|
|
||||||
#define ICONTITLEWIDGET_H
|
|
||||||
|
|
||||||
#include <QFrame>
|
|
||||||
class QIcon;
|
|
||||||
class QString;
|
|
||||||
class QLabel;
|
|
||||||
|
|
||||||
class IconTitleWidget : public QFrame
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
explicit IconTitleWidget(const QIcon& icon, const QString& title, QWidget *parent = 0);
|
|
||||||
|
|
||||||
public slots:
|
|
||||||
void setIcon(const QIcon& icon);
|
|
||||||
void setTitle(const QString& title);
|
|
||||||
void polishUpdate();
|
|
||||||
|
|
||||||
public:
|
|
||||||
QLabel* _iconLabel;
|
|
||||||
QLabel* _titleLabel;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // ICONTITLEWIDGET_H
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
#include <QString>
|
|
||||||
#include <QFile>
|
|
||||||
#include <QApplication>
|
|
||||||
|
|
||||||
#include "mainwindow.h"
|
|
||||||
|
|
||||||
static void initStyleSheet(QApplication& a)
|
|
||||||
{
|
|
||||||
QFile f(":/stylesheets/default-windows.css");
|
|
||||||
// QFile f(":/stylesheets/modern-windows.css");
|
|
||||||
// QFile f(":/stylesheets/vendor-partsolutions.css");
|
|
||||||
if (f.open(QFile::ReadOnly))
|
|
||||||
{
|
|
||||||
QByteArray ba = f.readAll();
|
|
||||||
f.close();
|
|
||||||
a.setStyleSheet(QString(ba));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
QApplication a(argc, argv);
|
|
||||||
//Q_INIT_RESOURCE(ads);
|
|
||||||
a.setQuitOnLastWindowClosed(true);
|
|
||||||
initStyleSheet(a);
|
|
||||||
|
|
||||||
MainWindow mw;
|
|
||||||
mw.show();
|
|
||||||
return a.exec();
|
|
||||||
}
|
|
||||||
@@ -1,157 +0,0 @@
|
|||||||
#include "mainwindow.h"
|
|
||||||
#include "ui_mainwindow.h"
|
|
||||||
|
|
||||||
#include <QTime>
|
|
||||||
#include <QLabel>
|
|
||||||
#include <QTextEdit>
|
|
||||||
#include <QCalendarWidget>
|
|
||||||
#include <QFrame>
|
|
||||||
#include <QTreeView>
|
|
||||||
#include <QFileSystemModel>
|
|
||||||
#include <QBoxLayout>
|
|
||||||
|
|
||||||
#include "ads/SectionWidget.h"
|
|
||||||
|
|
||||||
#include "icontitlewidget.h"
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
static int CONTENT_COUNT = 0;
|
|
||||||
|
|
||||||
static ADS_NS::SectionContent::RefPtr createLongTextLabelSC(ADS_NS::ContainerWidget* container)
|
|
||||||
{
|
|
||||||
QWidget* w = new QWidget();
|
|
||||||
QBoxLayout* bl = new QBoxLayout(QBoxLayout::TopToBottom);
|
|
||||||
w->setLayout(bl);
|
|
||||||
|
|
||||||
QLabel* l = new QLabel();
|
|
||||||
l->setWordWrap(true);
|
|
||||||
l->setAlignment(Qt::AlignTop | Qt::AlignLeft);
|
|
||||||
l->setText(QString("Lorem Ipsum ist ein einfacher Demo-Text für die Print- und Schriftindustrie. Lorem Ipsum ist in der Industrie bereits der Standard Demo-Text seit 1500, als ein unbekannter Schriftsteller eine Hand voll Wörter nahm und diese durcheinander warf um ein Musterbuch zu erstellen. Es hat nicht nur 5 Jahrhunderte überlebt, sondern auch in Spruch in die elektronische Schriftbearbeitung geschafft (bemerke, nahezu unverändert). Bekannt wurde es 1960, mit dem erscheinen von Letrase, welches Passagen von Lorem Ipsum enhielt, so wie Desktop Software wie Aldus PageMaker - ebenfalls mit Lorem Ipsum."));
|
|
||||||
bl->addWidget(l);
|
|
||||||
|
|
||||||
const int index = ++CONTENT_COUNT;
|
|
||||||
ADS_NS::SectionContent::RefPtr sc = ADS_NS::SectionContent::newSectionContent(QString("uname-%1").arg(index), container, new IconTitleWidget(QIcon(), QString("Label %1").arg(index)), w);
|
|
||||||
sc->setTitle("Ein Label " + QString::number(index));
|
|
||||||
return sc;
|
|
||||||
}
|
|
||||||
|
|
||||||
static ADS_NS::SectionContent::RefPtr createCalendarSC(ADS_NS::ContainerWidget* container)
|
|
||||||
{
|
|
||||||
QCalendarWidget* w = new QCalendarWidget();
|
|
||||||
|
|
||||||
const int index = ++CONTENT_COUNT;
|
|
||||||
return ADS_NS::SectionContent::newSectionContent(QString("uname-%1").arg(index), container, new IconTitleWidget(QIcon(), QString("Calendar %1").arg(index)), w);
|
|
||||||
}
|
|
||||||
|
|
||||||
static ADS_NS::SectionContent::RefPtr createFileSystemTreeSC(ADS_NS::ContainerWidget* container)
|
|
||||||
{
|
|
||||||
QTreeView* w = new QTreeView();
|
|
||||||
w->setFrameShape(QFrame::NoFrame);
|
|
||||||
// QFileSystemModel* m = new QFileSystemModel(w);
|
|
||||||
// m->setRootPath(QDir::currentPath());
|
|
||||||
// w->setModel(m);
|
|
||||||
|
|
||||||
const int index = ++CONTENT_COUNT;
|
|
||||||
return ADS_NS::SectionContent::newSectionContent(QString("uname-%1").arg(index), container, new IconTitleWidget(QIcon(), QString("Filesystem %1").arg(index)), w);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void storeDataHelper(const QString& fname, const QByteArray& ba)
|
|
||||||
{
|
|
||||||
QFile f(fname + QString(".dat"));
|
|
||||||
if (f.open(QFile::WriteOnly))
|
|
||||||
{
|
|
||||||
f.write(ba);
|
|
||||||
f.close();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static QByteArray loadDataHelper(const QString& fname)
|
|
||||||
{
|
|
||||||
QFile f(fname + QString(".dat"));
|
|
||||||
if (f.open(QFile::ReadOnly))
|
|
||||||
{
|
|
||||||
QByteArray ba = f.readAll();
|
|
||||||
f.close();
|
|
||||||
return ba;
|
|
||||||
}
|
|
||||||
return QByteArray();
|
|
||||||
}
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
MainWindow::MainWindow(QWidget *parent) :
|
|
||||||
QMainWindow(parent),
|
|
||||||
ui(new Ui::MainWindow)
|
|
||||||
{
|
|
||||||
ui->setupUi(this);
|
|
||||||
|
|
||||||
// ADS - Create main container (ContainerWidget).
|
|
||||||
_container = new ADS_NS::ContainerWidget();
|
|
||||||
_container->setOrientation(Qt::Vertical);
|
|
||||||
#if QT_VERSION >= 0x050000
|
|
||||||
QObject::connect(_container, &ADS_NS::ContainerWidget::activeTabChanged, this, &MainWindow::onActiveTabChanged);
|
|
||||||
#else
|
|
||||||
QObject::connect(_container, SIGNAL(activeTabChanged(const SectionContent::RefPtr&, bool)), this, SLOT(onActiveTabChanged(const SectionContent::RefPtr&, bool)));
|
|
||||||
#endif
|
|
||||||
setCentralWidget(_container);
|
|
||||||
|
|
||||||
// ADS - Adding some contents.
|
|
||||||
// Test #1: Use high-level public API
|
|
||||||
if (true)
|
|
||||||
{
|
|
||||||
ADS_NS::ContainerWidget* cw = _container;
|
|
||||||
ADS_NS::SectionWidget* sw = NULL;
|
|
||||||
|
|
||||||
sw = _container->addSectionContent(createLongTextLabelSC(cw), sw, ADS_NS::CenterDropArea);
|
|
||||||
sw = _container->addSectionContent(createCalendarSC(cw), sw, ADS_NS::RightDropArea);
|
|
||||||
sw = _container->addSectionContent(createFileSystemTreeSC(cw), sw, ADS_NS::CenterDropArea);
|
|
||||||
|
|
||||||
_container->addSectionContent(createCalendarSC(_container));
|
|
||||||
_container->addSectionContent(createLongTextLabelSC(_container));
|
|
||||||
_container->addSectionContent(createLongTextLabelSC(_container));
|
|
||||||
_container->addSectionContent(createLongTextLabelSC(_container));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Default window geometry
|
|
||||||
resize(800, 600);
|
|
||||||
restoreGeometry(loadDataHelper("MainWindow"));
|
|
||||||
|
|
||||||
// ADS - Restore geometries and states of contents.
|
|
||||||
_container->restoreState(loadDataHelper("ContainerWidget"));
|
|
||||||
}
|
|
||||||
|
|
||||||
MainWindow::~MainWindow()
|
|
||||||
{
|
|
||||||
delete ui;
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::onActiveTabChanged(const ADS_NS::SectionContent::RefPtr& sc, bool active)
|
|
||||||
{
|
|
||||||
Q_UNUSED(active);
|
|
||||||
IconTitleWidget* itw = dynamic_cast<IconTitleWidget*>(sc->titleWidget());
|
|
||||||
if (itw)
|
|
||||||
{
|
|
||||||
itw->polishUpdate();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::onActionAddSectionContentTriggered()
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::contextMenuEvent(QContextMenuEvent* e)
|
|
||||||
{
|
|
||||||
Q_UNUSED(e);
|
|
||||||
QMenu* m = _container->createContextMenu();
|
|
||||||
m->exec(QCursor::pos());
|
|
||||||
delete m;
|
|
||||||
}
|
|
||||||
|
|
||||||
void MainWindow::closeEvent(QCloseEvent* e)
|
|
||||||
{
|
|
||||||
Q_UNUSED(e);
|
|
||||||
storeDataHelper("MainWindow", saveGeometry());
|
|
||||||
storeDataHelper("ContainerWidget", _container->saveState());
|
|
||||||
}
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
#ifndef MAINWINDOW_H
|
|
||||||
#define MAINWINDOW_H
|
|
||||||
|
|
||||||
#include <QMainWindow>
|
|
||||||
#include "ads/API.h"
|
|
||||||
#include "ads/ContainerWidget.h"
|
|
||||||
#include "ads/SectionContent.h"
|
|
||||||
|
|
||||||
namespace Ui {
|
|
||||||
class MainWindow;
|
|
||||||
}
|
|
||||||
|
|
||||||
class MainWindow : public QMainWindow
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
public:
|
|
||||||
explicit MainWindow(QWidget *parent = 0);
|
|
||||||
virtual ~MainWindow();
|
|
||||||
|
|
||||||
private slots:
|
|
||||||
#if QT_VERSION >= 0x050000
|
|
||||||
void onActiveTabChanged(const ADS_NS::SectionContent::RefPtr& sc, bool active);
|
|
||||||
#else
|
|
||||||
void onActiveTabChanged(const SectionContent::RefPtr& sc, bool active);
|
|
||||||
#endif
|
|
||||||
void onActionAddSectionContentTriggered();
|
|
||||||
|
|
||||||
protected:
|
|
||||||
virtual void contextMenuEvent(QContextMenuEvent* e);
|
|
||||||
virtual void closeEvent(QCloseEvent* e);
|
|
||||||
|
|
||||||
private:
|
|
||||||
Ui::MainWindow *ui;
|
|
||||||
ADS_NS::ContainerWidget* _container;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // MAINWINDOW_H
|
|
||||||
61
CMakeLists.txt
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.16)
|
||||||
|
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||||
|
if (POLICY CMP0091)
|
||||||
|
cmake_policy(SET CMP0091 NEW)
|
||||||
|
endif (POLICY CMP0091)
|
||||||
|
|
||||||
|
# Add cmake modules path (required for Versioning.cmake and git revision description)
|
||||||
|
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules ${CMAKE_MODULE_PATH})
|
||||||
|
|
||||||
|
# By default, the version information is extracted from the git index. However,
|
||||||
|
# we can override this behavior by explicitly setting ADS_VERSION and
|
||||||
|
# skipping the git checks. This is useful for cases where this project is being
|
||||||
|
# used independently of its original git repo (e.g. vendored in another project)
|
||||||
|
if(NOT ADS_VERSION)
|
||||||
|
include(GetGitRevisionDescription)
|
||||||
|
git_describe(GitTagVersion --tags)
|
||||||
|
string(REGEX REPLACE "^([0-9]+)\\..*" "\\1" VERSION_MAJOR "${GitTagVersion}")
|
||||||
|
string(REGEX REPLACE "^[0-9]+\\.([0-9]+).*" "\\1" VERSION_MINOR "${GitTagVersion}")
|
||||||
|
string(REGEX REPLACE "^[0-9]+\\.[0-9]+\\.([0-9]+).*" "\\1" VERSION_PATCH "${GitTagVersion}")
|
||||||
|
set(VERSION_SHORT "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}")
|
||||||
|
set(VERSION_SONAME "${VERSION_MAJOR}")
|
||||||
|
else()
|
||||||
|
string(REGEX MATCHALL "[\.]" VERSION_DOT_MATCHES ${ADS_VERSION})
|
||||||
|
list(LENGTH VERSION_DOT_MATCHES VERSION_DOT_COUNT)
|
||||||
|
if(VERSION_DOT_COUNT EQUAL 2)
|
||||||
|
set(VERSION_SHORT ${ADS_VERSION})
|
||||||
|
string(REGEX REPLACE "^([0-9]+)\\..*" "\\1" VERSION_SONAME "${ADS_VERSION}")
|
||||||
|
# Set PROJECT_VERSION_* variables for Versioning.cmake
|
||||||
|
string(REGEX MATCHALL "[0-9]+" VERSION_PARTS "${ADS_VERSION}")
|
||||||
|
list(GET VERSION_PARTS 0 PROJECT_VERSION_MAJOR)
|
||||||
|
list(GET VERSION_PARTS 1 PROJECT_VERSION_MINOR)
|
||||||
|
list(GET VERSION_PARTS 2 PROJECT_VERSION_PATCH)
|
||||||
|
else()
|
||||||
|
message(FATAL_ERROR "ADS_VERSION must be in major.minor.patch format, e.g. 3.8.1. Got ${ADS_VERSION}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
project(QtADS LANGUAGES CXX VERSION ${VERSION_SHORT})
|
||||||
|
|
||||||
|
option(BUILD_STATIC "Build the static library" OFF)
|
||||||
|
option(BUILD_EXAMPLES "Build the examples" ON)
|
||||||
|
|
||||||
|
# Platform directory: auto-detected based on pointer size, or manually set
|
||||||
|
if(NOT ADS_PLATFORM_DIR)
|
||||||
|
if("${CMAKE_SIZEOF_VOID_P}" STREQUAL "4")
|
||||||
|
set(ads_PlatformDir "x86")
|
||||||
|
else()
|
||||||
|
set(ads_PlatformDir "x64")
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
set(ads_PlatformDir "${ADS_PLATFORM_DIR}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_subdirectory(src)
|
||||||
|
|
||||||
|
if(BUILD_EXAMPLES)
|
||||||
|
add_subdirectory(examples)
|
||||||
|
add_subdirectory(demo)
|
||||||
|
endif()
|
||||||
|
|
||||||
504
LICENSE
Normal file
@@ -0,0 +1,504 @@
|
|||||||
|
GNU LESSER GENERAL PUBLIC LICENSE
|
||||||
|
Version 2.1, February 1999
|
||||||
|
|
||||||
|
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
|
||||||
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
[This is the first released version of the Lesser GPL. It also counts
|
||||||
|
as the successor of the GNU Library Public License, version 2, hence
|
||||||
|
the version number 2.1.]
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
|
||||||
|
The licenses for most software are designed to take away your
|
||||||
|
freedom to share and change it. By contrast, the GNU General Public
|
||||||
|
Licenses are intended to guarantee your freedom to share and change
|
||||||
|
free software--to make sure the software is free for all its users.
|
||||||
|
|
||||||
|
This license, the Lesser General Public License, applies to some
|
||||||
|
specially designated software packages--typically libraries--of the
|
||||||
|
Free Software Foundation and other authors who decide to use it. You
|
||||||
|
can use it too, but we suggest you first think carefully about whether
|
||||||
|
this license or the ordinary General Public License is the better
|
||||||
|
strategy to use in any particular case, based on the explanations below.
|
||||||
|
|
||||||
|
When we speak of free software, we are referring to freedom of use,
|
||||||
|
not price. Our General Public Licenses are designed to make sure that
|
||||||
|
you have the freedom to distribute copies of free software (and charge
|
||||||
|
for this service if you wish); that you receive source code or can get
|
||||||
|
it if you want it; that you can change the software and use pieces of
|
||||||
|
it in new free programs; and that you are informed that you can do
|
||||||
|
these things.
|
||||||
|
|
||||||
|
To protect your rights, we need to make restrictions that forbid
|
||||||
|
distributors to deny you these rights or to ask you to surrender these
|
||||||
|
rights. These restrictions translate to certain responsibilities for
|
||||||
|
you if you distribute copies of the library or if you modify it.
|
||||||
|
|
||||||
|
For example, if you distribute copies of the library, whether gratis
|
||||||
|
or for a fee, you must give the recipients all the rights that we gave
|
||||||
|
you. You must make sure that they, too, receive or can get the source
|
||||||
|
code. If you link other code with the library, you must provide
|
||||||
|
complete object files to the recipients, so that they can relink them
|
||||||
|
with the library after making changes to the library and recompiling
|
||||||
|
it. And you must show them these terms so they know their rights.
|
||||||
|
|
||||||
|
We protect your rights with a two-step method: (1) we copyright the
|
||||||
|
library, and (2) we offer you this license, which gives you legal
|
||||||
|
permission to copy, distribute and/or modify the library.
|
||||||
|
|
||||||
|
To protect each distributor, we want to make it very clear that
|
||||||
|
there is no warranty for the free library. Also, if the library is
|
||||||
|
modified by someone else and passed on, the recipients should know
|
||||||
|
that what they have is not the original version, so that the original
|
||||||
|
author's reputation will not be affected by problems that might be
|
||||||
|
introduced by others.
|
||||||
|
|
||||||
|
Finally, software patents pose a constant threat to the existence of
|
||||||
|
any free program. We wish to make sure that a company cannot
|
||||||
|
effectively restrict the users of a free program by obtaining a
|
||||||
|
restrictive license from a patent holder. Therefore, we insist that
|
||||||
|
any patent license obtained for a version of the library must be
|
||||||
|
consistent with the full freedom of use specified in this license.
|
||||||
|
|
||||||
|
Most GNU software, including some libraries, is covered by the
|
||||||
|
ordinary GNU General Public License. This license, the GNU Lesser
|
||||||
|
General Public License, applies to certain designated libraries, and
|
||||||
|
is quite different from the ordinary General Public License. We use
|
||||||
|
this license for certain libraries in order to permit linking those
|
||||||
|
libraries into non-free programs.
|
||||||
|
|
||||||
|
When a program is linked with a library, whether statically or using
|
||||||
|
a shared library, the combination of the two is legally speaking a
|
||||||
|
combined work, a derivative of the original library. The ordinary
|
||||||
|
General Public License therefore permits such linking only if the
|
||||||
|
entire combination fits its criteria of freedom. The Lesser General
|
||||||
|
Public License permits more lax criteria for linking other code with
|
||||||
|
the library.
|
||||||
|
|
||||||
|
We call this license the "Lesser" General Public License because it
|
||||||
|
does Less to protect the user's freedom than the ordinary General
|
||||||
|
Public License. It also provides other free software developers Less
|
||||||
|
of an advantage over competing non-free programs. These disadvantages
|
||||||
|
are the reason we use the ordinary General Public License for many
|
||||||
|
libraries. However, the Lesser license provides advantages in certain
|
||||||
|
special circumstances.
|
||||||
|
|
||||||
|
For example, on rare occasions, there may be a special need to
|
||||||
|
encourage the widest possible use of a certain library, so that it becomes
|
||||||
|
a de-facto standard. To achieve this, non-free programs must be
|
||||||
|
allowed to use the library. A more frequent case is that a free
|
||||||
|
library does the same job as widely used non-free libraries. In this
|
||||||
|
case, there is little to gain by limiting the free library to free
|
||||||
|
software only, so we use the Lesser General Public License.
|
||||||
|
|
||||||
|
In other cases, permission to use a particular library in non-free
|
||||||
|
programs enables a greater number of people to use a large body of
|
||||||
|
free software. For example, permission to use the GNU C Library in
|
||||||
|
non-free programs enables many more people to use the whole GNU
|
||||||
|
operating system, as well as its variant, the GNU/Linux operating
|
||||||
|
system.
|
||||||
|
|
||||||
|
Although the Lesser General Public License is Less protective of the
|
||||||
|
users' freedom, it does ensure that the user of a program that is
|
||||||
|
linked with the Library has the freedom and the wherewithal to run
|
||||||
|
that program using a modified version of the Library.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and
|
||||||
|
modification follow. Pay close attention to the difference between a
|
||||||
|
"work based on the library" and a "work that uses the library". The
|
||||||
|
former contains code derived from the library, whereas the latter must
|
||||||
|
be combined with the library in order to run.
|
||||||
|
|
||||||
|
GNU LESSER GENERAL PUBLIC LICENSE
|
||||||
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
|
0. This License Agreement applies to any software library or other
|
||||||
|
program which contains a notice placed by the copyright holder or
|
||||||
|
other authorized party saying it may be distributed under the terms of
|
||||||
|
this Lesser General Public License (also called "this License").
|
||||||
|
Each licensee is addressed as "you".
|
||||||
|
|
||||||
|
A "library" means a collection of software functions and/or data
|
||||||
|
prepared so as to be conveniently linked with application programs
|
||||||
|
(which use some of those functions and data) to form executables.
|
||||||
|
|
||||||
|
The "Library", below, refers to any such software library or work
|
||||||
|
which has been distributed under these terms. A "work based on the
|
||||||
|
Library" means either the Library or any derivative work under
|
||||||
|
copyright law: that is to say, a work containing the Library or a
|
||||||
|
portion of it, either verbatim or with modifications and/or translated
|
||||||
|
straightforwardly into another language. (Hereinafter, translation is
|
||||||
|
included without limitation in the term "modification".)
|
||||||
|
|
||||||
|
"Source code" for a work means the preferred form of the work for
|
||||||
|
making modifications to it. For a library, complete source code means
|
||||||
|
all the source code for all modules it contains, plus any associated
|
||||||
|
interface definition files, plus the scripts used to control compilation
|
||||||
|
and installation of the library.
|
||||||
|
|
||||||
|
Activities other than copying, distribution and modification are not
|
||||||
|
covered by this License; they are outside its scope. The act of
|
||||||
|
running a program using the Library is not restricted, and output from
|
||||||
|
such a program is covered only if its contents constitute a work based
|
||||||
|
on the Library (independent of the use of the Library in a tool for
|
||||||
|
writing it). Whether that is true depends on what the Library does
|
||||||
|
and what the program that uses the Library does.
|
||||||
|
|
||||||
|
1. You may copy and distribute verbatim copies of the Library's
|
||||||
|
complete source code as you receive it, in any medium, provided that
|
||||||
|
you conspicuously and appropriately publish on each copy an
|
||||||
|
appropriate copyright notice and disclaimer of warranty; keep intact
|
||||||
|
all the notices that refer to this License and to the absence of any
|
||||||
|
warranty; and distribute a copy of this License along with the
|
||||||
|
Library.
|
||||||
|
|
||||||
|
You may charge a fee for the physical act of transferring a copy,
|
||||||
|
and you may at your option offer warranty protection in exchange for a
|
||||||
|
fee.
|
||||||
|
|
||||||
|
2. You may modify your copy or copies of the Library or any portion
|
||||||
|
of it, thus forming a work based on the Library, and copy and
|
||||||
|
distribute such modifications or work under the terms of Section 1
|
||||||
|
above, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
|
a) The modified work must itself be a software library.
|
||||||
|
|
||||||
|
b) You must cause the files modified to carry prominent notices
|
||||||
|
stating that you changed the files and the date of any change.
|
||||||
|
|
||||||
|
c) You must cause the whole of the work to be licensed at no
|
||||||
|
charge to all third parties under the terms of this License.
|
||||||
|
|
||||||
|
d) If a facility in the modified Library refers to a function or a
|
||||||
|
table of data to be supplied by an application program that uses
|
||||||
|
the facility, other than as an argument passed when the facility
|
||||||
|
is invoked, then you must make a good faith effort to ensure that,
|
||||||
|
in the event an application does not supply such function or
|
||||||
|
table, the facility still operates, and performs whatever part of
|
||||||
|
its purpose remains meaningful.
|
||||||
|
|
||||||
|
(For example, a function in a library to compute square roots has
|
||||||
|
a purpose that is entirely well-defined independent of the
|
||||||
|
application. Therefore, Subsection 2d requires that any
|
||||||
|
application-supplied function or table used by this function must
|
||||||
|
be optional: if the application does not supply it, the square
|
||||||
|
root function must still compute square roots.)
|
||||||
|
|
||||||
|
These requirements apply to the modified work as a whole. If
|
||||||
|
identifiable sections of that work are not derived from the Library,
|
||||||
|
and can be reasonably considered independent and separate works in
|
||||||
|
themselves, then this License, and its terms, do not apply to those
|
||||||
|
sections when you distribute them as separate works. But when you
|
||||||
|
distribute the same sections as part of a whole which is a work based
|
||||||
|
on the Library, the distribution of the whole must be on the terms of
|
||||||
|
this License, whose permissions for other licensees extend to the
|
||||||
|
entire whole, and thus to each and every part regardless of who wrote
|
||||||
|
it.
|
||||||
|
|
||||||
|
Thus, it is not the intent of this section to claim rights or contest
|
||||||
|
your rights to work written entirely by you; rather, the intent is to
|
||||||
|
exercise the right to control the distribution of derivative or
|
||||||
|
collective works based on the Library.
|
||||||
|
|
||||||
|
In addition, mere aggregation of another work not based on the Library
|
||||||
|
with the Library (or with a work based on the Library) on a volume of
|
||||||
|
a storage or distribution medium does not bring the other work under
|
||||||
|
the scope of this License.
|
||||||
|
|
||||||
|
3. You may opt to apply the terms of the ordinary GNU General Public
|
||||||
|
License instead of this License to a given copy of the Library. To do
|
||||||
|
this, you must alter all the notices that refer to this License, so
|
||||||
|
that they refer to the ordinary GNU General Public License, version 2,
|
||||||
|
instead of to this License. (If a newer version than version 2 of the
|
||||||
|
ordinary GNU General Public License has appeared, then you can specify
|
||||||
|
that version instead if you wish.) Do not make any other change in
|
||||||
|
these notices.
|
||||||
|
|
||||||
|
Once this change is made in a given copy, it is irreversible for
|
||||||
|
that copy, so the ordinary GNU General Public License applies to all
|
||||||
|
subsequent copies and derivative works made from that copy.
|
||||||
|
|
||||||
|
This option is useful when you wish to copy part of the code of
|
||||||
|
the Library into a program that is not a library.
|
||||||
|
|
||||||
|
4. You may copy and distribute the Library (or a portion or
|
||||||
|
derivative of it, under Section 2) in object code or executable form
|
||||||
|
under the terms of Sections 1 and 2 above provided that you accompany
|
||||||
|
it with the complete corresponding machine-readable source code, which
|
||||||
|
must be distributed under the terms of Sections 1 and 2 above on a
|
||||||
|
medium customarily used for software interchange.
|
||||||
|
|
||||||
|
If distribution of object code is made by offering access to copy
|
||||||
|
from a designated place, then offering equivalent access to copy the
|
||||||
|
source code from the same place satisfies the requirement to
|
||||||
|
distribute the source code, even though third parties are not
|
||||||
|
compelled to copy the source along with the object code.
|
||||||
|
|
||||||
|
5. A program that contains no derivative of any portion of the
|
||||||
|
Library, but is designed to work with the Library by being compiled or
|
||||||
|
linked with it, is called a "work that uses the Library". Such a
|
||||||
|
work, in isolation, is not a derivative work of the Library, and
|
||||||
|
therefore falls outside the scope of this License.
|
||||||
|
|
||||||
|
However, linking a "work that uses the Library" with the Library
|
||||||
|
creates an executable that is a derivative of the Library (because it
|
||||||
|
contains portions of the Library), rather than a "work that uses the
|
||||||
|
library". The executable is therefore covered by this License.
|
||||||
|
Section 6 states terms for distribution of such executables.
|
||||||
|
|
||||||
|
When a "work that uses the Library" uses material from a header file
|
||||||
|
that is part of the Library, the object code for the work may be a
|
||||||
|
derivative work of the Library even though the source code is not.
|
||||||
|
Whether this is true is especially significant if the work can be
|
||||||
|
linked without the Library, or if the work is itself a library. The
|
||||||
|
threshold for this to be true is not precisely defined by law.
|
||||||
|
|
||||||
|
If such an object file uses only numerical parameters, data
|
||||||
|
structure layouts and accessors, and small macros and small inline
|
||||||
|
functions (ten lines or less in length), then the use of the object
|
||||||
|
file is unrestricted, regardless of whether it is legally a derivative
|
||||||
|
work. (Executables containing this object code plus portions of the
|
||||||
|
Library will still fall under Section 6.)
|
||||||
|
|
||||||
|
Otherwise, if the work is a derivative of the Library, you may
|
||||||
|
distribute the object code for the work under the terms of Section 6.
|
||||||
|
Any executables containing that work also fall under Section 6,
|
||||||
|
whether or not they are linked directly with the Library itself.
|
||||||
|
|
||||||
|
6. As an exception to the Sections above, you may also combine or
|
||||||
|
link a "work that uses the Library" with the Library to produce a
|
||||||
|
work containing portions of the Library, and distribute that work
|
||||||
|
under terms of your choice, provided that the terms permit
|
||||||
|
modification of the work for the customer's own use and reverse
|
||||||
|
engineering for debugging such modifications.
|
||||||
|
|
||||||
|
You must give prominent notice with each copy of the work that the
|
||||||
|
Library is used in it and that the Library and its use are covered by
|
||||||
|
this License. You must supply a copy of this License. If the work
|
||||||
|
during execution displays copyright notices, you must include the
|
||||||
|
copyright notice for the Library among them, as well as a reference
|
||||||
|
directing the user to the copy of this License. Also, you must do one
|
||||||
|
of these things:
|
||||||
|
|
||||||
|
a) Accompany the work with the complete corresponding
|
||||||
|
machine-readable source code for the Library including whatever
|
||||||
|
changes were used in the work (which must be distributed under
|
||||||
|
Sections 1 and 2 above); and, if the work is an executable linked
|
||||||
|
with the Library, with the complete machine-readable "work that
|
||||||
|
uses the Library", as object code and/or source code, so that the
|
||||||
|
user can modify the Library and then relink to produce a modified
|
||||||
|
executable containing the modified Library. (It is understood
|
||||||
|
that the user who changes the contents of definitions files in the
|
||||||
|
Library will not necessarily be able to recompile the application
|
||||||
|
to use the modified definitions.)
|
||||||
|
|
||||||
|
b) Use a suitable shared library mechanism for linking with the
|
||||||
|
Library. A suitable mechanism is one that (1) uses at run time a
|
||||||
|
copy of the library already present on the user's computer system,
|
||||||
|
rather than copying library functions into the executable, and (2)
|
||||||
|
will operate properly with a modified version of the library, if
|
||||||
|
the user installs one, as long as the modified version is
|
||||||
|
interface-compatible with the version that the work was made with.
|
||||||
|
|
||||||
|
c) Accompany the work with a written offer, valid for at
|
||||||
|
least three years, to give the same user the materials
|
||||||
|
specified in Subsection 6a, above, for a charge no more
|
||||||
|
than the cost of performing this distribution.
|
||||||
|
|
||||||
|
d) If distribution of the work is made by offering access to copy
|
||||||
|
from a designated place, offer equivalent access to copy the above
|
||||||
|
specified materials from the same place.
|
||||||
|
|
||||||
|
e) Verify that the user has already received a copy of these
|
||||||
|
materials or that you have already sent this user a copy.
|
||||||
|
|
||||||
|
For an executable, the required form of the "work that uses the
|
||||||
|
Library" must include any data and utility programs needed for
|
||||||
|
reproducing the executable from it. However, as a special exception,
|
||||||
|
the materials to be distributed need not include anything that is
|
||||||
|
normally distributed (in either source or binary form) with the major
|
||||||
|
components (compiler, kernel, and so on) of the operating system on
|
||||||
|
which the executable runs, unless that component itself accompanies
|
||||||
|
the executable.
|
||||||
|
|
||||||
|
It may happen that this requirement contradicts the license
|
||||||
|
restrictions of other proprietary libraries that do not normally
|
||||||
|
accompany the operating system. Such a contradiction means you cannot
|
||||||
|
use both them and the Library together in an executable that you
|
||||||
|
distribute.
|
||||||
|
|
||||||
|
7. You may place library facilities that are a work based on the
|
||||||
|
Library side-by-side in a single library together with other library
|
||||||
|
facilities not covered by this License, and distribute such a combined
|
||||||
|
library, provided that the separate distribution of the work based on
|
||||||
|
the Library and of the other library facilities is otherwise
|
||||||
|
permitted, and provided that you do these two things:
|
||||||
|
|
||||||
|
a) Accompany the combined library with a copy of the same work
|
||||||
|
based on the Library, uncombined with any other library
|
||||||
|
facilities. This must be distributed under the terms of the
|
||||||
|
Sections above.
|
||||||
|
|
||||||
|
b) Give prominent notice with the combined library of the fact
|
||||||
|
that part of it is a work based on the Library, and explaining
|
||||||
|
where to find the accompanying uncombined form of the same work.
|
||||||
|
|
||||||
|
8. You may not copy, modify, sublicense, link with, or distribute
|
||||||
|
the Library except as expressly provided under this License. Any
|
||||||
|
attempt otherwise to copy, modify, sublicense, link with, or
|
||||||
|
distribute the Library is void, and will automatically terminate your
|
||||||
|
rights under this License. However, parties who have received copies,
|
||||||
|
or rights, from you under this License will not have their licenses
|
||||||
|
terminated so long as such parties remain in full compliance.
|
||||||
|
|
||||||
|
9. You are not required to accept this License, since you have not
|
||||||
|
signed it. However, nothing else grants you permission to modify or
|
||||||
|
distribute the Library or its derivative works. These actions are
|
||||||
|
prohibited by law if you do not accept this License. Therefore, by
|
||||||
|
modifying or distributing the Library (or any work based on the
|
||||||
|
Library), you indicate your acceptance of this License to do so, and
|
||||||
|
all its terms and conditions for copying, distributing or modifying
|
||||||
|
the Library or works based on it.
|
||||||
|
|
||||||
|
10. Each time you redistribute the Library (or any work based on the
|
||||||
|
Library), the recipient automatically receives a license from the
|
||||||
|
original licensor to copy, distribute, link with or modify the Library
|
||||||
|
subject to these terms and conditions. You may not impose any further
|
||||||
|
restrictions on the recipients' exercise of the rights granted herein.
|
||||||
|
You are not responsible for enforcing compliance by third parties with
|
||||||
|
this License.
|
||||||
|
|
||||||
|
11. If, as a consequence of a court judgment or allegation of patent
|
||||||
|
infringement or for any other reason (not limited to patent issues),
|
||||||
|
conditions are imposed on you (whether by court order, agreement or
|
||||||
|
otherwise) that contradict the conditions of this License, they do not
|
||||||
|
excuse you from the conditions of this License. If you cannot
|
||||||
|
distribute so as to satisfy simultaneously your obligations under this
|
||||||
|
License and any other pertinent obligations, then as a consequence you
|
||||||
|
may not distribute the Library at all. For example, if a patent
|
||||||
|
license would not permit royalty-free redistribution of the Library by
|
||||||
|
all those who receive copies directly or indirectly through you, then
|
||||||
|
the only way you could satisfy both it and this License would be to
|
||||||
|
refrain entirely from distribution of the Library.
|
||||||
|
|
||||||
|
If any portion of this section is held invalid or unenforceable under any
|
||||||
|
particular circumstance, the balance of the section is intended to apply,
|
||||||
|
and the section as a whole is intended to apply in other circumstances.
|
||||||
|
|
||||||
|
It is not the purpose of this section to induce you to infringe any
|
||||||
|
patents or other property right claims or to contest validity of any
|
||||||
|
such claims; this section has the sole purpose of protecting the
|
||||||
|
integrity of the free software distribution system which is
|
||||||
|
implemented by public license practices. Many people have made
|
||||||
|
generous contributions to the wide range of software distributed
|
||||||
|
through that system in reliance on consistent application of that
|
||||||
|
system; it is up to the author/donor to decide if he or she is willing
|
||||||
|
to distribute software through any other system and a licensee cannot
|
||||||
|
impose that choice.
|
||||||
|
|
||||||
|
This section is intended to make thoroughly clear what is believed to
|
||||||
|
be a consequence of the rest of this License.
|
||||||
|
|
||||||
|
12. If the distribution and/or use of the Library is restricted in
|
||||||
|
certain countries either by patents or by copyrighted interfaces, the
|
||||||
|
original copyright holder who places the Library under this License may add
|
||||||
|
an explicit geographical distribution limitation excluding those countries,
|
||||||
|
so that distribution is permitted only in or among countries not thus
|
||||||
|
excluded. In such case, this License incorporates the limitation as if
|
||||||
|
written in the body of this License.
|
||||||
|
|
||||||
|
13. The Free Software Foundation may publish revised and/or new
|
||||||
|
versions of the Lesser General Public License from time to time.
|
||||||
|
Such new versions will be similar in spirit to the present version,
|
||||||
|
but may differ in detail to address new problems or concerns.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the Library
|
||||||
|
specifies a version number of this License which applies to it and
|
||||||
|
"any later version", you have the option of following the terms and
|
||||||
|
conditions either of that version or of any later version published by
|
||||||
|
the Free Software Foundation. If the Library does not specify a
|
||||||
|
license version number, you may choose any version ever published by
|
||||||
|
the Free Software Foundation.
|
||||||
|
|
||||||
|
14. If you wish to incorporate parts of the Library into other free
|
||||||
|
programs whose distribution conditions are incompatible with these,
|
||||||
|
write to the author to ask for permission. For software which is
|
||||||
|
copyrighted by the Free Software Foundation, write to the Free
|
||||||
|
Software Foundation; we sometimes make exceptions for this. Our
|
||||||
|
decision will be guided by the two goals of preserving the free status
|
||||||
|
of all derivatives of our free software and of promoting the sharing
|
||||||
|
and reuse of software generally.
|
||||||
|
|
||||||
|
NO WARRANTY
|
||||||
|
|
||||||
|
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
|
||||||
|
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
||||||
|
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
|
||||||
|
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
|
||||||
|
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
|
||||||
|
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
|
||||||
|
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||||
|
|
||||||
|
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
|
||||||
|
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
|
||||||
|
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
|
||||||
|
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
|
||||||
|
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
|
||||||
|
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
|
||||||
|
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
|
||||||
|
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
||||||
|
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||||
|
DAMAGES.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
How to Apply These Terms to Your New Libraries
|
||||||
|
|
||||||
|
If you develop a new library, and you want it to be of the greatest
|
||||||
|
possible use to the public, we recommend making it free software that
|
||||||
|
everyone can redistribute and change. You can do so by permitting
|
||||||
|
redistribution under these terms (or, alternatively, under the terms of the
|
||||||
|
ordinary General Public License).
|
||||||
|
|
||||||
|
To apply these terms, attach the following notices to the library. It is
|
||||||
|
safest to attach them to the start of each source file to most effectively
|
||||||
|
convey the exclusion of warranty; and each file should have at least the
|
||||||
|
"copyright" line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
|
<one line to give the library's name and a brief idea of what it does.>
|
||||||
|
Copyright (C) <year> <name of author>
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this library; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
|
||||||
|
USA
|
||||||
|
|
||||||
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
|
You should also get your employer (if you work as a programmer) or your
|
||||||
|
school, if any, to sign a "copyright disclaimer" for the library, if
|
||||||
|
necessary. Here is a sample; alter the names:
|
||||||
|
|
||||||
|
Yoyodyne, Inc., hereby disclaims all copyright interest in the
|
||||||
|
library `Frob' (a library for tweaking knobs) written by James Random
|
||||||
|
Hacker.
|
||||||
|
|
||||||
|
<signature of Ty Coon>, 1 April 1990
|
||||||
|
Ty Coon, President of Vice
|
||||||
|
|
||||||
|
That's all there is to it!
|
||||||
2
MANIFEST.in
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
include versioneer.py
|
||||||
|
include PyQtAds/_version.py
|
||||||
861
README.md
@@ -1,78 +1,783 @@
|
|||||||
# Advanced Docking System
|

|
||||||
Manages content widgets more like Visual Studio or similar programs.
|
|
||||||
I also try to get everything done with basic Qt functionality.
|

|
||||||
Basic usage of QWidgets an QLayouts and using basic styles as much as possible.
|
|
||||||
|
------------------
|
||||||

|
|
||||||

|
[](https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System/releases/latest)
|
||||||
|
[](gnu-lgpl-v2.1.md)
|
||||||
## Tested Compatible Environments
|
[](https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System/actions?query=workflow%3Alinux-builds)
|
||||||
- Windows 10 / Qt 5.5.1 / VC12
|
[](https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System/actions/workflows/windows-cmake.yml)
|
||||||
- Windows 10 / Qt 5.5.1 / MinGW
|
[](https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System/graphs/contributors)
|
||||||
- Windows 10 / Qt 4.5.3 / VC9
|
|
||||||
- Ubuntu 15.10
|
Qt Advanced Docking System lets you create customizable layouts using a full
|
||||||
|
featured window docking system similar to what is found in many popular
|
||||||
## Build
|
integrated development environments (IDEs) such as Visual Studio.
|
||||||
Open the `build.pro` with QtCreator and start the build, that's it.
|
|
||||||
You can run the demo project and test it yourself.
|
- [What's new...](https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System/releases/latest)
|
||||||
|
- [Documentation](https://githubuser0xffff.github.io/Qt-Advanced-Docking-System/doc/user-guide.html)
|
||||||
## Release & Development
|
- Original Repository: [https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System](https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System)
|
||||||
The `master` branch is not guaranteed to be stable or does not even build, since it is the main working branch.
|
|
||||||
If you want a version that builds, you should always use a release/beta tag.
|
[](https://www.youtube.com/watch?v=7pdNfafg3Qc)
|
||||||
|
|
||||||
## Developers
|
## New and Noteworthy
|
||||||
[Manuel Freiholz](https://mfreiholz.de), Project Maintainer
|
|
||||||
|
### Release 4.5
|
||||||
## License information
|
|
||||||

|
#### Tabs at Bottom
|
||||||
|
|
||||||
This projects uses the [WTFPL license](http://www.wtfpl.net/)
|
A new global dock manager flag `TabsAtBottom` has been added to configuration flags. This flag allows to configure if the tabs of dock areas are shown at the top (default) or at the bottom of the respective container.
|
||||||
(Do **W**hat **T**he **F**uck You Want To **P**ublic **L**icense)
|
|
||||||
|
If the flag is set, tabs will be shown at the bottom instead of in the title bar.
|
||||||
Using it? Let us know by creating a [new issue](https://github.com/mfreiholz/qt-docks/issues/new) (You don't have to, of course).
|
|
||||||
|

|
||||||
## Credits
|
|
||||||
- Drop indicator images from [Code Project Article](http://www.codeproject.com/Articles/140209/Building-a-Docking-Window-Management-Solution-in-W)
|
### Release 4.1
|
||||||
|
|
||||||
## ToDo List & Changelog
|
Release [4.1](https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System/releases/latest) significantly improves the Auto-Hide functionality and also brings improvements
|
||||||
Items sorted by priority
|
for Drag and Drop of dock widgets into dock area tabs. These are the highlights of the new version:
|
||||||
|
|
||||||
### Beta 0.2
|
#### Drag & Drop to Auto-Hide
|
||||||
- [ ] Use scrolling for SectionWidget tabs?
|
|
||||||
- [ ] It would be easier when the SectionTitleWidget and SectionContentWidget are created inside the "SectionContent::newSectionContent(..)" method.
|
Now you can easily drag any dock widget or any floating widget to the
|
||||||
This would make sure, that those two objects always exists.
|
borders of a window to pin it as a auto-hide tab in one of the 4 sidebars.
|
||||||
- [ ] `ContainerWidget::showSectionContent` needs to insert the SC at the correct preferred position of SW
|
If you drag a dock widget close the one of the four window borders, special
|
||||||
- [ ] It should be possible to drop a floating widget directly into the SW's tab-bar.
|
drop overlays will be shown to indicate the drop area for auto-hide widgets:
|
||||||
- [ ] Empty splitters, if only 2 or 1 items are in container
|
|
||||||
- [ ] Restore: Handle out-of-screen geometry for floating widgets
|

|
||||||
- [ ] Better handling of sizes when dropping contents. Currently it's unpredictable.
|
|
||||||
It might be good to use the same width/height as the parent content, if dropped on existing content.
|
Of course, this also works with dock areas:
|
||||||
In case of outer-drop we might use the preferred size of the content.
|
|
||||||
- [ ] Floating widget should be a real window with all of its functionality (maximize and split by moving it to the edge of the screen)
|

|
||||||
|
|
||||||
### Beta 0.1
|
If you drag a dock widget or dock area into a sidebar, then you even have
|
||||||
- [x] Improve FloatingWidget (Remove maximize button, only support close-button which hides the widget)
|
control over where tabs are inserted. Simply drag your mouse over a specific
|
||||||
- [x] Serialize and Deserialize state/size/positions of dockings
|
auto-hide tab, and your dragged dock widget will be inserted before this tab.
|
||||||
- [x] Make compatible with Qt 4.5 (\*ROFL!\*)
|
Drag to the sidebar area behind the last tab, and the dragged widget will be
|
||||||
- [x] Save and restore FloatingWidget states
|
appended as last tab. In the following screen capture, the **Image Viewer 1** will
|
||||||
- [x] Restore: Manage new or deleted SectionContent objects, which are not available
|
be inserted before the **Table 0** Auto-Hide tab and the **Image Viewer 2**
|
||||||
- [x] Working with outer-edge-drops sometimes leaves empty splitters #BUG
|
is appende behind the last tab:
|
||||||
- [x] Clean up of unused e.g. count()<=1 QSplitters doesn't work well #BUG
|
|
||||||
- [x] Show close button on right corner of SectionWidget. How to safe last section position?
|

|
||||||
- [x] Serialize state of `_hiddenSectionContents`
|
|
||||||
- [x] Add "title" to SectionContent object, which will be used in visible areas to display contents name.
|
#### Auto-Hide Tab Insertion Order
|
||||||
- [x] It should be possible to catch the "activeTabChanged" signal for EXTERN_API users
|
|
||||||
- [x] Add API function to set an SC as active-tab
|
It is also possible to drag Auto-Hide tabs to a new auto-hide position.
|
||||||
- [x] Move all lookup maps into ContainterWidget as non-static members, otherwise we can not have the same SC name inside another ContainerWidget instance.
|
That means, you can drag them to a different border or sidebar:
|
||||||
The uniqueness of a SectionContainer needs to be restricted to its parent ContainerWidget, not global!
|
|
||||||
|

|
||||||
### Some day...
|
|
||||||
- [ ] Drop indicator images should be fully visible over the DropOverlay rectangle
|
#### Auto-Hide Tab Sorting
|
||||||
- [ ] Pin contents: Pins a content and its title widget to the edge and opens on click/hover as long as it has focus
|
|
||||||
- [ ] API: Make it possible to use custom drop images
|
You can drag Auto-Hide tabs to a new position in the current sidebar
|
||||||
- [ ] API: Add possibility to make a SectionContent element floatable (`ContainerWidget::setFloating(SectionContent*)`?)
|
to sort them:
|
||||||
|
|
||||||
## Notes
|

|
||||||
- *SectionContent* class may safe a "size-type" property, which defines how the size of the widget should be handled.
|
|
||||||
- PerCent: Resize in proportion to other widgets.
|
#### Auto-Hide Drag to Float / Dock
|
||||||
- Fixed: Width or height are fixed (based on orientation).
|
|
||||||
|
But that is not all. You can also simply move Auto-Hide tabs to another
|
||||||
|
floating widget or dock them via drag and drop:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
#### Auto-Hide Context Menu
|
||||||
|
|
||||||
|
All Auto-Hide tabs now have a context menu, that provides all the functionality
|
||||||
|
that you know from Dock widget tabs. With the **Pin To...** item from the
|
||||||
|
context menu it is very easy to move an Auto-Hide tab to a different Auto-Hide
|
||||||
|
sidebar:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
#### Dock Area Tab Insert Order
|
||||||
|
|
||||||
|
And last but not least the new version also improves the docking of widgets
|
||||||
|
into the tabs of a Dock area. Just as with Auto-Hide tabs, you can now determine the position at which a tab is inserted by moving the mouse over an already existing tab (insertion before the tab) or behind the last tab
|
||||||
|
(appending):
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
The [release 4.0](https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System/releases/latest)
|
||||||
|
adds the following features:
|
||||||
|
|
||||||
|
- Auto-Hide functionality ([read more...](#auto-hide-functionality))
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
- improved demo application with new image viewer dock widgets
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
- Visual Studio like CSS theme in demo application
|
||||||
|
|
||||||
|
The [release 3.8](https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System/releases/3.8.3)
|
||||||
|
adds the following features:
|
||||||
|
|
||||||
|
- option to close tabs with the middle mouse button
|
||||||
|
- `DeleteContentOnClose` flag for dynamic deletion and creation of dock widget
|
||||||
|
content
|
||||||
|
- improved focus highlighting functionality
|
||||||
|
|
||||||
|
The [release 3.7](https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System/releases/tag/3.7.2)
|
||||||
|
adds the following features:
|
||||||
|
|
||||||
|
- support for **Qt6.**
|
||||||
|
- support for [empty dock area](doc/user-guide.md#empty-dock-area)
|
||||||
|
|
||||||
|
The [release 3.6](https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System/releases/tag/3.6.3)
|
||||||
|
adds some nice new features:
|
||||||
|
|
||||||
|
- support for [central widget](doc/user-guide.md#central-widget) concept
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
- support for [native floating widgets](doc/user-guide.md#floatingcontainerforcenativetitlebar-linux-only) on Linux
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Both features are contributions from ADS users. Read the [documentation](doc/user-guide.md)
|
||||||
|
to learn more about both new features.
|
||||||
|
|
||||||
|
The [release 3.5](https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System/releases/tag/3.5.0)
|
||||||
|
adds the new [focus highlighting](doc/user-guide.md#focushighlighting) feature.
|
||||||
|
This optional feature enables highlighting of the focused dock widget like you
|
||||||
|
know it from Visual Studio.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
[learn more...](doc/user-guide.md#focushighlighting)
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
### Overview
|
||||||
|
|
||||||
|
- [New and Noteworthy](#new-and-noteworthy)
|
||||||
|
- [Release 4.5](#release-45)
|
||||||
|
- [Tabs at Bottom](#tabs-at-bottom)
|
||||||
|
- [Release 4.1](#release-41)
|
||||||
|
- [Drag \& Drop to Auto-Hide](#drag--drop-to-auto-hide)
|
||||||
|
- [Auto-Hide Tab Insertion Order](#auto-hide-tab-insertion-order)
|
||||||
|
- [Auto-Hide Tab Sorting](#auto-hide-tab-sorting)
|
||||||
|
- [Auto-Hide Drag to Float / Dock](#auto-hide-drag-to-float--dock)
|
||||||
|
- [Auto-Hide Context Menu](#auto-hide-context-menu)
|
||||||
|
- [Dock Area Tab Insert Order](#dock-area-tab-insert-order)
|
||||||
|
- [Features](#features)
|
||||||
|
- [Overview](#overview)
|
||||||
|
- [Docking everywhere - no central widget](#docking-everywhere---no-central-widget)
|
||||||
|
- [Docking inside floating windows](#docking-inside-floating-windows)
|
||||||
|
- [Grouped dragging](#grouped-dragging)
|
||||||
|
- [Perspectives for fast switching of the complete main window layout](#perspectives-for-fast-switching-of-the-complete-main-window-layout)
|
||||||
|
- [Opaque and non-opaque splitter resizing](#opaque-and-non-opaque-splitter-resizing)
|
||||||
|
- [Cancelable docking process](#cancelable-docking-process)
|
||||||
|
- [Tab-menu for easy handling of many tabbed dock widgets](#tab-menu-for-easy-handling-of-many-tabbed-dock-widgets)
|
||||||
|
- [Many different ways to detach dock widgets](#many-different-ways-to-detach-dock-widgets)
|
||||||
|
- [Supports deletion of dynamically created dock widgets](#supports-deletion-of-dynamically-created-dock-widgets)
|
||||||
|
- [Auto-Hide Functionality](#auto-hide-functionality)
|
||||||
|
- [Python Bindings](#python-bindings)
|
||||||
|
- [PySide6](#pyside6)
|
||||||
|
- [PyQt6](#pyqt6)
|
||||||
|
- [PyQt5](#pyqt5)
|
||||||
|
- [Tested Compatible Environments](#tested-compatible-environments)
|
||||||
|
- [Supported Qt Versions](#supported-qt-versions)
|
||||||
|
- [Windows](#windows)
|
||||||
|
- [macOS](#macos)
|
||||||
|
- [Linux](#linux)
|
||||||
|
- [Build](#build)
|
||||||
|
- [Qt5 on Ubuntu 18.04 or 20.04](#qt5-on-ubuntu-1804-or-2004)
|
||||||
|
- [Qt5 on Ubuntu 22.04](#qt5-on-ubuntu-2204)
|
||||||
|
- [Qt6 on Ubuntu 22.04](#qt6-on-ubuntu-2204)
|
||||||
|
- [Getting started / Example](#getting-started--example)
|
||||||
|
- [License information](#license-information)
|
||||||
|
- [Donation](#donation)
|
||||||
|
- [Showcase](#showcase)
|
||||||
|
- [Qt Creator IDE](#qt-creator-ide)
|
||||||
|
- [Qt Design Studio](#qt-design-studio)
|
||||||
|
- [CETONI Elements](#cetoni-elements)
|
||||||
|
- [ezEditor](#ezeditor)
|
||||||
|
- [D-Tect X](#d-tect-x)
|
||||||
|
- [HiveWE](#hivewe)
|
||||||
|
- [Ramses Composer](#ramses-composer)
|
||||||
|
- [Plot Juggler](#plot-juggler)
|
||||||
|
- [Notepad Next](#notepad-next)
|
||||||
|
- [MetGem](#metgem)
|
||||||
|
- [PRE Workbench](#pre-workbench)
|
||||||
|
- [RDE – Robox Development Environment](#rde--robox-development-environment)
|
||||||
|
- [ResInsight](#resinsight)
|
||||||
|
- [ADTF 3](#adtf-3)
|
||||||
|
- [DREAM3D-NX](#dream3d-nx)
|
||||||
|
- [LabPlot](#labplot)
|
||||||
|
- [Scrutiny Debugger](#scrutiny-debugger)
|
||||||
|
- [PiSoWorks](#pisoworks)
|
||||||
|
- [Alternative Docking System Implementations](#alternative-docking-system-implementations)
|
||||||
|
- [KDDockWidgets](#kddockwidgets)
|
||||||
|
- [QtitanDocking](#qtitandocking)
|
||||||
|
- [DockingPanes](#dockingpanes)
|
||||||
|
|
||||||
|
### Docking everywhere - no central widget
|
||||||
|
|
||||||
|
There is no central widget like in the Qt docking system. You can dock on every
|
||||||
|
border of the main window or you can dock into each dock area - so you are
|
||||||
|
free to dock almost everywhere.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### Docking inside floating windows
|
||||||
|
|
||||||
|
There is no difference between the main window and a floating window. Docking
|
||||||
|
into floating windows is supported.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### Grouped dragging
|
||||||
|
|
||||||
|
When dragging the titlebar of a dock, all the tabs that are tabbed with it are
|
||||||
|
going to be dragged. So you can move complete groups of tabbed widgets into
|
||||||
|
a floating widget or from one dock area to another one.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### Perspectives for fast switching of the complete main window layout
|
||||||
|
|
||||||
|
A perspective defines the set and layout of dock windows in the main
|
||||||
|
window. You can save the current layout of the dockmanager into a named
|
||||||
|
perspective to make your own custom perspective. Later you can simply
|
||||||
|
select a perspective from the perspective list to quickly switch the complete
|
||||||
|
main window layout.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### Opaque and non-opaque splitter resizing
|
||||||
|
|
||||||
|
The advanced docking system uses standard QSplitters as resize separators and thus supports opaque and non-opaque resizing functionality of QSplitter. In some rare cases, for very complex widgets or on slow machines resizing via separator on the fly may cause flicking and glaring of rendered content inside a widget. The global dock manager flag `OpaqueSplitterResize` configures the resizing behaviour of the splitters. If this flag is set, then widgets are resized dynamically (opaquely) while interactively moving the splitters.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
If this flag is cleared, the widget resizing is deferred until the mouse button is released - this is some kind of lazy resizing separator.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### Cancelable docking process
|
||||||
|
|
||||||
|
In contrast to the standard Qt docking system, docking with the ADS works more like a drag & drop operation. That means, the dragged dock widget or dock area is not undocked immediately. Instead, a drag preview widget is created and dragged around to indicate the future position of the dock widget or dock area. The actual dock operation is only executed when the mouse button is released. That makes it possible, to cancel an active drag operation with the escape key.
|
||||||
|
|
||||||
|
The drag preview widget can be configured by a number of global dock manager flags:
|
||||||
|
|
||||||
|
- `DragPreviewIsDynamic`: if this flag is enabled, the preview will be adjusted dynamically to the drop area
|
||||||
|
- `DragPreviewShowsContentPixmap`: the created drag preview window shows a static copy of the content of the dock widget / dock are that is dragged
|
||||||
|
- `DragPreviewHasWindowFrame`: this flag configures if the drag preview is frameless like a QRubberBand or looks like a real window
|
||||||
|
|
||||||
|
### Tab-menu for easy handling of many tabbed dock widgets
|
||||||
|
|
||||||
|
Tabs are a good way to quickly switch between dockwidgets in a dockarea. However, if the number of dockwidgets in a dockarea is too large, this may affect the usability of the tab bar. To keep track in this situation, you can use the tab menu. The menu allows you to quickly select the dockwidget you want to activate from a drop down menu.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### Many different ways to detach dock widgets
|
||||||
|
|
||||||
|
You can detach dock widgets and also dock areas in the following ways:
|
||||||
|
|
||||||
|
- by dragging the dock widget tab or the dock area title bar
|
||||||
|
- by double clicking the tab or title bar
|
||||||
|
- by using the detach menu entry from the tab and title bar drop down menu
|
||||||
|
|
||||||
|
### Supports deletion of dynamically created dock widgets
|
||||||
|
|
||||||
|
Normally clicking the close button of a dock widget will just hide the widget and the user can show it again using the toggleView() action of the dock widget. This is meant for user interfaces with a static amount of widgets. But the advanced docking system also supports dynamic dock widgets that will get deleted on close. If you set the dock widget flag `DockWidgetDeleteOnClose` for a certain dock widget, then it will be deleted as soon as you close this dock widget. This enables the implementation of user interfaces with dynamically created editors, like in word processing applications or source code development tools.
|
||||||
|
|
||||||
|
### Auto-Hide Functionality
|
||||||
|
|
||||||
|
The 4.0 release of ADS added the new **Auto-Hide** feature. Thanks to the
|
||||||
|
[initial contribution](https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System/pull/452) by [Ahmad Syarifuddin](https://github.com/SyarifFakhri) it was
|
||||||
|
possible to close this long standing [feature request](https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System/issues/147). The "Auto Hide" feature
|
||||||
|
allows to display more information using less screen space by hiding or showing
|
||||||
|
windows pinned to one of the four dock container borders.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
The Advanced Docking
|
||||||
|
System supports "Auto-Hide" functionality for **all** dock containers - that means,
|
||||||
|
for the main window and for each floating widget. Here is short list of all
|
||||||
|
auto hide features:
|
||||||
|
|
||||||
|
- supported for the main window and all floating dock containers
|
||||||
|
- supports showing and hiding via mouse click or mouse hover
|
||||||
|
- respects opaque / non opaque splitter resizing flag
|
||||||
|
- context menu for pinning a dock widget or a complete dock area to a certain border
|
||||||
|
- configuration option to configure if the pin button should pin the current
|
||||||
|
dock widget tab or a complete dock area
|
||||||
|
- click the pin button holding the Ctrl key to pin a complete dock area
|
||||||
|
- fully CSS styleable
|
||||||
|
- backward compatible state file format - is is possible to load older dock manager
|
||||||
|
state files without auto hide support and older versions can load the new state
|
||||||
|
files with Auto-Hide state information
|
||||||
|
|
||||||
|
More about the auto hide configuration options in the [online documentation...](doc/user-guide.md#auto-hide-configuration-flags)
|
||||||
|
|
||||||
|
## Python Bindings
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Thanks to the contribution of several users, the Advanced Docking System comes
|
||||||
|
with a complete Python integration. Python bindings are available for **PyQt5**, **PyQt6**, and
|
||||||
|
**PySide6**.
|
||||||
|
|
||||||
|
### PySide6
|
||||||
|
|
||||||
|
A PySide6 ADS package is available via PyPi and can be installed on Windows,
|
||||||
|
macOS, and Linux with:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pip install PySide6-QtAds
|
||||||
|
```
|
||||||
|
|
||||||
|
Sample code is available [here](https://github.com/mborgerson/Qt-Advanced-Docking-System/tree/pyside6/examples). To run the samples, you'll also need to install latest qtpy
|
||||||
|
from source (pip install <https://github.com/spyder-ide/qtpy/archive/refs/heads/master.zip>).
|
||||||
|
The PySide6 bindings were contributed by:
|
||||||
|
|
||||||
|
- [mborgerson](https://github.com/mborgerson)
|
||||||
|
|
||||||
|
Please file PySide6-QtAds-specific issues on its [pyside6_qtads](https://github.com/mborgerson/pyside6_qtads) fork for tracking. For more information about the PySide6 bindings read [this](https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System/issues/298) issue.
|
||||||
|
|
||||||
|
### PyQt6
|
||||||
|
|
||||||
|
A PyQt6 ADS package is available via PyPi and can be installed on Windows,
|
||||||
|
macOS, and Linux with:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
pip install PyQt6Ads
|
||||||
|
```
|
||||||
|
|
||||||
|
Sample code is available [here](https://github.com/pyapp-kit/PyQt6Ads/tree/main/examples).
|
||||||
|
|
||||||
|
The PyQt6 bindings were contributed by:
|
||||||
|
|
||||||
|
- [tlambert03](https://github.com/tlambert03)
|
||||||
|
|
||||||
|
Please file PyQt6Ads-specific issues at [pyapp-kit/PyQt6Ads](https://github.com/pyapp-kit/PyQt6Ads).
|
||||||
|
|
||||||
|
### PyQt5
|
||||||
|
|
||||||
|
A package is available via [conda-forge](https://github.com/conda-forge/pyqtads-feedstock).
|
||||||
|
The python integration has been contributed to this project by the following people:
|
||||||
|
|
||||||
|
- [n-elie](https://github.com/n-elie)
|
||||||
|
- [Hugo Slepicka](https://github.com/hhslepicka)
|
||||||
|
- [K Lauer](https://github.com/klauer)
|
||||||
|
|
||||||
|
A Python integration is also available via PyPi. You can install the
|
||||||
|
[PyQtAds](https://pypi.org/project/PyQtAds/) package via pip. This feature has been
|
||||||
|
contributed to this project by:
|
||||||
|
|
||||||
|
- [Mira Weller](https://github.com/luelista)
|
||||||
|
|
||||||
|
## Tested Compatible Environments
|
||||||
|
|
||||||
|
### Supported Qt Versions
|
||||||
|
|
||||||
|
The library supports **Qt5** and **Qt6**.
|
||||||
|
|
||||||
|
### Windows
|
||||||
|
|
||||||
|
Windows 10 / 11
|
||||||
|
[](https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System/actions/workflows/windows-cmake.yml)
|
||||||
|
|
||||||
|
The library was developed on and for Windows. It is used in a commercial Windows application and is therefore constantly tested.
|
||||||
|
|
||||||
|
### macOS
|
||||||
|
|
||||||
|
The application can be compiled for macOS. A user reported, that the library works on macOS. If have not tested it.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### Linux
|
||||||
|
|
||||||
|
[](https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System/actions?query=workflow%3Alinux-builds)
|
||||||
|
|
||||||
|
Unfortunately, there is no such thing as a Linux operating system. Linux is a heterogeneous environment with a variety of different distributions. So it is not possible to support "Linux" like it is possible for Windows. It is only possible to support and test a small subset of Linux distributions. The library can be compiled for and has been developed and tested with some Linux distributions. Depending on the used window manager or compositor, dock widgets
|
||||||
|
with native title bars are supported or not. If native title bars are not supported,
|
||||||
|
the library switches to `QWidget` based title bars.
|
||||||
|
|
||||||
|
- **Kubuntu 18.04 and 19.10** - uses KWin - no native title bars
|
||||||
|
- **Ubuntu 18.04, 19.10 and 20.04** - native title bars are supported
|
||||||
|
- **Ubuntu 22.04** - uses Wayland -> no native title bars
|
||||||
|
|
||||||
|
There are some requirements for the Linux distribution that have to be met:
|
||||||
|
|
||||||
|
- an X server that supports ARGB visuals and a compositing window manager. This is required to display the translucent dock overlays ([https://doc.qt.io/qt-5/qwidget.html#creating-translucent-windows](https://doc.qt.io/qt-5/qwidget.html#creating-translucent-windows)). If your Linux distribution does not support this, or if you disable this feature, you will very likely see issue [#95](https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System/issues/95).
|
||||||
|
- Wayland is not properly supported by Qt yet. If you use Wayland, then you should set the session type to x11: `XDG_SESSION_TYPE=x11 ./AdvancedDockingSystemDemo`. You will find more details about this in issue [#288](https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System/issues/288).
|
||||||
|
|
||||||
|
Screenshot Kubuntu:
|
||||||
|

|
||||||
|
|
||||||
|
Screenshot Ubuntu:
|
||||||
|

|
||||||
|
|
||||||
|
## Build
|
||||||
|
|
||||||
|
The Linux build requires private header files. Make sure that they are installed.
|
||||||
|
The library uses SVG icons, so ensure that Qt SVG support is installed. The demo
|
||||||
|
application creates a `QQuickWidget` for testing, so ensure that the required
|
||||||
|
libraries are installed.
|
||||||
|
|
||||||
|
### Qt5 on Ubuntu 18.04 or 20.04
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo apt install qt5-default qtbase5-private-dev
|
||||||
|
```
|
||||||
|
|
||||||
|
### Qt5 on Ubuntu 22.04
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo apt install qtbase5-dev qtbase5-private-dev qtbase5-dev-tools libqt5svg5 libqt5qml5 qtdeclarative5-dev
|
||||||
|
```
|
||||||
|
|
||||||
|
### Qt6 on Ubuntu 22.04
|
||||||
|
|
||||||
|
```bash
|
||||||
|
sudo apt install qt6-default qt6-base-dev qt6-base-private-dev qt6-tools-dev libqt6svg6 qt6-qtdeclarative
|
||||||
|
```
|
||||||
|
|
||||||
|
Open the `ads.pro` file with QtCreator and start the build, that's it.
|
||||||
|
You can run the demo project and test it yourself.
|
||||||
|
|
||||||
|
## Getting started / Example
|
||||||
|
|
||||||
|
The following example shows the minimum code required to use the advanced Qt docking system.
|
||||||
|
|
||||||
|
*MainWindow.h*
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
#include <QMainWindow>
|
||||||
|
#include "DockManager.h"
|
||||||
|
|
||||||
|
namespace Ui {
|
||||||
|
class MainWindow;
|
||||||
|
}
|
||||||
|
|
||||||
|
class MainWindow : public QMainWindow
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit MainWindow(QWidget *parent = 0);
|
||||||
|
~MainWindow();
|
||||||
|
|
||||||
|
private:
|
||||||
|
Ui::MainWindow *ui;
|
||||||
|
|
||||||
|
// The main container for docking
|
||||||
|
ads::CDockManager* m_DockManager;
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
*MainWindow.cpp*
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
#include "MainWindow.h"
|
||||||
|
#include "ui_MainWindow.h"
|
||||||
|
|
||||||
|
#include <QLabel>
|
||||||
|
|
||||||
|
MainWindow::MainWindow(QWidget *parent) :
|
||||||
|
QMainWindow(parent),
|
||||||
|
ui(new Ui::MainWindow)
|
||||||
|
{
|
||||||
|
ui->setupUi(this);
|
||||||
|
|
||||||
|
// Create the dock manager after the ui is setup. Because the
|
||||||
|
// parent parameter is a QMainWindow the dock manager registers
|
||||||
|
// itself as the central widget as such the ui must be set up first.
|
||||||
|
DockManager = new ads::CDockManager(this);
|
||||||
|
|
||||||
|
// Create example content label - this can be any application specific
|
||||||
|
// widget
|
||||||
|
QLabel* l = new QLabel();
|
||||||
|
l->setWordWrap(true);
|
||||||
|
l->setAlignment(Qt::AlignTop | Qt::AlignLeft);
|
||||||
|
l->setText("Lorem ipsum dolor sit amet, consectetuer adipiscing elit. ");
|
||||||
|
|
||||||
|
// Create a dock widget with the title Label 1 and set the created label
|
||||||
|
// as the dock widget content
|
||||||
|
ads::CDockWidget* DockWidget = DockManager->createDockWidget("Label 1");
|
||||||
|
DockWidget->setWidget(l);
|
||||||
|
|
||||||
|
// Add the toggleViewAction of the dock widget to the menu to give
|
||||||
|
// the user the possibility to show the dock widget if it has been closed
|
||||||
|
ui->menuView->addAction(DockWidget->toggleViewAction());
|
||||||
|
|
||||||
|
// Add the dock widget to the top dock widget area
|
||||||
|
DockManager->addDockWidget(ads::TopDockWidgetArea, DockWidget);
|
||||||
|
}
|
||||||
|
|
||||||
|
MainWindow::~MainWindow()
|
||||||
|
{
|
||||||
|
delete ui;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## License information
|
||||||
|
|
||||||
|
[](gnu-lgpl-v2.1.md)
|
||||||
|
This project uses the [LGPLv2.1 license](gnu-lgpl-v2.1.md)
|
||||||
|
|
||||||
|
## Donation
|
||||||
|
|
||||||
|
If this project help you reduce time to develop or if you just like it, you can give me a cup of coffee :coffee::wink:.
|
||||||
|
|
||||||
|
<a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=85R64TMMSY9T6">
|
||||||
|
<img src="doc/donate.png" alt="Donate with PayPal" width="160"/>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
## Showcase
|
||||||
|
|
||||||
|
### [Qt Creator IDE](https://www.qt.io/development-tools)
|
||||||
|
|
||||||
|
From version 4.12 on, Qt Creator uses the Advanced Docking Framework for its
|
||||||
|
Qt Quick Designer. This improves the usability when using multiple screens.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### [Qt Design Studio](https://www.qt.io/ui-design-tools)
|
||||||
|
|
||||||
|
Taken from the [Qt Blog](https://www.qt.io/blog/qt-design-studio-1.5-beta-released):
|
||||||
|
|
||||||
|
> The most obvious change in [Qt Design Studio 1.5](https://www.qt.io/blog/qt-design-studio-1.5-beta-released) is the integration of dock widgets using the Qt Advanced Docking System. This allows the user to fully customize the workspace and also to undock any view into its own top level window. This especially improves the usability when using multiple screens.
|
||||||
|
|
||||||
|
[](https://youtu.be/za9KBWcFXEw?t=84)
|
||||||
|
|
||||||
|
### [CETONI Elements](https://cetoni.com/cetoni-elements/)
|
||||||
|
|
||||||
|
The CETONI Elements software from [CETONI](https://www.cetoni.com) is a comprehensive,
|
||||||
|
plugin-based and modular laboratory automation software for controlling CETONI devices using a joint graphical user interface. The software features a powerful script system to automate processes. The software uses the advanced docking system to give the user the freedom to arrange all the views and windows that are provided by the various plugins.
|
||||||
|
|
||||||
|
[learn more...](https://cetoni.com/cetoni-elements/)
|
||||||
|
|
||||||
|
[](https://www.youtube.com/watch?v=7pdNfafg3Qc)
|
||||||
|
|
||||||
|
### [ezEditor](https://github.com/ezEngine/ezEngine)
|
||||||
|
|
||||||
|
The ezEditor is a full blown graphical editor used for editing scenes and
|
||||||
|
importing and authoring assets for the [ezEngine](https://github.com/ezEngine/ezEngine) -
|
||||||
|
an open source C++ game engine in active development.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### [D-Tect X](https://www.duerr-ndt.com/products/ndt-software/d-tect-xray-inspection-software.html)
|
||||||
|
|
||||||
|
D-Tect X is a X-ray inspection software for industrial radiography. It is a state-of-the-art 64-bit application which supports GPU (Graphics Processing Unit) acceleration and takes full advantage of computers with multiple CPU cores. A large set of tools assist the user in image analysis and evaluation. Thanks to the Qt Advanced Docking System the flexible and intuitive user interface can be completely customized to each user’s preference.
|
||||||
|
|
||||||
|
[learn more...](https://www.duerr-ndt.com/products/ndt-software/d-tect-xray-inspection-software.html)
|
||||||
|
|
||||||
|
[](https://youtu.be/mOor7GmmIJo?t=13)
|
||||||
|
|
||||||
|
### [HiveWE](https://github.com/stijnherfst/HiveWE)
|
||||||
|
|
||||||
|
HiveWE is a Warcraft III world editor. It focusses on speed and ease of use,
|
||||||
|
especially for large maps where the regular World Editor is often too slow and clunky.
|
||||||
|
It has a JASS editor with syntax highlighting, tabs, code completion and more.
|
||||||
|
The JASS editor uses the Qt Advanced Docking System for the management and layout
|
||||||
|
of the open editor windows.
|
||||||
|
|
||||||
|
[learn more...](https://github.com/stijnherfst/HiveWE)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### [Ramses Composer](https://github.com/GENIVI/ramses-composer)
|
||||||
|
|
||||||
|
Ramses Composer is the authoring tool for the open source [RAMSES](https://github.com/GENIVI/ramses)
|
||||||
|
rendering ecosystem.
|
||||||
|
|
||||||
|
Ramses is a low-level rendering engine which is optimized for embedded hardware
|
||||||
|
mobile devices, automotive ECUs, IoT electronics. Ramses was initially developed
|
||||||
|
at the BMW Group and open-sourced in 2018 as part of a collaboration initiative
|
||||||
|
with the Genivi Alliance. It is an important part of the BMW infotainment cluster
|
||||||
|
and digital portfolio.
|
||||||
|
|
||||||
|
[learn more...](https://github.com/GENIVI/ramses-composer)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### [Plot Juggler](https://github.com/facontidavide/PlotJuggler)
|
||||||
|
|
||||||
|
PlotJuggler is a fast, powerful and intuitive tool to visualize time series.
|
||||||
|
It makes it easy to visualize data but also to analyze it. You can manipulate
|
||||||
|
your time series using a simple and extendable Transform Editor. Some of the
|
||||||
|
highlights are:
|
||||||
|
|
||||||
|
- Simple Drag & Drop user interface.
|
||||||
|
- Load data from file.
|
||||||
|
- Connect to live streaming of data.
|
||||||
|
- Save the visualization layout and configurations to reuse them later.
|
||||||
|
- Fast OpenGL visualization.
|
||||||
|
- Can handle thousands of timeseries and millions of data points.
|
||||||
|
- Transform your data using a simple editor: derivative, moving average, integral, etc…
|
||||||
|
- PlotJuggler can be easily extended using plugins.
|
||||||
|
|
||||||
|
[read more...](https://github.com/facontidavide/PlotJuggler)
|
||||||
|
|
||||||
|
[](https://vimeo.com/480588113#t=46s)
|
||||||
|
|
||||||
|
### [Notepad Next](https://github.com/dail8859/NotepadNext)
|
||||||
|
|
||||||
|
Notepad Next is a cross-platform reimplementation of Notepad++ that uses the
|
||||||
|
Advanced Docking System to arrange the open source files on the screen.
|
||||||
|
|
||||||
|
[read more...](https://github.com/dail8859/NotepadNext)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### [MetGem](https://metgem.github.io/)
|
||||||
|
|
||||||
|
MetGem is an open-source software for tandem mass-spectrometry data visualization.
|
||||||
|
It's key features are standalone molecular networking and t-SNE based projections.
|
||||||
|
MetGem uses the Qt-Advanced-Docking-System to manage docks and to create independent
|
||||||
|
molecular network views.
|
||||||
|
|
||||||
|
[read more...](https://metgem.github.io/)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### [PRE Workbench](https://luelista.github.io/pre_workbench/)
|
||||||
|
|
||||||
|
Protocol Reverse Engineering Workbench is a software to support researchers in reverse engineering protocols and documenting the results. It supports various sources to import protocol traffic from, helps the discovery process by displaying different views and heuristic-based highlighting on data, and aids in documenting and sharing findings.
|
||||||
|
|
||||||
|
PRE Workbench is a Python software and uses the ADS PyQt integration.
|
||||||
|
|
||||||
|
[read more...](https://luelista.github.io/pre_workbench/)
|
||||||
|
|
||||||
|
[](https://youtu.be/U3op5UreV1Q)
|
||||||
|
|
||||||
|
### [RDE – Robox Development Environment](https://www.robox.it/en/product/rde-robox-development-environment/)
|
||||||
|
|
||||||
|
This software is a development environment for PAC (Programmable Automation Controllers)
|
||||||
|
from ROBOX. It offers a lot of tools to write, compile and debug machine control
|
||||||
|
and application software. The Advanced Docking System helps to organize all the tools and
|
||||||
|
windows (Project window, Shell window, Monitor windows, Oscilloscope window...)
|
||||||
|
on the screen to provide a easy to use, highly configurable and visual pleasing
|
||||||
|
development experience.
|
||||||
|
|
||||||
|
[read more...](https://www.robox.it/en/product/rde-robox-development-environment/)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### [ResInsight](https://www.ceetronsolutions.com/projects/resinsight)
|
||||||
|
|
||||||
|
ResInsight as a software from Ceetron Solutions for visualization of oil and
|
||||||
|
gas reservoir simulation data. It allows reservoir models, simulation results,
|
||||||
|
and measurements to be visualized with very high performance. Optimized use of
|
||||||
|
graphics technology and simultaneous processing on multiple CPU cores have been
|
||||||
|
vital to enhance the performance and capacity of ResInsight for large data sets.
|
||||||
|
The Advanced Docking System has empowered Ceetron to build a much more intuitive
|
||||||
|
user interface for its ResInsight users.
|
||||||
|
|
||||||
|
[read more...](https://resinsight.org/)
|
||||||
|
|
||||||
|
[](https://www.youtube.com/watch?v=HzLaQ1p6AUc)
|
||||||
|
|
||||||
|
### [ADTF 3](https://www.digitalwerk.net/adtf/)
|
||||||
|
|
||||||
|
The Automotive Data and Time-Triggered Framework was designed as a Rapid Prototyping Toolset, Simulation Framework and Test- and Measurement Tool. It is meant for:
|
||||||
|
|
||||||
|
- Developing and testing ADAS and HAD components
|
||||||
|
- Recording of vehicle data for visualisation
|
||||||
|
- Simulation of complex scenarios in SIL/HIL test environments
|
||||||
|
|
||||||
|
The software features time-based processing of multiple data streams and graphical editing of dynamic filter graphs. It also includes an SDK for custom plug-ins and reusable components, as well as components for data visualization in both 2D and 3D. This is was the
|
||||||
|
[manual](https://support.digitalwerk.net/adtf/v3/adtf_html/page_adtf_xsystem_plugin.html)
|
||||||
|
says about the switch to Qt Advanced Docking:
|
||||||
|
|
||||||
|
> After several minor improvements the Qt5 ADTF XSystem uses the Advanced Docking System for Qt since ADTF 3.10.0 for more convenience and usability regarding layouting, docking and embedding several widgets.
|
||||||
|
|
||||||
|
[read more...](https://support.digitalwerk.net/adtf/v3/adtf_html/index.html)
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### [DREAM3D-NX](https://www.dream3d.io)
|
||||||
|
|
||||||
|
DREAM3D-NX *(Digital Representation Environment for Analysis of Materials in 3D)* is a cross-platform and modular, software suite that allows users to prepare, reconstruct, quantify, instantiate, and mesh, multidimensional, multimodal microstructural data, as well as many other applications.
|
||||||
|
|
||||||
|
[BlueQuartz Software](http://www.bluequartz.net/) has completely rewritten the old DREAM.3D version 6.5 application
|
||||||
|
taking advantage of the Advanced Docking System to present a highly customizable user interface
|
||||||
|
for DREAM3D-NX Version 7.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
[read more...](http://www.dream3d.io/)
|
||||||
|
|
||||||
|
### [LabPlot](https://labplot.kde.org/)
|
||||||
|
|
||||||
|
KDE LabPlot is the ultimate free, open source and cross-platform tool for scientists, engineers, and students who need to analyze and visualize data. With its intuitive interface and powerful features, you can create stunning plots and diagrams with ease. Whether you're working with CSV, FITS, or HDF5 data, KDE LabPlot makes it simple to import and analyze your data.
|
||||||
|
|
||||||
|
The LabPlot project recently switched to the Qt Advanced Docking System for their user interface. This switch represents a significant improvement to the LabPlot software, allowing users to create and manage complex data visualization layouts with ease.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
[read more...](https://labplot.kde.org/)
|
||||||
|
|
||||||
|
### [Scrutiny Debugger](https://scrutinydebugger.com/)
|
||||||
|
|
||||||
|
Scrutiny is an [open source](https://github.com/scrutinydebugger/) non-intrusive, real-time debugger for embedded systems, built for fast introspection, memory access, and signal visualization—without stopping your application. It uses the Qt Advanced Docking System (ADS) to provide fully customizable dashboards for monitoring and control.
|
||||||
|
|
||||||
|
Some of the highlights are:
|
||||||
|
|
||||||
|
- **Debug without interfering** — Inspect C++ memory live without disrupting execution flow.
|
||||||
|
- **HIL testing made easy** — Write to variables through the GUI or SDK to simulate conditions.
|
||||||
|
- **Configure during production** — Access and tweak variables anytime via GUI or Python.
|
||||||
|
- **Catch fast events** — Embedded graphs sample at task-level frequency, even with multithreading.
|
||||||
|
- **Build your dashboard** — Use ADS to create and save custom layouts for your debug sessions.
|
||||||
|
- **No JTAG needed** — Communicates over serial, CAN, or network interfaces.
|
||||||
|
- **Compact C++11 library** — Lightweight and easy to integrate into your firmware.
|
||||||
|
- **Live graphs and runtime values** — Visualize variables, RPVs, and aliases in real time.
|
||||||
|
|
||||||
|
ADS powers Scrutiny’s flexible interface, letting users organize views and data panels to suit their workflow — ideal for real-time monitoring, testing, and debugging.
|
||||||
|
|
||||||
|
[read more...](https://scrutinydebugger.com/)
|
||||||
|
|
||||||
|
[](https://www.youtube.com/watch?v=Dd3osxW-Clo)
|
||||||
|
|
||||||
|
|
||||||
|
### [PiSoWorks](https://pypi.org/project/pisoworks/)
|
||||||
|
|
||||||
|
PiSoWorks is an application for controlling the piezo amplifiers, such as the [NV200/D](https://www.piezosystem.com/product/nv-200-d-compact-amplifier/), from [piezosystem jena](https://www.piezosystem.com/) GmbH.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
[read more...](https://piezosystemjena.github.io/PiSoWorks/)
|
||||||
|
|
||||||
|
## Alternative Docking System Implementations
|
||||||
|
|
||||||
|
If this Qt Advanced Docking System does not fit to your needs you may consider some of the alternative docking system solutions for Qt.
|
||||||
|
|
||||||
|
### KDDockWidgets
|
||||||
|
|
||||||
|
This is an advanced docking framework for Qt from [KDAB](https://www.kdab.com/). The interesting thing is, that they separated GUI code from logic, so they can easily provide a QtQuick backend in the future.
|
||||||
|
|
||||||
|
- [Blog post about KDDockWidgets](https://www.kdab.com/kddockwidgets/)
|
||||||
|
- [GitHub project](https://github.com/KDAB/KDDockWidgets)
|
||||||
|
|
||||||
|
**License:** dual-licensed, available under both commercial and GPL license.
|
||||||
|
|
||||||
|
### QtitanDocking
|
||||||
|
|
||||||
|
This is a commercial component from [Developer Machines](https://www.devmachines.com/) for Qt Framework that allows to create a Microsoft like dockable user interface. They also offer a lot of other interesting and useful components for Qt. The library is available
|
||||||
|
|
||||||
|
- [Product page](https://www.devmachines.com/qtitandocking-overview.html)
|
||||||
|
|
||||||
|
**License:** Commercial license
|
||||||
|
|
||||||
|
### DockingPanes
|
||||||
|
|
||||||
|
DockingPanes is a library for Qt Widgets that implements docking windows that have the look and feel of Visual Studio. It provides a simple API which allows an application to make use of docking windows with a few calls.
|
||||||
|
|
||||||
|
- [GitHub project](https://github.com/KestrelRadarSensors/dockingpanes)
|
||||||
|
|
||||||
|
**License:** GPL
|
||||||
|
|||||||
28
ads.pri
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
|
||||||
|
CONFIG(debug, debug|release){
|
||||||
|
win32-g++ {
|
||||||
|
versionAtLeast(QT_VERSION, 5.15.0) {
|
||||||
|
LIBS += -lqtadvanceddocking
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
LIBS += -lqtadvanceddockingd
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else:msvc {
|
||||||
|
LIBS += -lqtadvanceddockingd
|
||||||
|
}
|
||||||
|
else:mac {
|
||||||
|
LIBS += -lqtadvanceddocking_debug
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
LIBS += -lqtadvanceddocking
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
LIBS += -lqtadvanceddocking
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
unix:!macx {
|
||||||
|
LIBS += -lxcb
|
||||||
|
}
|
||||||
9
ads.pro
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
TEMPLATE = subdirs
|
||||||
|
|
||||||
|
SUBDIRS = \
|
||||||
|
src \
|
||||||
|
demo \
|
||||||
|
examples
|
||||||
|
|
||||||
|
demo.depends = src
|
||||||
|
examples.depends = src
|
||||||
5
adsConfig.cmake
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
include(CMakeFindDependencyMacro)
|
||||||
|
find_dependency(Qt5Core ${REQUIRED_QT_VERSION} REQUIRED)
|
||||||
|
find_dependency(Qt5Gui ${REQUIRED_QT_VERSION} REQUIRED)
|
||||||
|
find_dependency(Qt5Widgets ${REQUIRED_QT_VERSION} REQUIRED)
|
||||||
|
include("${CMAKE_CURRENT_LIST_DIR}/adsTargets.cmake")
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
TEMPLATE = subdirs
|
|
||||||
|
|
||||||
SUBDIRS = \
|
|
||||||
AdvancedDockingSystem \
|
|
||||||
AdvancedDockingSystemDemo
|
|
||||||
29
cmake/modules/FileVersionInfo.rc.in
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
VS_VERSION_INFO VERSIONINFO
|
||||||
|
FILEVERSION @PROJECT_VERSION_MAJOR@,@PROJECT_VERSION_MINOR@,@PROJECT_VERSION_PATCH@,0
|
||||||
|
PRODUCTVERSION @PROJECT_VERSION_MAJOR@,@PROJECT_VERSION_MINOR@,@PROJECT_VERSION_PATCH@,0
|
||||||
|
FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
|
||||||
|
FILEFLAGS 0
|
||||||
|
FILEOS VOS__WINDOWS32
|
||||||
|
FILETYPE VFT_APP
|
||||||
|
FILESUBTYPE 0
|
||||||
|
BEGIN
|
||||||
|
BLOCK "StringFileInfo"
|
||||||
|
BEGIN
|
||||||
|
BLOCK "040904b0"
|
||||||
|
BEGIN
|
||||||
|
VALUE "CompanyName", "My Company\0"
|
||||||
|
VALUE "FileDescription", "@PROJECT_NAME@\0"
|
||||||
|
VALUE "FileVersion", "@PROJECT_VERSION_STRING@\0"
|
||||||
|
VALUE "ProductVersion", "@PROJECT_VERSION_STRING@\0"
|
||||||
|
VALUE "GitCommitFull", "@PROJECT_GIT_HASH@\0"
|
||||||
|
VALUE "GitCommitShort", "@PROJECT_GIT_HASH_SHORT@\0"
|
||||||
|
END
|
||||||
|
END
|
||||||
|
|
||||||
|
BLOCK "VarFileInfo"
|
||||||
|
BEGIN
|
||||||
|
VALUE "Translation", 0x0409, 1200
|
||||||
|
END
|
||||||
|
END
|
||||||
172
cmake/modules/GetGitRevisionDescription.cmake
Normal file
@@ -0,0 +1,172 @@
|
|||||||
|
# - Returns a version string from Git
|
||||||
|
#
|
||||||
|
# These functions force a re-configure on each git commit so that you can
|
||||||
|
# trust the values of the variables in your build system.
|
||||||
|
#
|
||||||
|
# get_git_head_revision(<refspecvar> <hashvar> [<additional arguments to git describe> ...])
|
||||||
|
#
|
||||||
|
# Returns the refspec and sha hash of the current head revision
|
||||||
|
#
|
||||||
|
# git_describe(<var> [<additional arguments to git describe> ...])
|
||||||
|
#
|
||||||
|
# Returns the results of git describe on the source tree, and adjusting
|
||||||
|
# the output so that it tests false if an error occurs.
|
||||||
|
#
|
||||||
|
# git_get_exact_tag(<var> [<additional arguments to git describe> ...])
|
||||||
|
#
|
||||||
|
# Returns the results of git describe --exact-match on the source tree,
|
||||||
|
# and adjusting the output so that it tests false if there was no exact
|
||||||
|
# matching tag.
|
||||||
|
#
|
||||||
|
# git_local_changes(<var>)
|
||||||
|
#
|
||||||
|
# Returns either "CLEAN" or "DIRTY" with respect to uncommitted changes.
|
||||||
|
# Uses the return code of "git diff-index --quiet HEAD --".
|
||||||
|
# Does not regard untracked files.
|
||||||
|
#
|
||||||
|
# Requires CMake 2.6 or newer (uses the 'function' command)
|
||||||
|
#
|
||||||
|
# Original Author:
|
||||||
|
# 2009-2010 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net>
|
||||||
|
# http://academic.cleardefinition.com
|
||||||
|
# Iowa State University HCI Graduate Program/VRAC
|
||||||
|
#
|
||||||
|
# Copyright Iowa State University 2009-2010.
|
||||||
|
# Distributed under the Boost Software License, Version 1.0.
|
||||||
|
# (See accompanying file LICENSE_1_0.txt or copy at
|
||||||
|
# http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
|
if(__get_git_revision_description)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
set(__get_git_revision_description YES)
|
||||||
|
|
||||||
|
# We must run the following at "include" time, not at function call time,
|
||||||
|
# to find the path to this module rather than the path to a calling list file
|
||||||
|
get_filename_component(_gitdescmoddir ${CMAKE_CURRENT_LIST_FILE} PATH)
|
||||||
|
|
||||||
|
function(get_git_head_revision _refspecvar _hashvar)
|
||||||
|
set(GIT_PARENT_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
|
||||||
|
set(GIT_DIR "${GIT_PARENT_DIR}/.git")
|
||||||
|
while(NOT EXISTS "${GIT_DIR}") # .git dir not found, search parent directories
|
||||||
|
set(GIT_PREVIOUS_PARENT "${GIT_PARENT_DIR}")
|
||||||
|
get_filename_component(GIT_PARENT_DIR ${GIT_PARENT_DIR} PATH)
|
||||||
|
if(GIT_PARENT_DIR STREQUAL GIT_PREVIOUS_PARENT)
|
||||||
|
# We have reached the root directory, we are not in git
|
||||||
|
set(${_refspecvar} "GITDIR-NOTFOUND" PARENT_SCOPE)
|
||||||
|
set(${_hashvar} "GITDIR-NOTFOUND" PARENT_SCOPE)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
set(GIT_DIR "${GIT_PARENT_DIR}/.git")
|
||||||
|
endwhile()
|
||||||
|
# check if this is a submodule
|
||||||
|
if(NOT IS_DIRECTORY ${GIT_DIR})
|
||||||
|
file(READ ${GIT_DIR} submodule)
|
||||||
|
string(REGEX REPLACE "gitdir: (.*)\n$" "\\1" GIT_DIR_RELATIVE ${submodule})
|
||||||
|
get_filename_component(SUBMODULE_DIR ${GIT_DIR} PATH)
|
||||||
|
get_filename_component(GIT_DIR ${SUBMODULE_DIR}/${GIT_DIR_RELATIVE} ABSOLUTE)
|
||||||
|
endif()
|
||||||
|
if(NOT IS_DIRECTORY "${GIT_DIR}")
|
||||||
|
file(READ ${GIT_DIR} worktree)
|
||||||
|
string(REGEX REPLACE "gitdir: (.*)worktrees(.*)\n$" "\\1" GIT_DIR ${worktree})
|
||||||
|
endif()
|
||||||
|
set(GIT_DATA "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/git-data")
|
||||||
|
if(NOT EXISTS "${GIT_DATA}")
|
||||||
|
file(MAKE_DIRECTORY "${GIT_DATA}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT EXISTS "${GIT_DIR}/HEAD")
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
set(HEAD_FILE "${GIT_DATA}/HEAD")
|
||||||
|
configure_file("${GIT_DIR}/HEAD" "${HEAD_FILE}" COPYONLY)
|
||||||
|
|
||||||
|
configure_file("${_gitdescmoddir}/GetGitRevisionDescription.cmake.in"
|
||||||
|
"${GIT_DATA}/grabRef.cmake"
|
||||||
|
@ONLY)
|
||||||
|
include("${GIT_DATA}/grabRef.cmake")
|
||||||
|
|
||||||
|
set(${_refspecvar} "${HEAD_REF}" PARENT_SCOPE)
|
||||||
|
set(${_hashvar} "${HEAD_HASH}" PARENT_SCOPE)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(git_describe _var)
|
||||||
|
if(NOT GIT_FOUND)
|
||||||
|
find_package(Git QUIET)
|
||||||
|
endif()
|
||||||
|
get_git_head_revision(refspec hash)
|
||||||
|
if(NOT GIT_FOUND)
|
||||||
|
set(${_var} "GIT-NOTFOUND" PARENT_SCOPE)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
if(NOT hash)
|
||||||
|
set(${_var} "HEAD-HASH-NOTFOUND" PARENT_SCOPE)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# TODO sanitize
|
||||||
|
#if((${ARGN}" MATCHES "&&") OR
|
||||||
|
# (ARGN MATCHES "||") OR
|
||||||
|
# (ARGN MATCHES "\\;"))
|
||||||
|
# message("Please report the following error to the project!")
|
||||||
|
# message(FATAL_ERROR "Looks like someone's doing something nefarious with git_describe! Passed arguments ${ARGN}")
|
||||||
|
#endif()
|
||||||
|
|
||||||
|
#message(STATUS "Arguments to execute_process: ${ARGN}")
|
||||||
|
|
||||||
|
execute_process(COMMAND
|
||||||
|
"${GIT_EXECUTABLE}"
|
||||||
|
describe
|
||||||
|
${hash}
|
||||||
|
${ARGN}
|
||||||
|
WORKING_DIRECTORY
|
||||||
|
"${CMAKE_CURRENT_SOURCE_DIR}"
|
||||||
|
RESULT_VARIABLE
|
||||||
|
res
|
||||||
|
OUTPUT_VARIABLE
|
||||||
|
out
|
||||||
|
ERROR_QUIET
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||||
|
if(NOT res EQUAL 0)
|
||||||
|
set(out "${out}-${res}-NOTFOUND")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(${_var} "${out}" PARENT_SCOPE)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(git_get_exact_tag _var)
|
||||||
|
git_describe(out --exact-match ${ARGN})
|
||||||
|
set(${_var} "${out}" PARENT_SCOPE)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(git_local_changes _var)
|
||||||
|
if(NOT GIT_FOUND)
|
||||||
|
find_package(Git QUIET)
|
||||||
|
endif()
|
||||||
|
get_git_head_revision(refspec hash)
|
||||||
|
if(NOT GIT_FOUND)
|
||||||
|
set(${_var} "GIT-NOTFOUND" PARENT_SCOPE)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
if(NOT hash)
|
||||||
|
set(${_var} "HEAD-HASH-NOTFOUND" PARENT_SCOPE)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
execute_process(COMMAND
|
||||||
|
"${GIT_EXECUTABLE}"
|
||||||
|
diff-index --quiet HEAD --
|
||||||
|
WORKING_DIRECTORY
|
||||||
|
"${CMAKE_CURRENT_SOURCE_DIR}"
|
||||||
|
RESULT_VARIABLE
|
||||||
|
res
|
||||||
|
OUTPUT_VARIABLE
|
||||||
|
out
|
||||||
|
ERROR_QUIET
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE)
|
||||||
|
if(res EQUAL 0)
|
||||||
|
set(${_var} "CLEAN" PARENT_SCOPE)
|
||||||
|
else()
|
||||||
|
set(${_var} "DIRTY" PARENT_SCOPE)
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
41
cmake/modules/GetGitRevisionDescription.cmake.in
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
#
|
||||||
|
# Internal file for GetGitRevisionDescription.cmake
|
||||||
|
#
|
||||||
|
# Requires CMake 2.6 or newer (uses the 'function' command)
|
||||||
|
#
|
||||||
|
# Original Author:
|
||||||
|
# 2009-2010 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net>
|
||||||
|
# http://academic.cleardefinition.com
|
||||||
|
# Iowa State University HCI Graduate Program/VRAC
|
||||||
|
#
|
||||||
|
# Copyright Iowa State University 2009-2010.
|
||||||
|
# Distributed under the Boost Software License, Version 1.0.
|
||||||
|
# (See accompanying file LICENSE_1_0.txt or copy at
|
||||||
|
# http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
|
set(HEAD_HASH)
|
||||||
|
|
||||||
|
file(READ "@HEAD_FILE@" HEAD_CONTENTS LIMIT 1024)
|
||||||
|
|
||||||
|
string(STRIP "${HEAD_CONTENTS}" HEAD_CONTENTS)
|
||||||
|
if(HEAD_CONTENTS MATCHES "ref")
|
||||||
|
# named branch
|
||||||
|
string(REPLACE "ref: " "" HEAD_REF "${HEAD_CONTENTS}")
|
||||||
|
if(EXISTS "@GIT_DIR@/${HEAD_REF}")
|
||||||
|
configure_file("@GIT_DIR@/${HEAD_REF}" "@GIT_DATA@/head-ref" COPYONLY)
|
||||||
|
else()
|
||||||
|
configure_file("@GIT_DIR@/packed-refs" "@GIT_DATA@/packed-refs" COPYONLY)
|
||||||
|
file(READ "@GIT_DATA@/packed-refs" PACKED_REFS)
|
||||||
|
if(${PACKED_REFS} MATCHES "([0-9a-z]*) ${HEAD_REF}")
|
||||||
|
set(HEAD_HASH "${CMAKE_MATCH_1}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
# detached HEAD
|
||||||
|
configure_file("@GIT_DIR@/HEAD" "@GIT_DATA@/head-ref" COPYONLY)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT HEAD_HASH)
|
||||||
|
file(READ "@GIT_DATA@/head-ref" HEAD_HASH LIMIT 1024)
|
||||||
|
string(STRIP "${HEAD_HASH}" HEAD_HASH)
|
||||||
|
endif()
|
||||||
100
cmake/modules/Versioning.cmake
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
# ============================================================
|
||||||
|
# Versioning.cmake (Reusable Version + Resource Generator)
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
# Freeze the directory where this module lives
|
||||||
|
# This is critical — it prevents paths from breaking when the
|
||||||
|
# function is invoked from other CMakeLists.txt files.
|
||||||
|
set(_VERSIONING_MODULE_DIR "${CMAKE_CURRENT_LIST_DIR}" CACHE INTERNAL "Versioning module directory")
|
||||||
|
|
||||||
|
# ------------------------------------------------------------
|
||||||
|
# Extract version information from Git or use predefined version
|
||||||
|
# ------------------------------------------------------------
|
||||||
|
if(NOT DEFINED PROJECT_VERSION_MAJOR OR NOT DEFINED PROJECT_VERSION_MINOR OR NOT DEFINED PROJECT_VERSION_PATCH)
|
||||||
|
# Get tag (expected: v1.2.3 or 1.2.3 or 1.2.3-12-gHASH)
|
||||||
|
execute_process(
|
||||||
|
COMMAND git describe --tags --dirty
|
||||||
|
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
|
OUTPUT_VARIABLE GIT_DESC_RAW
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||||
|
)
|
||||||
|
|
||||||
|
# Remove leading "v" if present
|
||||||
|
string(REGEX REPLACE "^v" "" GIT_DESC "${GIT_DESC_RAW}")
|
||||||
|
|
||||||
|
# Extract major.minor.patch
|
||||||
|
string(REGEX MATCH "^([0-9]+)\\.([0-9]+)\\.([0-9]+)" _ "${GIT_DESC}")
|
||||||
|
set(PROJECT_VERSION_MAJOR "${CMAKE_MATCH_1}")
|
||||||
|
set(PROJECT_VERSION_MINOR "${CMAKE_MATCH_2}")
|
||||||
|
set(PROJECT_VERSION_PATCH "${CMAKE_MATCH_3}")
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Commit hash (full + short)
|
||||||
|
execute_process(
|
||||||
|
COMMAND git rev-parse HEAD
|
||||||
|
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
|
OUTPUT_VARIABLE PROJECT_GIT_HASH
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||||
|
)
|
||||||
|
|
||||||
|
execute_process(
|
||||||
|
COMMAND git rev-parse --short HEAD
|
||||||
|
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
||||||
|
OUTPUT_VARIABLE PROJECT_GIT_HASH_SHORT
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(PROJECT_VERSION_STRING
|
||||||
|
"${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Export variables to parent scope
|
||||||
|
set(PROJECT_VERSION_MAJOR "${PROJECT_VERSION_MAJOR}" PARENT_SCOPE)
|
||||||
|
set(PROJECT_VERSION_MINOR "${PROJECT_VERSION_MINOR}" PARENT_SCOPE)
|
||||||
|
set(PROJECT_VERSION_PATCH "${PROJECT_VERSION_PATCH}" PARENT_SCOPE)
|
||||||
|
set(PROJECT_VERSION_STRING "${PROJECT_VERSION_STRING}" PARENT_SCOPE)
|
||||||
|
set(PROJECT_GIT_HASH "${PROJECT_GIT_HASH}" PARENT_SCOPE)
|
||||||
|
set(PROJECT_GIT_HASH_SHORT "${PROJECT_GIT_HASH_SHORT}" PARENT_SCOPE)
|
||||||
|
|
||||||
|
# Public variable for users
|
||||||
|
set(PROJECT_AUTO_VERSION "${PROJECT_VERSION_STRING}" PARENT_SCOPE)
|
||||||
|
|
||||||
|
# ------------------------------------------------------------
|
||||||
|
# Reusable function: Attach Windows version resources to target
|
||||||
|
# ------------------------------------------------------------
|
||||||
|
function(add_windows_version_resources target)
|
||||||
|
if(NOT WIN32)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT TARGET "${target}")
|
||||||
|
message(FATAL_ERROR "add_windows_version_resources: target '${target}' not found.")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Absolute path to the template (never changes)
|
||||||
|
get_filename_component(_rc_in
|
||||||
|
"${_VERSIONING_MODULE_DIR}/FileVersionInfo.rc.in"
|
||||||
|
ABSOLUTE
|
||||||
|
)
|
||||||
|
|
||||||
|
if(NOT EXISTS "${_rc_in}")
|
||||||
|
message(FATAL_ERROR
|
||||||
|
"FileVersionInfo.rc.in missing at: ${_rc_in}"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Output in the caller's binary dir
|
||||||
|
set(_rc_out "${CMAKE_CURRENT_BINARY_DIR}/${target}_version.rc")
|
||||||
|
get_filename_component(_rc_out "${_rc_out}" ABSOLUTE)
|
||||||
|
|
||||||
|
# Ensure directory exists
|
||||||
|
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}")
|
||||||
|
|
||||||
|
# Configure the template
|
||||||
|
configure_file("${_rc_in}" "${_rc_out}" @ONLY)
|
||||||
|
|
||||||
|
# Add to the target
|
||||||
|
target_sources(${target} PRIVATE "${_rc_out}")
|
||||||
|
endfunction()
|
||||||
47
demo/CMakeLists.txt
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
cmake_minimum_required(VERSION 3.16)
|
||||||
|
project(ads_demo VERSION ${VERSION_SHORT})
|
||||||
|
|
||||||
|
find_package(QT NAMES Qt6 Qt5 COMPONENTS Core REQUIRED)
|
||||||
|
find_package(Qt${QT_VERSION_MAJOR} 5.5 COMPONENTS Core Gui Widgets Quick QuickWidgets REQUIRED)
|
||||||
|
if(WIN32 AND QT_VERSION_MAJOR LESS 6)
|
||||||
|
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS AxContainer REQUIRED)
|
||||||
|
endif()
|
||||||
|
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
||||||
|
set(ads_demo_SRCS
|
||||||
|
main.cpp
|
||||||
|
MainWindow.cpp
|
||||||
|
mainwindow.ui
|
||||||
|
StatusDialog.cpp
|
||||||
|
StatusDialog.ui
|
||||||
|
ImageViewer.cpp
|
||||||
|
RenderWidget.cpp
|
||||||
|
demo.qrc
|
||||||
|
)
|
||||||
|
add_executable(AdvancedDockingSystemDemo WIN32 ${ads_demo_SRCS})
|
||||||
|
target_include_directories(AdvancedDockingSystemDemo PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../src")
|
||||||
|
target_link_libraries(AdvancedDockingSystemDemo PUBLIC Qt${QT_VERSION_MAJOR}::Core
|
||||||
|
Qt${QT_VERSION_MAJOR}::Gui
|
||||||
|
Qt${QT_VERSION_MAJOR}::Widgets
|
||||||
|
Qt${QT_VERSION_MAJOR}::Quick
|
||||||
|
Qt${QT_VERSION_MAJOR}::QuickWidgets)
|
||||||
|
if(WIN32 AND QT_VERSION_MAJOR LESS 6)
|
||||||
|
target_link_libraries(AdvancedDockingSystemDemo PUBLIC Qt${QT_VERSION_MAJOR}::AxContainer)
|
||||||
|
endif()
|
||||||
|
target_link_libraries(AdvancedDockingSystemDemo PRIVATE qtadvanceddocking-qt${QT_VERSION_MAJOR})
|
||||||
|
set_target_properties(AdvancedDockingSystemDemo PROPERTIES
|
||||||
|
AUTOMOC ON
|
||||||
|
AUTORCC ON
|
||||||
|
AUTOUIC ON
|
||||||
|
CXX_STANDARD 14
|
||||||
|
CXX_STANDARD_REQUIRED ON
|
||||||
|
CXX_EXTENSIONS OFF
|
||||||
|
VERSION ${VERSION_SHORT}
|
||||||
|
EXPORT_NAME "Qt Advanced Docking System Demo"
|
||||||
|
ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${ads_PlatformDir}/lib"
|
||||||
|
LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${ads_PlatformDir}/lib"
|
||||||
|
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${ads_PlatformDir}/bin"
|
||||||
|
)
|
||||||
|
#if(BUILD_STATIC)
|
||||||
|
# target_compile_definitions(AdvancedDockingSystemDemo PRIVATE ADS_STATIC)
|
||||||
|
#endif()
|
||||||
|
|
||||||
280
demo/ImageViewer.cpp
Normal file
@@ -0,0 +1,280 @@
|
|||||||
|
//============================================================================
|
||||||
|
/// \file ImageViewer.cpp
|
||||||
|
/// \author Uwe Kindler
|
||||||
|
/// \date 04.11.2022
|
||||||
|
/// \brief Implementation of CImageViewer
|
||||||
|
//============================================================================
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
// INCLUDES
|
||||||
|
//============================================================================
|
||||||
|
#include "ImageViewer.h"
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#include <QLabel>
|
||||||
|
#include <QImageReader>
|
||||||
|
#include <QImageWriter>
|
||||||
|
#include <QMessageBox>
|
||||||
|
#include <QApplication>
|
||||||
|
#include <QDir>
|
||||||
|
#include <QFileDialog>
|
||||||
|
#include <QStandardPaths>
|
||||||
|
#include <QAction>
|
||||||
|
#include <QScrollBar>
|
||||||
|
#include <QPixmap>
|
||||||
|
#include <QPainter>
|
||||||
|
#include <QImage>
|
||||||
|
#include <QMouseEvent>
|
||||||
|
#include <QWheelEvent>
|
||||||
|
|
||||||
|
#include "RenderWidget.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Private image viewer data
|
||||||
|
*/
|
||||||
|
struct ImageViewerPrivate
|
||||||
|
{
|
||||||
|
CImageViewer* _this;
|
||||||
|
CRenderWidget* RenderWidget;///< renders the image to screen
|
||||||
|
bool AutoFit;///< automatically fit image to window size on resize events
|
||||||
|
QSize ImageSize;///< stores the image size to detect image size changes
|
||||||
|
QPoint MouseMoveStartPos;///< for calculation of mouse move vector
|
||||||
|
QLabel* ScalingLabel;///< label displays scaling factor
|
||||||
|
QList<QWidget*> OverlayTools;///< list of tool widget to overlay
|
||||||
|
|
||||||
|
ImageViewerPrivate(CImageViewer* _public) : _this(_public) {}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
CImageViewer::CImageViewer(QWidget *parent)
|
||||||
|
: Super(parent),
|
||||||
|
d(new ImageViewerPrivate(this))
|
||||||
|
{
|
||||||
|
d->AutoFit = true;
|
||||||
|
d->RenderWidget = new CRenderWidget(this);
|
||||||
|
|
||||||
|
this->setBackgroundRole(QPalette::Light);
|
||||||
|
this->setAlignment(Qt::AlignCenter);
|
||||||
|
this->setWidget(d->RenderWidget);
|
||||||
|
this->createActions();
|
||||||
|
this->setMouseTracking(false); // only produce mouse move events if mouse button pressed
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
CImageViewer::~CImageViewer()
|
||||||
|
{
|
||||||
|
delete d;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
bool CImageViewer::loadFile(const QString& fileName)
|
||||||
|
{
|
||||||
|
QImageReader reader(fileName);
|
||||||
|
reader.setAutoTransform(true);
|
||||||
|
const QImage newImage = reader.read();
|
||||||
|
if (newImage.isNull())
|
||||||
|
{
|
||||||
|
QMessageBox::information(this, QGuiApplication::applicationDisplayName(),
|
||||||
|
tr("Cannot load %1: %2")
|
||||||
|
.arg(QDir::toNativeSeparators(fileName), reader.errorString()));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
setImage(newImage);
|
||||||
|
setWindowFilePath(fileName);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
void CImageViewer::setImage(const QImage &newImage)
|
||||||
|
{
|
||||||
|
d->RenderWidget->showImage(newImage);
|
||||||
|
this->adjustDisplaySize(newImage);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
void CImageViewer::adjustDisplaySize(const QImage& Image)
|
||||||
|
{
|
||||||
|
if (d->ImageSize == Image.size())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
d->ImageSize = Image.size();
|
||||||
|
if (d->AutoFit)
|
||||||
|
{
|
||||||
|
this->fitToWindow();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
static void initializeImageFileDialog(QFileDialog &dialog, QFileDialog::AcceptMode acceptMode)
|
||||||
|
{
|
||||||
|
static bool firstDialog = true;
|
||||||
|
|
||||||
|
if (firstDialog) {
|
||||||
|
firstDialog = false;
|
||||||
|
const QStringList picturesLocations = QStandardPaths::standardLocations(QStandardPaths::PicturesLocation);
|
||||||
|
dialog.setDirectory(picturesLocations.isEmpty() ? QDir::currentPath() : picturesLocations.last());
|
||||||
|
}
|
||||||
|
|
||||||
|
QStringList mimeTypeFilters;
|
||||||
|
const QByteArrayList supportedMimeTypes = acceptMode == QFileDialog::AcceptOpen
|
||||||
|
? QImageReader::supportedMimeTypes() : QImageWriter::supportedMimeTypes();
|
||||||
|
for (const QByteArray &mimeTypeName : supportedMimeTypes)
|
||||||
|
mimeTypeFilters.append(mimeTypeName);
|
||||||
|
mimeTypeFilters.sort();
|
||||||
|
dialog.setMimeTypeFilters(mimeTypeFilters);
|
||||||
|
dialog.selectMimeTypeFilter("image/jpeg");
|
||||||
|
if (acceptMode == QFileDialog::AcceptSave)
|
||||||
|
dialog.setDefaultSuffix("jpg");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
void CImageViewer::open()
|
||||||
|
{
|
||||||
|
QFileDialog dialog(this, tr("Open File"));
|
||||||
|
initializeImageFileDialog(dialog, QFileDialog::AcceptOpen);
|
||||||
|
|
||||||
|
while (dialog.exec() == QDialog::Accepted && !loadFile(dialog.selectedFiles().first())) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
void CImageViewer::createActions()
|
||||||
|
{
|
||||||
|
QAction* a;
|
||||||
|
a = new QAction(tr("&Open..."));
|
||||||
|
a->setIcon(QIcon(":/adsdemo/images/perm_media.svg"));
|
||||||
|
connect(a, &QAction::triggered, this, &CImageViewer::open);
|
||||||
|
a->setShortcut(QKeySequence::Open);;
|
||||||
|
this->addAction(a);
|
||||||
|
|
||||||
|
a = new QAction(tr("Fit on Screen"));
|
||||||
|
a->setIcon(QIcon(":/adsdemo/images/zoom_out_map.svg"));
|
||||||
|
connect(a, &QAction::triggered, this, &CImageViewer::fitToWindow);
|
||||||
|
this->addAction(a);
|
||||||
|
|
||||||
|
a = new QAction(tr("Actual Pixels"));
|
||||||
|
a->setIcon(QIcon(":/adsdemo/images/find_in_page.svg"));
|
||||||
|
connect(a, &QAction::triggered, this, &CImageViewer::normalSize);
|
||||||
|
this->addAction(a);
|
||||||
|
|
||||||
|
a = new QAction(this);
|
||||||
|
a->setSeparator(true);
|
||||||
|
this->addAction(a);
|
||||||
|
|
||||||
|
a = new QAction(tr("Zoom In (25%)"));
|
||||||
|
a->setIcon(QIcon(":/adsdemo/images/zoom_in.svg"));
|
||||||
|
connect(a, &QAction::triggered, this, &CImageViewer::zoomIn);
|
||||||
|
this->addAction(a);
|
||||||
|
|
||||||
|
a = new QAction(tr("Zoom Out (25%)"));
|
||||||
|
a->setIcon(QIcon(":/adsdemo/images/zoom_out.svg"));
|
||||||
|
connect(a, &QAction::triggered, this, &CImageViewer::zoomOut);
|
||||||
|
this->addAction(a);
|
||||||
|
|
||||||
|
this->setContextMenuPolicy(Qt::ActionsContextMenu);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
void CImageViewer::zoomIn()
|
||||||
|
{
|
||||||
|
d->AutoFit = false;
|
||||||
|
d->RenderWidget->zoomIn();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
void CImageViewer::zoomOut()
|
||||||
|
{
|
||||||
|
d->AutoFit = false;
|
||||||
|
d->RenderWidget->zoomOut();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
void CImageViewer::normalSize()
|
||||||
|
{
|
||||||
|
d->AutoFit = false;
|
||||||
|
d->RenderWidget->normalSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
void CImageViewer::fitToWindow()
|
||||||
|
{
|
||||||
|
d->AutoFit = true;
|
||||||
|
d->RenderWidget->scaleToSize(this->maximumViewportSize());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
void CImageViewer::resizeEvent(QResizeEvent* ResizeEvent)
|
||||||
|
{
|
||||||
|
Super::resizeEvent(ResizeEvent);
|
||||||
|
if (d->AutoFit)
|
||||||
|
{
|
||||||
|
this->fitToWindow();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
void CImageViewer::mousePressEvent(QMouseEvent* Event)
|
||||||
|
{
|
||||||
|
d->RenderWidget->setCursor(Qt::ClosedHandCursor);
|
||||||
|
d->MouseMoveStartPos = Event->pos();
|
||||||
|
Super::mousePressEvent(Event);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
void CImageViewer::mouseReleaseEvent(QMouseEvent* Event)
|
||||||
|
{
|
||||||
|
d->RenderWidget->setCursor(Qt::OpenHandCursor);
|
||||||
|
Super::mouseReleaseEvent(Event);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
void CImageViewer::mouseMoveEvent(QMouseEvent* Event)
|
||||||
|
{
|
||||||
|
QPoint MoveVector = Event->pos() - d->MouseMoveStartPos;
|
||||||
|
d->MouseMoveStartPos = Event->pos();
|
||||||
|
horizontalScrollBar()->setValue(horizontalScrollBar()->value()
|
||||||
|
- MoveVector.x());
|
||||||
|
verticalScrollBar()->setValue(verticalScrollBar()->value() - MoveVector.y());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
void CImageViewer::wheelEvent(QWheelEvent* Event)
|
||||||
|
{
|
||||||
|
double numDegrees = Event->angleDelta().y() / 8;
|
||||||
|
double numSteps = numDegrees / 15;
|
||||||
|
d->AutoFit = false;
|
||||||
|
double Zoom;
|
||||||
|
if (numSteps < 0)
|
||||||
|
{
|
||||||
|
Zoom = pow(0.9, 0 - numSteps);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Zoom = pow(1.10, numSteps);
|
||||||
|
}
|
||||||
|
d->RenderWidget->zoomByValue(Zoom);
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "moc_ImageViewer.cpp"
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
// EOF ImageViewer.cpp
|
||||||
88
demo/ImageViewer.h
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
#ifndef ImageViewerH
|
||||||
|
#define ImageViewerH
|
||||||
|
//============================================================================
|
||||||
|
/// \file ImageViewer.h
|
||||||
|
/// \author Uwe Kindler
|
||||||
|
/// \date 04.11.2022
|
||||||
|
/// \brief Declaration of CImageViewer
|
||||||
|
//============================================================================
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
// INCLUDES
|
||||||
|
//============================================================================
|
||||||
|
#include <QScrollArea>
|
||||||
|
|
||||||
|
QT_BEGIN_NAMESPACE
|
||||||
|
class QLabel;
|
||||||
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
|
|
||||||
|
struct ImageViewerPrivate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tiny simple image viewer for showing images in demo
|
||||||
|
*/
|
||||||
|
class CImageViewer : public QScrollArea
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
using Super = QScrollArea;
|
||||||
|
|
||||||
|
explicit CImageViewer(QWidget *parent = nullptr);
|
||||||
|
virtual ~CImageViewer();
|
||||||
|
|
||||||
|
bool loadFile(const QString& Filename);
|
||||||
|
void setImage(const QImage &newImage);
|
||||||
|
|
||||||
|
public Q_SLOTS:
|
||||||
|
void open();
|
||||||
|
void zoomIn();
|
||||||
|
void zoomOut();
|
||||||
|
void normalSize();
|
||||||
|
void fitToWindow();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
/**
|
||||||
|
* @brief Reimplemented from QScrollArea to adjust image scaling if m_AutoFit is
|
||||||
|
* true.
|
||||||
|
*/
|
||||||
|
virtual void resizeEvent(QResizeEvent* ResizeEvent);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle mouse press events.
|
||||||
|
*/
|
||||||
|
virtual void mousePressEvent(QMouseEvent* Event);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handles mouse release events.
|
||||||
|
*/
|
||||||
|
virtual void mouseReleaseEvent(QMouseEvent* Event);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handle mouse move events.
|
||||||
|
*/
|
||||||
|
virtual void mouseMoveEvent(QMouseEvent* Event);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Use mouse wheel to change scaling of the image.
|
||||||
|
*/
|
||||||
|
virtual void wheelEvent(QWheelEvent* Event);
|
||||||
|
|
||||||
|
private:
|
||||||
|
/**
|
||||||
|
* @brief Create the wiget actions.
|
||||||
|
*/
|
||||||
|
void createActions();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Adjust size of render widget in case of image size change.
|
||||||
|
* @param[in] Image The new image that may have a different image size.
|
||||||
|
*/
|
||||||
|
void adjustDisplaySize(const QImage& Image);
|
||||||
|
|
||||||
|
ImageViewerPrivate* d;
|
||||||
|
friend ImageViewerPrivate;
|
||||||
|
};
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
#endif // ImageViewerH
|
||||||
1062
demo/MainWindow.cpp
Normal file
74
demo/MainWindow.h
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
#ifndef MAINWINDOW_H
|
||||||
|
#define MAINWINDOW_H
|
||||||
|
/*******************************************************************************
|
||||||
|
** Qt Advanced Docking System
|
||||||
|
** Copyright (C) 2017 Uwe Kindler
|
||||||
|
**
|
||||||
|
** This library is free software; you can redistribute it and/or
|
||||||
|
** modify it under the terms of the GNU Lesser General Public
|
||||||
|
** License as published by the Free Software Foundation; either
|
||||||
|
** version 2.1 of the License, or (at your option) any later version.
|
||||||
|
**
|
||||||
|
** This library is distributed in the hope that it will be useful,
|
||||||
|
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
** Lesser General Public License for more details.
|
||||||
|
**
|
||||||
|
** You should have received a copy of the GNU Lesser General Public
|
||||||
|
** License along with this library; If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
/// \file MainWindow.h
|
||||||
|
/// \author Uwe Kindler
|
||||||
|
/// \date 13.02.2018
|
||||||
|
/// \brief Declaration of CMainWindow class
|
||||||
|
//============================================================================
|
||||||
|
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
// INCLUDES
|
||||||
|
//============================================================================
|
||||||
|
#include <QMainWindow>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
struct MainWindowPrivate;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simple main window for demo
|
||||||
|
*/
|
||||||
|
class CMainWindow : public QMainWindow
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
private:
|
||||||
|
MainWindowPrivate* d;///< private data - pimpl
|
||||||
|
friend struct MainWindowPrivate;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void closeEvent(QCloseEvent* event) override;
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit CMainWindow(QWidget *parent = 0);
|
||||||
|
virtual ~CMainWindow();
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void on_actionSaveState_triggered(bool);
|
||||||
|
void on_actionRestoreState_triggered(bool);
|
||||||
|
void savePerspective();
|
||||||
|
void onViewToggled(bool Open);
|
||||||
|
void onViewVisibilityChanged(bool Visible);
|
||||||
|
void createEditor();
|
||||||
|
void createTable();
|
||||||
|
void onEditorCloseRequested();
|
||||||
|
void onImageViewerCloseRequested();
|
||||||
|
void showStatusDialog();
|
||||||
|
void toggleDockWidgetWindowTitle();
|
||||||
|
void applyVsStyle();
|
||||||
|
void createImageViewer();
|
||||||
|
void lockWorkspace(bool Value);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // MAINWINDOW_H
|
||||||
58
demo/MyDockAreaTitleBar.h
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
#ifndef QTADS_MYDOCKAREATITLEBAR_H
|
||||||
|
#define QTADS_MYDOCKAREATITLEBAR_H
|
||||||
|
/*******************************************************************************
|
||||||
|
** Qt Advanced Docking System
|
||||||
|
** Copyright (C) 2017 Uwe Kindler
|
||||||
|
**
|
||||||
|
** This library is free software; you can redistribute it and/or
|
||||||
|
** modify it under the terms of the GNU Lesser General Public
|
||||||
|
** License as published by the Free Software Foundation; either
|
||||||
|
** version 2.1 of the License, or (at your option) any later version.
|
||||||
|
**
|
||||||
|
** This library is distributed in the hope that it will be useful,
|
||||||
|
** but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
** Lesser General Public License for more details.
|
||||||
|
**
|
||||||
|
** You should have received a copy of the GNU Lesser General Public
|
||||||
|
** License along with this library; If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
// INCLUDES
|
||||||
|
//============================================================================
|
||||||
|
#include <DockAreaTitleBar.h>
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Custom DockAreaTitleBar that adds a custom context menu
|
||||||
|
*/
|
||||||
|
class MyDockAreaTitleBar : public ads::CDockAreaTitleBar
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit MyDockAreaTitleBar(ads::CDockAreaWidget *parent) :
|
||||||
|
CDockAreaTitleBar(parent)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
QMenu* buildContextMenu(QMenu*) override
|
||||||
|
{
|
||||||
|
auto menu = ads::CDockAreaTitleBar::buildContextMenu(nullptr);
|
||||||
|
menu->addSeparator();
|
||||||
|
auto action = menu->addAction(tr("Format HardDrive"));
|
||||||
|
|
||||||
|
connect(action, &QAction::triggered, this, [this]()
|
||||||
|
{
|
||||||
|
QMessageBox msgBox;
|
||||||
|
msgBox.setText("No, just kidding");
|
||||||
|
msgBox.setStandardButtons(QMessageBox::Abort);
|
||||||
|
msgBox.setDefaultButton(QMessageBox::Abort);
|
||||||
|
msgBox.exec();
|
||||||
|
});
|
||||||
|
|
||||||
|
return menu;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // QTADS_MYDOCKAREATITLEBAR_H
|
||||||
108
demo/RenderWidget.cpp
Normal file
@@ -0,0 +1,108 @@
|
|||||||
|
//============================================================================
|
||||||
|
/// \file RenderWidget.cpp
|
||||||
|
/// \author Uwe Kindler
|
||||||
|
/// \date 04.11.2022
|
||||||
|
/// \brief Implementation of CRenderWidget
|
||||||
|
//============================================================================
|
||||||
|
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
// INCLUDES
|
||||||
|
//============================================================================
|
||||||
|
#include "RenderWidget.h"
|
||||||
|
|
||||||
|
#include <QPainter>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
CRenderWidget::CRenderWidget(QWidget* Parent) :
|
||||||
|
QWidget(Parent), m_ScaleFactor(1)
|
||||||
|
{
|
||||||
|
this->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
|
||||||
|
this->setCursor(Qt::OpenHandCursor);
|
||||||
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
CRenderWidget::~CRenderWidget()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
void CRenderWidget::showImage(const QImage& Image)
|
||||||
|
{
|
||||||
|
m_Image = QPixmap::fromImage(Image);
|
||||||
|
this->adjustWidgetSize();
|
||||||
|
this->repaint();
|
||||||
|
}
|
||||||
|
|
||||||
|
//===========================================================================
|
||||||
|
void CRenderWidget::paintEvent(QPaintEvent* Event)
|
||||||
|
{
|
||||||
|
Q_UNUSED(Event);
|
||||||
|
QPainter Painter(this);
|
||||||
|
Painter.setRenderHint(QPainter::SmoothPixmapTransform, true);
|
||||||
|
Painter.setRenderHint(QPainter::Antialiasing, true);
|
||||||
|
Painter.scale(m_ScaleFactor, m_ScaleFactor);
|
||||||
|
Painter.drawPixmap(QPoint(0, 0), m_Image);
|
||||||
|
}
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
void CRenderWidget::zoomIn()
|
||||||
|
{
|
||||||
|
scaleImage(1.25);
|
||||||
|
}
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
void CRenderWidget::zoomOut()
|
||||||
|
{
|
||||||
|
scaleImage(0.8);
|
||||||
|
}
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
void CRenderWidget::zoomByValue(double ZoomValue)
|
||||||
|
{
|
||||||
|
scaleImage(ZoomValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
void CRenderWidget::normalSize()
|
||||||
|
{
|
||||||
|
m_ScaleFactor = 1;
|
||||||
|
this->adjustWidgetSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
void CRenderWidget::scaleImage(double ScaleFactor)
|
||||||
|
{
|
||||||
|
m_ScaleFactor *= ScaleFactor;
|
||||||
|
this->adjustWidgetSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
void CRenderWidget::adjustWidgetSize()
|
||||||
|
{
|
||||||
|
QSize ScaledImageSize = m_Image.size() * m_ScaleFactor;
|
||||||
|
if (ScaledImageSize != this->size())
|
||||||
|
{
|
||||||
|
this->setFixedSize(ScaledImageSize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
void CRenderWidget::scaleToSize(const QSize& TargetSize)
|
||||||
|
{
|
||||||
|
if (m_Image.isNull())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
double ScaleFactorH = (double) TargetSize.width() / m_Image.size().width();
|
||||||
|
double ScaleFactorV = (double) TargetSize.height()
|
||||||
|
/ m_Image.size().height();
|
||||||
|
m_ScaleFactor = (ScaleFactorH < ScaleFactorV) ? ScaleFactorH : ScaleFactorV;
|
||||||
|
this->adjustWidgetSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
// EOF RenderWidget.cpp
|
||||||
111
demo/RenderWidget.h
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
#ifndef RenderWidgetH
|
||||||
|
#define RenderWidgetH
|
||||||
|
//============================================================================
|
||||||
|
/// \file RenderWidget.h
|
||||||
|
/// \author Uwe Kindler
|
||||||
|
/// \date 04.11.2022
|
||||||
|
/// \brief Declaration of CRenderWidget
|
||||||
|
//============================================================================
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
// INCLUDES
|
||||||
|
//============================================================================
|
||||||
|
#include <QWidget>
|
||||||
|
#include <QPixmap>
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
// FORWARD DECLARATIONS
|
||||||
|
//============================================================================
|
||||||
|
class QImage;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Widget for fast display of images (i.e. for video capture devices)
|
||||||
|
*/
|
||||||
|
class CRenderWidget : public QWidget
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
private:
|
||||||
|
QPixmap m_Image;
|
||||||
|
double m_ScaleFactor;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
/**
|
||||||
|
* @brief Reimplemented paint event method showing actual image.
|
||||||
|
*/
|
||||||
|
void paintEvent(QPaintEvent* PaintEvent);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Change scale factor
|
||||||
|
*/
|
||||||
|
void scaleImage(double ScaleFactor);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Adjust widget size to size of image.
|
||||||
|
*/
|
||||||
|
void adjustWidgetSize();
|
||||||
|
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
* @param[in] Parent Parent widget.
|
||||||
|
*/
|
||||||
|
CRenderWidget(QWidget* Parent);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Destructor
|
||||||
|
*/
|
||||||
|
virtual ~CRenderWidget();
|
||||||
|
|
||||||
|
signals:
|
||||||
|
/**
|
||||||
|
* @brief Signalize change of captured image size.
|
||||||
|
* @param ImageSize New image size.
|
||||||
|
*/
|
||||||
|
void imageSizeChanged(const QSize& ImageSize);
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
/**
|
||||||
|
* @brief Show new image in render widget.
|
||||||
|
*/
|
||||||
|
void showImage(const QImage& Image);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Zoom into the scene.
|
||||||
|
* This function decreases the scaling factor by setting it to the previous
|
||||||
|
* value in internal scaling list.
|
||||||
|
* @brief Steps The number of steps to zoom in. One step is 25%.
|
||||||
|
*/
|
||||||
|
void zoomIn();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Zoom out of the scene.
|
||||||
|
* This function decreases the scaling factor by setting it to the next
|
||||||
|
* value in internal scaling list.
|
||||||
|
* @brief Steps The number of steps to zoom out. One step is 25%.
|
||||||
|
*/
|
||||||
|
void zoomOut();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Change zoom by zoom value.
|
||||||
|
* @param[in] ZoomValue This is the zoom value to apply. A value of 1
|
||||||
|
* means no change a value > 1 increases the image (i.e. 1.25 would increase
|
||||||
|
* the image by 25%) and a value of < 1 decreases the image size (i.e.
|
||||||
|
* a value of 0.8 would decrease the image size by 25%).
|
||||||
|
*/
|
||||||
|
void zoomByValue(double ZoomValue);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Resets the actual scaling to 1 and display the image with its
|
||||||
|
* actual pixel size.
|
||||||
|
*/
|
||||||
|
void normalSize();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Scales the wiget and its content image to the given TargetSize
|
||||||
|
*/
|
||||||
|
void scaleToSize(const QSize& TargetSize);
|
||||||
|
}; // class CRenderWidget
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
#endif // RenderWidgetH
|
||||||
88
demo/StatusDialog.cpp
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
//============================================================================
|
||||||
|
/// \file StatusDialog.cpp
|
||||||
|
/// \author Uwe Kindler
|
||||||
|
/// \date 13.04.2020
|
||||||
|
/// \brief Implementation of CStatusDialog class
|
||||||
|
//============================================================================
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
// INCLUDES
|
||||||
|
//============================================================================
|
||||||
|
#include "StatusDialog.h"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
#include "DockManager.h"
|
||||||
|
#include "DockWidget.h"
|
||||||
|
#include "ui_StatusDialog.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Private data class of CStatusDialog class (pimpl)
|
||||||
|
*/
|
||||||
|
struct StatusDialogPrivate
|
||||||
|
{
|
||||||
|
CStatusDialog *_this;
|
||||||
|
Ui::CStatusDialogClass ui;
|
||||||
|
ads::CDockManager* DockManager;
|
||||||
|
QMap<QString, ads::CDockWidget*> DockWidgets;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Private data constructor
|
||||||
|
*/
|
||||||
|
StatusDialogPrivate(CStatusDialog *_public);
|
||||||
|
};
|
||||||
|
// struct StatusDialogPrivate
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
StatusDialogPrivate::StatusDialogPrivate(CStatusDialog *_public) :
|
||||||
|
_this(_public)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
CStatusDialog::CStatusDialog(ads::CDockManager* DockManager) :
|
||||||
|
QDialog(DockManager),
|
||||||
|
d(new StatusDialogPrivate(this))
|
||||||
|
{
|
||||||
|
d->ui.setupUi(this);
|
||||||
|
d->DockManager = DockManager;
|
||||||
|
d->DockWidgets = DockManager->dockWidgetsMap();
|
||||||
|
|
||||||
|
for (auto it = d->DockWidgets.begin(); it != d->DockWidgets.end(); ++it)
|
||||||
|
{
|
||||||
|
QVariant vDockWidget = QVariant::fromValue(it.value());
|
||||||
|
d->ui.dockWidgetsComboBox->addItem(it.key(), vDockWidget);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
CStatusDialog::~CStatusDialog()
|
||||||
|
{
|
||||||
|
delete d;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
void CStatusDialog::on_dockWidgetsComboBox_currentIndexChanged(int index)
|
||||||
|
{
|
||||||
|
if (index < 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto vDockWidget = d->ui.dockWidgetsComboBox->currentData();
|
||||||
|
auto DockWidget = vDockWidget.value<ads::CDockWidget*>();
|
||||||
|
d->ui.isClosedCheckBox->setChecked(DockWidget->isClosed());
|
||||||
|
d->ui.isFloatingCheckBox->setChecked(DockWidget->isFloating());
|
||||||
|
d->ui.tabbedCheckBox->setChecked(DockWidget->isTabbed());
|
||||||
|
d->ui.isCurrentTabCheckBox->setChecked(DockWidget->isCurrentTab());
|
||||||
|
d->ui.closableCheckBox->setChecked(DockWidget->features().testFlag(ads::CDockWidget::DockWidgetClosable));
|
||||||
|
d->ui.movableCheckBox->setChecked(DockWidget->features().testFlag(ads::CDockWidget::DockWidgetMovable));
|
||||||
|
d->ui.floatableCheckBox->setChecked(DockWidget->features().testFlag(ads::CDockWidget::DockWidgetFloatable));
|
||||||
|
d->ui.deleteOnCloseCheckBox->setChecked(DockWidget->features().testFlag(ads::CDockWidget::DockWidgetDeleteOnClose));
|
||||||
|
d->ui.customCloseHandlingCheckBox->setChecked(DockWidget->features().testFlag(ads::CDockWidget::CustomCloseHandling));
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------
|
||||||
|
// EOF StatusDialog.cpp
|
||||||
47
demo/StatusDialog.h
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
#ifndef StatusDialogH
|
||||||
|
#define StatusDialogH
|
||||||
|
//============================================================================
|
||||||
|
/// \file StatusDialog.h
|
||||||
|
/// \author Uwe Kindler
|
||||||
|
/// \date 13.04.2020
|
||||||
|
/// \brief Declaration of CStatusDialog class
|
||||||
|
//============================================================================
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
// INCLUDES
|
||||||
|
//============================================================================
|
||||||
|
#include <QDialog>
|
||||||
|
|
||||||
|
namespace ads {class CDockManager;}
|
||||||
|
struct StatusDialogPrivate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Displays status info about dock widgets
|
||||||
|
*/
|
||||||
|
class CStatusDialog : public QDialog
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
private:
|
||||||
|
StatusDialogPrivate* d; ///< private data (pimpl)
|
||||||
|
friend struct StatusDialogPrivate;
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void on_dockWidgetsComboBox_currentIndexChanged(int index);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
public:
|
||||||
|
using Super = QDialog;
|
||||||
|
/**
|
||||||
|
* Default Constructor
|
||||||
|
*/
|
||||||
|
CStatusDialog(ads::CDockManager* parent);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Virtual Destructor
|
||||||
|
*/
|
||||||
|
virtual ~CStatusDialog();
|
||||||
|
}; // class StatusDialog
|
||||||
|
|
||||||
|
// namespace namespace_name
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
#endif // StatusDialogH
|
||||||
146
demo/StatusDialog.ui
Normal file
@@ -0,0 +1,146 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>CStatusDialogClass</class>
|
||||||
|
<widget class="QDialog" name="CStatusDialogClass">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>357</width>
|
||||||
|
<height>331</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>Dock Widget Status</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||||
|
<property name="sizeConstraint">
|
||||||
|
<enum>QLayout::SetFixedSize</enum>
|
||||||
|
</property>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="dockWidgetLabel">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>Dock Widget:</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QComboBox" name="dockWidgetsComboBox">
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>300</width>
|
||||||
|
<height>0</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="statusGroupBox">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="title">
|
||||||
|
<string>Status</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="isClosedCheckBox">
|
||||||
|
<property name="text">
|
||||||
|
<string>closed</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="isFloatingCheckBox">
|
||||||
|
<property name="text">
|
||||||
|
<string>floating</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="tabbedCheckBox">
|
||||||
|
<property name="text">
|
||||||
|
<string>tabbed</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="isCurrentTabCheckBox">
|
||||||
|
<property name="text">
|
||||||
|
<string>is current tab</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QGroupBox" name="flagsGroupBox">
|
||||||
|
<property name="sizePolicy">
|
||||||
|
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
|
||||||
|
<horstretch>0</horstretch>
|
||||||
|
<verstretch>0</verstretch>
|
||||||
|
</sizepolicy>
|
||||||
|
</property>
|
||||||
|
<property name="title">
|
||||||
|
<string>Feature Flags</string>
|
||||||
|
</property>
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout_3">
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="closableCheckBox">
|
||||||
|
<property name="text">
|
||||||
|
<string>DockWidgetClosable</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="movableCheckBox">
|
||||||
|
<property name="text">
|
||||||
|
<string>DockWidgetMovable</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="floatableCheckBox">
|
||||||
|
<property name="text">
|
||||||
|
<string>DockWidgetFloatable</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="deleteOnCloseCheckBox">
|
||||||
|
<property name="text">
|
||||||
|
<string>DockWidgetDeleteOnClose</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QCheckBox" name="customCloseHandlingCheckBox">
|
||||||
|
<property name="text">
|
||||||
|
<string>CustomCloseHandling</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<resources/>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
||||||
4
demo/app.css
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
ads--CTitleBarButton::menu-indicator
|
||||||
|
{
|
||||||
|
image: none;
|
||||||
|
}
|
||||||
BIN
demo/app.ico
Normal file
|
After Width: | Height: | Size: 103 KiB |
1
demo/app.rc
Normal file
@@ -0,0 +1 @@
|
|||||||
|
IDI_ICON1 ICON DISCARDABLE "app.ico"
|
||||||
49
demo/demo.pro
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
ADS_OUT_ROOT = $${OUT_PWD}/..
|
||||||
|
|
||||||
|
TARGET = AdvancedDockingSystemDemo
|
||||||
|
DESTDIR = $${ADS_OUT_ROOT}/lib
|
||||||
|
QT += core gui widgets quick quickwidgets
|
||||||
|
|
||||||
|
include(../ads.pri)
|
||||||
|
|
||||||
|
lessThan(QT_MAJOR_VERSION, 6) {
|
||||||
|
win32 {
|
||||||
|
QT += axcontainer
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CONFIG += c++14
|
||||||
|
CONFIG += debug_and_release
|
||||||
|
DEFINES += QT_DEPRECATED_WARNINGS
|
||||||
|
RC_FILE += app.rc
|
||||||
|
|
||||||
|
adsBuildStatic {
|
||||||
|
DEFINES += ADS_STATIC
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
HEADERS += \
|
||||||
|
MainWindow.h \
|
||||||
|
StatusDialog.h \
|
||||||
|
ImageViewer.h \
|
||||||
|
RenderWidget.h
|
||||||
|
|
||||||
|
SOURCES += \
|
||||||
|
main.cpp \
|
||||||
|
MainWindow.cpp \
|
||||||
|
StatusDialog.cpp \
|
||||||
|
ImageViewer.cpp \
|
||||||
|
RenderWidget.cpp
|
||||||
|
|
||||||
|
FORMS += \
|
||||||
|
mainwindow.ui \
|
||||||
|
StatusDialog.ui
|
||||||
|
|
||||||
|
RESOURCES += demo.qrc
|
||||||
|
|
||||||
|
|
||||||
|
LIBS += -L$${ADS_OUT_ROOT}/lib
|
||||||
|
|
||||||
|
|
||||||
|
INCLUDEPATH += ../src
|
||||||
|
DEPENDPATH += ../src
|
||||||
43
demo/demo.qrc
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
<RCC>
|
||||||
|
<qresource prefix="/adsdemo">
|
||||||
|
<file>images/folder.svg</file>
|
||||||
|
<file>images/folder_open.svg</file>
|
||||||
|
<file>images/note_add.svg</file>
|
||||||
|
<file>images/picture_in_picture.svg</file>
|
||||||
|
<file>images/restore.svg</file>
|
||||||
|
<file>images/save.svg</file>
|
||||||
|
<file>images/date_range.svg</file>
|
||||||
|
<file>images/edit.svg</file>
|
||||||
|
<file>images/grid_on.svg</file>
|
||||||
|
<file>images/custom-menu-button.svg</file>
|
||||||
|
<file>app.css</file>
|
||||||
|
<file>images/plus.svg</file>
|
||||||
|
<file>images/help_outline.svg</file>
|
||||||
|
<file>images/fullscreen.svg</file>
|
||||||
|
<file>images/create_floating_editor.svg</file>
|
||||||
|
<file>images/create_floating_table.svg</file>
|
||||||
|
<file>images/docked_editor.svg</file>
|
||||||
|
<file>images/tab.svg</file>
|
||||||
|
<file>res/visual_studio_light.css</file>
|
||||||
|
<file>images/color_lens.svg</file>
|
||||||
|
<file>images/ads_icon.svg</file>
|
||||||
|
<file>images/ads_logo.svg</file>
|
||||||
|
<file>images/find_in_page.svg</file>
|
||||||
|
<file>images/perm_media.svg</file>
|
||||||
|
<file>images/zoom_in.svg</file>
|
||||||
|
<file>images/zoom_out.svg</file>
|
||||||
|
<file>images/zoom_out_map.svg</file>
|
||||||
|
<file>images/ads_tile_blue.svg</file>
|
||||||
|
<file>images/ads_tile_blue_light.svg</file>
|
||||||
|
<file>images/ads_tile_green.svg</file>
|
||||||
|
<file>images/ads_tile_orange.svg</file>
|
||||||
|
<file>images/photo.svg</file>
|
||||||
|
<file>images/crop_original.svg</file>
|
||||||
|
<file>images/panorama.svg</file>
|
||||||
|
<file>images/ads_icon2.svg</file>
|
||||||
|
<file>images/font_download.svg</file>
|
||||||
|
<file>images/lock_outline.svg</file>
|
||||||
|
<file>images/lock.svg</file>
|
||||||
|
<file>images/lock_open.svg</file>
|
||||||
|
</qresource>
|
||||||
|
</RCC>
|
||||||
11
demo/images/ads_icon.svg
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="1024" height="1024" version="1.1" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<text x="1251.1022" y="1305.4956" fill="#000000" font-family="sans-serif" font-size="40px" style="line-height:1.25" xml:space="preserve"><tspan x="1251.1022" y="1305.4956"/></text>
|
||||||
|
<g transform="translate(581.23 1750.5)">
|
||||||
|
<path d="m191.64-726.53h-521.75c-138.69 0-251.12-112.43-251.12-251.12v-521.75c0-138.69 112.43-251.12 251.12-251.12h521.75c138.69 0 251.12 112.43 251.12 251.12v521.75c0 138.69-112.43 251.12-251.12 251.12z" fill="#e0e0e0" style="mix-blend-mode:normal"/>
|
||||||
|
<path d="m-175.9-1515.9v256h469.33v-256z" fill="#009ddd" style="mix-blend-mode:normal"/>
|
||||||
|
<path d="m80.1-1217.2v256h213.33v-256z" fill="#ff9833" style="mix-blend-mode:normal"/>
|
||||||
|
<path d="m-175.9-1217.2v256h213.33v-256z" fill="#accb01" style="mix-blend-mode:normal"/>
|
||||||
|
<path d="m-431.9-1515.9v554.67h213.33v-554.67z" fill="#0083c3" style="mix-blend-mode:normal"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1004 B |
11
demo/images/ads_icon2.svg
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="1024" height="1024" version="1.1" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<desc>electric_iron icon - Licensed under Iconfu Standard License v1.0 (https://www.iconfu.com/iconfu_standard_license) - Incors GmbH</desc>
|
||||||
|
<g transform="matrix(1.4118 0 0 1.4118 -210.82 -210.82)" stroke-width=".50173">
|
||||||
|
<text x="1251.1022" y="1305.4956" fill="#000000" font-family="sans-serif" font-size="40px" style="line-height:1.25" xml:space="preserve"><tspan x="1251.1022" y="1305.4956" stroke-width=".70833"/></text>
|
||||||
|
<path d="m405.33 234.66v256h469.33v-256z" fill="#009ddd" style="mix-blend-mode:normal"/>
|
||||||
|
<path d="m661.33 533.33v256h213.33v-256z" fill="#ff9833" style="mix-blend-mode:normal"/>
|
||||||
|
<path d="m405.33 533.33v256h213.33v-256z" fill="#accb01" style="mix-blend-mode:normal"/>
|
||||||
|
<path d="m149.33 234.66v554.67h213.33v-554.67z" fill="#0083c3" style="mix-blend-mode:normal"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 956 B |
12
demo/images/ads_logo.svg
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="6907.3" height="1024" version="1.1" viewBox="0 0 6907.3 1024" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<text x="1251.1022" y="1305.4956" fill="#000000" font-family="sans-serif" font-size="40px" style="line-height:1.25" xml:space="preserve"><tspan x="1251.1022" y="1305.4956"/></text>
|
||||||
|
<text x="1178.9221" y="718.37329" fill="#8f918f" font-family="sans-serif" font-size="628px" style="line-height:1.25" xml:space="preserve"><tspan x="1178.9221" y="718.37329" fill="#8f918f" font-family="'Segoe UI'" font-size="628px" font-weight="300">Qt Advanced Docking</tspan></text>
|
||||||
|
<g transform="translate(581.23 1750.5)">
|
||||||
|
<path d="m191.64-726.53h-521.75c-138.69 0-251.12-112.43-251.12-251.12v-521.75c0-138.69 112.43-251.12 251.12-251.12h521.75c138.69 0 251.12 112.43 251.12 251.12v521.75c0 138.69-112.43 251.12-251.12 251.12z" fill="#e0e0e0" style="mix-blend-mode:normal"/>
|
||||||
|
<path d="m-175.9-1515.9v256h469.33v-256z" fill="#009ddd" style="mix-blend-mode:normal"/>
|
||||||
|
<path d="m80.1-1217.2v256h213.33v-256z" fill="#ff9833" style="mix-blend-mode:normal"/>
|
||||||
|
<path d="m-175.9-1217.2v256h213.33v-256z" fill="#accb01" style="mix-blend-mode:normal"/>
|
||||||
|
<path d="m-431.9-1515.9v554.67h213.33v-554.67z" fill="#0083c3" style="mix-blend-mode:normal"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.3 KiB |
33
demo/images/ads_tile_blue.svg
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="1024" height="1024" version="1.1" viewBox="0 0 270.93 270.93" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="m-2.5e-6 -2.5e-6v270.93h270.93v-270.93z" fill="#0083c3" stroke-width=".26458" style="mix-blend-mode:normal"/>
|
||||||
|
<g fill="#fff" fill-opacity=".25">
|
||||||
|
<g transform="matrix(.12402 0 0 .12402 71.967 73.674)" stroke-width="4.7887">
|
||||||
|
<path d="m405.33 234.66v256h469.33v-256z" style="mix-blend-mode:normal"/>
|
||||||
|
<path d="m661.33 533.33v256h213.33v-256z" style="mix-blend-mode:normal"/>
|
||||||
|
<path d="m405.33 533.33v256h213.33v-256z" style="mix-blend-mode:normal"/>
|
||||||
|
<path d="m149.33 234.66v554.67h213.33v-554.67z" style="mix-blend-mode:normal"/>
|
||||||
|
</g>
|
||||||
|
<g stroke-width=".26458" aria-label="Docking">
|
||||||
|
<path d="m100.07 182.94q0 2.7805-1.5208 4.1938-1.5054 1.3979-4.2091 1.3979h-3.057v-10.968h3.3796q1.6437 0 2.8573 0.61447 1.2289 0.61446 1.8895 1.8127 0.66055 1.1982 0.66055 2.9494zm-1.4594 0.0461q0-2.1967-1.0907-3.2106-1.0753-1.0292-3.057-1.0292h-1.7973v8.6026h1.4901q4.4549 0 4.4549-4.3627z"/>
|
||||||
|
<path d="m114.84 184.4q0 2.0431-1.0446 3.1645-1.0292 1.1214-2.7958 1.1214-1.0907 0-1.9509-0.49158-0.84489-0.50693-1.3365-1.4594-0.49158-0.96778-0.49158-2.335 0-2.0431 1.0139-3.1491 1.0292-1.106 2.8112-1.106 1.106 0 1.9663 0.50694 0.86026 0.49157 1.3365 1.444 0.49158 0.93706 0.49158 2.3042zm-6.2215 0q0 1.4594 0.56838 2.3196 0.58374 0.84489 1.8434 0.84489 1.2443 0 1.828-0.84489 0.58374-0.86025 0.58374-2.3196 0-1.4594-0.58374-2.2889-0.58375-0.82953-1.8434-0.82953t-1.828 0.82953-0.56838 2.2889z"/>
|
||||||
|
<path d="m125.64 188.69q-1.106 0-1.9509-0.44549-0.84489-0.44549-1.3365-1.3826-0.47622-0.93707-0.47622-2.3964 0-1.5208 0.49158-2.4732 0.50693-0.95243 1.3826-1.3979t1.9817-0.44549q0.61447 0 1.1982 0.13826 0.59911 0.12289 0.96779 0.30723l-0.41477 1.1214q-0.36868-0.13826-0.86025-0.26115-0.49158-0.1229-0.9217-0.1229-2.4272 0-2.4272 3.1184 0 1.4901 0.58374 2.2889 0.59911 0.78345 1.7666 0.78345 0.66055 0 1.1828-0.13826 0.5223-0.13825 0.95242-0.33795v1.1982q-0.41476 0.21506-0.9217 0.3226-0.49157 0.12289-1.1982 0.12289z"/>
|
||||||
|
<path d="m136.4 176.86v6.0986q0 0.24579-0.0307 0.6452-0.0154 0.3994-0.0307 0.69127h0.0614q0.0922-0.12289 0.27651-0.35332 0.18434-0.23042 0.36868-0.46085 0.19971-0.24578 0.33796-0.3994l2.6268-2.7805h1.5823l-3.3335 3.5178 3.5639 4.716h-1.6283l-2.8573-3.8404-0.93707 0.81417v3.0262h-1.3365v-11.675z"/>
|
||||||
|
<path d="m149.32 177.22q0.30724 0 0.53766 0.21506 0.24579 0.1997 0.24579 0.64519t-0.24579 0.66056q-0.23042 0.1997-0.53766 0.1997-0.33795 0-0.56838-0.1997-0.23042-0.21507-0.23042-0.66056t0.23042-0.64519q0.23043-0.21506 0.56838-0.21506zm0.66056 3.0877v8.2339h-1.3518v-8.2339z"/>
|
||||||
|
<path d="m161.92 180.15q1.4747 0 2.2274 0.722 0.75272 0.722 0.75272 2.3043v5.3612h-1.3365v-5.2691q0-1.9817-1.8434-1.9817-1.3672 0-1.8895 0.76808-0.5223 0.76809-0.5223 2.2121v4.2706h-1.3518v-8.2339h1.0907l0.1997 1.1214h0.0768q0.39941-0.64519 1.106-0.95242 0.70664-0.3226 1.4901-0.3226z"/>
|
||||||
|
<path d="m175.73 180.15q0.81417 0 1.4594 0.30724 0.66055 0.30723 1.1214 0.93706h0.0768l0.18434-1.0907h1.0753v8.3721q0 1.7666-0.90634 2.6576-0.89098 0.89098-2.7805 0.89098-1.8127 0-2.9648-0.5223v-1.2443q1.2136 0.6452 3.0416 0.6452 1.06 0 1.6591-0.62983 0.61447-0.61447 0.61447-1.6898v-0.3226q0-0.18434 0.0154-0.52229 0.0154-0.35332 0.0307-0.49158h-0.0615q-0.82953 1.2443-2.55 1.2443-1.5976 0-2.504-1.1214-0.89098-1.1214-0.89098-3.1338 0-1.9663 0.89098-3.1184 0.90634-1.1675 2.4886-1.1675zm0.18434 1.1368q-1.0292 0-1.5976 0.82953-0.56838 0.81417-0.56838 2.335t0.55302 2.335q0.55302 0.79881 1.6437 0.79881 1.2443 0 1.8127-0.66056 0.56838-0.67591 0.56838-2.166v-0.32259q0-1.6744-0.58374-2.4118-0.58375-0.73736-1.828-0.73736z"/>
|
||||||
|
</g>
|
||||||
|
<g stroke-width=".26458" aria-label="Qt Advanced ">
|
||||||
|
<path d="m100.61 89.668q0 2.0124-0.81417 3.441-0.79881 1.4133-2.3811 1.9356l2.6269 2.7344h-1.9817l-2.1199-2.4732q-0.09217 0-0.1997 0-0.09217 0.01536-0.18434 0.01536-1.7051 0-2.8419-0.70664-1.1214-0.70664-1.6744-1.9817-0.55302-1.275-0.55302-2.9802 0-1.6744 0.55302-2.9341 0.55302-1.275 1.6744-1.9817 1.1368-0.70664 2.8573-0.70664 1.6437 0 2.7651 0.70664 1.1214 0.69128 1.6898 1.9663 0.58374 1.2597 0.58374 2.9648zm-8.664 0q0 2.0738 0.87562 3.272 0.87562 1.1829 2.7344 1.1829 1.8588 0 2.719-1.1829 0.87562-1.1982 0.87562-3.272 0-2.0738-0.86026-3.2413-0.86026-1.1829-2.719-1.1829-1.8741 0-2.7497 1.1829-0.87562 1.1675-0.87562 3.2413z"/>
|
||||||
|
<path d="m105.6 94.215q0.30723 0 0.62983-0.04609 0.32259-0.04609 0.52229-0.12289v1.0292q-0.21506 0.10753-0.61446 0.16898-0.39941 0.07681-0.76809 0.07681-0.64519 0-1.1982-0.21506-0.53766-0.23042-0.87562-0.78345-0.33796-0.55302-0.33796-1.5515v-4.7929h-1.1675v-0.64519l1.1829-0.53766 0.53766-1.7512h0.7988v1.8895h2.3811v1.0446h-2.3811v4.7621q0 0.75272 0.35332 1.1214 0.36868 0.35332 0.93707 0.35332z"/>
|
||||||
|
<path d="m119.46 95.168-1.3211-3.3949h-4.3474l-1.3058 3.3949h-1.3979l4.2859-11.014h1.2443l4.2706 11.014zm-1.7359-4.6239-1.2289-3.3181q-0.0461-0.12289-0.15362-0.44549-0.10753-0.3226-0.21507-0.66055-0.0922-0.35332-0.15361-0.53766-0.1229 0.47621-0.26115 0.93706-0.12289 0.44549-0.21507 0.70664l-1.2443 3.3181z"/>
|
||||||
|
<path d="m125.13 95.321q-1.5362 0-2.4579-1.06-0.9217-1.0753-0.9217-3.1952t0.9217-3.1952q0.93706-1.0907 2.4732-1.0907 0.95243 0 1.5515 0.35332 0.61447 0.35332 0.99851 0.86026h0.0922q-0.0307-0.1997-0.0614-0.58374-0.0307-0.3994-0.0307-0.62983v-3.2874h1.3518v11.675h-1.0907l-0.1997-1.106h-0.0614q-0.36868 0.5223-0.98314 0.89098-0.61447 0.36868-1.5823 0.36868zm0.21506-1.1214q1.3058 0 1.828-0.70664 0.53766-0.722 0.53766-2.166v-0.24579q0-1.5362-0.50694-2.3503-0.50694-0.82953-1.8741-0.82953-1.0907 0-1.6437 0.87562-0.53766 0.86026-0.53766 2.3196 0 1.4747 0.53766 2.2889 0.55302 0.81417 1.6591 0.81417z"/>
|
||||||
|
<path d="m133.47 95.168-3.1184-8.2339h1.444l1.7512 4.8543q0.12289 0.33796 0.26115 0.75272 0.13825 0.41477 0.24579 0.79881 0.10753 0.38404 0.15361 0.62983h0.0615q0.0461-0.24579 0.16898-0.62983 0.12289-0.3994 0.26115-0.79881 0.13825-0.41477 0.26115-0.75272l1.7512-4.8543h1.444l-3.1338 8.2339z"/>
|
||||||
|
<path d="m142.58 86.796q1.5054 0 2.2274 0.66055 0.722 0.66055 0.722 2.1046v5.607h-0.98315l-0.26115-1.1675h-0.0615q-0.53766 0.67591-1.1368 0.99851-0.59911 0.3226-1.6283 0.3226-1.1214 0-1.8588-0.58374-0.73736-0.59911-0.73736-1.8588 0-1.2289 0.96778-1.8895 0.96779-0.67591 2.9802-0.73736l1.3979-0.04609v-0.49158q0-1.0292-0.44549-1.4286t-1.2597-0.3994q-0.64519 0-1.2289 0.1997-0.58374 0.18434-1.0907 0.43013l-0.41476-1.0139q0.53766-0.29187 1.275-0.49158 0.73736-0.21506 1.5362-0.21506zm1.613 4.3474-1.2136 0.04609q-1.5362 0.06145-2.1353 0.49157-0.58375 0.43013-0.58375 1.2136 0 0.69128 0.41477 1.0139 0.43013 0.3226 1.0907 0.3226 1.0292 0 1.7205-0.56838 0.70664-0.58374 0.70664-1.782z"/>
|
||||||
|
<path d="m152.04 86.78q1.4747 0 2.2274 0.722 0.75272 0.722 0.75272 2.3043v5.3612h-1.3365v-5.2691q0-1.9817-1.8434-1.9817-1.3672 0-1.8895 0.76808t-0.5223 2.2121v4.2706h-1.3518v-8.2339h1.0907l0.1997 1.1214h0.0768q0.39941-0.64519 1.106-0.95243 0.70663-0.3226 1.4901-0.3226z"/>
|
||||||
|
<path d="m160.87 95.321q-1.106 0-1.9509-0.44549-0.8449-0.44549-1.3365-1.3826-0.47622-0.93706-0.47622-2.3964 0-1.5208 0.49158-2.4732 0.50694-0.95243 1.3826-1.3979 0.87562-0.44549 1.9817-0.44549 0.61447 0 1.1982 0.13826 0.59911 0.12289 0.96779 0.30723l-0.41476 1.1214q-0.36869-0.13826-0.86026-0.26115-0.49157-0.12289-0.9217-0.12289-2.4272 0-2.4272 3.1184 0 1.4901 0.58374 2.2889 0.59911 0.78345 1.7666 0.78345 0.66055 0 1.1828-0.13826 0.5223-0.13826 0.95243-0.33796v1.1982q-0.41477 0.21506-0.92171 0.3226-0.49157 0.12289-1.1982 0.12289z"/>
|
||||||
|
<path d="m168.13 86.78q1.0446 0 1.8127 0.46085 0.76809 0.46085 1.1675 1.3057 0.41477 0.82953 0.41477 1.9509v0.81417h-5.6378q0.0307 1.3979 0.70664 2.1353 0.69128 0.722 1.9202 0.722 0.78345 0 1.3826-0.13826 0.61447-0.15362 1.2597-0.43013v1.1829q-0.62983 0.27651-1.2443 0.3994-0.61447 0.13826-1.4594 0.13826-1.1828 0-2.0738-0.47621t-1.3979-1.4133q-0.49157-0.93706-0.49157-2.3196 0-1.3518 0.44549-2.3196 0.46085-0.96779 1.275-1.4901 0.82953-0.5223 1.9202-0.5223zm-0.0154 1.106q-0.96779 0-1.5362 0.62983-0.55302 0.61447-0.66055 1.7205h4.1937q-0.0154-1.0446-0.49157-1.6898-0.47622-0.66055-1.5054-0.66055z"/>
|
||||||
|
<path d="m176.53 95.321q-1.5362 0-2.4579-1.06-0.92171-1.0753-0.92171-3.1952t0.92171-3.1952q0.93706-1.0907 2.4732-1.0907 0.95243 0 1.5515 0.35332 0.61447 0.35332 0.99851 0.86026h0.0922q-0.0307-0.1997-0.0614-0.58374-0.0307-0.3994-0.0307-0.62983v-3.2874h1.3518v11.675h-1.0907l-0.1997-1.106h-0.0614q-0.36868 0.5223-0.98315 0.89098-0.61446 0.36868-1.5822 0.36868zm0.21506-1.1214q1.3058 0 1.828-0.70664 0.53766-0.722 0.53766-2.166v-0.24579q0-1.5362-0.50693-2.3503-0.50694-0.82953-1.8741-0.82953-1.0907 0-1.6437 0.87562-0.53766 0.86026-0.53766 2.3196 0 1.4747 0.53766 2.2889 0.55302 0.81417 1.6591 0.81417z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 8.5 KiB |
147
demo/images/ads_tile_blue_light.svg
Normal file
@@ -0,0 +1,147 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
width="1024"
|
||||||
|
height="1024"
|
||||||
|
viewBox="0 0 270.93333 270.93333"
|
||||||
|
version="1.1"
|
||||||
|
id="svg506"
|
||||||
|
inkscape:version="1.2.1 (9c6d41e410, 2022-07-14)"
|
||||||
|
sodipodi:docname="ads_tile_blue_light.svg"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="namedview508"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:showpageshadow="2"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pagecheckerboard="0"
|
||||||
|
inkscape:deskcolor="#d1d1d1"
|
||||||
|
inkscape:document-units="px"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="0.77111176"
|
||||||
|
inkscape:cx="450.64804"
|
||||||
|
inkscape:cy="534.2935"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-height="1009"
|
||||||
|
inkscape:window-x="-8"
|
||||||
|
inkscape:window-y="-8"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="layer1" />
|
||||||
|
<defs
|
||||||
|
id="defs503" />
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1">
|
||||||
|
<path
|
||||||
|
id="path16513"
|
||||||
|
style="mix-blend-mode:normal;fill:#009ddd;fill-opacity:1;fill-rule:nonzero;stroke-width:0.264583"
|
||||||
|
d="M -2.5e-6,-2.5e-6 V 270.93333 H 270.93333 V -2.5e-6 Z" />
|
||||||
|
<g
|
||||||
|
id="g1224"
|
||||||
|
transform="matrix(0.12402399,0,0,0.12402399,71.967002,73.673805)"
|
||||||
|
style="fill:#ffffff;fill-opacity:0.25;stroke-width:2.13332">
|
||||||
|
<path
|
||||||
|
id="path927"
|
||||||
|
style="mix-blend-mode:normal;fill:#ffffff;fill-opacity:0.25;fill-rule:nonzero;stroke-width:4.7887"
|
||||||
|
d="m 405.32995,234.66 v 256 h 469.3301 v -256 z" />
|
||||||
|
<path
|
||||||
|
id="path16513-9"
|
||||||
|
style="mix-blend-mode:normal;fill:#ffffff;fill-opacity:0.25;fill-rule:nonzero;stroke-width:4.7887"
|
||||||
|
d="M 661.32995,533.3299 V 789.32994 H 874.66003 V 533.3299 Z" />
|
||||||
|
<path
|
||||||
|
id="path16513-5"
|
||||||
|
style="mix-blend-mode:normal;fill:#ffffff;fill-opacity:0.25;fill-rule:nonzero;stroke-width:4.7887"
|
||||||
|
d="m 405.32995,533.33 v 256 h 213.33008 v -256 z" />
|
||||||
|
<path
|
||||||
|
id="path24788"
|
||||||
|
style="mix-blend-mode:normal;fill:#ffffff;fill-opacity:0.25;fill-rule:nonzero;stroke-width:4.7887"
|
||||||
|
d="M 149.32995,234.66 V 789.32994 H 362.66003 V 234.66 Z" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
aria-label="Docking"
|
||||||
|
id="text2150"
|
||||||
|
style="font-size:15.3617px;line-height:1.05;fill:#ffffff;stroke-width:0.264583;fill-opacity:0.25">
|
||||||
|
<path
|
||||||
|
d="m 100.07327,182.94499 q 0,2.78047 -1.520805,4.19375 -1.505447,1.39791 -4.209106,1.39791 H 91.286381 V 177.5684 h 3.379574 q 1.643702,0 2.857276,0.61447 1.228936,0.61446 1.889489,1.81268 0.66055,1.19821 0.66055,2.94944 z m -1.459358,0.0461 q 0,-2.19673 -1.090681,-3.2106 -1.075319,-1.02923 -3.056978,-1.02923 h -1.797319 v 8.60255 h 1.490085 q 4.454893,0 4.454893,-4.36272 z"
|
||||||
|
style="text-align:center;letter-spacing:5.36125px;text-anchor:middle;fill:#ffffff;fill-opacity:0.25"
|
||||||
|
id="path2539" />
|
||||||
|
<path
|
||||||
|
d="m 114.83588,184.40435 q 0,2.04311 -1.0446,3.16451 -1.02923,1.12141 -2.79583,1.12141 -1.09068,0 -1.95094,-0.49158 -0.84489,-0.50693 -1.33646,-1.45936 -0.49158,-0.96778 -0.49158,-2.33498 0,-2.0431 1.01387,-3.14914 1.02924,-1.10605 2.8112,-1.10605 1.10604,0 1.96629,0.50694 0.86026,0.49157 1.33647,1.444 0.49158,0.93706 0.49158,2.30425 z m -6.22149,0 q 0,1.45937 0.56838,2.31962 0.58374,0.84489 1.8434,0.84489 1.2443,0 1.82805,-0.84489 0.58374,-0.86025 0.58374,-2.31962 0,-1.45936 -0.58374,-2.28889 -0.58375,-0.82953 -1.84341,-0.82953 -1.25966,0 -1.82804,0.82953 -0.56838,0.82953 -0.56838,2.28889 z"
|
||||||
|
style="text-align:center;letter-spacing:5.36125px;text-anchor:middle;fill:#ffffff;fill-opacity:0.25"
|
||||||
|
id="path2541" />
|
||||||
|
<path
|
||||||
|
d="m 125.63516,188.69027 q -1.10604,0 -1.95094,-0.44549 -0.84489,-0.44549 -1.33646,-1.38255 -0.47622,-0.93707 -0.47622,-2.39643 0,-1.52081 0.49158,-2.47323 0.50693,-0.95243 1.38255,-1.39792 0.87562,-0.44549 1.98166,-0.44549 0.61447,0 1.19821,0.13826 0.59911,0.12289 0.96779,0.30723 l -0.41477,1.12141 q -0.36868,-0.13826 -0.86025,-0.26115 -0.49158,-0.1229 -0.9217,-0.1229 -2.42715,0 -2.42715,3.11843 0,1.49008 0.58374,2.28889 0.59911,0.78345 1.7666,0.78345 0.66055,0 1.18285,-0.13826 0.5223,-0.13825 0.95242,-0.33795 v 1.19821 q -0.41476,0.21506 -0.9217,0.3226 -0.49157,0.12289 -1.19821,0.12289 z"
|
||||||
|
style="text-align:center;letter-spacing:5.36125px;text-anchor:middle;fill:#ffffff;fill-opacity:0.25"
|
||||||
|
id="path2543" />
|
||||||
|
<path
|
||||||
|
d="m 136.40372,176.86176 v 6.09859 q 0,0.24579 -0.0307,0.6452 -0.0154,0.3994 -0.0307,0.69127 h 0.0614 q 0.0922,-0.12289 0.27651,-0.35332 0.18434,-0.23042 0.36868,-0.46085 0.19971,-0.24578 0.33796,-0.3994 l 2.62685,-2.78047 h 1.58226 l -3.33349,3.51783 3.56391,4.71604 h -1.62834 l -2.85727,-3.84042 -0.93707,0.81417 v 3.02625 h -1.33647 v -11.67489 z"
|
||||||
|
style="text-align:center;letter-spacing:5.36125px;text-anchor:middle;fill:#ffffff;fill-opacity:0.25"
|
||||||
|
id="path2545" />
|
||||||
|
<path
|
||||||
|
d="m 149.32293,177.21508 q 0.30724,0 0.53766,0.21506 0.24579,0.1997 0.24579,0.64519 0,0.44549 -0.24579,0.66056 -0.23042,0.1997 -0.53766,0.1997 -0.33795,0 -0.56838,-0.1997 -0.23042,-0.21507 -0.23042,-0.66056 0,-0.44549 0.23042,-0.64519 0.23043,-0.21506 0.56838,-0.21506 z m 0.66056,3.0877 v 8.23387 h -1.35183 v -8.23387 z"
|
||||||
|
style="text-align:center;letter-spacing:5.36125px;text-anchor:middle;fill:#ffffff;fill-opacity:0.25"
|
||||||
|
id="path2547" />
|
||||||
|
<path
|
||||||
|
d="m 161.91954,180.14916 q 1.47472,0 2.22745,0.722 0.75272,0.722 0.75272,2.30426 v 5.36123 h -1.33647 v -5.26906 q 0,-1.98166 -1.8434,-1.98166 -1.36719,0 -1.88949,0.76808 -0.5223,0.76809 -0.5223,2.21209 v 4.27055 h -1.35183 v -8.23387 h 1.09068 l 0.1997,1.1214 h 0.0768 q 0.39941,-0.64519 1.10604,-0.95242 0.70664,-0.3226 1.49009,-0.3226 z"
|
||||||
|
style="text-align:center;letter-spacing:5.36125px;text-anchor:middle;fill:#ffffff;fill-opacity:0.25"
|
||||||
|
id="path2549" />
|
||||||
|
<path
|
||||||
|
d="m 175.72973,180.14916 q 0.81417,0 1.45936,0.30724 0.66055,0.30723 1.1214,0.93706 h 0.0768 l 0.18434,-1.09068 h 1.07532 v 8.37213 q 0,1.76659 -0.90634,2.65757 -0.89098,0.89098 -2.78047,0.89098 -1.81268,0 -2.96481,-0.5223 v -1.2443 q 1.21358,0.6452 3.04162,0.6452 1.05996,0 1.65906,-0.62983 0.61447,-0.61447 0.61447,-1.68979 v -0.3226 q 0,-0.18434 0.0154,-0.52229 0.0154,-0.35332 0.0307,-0.49158 h -0.0615 q -0.82953,1.2443 -2.55004,1.2443 -1.59762,0 -2.50396,-1.12141 -0.89098,-1.1214 -0.89098,-3.13378 0,-1.9663 0.89098,-3.11843 0.90634,-1.16749 2.4886,-1.16749 z m 0.18434,1.13677 q -1.02924,0 -1.59762,0.82953 -0.56838,0.81417 -0.56838,2.33498 0,1.52081 0.55302,2.33498 0.55302,0.79881 1.6437,0.79881 1.2443,0 1.81268,-0.66056 0.56838,-0.67591 0.56838,-2.166 v -0.32259 q 0,-1.67443 -0.58374,-2.41179 -0.58375,-0.73736 -1.82804,-0.73736 z"
|
||||||
|
style="text-align:center;letter-spacing:5.36125px;text-anchor:middle;fill:#ffffff;fill-opacity:0.25"
|
||||||
|
id="path2551" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
aria-label="Qt Advanced
|
||||||
|
"
|
||||||
|
id="text2150-1"
|
||||||
|
style="font-size:15.3617px;line-height:1.05;fill:#ffffff;stroke-width:0.264583;fill-opacity:0.25">
|
||||||
|
<path
|
||||||
|
d="m 100.61097,89.66819 q 0,2.012383 -0.814169,3.441021 -0.798808,1.413276 -2.381063,1.935574 l 2.626852,2.734383 h -1.981661 l -2.119914,-2.473234 q -0.09217,0 -0.199702,0 -0.09217,0.01536 -0.184341,0.01536 -1.705148,0 -2.841914,-0.706638 -1.121404,-0.706639 -1.674426,-1.98166 -0.553021,-1.275021 -0.553021,-2.980169 0,-1.674426 0.553021,-2.934085 0.553022,-1.275021 1.674426,-1.98166 1.136766,-0.706638 2.857276,-0.706638 1.643702,0 2.765106,0.706638 1.121404,0.691277 1.68979,1.966298 0.58374,1.25966 0.58374,2.964808 z m -8.663997,0 q 0,2.07383 0.875617,3.272042 0.875617,1.182851 2.734382,1.182851 1.858766,0 2.719021,-1.182851 0.875617,-1.198212 0.875617,-3.272042 0,-2.073829 -0.860255,-3.241318 -0.860255,-1.182851 -2.719021,-1.182851 -1.874127,0 -2.749744,1.182851 -0.875617,1.167489 -0.875617,3.241318 z"
|
||||||
|
style="text-align:center;text-anchor:middle;fill:#ffffff;fill-opacity:0.25"
|
||||||
|
id="path2518" />
|
||||||
|
<path
|
||||||
|
d="m 105.60353,94.215253 q 0.30723,0 0.62983,-0.04609 0.32259,-0.04609 0.52229,-0.122893 v 1.029234 q -0.21506,0.107532 -0.61446,0.168978 -0.39941,0.07681 -0.76809,0.07681 -0.64519,0 -1.19821,-0.215064 -0.53766,-0.230425 -0.87562,-0.783447 -0.33796,-0.553021 -0.33796,-1.551531 v -4.792851 h -1.16749 v -0.645191 l 1.18286,-0.53766 0.53766,-1.751234 h 0.7988 v 1.88949 h 2.38107 v 1.044595 h -2.38107 v 4.762127 q 0,0.752724 0.35332,1.121404 0.36868,0.353319 0.93707,0.353319 z"
|
||||||
|
style="text-align:center;text-anchor:middle;fill:#ffffff;fill-opacity:0.25"
|
||||||
|
id="path2520" />
|
||||||
|
<path
|
||||||
|
d="m 119.45978,95.167679 -1.3211,-3.394936 h -4.34736 l -1.30575,3.394936 h -1.39791 l 4.28591,-11.014339 h 1.2443 l 4.27055,11.014339 z m -1.73587,-4.623872 -1.22893,-3.318127 q -0.0461,-0.122894 -0.15362,-0.445489 -0.10753,-0.322596 -0.21507,-0.660554 -0.0922,-0.353319 -0.15361,-0.537659 -0.1229,0.476213 -0.26115,0.937064 -0.12289,0.445489 -0.21507,0.706638 l -1.24429,3.318127 z"
|
||||||
|
style="text-align:center;text-anchor:middle;fill:#ffffff;fill-opacity:0.25"
|
||||||
|
id="path2522" />
|
||||||
|
<path
|
||||||
|
d="m 125.12825,95.321296 q -1.53617,0 -2.45787,-1.059957 -0.9217,-1.075319 -0.9217,-3.195234 0,-2.119915 0.9217,-3.195234 0.93706,-1.09068 2.47323,-1.09068 0.95243,0 1.55153,0.353319 0.61447,0.353319 0.99851,0.860255 h 0.0922 q -0.0307,-0.199702 -0.0614,-0.583745 -0.0307,-0.399404 -0.0307,-0.629829 v -3.287404 h 1.35183 v 11.674892 h -1.09068 l -0.1997,-1.106043 h -0.0614 q -0.36868,0.522298 -0.98314,0.890979 -0.61447,0.368681 -1.58226,0.368681 z m 0.21506,-1.121404 q 1.30575,0 1.82805,-0.706638 0.53766,-0.722 0.53766,-2.166 v -0.245787 q 0,-1.53617 -0.50694,-2.35034 -0.50694,-0.829532 -1.87413,-0.829532 -1.09068,0 -1.6437,0.875617 -0.53766,0.860255 -0.53766,2.319616 0,1.474724 0.53766,2.288894 0.55302,0.81417 1.65906,0.81417 z"
|
||||||
|
style="text-align:center;text-anchor:middle;fill:#ffffff;fill-opacity:0.25"
|
||||||
|
id="path2524" />
|
||||||
|
<path
|
||||||
|
d="m 133.46965,95.167679 -3.11842,-8.233871 h 1.444 l 1.75123,4.854297 q 0.12289,0.337957 0.26115,0.752723 0.13825,0.414766 0.24579,0.798809 0.10753,0.384042 0.15361,0.629829 h 0.0615 q 0.0461,-0.245787 0.16898,-0.629829 0.12289,-0.399405 0.26115,-0.798809 0.13825,-0.414766 0.26115,-0.752723 l 1.75123,-4.854297 h 1.444 l -3.13379,8.233871 z"
|
||||||
|
style="text-align:center;text-anchor:middle;fill:#ffffff;fill-opacity:0.25"
|
||||||
|
id="path2526" />
|
||||||
|
<path
|
||||||
|
d="m 142.57913,86.795552 q 1.50545,0 2.22745,0.660553 0.722,0.660554 0.722,2.104553 v 5.607021 h -0.98315 l -0.26115,-1.167489 h -0.0615 q -0.53766,0.675914 -1.13676,0.99851 -0.59911,0.322596 -1.62834,0.322596 -1.12141,0 -1.85877,-0.583745 -0.73736,-0.599106 -0.73736,-1.858765 0,-1.228936 0.96778,-1.88949 0.96779,-0.675914 2.98017,-0.737361 l 1.39792,-0.04609 V 89.71427 q 0,-1.029234 -0.44549,-1.428638 -0.44549,-0.399404 -1.25966,-0.399404 -0.64519,0 -1.22894,0.199702 -0.58374,0.184341 -1.09068,0.430128 l -0.41476,-1.013872 q 0.53766,-0.291873 1.27502,-0.491575 0.73736,-0.215064 1.53617,-0.215064 z m 1.61298,4.347361 -1.21358,0.04609 q -1.53617,0.06145 -2.13527,0.491574 -0.58375,0.430128 -0.58375,1.213574 0,0.691277 0.41477,1.013872 0.43013,0.322596 1.09068,0.322596 1.02923,0 1.72051,-0.568383 0.70664,-0.583744 0.70664,-1.781957 z"
|
||||||
|
style="text-align:center;text-anchor:middle;fill:#ffffff;fill-opacity:0.25"
|
||||||
|
id="path2528" />
|
||||||
|
<path
|
||||||
|
d="m 152.04195,86.780191 q 1.47472,0 2.22745,0.722 0.75272,0.721999 0.75272,2.304255 v 5.361233 h -1.33647 v -5.269063 q 0,-1.98166 -1.8434,-1.98166 -1.36719,0 -1.88949,0.768085 -0.5223,0.768085 -0.5223,2.212085 v 4.270553 h -1.35183 v -8.233871 h 1.09068 l 0.1997,1.121404 h 0.0768 q 0.39941,-0.645192 1.10605,-0.952426 0.70663,-0.322595 1.49008,-0.322595 z"
|
||||||
|
style="text-align:center;text-anchor:middle;fill:#ffffff;fill-opacity:0.25"
|
||||||
|
id="path2530" />
|
||||||
|
<path
|
||||||
|
d="m 160.87493,95.321296 q -1.10604,0 -1.95093,-0.445489 -0.8449,-0.44549 -1.33647,-1.382553 -0.47622,-0.937064 -0.47622,-2.396426 0,-1.520808 0.49158,-2.473233 0.50694,-0.952426 1.38255,-1.397915 0.87562,-0.445489 1.98166,-0.445489 0.61447,0 1.19821,0.138255 0.59911,0.122894 0.96779,0.307234 l -0.41476,1.121404 q -0.36869,-0.138255 -0.86026,-0.261149 -0.49157,-0.122893 -0.9217,-0.122893 -2.42715,0 -2.42715,3.118425 0,1.490085 0.58374,2.288893 0.59911,0.783447 1.7666,0.783447 0.66055,0 1.18285,-0.138256 0.5223,-0.138255 0.95243,-0.337957 v 1.198213 q -0.41477,0.215063 -0.92171,0.322595 -0.49157,0.122894 -1.19821,0.122894 z"
|
||||||
|
style="text-align:center;text-anchor:middle;fill:#ffffff;fill-opacity:0.25"
|
||||||
|
id="path2532" />
|
||||||
|
<path
|
||||||
|
d="m 168.12564,86.780191 q 1.0446,0 1.81268,0.460851 0.76809,0.460851 1.16749,1.305744 0.41477,0.829532 0.41477,1.950936 v 0.81417 h -5.63775 q 0.0307,1.397915 0.70664,2.135276 0.69128,0.722 1.92021,0.722 0.78345,0 1.38256,-0.138255 0.61447,-0.153617 1.25966,-0.430128 v 1.182851 q -0.62983,0.276511 -1.2443,0.399405 -0.61447,0.138255 -1.45936,0.138255 -1.18285,0 -2.07383,-0.476213 -0.89098,-0.476213 -1.39792,-1.413276 -0.49157,-0.937064 -0.49157,-2.319617 0,-1.35183 0.44549,-2.319617 0.46085,-0.967787 1.27502,-1.490085 0.82953,-0.522297 1.92021,-0.522297 z m -0.0154,1.106042 q -0.96779,0 -1.53617,0.62983 -0.55302,0.614468 -0.66055,1.72051 h 4.19374 q -0.0154,-1.044595 -0.49157,-1.689787 -0.47622,-0.660553 -1.50545,-0.660553 z"
|
||||||
|
style="text-align:center;text-anchor:middle;fill:#ffffff;fill-opacity:0.25"
|
||||||
|
id="path2534" />
|
||||||
|
<path
|
||||||
|
d="m 176.52848,95.321296 q -1.53617,0 -2.45787,-1.059957 -0.92171,-1.075319 -0.92171,-3.195234 0,-2.119915 0.92171,-3.195234 0.93706,-1.09068 2.47323,-1.09068 0.95243,0 1.55153,0.353319 0.61447,0.353319 0.99851,0.860255 h 0.0922 q -0.0307,-0.199702 -0.0614,-0.583745 -0.0307,-0.399404 -0.0307,-0.629829 v -3.287404 h 1.35183 v 11.674892 h -1.09068 l -0.1997,-1.106043 h -0.0614 q -0.36868,0.522298 -0.98315,0.890979 -0.61446,0.368681 -1.58225,0.368681 z m 0.21506,-1.121404 q 1.30575,0 1.82804,-0.706638 0.53766,-0.722 0.53766,-2.166 v -0.245787 q 0,-1.53617 -0.50693,-2.35034 -0.50694,-0.829532 -1.87413,-0.829532 -1.09068,0 -1.6437,0.875617 -0.53766,0.860255 -0.53766,2.319616 0,1.474724 0.53766,2.288894 0.55302,0.81417 1.65906,0.81417 z"
|
||||||
|
style="text-align:center;text-anchor:middle;fill:#ffffff;fill-opacity:0.25"
|
||||||
|
id="path2536" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 14 KiB |
33
demo/images/ads_tile_green.svg
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="1024" height="1024" version="1.1" viewBox="0 0 270.93 270.93" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="m-2.5e-6 -2.5e-6v270.93h270.93v-270.93z" fill="#accb01" stroke-width=".26458" style="mix-blend-mode:normal"/>
|
||||||
|
<g fill="#fff" fill-opacity=".25">
|
||||||
|
<g transform="matrix(.12402 0 0 .12402 71.967 73.674)" stroke-width="4.7887">
|
||||||
|
<path d="m405.33 234.66v256h469.33v-256z" style="mix-blend-mode:normal"/>
|
||||||
|
<path d="m661.33 533.33v256h213.33v-256z" style="mix-blend-mode:normal"/>
|
||||||
|
<path d="m405.33 533.33v256h213.33v-256z" style="mix-blend-mode:normal"/>
|
||||||
|
<path d="m149.33 234.66v554.67h213.33v-554.67z" style="mix-blend-mode:normal"/>
|
||||||
|
</g>
|
||||||
|
<g stroke-width=".26458" aria-label="Docking">
|
||||||
|
<path d="m100.07 182.94q0 2.7805-1.5208 4.1938-1.5054 1.3979-4.2091 1.3979h-3.057v-10.968h3.3796q1.6437 0 2.8573 0.61447 1.2289 0.61446 1.8895 1.8127 0.66055 1.1982 0.66055 2.9494zm-1.4594 0.0461q0-2.1967-1.0907-3.2106-1.0753-1.0292-3.057-1.0292h-1.7973v8.6026h1.4901q4.4549 0 4.4549-4.3627z"/>
|
||||||
|
<path d="m114.84 184.4q0 2.0431-1.0446 3.1645-1.0292 1.1214-2.7958 1.1214-1.0907 0-1.9509-0.49158-0.84489-0.50693-1.3365-1.4594-0.49158-0.96778-0.49158-2.335 0-2.0431 1.0139-3.1491 1.0292-1.106 2.8112-1.106 1.106 0 1.9663 0.50694 0.86026 0.49157 1.3365 1.444 0.49158 0.93706 0.49158 2.3042zm-6.2215 0q0 1.4594 0.56838 2.3196 0.58374 0.84489 1.8434 0.84489 1.2443 0 1.828-0.84489 0.58374-0.86025 0.58374-2.3196 0-1.4594-0.58374-2.2889-0.58375-0.82953-1.8434-0.82953t-1.828 0.82953-0.56838 2.2889z"/>
|
||||||
|
<path d="m125.64 188.69q-1.106 0-1.9509-0.44549-0.84489-0.44549-1.3365-1.3826-0.47622-0.93707-0.47622-2.3964 0-1.5208 0.49158-2.4732 0.50693-0.95243 1.3826-1.3979t1.9817-0.44549q0.61447 0 1.1982 0.13826 0.59911 0.12289 0.96779 0.30723l-0.41477 1.1214q-0.36868-0.13826-0.86025-0.26115-0.49158-0.1229-0.9217-0.1229-2.4272 0-2.4272 3.1184 0 1.4901 0.58374 2.2889 0.59911 0.78345 1.7666 0.78345 0.66055 0 1.1828-0.13826 0.5223-0.13825 0.95242-0.33795v1.1982q-0.41476 0.21506-0.9217 0.3226-0.49157 0.12289-1.1982 0.12289z"/>
|
||||||
|
<path d="m136.4 176.86v6.0986q0 0.24579-0.0307 0.6452-0.0154 0.3994-0.0307 0.69127h0.0614q0.0922-0.12289 0.27651-0.35332 0.18434-0.23042 0.36868-0.46085 0.19971-0.24578 0.33796-0.3994l2.6268-2.7805h1.5823l-3.3335 3.5178 3.5639 4.716h-1.6283l-2.8573-3.8404-0.93707 0.81417v3.0262h-1.3365v-11.675z"/>
|
||||||
|
<path d="m149.32 177.22q0.30724 0 0.53766 0.21506 0.24579 0.1997 0.24579 0.64519t-0.24579 0.66056q-0.23042 0.1997-0.53766 0.1997-0.33795 0-0.56838-0.1997-0.23042-0.21507-0.23042-0.66056t0.23042-0.64519q0.23043-0.21506 0.56838-0.21506zm0.66056 3.0877v8.2339h-1.3518v-8.2339z"/>
|
||||||
|
<path d="m161.92 180.15q1.4747 0 2.2274 0.722 0.75272 0.722 0.75272 2.3043v5.3612h-1.3365v-5.2691q0-1.9817-1.8434-1.9817-1.3672 0-1.8895 0.76808-0.5223 0.76809-0.5223 2.2121v4.2706h-1.3518v-8.2339h1.0907l0.1997 1.1214h0.0768q0.39941-0.64519 1.106-0.95242 0.70664-0.3226 1.4901-0.3226z"/>
|
||||||
|
<path d="m175.73 180.15q0.81417 0 1.4594 0.30724 0.66055 0.30723 1.1214 0.93706h0.0768l0.18434-1.0907h1.0753v8.3721q0 1.7666-0.90634 2.6576-0.89098 0.89098-2.7805 0.89098-1.8127 0-2.9648-0.5223v-1.2443q1.2136 0.6452 3.0416 0.6452 1.06 0 1.6591-0.62983 0.61447-0.61447 0.61447-1.6898v-0.3226q0-0.18434 0.0154-0.52229 0.0154-0.35332 0.0307-0.49158h-0.0615q-0.82953 1.2443-2.55 1.2443-1.5976 0-2.504-1.1214-0.89098-1.1214-0.89098-3.1338 0-1.9663 0.89098-3.1184 0.90634-1.1675 2.4886-1.1675zm0.18434 1.1368q-1.0292 0-1.5976 0.82953-0.56838 0.81417-0.56838 2.335t0.55302 2.335q0.55302 0.79881 1.6437 0.79881 1.2443 0 1.8127-0.66056 0.56838-0.67591 0.56838-2.166v-0.32259q0-1.6744-0.58374-2.4118-0.58375-0.73736-1.828-0.73736z"/>
|
||||||
|
</g>
|
||||||
|
<g stroke-width=".26458" aria-label="Qt Advanced ">
|
||||||
|
<path d="m100.61 89.668q0 2.0124-0.81417 3.441-0.79881 1.4133-2.3811 1.9356l2.6269 2.7344h-1.9817l-2.1199-2.4732q-0.09217 0-0.1997 0-0.09217 0.01536-0.18434 0.01536-1.7051 0-2.8419-0.70664-1.1214-0.70664-1.6744-1.9817-0.55302-1.275-0.55302-2.9802 0-1.6744 0.55302-2.9341 0.55302-1.275 1.6744-1.9817 1.1368-0.70664 2.8573-0.70664 1.6437 0 2.7651 0.70664 1.1214 0.69128 1.6898 1.9663 0.58374 1.2597 0.58374 2.9648zm-8.664 0q0 2.0738 0.87562 3.272 0.87562 1.1829 2.7344 1.1829 1.8588 0 2.719-1.1829 0.87562-1.1982 0.87562-3.272 0-2.0738-0.86026-3.2413-0.86026-1.1829-2.719-1.1829-1.8741 0-2.7497 1.1829-0.87562 1.1675-0.87562 3.2413z"/>
|
||||||
|
<path d="m105.6 94.215q0.30723 0 0.62983-0.04609 0.32259-0.04609 0.52229-0.12289v1.0292q-0.21506 0.10753-0.61446 0.16898-0.39941 0.07681-0.76809 0.07681-0.64519 0-1.1982-0.21506-0.53766-0.23042-0.87562-0.78345-0.33796-0.55302-0.33796-1.5515v-4.7929h-1.1675v-0.64519l1.1829-0.53766 0.53766-1.7512h0.7988v1.8895h2.3811v1.0446h-2.3811v4.7621q0 0.75272 0.35332 1.1214 0.36868 0.35332 0.93707 0.35332z"/>
|
||||||
|
<path d="m119.46 95.168-1.3211-3.3949h-4.3474l-1.3058 3.3949h-1.3979l4.2859-11.014h1.2443l4.2706 11.014zm-1.7359-4.6239-1.2289-3.3181q-0.0461-0.12289-0.15362-0.44549-0.10753-0.3226-0.21507-0.66055-0.0922-0.35332-0.15361-0.53766-0.1229 0.47621-0.26115 0.93706-0.12289 0.44549-0.21507 0.70664l-1.2443 3.3181z"/>
|
||||||
|
<path d="m125.13 95.321q-1.5362 0-2.4579-1.06-0.9217-1.0753-0.9217-3.1952t0.9217-3.1952q0.93706-1.0907 2.4732-1.0907 0.95243 0 1.5515 0.35332 0.61447 0.35332 0.99851 0.86026h0.0922q-0.0307-0.1997-0.0614-0.58374-0.0307-0.3994-0.0307-0.62983v-3.2874h1.3518v11.675h-1.0907l-0.1997-1.106h-0.0614q-0.36868 0.5223-0.98314 0.89098-0.61447 0.36868-1.5823 0.36868zm0.21506-1.1214q1.3058 0 1.828-0.70664 0.53766-0.722 0.53766-2.166v-0.24579q0-1.5362-0.50694-2.3503-0.50694-0.82953-1.8741-0.82953-1.0907 0-1.6437 0.87562-0.53766 0.86026-0.53766 2.3196 0 1.4747 0.53766 2.2889 0.55302 0.81417 1.6591 0.81417z"/>
|
||||||
|
<path d="m133.47 95.168-3.1184-8.2339h1.444l1.7512 4.8543q0.12289 0.33796 0.26115 0.75272 0.13825 0.41477 0.24579 0.79881 0.10753 0.38404 0.15361 0.62983h0.0615q0.0461-0.24579 0.16898-0.62983 0.12289-0.3994 0.26115-0.79881 0.13825-0.41477 0.26115-0.75272l1.7512-4.8543h1.444l-3.1338 8.2339z"/>
|
||||||
|
<path d="m142.58 86.796q1.5054 0 2.2274 0.66055 0.722 0.66055 0.722 2.1046v5.607h-0.98315l-0.26115-1.1675h-0.0615q-0.53766 0.67591-1.1368 0.99851-0.59911 0.3226-1.6283 0.3226-1.1214 0-1.8588-0.58374-0.73736-0.59911-0.73736-1.8588 0-1.2289 0.96778-1.8895 0.96779-0.67591 2.9802-0.73736l1.3979-0.04609v-0.49158q0-1.0292-0.44549-1.4286t-1.2597-0.3994q-0.64519 0-1.2289 0.1997-0.58374 0.18434-1.0907 0.43013l-0.41476-1.0139q0.53766-0.29187 1.275-0.49158 0.73736-0.21506 1.5362-0.21506zm1.613 4.3474-1.2136 0.04609q-1.5362 0.06145-2.1353 0.49157-0.58375 0.43013-0.58375 1.2136 0 0.69128 0.41477 1.0139 0.43013 0.3226 1.0907 0.3226 1.0292 0 1.7205-0.56838 0.70664-0.58374 0.70664-1.782z"/>
|
||||||
|
<path d="m152.04 86.78q1.4747 0 2.2274 0.722 0.75272 0.722 0.75272 2.3043v5.3612h-1.3365v-5.2691q0-1.9817-1.8434-1.9817-1.3672 0-1.8895 0.76808t-0.5223 2.2121v4.2706h-1.3518v-8.2339h1.0907l0.1997 1.1214h0.0768q0.39941-0.64519 1.106-0.95243 0.70663-0.3226 1.4901-0.3226z"/>
|
||||||
|
<path d="m160.87 95.321q-1.106 0-1.9509-0.44549-0.8449-0.44549-1.3365-1.3826-0.47622-0.93706-0.47622-2.3964 0-1.5208 0.49158-2.4732 0.50694-0.95243 1.3826-1.3979 0.87562-0.44549 1.9817-0.44549 0.61447 0 1.1982 0.13826 0.59911 0.12289 0.96779 0.30723l-0.41476 1.1214q-0.36869-0.13826-0.86026-0.26115-0.49157-0.12289-0.9217-0.12289-2.4272 0-2.4272 3.1184 0 1.4901 0.58374 2.2889 0.59911 0.78345 1.7666 0.78345 0.66055 0 1.1828-0.13826 0.5223-0.13826 0.95243-0.33796v1.1982q-0.41477 0.21506-0.92171 0.3226-0.49157 0.12289-1.1982 0.12289z"/>
|
||||||
|
<path d="m168.13 86.78q1.0446 0 1.8127 0.46085 0.76809 0.46085 1.1675 1.3057 0.41477 0.82953 0.41477 1.9509v0.81417h-5.6378q0.0307 1.3979 0.70664 2.1353 0.69128 0.722 1.9202 0.722 0.78345 0 1.3826-0.13826 0.61447-0.15362 1.2597-0.43013v1.1829q-0.62983 0.27651-1.2443 0.3994-0.61447 0.13826-1.4594 0.13826-1.1828 0-2.0738-0.47621t-1.3979-1.4133q-0.49157-0.93706-0.49157-2.3196 0-1.3518 0.44549-2.3196 0.46085-0.96779 1.275-1.4901 0.82953-0.5223 1.9202-0.5223zm-0.0154 1.106q-0.96779 0-1.5362 0.62983-0.55302 0.61447-0.66055 1.7205h4.1937q-0.0154-1.0446-0.49157-1.6898-0.47622-0.66055-1.5054-0.66055z"/>
|
||||||
|
<path d="m176.53 95.321q-1.5362 0-2.4579-1.06-0.92171-1.0753-0.92171-3.1952t0.92171-3.1952q0.93706-1.0907 2.4732-1.0907 0.95243 0 1.5515 0.35332 0.61447 0.35332 0.99851 0.86026h0.0922q-0.0307-0.1997-0.0614-0.58374-0.0307-0.3994-0.0307-0.62983v-3.2874h1.3518v11.675h-1.0907l-0.1997-1.106h-0.0614q-0.36868 0.5223-0.98315 0.89098-0.61446 0.36868-1.5822 0.36868zm0.21506-1.1214q1.3058 0 1.828-0.70664 0.53766-0.722 0.53766-2.166v-0.24579q0-1.5362-0.50693-2.3503-0.50694-0.82953-1.8741-0.82953-1.0907 0-1.6437 0.87562-0.53766 0.86026-0.53766 2.3196 0 1.4747 0.53766 2.2889 0.55302 0.81417 1.6591 0.81417z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 8.5 KiB |
33
demo/images/ads_tile_orange.svg
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="1024" height="1024" version="1.1" viewBox="0 0 270.93 270.93" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="m-2.5e-6 -2.5e-6v270.93h270.93v-270.93z" fill="#ff9833" stroke-width=".26458" style="mix-blend-mode:normal"/>
|
||||||
|
<g fill="#fff" fill-opacity=".25">
|
||||||
|
<g transform="matrix(.12402 0 0 .12402 71.967 73.674)" stroke-width="4.7887">
|
||||||
|
<path d="m405.33 234.66v256h469.33v-256z" style="mix-blend-mode:normal"/>
|
||||||
|
<path d="m661.33 533.33v256h213.33v-256z" style="mix-blend-mode:normal"/>
|
||||||
|
<path d="m405.33 533.33v256h213.33v-256z" style="mix-blend-mode:normal"/>
|
||||||
|
<path d="m149.33 234.66v554.67h213.33v-554.67z" style="mix-blend-mode:normal"/>
|
||||||
|
</g>
|
||||||
|
<g stroke-width=".26458" aria-label="Docking">
|
||||||
|
<path d="m100.07 182.94q0 2.7805-1.5208 4.1938-1.5054 1.3979-4.2091 1.3979h-3.057v-10.968h3.3796q1.6437 0 2.8573 0.61447 1.2289 0.61446 1.8895 1.8127 0.66055 1.1982 0.66055 2.9494zm-1.4594 0.0461q0-2.1967-1.0907-3.2106-1.0753-1.0292-3.057-1.0292h-1.7973v8.6026h1.4901q4.4549 0 4.4549-4.3627z"/>
|
||||||
|
<path d="m114.84 184.4q0 2.0431-1.0446 3.1645-1.0292 1.1214-2.7958 1.1214-1.0907 0-1.9509-0.49158-0.84489-0.50693-1.3365-1.4594-0.49158-0.96778-0.49158-2.335 0-2.0431 1.0139-3.1491 1.0292-1.106 2.8112-1.106 1.106 0 1.9663 0.50694 0.86026 0.49157 1.3365 1.444 0.49158 0.93706 0.49158 2.3042zm-6.2215 0q0 1.4594 0.56838 2.3196 0.58374 0.84489 1.8434 0.84489 1.2443 0 1.828-0.84489 0.58374-0.86025 0.58374-2.3196 0-1.4594-0.58374-2.2889-0.58375-0.82953-1.8434-0.82953t-1.828 0.82953-0.56838 2.2889z"/>
|
||||||
|
<path d="m125.64 188.69q-1.106 0-1.9509-0.44549-0.84489-0.44549-1.3365-1.3826-0.47622-0.93707-0.47622-2.3964 0-1.5208 0.49158-2.4732 0.50693-0.95243 1.3826-1.3979t1.9817-0.44549q0.61447 0 1.1982 0.13826 0.59911 0.12289 0.96779 0.30723l-0.41477 1.1214q-0.36868-0.13826-0.86025-0.26115-0.49158-0.1229-0.9217-0.1229-2.4272 0-2.4272 3.1184 0 1.4901 0.58374 2.2889 0.59911 0.78345 1.7666 0.78345 0.66055 0 1.1828-0.13826 0.5223-0.13825 0.95242-0.33795v1.1982q-0.41476 0.21506-0.9217 0.3226-0.49157 0.12289-1.1982 0.12289z"/>
|
||||||
|
<path d="m136.4 176.86v6.0986q0 0.24579-0.0307 0.6452-0.0154 0.3994-0.0307 0.69127h0.0614q0.0922-0.12289 0.27651-0.35332 0.18434-0.23042 0.36868-0.46085 0.19971-0.24578 0.33796-0.3994l2.6268-2.7805h1.5823l-3.3335 3.5178 3.5639 4.716h-1.6283l-2.8573-3.8404-0.93707 0.81417v3.0262h-1.3365v-11.675z"/>
|
||||||
|
<path d="m149.32 177.22q0.30724 0 0.53766 0.21506 0.24579 0.1997 0.24579 0.64519t-0.24579 0.66056q-0.23042 0.1997-0.53766 0.1997-0.33795 0-0.56838-0.1997-0.23042-0.21507-0.23042-0.66056t0.23042-0.64519q0.23043-0.21506 0.56838-0.21506zm0.66056 3.0877v8.2339h-1.3518v-8.2339z"/>
|
||||||
|
<path d="m161.92 180.15q1.4747 0 2.2274 0.722 0.75272 0.722 0.75272 2.3043v5.3612h-1.3365v-5.2691q0-1.9817-1.8434-1.9817-1.3672 0-1.8895 0.76808-0.5223 0.76809-0.5223 2.2121v4.2706h-1.3518v-8.2339h1.0907l0.1997 1.1214h0.0768q0.39941-0.64519 1.106-0.95242 0.70664-0.3226 1.4901-0.3226z"/>
|
||||||
|
<path d="m175.73 180.15q0.81417 0 1.4594 0.30724 0.66055 0.30723 1.1214 0.93706h0.0768l0.18434-1.0907h1.0753v8.3721q0 1.7666-0.90634 2.6576-0.89098 0.89098-2.7805 0.89098-1.8127 0-2.9648-0.5223v-1.2443q1.2136 0.6452 3.0416 0.6452 1.06 0 1.6591-0.62983 0.61447-0.61447 0.61447-1.6898v-0.3226q0-0.18434 0.0154-0.52229 0.0154-0.35332 0.0307-0.49158h-0.0615q-0.82953 1.2443-2.55 1.2443-1.5976 0-2.504-1.1214-0.89098-1.1214-0.89098-3.1338 0-1.9663 0.89098-3.1184 0.90634-1.1675 2.4886-1.1675zm0.18434 1.1368q-1.0292 0-1.5976 0.82953-0.56838 0.81417-0.56838 2.335t0.55302 2.335q0.55302 0.79881 1.6437 0.79881 1.2443 0 1.8127-0.66056 0.56838-0.67591 0.56838-2.166v-0.32259q0-1.6744-0.58374-2.4118-0.58375-0.73736-1.828-0.73736z"/>
|
||||||
|
</g>
|
||||||
|
<g stroke-width=".26458" aria-label="Qt Advanced ">
|
||||||
|
<path d="m100.61 89.668q0 2.0124-0.81417 3.441-0.79881 1.4133-2.3811 1.9356l2.6269 2.7344h-1.9817l-2.1199-2.4732q-0.09217 0-0.1997 0-0.09217 0.01536-0.18434 0.01536-1.7051 0-2.8419-0.70664-1.1214-0.70664-1.6744-1.9817-0.55302-1.275-0.55302-2.9802 0-1.6744 0.55302-2.9341 0.55302-1.275 1.6744-1.9817 1.1368-0.70664 2.8573-0.70664 1.6437 0 2.7651 0.70664 1.1214 0.69128 1.6898 1.9663 0.58374 1.2597 0.58374 2.9648zm-8.664 0q0 2.0738 0.87562 3.272 0.87562 1.1829 2.7344 1.1829 1.8588 0 2.719-1.1829 0.87562-1.1982 0.87562-3.272 0-2.0738-0.86026-3.2413-0.86026-1.1829-2.719-1.1829-1.8741 0-2.7497 1.1829-0.87562 1.1675-0.87562 3.2413z"/>
|
||||||
|
<path d="m105.6 94.215q0.30723 0 0.62983-0.04609 0.32259-0.04609 0.52229-0.12289v1.0292q-0.21506 0.10753-0.61446 0.16898-0.39941 0.07681-0.76809 0.07681-0.64519 0-1.1982-0.21506-0.53766-0.23042-0.87562-0.78345-0.33796-0.55302-0.33796-1.5515v-4.7929h-1.1675v-0.64519l1.1829-0.53766 0.53766-1.7512h0.7988v1.8895h2.3811v1.0446h-2.3811v4.7621q0 0.75272 0.35332 1.1214 0.36868 0.35332 0.93707 0.35332z"/>
|
||||||
|
<path d="m119.46 95.168-1.3211-3.3949h-4.3474l-1.3058 3.3949h-1.3979l4.2859-11.014h1.2443l4.2706 11.014zm-1.7359-4.6239-1.2289-3.3181q-0.0461-0.12289-0.15362-0.44549-0.10753-0.3226-0.21507-0.66055-0.0922-0.35332-0.15361-0.53766-0.1229 0.47621-0.26115 0.93706-0.12289 0.44549-0.21507 0.70664l-1.2443 3.3181z"/>
|
||||||
|
<path d="m125.13 95.321q-1.5362 0-2.4579-1.06-0.9217-1.0753-0.9217-3.1952t0.9217-3.1952q0.93706-1.0907 2.4732-1.0907 0.95243 0 1.5515 0.35332 0.61447 0.35332 0.99851 0.86026h0.0922q-0.0307-0.1997-0.0614-0.58374-0.0307-0.3994-0.0307-0.62983v-3.2874h1.3518v11.675h-1.0907l-0.1997-1.106h-0.0614q-0.36868 0.5223-0.98314 0.89098-0.61447 0.36868-1.5823 0.36868zm0.21506-1.1214q1.3058 0 1.828-0.70664 0.53766-0.722 0.53766-2.166v-0.24579q0-1.5362-0.50694-2.3503-0.50694-0.82953-1.8741-0.82953-1.0907 0-1.6437 0.87562-0.53766 0.86026-0.53766 2.3196 0 1.4747 0.53766 2.2889 0.55302 0.81417 1.6591 0.81417z"/>
|
||||||
|
<path d="m133.47 95.168-3.1184-8.2339h1.444l1.7512 4.8543q0.12289 0.33796 0.26115 0.75272 0.13825 0.41477 0.24579 0.79881 0.10753 0.38404 0.15361 0.62983h0.0615q0.0461-0.24579 0.16898-0.62983 0.12289-0.3994 0.26115-0.79881 0.13825-0.41477 0.26115-0.75272l1.7512-4.8543h1.444l-3.1338 8.2339z"/>
|
||||||
|
<path d="m142.58 86.796q1.5054 0 2.2274 0.66055 0.722 0.66055 0.722 2.1046v5.607h-0.98315l-0.26115-1.1675h-0.0615q-0.53766 0.67591-1.1368 0.99851-0.59911 0.3226-1.6283 0.3226-1.1214 0-1.8588-0.58374-0.73736-0.59911-0.73736-1.8588 0-1.2289 0.96778-1.8895 0.96779-0.67591 2.9802-0.73736l1.3979-0.04609v-0.49158q0-1.0292-0.44549-1.4286t-1.2597-0.3994q-0.64519 0-1.2289 0.1997-0.58374 0.18434-1.0907 0.43013l-0.41476-1.0139q0.53766-0.29187 1.275-0.49158 0.73736-0.21506 1.5362-0.21506zm1.613 4.3474-1.2136 0.04609q-1.5362 0.06145-2.1353 0.49157-0.58375 0.43013-0.58375 1.2136 0 0.69128 0.41477 1.0139 0.43013 0.3226 1.0907 0.3226 1.0292 0 1.7205-0.56838 0.70664-0.58374 0.70664-1.782z"/>
|
||||||
|
<path d="m152.04 86.78q1.4747 0 2.2274 0.722 0.75272 0.722 0.75272 2.3043v5.3612h-1.3365v-5.2691q0-1.9817-1.8434-1.9817-1.3672 0-1.8895 0.76808t-0.5223 2.2121v4.2706h-1.3518v-8.2339h1.0907l0.1997 1.1214h0.0768q0.39941-0.64519 1.106-0.95243 0.70663-0.3226 1.4901-0.3226z"/>
|
||||||
|
<path d="m160.87 95.321q-1.106 0-1.9509-0.44549-0.8449-0.44549-1.3365-1.3826-0.47622-0.93706-0.47622-2.3964 0-1.5208 0.49158-2.4732 0.50694-0.95243 1.3826-1.3979 0.87562-0.44549 1.9817-0.44549 0.61447 0 1.1982 0.13826 0.59911 0.12289 0.96779 0.30723l-0.41476 1.1214q-0.36869-0.13826-0.86026-0.26115-0.49157-0.12289-0.9217-0.12289-2.4272 0-2.4272 3.1184 0 1.4901 0.58374 2.2889 0.59911 0.78345 1.7666 0.78345 0.66055 0 1.1828-0.13826 0.5223-0.13826 0.95243-0.33796v1.1982q-0.41477 0.21506-0.92171 0.3226-0.49157 0.12289-1.1982 0.12289z"/>
|
||||||
|
<path d="m168.13 86.78q1.0446 0 1.8127 0.46085 0.76809 0.46085 1.1675 1.3057 0.41477 0.82953 0.41477 1.9509v0.81417h-5.6378q0.0307 1.3979 0.70664 2.1353 0.69128 0.722 1.9202 0.722 0.78345 0 1.3826-0.13826 0.61447-0.15362 1.2597-0.43013v1.1829q-0.62983 0.27651-1.2443 0.3994-0.61447 0.13826-1.4594 0.13826-1.1828 0-2.0738-0.47621t-1.3979-1.4133q-0.49157-0.93706-0.49157-2.3196 0-1.3518 0.44549-2.3196 0.46085-0.96779 1.275-1.4901 0.82953-0.5223 1.9202-0.5223zm-0.0154 1.106q-0.96779 0-1.5362 0.62983-0.55302 0.61447-0.66055 1.7205h4.1937q-0.0154-1.0446-0.49157-1.6898-0.47622-0.66055-1.5054-0.66055z"/>
|
||||||
|
<path d="m176.53 95.321q-1.5362 0-2.4579-1.06-0.92171-1.0753-0.92171-3.1952t0.92171-3.1952q0.93706-1.0907 2.4732-1.0907 0.95243 0 1.5515 0.35332 0.61447 0.35332 0.99851 0.86026h0.0922q-0.0307-0.1997-0.0614-0.58374-0.0307-0.3994-0.0307-0.62983v-3.2874h1.3518v11.675h-1.0907l-0.1997-1.106h-0.0614q-0.36868 0.5223-0.98315 0.89098-0.61446 0.36868-1.5822 0.36868zm0.21506-1.1214q1.3058 0 1.828-0.70664 0.53766-0.722 0.53766-2.166v-0.24579q0-1.5362-0.50693-2.3503-0.50694-0.82953-1.8741-0.82953-1.0907 0-1.6437 0.87562-0.53766 0.86026-0.53766 2.3196 0 1.4747 0.53766 2.2889 0.55302 0.81417 1.6591 0.81417z"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 8.5 KiB |
6
demo/images/color_lens.svg
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0,0,1024,1024">
|
||||||
|
<desc>color_lens icon - Licensed under Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0) - Created with Iconfu.com - Derivative work of Material icons (Copyright Google Inc.)</desc>
|
||||||
|
<g fill="#03b8e5" fill-rule="nonzero" style="mix-blend-mode: normal">
|
||||||
|
<path d="M896,469.33c0,117.76 -95.57,213.34 -213.33,213.34h-75.52c-35.41,0 -64,28.59 -64,64c0,16.21 6.4,31.15 16.21,42.24c10.24,11.52 16.64,26.45 16.64,43.09c0,35.41 -28.59,64 -64,64c-212.05,0 -384,-171.95 -384,-384c0,-212.05 171.95,-384 384,-384c212.05,0 384,152.74 384,341.33zM341.33,448c0,-35.41 -28.59,-64 -64,-64c-35.41,0 -64,28.59 -64,64c0,35.41 28.59,64 64,64c35.41,0 64,-28.59 64,-64zM469.33,277.33c0,-35.41 -28.59,-64 -64,-64c-35.41,0 -64,28.59 -64,64c0,35.41 28.59,64 64,64c35.41,0 64,-28.59 64,-64zM682.67,277.33c0,-35.41 -28.59,-64 -64,-64c-35.41,0 -64,28.59 -64,64c0,35.41 28.59,64 64,64c35.41,0 64,-28.59 64,-64zM810.67,448c0,-35.41 -28.59,-64 -64,-64c-35.41,0 -64,28.59 -64,64c0,35.41 28.59,64 64,64c35.41,0 64,-28.59 64,-64z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.1 KiB |
80
demo/images/create_floating_editor.svg
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
version="1.1"
|
||||||
|
viewBox="0,0,1024,1024"
|
||||||
|
id="svg2562"
|
||||||
|
sodipodi:docname="create_floating_editor.svg"
|
||||||
|
inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
|
||||||
|
<metadata
|
||||||
|
id="metadata2568">
|
||||||
|
<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></dc:title>
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<defs
|
||||||
|
id="defs2566" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1"
|
||||||
|
objecttolerance="10"
|
||||||
|
gridtolerance="10"
|
||||||
|
guidetolerance="10"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-height="1017"
|
||||||
|
id="namedview2564"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="0.23046875"
|
||||||
|
inkscape:cx="512"
|
||||||
|
inkscape:cy="512"
|
||||||
|
inkscape:window-x="-8"
|
||||||
|
inkscape:window-y="-8"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg2562" />
|
||||||
|
<desc
|
||||||
|
id="desc2556">note_add icon - Licensed under Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0) - Created with Iconfu.com - Derivative work of Material icons (Copyright Google Inc.)</desc>
|
||||||
|
<g
|
||||||
|
style="mix-blend-mode:normal;fill:#03b8e5;fill-rule:nonzero"
|
||||||
|
id="g2560"
|
||||||
|
transform="matrix(0.73242903,0,0,0.73242903,136.99634,136.99634)">
|
||||||
|
<path
|
||||||
|
d="m 853.33,341.33 v 512 c 0,46.93 -38.4,85.34 -85.33,85.34 H 255.57 c -46.93,0 -84.9,-38.41 -84.9,-85.34 l 0.42,-682.66 c 0,-46.93 37.98,-85.34 84.91,-85.34 h 341.33 z m -170.66,256 h -128 v -128 h -85.34 v 128 h -128 v 85.34 h 128 v 128 h 85.34 v -128 h 128 z M 789.33,384 554.67,149.33 V 384 Z"
|
||||||
|
id="path2558"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</g>
|
||||||
|
<path
|
||||||
|
style="mix-blend-mode:normal;fill:#03b8e5;fill-rule:nonzero"
|
||||||
|
d="M 426.6699,917.33988 512.4297,1024 597.3301,917.33988 Z"
|
||||||
|
id="path3115"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
style="mix-blend-mode:normal;fill:#03b8e5;fill-rule:nonzero"
|
||||||
|
d="M 426.6699,106.66012 512.4297,0 597.3301,106.66012 Z"
|
||||||
|
id="path3115-7"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
style="mix-blend-mode:normal;fill:#03b8e5;fill-rule:nonzero"
|
||||||
|
d="M 917.33988,426.6699 1024,512.4297 917.33988,597.3301 Z"
|
||||||
|
id="path3115-7-9"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
style="mix-blend-mode:normal;fill:#03b8e5;fill-rule:nonzero"
|
||||||
|
d="M 106.66016,426.6699 0,512.4297 106.66016,597.3301 Z"
|
||||||
|
id="path3115-7-9-4"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 3.0 KiB |
80
demo/images/create_floating_table.svg
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
version="1.1"
|
||||||
|
viewBox="0,0,1024,1024"
|
||||||
|
id="svg2562"
|
||||||
|
sodipodi:docname="create_floating_table.svg"
|
||||||
|
inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
|
||||||
|
<metadata
|
||||||
|
id="metadata2568">
|
||||||
|
<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></dc:title>
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<defs
|
||||||
|
id="defs2566" />
|
||||||
|
<sodipodi:namedview
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1"
|
||||||
|
objecttolerance="10"
|
||||||
|
gridtolerance="10"
|
||||||
|
guidetolerance="10"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-height="1017"
|
||||||
|
id="namedview2564"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="0.23046875"
|
||||||
|
inkscape:cx="512"
|
||||||
|
inkscape:cy="512"
|
||||||
|
inkscape:window-x="-8"
|
||||||
|
inkscape:window-y="-8"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg2562" />
|
||||||
|
<desc
|
||||||
|
id="desc2556">note_add icon - Licensed under Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0) - Created with Iconfu.com - Derivative work of Material icons (Copyright Google Inc.)</desc>
|
||||||
|
<path
|
||||||
|
style="mix-blend-mode:normal;fill:#03b8e5;fill-rule:nonzero"
|
||||||
|
d="M 426.6699,917.33988 512.4297,1024 597.3301,917.33988 Z"
|
||||||
|
id="path3115"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
style="mix-blend-mode:normal;fill:#03b8e5;fill-rule:nonzero"
|
||||||
|
d="M 426.6699,106.66012 512.4297,0 597.3301,106.66012 Z"
|
||||||
|
id="path3115-7"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
style="mix-blend-mode:normal;fill:#03b8e5;fill-rule:nonzero"
|
||||||
|
d="M 917.33988,426.6699 1024,512.4297 917.33988,597.3301 Z"
|
||||||
|
id="path3115-7-9"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<path
|
||||||
|
style="mix-blend-mode:normal;fill:#03b8e5;fill-rule:nonzero"
|
||||||
|
d="M 106.66016,426.6699 0,512.4297 106.66016,597.3301 Z"
|
||||||
|
id="path3115-7-9-4"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<g
|
||||||
|
id="g3198"
|
||||||
|
style="mix-blend-mode:normal;fill:#03b8e5;fill-rule:nonzero"
|
||||||
|
transform="matrix(0.73241615,0,0,0.73241615,137.00293,137.00293)">
|
||||||
|
<path
|
||||||
|
id="path3196"
|
||||||
|
d="m 938.67,170.67 v 682.66 c 0,46.93 -38.41,85.34 -85.34,85.34 H 170.67 c -46.93,0 -85.34,-38.41 -85.34,-85.34 V 170.67 c 0,-46.93 38.41,-85.34 85.34,-85.34 h 682.66 c 46.93,0 85.34,38.41 85.34,85.34 z m -597.34,0 H 170.67 v 170.66 h 170.66 z m 0,512 H 170.67 v 170.66 h 170.66 z m 0,-256 H 170.67 v 170.66 h 170.66 z m 256,-256 H 426.67 v 170.66 h 170.66 z m 256,0 H 682.67 v 170.66 h 170.66 z m -256,512 H 426.67 v 170.66 h 170.66 z m 0,-256 H 426.67 v 170.66 h 170.66 z m 256,256 H 682.67 v 170.66 h 170.66 z m 0,-256 H 682.67 v 170.66 h 170.66 z"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 3.2 KiB |
6
demo/images/crop_original.svg
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0,0,1024,1024">
|
||||||
|
<desc>crop_original icon - Licensed under Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0) - Created with Iconfu.com - Derivative work of Material icons (Copyright Google Inc.)</desc>
|
||||||
|
<g fill="#03b8e5" fill-rule="nonzero" style="mix-blend-mode: normal">
|
||||||
|
<path d="M896,213.33v597.34c0,46.93 -38.4,85.33 -85.33,85.33h-597.34c-46.93,0 -85.33,-38.4 -85.33,-85.33v-597.34c0,-46.93 38.4,-85.33 85.33,-85.33h597.34c46.93,0 85.33,38.4 85.33,85.33zM810.67,213.33h-597.34v597.34h597.34zM746.67,725.33h-469.34l117.34,-150.61l83.62,100.69l117.34,-151.04z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 700 B |
32
demo/images/custom-menu-button.svg
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="16px" height="16px" viewBox="0 0 16 16" id="svg2" version="1.1" inkscape:version="0.91 r13725" sodipodi:docname="38 - menu bar lines option list hamburger web.svg">
|
||||||
|
<defs id="defs4">
|
||||||
|
<pattern y="0" x="0" height="6" width="6" patternUnits="userSpaceOnUse" id="EMFhbasepattern"/>
|
||||||
|
<pattern y="0" x="0" height="6" width="6" patternUnits="userSpaceOnUse" id="EMFhbasepattern-4"/>
|
||||||
|
<pattern y="0" x="0" height="6" width="6" patternUnits="userSpaceOnUse" id="EMFhbasepattern-3"/>
|
||||||
|
<pattern y="0" x="0" height="6" width="6" patternUnits="userSpaceOnUse" id="EMFhbasepattern-8"/>
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview id="base" pagecolor="#ffffff" bordercolor="#666666" borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="22.627417" inkscape:cx="6.2316889" inkscape:cy="7.4271635" inkscape:document-units="px" inkscape:current-layer="g5228" showgrid="true" units="px" inkscape:window-width="1366" inkscape:window-height="705" inkscape:window-x="-8" inkscape:window-y="-8" inkscape:window-maximized="1" inkscape:snap-bbox="true" inkscape:bbox-paths="true" inkscape:bbox-nodes="true" inkscape:snap-bbox-edge-midpoints="true" inkscape:snap-bbox-midpoints="true" inkscape:snap-global="true">
|
||||||
|
<inkscape:grid type="xygrid" id="grid3336"/>
|
||||||
|
</sodipodi:namedview>
|
||||||
|
|
||||||
|
<g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1" transform="translate(0,-1036.3622)">
|
||||||
|
<g transform="translate(628,-140.49998)" id="g5228">
|
||||||
|
<path style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;baseline-shift:baseline;text-anchor:start;white-space:normal;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate" d="M 4.484375 4 A 0.50005 0.50005 0 0 0 4.5351562 5 L 11.464844 5 A 0.50005 0.50005 0 1 0 11.464844 4 L 4.5351562 4 A 0.50005 0.50005 0 0 0 4.484375 4 z M 4.484375 7 A 0.50005 0.50005 0 0 0 4.5351562 8 L 11.464844 8 A 0.50005 0.50005 0 1 0 11.464844 7 L 4.5351562 7 A 0.50005 0.50005 0 0 0 4.484375 7 z M 4.484375 10 A 0.50005 0.50005 0 0 0 4.5351562 11 L 11.464844 11 A 0.50005 0.50005 0 1 0 11.464844 10 L 4.5351562 10 A 0.50005 0.50005 0 0 0 4.484375 10 z " transform="translate(-628,1176.8622)" id="path3340"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<metadata>
|
||||||
|
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||||
|
<rdf:Description about="https://iconscout.com/legal#licenses" dc:title="Menu, Bar, Lines, Option, List, Hamburger, Web" dc:description="Menu, Bar, Lines, Option, List, Hamburger, Web" dc:publisher="Iconscout" dc:date="2016-12-14" dc:format="image/svg+xml" dc:language="en">
|
||||||
|
<dc:creator>
|
||||||
|
<rdf:Bag>
|
||||||
|
<rdf:li>Jemis Mali</rdf:li>
|
||||||
|
</rdf:Bag>
|
||||||
|
</dc:creator>
|
||||||
|
</rdf:Description>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata></svg>
|
||||||
|
After Width: | Height: | Size: 3.9 KiB |
6
demo/images/date_range.svg
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0,0,1024,1024">
|
||||||
|
<desc>date_range icon - Licensed under Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0) - Created with Iconfu.com - Derivative work of Material icons (Copyright Google Inc.)</desc>
|
||||||
|
<g fill="#03b8e5" fill-rule="nonzero" style="mix-blend-mode: normal">
|
||||||
|
<path d="M896,256v597.33c0,46.93 -38.4,85.34 -85.33,85.34h-597.34c-47.36,0 -85.33,-38.41 -85.33,-85.34l0.43,-597.33c0,-46.93 37.54,-85.33 84.9,-85.33h42.67v-85.34h85.33v85.34h341.34v-85.34h85.33v85.34h42.67c46.93,0 85.33,38.4 85.33,85.33zM810.67,384h-597.34v469.33h597.34zM384,554.67h-85.33v-85.34h85.33zM554.67,554.67h-85.34v-85.34h85.34zM725.33,554.67h-85.33v-85.34h85.33z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 783 B |
6
demo/images/docked_editor.svg
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0,0,1024,1024">
|
||||||
|
<desc>chrome_reader_mode icon - Licensed under Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0) - Created with Iconfu.com - Derivative work of Material icons (Copyright Google Inc.)</desc>
|
||||||
|
<g fill="#03b8e5" fill-rule="nonzero" style="mix-blend-mode: normal">
|
||||||
|
<path d="M981.33,256v554.67c0,46.93 -38.4,85.33 -85.33,85.33h-768c-46.93,0 -85.33,-38.4 -85.33,-85.33v-554.67c0,-46.93 38.4,-85.33 85.33,-85.33h768c46.93,0 85.33,38.4 85.33,85.33zM896,256h-384v554.67h384zM554.67,512h298.66v64h-298.66zM554.67,405.33h298.66v64h-298.66zM554.67,618.67h298.66v64h-298.66z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 717 B |
6
demo/images/edit.svg
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0,0,1024,1024">
|
||||||
|
<desc>create icon - Licensed under Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0) - Created with Iconfu.com - Derivative work of Material icons (Copyright Google Inc.)</desc>
|
||||||
|
<g fill="#03b8e5" fill-rule="nonzero" style="mix-blend-mode: normal">
|
||||||
|
<path d="M599.89,264.11l160,160l-471.89,471.89h-160v-160zM805.55,378.45l-160,-160l78.08,-78.08c16.64,-16.64 43.52,-16.64 60.16,0l99.84,99.84c16.64,16.64 16.64,43.52 0,60.16z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 578 B |
6
demo/images/find_in_page.svg
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0,0,1024,1024">
|
||||||
|
<desc>find_in_page icon - Licensed under Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0) - Created with Iconfu.com - Derivative work of Material icons (Copyright Google Inc.)</desc>
|
||||||
|
<g fill="#03b8e5" fill-rule="nonzero" style="mix-blend-mode: normal">
|
||||||
|
<path d="M689.92,672c22.19,-33.71 35.41,-73.81 35.41,-117.33c0,-117.76 -95.57,-213.34 -213.33,-213.34c-117.76,0 -213.33,95.58 -213.33,213.34c0,117.76 95.57,213.33 213.33,213.33c43.52,0 83.63,-13.22 117.76,-35.41l189.01,189.01c-14.51,10.67 -31.57,17.07 -50.77,17.07h-512.43c-46.93,0 -84.9,-38.41 -84.9,-85.34l0.42,-682.66c0,-46.93 37.98,-85.34 84.91,-85.34h341.33l256,256v494.51zM512,426.67c70.83,0 128,57.17 128,128c0,70.83 -57.17,128 -128,128c-70.83,0 -128,-57.17 -128,-128c0,-70.83 57.17,-128 128,-128z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 915 B |
6
demo/images/folder.svg
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0,0,1024,1024">
|
||||||
|
<desc>folder icon - Licensed under Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0) - Created with Iconfu.com - Derivative work of Material icons (Copyright Google Inc.)</desc>
|
||||||
|
<g fill="#03b8e5" fill-rule="nonzero" style="mix-blend-mode: normal">
|
||||||
|
<path d="M512,256h341.33c46.93,0 85.34,38.4 85.34,85.33v426.67c0,46.93 -38.41,85.33 -85.34,85.33h-682.66c-46.93,0 -85.34,-38.4 -85.34,-85.33l0.43,-512c0,-46.93 37.98,-85.33 84.91,-85.33h256z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 595 B |
6
demo/images/folder_open.svg
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0,0,1024,1024">
|
||||||
|
<desc>folder_open icon - Licensed under Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0) - Created with Iconfu.com - Derivative work of Material icons (Copyright Google Inc.)</desc>
|
||||||
|
<g fill="#03b8e5" fill-rule="nonzero" style="mix-blend-mode: normal">
|
||||||
|
<path d="M938.67,341.33v426.67c0,46.93 -38.41,85.33 -85.34,85.33h-682.66c-46.93,0 -85.34,-38.4 -85.34,-85.33l0.43,-512c0,-46.93 37.98,-85.33 84.91,-85.33h256l85.33,85.33h341.33c46.93,0 85.34,38.4 85.34,85.33zM853.33,341.33h-682.66v426.67h682.66z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 655 B |
6
demo/images/font_download.svg
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0,0,1024,1024">
|
||||||
|
<desc>font_download icon - Licensed under Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0) - Created with Iconfu.com - Derivative work of Material icons (Copyright Google Inc.)</desc>
|
||||||
|
<g fill="#03b8e5" fill-rule="nonzero" style="mix-blend-mode: normal">
|
||||||
|
<path d="M938.67,170.67v682.66c0,46.93 -38.41,85.34 -85.34,85.34h-682.66c-46.93,0 -85.34,-38.41 -85.34,-85.34v-682.66c0,-46.93 38.41,-85.34 85.34,-85.34h682.66c46.93,0 85.34,38.41 85.34,85.34zM769.71,789.33l-218.03,-554.66h-79.36l-218.03,554.66h89.18l47.78,-128h240.64l48.64,128zM512,340.48l88.32,235.52h-176.64z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 724 B |
6
demo/images/fullscreen.svg
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0,0,1024,1024">
|
||||||
|
<desc>settings_overscan icon - Licensed under Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0) - Created with Iconfu.com - Derivative work of Material icons (Copyright Google Inc.)</desc>
|
||||||
|
<g fill="#03b8e5" fill-rule="nonzero" style="mix-blend-mode: normal">
|
||||||
|
<path d="M981.33,213.33v597.34c0,46.93 -38.4,85.33 -85.33,85.33h-768c-46.93,0 -85.33,-38.4 -85.33,-85.33v-597.34c0,-46.93 38.4,-85.33 85.33,-85.33h768c46.93,0 85.33,38.4 85.33,85.33zM896,212.91h-768v598.18h768zM256,597.33l-106.67,-84.9l106.67,-85.76zM597.33,341.33h-170.66l85.76,-106.66zM874.67,512.43l-106.67,84.9v-170.66zM512.43,789.33l-85.76,-106.66h170.66z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 776 B |
6
demo/images/grid_on.svg
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0,0,1024,1024">
|
||||||
|
<desc>grid_on icon - Licensed under Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0) - Created with Iconfu.com - Derivative work of Material icons (Copyright Google Inc.)</desc>
|
||||||
|
<g fill="#03b8e5" fill-rule="nonzero" style="mix-blend-mode: normal">
|
||||||
|
<path d="M938.67,170.67v682.66c0,46.93 -38.41,85.34 -85.34,85.34h-682.66c-46.93,0 -85.34,-38.41 -85.34,-85.34v-682.66c0,-46.93 38.41,-85.34 85.34,-85.34h682.66c46.93,0 85.34,38.41 85.34,85.34zM341.33,170.67h-170.66v170.66h170.66zM341.33,682.67h-170.66v170.66h170.66zM341.33,426.67h-170.66v170.66h170.66zM597.33,170.67h-170.66v170.66h170.66zM853.33,170.67h-170.66v170.66h170.66zM597.33,682.67h-170.66v170.66h170.66zM597.33,426.67h-170.66v170.66h170.66zM853.33,682.67h-170.66v170.66h170.66zM853.33,426.67h-170.66v170.66h170.66z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 931 B |
6
demo/images/help_outline.svg
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0,0,1024,1024">
|
||||||
|
<desc>help_outline icon - Licensed under Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0) - Created with Iconfu.com - Derivative work of Material icons (Copyright Google Inc.)</desc>
|
||||||
|
<g fill="#03b8e5" fill-rule="nonzero" style="mix-blend-mode: normal">
|
||||||
|
<path d="M938.67,512c0,235.52 -191.15,426.67 -426.67,426.67c-235.52,0 -426.67,-191.15 -426.67,-426.67c0,-235.52 191.15,-426.67 426.67,-426.67c235.52,0 426.67,191.15 426.67,426.67zM853.33,512c0,-188.16 -153.17,-341.33 -341.33,-341.33c-188.16,0 -341.33,153.17 -341.33,341.33c0,188.16 153.17,341.33 341.33,341.33c188.16,0 341.33,-153.17 341.33,-341.33zM682.67,426.67c0,106.67 -128,117.33 -128,213.33h-85.34c0,-138.67 128,-128 128,-213.33c0,-46.93 -38.4,-85.34 -85.33,-85.34c-46.93,0 -85.33,38.41 -85.33,85.34h-85.34c0,-94.29 76.38,-170.67 170.67,-170.67c94.29,0 170.67,76.38 170.67,170.67zM469.33,682.67h85.34v85.33h-85.34z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.0 KiB |
6
demo/images/lock.svg
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0,0,1024,1024">
|
||||||
|
<desc>lock icon - Licensed under Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0) - Created with Iconfu.com - Derivative work of Material icons (Copyright Google Inc.)</desc>
|
||||||
|
<g fill="#03b8e5" fill-rule="nonzero" style="mix-blend-mode: normal">
|
||||||
|
<path d="M853.33,426.67v426.66c0,46.93 -38.4,85.34 -85.33,85.34h-512c-46.93,0 -85.33,-38.41 -85.33,-85.34v-426.66c0,-46.93 38.4,-85.34 85.33,-85.34h42.67v-85.33c0,-117.76 95.57,-213.33 213.33,-213.33c117.76,0 213.33,95.57 213.33,213.33v85.33h42.67c46.93,0 85.33,38.41 85.33,85.34zM644.27,256c0,-72.96 -59.31,-132.27 -132.27,-132.27c-72.96,0 -132.27,59.31 -132.27,132.27v85.33h264.54zM597.33,640c0,-46.93 -38.4,-85.33 -85.33,-85.33c-46.93,0 -85.33,38.4 -85.33,85.33c0,46.93 38.4,85.33 85.33,85.33c46.93,0 85.33,-38.4 85.33,-85.33z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 932 B |
6
demo/images/lock_open.svg
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0,0,1024,1024">
|
||||||
|
<desc>lock_open icon - Licensed under Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0) - Created with Iconfu.com - Derivative work of Material icons (Copyright Google Inc.)</desc>
|
||||||
|
<g fill="#03b8e5" fill-rule="nonzero" style="mix-blend-mode: normal">
|
||||||
|
<path d="M853.33,426.67v426.66c0,46.93 -38.4,85.34 -85.33,85.34h-512c-46.93,0 -85.33,-38.41 -85.33,-85.34v-426.66c0,-46.93 38.4,-85.34 85.33,-85.34h388.27v-85.33c0,-72.96 -59.31,-132.27 -132.27,-132.27c-72.96,0 -132.27,59.31 -132.27,132.27h-81.06c0,-117.76 95.57,-213.33 213.33,-213.33c117.76,0 213.33,95.57 213.33,213.33v85.33h42.67c46.93,0 85.33,38.41 85.33,85.34zM768,426.67h-512v426.66h512zM426.67,640c0,-46.93 38.4,-85.33 85.33,-85.33c46.93,0 85.33,38.4 85.33,85.33c0,46.93 -38.4,85.33 -85.33,85.33c-46.93,0 -85.33,-38.4 -85.33,-85.33z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 948 B |