Compare commits
973 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 |
160
.appveyor.yml
@@ -1,160 +0,0 @@
|
|||||||
version: '2.3.2.{build}'
|
|
||||||
branches:
|
|
||||||
only:
|
|
||||||
- master
|
|
||||||
|
|
||||||
image: Visual Studio 2015
|
|
||||||
clone_depth: 1
|
|
||||||
environment:
|
|
||||||
global:
|
|
||||||
# Appveyor doesn't have Qt 12 yet
|
|
||||||
LatestLTSQtVersion: 5.9
|
|
||||||
LatestQtVersion: 5.11
|
|
||||||
matrix:
|
|
||||||
# Latest version of Qt, dll, 64bit, MSVC 2015, qmake
|
|
||||||
- QT5: C:\Qt\%LatestQtVersion%\msvc2015_64
|
|
||||||
COMPILER: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC
|
|
||||||
targetPlatform: amd64
|
|
||||||
use_mingw: "false"
|
|
||||||
use_static: "false"
|
|
||||||
use_cmake: "false"
|
|
||||||
# 32 bit builds
|
|
||||||
# MSVC 2015 builds
|
|
||||||
# Dynamic Library builds
|
|
||||||
# LTS version of Qt, dll, 32bit, MSVC 2015, qmake
|
|
||||||
- QT5: C:\Qt\%LatestLTSQtVersion%\msvc2015
|
|
||||||
COMPILER: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC
|
|
||||||
targetPlatform: x86
|
|
||||||
use_mingw: "false"
|
|
||||||
use_static: "false"
|
|
||||||
use_cmake: "false"
|
|
||||||
# LTS version of Qt, dll, 32bit, MSVC 2015, cmake
|
|
||||||
- QT5: C:\Qt\%LatestLTSQtVersion%\msvc2015
|
|
||||||
COMPILER: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC
|
|
||||||
targetPlatform: x86
|
|
||||||
use_mingw: "false"
|
|
||||||
use_static: "false"
|
|
||||||
use_cmake: "true"
|
|
||||||
# end Dynamic Library builds
|
|
||||||
# Static Library builds
|
|
||||||
# LTS version of Qt, static, 32bit, MSVC 2015, qmake
|
|
||||||
- QT5: C:\Qt\%LatestLTSQtVersion%\msvc2015
|
|
||||||
COMPILER: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC
|
|
||||||
targetPlatform: x86
|
|
||||||
use_mingw: "false"
|
|
||||||
use_static: "true"
|
|
||||||
use_cmake: "false"
|
|
||||||
# LTS version of Qt, static, 32bit, MSVC 2015, cmake
|
|
||||||
- QT5: C:\Qt\%LatestLTSQtVersion%\msvc2015
|
|
||||||
COMPILER: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC
|
|
||||||
targetPlatform: x86
|
|
||||||
use_mingw: "false"
|
|
||||||
use_static: "true"
|
|
||||||
use_cmake: "true"
|
|
||||||
# end Static Library builds
|
|
||||||
# end MSVC 2015 builds
|
|
||||||
# MinGW builds
|
|
||||||
# Dynamic Library builds
|
|
||||||
# LTS version of Qt, dll, 32bit, MinGW, qmake
|
|
||||||
- QT5: C:\Qt\%LatestLTSQtVersion%\mingw53_32
|
|
||||||
COMPILER: C:\Qt\Tools\mingw530_32
|
|
||||||
targetPlatform: x86
|
|
||||||
use_mingw: "true"
|
|
||||||
use_static: "false"
|
|
||||||
use_cmake: "false"
|
|
||||||
# LTS version of Qt, dll, 32bit, MinGW, cmake
|
|
||||||
- QT5: C:\Qt\%LatestLTSQtVersion%\mingw53_32
|
|
||||||
COMPILER: C:\Qt\Tools\mingw530_32
|
|
||||||
targetPlatform: x86
|
|
||||||
use_mingw: "true"
|
|
||||||
use_static: "false"
|
|
||||||
use_cmake: "true"
|
|
||||||
# end Dynamic Library builds
|
|
||||||
# Static Library builds
|
|
||||||
# LTS version of Qt, static, 32bit, MinGW, qmake
|
|
||||||
- QT5: C:\Qt\%LatestLTSQtVersion%\mingw53_32
|
|
||||||
COMPILER: C:\Qt\Tools\mingw530_32
|
|
||||||
targetPlatform: x86
|
|
||||||
use_mingw: "true"
|
|
||||||
use_static: "true"
|
|
||||||
use_cmake: "false"
|
|
||||||
# LTS version of Qt, static, 32bit, MinGW, cmake
|
|
||||||
- QT5: C:\Qt\%LatestLTSQtVersion%\mingw53_32
|
|
||||||
COMPILER: C:\Qt\Tools\mingw530_32
|
|
||||||
targetPlatform: x86
|
|
||||||
use_mingw: "true"
|
|
||||||
use_static: "true"
|
|
||||||
use_cmake: "true"
|
|
||||||
# end Static Library builds
|
|
||||||
# end MinGW builds
|
|
||||||
# end 32 bit builds
|
|
||||||
# 64 bit builds
|
|
||||||
# MSVC 2015 builds
|
|
||||||
# Dynamic Library builds
|
|
||||||
# LTS version of Qt, dll, 64bit, MSVC 2015, qmake
|
|
||||||
- QT5: C:\Qt\%LatestLTSQtVersion%\msvc2015_64
|
|
||||||
COMPILER: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC
|
|
||||||
targetPlatform: amd64
|
|
||||||
use_mingw: "false"
|
|
||||||
use_static: "false"
|
|
||||||
use_cmake: "false"
|
|
||||||
# LTS version of Qt, dll, 64bit, MSVC 2015, cmake
|
|
||||||
- QT5: C:\Qt\%LatestLTSQtVersion%\msvc2015_64
|
|
||||||
COMPILER: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC
|
|
||||||
targetPlatform: amd64
|
|
||||||
use_mingw: "false"
|
|
||||||
use_static: "false"
|
|
||||||
use_cmake: "true"
|
|
||||||
# end Dynamic Library builds
|
|
||||||
# Static Library builds
|
|
||||||
# LTS version of Qt, static, 64bit, MSVC 2015, qmake
|
|
||||||
- QT5: C:\Qt\%LatestLTSQtVersion%\msvc2015_64
|
|
||||||
COMPILER: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC
|
|
||||||
targetPlatform: amd64
|
|
||||||
use_mingw: "false"
|
|
||||||
use_static: "true"
|
|
||||||
use_cmake: "false"
|
|
||||||
# LTS version of Qt, static, 64bit, MSVC 2015, cmake
|
|
||||||
- QT5: C:\Qt\%LatestLTSQtVersion%\msvc2015_64
|
|
||||||
COMPILER: C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC
|
|
||||||
targetPlatform: amd64
|
|
||||||
use_mingw: "false"
|
|
||||||
use_static: "true"
|
|
||||||
use_cmake: "true"
|
|
||||||
# end Static Library builds
|
|
||||||
# end MSVC 2015 builds
|
|
||||||
# end 64 bit builds
|
|
||||||
|
|
||||||
matrix:
|
|
||||||
fast_finish: true
|
|
||||||
|
|
||||||
before_build:
|
|
||||||
- set PATH=%COMPILER%\bin;%QT5%\bin;%PATH%
|
|
||||||
- set originalWD=%CD%
|
|
||||||
- call "%QT5%\bin\qtenv2.bat"
|
|
||||||
- cd %originalWD%
|
|
||||||
- if %use_mingw%==false call "%COMPILER%\vcvarsall.bat" %targetPlatform%
|
|
||||||
- if %use_static%==true (set USESTATIC=ON) else (set USESTATIC=OFF)
|
|
||||||
- if %use_mingw%==true (set CMAKEGENERATOR="MinGW Makefiles") else (set CMAKEGENERATOR="NMake Makefiles")
|
|
||||||
- if %use_mingw%==true (set MAKEENGINE=mingw32-make) else (set MAKEENGINE=nmake)
|
|
||||||
- if %use_mingw%==true set PATH=%PATH:C:\Program Files\Git\usr\bin;=%
|
|
||||||
|
|
||||||
build_script:
|
|
||||||
- if %use_cmake%==true mkdir .\build
|
|
||||||
- if %use_cmake%==true cd .\build
|
|
||||||
- if %use_cmake%==true cmake --version
|
|
||||||
- if %use_cmake%==true cmake -G %CMAKEGENERATOR% -DCMAKE_BUILD_TYPE=DEBUG -DBUILD_EXAMPLES=ON -DCMAKE_DEBUG_POSTFIX=d -DBUILD_STATIC=%USESTATIC% -DCMAKE_INSTALL_PREFIX="./installed" ../
|
|
||||||
- if %use_cmake%==true cmake --build .
|
|
||||||
- if %use_cmake%==true cmake --build . --target install
|
|
||||||
- if %use_cmake%==true cmake -G %CMAKEGENERATOR% -DCMAKE_BUILD_TYPE=RELEASE -DBUILD_EXAMPLES=ON -DBUILD_STATIC=%USESTATIC% -DCMAKE_INSTALL_PREFIX="./installed" ../
|
|
||||||
- if %use_cmake%==true cmake --build .
|
|
||||||
- if %use_cmake%==true cmake --build . --target install
|
|
||||||
- if %use_cmake%==false if %use_static%==true qmake "CONFIG+=adsBuildStatic"
|
|
||||||
- if %use_cmake%==false if %use_static%==false qmake
|
|
||||||
- if %use_cmake%==false %MAKEENGINE% debug
|
|
||||||
- if %use_cmake%==false %MAKEENGINE% install
|
|
||||||
- if %use_cmake%==false %MAKEENGINE% release
|
|
||||||
- if %use_cmake%==false %MAKEENGINE% install
|
|
||||||
|
|
||||||
after_build:
|
|
||||||
- if %use_mingw%==true set PATH=C:\Program Files\Git\usr\bin;%PATH%
|
|
||||||
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
|
||||||
359
.cproject
@@ -1,359 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
|
|
||||||
<storageModule moduleId="org.eclipse.cdt.core.settings">
|
|
||||||
<cconfiguration id="cdt.managedbuild.toolchain.gnu.mingw.base.1119687795">
|
|
||||||
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.toolchain.gnu.mingw.base.1119687795" moduleId="org.eclipse.cdt.core.settings" name="Default">
|
|
||||||
<externalSettings/>
|
|
||||||
<extensions>
|
|
||||||
<extension id="org.eclipse.cdt.core.PE" point="org.eclipse.cdt.core.BinaryParser"/>
|
|
||||||
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
|
||||||
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
|
||||||
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
|
||||||
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
|
|
||||||
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
|
||||||
</extensions>
|
|
||||||
</storageModule>
|
|
||||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
|
||||||
<configuration artifactName="${ProjName}" buildProperties="" description="" id="cdt.managedbuild.toolchain.gnu.mingw.base.1119687795" name="Default" parent="org.eclipse.cdt.build.core.emptycfg">
|
|
||||||
<folderInfo id="cdt.managedbuild.toolchain.gnu.mingw.base.1119687795.1949777584" name="/" resourcePath="">
|
|
||||||
<toolChain id="cdt.managedbuild.toolchain.gnu.mingw.base.88699815" name="MinGW GCC" superClass="cdt.managedbuild.toolchain.gnu.mingw.base">
|
|
||||||
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.PE" id="cdt.managedbuild.target.gnu.platform.mingw.base.519267520" name="Debug Platform" osList="win32" superClass="cdt.managedbuild.target.gnu.platform.mingw.base"/>
|
|
||||||
<builder id="cdt.managedbuild.toolchain.gnu.mingw.base.1119687795.1200539104" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" superClass="org.eclipse.cdt.build.core.settings.default.builder"/>
|
|
||||||
<tool id="cdt.managedbuild.tool.gnu.assembler.mingw.base.1438677059" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.mingw.base">
|
|
||||||
<option id="gnu.both.asm.option.include.paths.403127333" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths" valueType="includePath">
|
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/QtAdvancedDockingSystem/demo}""/>
|
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/QtAdvancedDockingSystem/src}""/>
|
|
||||||
<listOptionValue builtIn="false" value=""${QTDIR}/include""/>
|
|
||||||
<listOptionValue builtIn="false" value=""${QTDIR}/include/QtCore""/>
|
|
||||||
<listOptionValue builtIn="false" value=""${QTDIR}/include/QtWidgets""/>
|
|
||||||
</option>
|
|
||||||
<inputType id="cdt.managedbuild.tool.gnu.assembler.input.1249325593" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
|
|
||||||
</tool>
|
|
||||||
<tool id="cdt.managedbuild.tool.gnu.archiver.mingw.base.933824900" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.mingw.base"/>
|
|
||||||
<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.mingw.base.1947822681" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.mingw.base">
|
|
||||||
<option id="gnu.cpp.compiler.option.include.paths.349616932" name="Include paths (-I)" superClass="gnu.cpp.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
|
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/QtAdvancedDockingSystem/src}""/>
|
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/QtAdvancedDockingSystem/demo}""/>
|
|
||||||
<listOptionValue builtIn="false" value=""${QTDIR}/include""/>
|
|
||||||
<listOptionValue builtIn="false" value=""${QTDIR}/include/QtCore""/>
|
|
||||||
<listOptionValue builtIn="false" value=""${QTDIR}/include/QtWidgets""/>
|
|
||||||
</option>
|
|
||||||
<option id="gnu.cpp.compiler.option.preprocessor.def.56223209" name="Defined symbols (-D)" superClass="gnu.cpp.compiler.option.preprocessor.def" useByScannerDiscovery="false"/>
|
|
||||||
<inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.1318830536" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
|
|
||||||
</tool>
|
|
||||||
<tool id="cdt.managedbuild.tool.gnu.c.compiler.mingw.base.389117097" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.mingw.base">
|
|
||||||
<option id="gnu.c.compiler.option.include.paths.1871729602" name="Include paths (-I)" superClass="gnu.c.compiler.option.include.paths" useByScannerDiscovery="false" valueType="includePath">
|
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/QtAdvancedDockingSystem/demo}""/>
|
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/QtAdvancedDockingSystem/src}""/>
|
|
||||||
<listOptionValue builtIn="false" value=""${QTDIR}/include""/>
|
|
||||||
<listOptionValue builtIn="false" value=""${QTDIR}/include/QtCore""/>
|
|
||||||
<listOptionValue builtIn="false" value=""${QTDIR}/include/QtWidgets""/>
|
|
||||||
</option>
|
|
||||||
<option id="gnu.c.compiler.option.preprocessor.def.symbols.806805509" name="Defined symbols (-D)" superClass="gnu.c.compiler.option.preprocessor.def.symbols" useByScannerDiscovery="false"/>
|
|
||||||
<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.1568363924" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
|
|
||||||
</tool>
|
|
||||||
<tool id="cdt.managedbuild.tool.gnu.c.linker.mingw.base.1734874312" name="MinGW C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.mingw.base"/>
|
|
||||||
<tool id="cdt.managedbuild.tool.gnu.cpp.linker.mingw.base.985493173" name="MinGW C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.mingw.base">
|
|
||||||
<inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.266071128" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
|
|
||||||
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
|
|
||||||
<additionalInput kind="additionalinput" paths="$(LIBS)"/>
|
|
||||||
</inputType>
|
|
||||||
</tool>
|
|
||||||
</toolChain>
|
|
||||||
</folderInfo>
|
|
||||||
</configuration>
|
|
||||||
</storageModule>
|
|
||||||
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
|
|
||||||
</cconfiguration>
|
|
||||||
</storageModule>
|
|
||||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
|
||||||
<project id="QtAdvancedDockingSystem.null.1346550114" name="QtAdvancedDockingSystem"/>
|
|
||||||
</storageModule>
|
|
||||||
<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
|
|
||||||
<storageModule moduleId="refreshScope"/>
|
|
||||||
<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets">
|
|
||||||
<buildTargets>
|
|
||||||
<target name="Build all" path=" build" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>mingw32-make</buildCommand>
|
|
||||||
<buildArguments>-j</buildArguments>
|
|
||||||
<buildTarget>all</buildTarget>
|
|
||||||
<stopOnError>false</stopOnError>
|
|
||||||
<useDefaultCommand>false</useDefaultCommand>
|
|
||||||
<runAllBuilders>false</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
<target name="Clean" path=" build" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>make</buildCommand>
|
|
||||||
<buildArguments/>
|
|
||||||
<buildTarget>clean</buildTarget>
|
|
||||||
<stopOnError>false</stopOnError>
|
|
||||||
<useDefaultCommand>true</useDefaultCommand>
|
|
||||||
<runAllBuilders>false</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
<target name="Debug Build" path=" build" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>mingw32-make</buildCommand>
|
|
||||||
<buildArguments>-j6</buildArguments>
|
|
||||||
<buildTarget>debug</buildTarget>
|
|
||||||
<stopOnError>false</stopOnError>
|
|
||||||
<useDefaultCommand>false</useDefaultCommand>
|
|
||||||
<runAllBuilders>false</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
<target name="qmake" path=" build" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>qmake</buildCommand>
|
|
||||||
<buildArguments>-recursive ../ads.pro</buildArguments>
|
|
||||||
<stopOnError>true</stopOnError>
|
|
||||||
<useDefaultCommand>false</useDefaultCommand>
|
|
||||||
<runAllBuilders>false</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
<target name="Release Build" path=" build" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>mingw32-make</buildCommand>
|
|
||||||
<buildArguments>-j4</buildArguments>
|
|
||||||
<buildTarget>release</buildTarget>
|
|
||||||
<stopOnError>false</stopOnError>
|
|
||||||
<useDefaultCommand>false</useDefaultCommand>
|
|
||||||
<runAllBuilders>false</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
<target name="Build all" path=" build/src" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>mingw32-make</buildCommand>
|
|
||||||
<buildArguments>-j</buildArguments>
|
|
||||||
<buildTarget>all</buildTarget>
|
|
||||||
<stopOnError>false</stopOnError>
|
|
||||||
<useDefaultCommand>false</useDefaultCommand>
|
|
||||||
<runAllBuilders>false</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
<target name="Clean" path=" build/src" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>make</buildCommand>
|
|
||||||
<buildTarget>clean</buildTarget>
|
|
||||||
<stopOnError>false</stopOnError>
|
|
||||||
<useDefaultCommand>true</useDefaultCommand>
|
|
||||||
<runAllBuilders>false</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
<target name="Debug Build" path=" build/src" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>mingw32-make</buildCommand>
|
|
||||||
<buildArguments>-j6</buildArguments>
|
|
||||||
<buildTarget>debug</buildTarget>
|
|
||||||
<stopOnError>false</stopOnError>
|
|
||||||
<useDefaultCommand>false</useDefaultCommand>
|
|
||||||
<runAllBuilders>false</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
<target name="qmake" path=" build/src" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>qmake</buildCommand>
|
|
||||||
<buildArguments>-recursive ../../src/src.pro</buildArguments>
|
|
||||||
<stopOnError>true</stopOnError>
|
|
||||||
<useDefaultCommand>false</useDefaultCommand>
|
|
||||||
<runAllBuilders>false</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
<target name="Release Build" path=" build/src" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>mingw32-make</buildCommand>
|
|
||||||
<buildArguments>-j4</buildArguments>
|
|
||||||
<buildTarget>release</buildTarget>
|
|
||||||
<stopOnError>false</stopOnError>
|
|
||||||
<useDefaultCommand>false</useDefaultCommand>
|
|
||||||
<runAllBuilders>false</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
<target name="Build all" path=" build/example" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>mingw32-make</buildCommand>
|
|
||||||
<buildArguments>-j</buildArguments>
|
|
||||||
<buildTarget>all</buildTarget>
|
|
||||||
<stopOnError>false</stopOnError>
|
|
||||||
<useDefaultCommand>false</useDefaultCommand>
|
|
||||||
<runAllBuilders>false</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
<target name="Clean" path=" build/example" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>make</buildCommand>
|
|
||||||
<buildArguments/>
|
|
||||||
<buildTarget>clean</buildTarget>
|
|
||||||
<stopOnError>false</stopOnError>
|
|
||||||
<useDefaultCommand>true</useDefaultCommand>
|
|
||||||
<runAllBuilders>false</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
<target name="Debug Build" path=" build/example" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>mingw32-make</buildCommand>
|
|
||||||
<buildArguments>-j6</buildArguments>
|
|
||||||
<buildTarget>debug</buildTarget>
|
|
||||||
<stopOnError>false</stopOnError>
|
|
||||||
<useDefaultCommand>false</useDefaultCommand>
|
|
||||||
<runAllBuilders>false</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
<target name="qmake" path=" build/example" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>qmake</buildCommand>
|
|
||||||
<buildArguments>-recursive ../../example/example.pro</buildArguments>
|
|
||||||
<buildTarget/>
|
|
||||||
<stopOnError>true</stopOnError>
|
|
||||||
<useDefaultCommand>false</useDefaultCommand>
|
|
||||||
<runAllBuilders>false</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
<target name="Release Build" path=" build/example" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>mingw32-make</buildCommand>
|
|
||||||
<buildArguments>-j4</buildArguments>
|
|
||||||
<buildTarget>release</buildTarget>
|
|
||||||
<stopOnError>false</stopOnError>
|
|
||||||
<useDefaultCommand>false</useDefaultCommand>
|
|
||||||
<runAllBuilders>false</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
<target name="Build all" path=" build/demo" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>mingw32-make</buildCommand>
|
|
||||||
<buildArguments>-j</buildArguments>
|
|
||||||
<buildTarget>all</buildTarget>
|
|
||||||
<stopOnError>false</stopOnError>
|
|
||||||
<useDefaultCommand>false</useDefaultCommand>
|
|
||||||
<runAllBuilders>false</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
<target name="Clean" path=" build/demo" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>make</buildCommand>
|
|
||||||
<buildTarget>clean</buildTarget>
|
|
||||||
<stopOnError>false</stopOnError>
|
|
||||||
<useDefaultCommand>true</useDefaultCommand>
|
|
||||||
<runAllBuilders>false</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
<target name="Debug Build" path=" build/demo" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>mingw32-make</buildCommand>
|
|
||||||
<buildArguments>-j6</buildArguments>
|
|
||||||
<buildTarget>debug</buildTarget>
|
|
||||||
<stopOnError>false</stopOnError>
|
|
||||||
<useDefaultCommand>false</useDefaultCommand>
|
|
||||||
<runAllBuilders>false</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
<target name="qmake" path=" build/demo" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>qmake</buildCommand>
|
|
||||||
<buildArguments>-recursive ../../demo/demo.pro</buildArguments>
|
|
||||||
<stopOnError>true</stopOnError>
|
|
||||||
<useDefaultCommand>false</useDefaultCommand>
|
|
||||||
<runAllBuilders>false</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
<target name="Release Build" path=" build/demo" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>mingw32-make</buildCommand>
|
|
||||||
<buildArguments>-j4</buildArguments>
|
|
||||||
<buildTarget>release</buildTarget>
|
|
||||||
<stopOnError>false</stopOnError>
|
|
||||||
<useDefaultCommand>false</useDefaultCommand>
|
|
||||||
<runAllBuilders>false</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
<target name="Build all" path=" build/AdvancedDockingSystemDemo" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>mingw32-make</buildCommand>
|
|
||||||
<buildArguments>-j</buildArguments>
|
|
||||||
<buildTarget>all</buildTarget>
|
|
||||||
<stopOnError>false</stopOnError>
|
|
||||||
<useDefaultCommand>false</useDefaultCommand>
|
|
||||||
<runAllBuilders>false</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
<target name="Clean" path=" build/AdvancedDockingSystemDemo" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>make</buildCommand>
|
|
||||||
<buildArguments/>
|
|
||||||
<buildTarget>clean</buildTarget>
|
|
||||||
<stopOnError>false</stopOnError>
|
|
||||||
<useDefaultCommand>true</useDefaultCommand>
|
|
||||||
<runAllBuilders>false</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
<target name="Debug Build" path=" build/AdvancedDockingSystemDemo" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>mingw32-make</buildCommand>
|
|
||||||
<buildArguments>-j6</buildArguments>
|
|
||||||
<buildTarget>debug</buildTarget>
|
|
||||||
<stopOnError>false</stopOnError>
|
|
||||||
<useDefaultCommand>false</useDefaultCommand>
|
|
||||||
<runAllBuilders>false</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
<target name="qmake" path=" build/AdvancedDockingSystemDemo" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>qmake</buildCommand>
|
|
||||||
<buildArguments>-recursive ../../AdvancedDockingSystemDemo/AdvancedDockingSystemDemo.pro</buildArguments>
|
|
||||||
<stopOnError>true</stopOnError>
|
|
||||||
<useDefaultCommand>false</useDefaultCommand>
|
|
||||||
<runAllBuilders>false</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
<target name="Release Build" path=" build/AdvancedDockingSystemDemo" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>mingw32-make</buildCommand>
|
|
||||||
<buildArguments>-j4</buildArguments>
|
|
||||||
<buildTarget>release</buildTarget>
|
|
||||||
<stopOnError>false</stopOnError>
|
|
||||||
<useDefaultCommand>false</useDefaultCommand>
|
|
||||||
<runAllBuilders>false</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
<target name="Build all" path=" build/AdvancedDockingSystemDemo_v2" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>mingw32-make</buildCommand>
|
|
||||||
<buildArguments>-j</buildArguments>
|
|
||||||
<buildTarget>all</buildTarget>
|
|
||||||
<stopOnError>false</stopOnError>
|
|
||||||
<useDefaultCommand>false</useDefaultCommand>
|
|
||||||
<runAllBuilders>false</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
<target name="Clean" path=" build/AdvancedDockingSystemDemo_v2" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>make</buildCommand>
|
|
||||||
<buildArguments/>
|
|
||||||
<buildTarget>clean</buildTarget>
|
|
||||||
<stopOnError>false</stopOnError>
|
|
||||||
<useDefaultCommand>true</useDefaultCommand>
|
|
||||||
<runAllBuilders>false</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
<target name="Debug Build" path=" build/AdvancedDockingSystemDemo_v2" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>mingw32-make</buildCommand>
|
|
||||||
<buildArguments>-j6</buildArguments>
|
|
||||||
<buildTarget>debug</buildTarget>
|
|
||||||
<stopOnError>false</stopOnError>
|
|
||||||
<useDefaultCommand>false</useDefaultCommand>
|
|
||||||
<runAllBuilders>false</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
<target name="qmake" path=" build/AdvancedDockingSystemDemo_v2" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>qmake</buildCommand>
|
|
||||||
<buildArguments>-recursive ../../AdvancedDockingSystemDemo_v2/AdvancedDockingSystemDemo_v2.pro</buildArguments>
|
|
||||||
<stopOnError>true</stopOnError>
|
|
||||||
<useDefaultCommand>false</useDefaultCommand>
|
|
||||||
<runAllBuilders>false</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
<target name="Release Build" path=" build/AdvancedDockingSystemDemo_v2" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>mingw32-make</buildCommand>
|
|
||||||
<buildArguments>-j4</buildArguments>
|
|
||||||
<buildTarget>release</buildTarget>
|
|
||||||
<stopOnError>false</stopOnError>
|
|
||||||
<useDefaultCommand>false</useDefaultCommand>
|
|
||||||
<runAllBuilders>false</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
<target name="Build all" path=" build/AdvancedDockingSystem" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>mingw32-make</buildCommand>
|
|
||||||
<buildArguments>-j</buildArguments>
|
|
||||||
<buildTarget>all</buildTarget>
|
|
||||||
<stopOnError>false</stopOnError>
|
|
||||||
<useDefaultCommand>false</useDefaultCommand>
|
|
||||||
<runAllBuilders>false</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
<target name="Clean" path=" build/AdvancedDockingSystem" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>make</buildCommand>
|
|
||||||
<buildArguments/>
|
|
||||||
<buildTarget>clean</buildTarget>
|
|
||||||
<stopOnError>false</stopOnError>
|
|
||||||
<useDefaultCommand>true</useDefaultCommand>
|
|
||||||
<runAllBuilders>false</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
<target name="Debug Build" path=" build/AdvancedDockingSystem" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>mingw32-make</buildCommand>
|
|
||||||
<buildArguments>-j6</buildArguments>
|
|
||||||
<buildTarget>debug</buildTarget>
|
|
||||||
<stopOnError>false</stopOnError>
|
|
||||||
<useDefaultCommand>false</useDefaultCommand>
|
|
||||||
<runAllBuilders>false</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
<target name="qmake" path=" build/AdvancedDockingSystem" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>qmake</buildCommand>
|
|
||||||
<buildArguments>-recursive ../../AdvancedDockingSystem/src.pro</buildArguments>
|
|
||||||
<stopOnError>true</stopOnError>
|
|
||||||
<useDefaultCommand>false</useDefaultCommand>
|
|
||||||
<runAllBuilders>false</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
<target name="Release Build" path=" build/AdvancedDockingSystem" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
|
|
||||||
<buildCommand>mingw32-make</buildCommand>
|
|
||||||
<buildArguments>-j4</buildArguments>
|
|
||||||
<buildTarget>release</buildTarget>
|
|
||||||
<stopOnError>false</stopOnError>
|
|
||||||
<useDefaultCommand>false</useDefaultCommand>
|
|
||||||
<runAllBuilders>false</runAllBuilders>
|
|
||||||
</target>
|
|
||||||
</buildTargets>
|
|
||||||
</storageModule>
|
|
||||||
<storageModule moduleId="scannerConfiguration">
|
|
||||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
|
||||||
<scannerConfigBuildInfo instanceId="cdt.managedbuild.toolchain.gnu.mingw.base.1119687795;cdt.managedbuild.toolchain.gnu.mingw.base.1119687795.1949777584;cdt.managedbuild.tool.gnu.cpp.compiler.mingw.base.1947822681;cdt.managedbuild.tool.gnu.cpp.compiler.input.1318830536">
|
|
||||||
<autodiscovery enabled="false" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile"/>
|
|
||||||
</scannerConfigBuildInfo>
|
|
||||||
<scannerConfigBuildInfo instanceId="cdt.managedbuild.toolchain.gnu.mingw.base.1119687795;cdt.managedbuild.toolchain.gnu.mingw.base.1119687795.1949777584;cdt.managedbuild.tool.gnu.c.compiler.mingw.base.389117097;cdt.managedbuild.tool.gnu.c.compiler.input.1568363924">
|
|
||||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
|
||||||
</scannerConfigBuildInfo>
|
|
||||||
</storageModule>
|
|
||||||
</cproject>
|
|
||||||
84
.github/workflows/linux-builds.yml
vendored
@@ -1,22 +1,84 @@
|
|||||||
name: linux-builds
|
name: linux-builds
|
||||||
|
|
||||||
on: [push]
|
on:
|
||||||
|
push:
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build_ubuntu_2204_cmake:
|
||||||
strategy:
|
runs-on: ubuntu-22.04
|
||||||
matrix:
|
|
||||||
os: [ubuntu-latest, ubuntu-18.04, ubuntu-16.04]
|
|
||||||
|
|
||||||
runs-on: ${{ matrix.os }}
|
env:
|
||||||
|
QT_VERSION: 6.4.2
|
||||||
|
QT_DIR: ${{ github.workspace }}/Qt
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v1
|
- name: Checkout source
|
||||||
- name: install qt
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0 # Fetch full history and tags
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get update --fix-missing
|
sudo apt-get update
|
||||||
sudo apt-get install qt5-default
|
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
|
- name: qmake
|
||||||
run: qmake
|
run: qmake
|
||||||
- name: make
|
- name: make
|
||||||
run: make -j4
|
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
|
||||||
372
.gitignore
vendored
@@ -1,4 +1,4 @@
|
|||||||
*.pro.user
|
*.pro.user*
|
||||||
/build
|
/build
|
||||||
*.o
|
*.o
|
||||||
*.dylib
|
*.dylib
|
||||||
@@ -7,6 +7,9 @@ qrc_*
|
|||||||
moc_*
|
moc_*
|
||||||
ui_*
|
ui_*
|
||||||
Makefile
|
Makefile
|
||||||
|
*.dll
|
||||||
|
*.a
|
||||||
|
build*
|
||||||
|
|
||||||
# IDEs
|
# IDEs
|
||||||
.idea
|
.idea
|
||||||
@@ -17,3 +20,370 @@ Makefile
|
|||||||
*.pyd
|
*.pyd
|
||||||
__pycache__
|
__pycache__
|
||||||
PyQtAds/rc.py
|
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
|
||||||
|
|||||||
@@ -1,12 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
|
||||||
<project>
|
|
||||||
<configuration id="cdt.managedbuild.toolchain.gnu.mingw.base.1119687795" name="Default">
|
|
||||||
<extension point="org.eclipse.cdt.core.LanguageSettingsProvider">
|
|
||||||
<provider-reference id="org.eclipse.cdt.managedbuilder.core.GCCBuiltinSpecsDetectorMinGW" ref="shared-provider"/>
|
|
||||||
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
|
|
||||||
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
|
|
||||||
<provider class="org.eclipse.cdt.managedbuilder.language.settings.providers.GCCBuildCommandParser" id="org.eclipse.cdt.managedbuilder.core.GCCBuildCommandParser" keep-relative-paths="false" name="CDT GCC Build Output Parser" parameter="(g?cc)|([gc]\+\+)|(clang)" prefer-non-shared="true"/>
|
|
||||||
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
|
|
||||||
</extension>
|
|
||||||
</configuration>
|
|
||||||
</project>
|
|
||||||
155
.travis.yml
@@ -1,155 +0,0 @@
|
|||||||
language: cpp
|
|
||||||
# gcc is clang on mac
|
|
||||||
compiler: gcc
|
|
||||||
|
|
||||||
git:
|
|
||||||
depth: 1
|
|
||||||
|
|
||||||
matrix:
|
|
||||||
fast_finish: true
|
|
||||||
include:
|
|
||||||
- name: Ubuntu qmake Qt5.5.1
|
|
||||||
os: linux
|
|
||||||
dist: trusty
|
|
||||||
group: stable
|
|
||||||
addons:
|
|
||||||
apt:
|
|
||||||
sources:
|
|
||||||
- ubuntu-toolchain-r-test
|
|
||||||
- sourceline: 'ppa:beineri/opt-qt551-trusty'
|
|
||||||
update: true
|
|
||||||
packages:
|
|
||||||
- qt55base
|
|
||||||
- qt55tools
|
|
||||||
- gcc-6
|
|
||||||
- g++-6
|
|
||||||
- libc6-i386
|
|
||||||
script:
|
|
||||||
- PATH="/opt/qt55/bin:$PATH"
|
|
||||||
- CXX="g++-6"
|
|
||||||
- CC="gcc-6"
|
|
||||||
- qt55-env.sh
|
|
||||||
- qmake
|
|
||||||
- make
|
|
||||||
- make install
|
|
||||||
- name: Ubuntu qmake dll
|
|
||||||
os: linux
|
|
||||||
dist: xenial
|
|
||||||
group: stable
|
|
||||||
addons:
|
|
||||||
apt:
|
|
||||||
sources:
|
|
||||||
- ubuntu-toolchain-r-test
|
|
||||||
- sourceline: 'ppa:beineri/opt-qt-5.12.0-xenial'
|
|
||||||
update: true
|
|
||||||
packages:
|
|
||||||
- qt512base
|
|
||||||
- qt512tools
|
|
||||||
- gcc-6
|
|
||||||
- g++-6
|
|
||||||
- libc6-i386
|
|
||||||
- libgl-dev
|
|
||||||
- libgl1-mesa-dev
|
|
||||||
- mesa-common-dev
|
|
||||||
script:
|
|
||||||
- PATH="/opt/qt512/bin:$PATH"
|
|
||||||
- CXX="g++-6"
|
|
||||||
- CC="gcc-6"
|
|
||||||
- qt512-env.sh
|
|
||||||
- qmake
|
|
||||||
- make
|
|
||||||
- make install
|
|
||||||
- name: Ubuntu qmake static
|
|
||||||
os: linux
|
|
||||||
dist: xenial
|
|
||||||
group: stable
|
|
||||||
addons:
|
|
||||||
apt:
|
|
||||||
sources:
|
|
||||||
- ubuntu-toolchain-r-test
|
|
||||||
- sourceline: 'ppa:beineri/opt-qt-5.12.0-xenial'
|
|
||||||
update: true
|
|
||||||
packages:
|
|
||||||
- qt512base
|
|
||||||
- qt512tools
|
|
||||||
- gcc-6
|
|
||||||
- g++-6
|
|
||||||
- libc6-i386
|
|
||||||
- libgl-dev
|
|
||||||
- libgl1-mesa-dev
|
|
||||||
- mesa-common-dev
|
|
||||||
script:
|
|
||||||
- PATH="/opt/qt512/bin:$PATH"
|
|
||||||
- CXX="g++-6"
|
|
||||||
- CC="gcc-6"
|
|
||||||
- qt512-env.sh
|
|
||||||
- qmake "CONFIG+=adsBuildStatic"
|
|
||||||
- make
|
|
||||||
- make install
|
|
||||||
- name: macOS CMake dll
|
|
||||||
os: osx
|
|
||||||
osx_image: xcode10.1
|
|
||||||
addons:
|
|
||||||
homebrew:
|
|
||||||
packages:
|
|
||||||
- qt
|
|
||||||
update: true
|
|
||||||
script:
|
|
||||||
- PATH="/usr/local/opt/qt5/bin:$PATH"
|
|
||||||
- mkdir -p build
|
|
||||||
- cd build
|
|
||||||
- cmake --version
|
|
||||||
- cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=DEBUG -DCMAKE_DEBUG_POSTFIX=_debug -DBUILD_EXAMPLES=ON -DBUILD_STATIC=OFF -DCMAKE_INSTALL_PREFIX="./installed" ../
|
|
||||||
- cmake --build .
|
|
||||||
- cmake --build . --target install
|
|
||||||
- cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=RELEASE -DBUILD_EXAMPLES=ON -DBUILD_STATIC=OFF -DCMAKE_INSTALL_PREFIX="./installed" ../
|
|
||||||
- cmake --build .
|
|
||||||
- cmake --build . --target install
|
|
||||||
- name: macOS CMake static
|
|
||||||
os: osx
|
|
||||||
osx_image: xcode10.1
|
|
||||||
addons:
|
|
||||||
homebrew:
|
|
||||||
packages:
|
|
||||||
- qt
|
|
||||||
update: true
|
|
||||||
script:
|
|
||||||
- PATH="/usr/local/opt/qt5/bin:$PATH"
|
|
||||||
- mkdir -p build
|
|
||||||
- cd build
|
|
||||||
- cmake --version
|
|
||||||
- cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=DEBUG -DCMAKE_DEBUG_POSTFIX=_debug -DBUILD_EXAMPLES=ON -DBUILD_STATIC=ON -DCMAKE_INSTALL_PREFIX="./installed" ../
|
|
||||||
- cmake --build .
|
|
||||||
- cmake --build . --target install
|
|
||||||
- cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=RELEASE -DBUILD_EXAMPLES=ON -DBUILD_STATIC=ON -DCMAKE_INSTALL_PREFIX="./installed" ../
|
|
||||||
- cmake --build .
|
|
||||||
- cmake --build . --target install
|
|
||||||
- name: macOS qmake dll
|
|
||||||
os: osx
|
|
||||||
osx_image: xcode10.1
|
|
||||||
addons:
|
|
||||||
homebrew:
|
|
||||||
packages:
|
|
||||||
- qt
|
|
||||||
update: true
|
|
||||||
script:
|
|
||||||
- PATH="/usr/local/opt/qt5/bin:$PATH"
|
|
||||||
- qmake
|
|
||||||
- make
|
|
||||||
- make install
|
|
||||||
- name: macOS qmake static
|
|
||||||
os: osx
|
|
||||||
osx_image: xcode10.1
|
|
||||||
addons:
|
|
||||||
homebrew:
|
|
||||||
packages:
|
|
||||||
- qt
|
|
||||||
update: true
|
|
||||||
script:
|
|
||||||
- PATH="/usr/local/opt/qt5/bin:$PATH"
|
|
||||||
- qmake "CONFIG+=adsBuildStatic"
|
|
||||||
- make
|
|
||||||
- make install
|
|
||||||
notifications:
|
|
||||||
email: false
|
|
||||||
|
|
||||||
166
CMakeLists.txt
@@ -1,129 +1,61 @@
|
|||||||
cmake_minimum_required(VERSION 3.3)
|
cmake_minimum_required(VERSION 3.16)
|
||||||
set(ads_VERSION "2.3.2")
|
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
||||||
set(CMAKE_CXX_STANDARD 14)
|
if (POLICY CMP0091)
|
||||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
cmake_policy(SET CMP0091 NEW)
|
||||||
set(CMAKE_CXX_EXTENSIONS OFF)
|
endif (POLICY CMP0091)
|
||||||
set(CMAKE_AUTOMOC ON)
|
|
||||||
set(CMAKE_AUTORCC ON)
|
# Add cmake modules path (required for Versioning.cmake and git revision description)
|
||||||
project(QtAdvancedDockingSystem VERSION ${ads_VERSION})
|
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_STATIC "Build the static library" OFF)
|
||||||
option(BUILD_EXAMPLES "Build the examples" ON)
|
option(BUILD_EXAMPLES "Build the examples" ON)
|
||||||
set(REQUIRED_QT_VERSION 5.5.0)
|
|
||||||
find_package(Qt5Core ${REQUIRED_QT_VERSION} REQUIRED)
|
# Platform directory: auto-detected based on pointer size, or manually set
|
||||||
find_package(Qt5Gui ${REQUIRED_QT_VERSION} REQUIRED)
|
if(NOT ADS_PLATFORM_DIR)
|
||||||
find_package(Qt5Widgets ${REQUIRED_QT_VERSION} REQUIRED)
|
if("${CMAKE_SIZEOF_VOID_P}" STREQUAL "4")
|
||||||
message(STATUS "Found Qt ${Qt5Core_VERSION}")
|
|
||||||
set(ads_INCLUDE ${ads_INCLUDE} ${Qt5Core_INCLUDE_DIRS})
|
|
||||||
set(ads_INCLUDE ${ads_INCLUDE} "${CMAKE_CURRENT_SOURCE_DIR}/src")
|
|
||||||
set(ads_LIBS ${ads_LIBS} ${Qt5Core_LIBRARIES})
|
|
||||||
set(ads_COMPILE_DEFINE ${ads_COMPILE_DEFINE} ${Qt5Core_COMPILE_DEFINITIONS})
|
|
||||||
set(ads_LIBS ${ads_LIBS} ${Qt5Gui_LIBRARIES})
|
|
||||||
set(ads_INCLUDE ${ads_INCLUDE} ${Qt5Gui_INCLUDE_DIRS})
|
|
||||||
set(ads_COMPILE_DEFINE ${ads_COMPILE_DEFINE} ${Qt5Gui_COMPILE_DEFINITIONS})
|
|
||||||
set(ads_LIBS ${ads_LIBS} ${Qt5Widgets_LIBRARIES})
|
|
||||||
set(ads_INCLUDE ${ads_INCLUDE} ${Qt5Widgets_INCLUDE_DIRS})
|
|
||||||
set(ads_COMPILE_DEFINE ${ads_COMPILE_DEFINE} ${Qt5Widgets_COMPILE_DEFINITIONS})
|
|
||||||
if(BUILD_STATIC)
|
|
||||||
set(CMAKE_STATIC_LIBRARY_SUFFIX "_static${CMAKE_STATIC_LIBRARY_SUFFIX}")
|
|
||||||
endif()
|
|
||||||
set(ads_SRCS
|
|
||||||
src/ads_globals.cpp
|
|
||||||
src/DockAreaTabBar.cpp
|
|
||||||
src/DockAreaTitleBar.cpp
|
|
||||||
src/DockAreaWidget.cpp
|
|
||||||
src/DockContainerWidget.cpp
|
|
||||||
src/DockManager.cpp
|
|
||||||
src/DockOverlay.cpp
|
|
||||||
src/DockSplitter.cpp
|
|
||||||
src/DockWidget.cpp
|
|
||||||
src/DockWidgetTab.cpp
|
|
||||||
src/DockingStateReader.cpp
|
|
||||||
src/ElidingLabel.cpp
|
|
||||||
src/FloatingDockContainer.cpp
|
|
||||||
src/FloatingDragPreview.cpp
|
|
||||||
src/IconProvider.cpp
|
|
||||||
src/DockComponentsFactory.cpp
|
|
||||||
src/ads.qrc
|
|
||||||
src/linux/FloatingWidgetTitleBar.cpp
|
|
||||||
)
|
|
||||||
set(ads_INSTALL_INCLUDE
|
|
||||||
src/ads_globals.h
|
|
||||||
src/DockAreaTabBar.h
|
|
||||||
src/DockAreaTitleBar.h
|
|
||||||
src/DockAreaWidget.h
|
|
||||||
src/DockContainerWidget.h
|
|
||||||
src/DockManager.h
|
|
||||||
src/DockOverlay.h
|
|
||||||
src/DockSplitter.h
|
|
||||||
src/DockWidget.h
|
|
||||||
src/DockWidgetTab.h
|
|
||||||
src/DockingStateReader.h
|
|
||||||
src/ElidingLabel.h
|
|
||||||
src/FloatingDockContainer.h
|
|
||||||
src/FloatingDragPreview.h
|
|
||||||
src/IconProvider.h
|
|
||||||
src/DockComponentsFactory.h
|
|
||||||
src/linux/FloatingWidgetTitleBar.h
|
|
||||||
)
|
|
||||||
if("${CMAKE_SIZEOF_VOID_P}" STREQUAL "4")
|
|
||||||
set(ads_PlatformDir "x86")
|
set(ads_PlatformDir "x86")
|
||||||
else()
|
else()
|
||||||
set(ads_PlatformDir "x64")
|
set(ads_PlatformDir "x64")
|
||||||
endif()
|
endif()
|
||||||
if(BUILD_STATIC)
|
|
||||||
add_library(qtadvanceddocking STATIC ${ads_SRCS})
|
|
||||||
target_compile_definitions(qtadvanceddocking PUBLIC ADS_STATIC)
|
|
||||||
else()
|
else()
|
||||||
add_library(qtadvanceddocking SHARED ${ads_SRCS})
|
set(ads_PlatformDir "${ADS_PLATFORM_DIR}")
|
||||||
set(ads_COMPILE_DEFINE ${ads_COMPILE_DEFINE} ADS_SHARED_EXPORT)
|
|
||||||
endif()
|
endif()
|
||||||
install(FILES ${ads_INSTALL_INCLUDE}
|
|
||||||
DESTINATION include
|
|
||||||
COMPONENT headers
|
|
||||||
)
|
|
||||||
install(FILES
|
|
||||||
"${CMAKE_CURRENT_SOURCE_DIR}/LICENSE"
|
|
||||||
"${CMAKE_CURRENT_SOURCE_DIR}/gnu-lgpl-v2.1.md"
|
|
||||||
DESTINATION license
|
|
||||||
COMPONENT license
|
|
||||||
)
|
|
||||||
install(TARGETS qtadvanceddocking
|
|
||||||
EXPORT adsTargets
|
|
||||||
RUNTIME DESTINATION bin
|
|
||||||
LIBRARY DESTINATION lib
|
|
||||||
ARCHIVE DESTINATION lib
|
|
||||||
INCLUDES DESTINATION include
|
|
||||||
)
|
|
||||||
|
|
||||||
include(CMakePackageConfigHelpers)
|
add_subdirectory(src)
|
||||||
write_basic_package_version_file("adsConfigVersion.cmake"
|
|
||||||
VERSION ${ads_VERSION}
|
|
||||||
COMPATIBILITY SameMajorVersion
|
|
||||||
)
|
|
||||||
install(EXPORT adsTargets
|
|
||||||
FILE adsTargets.cmake
|
|
||||||
NAMESPACE ads::
|
|
||||||
DESTINATION lib/cmake/ads
|
|
||||||
)
|
|
||||||
install(FILES "adsConfig.cmake" "${CMAKE_BINARY_DIR}/adsConfigVersion.cmake"
|
|
||||||
DESTINATION lib/cmake/ads
|
|
||||||
)
|
|
||||||
|
|
||||||
target_include_directories(qtadvanceddocking PUBLIC
|
|
||||||
"$<BUILD_INTERFACE:${ads_INCLUDE}>"
|
|
||||||
$<INSTALL_INTERFACE:include>
|
|
||||||
)
|
|
||||||
target_link_libraries(qtadvanceddocking PUBLIC ${ads_LIBS})
|
|
||||||
target_compile_definitions(qtadvanceddocking PRIVATE ${ads_COMPILE_DEFINE})
|
|
||||||
set_target_properties(qtadvanceddocking PROPERTIES
|
|
||||||
VERSION ${ads_VERSION}
|
|
||||||
EXPORT_NAME "QtAdvancedDockingSystem"
|
|
||||||
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_EXAMPLES)
|
if(BUILD_EXAMPLES)
|
||||||
add_subdirectory(example)
|
add_subdirectory(examples)
|
||||||
add_subdirectory(demo)
|
add_subdirectory(demo)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +0,0 @@
|
|||||||
from .ads import ads
|
|
||||||
from .._version import *
|
|
||||||
|
|
||||||
import inspect
|
|
||||||
|
|
||||||
for name, member in inspect.getmembers(ads):
|
|
||||||
if not name.startswith('_'):
|
|
||||||
globals()[name] = member
|
|
||||||
|
|
||||||
del ads
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
from .rc import *
|
|
||||||
from ._version import get_versions
|
|
||||||
__version__ = get_versions()['version']
|
|
||||||
short_version = __version__
|
|
||||||
version = __version__
|
|
||||||
full_version = __version__
|
|
||||||
git_revision = get_versions()['full-revisionid']
|
|
||||||
release = not get_versions()['dirty']
|
|
||||||
del get_versions
|
|
||||||
@@ -1,520 +0,0 @@
|
|||||||
|
|
||||||
# This file helps to compute a version number in source trees obtained from
|
|
||||||
# git-archive tarball (such as those provided by githubs download-from-tag
|
|
||||||
# feature). Distribution tarballs (built by setup.py sdist) and build
|
|
||||||
# directories (produced by setup.py build) will contain a much shorter file
|
|
||||||
# that just contains the computed version number.
|
|
||||||
|
|
||||||
# This file is released into the public domain. Generated by
|
|
||||||
# versioneer-0.18 (https://github.com/warner/python-versioneer)
|
|
||||||
|
|
||||||
"""Git implementation of _version.py."""
|
|
||||||
|
|
||||||
import errno
|
|
||||||
import os
|
|
||||||
import re
|
|
||||||
import subprocess
|
|
||||||
import sys
|
|
||||||
|
|
||||||
|
|
||||||
def get_keywords():
|
|
||||||
"""Get the keywords needed to look up the version information."""
|
|
||||||
# these strings will be replaced by git during git-archive.
|
|
||||||
# setup.py/versioneer.py will grep for the variable names, so they must
|
|
||||||
# each be defined on a line of their own. _version.py will just call
|
|
||||||
# get_keywords().
|
|
||||||
git_refnames = "$Format:%d$"
|
|
||||||
git_full = "$Format:%H$"
|
|
||||||
git_date = "$Format:%ci$"
|
|
||||||
keywords = {"refnames": git_refnames, "full": git_full, "date": git_date}
|
|
||||||
return keywords
|
|
||||||
|
|
||||||
|
|
||||||
class VersioneerConfig:
|
|
||||||
"""Container for Versioneer configuration parameters."""
|
|
||||||
|
|
||||||
|
|
||||||
def get_config():
|
|
||||||
"""Create, populate and return the VersioneerConfig() object."""
|
|
||||||
# these strings are filled in when 'setup.py versioneer' creates
|
|
||||||
# _version.py
|
|
||||||
cfg = VersioneerConfig()
|
|
||||||
cfg.VCS = "git"
|
|
||||||
cfg.style = "pep440"
|
|
||||||
cfg.tag_prefix = ""
|
|
||||||
cfg.parentdir_prefix = "None"
|
|
||||||
cfg.versionfile_source = "PyQtAds/_version.py"
|
|
||||||
cfg.verbose = False
|
|
||||||
return cfg
|
|
||||||
|
|
||||||
|
|
||||||
class NotThisMethod(Exception):
|
|
||||||
"""Exception raised if a method is not valid for the current scenario."""
|
|
||||||
|
|
||||||
|
|
||||||
LONG_VERSION_PY = {}
|
|
||||||
HANDLERS = {}
|
|
||||||
|
|
||||||
|
|
||||||
def register_vcs_handler(vcs, method): # decorator
|
|
||||||
"""Create decorator to mark a method as the handler of a VCS."""
|
|
||||||
def decorate(f):
|
|
||||||
"""Store f in HANDLERS[vcs][method]."""
|
|
||||||
if vcs not in HANDLERS:
|
|
||||||
HANDLERS[vcs] = {}
|
|
||||||
HANDLERS[vcs][method] = f
|
|
||||||
return f
|
|
||||||
return decorate
|
|
||||||
|
|
||||||
|
|
||||||
def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False,
|
|
||||||
env=None):
|
|
||||||
"""Call the given command(s)."""
|
|
||||||
assert isinstance(commands, list)
|
|
||||||
p = None
|
|
||||||
for c in commands:
|
|
||||||
try:
|
|
||||||
dispcmd = str([c] + args)
|
|
||||||
# remember shell=False, so use git.cmd on windows, not just git
|
|
||||||
p = subprocess.Popen([c] + args, cwd=cwd, env=env,
|
|
||||||
stdout=subprocess.PIPE,
|
|
||||||
stderr=(subprocess.PIPE if hide_stderr
|
|
||||||
else None))
|
|
||||||
break
|
|
||||||
except EnvironmentError:
|
|
||||||
e = sys.exc_info()[1]
|
|
||||||
if e.errno == errno.ENOENT:
|
|
||||||
continue
|
|
||||||
if verbose:
|
|
||||||
print("unable to run %s" % dispcmd)
|
|
||||||
print(e)
|
|
||||||
return None, None
|
|
||||||
else:
|
|
||||||
if verbose:
|
|
||||||
print("unable to find command, tried %s" % (commands,))
|
|
||||||
return None, None
|
|
||||||
stdout = p.communicate()[0].strip()
|
|
||||||
if sys.version_info[0] >= 3:
|
|
||||||
stdout = stdout.decode()
|
|
||||||
if p.returncode != 0:
|
|
||||||
if verbose:
|
|
||||||
print("unable to run %s (error)" % dispcmd)
|
|
||||||
print("stdout was %s" % stdout)
|
|
||||||
return None, p.returncode
|
|
||||||
return stdout, p.returncode
|
|
||||||
|
|
||||||
|
|
||||||
def versions_from_parentdir(parentdir_prefix, root, verbose):
|
|
||||||
"""Try to determine the version from the parent directory name.
|
|
||||||
|
|
||||||
Source tarballs conventionally unpack into a directory that includes both
|
|
||||||
the project name and a version string. We will also support searching up
|
|
||||||
two directory levels for an appropriately named parent directory
|
|
||||||
"""
|
|
||||||
rootdirs = []
|
|
||||||
|
|
||||||
for i in range(3):
|
|
||||||
dirname = os.path.basename(root)
|
|
||||||
if dirname.startswith(parentdir_prefix):
|
|
||||||
return {"version": dirname[len(parentdir_prefix):],
|
|
||||||
"full-revisionid": None,
|
|
||||||
"dirty": False, "error": None, "date": None}
|
|
||||||
else:
|
|
||||||
rootdirs.append(root)
|
|
||||||
root = os.path.dirname(root) # up a level
|
|
||||||
|
|
||||||
if verbose:
|
|
||||||
print("Tried directories %s but none started with prefix %s" %
|
|
||||||
(str(rootdirs), parentdir_prefix))
|
|
||||||
raise NotThisMethod("rootdir doesn't start with parentdir_prefix")
|
|
||||||
|
|
||||||
|
|
||||||
@register_vcs_handler("git", "get_keywords")
|
|
||||||
def git_get_keywords(versionfile_abs):
|
|
||||||
"""Extract version information from the given file."""
|
|
||||||
# the code embedded in _version.py can just fetch the value of these
|
|
||||||
# keywords. When used from setup.py, we don't want to import _version.py,
|
|
||||||
# so we do it with a regexp instead. This function is not used from
|
|
||||||
# _version.py.
|
|
||||||
keywords = {}
|
|
||||||
try:
|
|
||||||
f = open(versionfile_abs, "r")
|
|
||||||
for line in f.readlines():
|
|
||||||
if line.strip().startswith("git_refnames ="):
|
|
||||||
mo = re.search(r'=\s*"(.*)"', line)
|
|
||||||
if mo:
|
|
||||||
keywords["refnames"] = mo.group(1)
|
|
||||||
if line.strip().startswith("git_full ="):
|
|
||||||
mo = re.search(r'=\s*"(.*)"', line)
|
|
||||||
if mo:
|
|
||||||
keywords["full"] = mo.group(1)
|
|
||||||
if line.strip().startswith("git_date ="):
|
|
||||||
mo = re.search(r'=\s*"(.*)"', line)
|
|
||||||
if mo:
|
|
||||||
keywords["date"] = mo.group(1)
|
|
||||||
f.close()
|
|
||||||
except EnvironmentError:
|
|
||||||
pass
|
|
||||||
return keywords
|
|
||||||
|
|
||||||
|
|
||||||
@register_vcs_handler("git", "keywords")
|
|
||||||
def git_versions_from_keywords(keywords, tag_prefix, verbose):
|
|
||||||
"""Get version information from git keywords."""
|
|
||||||
if not keywords:
|
|
||||||
raise NotThisMethod("no keywords at all, weird")
|
|
||||||
date = keywords.get("date")
|
|
||||||
if date is not None:
|
|
||||||
# git-2.2.0 added "%cI", which expands to an ISO-8601 -compliant
|
|
||||||
# datestamp. However we prefer "%ci" (which expands to an "ISO-8601
|
|
||||||
# -like" string, which we must then edit to make compliant), because
|
|
||||||
# it's been around since git-1.5.3, and it's too difficult to
|
|
||||||
# discover which version we're using, or to work around using an
|
|
||||||
# older one.
|
|
||||||
date = date.strip().replace(" ", "T", 1).replace(" ", "", 1)
|
|
||||||
refnames = keywords["refnames"].strip()
|
|
||||||
if refnames.startswith("$Format"):
|
|
||||||
if verbose:
|
|
||||||
print("keywords are unexpanded, not using")
|
|
||||||
raise NotThisMethod("unexpanded keywords, not a git-archive tarball")
|
|
||||||
refs = set([r.strip() for r in refnames.strip("()").split(",")])
|
|
||||||
# starting in git-1.8.3, tags are listed as "tag: foo-1.0" instead of
|
|
||||||
# just "foo-1.0". If we see a "tag: " prefix, prefer those.
|
|
||||||
TAG = "tag: "
|
|
||||||
tags = set([r[len(TAG):] for r in refs if r.startswith(TAG)])
|
|
||||||
if not tags:
|
|
||||||
# Either we're using git < 1.8.3, or there really are no tags. We use
|
|
||||||
# a heuristic: assume all version tags have a digit. The old git %d
|
|
||||||
# expansion behaves like git log --decorate=short and strips out the
|
|
||||||
# refs/heads/ and refs/tags/ prefixes that would let us distinguish
|
|
||||||
# between branches and tags. By ignoring refnames without digits, we
|
|
||||||
# filter out many common branch names like "release" and
|
|
||||||
# "stabilization", as well as "HEAD" and "master".
|
|
||||||
tags = set([r for r in refs if re.search(r'\d', r)])
|
|
||||||
if verbose:
|
|
||||||
print("discarding '%s', no digits" % ",".join(refs - tags))
|
|
||||||
if verbose:
|
|
||||||
print("likely tags: %s" % ",".join(sorted(tags)))
|
|
||||||
for ref in sorted(tags):
|
|
||||||
# sorting will prefer e.g. "2.0" over "2.0rc1"
|
|
||||||
if ref.startswith(tag_prefix):
|
|
||||||
r = ref[len(tag_prefix):]
|
|
||||||
if verbose:
|
|
||||||
print("picking %s" % r)
|
|
||||||
return {"version": r,
|
|
||||||
"full-revisionid": keywords["full"].strip(),
|
|
||||||
"dirty": False, "error": None,
|
|
||||||
"date": date}
|
|
||||||
# no suitable tags, so version is "0+unknown", but full hex is still there
|
|
||||||
if verbose:
|
|
||||||
print("no suitable tags, using unknown + full revision id")
|
|
||||||
return {"version": "0+unknown",
|
|
||||||
"full-revisionid": keywords["full"].strip(),
|
|
||||||
"dirty": False, "error": "no suitable tags", "date": None}
|
|
||||||
|
|
||||||
|
|
||||||
@register_vcs_handler("git", "pieces_from_vcs")
|
|
||||||
def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command):
|
|
||||||
"""Get version from 'git describe' in the root of the source tree.
|
|
||||||
|
|
||||||
This only gets called if the git-archive 'subst' keywords were *not*
|
|
||||||
expanded, and _version.py hasn't already been rewritten with a short
|
|
||||||
version string, meaning we're inside a checked out source tree.
|
|
||||||
"""
|
|
||||||
GITS = ["git"]
|
|
||||||
if sys.platform == "win32":
|
|
||||||
GITS = ["git.cmd", "git.exe"]
|
|
||||||
|
|
||||||
out, rc = run_command(GITS, ["rev-parse", "--git-dir"], cwd=root,
|
|
||||||
hide_stderr=True)
|
|
||||||
if rc != 0:
|
|
||||||
if verbose:
|
|
||||||
print("Directory %s not under git control" % root)
|
|
||||||
raise NotThisMethod("'git rev-parse --git-dir' returned error")
|
|
||||||
|
|
||||||
# if there is a tag matching tag_prefix, this yields TAG-NUM-gHEX[-dirty]
|
|
||||||
# if there isn't one, this yields HEX[-dirty] (no NUM)
|
|
||||||
describe_out, rc = run_command(GITS, ["describe", "--tags", "--dirty",
|
|
||||||
"--always", "--long",
|
|
||||||
"--match", "%s*" % tag_prefix],
|
|
||||||
cwd=root)
|
|
||||||
# --long was added in git-1.5.5
|
|
||||||
if describe_out is None:
|
|
||||||
raise NotThisMethod("'git describe' failed")
|
|
||||||
describe_out = describe_out.strip()
|
|
||||||
full_out, rc = run_command(GITS, ["rev-parse", "HEAD"], cwd=root)
|
|
||||||
if full_out is None:
|
|
||||||
raise NotThisMethod("'git rev-parse' failed")
|
|
||||||
full_out = full_out.strip()
|
|
||||||
|
|
||||||
pieces = {}
|
|
||||||
pieces["long"] = full_out
|
|
||||||
pieces["short"] = full_out[:7] # maybe improved later
|
|
||||||
pieces["error"] = None
|
|
||||||
|
|
||||||
# parse describe_out. It will be like TAG-NUM-gHEX[-dirty] or HEX[-dirty]
|
|
||||||
# TAG might have hyphens.
|
|
||||||
git_describe = describe_out
|
|
||||||
|
|
||||||
# look for -dirty suffix
|
|
||||||
dirty = git_describe.endswith("-dirty")
|
|
||||||
pieces["dirty"] = dirty
|
|
||||||
if dirty:
|
|
||||||
git_describe = git_describe[:git_describe.rindex("-dirty")]
|
|
||||||
|
|
||||||
# now we have TAG-NUM-gHEX or HEX
|
|
||||||
|
|
||||||
if "-" in git_describe:
|
|
||||||
# TAG-NUM-gHEX
|
|
||||||
mo = re.search(r'^(.+)-(\d+)-g([0-9a-f]+)$', git_describe)
|
|
||||||
if not mo:
|
|
||||||
# unparseable. Maybe git-describe is misbehaving?
|
|
||||||
pieces["error"] = ("unable to parse git-describe output: '%s'"
|
|
||||||
% describe_out)
|
|
||||||
return pieces
|
|
||||||
|
|
||||||
# tag
|
|
||||||
full_tag = mo.group(1)
|
|
||||||
if not full_tag.startswith(tag_prefix):
|
|
||||||
if verbose:
|
|
||||||
fmt = "tag '%s' doesn't start with prefix '%s'"
|
|
||||||
print(fmt % (full_tag, tag_prefix))
|
|
||||||
pieces["error"] = ("tag '%s' doesn't start with prefix '%s'"
|
|
||||||
% (full_tag, tag_prefix))
|
|
||||||
return pieces
|
|
||||||
pieces["closest-tag"] = full_tag[len(tag_prefix):]
|
|
||||||
|
|
||||||
# distance: number of commits since tag
|
|
||||||
pieces["distance"] = int(mo.group(2))
|
|
||||||
|
|
||||||
# commit: short hex revision ID
|
|
||||||
pieces["short"] = mo.group(3)
|
|
||||||
|
|
||||||
else:
|
|
||||||
# HEX: no tags
|
|
||||||
pieces["closest-tag"] = None
|
|
||||||
count_out, rc = run_command(GITS, ["rev-list", "HEAD", "--count"],
|
|
||||||
cwd=root)
|
|
||||||
pieces["distance"] = int(count_out) # total number of commits
|
|
||||||
|
|
||||||
# commit date: see ISO-8601 comment in git_versions_from_keywords()
|
|
||||||
date = run_command(GITS, ["show", "-s", "--format=%ci", "HEAD"],
|
|
||||||
cwd=root)[0].strip()
|
|
||||||
pieces["date"] = date.strip().replace(" ", "T", 1).replace(" ", "", 1)
|
|
||||||
|
|
||||||
return pieces
|
|
||||||
|
|
||||||
|
|
||||||
def plus_or_dot(pieces):
|
|
||||||
"""Return a + if we don't already have one, else return a ."""
|
|
||||||
if "+" in pieces.get("closest-tag", ""):
|
|
||||||
return "."
|
|
||||||
return "+"
|
|
||||||
|
|
||||||
|
|
||||||
def render_pep440(pieces):
|
|
||||||
"""Build up version string, with post-release "local version identifier".
|
|
||||||
|
|
||||||
Our goal: TAG[+DISTANCE.gHEX[.dirty]] . Note that if you
|
|
||||||
get a tagged build and then dirty it, you'll get TAG+0.gHEX.dirty
|
|
||||||
|
|
||||||
Exceptions:
|
|
||||||
1: no tags. git_describe was just HEX. 0+untagged.DISTANCE.gHEX[.dirty]
|
|
||||||
"""
|
|
||||||
if pieces["closest-tag"]:
|
|
||||||
rendered = pieces["closest-tag"]
|
|
||||||
if pieces["distance"] or pieces["dirty"]:
|
|
||||||
rendered += plus_or_dot(pieces)
|
|
||||||
rendered += "%d.g%s" % (pieces["distance"], pieces["short"])
|
|
||||||
if pieces["dirty"]:
|
|
||||||
rendered += ".dirty"
|
|
||||||
else:
|
|
||||||
# exception #1
|
|
||||||
rendered = "0+untagged.%d.g%s" % (pieces["distance"],
|
|
||||||
pieces["short"])
|
|
||||||
if pieces["dirty"]:
|
|
||||||
rendered += ".dirty"
|
|
||||||
return rendered
|
|
||||||
|
|
||||||
|
|
||||||
def render_pep440_pre(pieces):
|
|
||||||
"""TAG[.post.devDISTANCE] -- No -dirty.
|
|
||||||
|
|
||||||
Exceptions:
|
|
||||||
1: no tags. 0.post.devDISTANCE
|
|
||||||
"""
|
|
||||||
if pieces["closest-tag"]:
|
|
||||||
rendered = pieces["closest-tag"]
|
|
||||||
if pieces["distance"]:
|
|
||||||
rendered += ".post.dev%d" % pieces["distance"]
|
|
||||||
else:
|
|
||||||
# exception #1
|
|
||||||
rendered = "0.post.dev%d" % pieces["distance"]
|
|
||||||
return rendered
|
|
||||||
|
|
||||||
|
|
||||||
def render_pep440_post(pieces):
|
|
||||||
"""TAG[.postDISTANCE[.dev0]+gHEX] .
|
|
||||||
|
|
||||||
The ".dev0" means dirty. Note that .dev0 sorts backwards
|
|
||||||
(a dirty tree will appear "older" than the corresponding clean one),
|
|
||||||
but you shouldn't be releasing software with -dirty anyways.
|
|
||||||
|
|
||||||
Exceptions:
|
|
||||||
1: no tags. 0.postDISTANCE[.dev0]
|
|
||||||
"""
|
|
||||||
if pieces["closest-tag"]:
|
|
||||||
rendered = pieces["closest-tag"]
|
|
||||||
if pieces["distance"] or pieces["dirty"]:
|
|
||||||
rendered += ".post%d" % pieces["distance"]
|
|
||||||
if pieces["dirty"]:
|
|
||||||
rendered += ".dev0"
|
|
||||||
rendered += plus_or_dot(pieces)
|
|
||||||
rendered += "g%s" % pieces["short"]
|
|
||||||
else:
|
|
||||||
# exception #1
|
|
||||||
rendered = "0.post%d" % pieces["distance"]
|
|
||||||
if pieces["dirty"]:
|
|
||||||
rendered += ".dev0"
|
|
||||||
rendered += "+g%s" % pieces["short"]
|
|
||||||
return rendered
|
|
||||||
|
|
||||||
|
|
||||||
def render_pep440_old(pieces):
|
|
||||||
"""TAG[.postDISTANCE[.dev0]] .
|
|
||||||
|
|
||||||
The ".dev0" means dirty.
|
|
||||||
|
|
||||||
Exceptions:
|
|
||||||
1: no tags. 0.postDISTANCE[.dev0]
|
|
||||||
"""
|
|
||||||
if pieces["closest-tag"]:
|
|
||||||
rendered = pieces["closest-tag"]
|
|
||||||
if pieces["distance"] or pieces["dirty"]:
|
|
||||||
rendered += ".post%d" % pieces["distance"]
|
|
||||||
if pieces["dirty"]:
|
|
||||||
rendered += ".dev0"
|
|
||||||
else:
|
|
||||||
# exception #1
|
|
||||||
rendered = "0.post%d" % pieces["distance"]
|
|
||||||
if pieces["dirty"]:
|
|
||||||
rendered += ".dev0"
|
|
||||||
return rendered
|
|
||||||
|
|
||||||
|
|
||||||
def render_git_describe(pieces):
|
|
||||||
"""TAG[-DISTANCE-gHEX][-dirty].
|
|
||||||
|
|
||||||
Like 'git describe --tags --dirty --always'.
|
|
||||||
|
|
||||||
Exceptions:
|
|
||||||
1: no tags. HEX[-dirty] (note: no 'g' prefix)
|
|
||||||
"""
|
|
||||||
if pieces["closest-tag"]:
|
|
||||||
rendered = pieces["closest-tag"]
|
|
||||||
if pieces["distance"]:
|
|
||||||
rendered += "-%d-g%s" % (pieces["distance"], pieces["short"])
|
|
||||||
else:
|
|
||||||
# exception #1
|
|
||||||
rendered = pieces["short"]
|
|
||||||
if pieces["dirty"]:
|
|
||||||
rendered += "-dirty"
|
|
||||||
return rendered
|
|
||||||
|
|
||||||
|
|
||||||
def render_git_describe_long(pieces):
|
|
||||||
"""TAG-DISTANCE-gHEX[-dirty].
|
|
||||||
|
|
||||||
Like 'git describe --tags --dirty --always -long'.
|
|
||||||
The distance/hash is unconditional.
|
|
||||||
|
|
||||||
Exceptions:
|
|
||||||
1: no tags. HEX[-dirty] (note: no 'g' prefix)
|
|
||||||
"""
|
|
||||||
if pieces["closest-tag"]:
|
|
||||||
rendered = pieces["closest-tag"]
|
|
||||||
rendered += "-%d-g%s" % (pieces["distance"], pieces["short"])
|
|
||||||
else:
|
|
||||||
# exception #1
|
|
||||||
rendered = pieces["short"]
|
|
||||||
if pieces["dirty"]:
|
|
||||||
rendered += "-dirty"
|
|
||||||
return rendered
|
|
||||||
|
|
||||||
|
|
||||||
def render(pieces, style):
|
|
||||||
"""Render the given version pieces into the requested style."""
|
|
||||||
if pieces["error"]:
|
|
||||||
return {"version": "unknown",
|
|
||||||
"full-revisionid": pieces.get("long"),
|
|
||||||
"dirty": None,
|
|
||||||
"error": pieces["error"],
|
|
||||||
"date": None}
|
|
||||||
|
|
||||||
if not style or style == "default":
|
|
||||||
style = "pep440" # the default
|
|
||||||
|
|
||||||
if style == "pep440":
|
|
||||||
rendered = render_pep440(pieces)
|
|
||||||
elif style == "pep440-pre":
|
|
||||||
rendered = render_pep440_pre(pieces)
|
|
||||||
elif style == "pep440-post":
|
|
||||||
rendered = render_pep440_post(pieces)
|
|
||||||
elif style == "pep440-old":
|
|
||||||
rendered = render_pep440_old(pieces)
|
|
||||||
elif style == "git-describe":
|
|
||||||
rendered = render_git_describe(pieces)
|
|
||||||
elif style == "git-describe-long":
|
|
||||||
rendered = render_git_describe_long(pieces)
|
|
||||||
else:
|
|
||||||
raise ValueError("unknown style '%s'" % style)
|
|
||||||
|
|
||||||
return {"version": rendered, "full-revisionid": pieces["long"],
|
|
||||||
"dirty": pieces["dirty"], "error": None,
|
|
||||||
"date": pieces.get("date")}
|
|
||||||
|
|
||||||
|
|
||||||
def get_versions():
|
|
||||||
"""Get version information or return default if unable to do so."""
|
|
||||||
# I am in _version.py, which lives at ROOT/VERSIONFILE_SOURCE. If we have
|
|
||||||
# __file__, we can work backwards from there to the root. Some
|
|
||||||
# py2exe/bbfreeze/non-CPython implementations don't do __file__, in which
|
|
||||||
# case we can only use expanded keywords.
|
|
||||||
|
|
||||||
cfg = get_config()
|
|
||||||
verbose = cfg.verbose
|
|
||||||
|
|
||||||
try:
|
|
||||||
return git_versions_from_keywords(get_keywords(), cfg.tag_prefix,
|
|
||||||
verbose)
|
|
||||||
except NotThisMethod:
|
|
||||||
pass
|
|
||||||
|
|
||||||
try:
|
|
||||||
root = os.path.realpath(__file__)
|
|
||||||
# versionfile_source is the relative path from the top of the source
|
|
||||||
# tree (where the .git directory might live) to this file. Invert
|
|
||||||
# this to find the root from __file__.
|
|
||||||
for i in cfg.versionfile_source.split('/'):
|
|
||||||
root = os.path.dirname(root)
|
|
||||||
except NameError:
|
|
||||||
return {"version": "0+unknown", "full-revisionid": None,
|
|
||||||
"dirty": None,
|
|
||||||
"error": "unable to find root of source tree",
|
|
||||||
"date": None}
|
|
||||||
|
|
||||||
try:
|
|
||||||
pieces = git_pieces_from_vcs(cfg.tag_prefix, root, verbose)
|
|
||||||
return render(pieces, cfg.style)
|
|
||||||
except NotThisMethod:
|
|
||||||
pass
|
|
||||||
|
|
||||||
try:
|
|
||||||
if cfg.parentdir_prefix:
|
|
||||||
return versions_from_parentdir(cfg.parentdir_prefix, root, verbose)
|
|
||||||
except NotThisMethod:
|
|
||||||
pass
|
|
||||||
|
|
||||||
return {"version": "0+unknown", "full-revisionid": None,
|
|
||||||
"dirty": None,
|
|
||||||
"error": "unable to compute version", "date": None}
|
|
||||||
622
README.md
@@ -1,53 +1,218 @@
|
|||||||
# Advanced Docking System for Qt
|

|
||||||
|
|
||||||
[](https://travis-ci.org/githubuser0xFFFF/Qt-Advanced-Docking-System)
|

|
||||||
[](https://ci.appveyor.com/project/githubuser0xFFFF/qt-advanced-docking-system/branch/master)
|
|
||||||
|
------------------
|
||||||
|
|
||||||
|
[](https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System/releases/latest)
|
||||||
[](gnu-lgpl-v2.1.md)
|
[](gnu-lgpl-v2.1.md)
|
||||||
|
[](https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System/actions?query=workflow%3Alinux-builds)
|
||||||
|
[](https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System/actions/workflows/windows-cmake.yml)
|
||||||
|
[](https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System/graphs/contributors)
|
||||||
|
|
||||||
Qt Advanced Docking System lets you create customizable layouts using a full
|
Qt Advanced Docking System lets you create customizable layouts using a full
|
||||||
featured window docking system similar to what is found in many popular
|
featured window docking system similar to what is found in many popular
|
||||||
integrated development environments (IDEs) such as Visual Studio.
|
integrated development environments (IDEs) such as Visual Studio.
|
||||||
|
|
||||||
|
- [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)
|
||||||
|
- Original Repository: [https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System](https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System)
|
||||||
|
|
||||||
[](https://www.youtube.com/watch?v=7pdNfafg3Qc)
|
[](https://www.youtube.com/watch?v=7pdNfafg3Qc)
|
||||||
|
|
||||||
Everything is implemented with standard Qt functionality without any
|
## New and Noteworthy
|
||||||
platform specific code. Basic usage of QWidgets and QLayouts and using basic
|
|
||||||
styles as much as possible.
|
|
||||||
|
|
||||||
This work is based on and inspired by the
|
### Release 4.5
|
||||||
[Advanced Docking System for Qt](https://github.com/mfreiholz/Qt-Advanced-Docking-System)
|
|
||||||
from Manuel Freiholz. I did an almost complete rewrite of his code to improve
|
#### Tabs at Bottom
|
||||||
code quality, readibility and to fix all issues from the issue tracker
|
|
||||||
of his docking system project.
|
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.
|
||||||
|
|
||||||
|
If the flag is set, tabs will be shown at the bottom instead of in the title bar.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### Release 4.1
|
||||||
|
|
||||||
|
Release [4.1](https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System/releases/latest) significantly improves the Auto-Hide functionality and also brings improvements
|
||||||
|
for Drag and Drop of dock widgets into dock area tabs. These are the highlights of the new version:
|
||||||
|
|
||||||
|
#### Drag & Drop to Auto-Hide
|
||||||
|
|
||||||
|
Now you can easily drag any dock widget or any floating widget to the
|
||||||
|
borders of a window to pin it as a auto-hide tab in one of the 4 sidebars.
|
||||||
|
If you drag a dock widget close the one of the four window borders, special
|
||||||
|
drop overlays will be shown to indicate the drop area for auto-hide widgets:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Of course, this also works with dock areas:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
If you drag a dock widget or dock area into a sidebar, then you even have
|
||||||
|
control over where tabs are inserted. Simply drag your mouse over a specific
|
||||||
|
auto-hide tab, and your dragged dock widget will be inserted before this tab.
|
||||||
|
Drag to the sidebar area behind the last tab, and the dragged widget will be
|
||||||
|
appended as last tab. In the following screen capture, the **Image Viewer 1** will
|
||||||
|
be inserted before the **Table 0** Auto-Hide tab and the **Image Viewer 2**
|
||||||
|
is appende behind the last tab:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
#### Auto-Hide Tab Insertion Order
|
||||||
|
|
||||||
|
It is also possible to drag Auto-Hide tabs to a new auto-hide position.
|
||||||
|
That means, you can drag them to a different border or sidebar:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
#### Auto-Hide Tab Sorting
|
||||||
|
|
||||||
|
You can drag Auto-Hide tabs to a new position in the current sidebar
|
||||||
|
to sort them:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
#### Auto-Hide Drag to Float / Dock
|
||||||
|
|
||||||
|
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
|
## Features
|
||||||
|
|
||||||
### Overview
|
### Overview
|
||||||
|
|
||||||
- [Advanced Docking System for Qt](#advanced-docking-system-for-qt)
|
- [New and Noteworthy](#new-and-noteworthy)
|
||||||
- [Features](#features)
|
- [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)
|
- [Overview](#overview)
|
||||||
- [Docking everywhere - no central widget](#docking-everywhere---no-central-widget)
|
- [Docking everywhere - no central widget](#docking-everywhere---no-central-widget)
|
||||||
- [Docking inside floating windows](#docking-inside-floating-windows)
|
- [Docking inside floating windows](#docking-inside-floating-windows)
|
||||||
- [Grouped dragging](#grouped-dragging)
|
- [Grouped dragging](#grouped-dragging)
|
||||||
- [Perspectives for fast switching of the complete main window layout](#perspectives-for-fast-switching-of-the-complete-main-window-layout)
|
- [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)
|
- [Opaque and non-opaque splitter resizing](#opaque-and-non-opaque-splitter-resizing)
|
||||||
- [Opaque and non-opaque undocking](#opaque-and-non-opaque-undocking)
|
- [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)
|
- [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)
|
- [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)
|
- [Supports deletion of dynamically created dock widgets](#supports-deletion-of-dynamically-created-dock-widgets)
|
||||||
- [Tested Compatible Environments](#tested-compatible-environments)
|
- [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)
|
- [Windows](#windows)
|
||||||
- [macOS](#macos)
|
- [macOS](#macos)
|
||||||
- [Linux](#linux)
|
- [Linux](#linux)
|
||||||
- [Build](#build)
|
- [Build](#build)
|
||||||
- [Getting started / Example](#getting-started--example)
|
- [Qt5 on Ubuntu 18.04 or 20.04](#qt5-on-ubuntu-1804-or-2004)
|
||||||
- [Developers](#developers)
|
- [Qt5 on Ubuntu 22.04](#qt5-on-ubuntu-2204)
|
||||||
- [License information](#license-information)
|
- [Qt6 on Ubuntu 22.04](#qt6-on-ubuntu-2204)
|
||||||
- [Alternative Docking System Implementations](#alternative-docking-system-implementations)
|
- [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)
|
- [KDDockWidgets](#kddockwidgets)
|
||||||
- [QtitanDocking](#qtitandocking)
|
- [QtitanDocking](#qtitandocking)
|
||||||
- [Donation](#donation)
|
- [DockingPanes](#dockingpanes)
|
||||||
|
|
||||||
### Docking everywhere - no central widget
|
### Docking everywhere - no central widget
|
||||||
|
|
||||||
@@ -55,8 +220,8 @@ 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
|
border of the main window or you can dock into each dock area - so you are
|
||||||
free to dock almost everywhere.
|
free to dock almost everywhere.
|
||||||
|
|
||||||
\
|

|
||||||
\
|
|
||||||

|

|
||||||
|
|
||||||
### Docking inside floating windows
|
### Docking inside floating windows
|
||||||
@@ -64,8 +229,8 @@ free to dock almost everywhere.
|
|||||||
There is no difference between the main window and a floating window. Docking
|
There is no difference between the main window and a floating window. Docking
|
||||||
into floating windows is supported.
|
into floating windows is supported.
|
||||||
|
|
||||||
\
|

|
||||||
\
|
|
||||||

|

|
||||||
|
|
||||||
### Grouped dragging
|
### Grouped dragging
|
||||||
@@ -74,8 +239,8 @@ 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
|
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.
|
a floating widget or from one dock area to another one.
|
||||||
|
|
||||||
\
|

|
||||||
\
|
|
||||||

|

|
||||||
|
|
||||||
### Perspectives for fast switching of the complete main window layout
|
### Perspectives for fast switching of the complete main window layout
|
||||||
@@ -86,8 +251,8 @@ perspective to make your own custom perspective. Later you can simply
|
|||||||
select a perspective from the perspective list to quickly switch the complete
|
select a perspective from the perspective list to quickly switch the complete
|
||||||
main window layout.
|
main window layout.
|
||||||
|
|
||||||
\
|

|
||||||
\
|
|
||||||

|

|
||||||
|
|
||||||
### Opaque and non-opaque splitter resizing
|
### Opaque and non-opaque splitter resizing
|
||||||
@@ -100,17 +265,16 @@ If this flag is cleared, the widget resizing is deferred until the mouse button
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
### Opaque and non-opaque undocking
|
### Cancelable docking process
|
||||||
|
|
||||||
By default, opaque undocking is active. That means, as soon as you drag a dock widget or a dock area with a number of dock widgets it will be undocked and moved into a floating widget and then the floating widget will be dragged around. That means undocking will take place immediatelly. You can compare this with opaque splitter resizing. If the flag `OpaqueUndocking` is cleared, then non-opaque undocking is active. In this mode, undocking is more like a standard drag and drop operation. That means, the dragged dock widget or dock area is not undocked immediatelly. 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.
|
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:
|
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
|
- `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
|
- `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
|
- `DragPreviewHasWindowFrame`: this flag configures if the drag preview is frameless like a QRubberBand or looks like a real window
|
||||||
|
|
||||||
The best way to test non-opaque undocking is to set the standard flags: `CDockManager::setConfigFlags(CDockManager::DefaultNonOpaqueConfig)`.
|
|
||||||
|
|
||||||
### Tab-menu for easy handling of many tabbed dock widgets
|
### 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.
|
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.
|
||||||
@@ -129,38 +293,160 @@ You can detach dock widgets and also dock areas in the following ways:
|
|||||||
|
|
||||||
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.
|
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
|
## Tested Compatible Environments
|
||||||
|
|
||||||
|
### Supported Qt Versions
|
||||||
|
|
||||||
|
The library supports **Qt5** and **Qt6**.
|
||||||
|
|
||||||
### Windows
|
### Windows
|
||||||
|
|
||||||
Windows 10 [](https://ci.appveyor.com/project/githubuser0xFFFF/qt-advanced-docking-system/branch/master)
|
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.
|
The library was developed on and for Windows. It is used in a commercial Windows application and is therefore constantly tested.
|
||||||
|
|
||||||
### macOS
|
### macOS
|
||||||
|
|
||||||
macOS [](https://travis-ci.org/githubuser0xFFFF/Qt-Advanced-Docking-System)
|
|
||||||
|
|
||||||
The application can be compiled for macOS. A user reported, that the library works on macOS. If have not tested it.
|
The application can be compiled for macOS. A user reported, that the library works on macOS. If have not tested it.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
### Linux
|
### Linux
|
||||||
|
|
||||||
Ubuntu [](https://travis-ci.org/githubuser0xFFFF/Qt-Advanced-Docking-System)
|
|
||||||
[](https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System/actions?query=workflow%3Alinux-builds)
|
[](https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System/actions?query=workflow%3Alinux-builds)
|
||||||
|
|
||||||
The application can be compiled for Linux and has been developed and tested with **Kubuntu 18.04** and **Kubuntu 19.10**.
|
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:
|
||||||

|

|
||||||
|
|
||||||
and with **Ubuntu 19.10**
|
Screenshot Ubuntu:
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
## Build
|
## Build
|
||||||
|
|
||||||
Open the `ads.pro` with QtCreator and start the build, that's it.
|
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.
|
You can run the demo project and test it yourself.
|
||||||
|
|
||||||
## Getting started / Example
|
## Getting started / Example
|
||||||
@@ -207,9 +493,10 @@ MainWindow::MainWindow(QWidget *parent) :
|
|||||||
{
|
{
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
|
|
||||||
// Create the dock manager. Because the parent parameter is a QMainWindow
|
// Create the dock manager after the ui is setup. Because the
|
||||||
// the dock manager registers itself as the central widget.
|
// parent parameter is a QMainWindow the dock manager registers
|
||||||
m_DockManager = new ads::CDockManager(this);
|
// 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
|
// Create example content label - this can be any application specific
|
||||||
// widget
|
// widget
|
||||||
@@ -220,7 +507,7 @@ MainWindow::MainWindow(QWidget *parent) :
|
|||||||
|
|
||||||
// Create a dock widget with the title Label 1 and set the created label
|
// Create a dock widget with the title Label 1 and set the created label
|
||||||
// as the dock widget content
|
// as the dock widget content
|
||||||
ads::CDockWidget* DockWidget = new ads::CDockWidget("Label 1");
|
ads::CDockWidget* DockWidget = DockManager->createDockWidget("Label 1");
|
||||||
DockWidget->setWidget(l);
|
DockWidget->setWidget(l);
|
||||||
|
|
||||||
// Add the toggleViewAction of the dock widget to the menu to give
|
// Add the toggleViewAction of the dock widget to the menu to give
|
||||||
@@ -228,7 +515,7 @@ MainWindow::MainWindow(QWidget *parent) :
|
|||||||
ui->menuView->addAction(DockWidget->toggleViewAction());
|
ui->menuView->addAction(DockWidget->toggleViewAction());
|
||||||
|
|
||||||
// Add the dock widget to the top dock widget area
|
// Add the dock widget to the top dock widget area
|
||||||
m_DockManager->addDockWidget(ads::TopDockWidgetArea, DockWidget);
|
DockManager->addDockWidget(ads::TopDockWidgetArea, DockWidget);
|
||||||
}
|
}
|
||||||
|
|
||||||
MainWindow::~MainWindow()
|
MainWindow::~MainWindow()
|
||||||
@@ -237,16 +524,234 @@ MainWindow::~MainWindow()
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
## Developers
|
|
||||||
|
|
||||||
- Uwe Kindler, Project Maintainer
|
|
||||||
- Manuel Freiholz
|
|
||||||
|
|
||||||
## License information
|
## License information
|
||||||
|
|
||||||
[](gnu-lgpl-v2.1.md)
|
[](gnu-lgpl-v2.1.md)
|
||||||
This project uses the [LGPLv2.1 license](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
|
## Alternative Docking System Implementations
|
||||||
|
|
||||||
@@ -259,17 +764,20 @@ This is an advanced docking framework for Qt from [KDAB](https://www.kdab.com/).
|
|||||||
- [Blog post about KDDockWidgets](https://www.kdab.com/kddockwidgets/)
|
- [Blog post about KDDockWidgets](https://www.kdab.com/kddockwidgets/)
|
||||||
- [GitHub project](https://github.com/KDAB/KDDockWidgets)
|
- [GitHub project](https://github.com/KDAB/KDDockWidgets)
|
||||||
|
|
||||||
|
**License:** dual-licensed, available under both commercial and GPL license.
|
||||||
|
|
||||||
### QtitanDocking
|
### 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.
|
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)
|
- [Product page](https://www.devmachines.com/qtitandocking-overview.html)
|
||||||
|
|
||||||
## Donation
|
**License:** Commercial license
|
||||||
|
|
||||||
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:.
|
### DockingPanes
|
||||||
|
|
||||||
<a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=85R64TMMSY9T6">
|
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.
|
||||||
<img src="doc/donate.png" alt="Donate with PayPal" width="160"/>
|
|
||||||
</a>
|
- [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
|
||||||
|
}
|
||||||
4
ads.pro
@@ -3,7 +3,7 @@ TEMPLATE = subdirs
|
|||||||
SUBDIRS = \
|
SUBDIRS = \
|
||||||
src \
|
src \
|
||||||
demo \
|
demo \
|
||||||
example
|
examples
|
||||||
|
|
||||||
demo.depends = src
|
demo.depends = src
|
||||||
example.depends = src
|
examples.depends = src
|
||||||
|
|||||||
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()
|
||||||
@@ -1,54 +1,47 @@
|
|||||||
cmake_minimum_required(VERSION 3.3)
|
cmake_minimum_required(VERSION 3.16)
|
||||||
set (CMAKE_CXX_STANDARD 14)
|
project(ads_demo VERSION ${VERSION_SHORT})
|
||||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
||||||
set(CMAKE_CXX_EXTENSIONS OFF)
|
find_package(QT NAMES Qt6 Qt5 COMPONENTS Core REQUIRED)
|
||||||
set(CMAKE_AUTOMOC ON)
|
find_package(Qt${QT_VERSION_MAJOR} 5.5 COMPONENTS Core Gui Widgets Quick QuickWidgets REQUIRED)
|
||||||
set(CMAKE_AUTOUIC ON)
|
if(WIN32 AND QT_VERSION_MAJOR LESS 6)
|
||||||
set(CMAKE_AUTORCC ON)
|
find_package(Qt${QT_VERSION_MAJOR} COMPONENTS AxContainer REQUIRED)
|
||||||
project(ads_demo VERSION "1.0")
|
|
||||||
set(REQUIRED_QT_VERSION 5.5.0)
|
|
||||||
find_package(Qt5Core ${REQUIRED_QT_VERSION} REQUIRED)
|
|
||||||
find_package(Qt5Gui ${REQUIRED_QT_VERSION} REQUIRED)
|
|
||||||
find_package(Qt5Widgets ${REQUIRED_QT_VERSION} REQUIRED)
|
|
||||||
set(ads_demo_LIBS ${ads_demo_LIBS} ${Qt5Core_LIBRARIES})
|
|
||||||
set(ads_demo_INCLUDE ${ads_demo_INCLUDE} ${Qt5Core_INCLUDE_DIRS})
|
|
||||||
set(ads_demo_COMPILE_DEFINE ${ads_demo_COMPILE_DEFINE} ${Qt5Core_COMPILE_DEFINITIONS} )
|
|
||||||
set(ads_demo_LIBS ${ads_demo_LIBS} ${Qt5Gui_LIBRARIES})
|
|
||||||
set(ads_demo_INCLUDE ${ads_demo_INCLUDE} ${Qt5Gui_INCLUDE_DIRS})
|
|
||||||
set(ads_demo_COMPILE_DEFINE ${ads_demo_COMPILE_DEFINE} ${Qt5Gui_COMPILE_DEFINITIONS})
|
|
||||||
set(ads_demo_LIBS ${ads_demo_LIBS} ${Qt5Widgets_LIBRARIES})
|
|
||||||
set(ads_demo_INCLUDE ${ads_demo_INCLUDE} ${Qt5Widgets_INCLUDE_DIRS})
|
|
||||||
set(ads_demo_COMPILE_DEFINE ${ads_demo_COMPILE_DEFINE} ${Qt5Widgets_COMPILE_DEFINITIONS})
|
|
||||||
if(WIN32)
|
|
||||||
find_package(Qt5AxContainer ${REQUIRED_QT_VERSION} REQUIRED)
|
|
||||||
set(ads_demo_LIBS ${ads_demo_LIBS} ${Qt5AxContainer_LIBRARIES})
|
|
||||||
set(ads_demo_INCLUDE ${ads_demo_INCLUDE} ${Qt5AxContainer_INCLUDE_DIRS})
|
|
||||||
set(ads_demo_COMPILE_DEFINE ${ads_demo_COMPILE_DEFINE} ${Qt5AxContainer_COMPILE_DEFINITIONS})
|
|
||||||
endif()
|
endif()
|
||||||
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
||||||
set(ads_demo_SRCS
|
set(ads_demo_SRCS
|
||||||
main.cpp
|
main.cpp
|
||||||
MainWindow.cpp
|
MainWindow.cpp
|
||||||
mainwindow.ui
|
mainwindow.ui
|
||||||
|
StatusDialog.cpp
|
||||||
|
StatusDialog.ui
|
||||||
|
ImageViewer.cpp
|
||||||
|
RenderWidget.cpp
|
||||||
demo.qrc
|
demo.qrc
|
||||||
)
|
)
|
||||||
add_executable(AdvancedDockingSystemDemo WIN32 ${ads_demo_SRCS})
|
add_executable(AdvancedDockingSystemDemo WIN32 ${ads_demo_SRCS})
|
||||||
if(BUILD_STATIC)
|
target_include_directories(AdvancedDockingSystemDemo PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../src")
|
||||||
set(ads_demo_DEFINE ${ads_demo_DEFINE} ADS_STATIC)
|
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()
|
endif()
|
||||||
add_dependencies(AdvancedDockingSystemDemo qtadvanceddocking)
|
target_link_libraries(AdvancedDockingSystemDemo PRIVATE qtadvanceddocking-qt${QT_VERSION_MAJOR})
|
||||||
target_include_directories(AdvancedDockingSystemDemo PUBLIC
|
|
||||||
$<BUILD_INTERFACE:${ads_demo_INCLUDE}>
|
|
||||||
$<INSTALL_INTERFACE:include>
|
|
||||||
)
|
|
||||||
target_include_directories(AdvancedDockingSystemDemo PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/../src" ${ads_demo_INCLUDE})
|
|
||||||
target_link_libraries(AdvancedDockingSystemDemo PRIVATE qtadvanceddocking ${ads_demo_LIBS})
|
|
||||||
target_compile_definitions(AdvancedDockingSystemDemo PRIVATE ${ads_demo_DEFINE})
|
|
||||||
set_target_properties(AdvancedDockingSystemDemo PROPERTIES
|
set_target_properties(AdvancedDockingSystemDemo PROPERTIES
|
||||||
VERSION "1.0"
|
AUTOMOC ON
|
||||||
SOVERSION 1
|
AUTORCC ON
|
||||||
|
AUTOUIC ON
|
||||||
|
CXX_STANDARD 14
|
||||||
|
CXX_STANDARD_REQUIRED ON
|
||||||
|
CXX_EXTENSIONS OFF
|
||||||
|
VERSION ${VERSION_SHORT}
|
||||||
EXPORT_NAME "Qt Advanced Docking System Demo"
|
EXPORT_NAME "Qt Advanced Docking System Demo"
|
||||||
ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${ads_PlatformDir}/lib"
|
ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${ads_PlatformDir}/lib"
|
||||||
LIBRARY_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"
|
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
|
||||||
@@ -58,51 +58,46 @@
|
|||||||
#include <QMessageBox>
|
#include <QMessageBox>
|
||||||
#include <QMenu>
|
#include <QMenu>
|
||||||
#include <QToolButton>
|
#include <QToolButton>
|
||||||
|
#include <QToolBar>
|
||||||
|
#include <QPointer>
|
||||||
#ifdef Q_OS_WIN
|
|
||||||
#include <QAxWidget>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <QMap>
|
#include <QMap>
|
||||||
#include <QElapsedTimer>
|
#include <QElapsedTimer>
|
||||||
|
#include <QQuickWidget>
|
||||||
|
|
||||||
|
|
||||||
|
#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)
|
||||||
|
#include <QRandomGenerator>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef Q_OS_WIN
|
||||||
|
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
|
||||||
|
#include <QAxWidget>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "DockManager.h"
|
|
||||||
#include "DockWidget.h"
|
|
||||||
#include "DockAreaWidget.h"
|
|
||||||
#include "DockAreaTitleBar.h"
|
|
||||||
#include "DockAreaTabBar.h"
|
#include "DockAreaTabBar.h"
|
||||||
#include "FloatingDockContainer.h"
|
#include "DockAreaTitleBar.h"
|
||||||
|
#include "DockAreaWidget.h"
|
||||||
#include "DockComponentsFactory.h"
|
#include "DockComponentsFactory.h"
|
||||||
|
#include "DockManager.h"
|
||||||
|
#include "DockSplitter.h"
|
||||||
|
#include "DockWidget.h"
|
||||||
|
#include "FloatingDockContainer.h"
|
||||||
|
#include "ImageViewer.h"
|
||||||
|
#include "MyDockAreaTitleBar.h"
|
||||||
|
#include "StatusDialog.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a random number from 0 to highest - 1
|
||||||
//============================================================================
|
*/
|
||||||
static ads::CDockWidget* createLongTextLabelDockWidget(QMenu* ViewMenu)
|
int randomNumberBounded(int highest)
|
||||||
{
|
{
|
||||||
static int LabelCount = 0;
|
#if QT_VERSION >= QT_VERSION_CHECK(5, 10, 0)
|
||||||
QLabel* l = new QLabel();
|
return QRandomGenerator::global()->bounded(highest);
|
||||||
l->setWordWrap(true);
|
#else
|
||||||
l->setAlignment(Qt::AlignTop | Qt::AlignLeft);
|
qsrand(QTime::currentTime().msec());
|
||||||
l->setText(QString("Label %1 %2 - Lorem ipsum dolor sit amet, consectetuer adipiscing elit. "
|
return qrand() % highest;
|
||||||
"Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque "
|
#endif
|
||||||
"penatibus et magnis dis parturient montes, nascetur ridiculus mus. "
|
|
||||||
"Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. "
|
|
||||||
"Nulla consequat massa quis enim. Donec pede justo, fringilla vel, "
|
|
||||||
"aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, "
|
|
||||||
"imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede "
|
|
||||||
"mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum "
|
|
||||||
"semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, "
|
|
||||||
"porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, "
|
|
||||||
"dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla "
|
|
||||||
"ut metus varius laoreet.")
|
|
||||||
.arg(LabelCount)
|
|
||||||
.arg(QTime::currentTime().toString("hh:mm:ss:zzz")));
|
|
||||||
|
|
||||||
ads::CDockWidget* DockWidget = new ads::CDockWidget(QString("Label %1").arg(LabelCount++));
|
|
||||||
DockWidget->setWidget(l);
|
|
||||||
ViewMenu->addAction(DockWidget->toggleViewAction());
|
|
||||||
return DockWidget;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -137,7 +132,7 @@ static void appendFeaturStringToWindowTitle(ads::CDockWidget* DockWidget)
|
|||||||
static QIcon svgIcon(const QString& File)
|
static QIcon svgIcon(const QString& File)
|
||||||
{
|
{
|
||||||
// This is a workaround, because in item views SVG icons are not
|
// This is a workaround, because in item views SVG icons are not
|
||||||
// properly scaled an look blurry or pixelate
|
// properly scaled and look blurry or pixelate
|
||||||
QIcon SvgIcon(File);
|
QIcon SvgIcon(File);
|
||||||
SvgIcon.addPixmap(SvgIcon.pixmap(92));
|
SvgIcon.addPixmap(SvgIcon.pixmap(92));
|
||||||
return SvgIcon;
|
return SvgIcon;
|
||||||
@@ -151,7 +146,7 @@ public:
|
|||||||
using Super = ads::CDockComponentsFactory;
|
using Super = ads::CDockComponentsFactory;
|
||||||
ads::CDockAreaTitleBar* createDockAreaTitleBar(ads::CDockAreaWidget* DockArea) const override
|
ads::CDockAreaTitleBar* createDockAreaTitleBar(ads::CDockAreaWidget* DockArea) const override
|
||||||
{
|
{
|
||||||
auto TitleBar = new ads::CDockAreaTitleBar(DockArea);
|
auto TitleBar = new MyDockAreaTitleBar(DockArea);
|
||||||
auto CustomButton = new QToolButton(DockArea);
|
auto CustomButton = new QToolButton(DockArea);
|
||||||
CustomButton->setToolTip(QObject::tr("Help"));
|
CustomButton->setToolTip(QObject::tr("Help"));
|
||||||
CustomButton->setIcon(svgIcon(":/adsdemo/images/help_outline.svg"));
|
CustomButton->setIcon(svgIcon(":/adsdemo/images/help_outline.svg"));
|
||||||
@@ -163,105 +158,23 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
//============================================================================
|
|
||||||
static ads::CDockWidget* createCalendarDockWidget(QMenu* ViewMenu)
|
//===========================================================================
|
||||||
|
/**
|
||||||
|
* Custom QTableWidget with a minimum size hint to test CDockWidget
|
||||||
|
* setMinimumSizeHintMode() function of CDockWidget
|
||||||
|
*/
|
||||||
|
class CMinSizeTableWidget : public QTableWidget
|
||||||
{
|
{
|
||||||
static int CalendarCount = 0;
|
public:
|
||||||
QCalendarWidget* w = new QCalendarWidget();
|
using QTableWidget::QTableWidget;
|
||||||
ads::CDockWidget* DockWidget = new ads::CDockWidget(QString("Calendar %1").arg(CalendarCount++));
|
virtual QSize minimumSizeHint() const override
|
||||||
DockWidget->setWidget(w);
|
|
||||||
DockWidget->setToggleViewActionMode(ads::CDockWidget::ActionModeShow);
|
|
||||||
DockWidget->setIcon(svgIcon(":/adsdemo/images/date_range.svg"));
|
|
||||||
ViewMenu->addAction(DockWidget->toggleViewAction());
|
|
||||||
return DockWidget;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//============================================================================
|
|
||||||
static ads::CDockWidget* createFileSystemTreeDockWidget(QMenu* ViewMenu)
|
|
||||||
{
|
|
||||||
static int FileSystemCount = 0;
|
|
||||||
QTreeView* w = new QTreeView();
|
|
||||||
w->setFrameShape(QFrame::NoFrame);
|
|
||||||
QFileSystemModel* m = new QFileSystemModel(w);
|
|
||||||
m->setRootPath(QDir::currentPath());
|
|
||||||
w->setModel(m);
|
|
||||||
ads::CDockWidget* DockWidget = new ads::CDockWidget(QString("Filesystem %1")
|
|
||||||
.arg(FileSystemCount++));
|
|
||||||
DockWidget->setWidget(w);
|
|
||||||
ViewMenu->addAction(DockWidget->toggleViewAction());
|
|
||||||
return DockWidget;
|
|
||||||
}
|
|
||||||
|
|
||||||
//============================================================================
|
|
||||||
static ads::CDockWidget* createEditorWidget(QMenu* ViewMenu)
|
|
||||||
{
|
|
||||||
static int EditorCount = 0;
|
|
||||||
QPlainTextEdit* w = new QPlainTextEdit();
|
|
||||||
w->setPlaceholderText("This is an editor. If you close the editor, it will be "
|
|
||||||
"deleted. Enter your text here.");
|
|
||||||
w->setStyleSheet("border: none");
|
|
||||||
ads::CDockWidget* DockWidget = new ads::CDockWidget(QString("Editor %1").arg(EditorCount++));
|
|
||||||
DockWidget->setWidget(w);
|
|
||||||
DockWidget->setIcon(svgIcon(":/adsdemo/images/edit.svg"));
|
|
||||||
DockWidget->setFeature(ads::CDockWidget::CustomCloseHandling, true);
|
|
||||||
ViewMenu->addAction(DockWidget->toggleViewAction());
|
|
||||||
|
|
||||||
QMenu* OptionsMenu = new QMenu(DockWidget);
|
|
||||||
OptionsMenu->setTitle(QObject::tr("Options"));
|
|
||||||
OptionsMenu->setToolTip(OptionsMenu->title());
|
|
||||||
OptionsMenu->setIcon(svgIcon(":/adsdemo/images/custom-menu-button.svg"));
|
|
||||||
auto MenuAction = OptionsMenu->menuAction();
|
|
||||||
// The object name of the action will be set for the QToolButton that
|
|
||||||
// is created in the dock area title bar. You can use this name for CSS
|
|
||||||
// styling
|
|
||||||
MenuAction->setObjectName("optionsMenu");
|
|
||||||
DockWidget->setTitleBarActions({OptionsMenu->menuAction()});
|
|
||||||
auto a = OptionsMenu->addAction(QObject::tr("Clear Editor"));
|
|
||||||
w->connect(a, SIGNAL(triggered()), SLOT(clear()));
|
|
||||||
|
|
||||||
return DockWidget;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//============================================================================
|
|
||||||
static ads::CDockWidget* createTableWidget(QMenu* ViewMenu)
|
|
||||||
{
|
|
||||||
static int TableCount = 0;
|
|
||||||
QTableWidget* w = new QTableWidget();
|
|
||||||
ads::CDockWidget* DockWidget = new ads::CDockWidget(QString("Table %1").arg(TableCount++));
|
|
||||||
static int colCount = 5;
|
|
||||||
static int rowCount = 30;
|
|
||||||
w->setColumnCount(colCount);
|
|
||||||
w->setRowCount(rowCount);
|
|
||||||
for (int col = 0; col < colCount; ++col)
|
|
||||||
{
|
{
|
||||||
w->setHorizontalHeaderItem(col, new QTableWidgetItem(QString("Col %1").arg(col+1)));
|
return QSize(300, 100);
|
||||||
for (int row = 0; row < rowCount; ++row)
|
|
||||||
{
|
|
||||||
w->setItem(row, col, new QTableWidgetItem(QString("T %1-%2").arg(row + 1).arg(col+1)));
|
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
DockWidget->setWidget(w);
|
|
||||||
DockWidget->setIcon(svgIcon(":/adsdemo/images/grid_on.svg"));
|
|
||||||
ViewMenu->addAction(DockWidget->toggleViewAction());
|
|
||||||
return DockWidget;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef Q_OS_WIN
|
|
||||||
//============================================================================
|
|
||||||
static ads::CDockWidget* createActiveXWidget(QMenu* ViewMenu, QWidget* parent = nullptr)
|
|
||||||
{
|
|
||||||
static int ActiveXCount = 0;
|
|
||||||
QAxWidget* w = new QAxWidget("{6bf52a52-394a-11d3-b153-00c04f79faa6}", parent);
|
|
||||||
ads::CDockWidget* DockWidget = new ads::CDockWidget(QString("Active X %1").arg(ActiveXCount++));
|
|
||||||
DockWidget->setWidget(w);
|
|
||||||
ViewMenu->addAction(DockWidget->toggleViewAction());
|
|
||||||
return DockWidget;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
//============================================================================
|
//============================================================================
|
||||||
/**
|
/**
|
||||||
@@ -275,6 +188,9 @@ struct MainWindowPrivate
|
|||||||
QWidgetAction* PerspectiveListAction = nullptr;
|
QWidgetAction* PerspectiveListAction = nullptr;
|
||||||
QComboBox* PerspectiveComboBox = nullptr;
|
QComboBox* PerspectiveComboBox = nullptr;
|
||||||
ads::CDockManager* DockManager = nullptr;
|
ads::CDockManager* DockManager = nullptr;
|
||||||
|
ads::CDockWidget* WindowTitleTestDockWidget = nullptr;
|
||||||
|
QPointer<ads::CDockWidget> LastDockedEditor;
|
||||||
|
QPointer<ads::CDockWidget> LastCreatedFloatingEditor;
|
||||||
|
|
||||||
MainWindowPrivate(CMainWindow* _public) : _this(_public) {}
|
MainWindowPrivate(CMainWindow* _public) : _this(_public) {}
|
||||||
|
|
||||||
@@ -307,55 +223,282 @@ struct MainWindowPrivate
|
|||||||
* Restore the perspective listo of the dock manager
|
* Restore the perspective listo of the dock manager
|
||||||
*/
|
*/
|
||||||
void restorePerspectives();
|
void restorePerspectives();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a dock widget with a file system tree view
|
||||||
|
*/
|
||||||
|
ads::CDockWidget* createFileSystemTreeDockWidget()
|
||||||
|
{
|
||||||
|
static int FileSystemCount = 0;
|
||||||
|
QTreeView* w = new QTreeView();
|
||||||
|
w->setFrameShape(QFrame::NoFrame);
|
||||||
|
QFileSystemModel* m = new QFileSystemModel(w);
|
||||||
|
m->setRootPath(QDir::currentPath());
|
||||||
|
w->setModel(m);
|
||||||
|
w->setRootIndex(m->index(QDir::currentPath()));
|
||||||
|
ads::CDockWidget* DockWidget = DockManager->createDockWidget(QString("Filesystem %1")
|
||||||
|
.arg(FileSystemCount++));
|
||||||
|
DockWidget->setWidget(w);
|
||||||
|
DockWidget->setIcon(svgIcon(":/adsdemo/images/folder_open.svg"));
|
||||||
|
ui.menuView->addAction(DockWidget->toggleViewAction());
|
||||||
|
// We disable focus to test focus highlighting if the dock widget content
|
||||||
|
// does not support focus
|
||||||
|
w->setFocusPolicy(Qt::NoFocus);
|
||||||
|
auto ToolBar = DockWidget->createDefaultToolBar();
|
||||||
|
ToolBar->addAction(ui.actionSaveState);
|
||||||
|
ToolBar->addAction(ui.actionRestoreState);
|
||||||
|
return DockWidget;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a dock widget with a QCalendarWidget
|
||||||
|
*/
|
||||||
|
ads::CDockWidget* createCalendarDockWidget()
|
||||||
|
{
|
||||||
|
static int CalendarCount = 0;
|
||||||
|
QCalendarWidget* w = new QCalendarWidget();
|
||||||
|
ads::CDockWidget* DockWidget = DockManager->createDockWidget(QString("Calendar %1").arg(CalendarCount++));
|
||||||
|
// The following lines are for testing the setWidget() and takeWidget()
|
||||||
|
// functionality
|
||||||
|
DockWidget->setWidget(w);
|
||||||
|
DockWidget->setWidget(w); // what happens if we set a widget if a widget is already set
|
||||||
|
DockWidget->takeWidget(); // we remove the widget
|
||||||
|
DockWidget->setWidget(w); // and set the widget again - there should be no error
|
||||||
|
DockWidget->setToggleViewActionMode(ads::CDockWidget::ActionModeShow);
|
||||||
|
DockWidget->setIcon(svgIcon(":/adsdemo/images/date_range.svg"));
|
||||||
|
ui.menuView->addAction(DockWidget->toggleViewAction());
|
||||||
|
auto ToolBar = DockWidget->createDefaultToolBar();
|
||||||
|
ToolBar->addAction(ui.actionSaveState);
|
||||||
|
ToolBar->addAction(ui.actionRestoreState);
|
||||||
|
// For testing all calendar dock widgets have a the tool button style
|
||||||
|
// Qt::ToolButtonTextUnderIcon
|
||||||
|
DockWidget->setToolBarStyleSource(ads::CDockWidget::ToolBarStyleFromDockWidget);
|
||||||
|
DockWidget->setToolBarStyle(Qt::ToolButtonTextUnderIcon, ads::CDockWidget::StateFloating);
|
||||||
|
return DockWidget;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create dock widget with a text label
|
||||||
|
*/
|
||||||
|
ads::CDockWidget* createLongTextLabelDockWidget()
|
||||||
|
{
|
||||||
|
static int LabelCount = 0;
|
||||||
|
QLabel* l = new QLabel();
|
||||||
|
l->setWordWrap(true);
|
||||||
|
l->setAlignment(Qt::AlignTop | Qt::AlignLeft);
|
||||||
|
l->setText(QString("Label %1 %2 - Lorem ipsum dolor sit amet, consectetuer adipiscing elit. "
|
||||||
|
"Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque "
|
||||||
|
"penatibus et magnis dis parturient montes, nascetur ridiculus mus. "
|
||||||
|
"Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. "
|
||||||
|
"Nulla consequat massa quis enim. Donec pede justo, fringilla vel, "
|
||||||
|
"aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, "
|
||||||
|
"imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede "
|
||||||
|
"mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum "
|
||||||
|
"semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, "
|
||||||
|
"porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, "
|
||||||
|
"dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla "
|
||||||
|
"ut metus varius laoreet.")
|
||||||
|
.arg(LabelCount)
|
||||||
|
.arg(QTime::currentTime().toString("hh:mm:ss:zzz")));
|
||||||
|
|
||||||
|
ads::CDockWidget* DockWidget = DockManager->createDockWidget(QString("Label %1").arg(LabelCount++));
|
||||||
|
DockWidget->setWidget(l);
|
||||||
|
DockWidget->setIcon(svgIcon(":/adsdemo/images/font_download.svg"));
|
||||||
|
ui.menuView->addAction(DockWidget->toggleViewAction());
|
||||||
|
return DockWidget;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates as imple editor widget
|
||||||
|
*/
|
||||||
|
ads::CDockWidget* createEditorWidget()
|
||||||
|
{
|
||||||
|
static int EditorCount = 0;
|
||||||
|
QPlainTextEdit* w = new QPlainTextEdit();
|
||||||
|
w->setPlaceholderText("This is an editor. If you close the editor, it will be "
|
||||||
|
"deleted. Enter your text here.");
|
||||||
|
w->setStyleSheet("border: none");
|
||||||
|
ads::CDockWidget* DockWidget = DockManager->createDockWidget(QString("Editor %1").arg(EditorCount++));
|
||||||
|
DockWidget->setWidget(w);
|
||||||
|
DockWidget->setIcon(svgIcon(":/adsdemo/images/edit.svg"));
|
||||||
|
DockWidget->setFeature(ads::CDockWidget::CustomCloseHandling, true);
|
||||||
|
ui.menuView->addAction(DockWidget->toggleViewAction());
|
||||||
|
|
||||||
|
QMenu* OptionsMenu = new QMenu(DockWidget);
|
||||||
|
OptionsMenu->setTitle(QObject::tr("Options"));
|
||||||
|
OptionsMenu->setToolTip(OptionsMenu->title());
|
||||||
|
OptionsMenu->setIcon(svgIcon(":/adsdemo/images/custom-menu-button.svg"));
|
||||||
|
auto MenuAction = OptionsMenu->menuAction();
|
||||||
|
// The object name of the action will be set for the QToolButton that
|
||||||
|
// is created in the dock area title bar. You can use this name for CSS
|
||||||
|
// styling
|
||||||
|
MenuAction->setObjectName("optionsMenu");
|
||||||
|
DockWidget->setTitleBarActions({OptionsMenu->menuAction()});
|
||||||
|
auto a = OptionsMenu->addAction(QObject::tr("Clear Editor"));
|
||||||
|
w->connect(a, SIGNAL(triggered()), SLOT(clear()));
|
||||||
|
|
||||||
|
return DockWidget;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a simply image viewr
|
||||||
|
*/
|
||||||
|
ads::CDockWidget* createImageViewer()
|
||||||
|
{
|
||||||
|
static int ImageViewerCount = 0;
|
||||||
|
auto w = new CImageViewer();
|
||||||
|
auto ImageIndex = randomNumberBounded(4);
|
||||||
|
auto FileName = ":adsdemo/images/ads_logo.svg";
|
||||||
|
|
||||||
|
// Pick a random image from a number of images
|
||||||
|
switch (ImageIndex)
|
||||||
|
{
|
||||||
|
case 0: FileName = ":adsdemo/images/ads_tile_blue.svg"; break;
|
||||||
|
case 1: FileName = ":adsdemo/images/ads_tile_blue_light.svg"; break;
|
||||||
|
case 2: FileName = ":adsdemo/images/ads_tile_green.svg"; break;
|
||||||
|
case 3: FileName = ":adsdemo/images/ads_tile_orange.svg"; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto Result = w->loadFile(FileName);
|
||||||
|
qDebug() << "loadFile result: " << Result;
|
||||||
|
ads::CDockWidget* DockWidget = DockManager->createDockWidget(QString("Image Viewer %1").arg(ImageViewerCount++));
|
||||||
|
DockWidget->setIcon(svgIcon(":/adsdemo/images/photo.svg"));
|
||||||
|
DockWidget->setWidget(w,ads:: CDockWidget::ForceNoScrollArea);
|
||||||
|
auto ToolBar = DockWidget->createDefaultToolBar();
|
||||||
|
ToolBar->addActions(w->actions());
|
||||||
|
return DockWidget;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a table widget
|
||||||
|
*/
|
||||||
|
ads::CDockWidget* createTableWidget()
|
||||||
|
{
|
||||||
|
static int TableCount = 0;
|
||||||
|
auto w = new CMinSizeTableWidget();
|
||||||
|
ads::CDockWidget* DockWidget = DockManager->createDockWidget(QString("Table %1").arg(TableCount++));
|
||||||
|
static int colCount = 5;
|
||||||
|
static int rowCount = 30;
|
||||||
|
w->setColumnCount(colCount);
|
||||||
|
w->setRowCount(rowCount);
|
||||||
|
for (int col = 0; col < colCount; ++col)
|
||||||
|
{
|
||||||
|
w->setHorizontalHeaderItem(col, new QTableWidgetItem(QString("Col %1").arg(col+1)));
|
||||||
|
for (int row = 0; row < rowCount; ++row)
|
||||||
|
{
|
||||||
|
w->setItem(row, col, new QTableWidgetItem(QString("T %1-%2").arg(row + 1).arg(col+1)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DockWidget->setWidget(w);
|
||||||
|
DockWidget->setIcon(svgIcon(":/adsdemo/images/grid_on.svg"));
|
||||||
|
DockWidget->setMinimumSizeHintMode(ads::CDockWidget::MinimumSizeHintFromContent);
|
||||||
|
auto ToolBar = DockWidget->createDefaultToolBar();
|
||||||
|
auto Action = ToolBar->addAction(svgIcon(":/adsdemo/images/fullscreen.svg"), "Toggle Fullscreen");
|
||||||
|
QObject::connect(Action, &QAction::triggered, [DockWidget]()
|
||||||
|
{
|
||||||
|
if (DockWidget->isFullScreen())
|
||||||
|
{
|
||||||
|
DockWidget->showNormal();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
DockWidget->showFullScreen();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
ui.menuView->addAction(DockWidget->toggleViewAction());
|
||||||
|
return DockWidget;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create QQuickWidget for test for OpenGL and QQuick
|
||||||
|
*/
|
||||||
|
ads::CDockWidget *createQQuickWidget()
|
||||||
|
{
|
||||||
|
QQuickWidget *widget = new QQuickWidget();
|
||||||
|
ads::CDockWidget *dockWidget = DockManager->createDockWidget("Quick");
|
||||||
|
dockWidget->setWidget(widget);
|
||||||
|
return dockWidget;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef Q_OS_WIN
|
||||||
|
#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
|
||||||
|
/**
|
||||||
|
* Creates an ActiveX widget on windows
|
||||||
|
*/
|
||||||
|
ads::CDockWidget* createActiveXWidget(QWidget* parent = nullptr)
|
||||||
|
{
|
||||||
|
static int ActiveXCount = 0;
|
||||||
|
QAxWidget* w = new QAxWidget("{6bf52a52-394a-11d3-b153-00c04f79faa6}", parent);
|
||||||
|
ads::CDockWidget* DockWidget = DockManager->createDockWidget(QString("Active X %1").arg(ActiveXCount++));
|
||||||
|
DockWidget->setWidget(w);
|
||||||
|
ui.menuView->addAction(DockWidget->toggleViewAction());
|
||||||
|
return DockWidget;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
//============================================================================
|
//============================================================================
|
||||||
void MainWindowPrivate::createContent()
|
void MainWindowPrivate::createContent()
|
||||||
{
|
{
|
||||||
// Test container docking
|
// Test container docking
|
||||||
QMenu* ViewMenu = ui.menuView;
|
auto DockWidget = createCalendarDockWidget();
|
||||||
auto DockWidget = createCalendarDockWidget(ViewMenu);
|
|
||||||
DockWidget->setFeature(ads::CDockWidget::DockWidgetClosable, false);
|
DockWidget->setFeature(ads::CDockWidget::DockWidgetClosable, false);
|
||||||
DockWidget->setFeature(ads::CDockWidget::DockWidgetMovable, false);
|
|
||||||
DockWidget->setFeature(ads::CDockWidget::DockWidgetFloatable, false);
|
|
||||||
auto SpecialDockArea = DockManager->addDockWidget(ads::LeftDockWidgetArea, DockWidget);
|
auto SpecialDockArea = DockManager->addDockWidget(ads::LeftDockWidgetArea, DockWidget);
|
||||||
|
|
||||||
// For this Special Dock Area we want to avoid dropping on the center of it (i.e. we don't want this widget to be ever tabbified):
|
// For this Special Dock Area we want to avoid dropping on the center of it (i.e. we don't want this widget to be ever tabbified):
|
||||||
{
|
{
|
||||||
SpecialDockArea->setAllowedAreas(ads::OuterDockAreas);
|
//SpecialDockArea->setAllowedAreas(ads::OuterDockAreas);
|
||||||
//SpecialDockArea->setAllowedAreas({ads::LeftDockWidgetArea, ads::RightDockWidgetArea}); // just for testing
|
SpecialDockArea->setAllowedAreas({ads::LeftDockWidgetArea, ads::RightDockWidgetArea, ads::TopDockWidgetArea}); // just for testing
|
||||||
}
|
}
|
||||||
|
|
||||||
DockManager->addDockWidget(ads::LeftDockWidgetArea, createLongTextLabelDockWidget(ViewMenu));
|
DockWidget = createLongTextLabelDockWidget();
|
||||||
auto FileSystemWidget = createFileSystemTreeDockWidget(ViewMenu);
|
WindowTitleTestDockWidget = DockWidget;
|
||||||
auto ToolBar = FileSystemWidget->createDefaultToolBar();
|
DockWidget->setFeature(ads::CDockWidget::DockWidgetFocusable, false);
|
||||||
ToolBar->addAction(ui.actionSaveState);
|
DockManager->addDockWidget(ads::LeftDockWidgetArea, DockWidget);
|
||||||
ToolBar->addAction(ui.actionRestoreState);
|
auto FileSystemWidget = createFileSystemTreeDockWidget();
|
||||||
FileSystemWidget->setFeature(ads::CDockWidget::DockWidgetFloatable, false);
|
FileSystemWidget->setFeature(ads::CDockWidget::DockWidgetFloatable, false);
|
||||||
appendFeaturStringToWindowTitle(FileSystemWidget);
|
appendFeaturStringToWindowTitle(FileSystemWidget);
|
||||||
DockManager->addDockWidget(ads::BottomDockWidgetArea, FileSystemWidget);
|
DockManager->addDockWidget(ads::BottomDockWidgetArea, FileSystemWidget);
|
||||||
|
|
||||||
FileSystemWidget = createFileSystemTreeDockWidget(ViewMenu);
|
FileSystemWidget = createFileSystemTreeDockWidget();
|
||||||
ToolBar = FileSystemWidget->createDefaultToolBar();
|
|
||||||
ToolBar->addAction(ui.actionSaveState);
|
|
||||||
ToolBar->addAction(ui.actionRestoreState);
|
|
||||||
FileSystemWidget->setFeature(ads::CDockWidget::DockWidgetMovable, false);
|
FileSystemWidget->setFeature(ads::CDockWidget::DockWidgetMovable, false);
|
||||||
FileSystemWidget->setFeature(ads::CDockWidget::DockWidgetFloatable, false);
|
FileSystemWidget->setFeature(ads::CDockWidget::DockWidgetFloatable, false);
|
||||||
appendFeaturStringToWindowTitle(FileSystemWidget);
|
appendFeaturStringToWindowTitle(FileSystemWidget);
|
||||||
|
|
||||||
// Test custom factory - we inject a help button into the title bar
|
// Test custom factory - we inject a help button into the title bar
|
||||||
ads::CDockComponentsFactory::setFactory(new CCustomComponentsFactory());
|
DockManager->setComponentsFactory(new CCustomComponentsFactory());
|
||||||
auto TopDockArea = DockManager->addDockWidget(ads::TopDockWidgetArea, FileSystemWidget);
|
auto TopDockArea = DockManager->addDockWidget(ads::TopDockWidgetArea, FileSystemWidget);
|
||||||
ads::CDockComponentsFactory::resetDefaultFactory();
|
// Uncomment the next line if you would like to test the
|
||||||
|
// HideSingleWidgetTitleBar functionality
|
||||||
|
// TopDockArea->setDockAreaFlag(ads::CDockAreaWidget::HideSingleWidgetTitleBar, true);
|
||||||
|
DockManager->setComponentsFactory(ads::CDockComponentsFactory::factory());
|
||||||
|
|
||||||
// We create a calendar widget and clear all flags to prevent the dock area
|
// We create a calendar widget and clear all flags to prevent the dock area
|
||||||
// from closing
|
// from closing
|
||||||
DockWidget = createCalendarDockWidget(ViewMenu);
|
DockWidget = createCalendarDockWidget();
|
||||||
DockWidget->setFeature(ads::CDockWidget::DockWidgetClosable, false);
|
|
||||||
DockWidget->setFeature(ads::CDockWidget::DockWidgetMovable, false);
|
|
||||||
DockWidget->setFeature(ads::CDockWidget::DockWidgetFloatable, false);
|
|
||||||
DockWidget->setTabToolTip(QString("Tab ToolTip\nHodie est dies magna"));
|
DockWidget->setTabToolTip(QString("Tab ToolTip\nHodie est dies magna"));
|
||||||
auto DockArea = DockManager->addDockWidget(ads::CenterDockWidgetArea, DockWidget, TopDockArea);
|
auto DockArea = DockManager->addDockWidget(ads::CenterDockWidgetArea, DockWidget, TopDockArea);
|
||||||
|
// Now we create a action to test resizing of DockArea widget
|
||||||
|
auto Action = ui.menuTests->addAction(QString("Resize %1").arg(DockWidget->windowTitle()));
|
||||||
|
QObject::connect(Action, &QAction::triggered, [DockArea]()
|
||||||
|
{
|
||||||
|
// Resizing only works, if the Splitter is visible and has a valid
|
||||||
|
// sizes
|
||||||
|
auto Splitter = ads::internal::findParent<ads::CDockSplitter*>(DockArea);
|
||||||
|
if (!Splitter)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// We change the sizes of the splitter that contains the Calendar 1 widget
|
||||||
|
// to resize the dock widget
|
||||||
|
int Width = Splitter->width();
|
||||||
|
Splitter->setSizes({Width * 2/3, Width * 1/3});
|
||||||
|
});
|
||||||
|
DockWidget->setWindowTitle(QString("My " + DockWidget->windowTitle()));
|
||||||
|
|
||||||
// Now we add a custom button to the dock area title bar that will create
|
// Now we add a custom button to the dock area title bar that will create
|
||||||
// new editor widgets when clicked
|
// new editor widgets when clicked
|
||||||
@@ -363,32 +506,63 @@ void MainWindowPrivate::createContent()
|
|||||||
CustomButton->setToolTip(QObject::tr("Create Editor"));
|
CustomButton->setToolTip(QObject::tr("Create Editor"));
|
||||||
CustomButton->setIcon(svgIcon(":/adsdemo/images/plus.svg"));
|
CustomButton->setIcon(svgIcon(":/adsdemo/images/plus.svg"));
|
||||||
CustomButton->setAutoRaise(true);
|
CustomButton->setAutoRaise(true);
|
||||||
|
|
||||||
auto TitleBar = DockArea->titleBar();
|
auto TitleBar = DockArea->titleBar();
|
||||||
int Index = TitleBar->indexOf(TitleBar->tabBar());
|
int Index = TitleBar->indexOf(TitleBar->tabBar());
|
||||||
TitleBar->insertWidget(Index + 1, CustomButton);
|
TitleBar->insertWidget(Index + 1, CustomButton);
|
||||||
QObject::connect(CustomButton, &QToolButton::clicked, [=]()
|
QObject::connect(CustomButton, &QToolButton::clicked, [DockArea, this]()
|
||||||
{
|
{
|
||||||
auto DockWidget = createEditorWidget(ui.menuView);
|
auto DockWidget = createEditorWidget();
|
||||||
DockWidget->setFeature(ads::CDockWidget::DockWidgetDeleteOnClose, true);
|
DockWidget->setFeature(ads::CDockWidget::DockWidgetDeleteOnClose, true);
|
||||||
DockManager->addDockWidgetTabToArea(DockWidget, DockArea);
|
DockManager->addDockWidgetTabToArea(DockWidget, DockArea);
|
||||||
_this->connect(DockWidget, SIGNAL(closeRequested()), SLOT(onEditorCloseRequested()));
|
_this->connect(DockWidget, SIGNAL(closeRequested()), SLOT(onEditorCloseRequested()));
|
||||||
});
|
});
|
||||||
|
|
||||||
// Test dock area docking
|
// Test dock area docking
|
||||||
auto RighDockArea = DockManager->addDockWidget(ads::RightDockWidgetArea, createLongTextLabelDockWidget(ViewMenu), TopDockArea);
|
auto RighDockArea = DockManager->addDockWidget(ads::RightDockWidgetArea, createLongTextLabelDockWidget(), TopDockArea);
|
||||||
DockManager->addDockWidget(ads::TopDockWidgetArea, createLongTextLabelDockWidget(ViewMenu), RighDockArea);
|
DockWidget = createLongTextLabelDockWidget();
|
||||||
auto BottomDockArea = DockManager->addDockWidget(ads::BottomDockWidgetArea, createLongTextLabelDockWidget(ViewMenu), RighDockArea);
|
DockWidget->setFeature(ads::CDockWidget::DockWidgetPinnable, false);
|
||||||
DockManager->addDockWidget(ads::CenterDockWidgetArea, createLongTextLabelDockWidget(ViewMenu), RighDockArea);
|
DockManager->addDockWidget(ads::TopDockWidgetArea, DockWidget, RighDockArea);
|
||||||
DockManager->addDockWidget(ads::CenterDockWidgetArea, createLongTextLabelDockWidget(ViewMenu), BottomDockArea);
|
auto BottomDockArea = DockManager->addDockWidget(ads::BottomDockWidgetArea, createLongTextLabelDockWidget(), RighDockArea);
|
||||||
|
DockManager->addDockWidget(ads::CenterDockWidgetArea, createLongTextLabelDockWidget(), RighDockArea);
|
||||||
|
auto LabelDockWidget = createLongTextLabelDockWidget();
|
||||||
|
DockManager->addDockWidget(ads::CenterDockWidgetArea, LabelDockWidget, BottomDockArea);
|
||||||
|
|
||||||
auto Action = ui.menuView->addAction(QString("Set %1 floating").arg(DockWidget->windowTitle()));
|
// Tests CustomCloseHandling without DeleteOnClose
|
||||||
|
LabelDockWidget->setFeature(ads::CDockWidget::CustomCloseHandling, true);
|
||||||
|
LabelDockWidget->setWindowTitle(LabelDockWidget->windowTitle() + " [Custom Close]");
|
||||||
|
QObject::connect(LabelDockWidget, &ads::CDockWidget::closeRequested, [LabelDockWidget, this]()
|
||||||
|
{
|
||||||
|
int Result = QMessageBox::question(_this, "Custom Close Request",
|
||||||
|
"Do you really want to close this dock widget?");
|
||||||
|
if (QMessageBox::Yes == Result)
|
||||||
|
{
|
||||||
|
LabelDockWidget->closeDockWidget();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Action = ui.menuTests->addAction(QString("Set %1 Floating").arg(DockWidget->windowTitle()));
|
||||||
DockWidget->connect(Action, SIGNAL(triggered()), SLOT(setFloating()));
|
DockWidget->connect(Action, SIGNAL(triggered()), SLOT(setFloating()));
|
||||||
|
Action = ui.menuTests->addAction(QString("Set %1 As Current Tab").arg(DockWidget->windowTitle()));
|
||||||
|
DockWidget->connect(Action, SIGNAL(triggered()), SLOT(setAsCurrentTab()));
|
||||||
|
Action = ui.menuTests->addAction(QString("Raise %1").arg(DockWidget->windowTitle()));
|
||||||
|
DockWidget->connect(Action, SIGNAL(triggered()), SLOT(raise()));
|
||||||
|
|
||||||
|
// Test hidden floating dock widget
|
||||||
|
DockWidget = createLongTextLabelDockWidget();
|
||||||
|
DockManager->addDockWidgetFloating(DockWidget);
|
||||||
|
DockWidget->toggleView(false);
|
||||||
|
|
||||||
|
// Test visible floating dock widget
|
||||||
|
DockWidget = createCalendarDockWidget();
|
||||||
|
DockManager->addDockWidgetFloating(DockWidget);
|
||||||
|
DockWidget->setWindowTitle(QString("My " + DockWidget->windowTitle()));
|
||||||
|
|
||||||
|
|
||||||
#ifdef Q_OS_WIN
|
#ifdef Q_OS_WIN
|
||||||
if (!DockManager->configFlags().testFlag(ads::CDockManager::OpaqueUndocking))
|
#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
|
||||||
{
|
DockManager->addDockWidget(ads::CenterDockWidgetArea, createActiveXWidget(), RighDockArea);
|
||||||
DockManager->addDockWidget(ads::CenterDockWidgetArea, createActiveXWidget(ViewMenu), RighDockArea);
|
#endif
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
for (auto DockWidget : DockManager->dockWidgetsMap())
|
for (auto DockWidget : DockManager->dockWidgetsMap())
|
||||||
@@ -396,6 +570,15 @@ void MainWindowPrivate::createContent()
|
|||||||
_this->connect(DockWidget, SIGNAL(viewToggled(bool)), SLOT(onViewToggled(bool)));
|
_this->connect(DockWidget, SIGNAL(viewToggled(bool)), SLOT(onViewToggled(bool)));
|
||||||
_this->connect(DockWidget, SIGNAL(visibilityChanged(bool)), SLOT(onViewVisibilityChanged(bool)));
|
_this->connect(DockWidget, SIGNAL(visibilityChanged(bool)), SLOT(onViewVisibilityChanged(bool)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Create image viewer
|
||||||
|
DockWidget = createImageViewer();
|
||||||
|
DockManager->addDockWidget(ads::LeftDockWidgetArea, DockWidget);
|
||||||
|
|
||||||
|
// Create quick widget
|
||||||
|
DockWidget = createQQuickWidget();
|
||||||
|
DockWidget->setFeature(ads::CDockWidget::DockWidgetClosable, true);
|
||||||
|
DockManager->addDockWidget(ads::LeftDockWidgetArea, DockWidget);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -408,27 +591,86 @@ void MainWindowPrivate::createActions()
|
|||||||
ui.toolBar->addAction(ui.actionRestoreState);
|
ui.toolBar->addAction(ui.actionRestoreState);
|
||||||
ui.actionRestoreState->setIcon(svgIcon(":/adsdemo/images/restore.svg"));
|
ui.actionRestoreState->setIcon(svgIcon(":/adsdemo/images/restore.svg"));
|
||||||
|
|
||||||
SavePerspectiveAction = new QAction("Create Perspective", _this);
|
ui.toolBar->addSeparator();
|
||||||
SavePerspectiveAction->setIcon(svgIcon(":/adsdemo/images/picture_in_picture.svg"));
|
|
||||||
_this->connect(SavePerspectiveAction, SIGNAL(triggered()), SLOT(savePerspective()));
|
QAction* a = ui.toolBar->addAction("Lock Workspace");
|
||||||
|
a->setIcon(svgIcon(":/adsdemo/images/lock_outline.svg"));
|
||||||
|
a->setCheckable(true);
|
||||||
|
a->setChecked(false);
|
||||||
|
QObject::connect(a, &QAction::triggered, _this, &CMainWindow::lockWorkspace);
|
||||||
|
|
||||||
PerspectiveListAction = new QWidgetAction(_this);
|
PerspectiveListAction = new QWidgetAction(_this);
|
||||||
PerspectiveComboBox = new QComboBox(_this);
|
PerspectiveComboBox = new QComboBox(_this);
|
||||||
PerspectiveComboBox->setSizeAdjustPolicy(QComboBox::AdjustToContents);
|
PerspectiveComboBox->setSizeAdjustPolicy(QComboBox::AdjustToContents);
|
||||||
PerspectiveComboBox->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
|
PerspectiveComboBox->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
|
||||||
PerspectiveListAction->setDefaultWidget(PerspectiveComboBox);
|
PerspectiveListAction->setDefaultWidget(PerspectiveComboBox);
|
||||||
ui.toolBar->addSeparator();
|
|
||||||
ui.toolBar->addAction(PerspectiveListAction);
|
ui.toolBar->addAction(PerspectiveListAction);
|
||||||
|
|
||||||
|
a = SavePerspectiveAction = ui.toolBar->addAction("Create Perspective");
|
||||||
|
a->setIcon(svgIcon(":/adsdemo/images/picture_in_picture.svg"));
|
||||||
|
QObject::connect(a, &QAction::triggered, _this, &CMainWindow::savePerspective);
|
||||||
ui.toolBar->addAction(SavePerspectiveAction);
|
ui.toolBar->addAction(SavePerspectiveAction);
|
||||||
|
|
||||||
QAction* a = ui.toolBar->addAction("Create Editor");
|
ui.toolBar->addSeparator();
|
||||||
|
|
||||||
|
a = ui.toolBar->addAction("Create Floating Editor");
|
||||||
|
a->setProperty("Floating", true);
|
||||||
a->setToolTip("Creates floating dynamic dockable editor windows that are deleted on close");
|
a->setToolTip("Creates floating dynamic dockable editor windows that are deleted on close");
|
||||||
a->setIcon(svgIcon(":/adsdemo/images/note_add.svg"));
|
a->setIcon(svgIcon(":/adsdemo/images/note_add.svg"));
|
||||||
_this->connect(a, SIGNAL(triggered()), SLOT(createEditor()));
|
_this->connect(a, SIGNAL(triggered()), SLOT(createEditor()));
|
||||||
|
ui.menuTests->addAction(a);
|
||||||
|
|
||||||
a = ui.toolBar->addAction("Create Table");
|
a = ui.toolBar->addAction("Create Docked Editor");
|
||||||
|
a->setProperty("Floating", false);
|
||||||
|
a->setToolTip("Creates a docked editor windows that are deleted on close");
|
||||||
|
a->setIcon(svgIcon(":/adsdemo/images/docked_editor.svg"));
|
||||||
|
_this->connect(a, SIGNAL(triggered()), SLOT(createEditor()));
|
||||||
|
ui.menuTests->addAction(a);
|
||||||
|
|
||||||
|
a = ui.toolBar->addAction("Create Editor Tab");
|
||||||
|
a->setProperty("Floating", false);
|
||||||
|
a->setToolTip("Creates a editor tab and inserts it as second tab into an area");
|
||||||
|
a->setIcon(svgIcon(":/adsdemo/images/tab.svg"));
|
||||||
|
a->setProperty("Tabbed", true);
|
||||||
|
_this->connect(a, SIGNAL(triggered()), SLOT(createEditor()));
|
||||||
|
ui.menuTests->addAction(a);
|
||||||
|
|
||||||
|
ui.toolBar->addSeparator();
|
||||||
|
a = ui.toolBar->addAction("Create Floating Table");
|
||||||
a->setToolTip("Creates floating dynamic dockable table with millions of entries");
|
a->setToolTip("Creates floating dynamic dockable table with millions of entries");
|
||||||
a->setIcon(svgIcon(":/adsdemo/images/grid_on.svg"));
|
a->setIcon(svgIcon(":/adsdemo/images/grid_on.svg"));
|
||||||
_this->connect(a, SIGNAL(triggered()), SLOT(createTable()));
|
_this->connect(a, SIGNAL(triggered()), SLOT(createTable()));
|
||||||
|
ui.menuTests->addAction(a);
|
||||||
|
|
||||||
|
a = ui.toolBar->addAction("Create Image Viewer");
|
||||||
|
auto ToolButton = qobject_cast<QToolButton*>(ui.toolBar->widgetForAction(a));
|
||||||
|
ToolButton->setPopupMode(QToolButton::InstantPopup);
|
||||||
|
a->setToolTip("Creates floating, docked or pinned image viewer");
|
||||||
|
a->setIcon(svgIcon(":/adsdemo/images/panorama.svg"));
|
||||||
|
ui.menuTests->addAction(a);
|
||||||
|
auto Menu = new QMenu();
|
||||||
|
ToolButton->setMenu(Menu);
|
||||||
|
a = Menu->addAction("Floating Image Viewer");
|
||||||
|
_this->connect(a, SIGNAL(triggered()), SLOT(createImageViewer()));
|
||||||
|
a = Menu->addAction("Docked Image Viewer");
|
||||||
|
_this->connect(a, SIGNAL(triggered()), SLOT(createImageViewer()));
|
||||||
|
a = Menu->addAction("Pinned Image Viewer");
|
||||||
|
_this->connect(a, SIGNAL(triggered()), SLOT(createImageViewer()));
|
||||||
|
|
||||||
|
|
||||||
|
ui.menuTests->addSeparator();
|
||||||
|
a = ui.menuTests->addAction("Show Status Dialog");
|
||||||
|
_this->connect(a, SIGNAL(triggered()), SLOT(showStatusDialog()));
|
||||||
|
|
||||||
|
a = ui.menuTests->addAction("Toggle Label 0 Window Title");
|
||||||
|
_this->connect(a, SIGNAL(triggered()), SLOT(toggleDockWidgetWindowTitle()));
|
||||||
|
ui.menuTests->addSeparator();
|
||||||
|
|
||||||
|
a = ui.toolBar->addAction("Apply VS Style");
|
||||||
|
a->setToolTip("Applies a Visual Studio light style (visual_studio_light.css)." );
|
||||||
|
a->setIcon(svgIcon(":/adsdemo/images/color_lens.svg"));
|
||||||
|
QObject::connect(a, &QAction::triggered, _this, &CMainWindow::applyVsStyle);
|
||||||
|
ui.menuTests->addAction(a);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -479,7 +721,7 @@ CMainWindow::CMainWindow(QWidget *parent) :
|
|||||||
{
|
{
|
||||||
using namespace ads;
|
using namespace ads;
|
||||||
d->ui.setupUi(this);
|
d->ui.setupUi(this);
|
||||||
|
setWindowTitle(QApplication::instance()->applicationName());
|
||||||
d->createActions();
|
d->createActions();
|
||||||
|
|
||||||
// uncomment the following line if the tab close button should be
|
// uncomment the following line if the tab close button should be
|
||||||
@@ -515,15 +757,42 @@ CMainWindow::CMainWindow(QWidget *parent) :
|
|||||||
// uncomment the following line if you want floating container to show active dock widget's icon instead of always showing application icon
|
// uncomment the following line if you want floating container to show active dock widget's icon instead of always showing application icon
|
||||||
//CDockManager::setConfigFlag(CDockManager::FloatingContainerHasWidgetIcon, true);
|
//CDockManager::setConfigFlag(CDockManager::FloatingContainerHasWidgetIcon, true);
|
||||||
|
|
||||||
|
// uncomment the following line if you want a central widget in the main dock container (the dock manager) without a titlebar
|
||||||
|
// If you enable this code, you can test it in the demo with the Calendar 0
|
||||||
|
// dock widget.
|
||||||
|
//CDockManager::setConfigFlag(CDockManager::HideSingleCentralWidgetTitleBar, true);
|
||||||
|
|
||||||
|
// uncomment the following line to enable focus highlighting of the dock
|
||||||
|
// widget that has the focus
|
||||||
|
CDockManager::setConfigFlag(CDockManager::FocusHighlighting, true);
|
||||||
|
|
||||||
|
// uncomment if you would like to enable dock widget auto hiding
|
||||||
|
CDockManager::setAutoHideConfigFlags({CDockManager::DefaultAutoHideConfig});
|
||||||
|
|
||||||
|
// uncomment if you would like to disable closing auto hide widget with mouse click outside of auto hide container
|
||||||
|
//CDockManager::setAutoHideConfigFlag(CDockManager::AutoHideCloseOnOutsideMouseClick, false);
|
||||||
|
|
||||||
|
// uncomment if you would like to enable an equal distribution of the
|
||||||
|
// available size of a splitter to all contained dock widgets
|
||||||
|
// CDockManager::setConfigFlag(CDockManager::EqualSplitOnInsertion, true);
|
||||||
|
|
||||||
|
// uncomment if you would like to close tabs with the middle mouse button, web browser style
|
||||||
|
// CDockManager::setConfigFlag(CDockManager::MiddleMouseButtonClosesTab, true);
|
||||||
|
|
||||||
|
// uncomment if you would like to avoid using the built-in QSS stylesheet
|
||||||
|
// CDockManager::setConfigFlag(CDockManager::DisableStylesheet, true);
|
||||||
|
|
||||||
// Now create the dock manager and its content
|
// Now create the dock manager and its content
|
||||||
d->DockManager = new CDockManager(this);
|
d->DockManager = new CDockManager(this);
|
||||||
|
d->DockManager->setDockWidgetToolBarStyle(Qt::ToolButtonIconOnly, ads::CDockWidget::StateFloating);
|
||||||
|
|
||||||
// uncomment the following line to have the old style where the dock
|
#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
|
||||||
// area close button closes the active tab
|
connect(d->PerspectiveComboBox, SIGNAL(activated(QString)),
|
||||||
// CDockManager::setConfigFlags({CDockManager::DockAreaHasCloseButton
|
d->DockManager, SLOT(openPerspective(QString)));
|
||||||
// | CDockManager::DockAreaCloseButtonClosesTab});
|
#else
|
||||||
connect(d->PerspectiveComboBox, SIGNAL(activated(const QString&)),
|
connect(d->PerspectiveComboBox, SIGNAL(textActivated(QString)),
|
||||||
d->DockManager, SLOT(openPerspective(const QString&)));
|
d->DockManager, SLOT(openPerspective(QString)));
|
||||||
|
#endif
|
||||||
|
|
||||||
d->createContent();
|
d->createContent();
|
||||||
// Default window geometry - center on screen
|
// Default window geometry - center on screen
|
||||||
@@ -549,6 +818,9 @@ CMainWindow::~CMainWindow()
|
|||||||
void CMainWindow::closeEvent(QCloseEvent* event)
|
void CMainWindow::closeEvent(QCloseEvent* event)
|
||||||
{
|
{
|
||||||
d->saveState();
|
d->saveState();
|
||||||
|
// Delete dock manager here to delete all floating widgets. This ensures
|
||||||
|
// that all top level windows of the dock manager are properly closed
|
||||||
|
d->DockManager->deleteLater();
|
||||||
QMainWindow::closeEvent(event);
|
QMainWindow::closeEvent(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -591,37 +863,82 @@ void CMainWindow::savePerspective()
|
|||||||
//============================================================================
|
//============================================================================
|
||||||
void CMainWindow::onViewToggled(bool Open)
|
void CMainWindow::onViewToggled(bool Open)
|
||||||
{
|
{
|
||||||
|
Q_UNUSED(Open);
|
||||||
auto DockWidget = qobject_cast<ads::CDockWidget*>(sender());
|
auto DockWidget = qobject_cast<ads::CDockWidget*>(sender());
|
||||||
if (!DockWidget)
|
if (!DockWidget)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
qDebug() << DockWidget->objectName() << " viewToggled(" << Open << ")";
|
//qDebug() << DockWidget->objectName() << " viewToggled(" << Open << ")";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//============================================================================
|
//============================================================================
|
||||||
void CMainWindow::onViewVisibilityChanged(bool Visible)
|
void CMainWindow::onViewVisibilityChanged(bool Visible)
|
||||||
{
|
{
|
||||||
|
Q_UNUSED(Visible);
|
||||||
auto DockWidget = qobject_cast<ads::CDockWidget*>(sender());
|
auto DockWidget = qobject_cast<ads::CDockWidget*>(sender());
|
||||||
if (!DockWidget)
|
if (!DockWidget)
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
qDebug() << DockWidget->objectName() << " visibilityChanged(" << Visible << ")";
|
//qDebug() << DockWidget->objectName() << " visibilityChanged(" << Visible << ")";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//============================================================================
|
//============================================================================
|
||||||
void CMainWindow::createEditor()
|
void CMainWindow::createEditor()
|
||||||
{
|
{
|
||||||
auto DockWidget = createEditorWidget(d->ui.menuView);
|
QObject* Sender = sender();
|
||||||
|
QVariant vFloating = Sender->property("Floating");
|
||||||
|
bool Floating = vFloating.isValid() ? vFloating.toBool() : true;
|
||||||
|
QVariant vTabbed = Sender->property("Tabbed");
|
||||||
|
bool Tabbed = vTabbed.isValid() ? vTabbed.toBool() : true;
|
||||||
|
auto DockWidget = d->createEditorWidget();
|
||||||
DockWidget->setFeature(ads::CDockWidget::DockWidgetDeleteOnClose, true);
|
DockWidget->setFeature(ads::CDockWidget::DockWidgetDeleteOnClose, true);
|
||||||
|
DockWidget->setFeature(ads::CDockWidget::DockWidgetForceCloseWithArea, true);
|
||||||
|
connect(DockWidget, SIGNAL(closeRequested()), SLOT(onEditorCloseRequested()));
|
||||||
|
|
||||||
|
if (Floating)
|
||||||
|
{
|
||||||
auto FloatingWidget = d->DockManager->addDockWidgetFloating(DockWidget);
|
auto FloatingWidget = d->DockManager->addDockWidgetFloating(DockWidget);
|
||||||
FloatingWidget->move(QPoint(20, 20));
|
FloatingWidget->move(QPoint(20, 20));
|
||||||
connect(DockWidget, SIGNAL(closeRequested()), SLOT(onEditorCloseRequested()));
|
d->LastCreatedFloatingEditor = DockWidget;
|
||||||
|
d->LastDockedEditor.clear();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ads::CDockAreaWidget* EditorArea = d->LastDockedEditor ? d->LastDockedEditor->dockAreaWidget() : nullptr;
|
||||||
|
if (EditorArea)
|
||||||
|
{
|
||||||
|
if (Tabbed)
|
||||||
|
{
|
||||||
|
// Test inserting the dock widget tab at a given position instead
|
||||||
|
// of appending it. This function inserts the new dock widget as
|
||||||
|
// first tab
|
||||||
|
d->DockManager->addDockWidgetTabToArea(DockWidget, EditorArea, 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
d->DockManager->setConfigFlag(ads::CDockManager::EqualSplitOnInsertion, true);
|
||||||
|
d->DockManager->addDockWidget(ads::RightDockWidgetArea, DockWidget, EditorArea);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (d->LastCreatedFloatingEditor)
|
||||||
|
{
|
||||||
|
d->DockManager->addDockWidget(ads::RightDockWidgetArea, DockWidget, d->LastCreatedFloatingEditor->dockAreaWidget());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
d->DockManager->addDockWidget(ads::TopDockWidgetArea, DockWidget);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
d->LastDockedEditor = DockWidget;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -639,12 +956,107 @@ void CMainWindow::onEditorCloseRequested()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
void CMainWindow::onImageViewerCloseRequested()
|
||||||
|
{
|
||||||
|
auto DockWidget = qobject_cast<ads::CDockWidget*>(sender());
|
||||||
|
int Result = QMessageBox::question(this, "Close Image Viewer", QString("%1 "
|
||||||
|
"contains unsaved changes? Would you like to close it?")
|
||||||
|
.arg(DockWidget->windowTitle()));
|
||||||
|
if (QMessageBox::Yes == Result)
|
||||||
|
{
|
||||||
|
DockWidget->closeDockWidget();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//============================================================================
|
//============================================================================
|
||||||
void CMainWindow::createTable()
|
void CMainWindow::createTable()
|
||||||
{
|
{
|
||||||
auto DockWidget = createTableWidget(d->ui.menuView);
|
auto DockWidget = d->createTableWidget();
|
||||||
DockWidget->setFeature(ads::CDockWidget::DockWidgetDeleteOnClose, true);
|
DockWidget->setFeature(ads::CDockWidget::DockWidgetDeleteOnClose, true);
|
||||||
auto FloatingWidget = d->DockManager->addDockWidgetFloating(DockWidget);
|
auto FloatingWidget = d->DockManager->addDockWidgetFloating(DockWidget);
|
||||||
FloatingWidget->move(QPoint(40, 40));
|
FloatingWidget->move(QPoint(40, 40));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
void CMainWindow::showStatusDialog()
|
||||||
|
{
|
||||||
|
CStatusDialog Dialog(d->DockManager);
|
||||||
|
Dialog.exec();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
void CMainWindow::toggleDockWidgetWindowTitle()
|
||||||
|
{
|
||||||
|
QString Title = d->WindowTitleTestDockWidget->windowTitle();
|
||||||
|
int i = Title.indexOf(" (Test)");
|
||||||
|
if (-1 == i)
|
||||||
|
{
|
||||||
|
Title += " (Test)";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Title = Title.left(i);
|
||||||
|
}
|
||||||
|
d->WindowTitleTestDockWidget->setWindowTitle(Title);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
void CMainWindow::applyVsStyle()
|
||||||
|
{
|
||||||
|
QFile StyleSheetFile(":adsdemo/res/visual_studio_light.css");
|
||||||
|
StyleSheetFile.open(QIODevice::ReadOnly);
|
||||||
|
QTextStream StyleSheetStream(&StyleSheetFile);
|
||||||
|
auto Stylesheet = StyleSheetStream.readAll();
|
||||||
|
StyleSheetFile.close();
|
||||||
|
d->DockManager->setStyleSheet(Stylesheet);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
void CMainWindow::createImageViewer()
|
||||||
|
{
|
||||||
|
QAction* a = qobject_cast<QAction*>(sender());
|
||||||
|
qDebug() << "createImageViewer " << a->text();
|
||||||
|
|
||||||
|
auto DockWidget = d->createImageViewer();
|
||||||
|
DockWidget->setFeature(ads::CDockWidget::DockWidgetDeleteOnClose, true);
|
||||||
|
DockWidget->setFeature(ads::CDockWidget::DockWidgetForceCloseWithArea, true);
|
||||||
|
DockWidget->setFeature(ads::CDockWidget::CustomCloseHandling, true);
|
||||||
|
DockWidget->resize(QSize(640, 480));
|
||||||
|
connect(DockWidget, &ads::CDockWidget::closeRequested, this,
|
||||||
|
&CMainWindow::onImageViewerCloseRequested);
|
||||||
|
|
||||||
|
if (a->text().startsWith("Floating"))
|
||||||
|
{
|
||||||
|
auto FloatingWidget = d->DockManager->addDockWidgetFloating(DockWidget);
|
||||||
|
FloatingWidget->move(QPoint(20, 20));
|
||||||
|
}
|
||||||
|
else if (a->text().startsWith("Docked"))
|
||||||
|
{
|
||||||
|
d->DockManager->addDockWidget(ads::RightDockWidgetArea, DockWidget);
|
||||||
|
}
|
||||||
|
else if (a->text().startsWith("Pinned"))
|
||||||
|
{
|
||||||
|
d->DockManager->addAutoHideDockWidget(ads::SideBarLeft, DockWidget);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//============================================================================
|
||||||
|
void CMainWindow::lockWorkspace(bool Value)
|
||||||
|
{
|
||||||
|
if (Value)
|
||||||
|
{
|
||||||
|
d->DockManager->lockDockWidgetFeaturesGlobally();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
d->DockManager->lockDockWidgetFeaturesGlobally(ads::CDockWidget::NoDockWidgetFeatures);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -63,6 +63,12 @@ private slots:
|
|||||||
void createEditor();
|
void createEditor();
|
||||||
void createTable();
|
void createTable();
|
||||||
void onEditorCloseRequested();
|
void onEditorCloseRequested();
|
||||||
|
void onImageViewerCloseRequested();
|
||||||
|
void showStatusDialog();
|
||||||
|
void toggleDockWidgetWindowTitle();
|
||||||
|
void applyVsStyle();
|
||||||
|
void createImageViewer();
|
||||||
|
void lockWorkspace(bool Value);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // MAINWINDOW_H
|
#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>
|
||||||
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"
|
||||||
@@ -2,50 +2,48 @@ ADS_OUT_ROOT = $${OUT_PWD}/..
|
|||||||
|
|
||||||
TARGET = AdvancedDockingSystemDemo
|
TARGET = AdvancedDockingSystemDemo
|
||||||
DESTDIR = $${ADS_OUT_ROOT}/lib
|
DESTDIR = $${ADS_OUT_ROOT}/lib
|
||||||
QT += core gui widgets
|
QT += core gui widgets quick quickwidgets
|
||||||
|
|
||||||
win32 {
|
include(../ads.pri)
|
||||||
QT += axcontainer
|
|
||||||
|
lessThan(QT_MAJOR_VERSION, 6) {
|
||||||
|
win32 {
|
||||||
|
QT += axcontainer
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CONFIG += c++14
|
CONFIG += c++14
|
||||||
CONFIG += debug_and_release
|
CONFIG += debug_and_release
|
||||||
DEFINES += QT_DEPRECATED_WARNINGS
|
DEFINES += QT_DEPRECATED_WARNINGS
|
||||||
|
RC_FILE += app.rc
|
||||||
|
|
||||||
adsBuildStatic {
|
adsBuildStatic {
|
||||||
DEFINES += ADS_STATIC
|
DEFINES += ADS_STATIC
|
||||||
}
|
}
|
||||||
|
|
||||||
SOURCES += \
|
|
||||||
main.cpp \
|
|
||||||
MainWindow.cpp
|
|
||||||
|
|
||||||
HEADERS += \
|
HEADERS += \
|
||||||
MainWindow.h
|
MainWindow.h \
|
||||||
|
StatusDialog.h \
|
||||||
|
ImageViewer.h \
|
||||||
|
RenderWidget.h
|
||||||
|
|
||||||
|
SOURCES += \
|
||||||
|
main.cpp \
|
||||||
|
MainWindow.cpp \
|
||||||
|
StatusDialog.cpp \
|
||||||
|
ImageViewer.cpp \
|
||||||
|
RenderWidget.cpp
|
||||||
|
|
||||||
FORMS += \
|
FORMS += \
|
||||||
mainwindow.ui
|
mainwindow.ui \
|
||||||
|
StatusDialog.ui
|
||||||
|
|
||||||
RESOURCES += demo.qrc
|
RESOURCES += demo.qrc
|
||||||
|
|
||||||
|
|
||||||
LIBS += -L$${ADS_OUT_ROOT}/lib
|
LIBS += -L$${ADS_OUT_ROOT}/lib
|
||||||
|
|
||||||
# Dependency: AdvancedDockingSystem (shared)
|
|
||||||
CONFIG(debug, debug|release){
|
|
||||||
win32 {
|
|
||||||
LIBS += -lqtadvanceddockingd
|
|
||||||
}
|
|
||||||
else:mac {
|
|
||||||
LIBS += -lqtadvanceddocking_debug
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
LIBS += -lqtadvanceddocking
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
LIBS += -lqtadvanceddocking
|
|
||||||
}
|
|
||||||
|
|
||||||
INCLUDEPATH += ../src
|
INCLUDEPATH += ../src
|
||||||
DEPENDPATH += ../src
|
DEPENDPATH += ../src
|
||||||
|
|||||||
@@ -13,5 +13,31 @@
|
|||||||
<file>app.css</file>
|
<file>app.css</file>
|
||||||
<file>images/plus.svg</file>
|
<file>images/plus.svg</file>
|
||||||
<file>images/help_outline.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>
|
</qresource>
|
||||||
</RCC>
|
</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 |
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/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/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/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 |
6
demo/images/lock_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>lock_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="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.34zM768,426.67h-512v426.66h512zM379.73,341.33h264.54v-85.33c0,-72.96 -59.31,-132.27 -132.27,-132.27c-72.96,0 -132.27,59.31 -132.27,132.27zM426.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: 972 B |
6
demo/images/panorama.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>panorama 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,853.33h-768c-46.93,0 -85.33,-38.4 -85.33,-85.33v-512c0,-46.93 38.4,-85.33 85.33,-85.33h768c46.93,0 85.33,38.4 85.33,85.33v512c0,46.93 -38.4,85.33 -85.33,85.33zM213.33,725.33h597.34l-192,-256l-149.34,192.43l-106.66,-128.43z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 643 B |
6
demo/images/perm_media.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>perm_media 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="M1024,256v426.67c0,46.93 -38.4,85.33 -85.33,85.33h-682.67c-46.93,0 -85.33,-38.4 -85.33,-85.33l0.42,-512c0,-46.93 37.98,-85.34 84.91,-85.34h256l85.33,85.34h341.34c46.93,0 85.33,38.4 85.33,85.33zM85.33,853.33h768v85.34h-768c-46.93,0 -85.33,-38.41 -85.33,-85.34l0.43,-384h-0.43v-213.33h85.33zM896,640l-149.33,-192l-106.67,128.43l-149.33,-192.43l-192,256z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 769 B |
6
demo/images/photo.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>photo 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="M810.67,896h-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.33v597.34c0,46.93 -38.4,85.33 -85.33,85.33zM213.33,768h597.34l-192,-256l-149.34,192.43l-106.66,-128.43z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 649 B |
6
demo/images/tab.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>tab 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,384h-341.33v-170.67h-426.67v597.34h768z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 628 B |
6
demo/images/zoom_in.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>zoom_in 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="M874.24,810.67l-63.57,63.57l-213.34,-212.91v-33.7l-11.52,-11.95c-48.64,41.81 -111.79,66.99 -180.48,66.99c-153.17,0 -277.33,-124.17 -277.33,-277.34c0,-153.17 124.16,-277.33 277.33,-277.33c153.17,0 277.34,124.16 277.34,277.33c0,68.69 -25.18,131.84 -66.99,180.48l11.95,11.52h33.7zM597.33,405.33c0,-106.24 -85.76,-192 -192,-192c-106.24,0 -192,85.76 -192,192c0,106.24 85.76,192 192,192c106.24,0 192,-85.76 192,-192zM512,426.67h-85.33v85.33h-42.67v-85.33h-85.33v-42.67h85.33v-85.33h42.67v85.33h85.33z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 909 B |
6
demo/images/zoom_out.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>zoom_out 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="M874.24,810.67l-63.57,63.57l-213.34,-212.91v-33.7l-11.52,-11.95c-48.64,41.81 -111.79,66.99 -180.48,66.99c-153.17,0 -277.33,-124.17 -277.33,-277.34c0,-153.17 124.16,-277.33 277.33,-277.33c153.17,0 277.34,124.16 277.34,277.33c0,68.69 -25.18,131.84 -66.99,180.48l11.95,11.52h33.7zM597.33,405.33c0,-106.24 -85.76,-192 -192,-192c-106.24,0 -192,85.76 -192,192c0,106.24 85.76,192 192,192c106.24,0 192,-85.76 192,-192zM298.67,384h213.33v42.67h-213.33z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 859 B |
6
demo/images/zoom_out_map.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>zoom_out_map 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,896h-256l98.13,-98.13l-123.3,-122.46l60.58,-60.58l122.46,123.3l98.13,-98.13zM896,128v256l-98.13,-98.13l-122.46,123.3l-60.58,-60.58l123.3,-122.46l-98.13,-98.13zM128,896v-256l98.13,98.13l122.46,-123.3l60.58,60.58l-123.3,122.46l98.13,98.13zM128,128h256l-98.13,98.13l123.3,122.46l-60.58,60.58l-122.46,-123.3l-98.13,98.13z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 742 B |
@@ -35,24 +35,29 @@ void myMessageOutput(QtMsgType type, const QMessageLogContext &context, const QS
|
|||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
|
#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
|
||||||
QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
|
QCoreApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
|
||||||
#if QT_VERSION >= 0x050600
|
#if QT_VERSION >= 0x050600
|
||||||
QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
|
QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
QApplication::setAttribute(Qt::AA_ShareOpenGLContexts);
|
||||||
std::shared_ptr<int> b;
|
std::shared_ptr<int> b;
|
||||||
QApplication a(argc, argv);
|
QApplication a(argc, argv);
|
||||||
|
a.setApplicationName("Advanced Docking System Demo");
|
||||||
a.setQuitOnLastWindowClosed(true);
|
a.setQuitOnLastWindowClosed(true);
|
||||||
|
a.setWindowIcon(QIcon(":/adsdemo/images/ads_icon2.svg"));
|
||||||
QFile StyleSheetFile(":/adsdemo/app.css");
|
|
||||||
StyleSheetFile.open(QIODevice::ReadOnly);
|
|
||||||
QTextStream StyleSheetStream(&StyleSheetFile);
|
|
||||||
a.setStyleSheet(StyleSheetStream.readAll());
|
|
||||||
StyleSheetFile.close();
|
|
||||||
|
|
||||||
qInstallMessageHandler(myMessageOutput);
|
qInstallMessageHandler(myMessageOutput);
|
||||||
qDebug() << "Message handler test";
|
qDebug() << "Message handler test";
|
||||||
|
|
||||||
CMainWindow mw;
|
CMainWindow mw;
|
||||||
mw.show();
|
mw.show();
|
||||||
|
|
||||||
|
QFile StyleSheetFile(":/adsdemo/app.css");
|
||||||
|
StyleSheetFile.open(QIODevice::ReadOnly);
|
||||||
|
QTextStream StyleSheetStream(&StyleSheetFile);
|
||||||
|
a.setStyleSheet(StyleSheetStream.readAll());
|
||||||
|
StyleSheetFile.close();
|
||||||
return a.exec();
|
return a.exec();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ from PyQt5 import uic
|
|||||||
from PyQt5.QtCore import (QCoreApplication, QDir, Qt, QSettings, QSignalBlocker,
|
from PyQt5.QtCore import (QCoreApplication, QDir, Qt, QSettings, QSignalBlocker,
|
||||||
QRect, QPoint, qDebug, qInstallMessageHandler,
|
QRect, QPoint, qDebug, qInstallMessageHandler,
|
||||||
QtDebugMsg, QtInfoMsg, QtWarningMsg,
|
QtDebugMsg, QtInfoMsg, QtWarningMsg,
|
||||||
QtCriticalMsg, QtFatalMsg)
|
QtCriticalMsg, QtFatalMsg, QSize)
|
||||||
from PyQt5.QtGui import (QGuiApplication, QIcon, QCloseEvent)
|
from PyQt5.QtGui import (QGuiApplication, QIcon, QCloseEvent)
|
||||||
from PyQt5.QtWidgets import (QCalendarWidget, QFileSystemModel, QFrame, QLabel,
|
from PyQt5.QtWidgets import (QCalendarWidget, QFileSystemModel, QFrame, QLabel,
|
||||||
QMenu, QTreeView, QAction, QWidgetAction,
|
QMenu, QTreeView, QAction, QWidgetAction,
|
||||||
@@ -25,6 +25,7 @@ else:
|
|||||||
from PyQtAds import QtAds
|
from PyQtAds import QtAds
|
||||||
|
|
||||||
import rc # pyrcc5 demo.qrc -o rc.py
|
import rc # pyrcc5 demo.qrc -o rc.py
|
||||||
|
from status_dialog import CStatusDialog
|
||||||
|
|
||||||
UI_FILE = os.path.join(os.path.dirname(__file__), 'mainwindow.ui')
|
UI_FILE = os.path.join(os.path.dirname(__file__), 'mainwindow.ui')
|
||||||
MainWindowUI, MainWindowBase = uic.loadUiType(UI_FILE)
|
MainWindowUI, MainWindowBase = uic.loadUiType(UI_FILE)
|
||||||
@@ -47,7 +48,7 @@ def features_string(dock_widget: QtAds.CDockWidget) -> str:
|
|||||||
f = dock_widget.features()
|
f = dock_widget.features()
|
||||||
closable = f & QtAds.CDockWidget.DockWidgetClosable
|
closable = f & QtAds.CDockWidget.DockWidgetClosable
|
||||||
movable = f & QtAds.CDockWidget.DockWidgetMovable
|
movable = f & QtAds.CDockWidget.DockWidgetMovable
|
||||||
floatable = f &QtAds.CDockWidget.DockWidgetFloatable
|
floatable = f & QtAds.CDockWidget.DockWidgetFloatable
|
||||||
|
|
||||||
return "c{} m{} f{}".format("+" if closable else "-",
|
return "c{} m{} f{}".format("+" if closable else "-",
|
||||||
"+" if movable else "-",
|
"+" if movable else "-",
|
||||||
@@ -64,122 +65,21 @@ def append_feature_string_to_window_title(dock_widget: QtAds.CDockWidget):
|
|||||||
def svg_icon(filename: str):
|
def svg_icon(filename: str):
|
||||||
'''Helper function to create an SVG icon'''
|
'''Helper function to create an SVG icon'''
|
||||||
# This is a workaround, because because in item views SVG icons are not
|
# This is a workaround, because because in item views SVG icons are not
|
||||||
# properly scaled an look blurry or pixelate
|
# properly scaled and look blurry or pixelate
|
||||||
icon = QIcon(filename)
|
icon = QIcon(filename)
|
||||||
icon.addPixmap(icon.pixmap(92))
|
icon.addPixmap(icon.pixmap(92))
|
||||||
return icon
|
return icon
|
||||||
|
|
||||||
|
|
||||||
def create_long_text_label_dock_widget(view_menu: QMenu) -> QtAds.CDockWidget:
|
class CMinSizeTableWidget(QTableWidget):
|
||||||
label = QLabel()
|
"""Custom QTableWidget with a minimum size hint to test CDockWidget
|
||||||
label.setWordWrap(True)
|
setMinimumSizeHintMode() function of CDockWidget"""
|
||||||
label.setAlignment(Qt.AlignTop | Qt.AlignLeft)
|
|
||||||
label.setText('''\
|
|
||||||
Label {} {} - Lorem ipsum dolor sit amet, consectetuer
|
|
||||||
adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum
|
|
||||||
sociis natoque penatibus et magnis dis parturient montes, nascetur
|
|
||||||
ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium
|
|
||||||
quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla
|
|
||||||
vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut,
|
|
||||||
imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis
|
|
||||||
pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi.
|
|
||||||
Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu,
|
|
||||||
consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra
|
|
||||||
quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet.
|
|
||||||
'''.format(_State.label_count, datetime.datetime.now().strftime("%H:%M:%S:%f")))
|
|
||||||
dock_widget = QtAds.CDockWidget("Label {}".format(_State.label_count))
|
|
||||||
_State.label_count += 1
|
|
||||||
dock_widget.setWidget(label)
|
|
||||||
|
|
||||||
view_menu.addAction(dock_widget.toggleViewAction())
|
def minimumSizeHint(self) -> QSize:
|
||||||
return dock_widget
|
return QSize(300, 100)
|
||||||
|
|
||||||
|
|
||||||
def create_calendar_dock_widget(view_menu: QMenu) -> QtAds.CDockWidget:
|
class CCustomComponentsFactory(QtAds.CDockComponentsFactory):
|
||||||
widget = QCalendarWidget()
|
|
||||||
|
|
||||||
dock_widget = QtAds.CDockWidget("Calendar {}".format(_State.calendar_count))
|
|
||||||
_State.calendar_count += 1
|
|
||||||
dock_widget.setWidget(widget)
|
|
||||||
dock_widget.setToggleViewActionMode(QtAds.CDockWidget.ActionModeShow)
|
|
||||||
dock_widget.setIcon(svg_icon(":/adsdemo/images/date_range.svg"))
|
|
||||||
view_menu.addAction(dock_widget.toggleViewAction())
|
|
||||||
return dock_widget
|
|
||||||
|
|
||||||
|
|
||||||
def create_file_system_tree_dock_widget(view_menu: QMenu) -> QtAds.CDockWidget:
|
|
||||||
widget = QTreeView()
|
|
||||||
widget.setFrameShape(QFrame.NoFrame)
|
|
||||||
|
|
||||||
m = QFileSystemModel(widget)
|
|
||||||
m.setRootPath(QDir.currentPath())
|
|
||||||
widget.setModel(m)
|
|
||||||
|
|
||||||
dock_widget = QtAds.CDockWidget("Filesystem {}".format(_State.file_system_count))
|
|
||||||
_State.file_system_count += 1
|
|
||||||
dock_widget.setWidget(widget)
|
|
||||||
view_menu.addAction(dock_widget.toggleViewAction())
|
|
||||||
return dock_widget
|
|
||||||
|
|
||||||
|
|
||||||
def create_editor_widget(view_menu: QMenu) -> QtAds.CDockWidget:
|
|
||||||
widget = QPlainTextEdit()
|
|
||||||
widget.setPlaceholderText("This is an editor. If you close the editor, it will be "
|
|
||||||
"deleted. Enter your text here.")
|
|
||||||
widget.setStyleSheet("border: none")
|
|
||||||
dock_widget = QtAds.CDockWidget("Editor {}".format(_State.editor_count))
|
|
||||||
_State.editor_count += 1
|
|
||||||
dock_widget.setWidget(widget)
|
|
||||||
dock_widget.setIcon(svg_icon(":/adsdemo/images/edit.svg"))
|
|
||||||
dock_widget.setFeature(QtAds.CDockWidget.CustomCloseHandling, True)
|
|
||||||
view_menu.addAction(dock_widget.toggleViewAction())
|
|
||||||
|
|
||||||
options_menu = QMenu(dock_widget)
|
|
||||||
options_menu.setTitle("Options")
|
|
||||||
options_menu.setToolTip(options_menu.title())
|
|
||||||
options_menu.setIcon(svg_icon(":/adsdemo/images/custom-menu-button.svg"))
|
|
||||||
menu_action = options_menu.menuAction()
|
|
||||||
# The object name of the action will be set for the QToolButton that
|
|
||||||
# is created in the dock area title bar. You can use this name for CSS
|
|
||||||
# styling
|
|
||||||
menu_action.setObjectName("options_menu")
|
|
||||||
dock_widget.setTitleBarActions([options_menu.menuAction()])
|
|
||||||
a = options_menu.addAction("Clear Editor")
|
|
||||||
a.triggered.connect(widget.clear)
|
|
||||||
|
|
||||||
return dock_widget
|
|
||||||
|
|
||||||
|
|
||||||
def create_table_widget(view_menu: QMenu) -> QtAds.CDockWidget:
|
|
||||||
widget = QTableWidget()
|
|
||||||
dock_widget = QtAds.CDockWidget("Table {}".format(_State.table_count))
|
|
||||||
_State.table_count += 1
|
|
||||||
COLCOUNT = 5
|
|
||||||
ROWCOUNT = 30
|
|
||||||
widget.setColumnCount(COLCOUNT)
|
|
||||||
widget.setRowCount(ROWCOUNT)
|
|
||||||
for col in range(ROWCOUNT):
|
|
||||||
widget.setHorizontalHeaderItem(col, QTableWidgetItem("Col {}".format(col+1)))
|
|
||||||
for row in range(ROWCOUNT):
|
|
||||||
widget.setItem(row, col, QTableWidgetItem("T {:}-{:}".format(row+1, col+1)))
|
|
||||||
|
|
||||||
dock_widget.setWidget(widget)
|
|
||||||
dock_widget.setIcon(svg_icon(":/adsdemo/images/grid_on.svg"))
|
|
||||||
view_menu.addAction(dock_widget.toggleViewAction())
|
|
||||||
return dock_widget
|
|
||||||
|
|
||||||
|
|
||||||
if ACTIVEX_AVAILABLE:
|
|
||||||
def create_activex_widget(view_menu: QMenu, parent: QWidget = None) -> QtAds.CDockWidget:
|
|
||||||
widget = QAxWidget("{6bf52a52-394a-11d3-b153-00c04f79faa6}", parent)
|
|
||||||
dock_widget = QtAds.CDockWidget("Active X {}".format(_State.activex_count))
|
|
||||||
_State.activex_count += 1
|
|
||||||
dock_widget.setWidget(widget)
|
|
||||||
view_menu.addAction(dock_widget.toggleViewAction())
|
|
||||||
return dock_widget
|
|
||||||
|
|
||||||
|
|
||||||
class CustomComponentsFactory(QtAds.CDockComponentsFactory):
|
|
||||||
|
|
||||||
def createDockAreaTitleBar(self, dock_area: QtAds.CDockAreaWidget) -> QtAds.CDockAreaTitleBar:
|
def createDockAreaTitleBar(self, dock_area: QtAds.CDockAreaWidget) -> QtAds.CDockAreaTitleBar:
|
||||||
title_bar = QtAds.CDockAreaTitleBar(dock_area)
|
title_bar = QtAds.CDockAreaTitleBar(dock_area)
|
||||||
@@ -192,7 +92,6 @@ class CustomComponentsFactory(QtAds.CDockComponentsFactory):
|
|||||||
return title_bar
|
return title_bar
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class MainWindow(MainWindowUI, MainWindowBase):
|
class MainWindow(MainWindowUI, MainWindowBase):
|
||||||
save_perspective_action: QAction
|
save_perspective_action: QAction
|
||||||
perspective_list_action: QWidgetAction
|
perspective_list_action: QWidgetAction
|
||||||
@@ -205,6 +104,8 @@ class MainWindow(MainWindowUI, MainWindowBase):
|
|||||||
self.perspective_list_action = None
|
self.perspective_list_action = None
|
||||||
self.perspective_combo_box = None
|
self.perspective_combo_box = None
|
||||||
self.dock_manager = None
|
self.dock_manager = None
|
||||||
|
self.window_title_test_dock_widget = None
|
||||||
|
self.last_docked_editor = None
|
||||||
|
|
||||||
self.setupUi(self)
|
self.setupUi(self)
|
||||||
self.create_actions()
|
self.create_actions()
|
||||||
@@ -213,13 +114,47 @@ class MainWindow(MainWindowUI, MainWindowBase):
|
|||||||
# a QToolButton instead of a QPushButton
|
# a QToolButton instead of a QPushButton
|
||||||
# QtAds.CDockManager.setConfigFlags(QtAds.CDockManager.configFlags() | QtAds.CDockManager.TabCloseButtonIsToolButton)
|
# QtAds.CDockManager.setConfigFlags(QtAds.CDockManager.configFlags() | QtAds.CDockManager.TabCloseButtonIsToolButton)
|
||||||
|
|
||||||
|
# uncomment the following line if you want to use opaque undocking and
|
||||||
|
# opaque splitter resizing
|
||||||
|
#QtAds.CDockManager.setConfigFlags(QtAds.CDockManager.DefaultOpaqueConfig)
|
||||||
|
|
||||||
# uncomment the following line if you want a fixed tab width that does
|
# uncomment the following line if you want a fixed tab width that does
|
||||||
# not change if the visibility of the close button changes
|
# not change if the visibility of the close button changes
|
||||||
# QtAds.CDockManager.setConfigFlag(QtAds.CDockManager.RetainTabSizeWhenCloseButtonHidden, True)
|
#QtAds.CDockManager.setConfigFlag(QtAds.CDockManager.RetainTabSizeWhenCloseButtonHidden, True)
|
||||||
|
|
||||||
# uncomment the follwing line if you want to use non opaque undocking and splitter
|
# uncomment the following line if you don't want close button on DockArea's title bar
|
||||||
# movements
|
#QtAds.CDockManager.setConfigFlag(QtAds.CDockManager.DockAreaHasCloseButton, False)
|
||||||
# QtAds.CDockManager.setConfigFlags(QtAds.CDockManager.DefaultNonOpaqueConfig)
|
|
||||||
|
# uncomment the following line if you don't want undock button on DockArea's title bar
|
||||||
|
#QtAds.CDockManager.setConfigFlag(QtAds.CDockManager.DockAreaHasUndockButton, False)
|
||||||
|
|
||||||
|
# uncomment the following line if you don't want tabs menu button on DockArea's title bar
|
||||||
|
#QtAds.CDockManager.setConfigFlag(QtAds.CDockManager.DockAreaHasTabsMenuButton, False)
|
||||||
|
|
||||||
|
# uncomment the following line if you don't want disabled buttons to appear on DockArea's title bar
|
||||||
|
#QtAds.CDockManager.setConfigFlag(QtAds.CDockManager.DockAreaHideDisabledButtons, True)
|
||||||
|
|
||||||
|
# uncomment the following line if you want to show tabs menu button on DockArea's title bar only when there are more than one tab and at least of them has elided title
|
||||||
|
#QtAds.CDockManager.setConfigFlag(QtAds.CDockManager.DockAreaDynamicTabsMenuButtonVisibility, True)
|
||||||
|
|
||||||
|
# uncomment the following line if you want floating container to always show application title instead of active dock widget's title
|
||||||
|
#QtAds.CDockManager.setConfigFlag(QtAds.CDockManager.FloatingContainerHasWidgetTitle, False)
|
||||||
|
|
||||||
|
# uncomment the following line if you want floating container to show active dock widget's icon instead of always showing application icon
|
||||||
|
#QtAds.CDockManager.setConfigFlag(QtAds.CDockManager.FloatingContainerHasWidgetIcon, True)
|
||||||
|
|
||||||
|
# uncomment the following line if you want a central widget in the main dock container (the dock manager) without a titlebar
|
||||||
|
# If you enable this code, you can test it in the demo with the Calendar 0
|
||||||
|
# dock widget.
|
||||||
|
#QtAds.CDockManager.setConfigFlag(QtAds.CDockManager.HideSingleCentralWidgetTitleBar, True)
|
||||||
|
|
||||||
|
# uncomment the following line to enable focus highlighting of the dock
|
||||||
|
# widget that has the focus
|
||||||
|
QtAds.CDockManager.setConfigFlag(QtAds.CDockManager.FocusHighlighting, True)
|
||||||
|
|
||||||
|
# uncomment if you would like to enable an equal distribution of the
|
||||||
|
# available size of a splitter to all contained dock widgets
|
||||||
|
# QtAds.CDockManager.setConfigFlag(QtAds.CDockManager.EqualSplitOnInsertion, True)
|
||||||
|
|
||||||
# Now create the dock manager and its content
|
# Now create the dock manager and its content
|
||||||
self.dock_manager = QtAds.CDockManager(self)
|
self.dock_manager = QtAds.CDockManager(self)
|
||||||
@@ -242,19 +177,19 @@ class MainWindow(MainWindowUI, MainWindowBase):
|
|||||||
|
|
||||||
def create_content(self):
|
def create_content(self):
|
||||||
# Test container docking
|
# Test container docking
|
||||||
view_menu = self.menuView
|
dock_widget = self.create_calendar_dock_widget()
|
||||||
dock_widget = create_calendar_dock_widget(view_menu)
|
|
||||||
dock_widget.setFeature(QtAds.CDockWidget.DockWidgetClosable, False)
|
dock_widget.setFeature(QtAds.CDockWidget.DockWidgetClosable, False)
|
||||||
dock_widget.setFeature(QtAds.CDockWidget.DockWidgetMovable, False)
|
|
||||||
dock_widget.setFeature(QtAds.CDockWidget.DockWidgetFloatable, False)
|
|
||||||
special_dock_area = self.dock_manager.addDockWidget(QtAds.LeftDockWidgetArea, dock_widget)
|
special_dock_area = self.dock_manager.addDockWidget(QtAds.LeftDockWidgetArea, dock_widget)
|
||||||
|
|
||||||
# For this Special Dock Area we want to avoid dropping on the center of it (i.e. we don't want this widget to be ever tabbified):
|
# For this Special Dock Area we want to avoid dropping on the center of it (i.e. we don't want this widget to be ever tabbified):
|
||||||
special_dock_area.setAllowedAreas(QtAds.OuterDockAreas)
|
special_dock_area.setAllowedAreas(QtAds.OuterDockAreas)
|
||||||
# special_dock_area.setAllowedAreas(QtAds.LeftDockWidgetArea | QtAds.RightDockWidgetArea) # just for testing
|
# special_dock_area.setAllowedAreas(QtAds.LeftDockWidgetArea | QtAds.RightDockWidgetArea) # just for testing
|
||||||
|
|
||||||
self.dock_manager.addDockWidget(QtAds.LeftDockWidgetArea, create_long_text_label_dock_widget(view_menu))
|
dock_widget = self.create_long_text_label_dock_widget()
|
||||||
file_system_widget = create_file_system_tree_dock_widget(view_menu)
|
self.window_title_test_dock_widget = dock_widget
|
||||||
|
dock_widget.setFeature(QtAds.CDockWidget.DockWidgetFocusable, False)
|
||||||
|
self.dock_manager.addDockWidget(QtAds.LeftDockWidgetArea, dock_widget)
|
||||||
|
file_system_widget = self.create_file_system_tree_dock_widget()
|
||||||
tool_bar = file_system_widget.createDefaultToolBar()
|
tool_bar = file_system_widget.createDefaultToolBar()
|
||||||
tool_bar.addAction(self.actionSaveState)
|
tool_bar.addAction(self.actionSaveState)
|
||||||
tool_bar.addAction(self.actionRestoreState)
|
tool_bar.addAction(self.actionRestoreState)
|
||||||
@@ -262,29 +197,35 @@ class MainWindow(MainWindowUI, MainWindowBase):
|
|||||||
append_feature_string_to_window_title(file_system_widget)
|
append_feature_string_to_window_title(file_system_widget)
|
||||||
self.dock_manager.addDockWidget(QtAds.BottomDockWidgetArea, file_system_widget)
|
self.dock_manager.addDockWidget(QtAds.BottomDockWidgetArea, file_system_widget)
|
||||||
|
|
||||||
file_system_widget = create_file_system_tree_dock_widget(view_menu)
|
file_system_widget = self.create_file_system_tree_dock_widget()
|
||||||
tool_bar = file_system_widget.createDefaultToolBar()
|
|
||||||
tool_bar.addAction(self.actionSaveState)
|
|
||||||
tool_bar.addAction(self.actionRestoreState)
|
|
||||||
file_system_widget.setFeature(QtAds.CDockWidget.DockWidgetMovable, False)
|
file_system_widget.setFeature(QtAds.CDockWidget.DockWidgetMovable, False)
|
||||||
file_system_widget.setFeature(QtAds.CDockWidget.DockWidgetFloatable, False)
|
file_system_widget.setFeature(QtAds.CDockWidget.DockWidgetFloatable, False)
|
||||||
append_feature_string_to_window_title(file_system_widget)
|
append_feature_string_to_window_title(file_system_widget)
|
||||||
|
|
||||||
# Test custom factory - we inject a help button into the title bar
|
# Test custom factory - we inject a help button into the title bar
|
||||||
self.factory = CustomComponentsFactory()
|
QtAds.CDockComponentsFactory.setFactory(CCustomComponentsFactory())
|
||||||
QtAds.CDockComponentsFactory.setFactory(self.factory)
|
|
||||||
top_dock_area = self.dock_manager.addDockWidget(QtAds.TopDockWidgetArea, file_system_widget)
|
top_dock_area = self.dock_manager.addDockWidget(QtAds.TopDockWidgetArea, file_system_widget)
|
||||||
|
# Uncomment the next line if you would like to test the
|
||||||
|
# HideSingleWidgetTitleBar functionality
|
||||||
|
# top_dock_area.setDockAreaFlag(QtAds.CDockAreaWidget.HideSingleWidgetTitleBar, True)
|
||||||
QtAds.CDockComponentsFactory.resetDefaultFactory()
|
QtAds.CDockComponentsFactory.resetDefaultFactory()
|
||||||
|
|
||||||
|
|
||||||
# We create a calendar widget and clear all flags to prevent the dock area
|
# We create a calendar widget and clear all flags to prevent the dock area
|
||||||
# from closing
|
# from closing
|
||||||
dock_widget = create_calendar_dock_widget(view_menu)
|
dock_widget = self.create_calendar_dock_widget()
|
||||||
dock_widget.setFeature(QtAds.CDockWidget.DockWidgetClosable, False)
|
|
||||||
dock_widget.setFeature(QtAds.CDockWidget.DockWidgetMovable, False)
|
|
||||||
dock_widget.setFeature(QtAds.CDockWidget.DockWidgetFloatable, False)
|
|
||||||
dock_widget.setTabToolTip("Tab ToolTip\nHodie est dies magna")
|
dock_widget.setTabToolTip("Tab ToolTip\nHodie est dies magna")
|
||||||
dock_area = self.dock_manager.addDockWidget(QtAds.CenterDockWidgetArea, dock_widget, top_dock_area)
|
dock_area = self.dock_manager.addDockWidget(QtAds.CenterDockWidgetArea, dock_widget, top_dock_area)
|
||||||
|
# Now we create a action to test resizing of DockArea widget
|
||||||
|
action = self.menuTests.addAction("Resize {}".format(dock_widget.windowTitle()))
|
||||||
|
def action_triggered():
|
||||||
|
splitter = QtAds.internal.findParent(QtAds.CDockSplitter, dock_area)
|
||||||
|
if not splitter:
|
||||||
|
return
|
||||||
|
# We change the sizes of the splitter that contains the Calendar 1 widget
|
||||||
|
# to resize the dock widget
|
||||||
|
width = splitter.width()
|
||||||
|
splitter.setSizes([width * 2/3, width * 1/3])
|
||||||
|
action.triggered.connect(action_triggered)
|
||||||
|
|
||||||
# Now we add a custom button to the dock area title bar that will create
|
# Now we add a custom button to the dock area title bar that will create
|
||||||
# new editor widgets when clicked
|
# new editor widgets when clicked
|
||||||
@@ -292,11 +233,12 @@ class MainWindow(MainWindowUI, MainWindowBase):
|
|||||||
custom_button.setToolTip("Create Editor")
|
custom_button.setToolTip("Create Editor")
|
||||||
custom_button.setIcon(svg_icon(":/adsdemo/images/plus.svg"))
|
custom_button.setIcon(svg_icon(":/adsdemo/images/plus.svg"))
|
||||||
custom_button.setAutoRaise(True)
|
custom_button.setAutoRaise(True)
|
||||||
|
|
||||||
title_bar = dock_area.titleBar()
|
title_bar = dock_area.titleBar()
|
||||||
index = title_bar.indexOf(title_bar.tabBar())
|
index = title_bar.indexOf(title_bar.tabBar())
|
||||||
title_bar.insertWidget(index + 1, custom_button)
|
title_bar.insertWidget(index + 1, custom_button)
|
||||||
def on_button_clicked():
|
def on_button_clicked():
|
||||||
dock_widget = create_editor_widget(self.menuView)
|
dock_widget = self.create_editor_widget()
|
||||||
dock_widget.setFeature(QtAds.CDockWidget.DockWidgetDeleteOnClose, True)
|
dock_widget.setFeature(QtAds.CDockWidget.DockWidgetDeleteOnClose, True)
|
||||||
self.dock_manager.addDockWidgetTabToArea(dock_widget, dock_area)
|
self.dock_manager.addDockWidgetTabToArea(dock_widget, dock_area)
|
||||||
dock_widget.closeRequested.connect(self.on_editor_close_requested)
|
dock_widget.closeRequested.connect(self.on_editor_close_requested)
|
||||||
@@ -305,30 +247,35 @@ class MainWindow(MainWindowUI, MainWindowBase):
|
|||||||
# Test dock area docking
|
# Test dock area docking
|
||||||
right_dock_area = self.dock_manager.addDockWidget(
|
right_dock_area = self.dock_manager.addDockWidget(
|
||||||
QtAds.RightDockWidgetArea,
|
QtAds.RightDockWidgetArea,
|
||||||
create_long_text_label_dock_widget(view_menu), top_dock_area)
|
self.create_long_text_label_dock_widget(), top_dock_area)
|
||||||
self.dock_manager.addDockWidget(
|
self.dock_manager.addDockWidget(
|
||||||
QtAds.TopDockWidgetArea,
|
QtAds.TopDockWidgetArea,
|
||||||
create_long_text_label_dock_widget(view_menu), right_dock_area)
|
self.create_long_text_label_dock_widget(), right_dock_area)
|
||||||
|
|
||||||
bottom_dock_area = self.dock_manager.addDockWidget(
|
bottom_dock_area = self.dock_manager.addDockWidget(
|
||||||
QtAds.BottomDockWidgetArea,
|
QtAds.BottomDockWidgetArea,
|
||||||
create_long_text_label_dock_widget(view_menu), right_dock_area)
|
self.create_long_text_label_dock_widget(), right_dock_area)
|
||||||
|
|
||||||
self.dock_manager.addDockWidget(
|
self.dock_manager.addDockWidget(
|
||||||
QtAds.CenterDockWidgetArea,
|
QtAds.CenterDockWidgetArea,
|
||||||
create_long_text_label_dock_widget(view_menu), right_dock_area)
|
self.create_long_text_label_dock_widget(), right_dock_area)
|
||||||
self.dock_manager.addDockWidget(
|
self.dock_manager.addDockWidget(
|
||||||
QtAds.CenterDockWidgetArea,
|
QtAds.CenterDockWidgetArea,
|
||||||
create_long_text_label_dock_widget(view_menu), bottom_dock_area)
|
self.create_long_text_label_dock_widget(), bottom_dock_area)
|
||||||
|
|
||||||
action = self.menuView.addAction("Set {} floating".format(dock_widget.windowTitle()))
|
|
||||||
|
action = self.menuTests.addAction("Set {} Floating".format(dock_widget.windowTitle()))
|
||||||
action.triggered.connect(dock_widget.setFloating)
|
action.triggered.connect(dock_widget.setFloating)
|
||||||
|
action = self.menuTests.addAction("Set {} As Current Tab".format(dock_widget.windowTitle()))
|
||||||
|
action.triggered.connect(dock_widget.setAsCurrentTab)
|
||||||
|
action = self.menuTests.addAction("Raise {}".format(dock_widget.windowTitle()))
|
||||||
|
action.triggered.connect(dock_widget.raise_)
|
||||||
|
|
||||||
if ACTIVEX_AVAILABLE:
|
if ACTIVEX_AVAILABLE:
|
||||||
flags = self.dock_manager.configFlags()
|
flags = self.dock_manager.configFlags()
|
||||||
if flags & QtAds.CDockManager.OpaqueUndocking:
|
if flags & QtAds.CDockManager.OpaqueUndocking:
|
||||||
self.dock_manager.addDockWidget(QtAds.CenterDockWidgetArea,
|
self.dock_manager.addDockWidget(QtAds.CenterDockWidgetArea,
|
||||||
create_activex_widget(view_menu), right_dock_area)
|
self.create_activex_widget(), right_dock_area)
|
||||||
|
|
||||||
for dock_widget in self.dock_manager.dockWidgetsMap().values():
|
for dock_widget in self.dock_manager.dockWidgetsMap().values():
|
||||||
dock_widget.viewToggled.connect(self.on_view_toggled)
|
dock_widget.viewToggled.connect(self.on_view_toggled)
|
||||||
@@ -353,25 +300,41 @@ class MainWindow(MainWindowUI, MainWindowBase):
|
|||||||
self.toolBar.addAction(self.perspective_list_action)
|
self.toolBar.addAction(self.perspective_list_action)
|
||||||
self.toolBar.addAction(self.save_perspective_action)
|
self.toolBar.addAction(self.save_perspective_action)
|
||||||
|
|
||||||
a = self.toolBar.addAction("Create Editor")
|
a = self.toolBar.addAction("Create Floating Editor")
|
||||||
|
a.setProperty("Floating", True)
|
||||||
a.setToolTip("Creates floating dynamic dockable editor windows that are deleted on close")
|
a.setToolTip("Creates floating dynamic dockable editor windows that are deleted on close")
|
||||||
a.setIcon(svg_icon(":/adsdemo/images/note_add.svg"))
|
a.setIcon(svg_icon(":/adsdemo/images/note_add.svg"))
|
||||||
a.triggered.connect(self.create_editor)
|
a.triggered.connect(self.create_editor)
|
||||||
|
self.menuTests.addAction(a)
|
||||||
|
|
||||||
a = self.toolBar.addAction("Create Table")
|
a = self.toolBar.addAction("Create Docked Editor")
|
||||||
|
a.setProperty("Floating", False)
|
||||||
|
a.setToolTip("Creates a docked editor windows that are deleted on close")
|
||||||
|
a.setIcon(svg_icon(":/adsdemo/images/docked_editor.svg"))
|
||||||
|
a.triggered.connect(self.create_editor)
|
||||||
|
self.menuTests.addAction(a)
|
||||||
|
|
||||||
|
a = self.toolBar.addAction("Create Floating Table")
|
||||||
a.setToolTip("Creates floating dynamic dockable table with millions of entries")
|
a.setToolTip("Creates floating dynamic dockable table with millions of entries")
|
||||||
a.setIcon(svg_icon(":/adsdemo/images/grid_on.svg"))
|
a.setIcon(svg_icon(":/adsdemo/images/grid_on.svg"))
|
||||||
a.triggered.connect(self.create_table)
|
a.triggered.connect(self.create_table)
|
||||||
|
self.menuTests.addAction(a)
|
||||||
|
|
||||||
|
self.menuTests.addSeparator()
|
||||||
|
a = self.menuTests.addAction("Show Status Dialog")
|
||||||
|
a.triggered.connect(self.show_status_dialog)
|
||||||
|
self.menuTests.addSeparator()
|
||||||
|
|
||||||
def closeEvent(self, event: QCloseEvent):
|
def closeEvent(self, event: QCloseEvent):
|
||||||
self.save_state()
|
self.save_state()
|
||||||
|
self.dock_manager.deleteLater()
|
||||||
super().closeEvent(event)
|
super().closeEvent(event)
|
||||||
|
|
||||||
def on_action_save_state_triggered(state: bool):
|
def on_actionSaveState_triggered(self, state: bool):
|
||||||
qDebug("MainWindow::on_action_save_state_triggered")
|
qDebug("MainWindow::on_action_save_state_triggered")
|
||||||
self.save_state()
|
self.save_state()
|
||||||
|
|
||||||
def on_action_restore_state_triggered(state: bool):
|
def on_actionRestoreState_triggered(self, state: bool):
|
||||||
qDebug("MainWindow::on_action_restore_state_triggered")
|
qDebug("MainWindow::on_action_restore_state_triggered")
|
||||||
self.restore_state()
|
self.restore_state()
|
||||||
|
|
||||||
@@ -400,14 +363,27 @@ class MainWindow(MainWindowUI, MainWindowBase):
|
|||||||
if dock_widget is None:
|
if dock_widget is None:
|
||||||
return
|
return
|
||||||
|
|
||||||
qDebug("{} visibility_changed({})".format(dock_widget.objectName(), visible))
|
# qDebug("{} visibility_changed({})".format(dock_widget.objectName(), visible))
|
||||||
|
|
||||||
def create_editor(self):
|
def create_editor(self):
|
||||||
dock_widget = create_editor_widget(self.menuView)
|
sender = self.sender()
|
||||||
|
floating = sender.property("Floating")
|
||||||
|
dock_widget = self.create_editor_widget()
|
||||||
dock_widget.setFeature(QtAds.CDockWidget.DockWidgetDeleteOnClose, True)
|
dock_widget.setFeature(QtAds.CDockWidget.DockWidgetDeleteOnClose, True)
|
||||||
|
dock_widget.setFeature(QtAds.CDockWidget.DockWidgetForceCloseWithArea, True)
|
||||||
|
dock_widget.closeRequested.connect(self.on_editor_close_requested)
|
||||||
|
|
||||||
|
if floating:
|
||||||
floating_widget = self.dock_manager.addDockWidgetFloating(dock_widget)
|
floating_widget = self.dock_manager.addDockWidgetFloating(dock_widget)
|
||||||
floating_widget.move(QPoint(20, 20))
|
floating_widget.move(QPoint(20, 20))
|
||||||
dock_widget.closeRequested.connect(self.on_editor_close_requested)
|
else:
|
||||||
|
editor_area = self.last_docked_editor.dockAreaWidget() if self.last_docked_editor is not None else None
|
||||||
|
if editor_area is not None:
|
||||||
|
self.dock_manager.setConfigFlag(QtAds.CDockManager.EqualSplitOnInsertion, True)
|
||||||
|
self.dock_manager.addDockWidget(QtAds.RightDockWidgetArea, dock_widget, editor_area)
|
||||||
|
else:
|
||||||
|
self.dock_manager.addDockWidget(QtAds.TopDockWidgetArea, dock_widget)
|
||||||
|
self.last_docked_editor = dock_widget
|
||||||
|
|
||||||
def on_editor_close_requested(self):
|
def on_editor_close_requested(self):
|
||||||
dock_widget = self.sender()
|
dock_widget = self.sender()
|
||||||
@@ -417,11 +393,25 @@ class MainWindow(MainWindowUI, MainWindowBase):
|
|||||||
dock_widget.closeDockWidget()
|
dock_widget.closeDockWidget()
|
||||||
|
|
||||||
def create_table(self):
|
def create_table(self):
|
||||||
dock_widget = create_table_widget(self.menuView)
|
dock_widget = self.create_table_widget()
|
||||||
dock_widget.setFeature(QtAds.CDockWidget.DockWidgetDeleteOnClose, True)
|
dock_widget.setFeature(QtAds.CDockWidget.DockWidgetDeleteOnClose, True)
|
||||||
floating_widget = self.dock_manager.addDockWidgetFloating(dock_widget)
|
floating_widget = self.dock_manager.addDockWidgetFloating(dock_widget)
|
||||||
floating_widget.move(QPoint(40, 40))
|
floating_widget.move(QPoint(40, 40))
|
||||||
|
|
||||||
|
def show_status_dialog(self):
|
||||||
|
dialog = CStatusDialog(self.dock_manager)
|
||||||
|
dialog.exec_()
|
||||||
|
|
||||||
|
|
||||||
|
def toggle_dock_widget_window_title(self):
|
||||||
|
title = self.window_title_test_dock_widget.windowTitle()
|
||||||
|
i = title.find(" (Test) ")
|
||||||
|
if i == -1:
|
||||||
|
title += " (Test) "
|
||||||
|
else:
|
||||||
|
title = title[i]
|
||||||
|
self.window_title_test_dock_widget.setWindowTitle(title)
|
||||||
|
|
||||||
def save_state(self):
|
def save_state(self):
|
||||||
'''
|
'''
|
||||||
Saves the dock manager state and the main window geometry
|
Saves the dock manager state and the main window geometry
|
||||||
@@ -474,6 +464,124 @@ class MainWindow(MainWindowUI, MainWindowBase):
|
|||||||
self.perspective_combo_box.setCurrentText(perspective_name)
|
self.perspective_combo_box.setCurrentText(perspective_name)
|
||||||
self.save_perspectives()
|
self.save_perspectives()
|
||||||
|
|
||||||
|
def create_long_text_label_dock_widget(self) -> QtAds.CDockWidget:
|
||||||
|
label = QLabel()
|
||||||
|
label.setWordWrap(True)
|
||||||
|
label.setAlignment(Qt.AlignTop | Qt.AlignLeft)
|
||||||
|
label.setText('''Label {} {} - Lorem ipsum dolor sit amet, consectetuer
|
||||||
|
adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum
|
||||||
|
sociis natoque penatibus et magnis dis parturient montes, nascetur
|
||||||
|
ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium
|
||||||
|
quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla
|
||||||
|
vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut,
|
||||||
|
imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis
|
||||||
|
pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi.
|
||||||
|
Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu,
|
||||||
|
consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra
|
||||||
|
quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet.
|
||||||
|
'''.format(_State.label_count, datetime.datetime.now().strftime("%H:%M:%S:%f")))
|
||||||
|
dock_widget = QtAds.CDockWidget("Label {}".format(_State.label_count))
|
||||||
|
_State.label_count += 1
|
||||||
|
dock_widget.setWidget(label)
|
||||||
|
|
||||||
|
self.menuView.addAction(dock_widget.toggleViewAction())
|
||||||
|
return dock_widget
|
||||||
|
|
||||||
|
def create_calendar_dock_widget(self) -> QtAds.CDockWidget:
|
||||||
|
widget = QCalendarWidget()
|
||||||
|
|
||||||
|
dock_widget = QtAds.CDockWidget("Calendar {}".format(_State.calendar_count))
|
||||||
|
_State.calendar_count += 1
|
||||||
|
# The following lines are for testing the setWidget() and takeWidget()
|
||||||
|
# functionality
|
||||||
|
dock_widget.setWidget(widget)
|
||||||
|
dock_widget.setWidget(widget) # what happens if we set a widget if a widget is already set
|
||||||
|
dock_widget.takeWidget() # we remove the widget
|
||||||
|
dock_widget.setWidget(widget) # and set the widget again - there should be no error
|
||||||
|
dock_widget.setToggleViewActionMode(QtAds.CDockWidget.ActionModeShow)
|
||||||
|
dock_widget.setIcon(svg_icon(":/adsdemo/images/date_range.svg"))
|
||||||
|
self.menuView.addAction(dock_widget.toggleViewAction())
|
||||||
|
return dock_widget
|
||||||
|
|
||||||
|
def create_file_system_tree_dock_widget(self) -> QtAds.CDockWidget:
|
||||||
|
widget = QTreeView()
|
||||||
|
widget.setFrameShape(QFrame.NoFrame)
|
||||||
|
|
||||||
|
m = QFileSystemModel(widget)
|
||||||
|
m.setRootPath(QDir.currentPath())
|
||||||
|
widget.setModel(m)
|
||||||
|
|
||||||
|
dock_widget = QtAds.CDockWidget("Filesystem {}".format(_State.file_system_count))
|
||||||
|
_State.file_system_count += 1
|
||||||
|
dock_widget.setWidget(widget)
|
||||||
|
self.menuView.addAction(dock_widget.toggleViewAction())
|
||||||
|
return dock_widget
|
||||||
|
|
||||||
|
def create_editor_widget(self) -> QtAds.CDockWidget:
|
||||||
|
widget = QPlainTextEdit()
|
||||||
|
widget.setPlaceholderText("This is an editor. If you close the editor, it will be "
|
||||||
|
"deleted. Enter your text here.")
|
||||||
|
widget.setStyleSheet("border: none")
|
||||||
|
dock_widget = QtAds.CDockWidget("Editor {}".format(_State.editor_count))
|
||||||
|
_State.editor_count += 1
|
||||||
|
dock_widget.setWidget(widget)
|
||||||
|
dock_widget.setIcon(svg_icon(":/adsdemo/images/edit.svg"))
|
||||||
|
dock_widget.setFeature(QtAds.CDockWidget.CustomCloseHandling, True)
|
||||||
|
self.menuView.addAction(dock_widget.toggleViewAction())
|
||||||
|
|
||||||
|
options_menu = QMenu(dock_widget)
|
||||||
|
options_menu.setTitle("Options")
|
||||||
|
options_menu.setToolTip(options_menu.title())
|
||||||
|
options_menu.setIcon(svg_icon(":/adsdemo/images/custom-menu-button.svg"))
|
||||||
|
menu_action = options_menu.menuAction()
|
||||||
|
# The object name of the action will be set for the QToolButton that
|
||||||
|
# is created in the dock area title bar. You can use this name for CSS
|
||||||
|
# styling
|
||||||
|
menu_action.setObjectName("options_menu")
|
||||||
|
dock_widget.setTitleBarActions([options_menu.menuAction()])
|
||||||
|
a = options_menu.addAction("Clear Editor")
|
||||||
|
a.triggered.connect(widget.clear)
|
||||||
|
|
||||||
|
return dock_widget
|
||||||
|
|
||||||
|
|
||||||
|
def create_table_widget(self) -> QtAds.CDockWidget:
|
||||||
|
widget = CMinSizeTableWidget()
|
||||||
|
dock_widget = QtAds.CDockWidget("Table {}".format(_State.table_count))
|
||||||
|
_State.table_count += 1
|
||||||
|
COLCOUNT = 5
|
||||||
|
ROWCOUNT = 30
|
||||||
|
widget.setColumnCount(COLCOUNT)
|
||||||
|
widget.setRowCount(ROWCOUNT)
|
||||||
|
for col in range(ROWCOUNT):
|
||||||
|
widget.setHorizontalHeaderItem(col, QTableWidgetItem("Col {}".format(col + 1)))
|
||||||
|
for row in range(ROWCOUNT):
|
||||||
|
widget.setItem(row, col, QTableWidgetItem("T {:}-{:}".format(row + 1, col + 1)))
|
||||||
|
|
||||||
|
dock_widget.setWidget(widget)
|
||||||
|
dock_widget.setIcon(svg_icon(":/adsdemo/images/grid_on.svg"))
|
||||||
|
dock_widget.setMinimumSizeHintMode(QtAds.CDockWidget.MinimumSizeHintFromContent)
|
||||||
|
toolbar = dock_widget.createDefaultToolBar()
|
||||||
|
action = toolbar.addAction(svg_icon(":/adsdemo/images/fullscreen.svg"), "Toggle Fullscreen")
|
||||||
|
|
||||||
|
def on_toggle_fullscreen():
|
||||||
|
if dock_widget.isFullScreen():
|
||||||
|
dock_widget.showNormal()
|
||||||
|
else:
|
||||||
|
dock_widget.showFullScreen()
|
||||||
|
|
||||||
|
action.triggered.connect(on_toggle_fullscreen)
|
||||||
|
self.menuView.addAction(dock_widget.toggleViewAction())
|
||||||
|
return dock_widget
|
||||||
|
|
||||||
|
def create_activex_widget(self, parent: QWidget = None) -> QtAds.CDockWidget:
|
||||||
|
widget = QAxWidget("{6bf52a52-394a-11d3-b153-00c04f79faa6}", parent)
|
||||||
|
dock_widget = QtAds.CDockWidget("Active X {}".format(_State.activex_count))
|
||||||
|
_State.activex_count += 1
|
||||||
|
dock_widget.setWidget(widget)
|
||||||
|
self.menuView.addAction(dock_widget.toggleViewAction())
|
||||||
|
return dock_widget
|
||||||
|
|
||||||
|
|
||||||
def my_message_output(type, context, msg):
|
def my_message_output(type, context, msg):
|
||||||
if type == QtDebugMsg:
|
if type == QtDebugMsg:
|
||||||
@@ -31,7 +31,6 @@
|
|||||||
<property name="title">
|
<property name="title">
|
||||||
<string>File</string>
|
<string>File</string>
|
||||||
</property>
|
</property>
|
||||||
<addaction name="actionExit"/>
|
|
||||||
<addaction name="actionSaveState"/>
|
<addaction name="actionSaveState"/>
|
||||||
<addaction name="actionRestoreState"/>
|
<addaction name="actionRestoreState"/>
|
||||||
</widget>
|
</widget>
|
||||||
@@ -45,8 +44,14 @@
|
|||||||
<string>About</string>
|
<string>About</string>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
|
<widget class="QMenu" name="menuTests">
|
||||||
|
<property name="title">
|
||||||
|
<string>Tests</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
<addaction name="menuFile"/>
|
<addaction name="menuFile"/>
|
||||||
<addaction name="menuView"/>
|
<addaction name="menuView"/>
|
||||||
|
<addaction name="menuTests"/>
|
||||||
<addaction name="menuAbout"/>
|
<addaction name="menuAbout"/>
|
||||||
</widget>
|
</widget>
|
||||||
<widget class="QToolBar" name="toolBar">
|
<widget class="QToolBar" name="toolBar">
|
||||||
|
|||||||
379
demo/res/visual_studio_light.css
Normal file
@@ -0,0 +1,379 @@
|
|||||||
|
|
||||||
|
/*
|
||||||
|
* Visual Studio like light theme
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* CDockManager
|
||||||
|
*****************************************************************************/
|
||||||
|
ads--CDockManager
|
||||||
|
{
|
||||||
|
background: palette(window);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* CDockContainerWidget
|
||||||
|
*****************************************************************************/
|
||||||
|
ads--CDockContainerWidget {
|
||||||
|
background: palette(window);
|
||||||
|
padding: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* CDockAreaWidget
|
||||||
|
*****************************************************************************/
|
||||||
|
ads--CDockAreaWidget {
|
||||||
|
background: palette(window);
|
||||||
|
/*border: 1px solid palette(dark);*/
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ads--CDockAreaTitleBar {
|
||||||
|
background: transparent;
|
||||||
|
border-bottom: 2px solid rgb(204, 204, 204);
|
||||||
|
padding-bottom: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ads--CTitleBarButton {
|
||||||
|
padding: 0px 0px;
|
||||||
|
background: transparent;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
ads--CTitleBarButton:hover {
|
||||||
|
background: rgba(0, 0, 0, 24);
|
||||||
|
}
|
||||||
|
|
||||||
|
ads--CTitleBarButton:pressed {
|
||||||
|
background: rgba(0, 0, 0, 48);
|
||||||
|
}
|
||||||
|
|
||||||
|
QScrollArea#dockWidgetScrollArea {
|
||||||
|
padding: 0px;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#tabsMenuButton::menu-indicator {
|
||||||
|
image: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#dockAreaCloseButton {
|
||||||
|
qproperty-icon: url(:/ads/images/close-button.svg),
|
||||||
|
url(:/ads/images/close-button-disabled.svg) disabled;
|
||||||
|
qproperty-iconSize: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#detachGroupButton {
|
||||||
|
qproperty-icon: url(:/ads/images/detach-button.svg),
|
||||||
|
url(:/ads/images/detach-button-disabled.svg) disabled;
|
||||||
|
qproperty-iconSize: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ads--CDockAreaWidget[focused="true"] ads--CDockAreaTitleBar {
|
||||||
|
border-bottom: 2px solid palette(highlight);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* CDockWidgetTab
|
||||||
|
*****************************************************************************/
|
||||||
|
ads--CDockWidgetTab {
|
||||||
|
background: palette(window);
|
||||||
|
border: none;
|
||||||
|
padding: 0 0px;
|
||||||
|
qproperty-iconSize: 16px 16px;/* this is optional in case you would like to change icon size*/
|
||||||
|
}
|
||||||
|
|
||||||
|
ads--CDockWidgetTab[activeTab="true"] {
|
||||||
|
background: rgb(204, 204, 204);
|
||||||
|
}
|
||||||
|
|
||||||
|
ads--CDockWidgetTab QLabel {
|
||||||
|
color: palette(foreground);
|
||||||
|
}
|
||||||
|
|
||||||
|
ads--CDockWidgetTab[activeTab="true"] QLabel {
|
||||||
|
color: palette(foreground);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#tabCloseButton {
|
||||||
|
margin-top: 2px;
|
||||||
|
background: none;
|
||||||
|
border: none;
|
||||||
|
padding: 0px -2px;
|
||||||
|
qproperty-icon: url(:/ads/images/close-button.svg),
|
||||||
|
url(:/ads/images/close-button-disabled.svg) disabled;
|
||||||
|
qproperty-iconSize: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#tabCloseButton:hover {
|
||||||
|
/*border: 1px solid rgba(0, 0, 0, 32);*/
|
||||||
|
background: rgba(0, 0, 0, 24);
|
||||||
|
}
|
||||||
|
|
||||||
|
#tabCloseButton:pressed {
|
||||||
|
background: rgba(0, 0, 0, 48);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Focus related styling */
|
||||||
|
ads--CDockWidgetTab[focused="true"] {
|
||||||
|
background: palette(highlight);
|
||||||
|
border-color: palette(highlight);
|
||||||
|
}
|
||||||
|
|
||||||
|
ads--CDockWidgetTab[focused="true"] > #tabCloseButton {
|
||||||
|
qproperty-icon: url(:/ads/images/close-button-focused.svg)
|
||||||
|
}
|
||||||
|
|
||||||
|
ads--CDockWidgetTab[focused="true"]>#tabCloseButton:hover {
|
||||||
|
background: rgba(255, 255, 255, 48);
|
||||||
|
}
|
||||||
|
|
||||||
|
ads--CDockWidgetTab[focused="true"]>#tabCloseButton:pressed {
|
||||||
|
background: rgba(255, 255, 255, 92);
|
||||||
|
}
|
||||||
|
|
||||||
|
ads--CDockWidgetTab[focused="true"] QLabel {
|
||||||
|
color: palette(light);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* CDockWidget
|
||||||
|
*****************************************************************************/
|
||||||
|
ads--CDockWidget {
|
||||||
|
background: palette(light);
|
||||||
|
border: 1px solid rgb(204, 204, 204);
|
||||||
|
border-top: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
*
|
||||||
|
* Styling of auto hide functionality
|
||||||
|
*
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* CAutoHideTab
|
||||||
|
*****************************************************************************/
|
||||||
|
ads--CAutoHideTab {
|
||||||
|
qproperty-iconSize: 16px 16px;/* this is optional in case you would like to change icon size*/
|
||||||
|
background: none;
|
||||||
|
border: none;
|
||||||
|
padding-left: 2px;
|
||||||
|
padding-right: 0px;
|
||||||
|
text-align: center;
|
||||||
|
min-height: 20px;
|
||||||
|
padding-bottom: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ads--CAutoHideTab:hover
|
||||||
|
{
|
||||||
|
color: palette(highlight);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ads--CAutoHideTab[iconOnly="false"][sideBarLocation="0"],
|
||||||
|
ads--CAutoHideTab[iconOnly="false"][sideBarLocation="2"] {
|
||||||
|
border-top: 6px solid rgba(0, 0, 0, 48);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ads--CAutoHideTab[iconOnly="false"][sideBarLocation="1"],
|
||||||
|
ads--CAutoHideTab[iconOnly="false"][sideBarLocation="3"] {
|
||||||
|
border-bottom: 6px solid rgba(0, 0, 0, 48);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
ads--CAutoHideTab:hover[iconOnly="false"][sideBarLocation="0"],
|
||||||
|
ads--CAutoHideTab:hover[iconOnly="false"][sideBarLocation="2"],
|
||||||
|
ads--CAutoHideTab[iconOnly="false"][sideBarLocation="0"][activeTab="true"],
|
||||||
|
ads--CAutoHideTab[iconOnly="false"][sideBarLocation="2"][activeTab="true"] {
|
||||||
|
border-top: 6px solid palette(highlight);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ads--CAutoHideTab:hover[iconOnly="false"][sideBarLocation="1"],
|
||||||
|
ads--CAutoHideTab:hover[iconOnly="false"][sideBarLocation="3"],
|
||||||
|
ads--CAutoHideTab[iconOnly="false"][sideBarLocation="1"][activeTab="true"],
|
||||||
|
ads--CAutoHideTab[iconOnly="false"][sideBarLocation="3"][activeTab="true"] {
|
||||||
|
border-bottom: 6px solid palette(highlight);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Auto hide tabs with icon only
|
||||||
|
*/
|
||||||
|
ads--CAutoHideTab[iconOnly="true"][sideBarLocation="0"] {
|
||||||
|
border-top: 6px solid rgba(0, 0, 0, 48);
|
||||||
|
}
|
||||||
|
|
||||||
|
ads--CAutoHideTab[iconOnly="true"][sideBarLocation="1"] {
|
||||||
|
border-left: 6px solid rgba(0, 0, 0, 48);
|
||||||
|
}
|
||||||
|
|
||||||
|
ads--CAutoHideTab[iconOnly="true"][sideBarLocation="2"] {
|
||||||
|
border-right: 6px solid rgba(0, 0, 0, 48);
|
||||||
|
}
|
||||||
|
|
||||||
|
ads--CAutoHideTab[iconOnly="true"][sideBarLocation="3"] {
|
||||||
|
border-bottom: 6px solid rgba(0, 0, 0, 48);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Auto hide tabs with icon only hover
|
||||||
|
*/
|
||||||
|
ads--CAutoHideTab:hover[iconOnly="true"][sideBarLocation="0"],
|
||||||
|
ads--CAutoHideTab[iconOnly="true"][sideBarLocation="0"][activeTab="true"] {
|
||||||
|
border-top: 6px solid palette(highlight);
|
||||||
|
}
|
||||||
|
|
||||||
|
ads--CAutoHideTab:hover[iconOnly="true"][sideBarLocation="1"],
|
||||||
|
ads--CAutoHideTab[iconOnly="true"][sideBarLocation="1"][activeTab="true"] {
|
||||||
|
border-left: 6px solid palette(highlight);
|
||||||
|
}
|
||||||
|
|
||||||
|
ads--CAutoHideTab:hover[iconOnly="true"][sideBarLocation="2"],
|
||||||
|
ads--CAutoHideTab[iconOnly="true"][sideBarLocation="2"][activeTab="true"] {
|
||||||
|
border-right: 6px solid palette(highlight);
|
||||||
|
}
|
||||||
|
|
||||||
|
ads--CAutoHideTab:hover[iconOnly="true"][sideBarLocation="3"],
|
||||||
|
ads--CAutoHideTab[iconOnly="true"][sideBarLocation="3"][activeTab="true"] {
|
||||||
|
border-bottom: 6px solid palette(highlight);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* CAutoHideSideBar
|
||||||
|
*****************************************************************************/
|
||||||
|
ads--CAutoHideSideBar{
|
||||||
|
background: palette(window);
|
||||||
|
border: none;
|
||||||
|
qproperty-spacing: 12;
|
||||||
|
}
|
||||||
|
|
||||||
|
#sideTabsContainerWidget {
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ads--CAutoHideSideBar[sideBarLocation="0"] {
|
||||||
|
border-bottom: 1px solid palette(dark);
|
||||||
|
}
|
||||||
|
|
||||||
|
ads--CAutoHideSideBar[sideBarLocation="1"] {
|
||||||
|
border-right: 1px solid palette(dark);
|
||||||
|
}
|
||||||
|
|
||||||
|
ads--CAutoHideSideBar[sideBarLocation="2"] {
|
||||||
|
border-left: 1px solid palette(dark);
|
||||||
|
}
|
||||||
|
|
||||||
|
ads--CAutoHideSideBar[sideBarLocation="3"] {
|
||||||
|
border-top: 1px solid palette(dark);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* CAutoHideDockContainer
|
||||||
|
*****************************************************************************/
|
||||||
|
ads--CAutoHideDockContainer {
|
||||||
|
background: palette(window);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ads--CAutoHideDockContainer ads--CDockAreaTitleBar {
|
||||||
|
background: palette(highlight);
|
||||||
|
padding: 0px;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is required because the ads--CDockAreaWidget[focused="true"] will
|
||||||
|
* overwrite the ads--CAutoHideDockContainer ads--CDockAreaTitleBar rule
|
||||||
|
*/
|
||||||
|
ads--CAutoHideDockContainer ads--CDockAreaWidget[focused="true"] ads--CDockAreaTitleBar {
|
||||||
|
background: palette(highlight);
|
||||||
|
padding: 0px;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#autoHideTitleLabel {
|
||||||
|
padding-left: 4px;
|
||||||
|
color: palette(light);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* CAutoHideDockContainer titlebar buttons
|
||||||
|
*****************************************************************************/
|
||||||
|
#dockAreaAutoHideButton {
|
||||||
|
qproperty-icon: url(:/ads/images/vs-pin-button.svg);
|
||||||
|
qproperty-iconSize: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
ads--CAutoHideDockContainer #dockAreaAutoHideButton {
|
||||||
|
qproperty-icon: url(:/ads/images/vs-pin-button-pinned-focused.svg);
|
||||||
|
qproperty-iconSize: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ads--CAutoHideDockContainer #dockAreaCloseButton{
|
||||||
|
qproperty-icon: url(:/ads/images/close-button-focused.svg)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ads--CAutoHideDockContainer ads--CTitleBarButton:hover {
|
||||||
|
background: rgba(255, 255, 255, 48);
|
||||||
|
}
|
||||||
|
|
||||||
|
ads--CAutoHideDockContainer ads--CTitleBarButton:pressed {
|
||||||
|
background: rgba(255, 255, 255, 96);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* CAutoHideDockContainer Titlebar and Buttons
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* CResizeHandle
|
||||||
|
*****************************************************************************/
|
||||||
|
ads--CResizeHandle {
|
||||||
|
background: palette(window);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ads--CAutoHideDockContainer[sideBarLocation="0"] ads--CResizeHandle {
|
||||||
|
border-top: 1px solid palette(dark);
|
||||||
|
}
|
||||||
|
|
||||||
|
ads--CAutoHideDockContainer[sideBarLocation="1"] ads--CResizeHandle {
|
||||||
|
border-left: 1px solid palette(dark);
|
||||||
|
}
|
||||||
|
|
||||||
|
ads--CAutoHideDockContainer[sideBarLocation="2"] ads--CResizeHandle {
|
||||||
|
border-right: 1px solid palette(dark);
|
||||||
|
}
|
||||||
|
|
||||||
|
ads--CAutoHideDockContainer[sideBarLocation="3"] ads--CResizeHandle {
|
||||||
|
border-top: 1px solid palette(dark);
|
||||||
|
}
|
||||||
38
demo/status_dialog.py
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from PyQt5 import uic
|
||||||
|
import PyQtAds as QtAds
|
||||||
|
|
||||||
|
UI_FILE = os.path.join(os.path.dirname(__file__), 'StatusDialog.ui')
|
||||||
|
StatusDialogUI, StatusDialogBase = uic.loadUiType(UI_FILE)
|
||||||
|
|
||||||
|
class CStatusDialog(StatusDialogUI, StatusDialogBase):
|
||||||
|
|
||||||
|
def __init__(self, dock_manager: QtAds.CDockManager, parent=None):
|
||||||
|
super().__init__(parent)
|
||||||
|
|
||||||
|
self.setupUi(self)
|
||||||
|
|
||||||
|
self.dock_manager = dock_manager
|
||||||
|
self.dock_widgets = self.dock_manager.dockWidgetsMap()
|
||||||
|
|
||||||
|
for key, widget in self.dock_widgets.items():
|
||||||
|
self.dockWidgetsComboBox.addItem(key, widget)
|
||||||
|
|
||||||
|
def on_dockWidgetsComboBox_currentIndexChanged(self, index: int):
|
||||||
|
if not isinstance(index, int):
|
||||||
|
return
|
||||||
|
if index < 0:
|
||||||
|
return
|
||||||
|
|
||||||
|
dock_widget = self.dockWidgetsComboBox.currentData()
|
||||||
|
self.isClosedCheckBox.setChecked(dock_widget.isClosed())
|
||||||
|
self.isFloatingCheckBox.setChecked(dock_widget.isFloating())
|
||||||
|
self.tabbedCheckBox.setChecked(dock_widget.isTabbed())
|
||||||
|
self.isCurrentTabCheckBox.setChecked(dock_widget.isCurrentTab())
|
||||||
|
self.closableCheckBox.setChecked(dock_widget.features() & QtAds.CDockWidget.DockWidgetClosable)
|
||||||
|
self.movableCheckBox.setChecked(dock_widget.features() & QtAds.CDockWidget.DockWidgetMovable)
|
||||||
|
self.floatableCheckBox.setChecked(dock_widget.features() & QtAds.CDockWidget.DockWidgetFloatable)
|
||||||
|
self.deleteOnCloseCheckBox.setChecked(dock_widget.features() & QtAds.CDockWidget.DockWidgetDeleteOnClose)
|
||||||
|
self.customCloseHandlingCheckBox.setChecked(dock_widget.features() & QtAds.CDockWidget.CustomCloseHandling)
|
||||||
BIN
doc/AutoHide_Animation.gif
Normal file
|
After Width: | Height: | Size: 1.1 MiB |
BIN
doc/AutoHide_Change_Sidebar.gif
Normal file
|
After Width: | Height: | Size: 312 KiB |
BIN
doc/AutoHide_Context_Menu.png
Normal file
|
After Width: | Height: | Size: 34 KiB |
BIN
doc/AutoHide_Drag_DockArea.gif
Normal file
|
After Width: | Height: | Size: 330 KiB |
BIN
doc/AutoHide_Drag_to_Float_or_Dock.gif
Normal file
|
After Width: | Height: | Size: 642 KiB |
BIN
doc/AutoHide_Drag_to_Sidebar.gif
Normal file
|
After Width: | Height: | Size: 559 KiB |
BIN
doc/AutoHide_Movie.gif
Normal file
|
After Width: | Height: | Size: 2.3 MiB |
BIN
doc/AutoHide_PinTo.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
doc/AutoHide_Sort_Tabs.gif
Normal file
|
After Width: | Height: | Size: 299 KiB |
BIN
doc/AutoHide_Tab_Insert_Order.gif
Normal file
|
After Width: | Height: | Size: 303 KiB |
BIN
doc/DockArea_Tab_Insertion_Order.gif
Normal file
|
After Width: | Height: | Size: 376 KiB |
BIN
doc/Feature_ImageViewer.png
Normal file
|
After Width: | Height: | Size: 387 KiB |
158
doc/ads_icon.svg
@@ -1,123 +1,77 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<svg
|
<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"
|
version="1.1"
|
||||||
viewBox="0,0,1024,1024"
|
viewBox="0 0 1023.99 1023.99"
|
||||||
id="svg1145"
|
id="svg26"
|
||||||
sodipodi:docname="ads_icon.svg"
|
sodipodi:docname="ads_icon.svg"
|
||||||
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
|
inkscape:version="1.1 (c68e22c387, 2021-05-23)"
|
||||||
inkscape:export-filename="C:\CodingXP\cetoni_projects\QtAdvancedDockingSystem\doc\ads_icon_256.png"
|
width="1023.99"
|
||||||
inkscape:export-xdpi="24"
|
height="1023.99"
|
||||||
inkscape:export-ydpi="24">
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
<metadata
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
id="metadata1151">
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
<rdf:RDF>
|
xmlns:svg="http://www.w3.org/2000/svg">
|
||||||
<cc:Work
|
|
||||||
rdf:about="">
|
|
||||||
<dc:format>image/svg+xml</dc:format>
|
|
||||||
<dc:type
|
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
|
||||||
<dc:title />
|
|
||||||
</cc:Work>
|
|
||||||
</rdf:RDF>
|
|
||||||
</metadata>
|
|
||||||
<defs
|
<defs
|
||||||
id="defs1149" />
|
id="defs30" />
|
||||||
<sodipodi:namedview
|
<sodipodi:namedview
|
||||||
|
id="namedview28"
|
||||||
pagecolor="#ffffff"
|
pagecolor="#ffffff"
|
||||||
bordercolor="#666666"
|
bordercolor="#666666"
|
||||||
borderopacity="1"
|
borderopacity="1.0"
|
||||||
objecttolerance="10"
|
|
||||||
gridtolerance="10"
|
|
||||||
guidetolerance="10"
|
|
||||||
inkscape:pageopacity="0"
|
|
||||||
inkscape:pageshadow="2"
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pagecheckerboard="0"
|
||||||
|
showgrid="false"
|
||||||
|
showguides="true"
|
||||||
|
inkscape:guide-bbox="true"
|
||||||
|
inkscape:zoom="0.12999302"
|
||||||
|
inkscape:cx="3277.099"
|
||||||
|
inkscape:cy="-257.70614"
|
||||||
inkscape:window-width="1920"
|
inkscape:window-width="1920"
|
||||||
inkscape:window-height="1017"
|
inkscape:window-height="1017"
|
||||||
id="namedview1147"
|
|
||||||
showgrid="false"
|
|
||||||
inkscape:zoom="0.32593202"
|
|
||||||
inkscape:cx="256.13402"
|
|
||||||
inkscape:cy="235.82602"
|
|
||||||
inkscape:window-x="1912"
|
inkscape:window-x="1912"
|
||||||
inkscape:window-y="-8"
|
inkscape:window-y="-8"
|
||||||
inkscape:window-maximized="1"
|
inkscape:window-maximized="1"
|
||||||
inkscape:current-layer="svg1145" />
|
inkscape:current-layer="svg26"
|
||||||
|
fit-margin-top="0"
|
||||||
|
fit-margin-left="0"
|
||||||
|
fit-margin-right="0"
|
||||||
|
fit-margin-bottom="0" />
|
||||||
<desc
|
<desc
|
||||||
id="desc1129">window_size icon - Licensed under Iconfu Standard License v1.0 (https://www.iconfu.com/iconfu_standard_license) - Incors GmbH</desc>
|
id="desc2">electric_iron icon - Licensed under Iconfu Standard License v1.0 (https://www.iconfu.com/iconfu_standard_license) - Incors GmbH</desc>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-weight:normal;font-size:40px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none"
|
||||||
|
x="1251.1022"
|
||||||
|
y="1305.4956"
|
||||||
|
id="text9788"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan9786"
|
||||||
|
x="1251.1022"
|
||||||
|
y="1305.4956" /></text>
|
||||||
|
<g
|
||||||
|
id="g94691"
|
||||||
|
transform="translate(581.23034,1750.5233)">
|
||||||
<path
|
<path
|
||||||
id="path1797-1"
|
d="m 191.63966,-726.53328 h -521.75 c -138.69,0 -251.12,-112.43001 -251.12,-251.12 v -521.75002 c 0,-138.69 112.43,-251.12 251.12,-251.12 h 521.75 c 138.69,0 251.12,112.43 251.12,251.12 v 521.75002 c 0,138.68999 -112.43,251.12 -251.12,251.12 z"
|
||||||
visibility="hidden"
|
fill="#707070"
|
||||||
d="M 71.53142,291.89723 H 950.1828 l 0.6743,0.6742 v 586.08 l -0.6743,0.6743 H 71.53142 l -0.6743,-0.6743 v -586.08 z"
|
id="path4-5"
|
||||||
inkscape:connector-curvature="0"
|
style="mix-blend-mode:normal;fill:#e0e0e0;fill-opacity:1;fill-rule:nonzero" />
|
||||||
style="visibility:hidden;mix-blend-mode:normal;fill:#ffffff;fill-rule:nonzero;stroke-width:0.99999988;fill-opacity:1" />
|
|
||||||
<rect
|
|
||||||
transform="rotate(-90)"
|
|
||||||
y="412.13489"
|
|
||||||
x="-911.34436"
|
|
||||||
height="560.90375"
|
|
||||||
width="327.70862"
|
|
||||||
id="rect1739-8"
|
|
||||||
style="opacity:1;fill:#ffd292;fill-opacity:1;stroke:none;stroke-width:37.79526901;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke" />
|
|
||||||
<path
|
<path
|
||||||
id="path1799"
|
id="path927"
|
||||||
d="M 988.40121,578.11175 V 651.2546 H 409.96541 V 578.11175 Z"
|
style="mix-blend-mode:normal;fill:#009ddd;fill-opacity:1;fill-rule:nonzero"
|
||||||
inkscape:connector-curvature="0"
|
d="m -175.90039,-1515.8633 v 256 h 469.3301 v -256 z" />
|
||||||
style="mix-blend-mode:normal;fill:#546e7a;fill-rule:nonzero;stroke-width:0.99999988" />
|
|
||||||
<rect
|
|
||||||
style="opacity:1;fill:#b3c3cb;fill-opacity:1;stroke:none;stroke-width:37.79526901;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:fill markers stroke"
|
|
||||||
id="rect1739-6-1"
|
|
||||||
width="655.41724"
|
|
||||||
height="338.99207"
|
|
||||||
x="-914.85529"
|
|
||||||
y="38.243896"
|
|
||||||
transform="rotate(-90)" />
|
|
||||||
<path
|
<path
|
||||||
id="path1801-7"
|
id="path16513"
|
||||||
d="m 73.1429,73.14287 h 877.7142 c 40.2857,0 73.1429,32.86857 73.1429,73.14285 V 914.2857 c 0,20.12571 -16.4458,36.57142 -36.5715,36.57142 H 36.5714 C 16.4343,950.85712 0,934.42284 0,914.2857 V 146.28572 C 0,106.00001 32.8571,73.14287 73.1429,73.14287 Z m 0,219.42856 V 877.71427 H 950.8571 V 292.57143 Z"
|
style="mix-blend-mode:normal;fill:#ff9833;fill-opacity:1;fill-rule:nonzero"
|
||||||
inkscape:connector-curvature="0"
|
d="m 80.099609,-1217.1934 v 256.00004 H 293.42969 v -256.00004 z" />
|
||||||
style="mix-blend-mode:normal;fill:#546e7a;fill-rule:nonzero;stroke-width:0.99999988" />
|
|
||||||
<path
|
<path
|
||||||
id="path1799-6"
|
id="path16513-5"
|
||||||
d="M 359.8801,276.79402 H 433.023 V 886.78767 H 359.8801 Z"
|
style="mix-blend-mode:normal;fill:#accb01;fill-opacity:1;fill-rule:nonzero"
|
||||||
inkscape:connector-curvature="0"
|
d="m -175.90039,-1217.1933 v 256 H 37.42969 v -256 z" />
|
||||||
style="mix-blend-mode:normal;fill:#546e7a;fill-rule:nonzero;stroke-width:0.99999988" />
|
|
||||||
<circle
|
|
||||||
r="36.81749"
|
|
||||||
cy="169.78555"
|
|
||||||
cx="920.66248"
|
|
||||||
id="path1917-42"
|
|
||||||
style="opacity:1;fill:#ffa726;fill-opacity:1;stroke:none;stroke-width:63.79999924;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers" />
|
|
||||||
<circle
|
|
||||||
r="36.81749"
|
|
||||||
cy="169.78555"
|
|
||||||
cx="817.22302"
|
|
||||||
id="path1917-4-6"
|
|
||||||
style="opacity:1;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:63.79999924;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers" />
|
|
||||||
<path
|
<path
|
||||||
id="path1799-8"
|
id="path24788"
|
||||||
d="m 615.67076,292.13464 v 73.14285 H 433.023 v -73.14285 z"
|
style="mix-blend-mode:normal;fill:#0083c3;fill-opacity:1;fill-rule:nonzero"
|
||||||
inkscape:connector-curvature="0"
|
d="m -431.90039,-1515.8633 v 554.66994 h 213.33008 v -554.66994 z" />
|
||||||
style="mix-blend-mode:normal;fill:#95abb6;fill-rule:nonzero;stroke-width:0.99999994;fill-opacity:1" />
|
</g>
|
||||||
<path
|
|
||||||
id="path1799-8-1"
|
|
||||||
d="m 798.31852,292.13464 v 73.14285 H 615.67076 v -73.14285 z"
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
style="mix-blend-mode:normal;fill:#c7d4d9;fill-rule:nonzero;stroke-width:0.99999994;fill-opacity:1" />
|
|
||||||
<path
|
|
||||||
id="path1799-8-7"
|
|
||||||
d="m 255.79066,292.57143 v 73.14285 H 73.1429 v -73.14285 z"
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
style="mix-blend-mode:normal;fill:#dfe5e9;fill-opacity:1;fill-rule:nonzero;stroke-width:0.99999994" />
|
|
||||||
<path
|
|
||||||
id="path1799-8-7-6"
|
|
||||||
d="m 616.34083,651.15739 v 73.14285 H 433.69307 v -73.14285 z"
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
style="mix-blend-mode:normal;fill:#ffba56;fill-opacity:1;fill-rule:nonzero;stroke-width:0.99999994" />
|
|
||||||
</svg>
|
</svg>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 8.0 KiB |
33
doc/ads_logo.svg
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="1032" height="151.81" version="1.1" viewBox="0 0 1032 151.81" 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>
|
||||||
|
<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="scale(.14825)" stroke-width="6.7454">
|
||||||
|
<g fill="#8f918f" aria-label="Qt Advanced Docking">
|
||||||
|
<path d="m1416.3 726.04q-93.219 0-148.72-61.942-55.196-61.942-55.196-160.99 0-105.18 56.729-168.35 57.035-63.475 155.47-63.475 88.926 0 143.82 61.022 55.196 60.715 55.196 159.45 0 109.16-56.422 171.72-17.479 19.625-38.944 32.811l106.71 81.26h-51.209l-83.1-66.848q-37.41 15.332-84.327 15.332zm3.0664-427.15q-76.66 0-126.34 55.502-49.369 55.502-49.369 145.35 0 90.766 46.916 144.74 46.916 53.662 125.11 53.662 81.567 0 129.1-53.049 47.53-53.356 47.53-148.41 0-93.219-46.61-145.35-46.303-52.436-126.34-52.436z"/>
|
||||||
|
<path d="m1826.9 714.08q-22.078 10.426-41.397 10.426-69.608 0-69.608-83.407v-210.97h-56.422v-25.758h56.422v-81.567q6.7461-2.4531 14.106-4.9063 7.3594-2.1465 14.106-4.5996v91.073h82.793v25.758h-82.793v207.29q0 32.504 10.119 47.223 10.426 14.412 34.957 14.412 17.479 0 37.717-11.346z"/>
|
||||||
|
<path d="m2353.7 718.37-50.289-136.76h-190.73l-50.289 136.76h-33.424l165.89-439.72h28.824l164.05 439.72zm-134.92-367.97q-3.373-9.1993-5.5195-18.092-2.1465-7.6661-4.5997-15.332h-1.2265q-5.2129 20.238-10.119 32.811l-73.901 203.92h169.57z"/>
|
||||||
|
<path d="m2679 718.37v-57.035h-1.2266q-15.332 29.744-45.383 47.223-30.051 17.479-67.768 17.479-57.955 0-94.752-42.317-36.49-42.317-36.49-116.83 0-76.047 39.864-122.96 40.17-47.223 103.95-47.223 70.528 0 100.58 57.955h1.2266v-201.16h28.211v464.87zm0-191.04q0-43.85-27.904-74.207-27.598-30.664-74.514-30.664-49.369 0-81.567 38.024-32.198 37.717-32.198 103.95 0 65.008 28.824 100.58 29.131 35.264 74.821 35.264 53.662 0 83.1-33.117 29.438-33.424 29.438-81.26z"/>
|
||||||
|
<path d="m2910.8 718.37h-25.758l-121.43-314h31.584l93.526 249.91q6.7462 18.092 9.5059 32.811h1.2266q3.9864-19.318 8.8926-31.584l96.592-251.14h30.664z"/>
|
||||||
|
<path d="m3280 718.37v-62.862h-1.2265q-15.026 32.197-43.85 51.516-28.518 19.012-63.475 19.012-44.77 0-70.834-25.145t-26.065-63.475q0-82.18 108.86-99.352l96.592-14.412q0-101.19-76.047-101.19-51.822 0-100.89 41.703v-34.037q17.479-13.799 47.223-23.611 30.051-9.8126 56.422-9.8126 48.449 0 74.821 30.051 26.678 30.051 26.678 87.393v204.22zm-86.473-156.39q-49.369 7.0528-69.301 22.998-19.932 15.639-19.932 51.209 0 27.904 18.398 45.996 18.705 18.092 51.822 18.092 45.383 0 75.434-33.424 30.051-33.731 30.051-86.78v-30.664z"/>
|
||||||
|
<path d="m3616.1 718.37v-182.76q0-113.15-81.567-113.15-45.383 0-74.514 33.424-29.131 33.117-29.131 82.18v180.31h-28.211v-314h28.211v57.035h1.2266q34.344-64.701 107.32-64.701 50.903 0 77.887 34.037 26.984 33.731 26.984 96.592v191.04z"/>
|
||||||
|
<path d="m3942.1 704.57q-34.957 21.465-83.407 21.465-64.088 0-103.34-43.85-39.25-44.156-39.25-115.3 0-74.821 44.156-122.35 44.156-47.836 113.46-47.836 35.877 0 69.608 14.719v31.891q-33.731-20.852-73.901-20.852-55.196 0-89.54 39.863-34.344 39.557-34.344 102.73 0 61.022 31.278 98.125 31.584 37.104 83.1 37.104 47.223 0 82.18-25.145z"/>
|
||||||
|
<path d="m4024.3 562.6q0 64.701 29.744 101.19 30.051 36.49 82.18 36.49 52.742 0 103.03-38.944v30.051q-48.756 34.651-108.86 34.651-60.715 0-98.126-43.543-37.41-43.543-37.41-122.96 0-68.688 38.944-115.6 39.25-47.223 101.81-47.223 58.569 0 89.846 41.09t31.278 112.23v12.572zm203-25.758q-1.8399-54.276-26.065-84.327-24.225-30.051-66.848-30.051-44.156 0-73.287 29.744-28.824 29.438-35.57 84.633z"/>
|
||||||
|
<path d="m4557.5 718.37v-57.035h-1.2266q-15.332 29.744-45.383 47.223-30.051 17.479-67.768 17.479-57.955 0-94.752-42.317-36.49-42.317-36.49-116.83 0-76.047 39.863-122.96 40.17-47.223 103.95-47.223 70.528 0 100.58 57.955h1.2266v-201.16h28.211v464.87zm0-191.04q0-43.85-27.904-74.207-27.598-30.664-74.514-30.664-49.369 0-81.567 38.024-32.197 37.717-32.197 103.95 0 65.008 28.824 100.58 29.131 35.264 74.821 35.264 53.662 0 83.1-33.117 29.438-33.424 29.438-81.26z"/>
|
||||||
|
<path d="m4864.5 718.37v-439.72h110.08q109.47 0 166.51 54.582 57.035 54.582 57.035 159.15 0 100.58-61.328 163.44-61.022 62.555-168.65 62.555zm30.358-411.82v384.22h68.994q97.819 0 150.25-50.596 52.436-50.903 52.436-146.57 0-187.05-196.56-187.05z"/>
|
||||||
|
<path d="m5407.5 726.04q-68.688 0-108.86-45.076-39.863-45.383-39.863-117.75 0-78.194 41.703-122.35 42.01-44.156 110.39-44.156 67.155 0 106.1 43.85 38.944 43.85 38.944 121.43 0 73.287-39.863 118.67-39.557 45.383-108.55 45.383zm2.1465-303.58q-55.502 0-88.62 37.41-32.811 37.41-32.811 103.95 0 61.635 32.197 99.045 32.197 37.41 88.006 37.41 56.729 0 87.393-36.797t30.664-102.11q0-67.155-30.664-103.03-30.358-35.877-86.166-35.877z"/>
|
||||||
|
<path d="m5837.1 704.57q-34.957 21.465-83.407 21.465-64.088 0-103.34-43.85-39.25-44.156-39.25-115.3 0-74.821 44.156-122.35 44.156-47.836 113.46-47.836 35.877 0 69.608 14.719v31.891q-33.731-20.852-73.901-20.852-55.196 0-89.54 39.863-34.344 39.557-34.344 102.73 0 61.022 31.278 98.125 31.584 37.104 83.1 37.104 47.223 0 82.18-25.145z"/>
|
||||||
|
<path d="m6092.2 718.37-150.25-155.16h-1.2266v155.16h-28.211v-464.87h28.211v299.59h1.2266l142.59-148.72h36.49l-149.03 152.09 160.99 161.91z"/>
|
||||||
|
<path d="m6205.1 325.26q-9.1992 0-16.252-6.7461-7.0528-6.7461-7.0528-17.172 0-10.119 7.0528-16.252 7.3594-6.4395 16.252-6.4395 9.506 0 16.559 6.1328 7.3594 6.1328 7.3594 16.559 0 9.8126-7.0527 16.865-7.0528 7.0528-16.865 7.0528zm-13.799 393.12v-314h28.211v314z"/>
|
||||||
|
<path d="m6533.5 718.37v-182.76q0-113.15-81.567-113.15-45.383 0-74.514 33.424-29.131 33.117-29.131 82.18v180.31h-28.211v-314h28.211v57.035h1.2265q34.344-64.701 107.32-64.701 50.902 0 77.887 34.037 26.984 33.731 26.984 96.592v191.04z"/>
|
||||||
|
<path d="m6907.3 695.07q0 88.62-38.637 129.71-38.637 41.09-120.2 41.09-45.383 0-93.526-23.918v-29.438q49.676 27.598 94.139 27.598 130.02 0 130.02-137.38v-40.783h-1.2266q-37.104 64.088-113.15 64.088-57.955 0-94.752-42.01-36.49-42.01-36.49-117.14t39.557-122.66q39.557-47.53 104.26-47.53 69.301 0 100.58 57.342h1.2266v-49.676h28.211zm-28.211-170.19q0-41.703-28.211-72.061-27.904-30.358-72.981-30.358-51.822 0-83.407 38.944-31.584 38.944-31.584 103.03 0 64.395 28.824 100.27 29.131 35.57 76.66 35.57 50.596 0 80.647-32.811 30.051-32.811 30.051-80.34z"/>
|
||||||
|
</g>
|
||||||
|
<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>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 7.0 KiB |
BIN
doc/ads_logo_ukraine.jpg
Normal file
|
After Width: | Height: | Size: 171 KiB |
@@ -12,29 +12,14 @@ styles as much as possible.
|
|||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
### Overview
|
### Docking everywhere - with or without a central widget
|
||||||
|
|
||||||
- [Advanced Docking System for Qt](#advanced-docking-system-for-qt)
|
The Advanced Docking System works with or without a central widget.
|
||||||
- [Features](#features)
|
You can dock on every border of the main window or you can dock into each dock area - so you are
|
||||||
- [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)
|
|
||||||
- [Opaque and non-opaque undocking](#opaque-and-non-opaque-undocking)
|
|
||||||
- [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)
|
|
||||||
|
|
||||||
### 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.
|
free to dock almost everywhere.
|
||||||
|
|
||||||
\
|

|
||||||
\
|
|
||||||

|

|
||||||
|
|
||||||
### Docking inside floating windows
|
### Docking inside floating windows
|
||||||
@@ -42,8 +27,8 @@ free to dock almost everywhere.
|
|||||||
There is no difference between the main window and a floating window. Docking
|
There is no difference between the main window and a floating window. Docking
|
||||||
into floating windows is supported.
|
into floating windows is supported.
|
||||||
|
|
||||||
\
|

|
||||||
\
|
|
||||||

|

|
||||||
|
|
||||||
### Grouped dragging
|
### Grouped dragging
|
||||||
@@ -52,8 +37,8 @@ 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
|
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.
|
a floating widget or from one dock area to another one.
|
||||||
|
|
||||||
\
|

|
||||||
\
|
|
||||||

|

|
||||||
|
|
||||||
### Perspectives for fast switching of the complete main window layout
|
### Perspectives for fast switching of the complete main window layout
|
||||||
@@ -64,8 +49,8 @@ perspective to make your own custom perspective. Later you can simply
|
|||||||
select a perspective from the perspective list to quickly switch the complete
|
select a perspective from the perspective list to quickly switch the complete
|
||||||
main window layout.
|
main window layout.
|
||||||
|
|
||||||
\
|

|
||||||
\
|
|
||||||

|

|
||||||
|
|
||||||
### Opaque and non-opaque splitter resizing
|
### Opaque and non-opaque splitter resizing
|
||||||
@@ -80,7 +65,7 @@ If this flag is cleared, the widget resizing is deferred until the mouse button
|
|||||||
|
|
||||||
### Opaque and non-opaque undocking
|
### Opaque and non-opaque undocking
|
||||||
|
|
||||||
By default, opaque undocking is active. That means, as soon as you drag a dock widget or a dock area with a number of dock widgets it will be undocked and moved into a floating widget and then the floating widget will be dragged around. That means undocking will take place immediatelly. You can compare this with opaque splitter resizing. If the flag `OpaqueUndocking` is cleared, then non-opaque undocking is active. In this mode, undocking is more like a standard drag and drop operation. That means, the dragged dock widget or dock area is not undocked immediatelly. 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.
|
By default, opaque undocking is active. That means, as soon as you drag a dock widget or a dock area with a number of dock widgets it will be undocked and moved into a floating widget and then the floating widget will be dragged around. That means undocking will take place immediately. You can compare this with opaque splitter resizing. If the flag `OpaqueUndocking` is cleared, then non-opaque undocking is active. In this mode, undocking is more like a standard drag and 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:
|
The drag preview widget can be configured by a number of global dock manager flags:
|
||||||
|
|
||||||
@@ -107,3 +92,10 @@ You can detach dock widgets and also dock areas in the following ways:
|
|||||||
### Supports deletion of dynamically created dock widgets
|
### 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.
|
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.
|
||||||
|
|
||||||
|
### Python PyQt5 Bindings
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
The Advanced Docking System comes with a complete Python integration based on
|
||||||
|
PyQt5 bindings. The package is available via [conda-forge](https://github.com/conda-forge/pyqtads-feedstock).
|
||||||
|
|||||||
@@ -4,21 +4,21 @@
|
|||||||
"extensionType": [
|
"extensionType": [
|
||||||
"library"
|
"library"
|
||||||
],
|
],
|
||||||
"version": "3.0.0",
|
"version": "3.8.2",
|
||||||
"vendor": {
|
"vendor": {
|
||||||
"name": "githubuser0xFFFF",
|
"name": "githubuser0xFFFF",
|
||||||
"url": "https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System"
|
"url": "https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System"
|
||||||
},
|
},
|
||||||
"contact": "https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System/issues",
|
"contact": "https://github.com/githubuser0xFFFF/Qt-Advanced-Docking-System/issues",
|
||||||
"icon": "https://raw.githubusercontent.com/githubuser0xFFFF/Qt-Advanced-Docking-System/master/doc/ads_icon_512.png",
|
"icon": "https://raw.githubusercontent.com/githubuser0xFFFF/Qt-Advanced-Docking-System/master/doc/ads_icon.svg",
|
||||||
"licenses": [
|
"licenses": [
|
||||||
{ "licenseType": "LGPLv2.1",
|
{ "licenseType": "LGPL-2.1-only",
|
||||||
"licenseUrl": "https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html" }
|
"licenseUrl": "https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html" }
|
||||||
],
|
],
|
||||||
"created": "2017-03-30",
|
"created": "2017-03-30",
|
||||||
"lastUpdate": "2020-01-16",
|
"lastUpdate": "2022-03-02",
|
||||||
"platforms": [
|
"platforms": [
|
||||||
"Windows 7-10", "Kubuntu 18.04", "Kubuntu 19.10", "Ubuntu 19.10"
|
"Windows 7-11", "Kubuntu 18.04", "Kubuntu 19.10", "Ubuntu 19.10", "Ubuntu 20.04"
|
||||||
],
|
],
|
||||||
"qtVersions": [
|
"qtVersions": [
|
||||||
"5.5.1 or newer"
|
"5.5.1 or newer"
|
||||||
|
|||||||
BIN
doc/autohide-feature-demo.png
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
doc/central_widget.gif
Normal file
|
After Width: | Height: | Size: 572 KiB |
BIN
doc/cfg_flag_ActiveTabHasCloseButton_false.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
doc/cfg_flag_ActiveTabHasCloseButton_true.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
doc/cfg_flag_AllTabsHaveCloseButton_true.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
doc/cfg_flag_AlwaysShowTabs_false_true.png
Normal file
|
After Width: | Height: | Size: 6.2 KiB |
BIN
doc/cfg_flag_AutoHideCloseButtonCollapsesDock_false.gif
Normal file
|
After Width: | Height: | Size: 90 KiB |
BIN
doc/cfg_flag_AutoHideCloseButtonCollapsesDock_true.gif
Normal file
|
After Width: | Height: | Size: 52 KiB |
BIN
doc/cfg_flag_AutoHideHasCloseButton.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
doc/cfg_flag_AutoHideHasMinimizeButton.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
doc/cfg_flag_AutoHideOpenOnDragHover.gif
Normal file
|
After Width: | Height: | Size: 269 KiB |
BIN
doc/cfg_flag_AutoHideSideBarsIconOnly_false.png
Normal file
|
After Width: | Height: | Size: 33 KiB |
BIN
doc/cfg_flag_AutoHideSideBarsIconOnly_true.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
doc/cfg_flag_DisableTabTextEliding_false.png
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
doc/cfg_flag_DisableTabTextEliding_true.png
Normal file
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 8.0 KiB |
|
After Width: | Height: | Size: 7.9 KiB |