Compare commits
702 Commits
release_1.
...
release_2.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c436ff4305 | ||
|
|
abb7ab9869 | ||
|
|
5d5054d64d | ||
|
|
d70cf5aae4 | ||
|
|
6e0f769b26 | ||
|
|
86fa671858 | ||
|
|
7fcc83f62c | ||
|
|
fff37e524c | ||
|
|
ab03dd3637 | ||
|
|
1ad2228b84 | ||
|
|
57fbf65b23 | ||
|
|
d6ba7b0cb3 | ||
|
|
3ad5401b0b | ||
|
|
d9e54c2be0 | ||
|
|
eeadc688bf | ||
|
|
ed9baf6fa3 | ||
|
|
3115bec92f | ||
|
|
2294b85e3b | ||
|
|
d1a1d56d6f | ||
|
|
cd576a4e27 | ||
|
|
03a221c558 | ||
|
|
9ed9f7a6d0 | ||
|
|
a78bd5d919 | ||
|
|
e4ece50af2 | ||
|
|
7611a44a54 | ||
|
|
8e43eb31aa | ||
|
|
a3f643e11c | ||
|
|
d348344e0e | ||
|
|
7b0fa7680d | ||
|
|
565ba3f219 | ||
|
|
db2b68bd9d | ||
|
|
d746dde5a3 | ||
|
|
ac43bccd6f | ||
|
|
ac2e202af4 | ||
|
|
b107c4a1e6 | ||
|
|
dcb441b7e5 | ||
|
|
dae942a2f7 | ||
|
|
97cedad044 | ||
|
|
8fec614a5e | ||
|
|
5463be1a2f | ||
|
|
e2e063015e | ||
|
|
7b7ff9622e | ||
|
|
cd6b86c3eb | ||
|
|
b01c007ed2 | ||
|
|
acdde3e02a | ||
|
|
6b07997791 | ||
|
|
440a0b8404 | ||
|
|
d3f16313bb | ||
|
|
fa0aa3fd75 | ||
|
|
0d811ba4ba | ||
|
|
9dff6e0cf6 | ||
|
|
b04e308d9f | ||
|
|
63fe2fb443 | ||
|
|
34001d30b5 | ||
|
|
769fd633e2 | ||
|
|
eb456cee63 | ||
|
|
afe4710bf5 | ||
|
|
b977abffcc | ||
|
|
8e1ec66820 | ||
|
|
adc8430e0e | ||
|
|
65109d95fd | ||
|
|
189f11d80f | ||
|
|
183564d1ea | ||
|
|
076190161f | ||
|
|
f43a71f3a4 | ||
|
|
c383ee75fb | ||
|
|
e0711b4bb7 | ||
|
|
5ce1617667 | ||
|
|
0091defb6c | ||
|
|
3d93c0ca52 | ||
|
|
8fcbe81daf | ||
|
|
524ab81a08 | ||
|
|
ad9a76a172 | ||
|
|
5b838d99c2 | ||
|
|
b7bfb98dc8 | ||
|
|
7352245a91 | ||
|
|
bfa68faeda | ||
|
|
95d6a40ecd | ||
|
|
3a4b782a16 | ||
|
|
7331775e40 | ||
|
|
0c7abe9755 | ||
|
|
9ab5fb26e2 | ||
|
|
a641ec7e0a | ||
|
|
c513a47e07 | ||
|
|
a562d2f73b | ||
|
|
dfbb1c29f8 | ||
|
|
b0cca3c2fa | ||
|
|
8c2eac427b | ||
|
|
880c97c639 | ||
|
|
614f267a5e | ||
|
|
14f7924c28 | ||
|
|
7a501a9699 | ||
|
|
f1238fcce6 | ||
|
|
4784408106 | ||
|
|
182208c145 | ||
|
|
00959bed8c | ||
|
|
57c7260a19 | ||
|
|
a70cf8ebc0 | ||
|
|
0f9b82a750 | ||
|
|
8cca3c088a | ||
|
|
d84ffec0a6 | ||
|
|
20477e1670 | ||
|
|
610b2ea2d0 | ||
|
|
e7a7803f09 | ||
|
|
c6a376b89f | ||
|
|
65c4d89890 | ||
|
|
1674558dbb | ||
|
|
ee79a86c1f | ||
|
|
92897a966b | ||
|
|
ca1c4def3a | ||
|
|
05346eda24 | ||
|
|
bea79092ab | ||
|
|
e478c24650 | ||
|
|
96bb21d04d | ||
|
|
65615295c2 | ||
|
|
b21d24039c | ||
|
|
c25f920062 | ||
|
|
7f2b6dd793 | ||
|
|
148390ea61 | ||
|
|
c525a36ea5 | ||
|
|
627595175f | ||
|
|
09365a8b24 | ||
|
|
8ae7a3f738 | ||
|
|
2ef0533ec3 | ||
|
|
b7632a4173 | ||
|
|
29fa978b8f | ||
|
|
1fbaeae611 | ||
|
|
d91337e18d | ||
|
|
88967c1588 | ||
|
|
dd7af03785 | ||
|
|
0c1353aa39 | ||
|
|
8cb592d6b4 | ||
|
|
09bec66b38 | ||
|
|
c4f379d12c | ||
|
|
1101e7e62b | ||
|
|
7aceb4f0f3 | ||
|
|
57b9e28110 | ||
|
|
0bf19e3e8d | ||
|
|
6815fe0d1f | ||
|
|
8913b37346 | ||
|
|
3ff839c4ff | ||
|
|
470885df50 | ||
|
|
152239eea4 | ||
|
|
073079a6e7 | ||
|
|
963c28c7a8 | ||
|
|
7e42cdd486 | ||
|
|
c1fc674609 | ||
|
|
615737658d | ||
|
|
3cab2f6175 | ||
|
|
93ad436c6a | ||
|
|
550ae22aa3 | ||
|
|
ea11916a93 | ||
|
|
ff3a052415 | ||
|
|
57a2c27262 | ||
|
|
c780f2edd0 | ||
|
|
4b0ce34d09 | ||
|
|
241976634d | ||
|
|
c21ca878c0 | ||
|
|
30ea14bcd5 | ||
|
|
e1f9bbf62e | ||
|
|
71b512c1a9 | ||
|
|
544718099a | ||
|
|
789be5681d | ||
|
|
66d32bbebf | ||
|
|
7f55855f2d | ||
|
|
532fe0d26c | ||
|
|
a29109343f | ||
|
|
5f13f4800b | ||
|
|
12fb154f5b | ||
|
|
72604b6cb3 | ||
|
|
dde17f278b | ||
|
|
7e25eedb8e | ||
|
|
d483445291 | ||
|
|
33076c1cb5 | ||
|
|
d6d9bd9227 | ||
|
|
59ae5fc537 | ||
|
|
0e5e5206a2 | ||
|
|
f6b5cd2790 | ||
|
|
87a6f9e628 | ||
|
|
9d9b447044 | ||
|
|
da8e636e65 | ||
|
|
e3c6e7e76c | ||
|
|
819303b060 | ||
|
|
fc583e6404 | ||
|
|
830e4efd3d | ||
|
|
3e0f3358f5 | ||
|
|
f690e188a1 | ||
|
|
cffde51caa | ||
|
|
5e2f52cf28 | ||
|
|
603c56f595 | ||
|
|
cee09061ff | ||
|
|
91a66a7520 | ||
|
|
d106086afe | ||
|
|
0238ba9052 | ||
|
|
acc522748a | ||
|
|
99c330edc2 | ||
|
|
ea05ba2151 | ||
|
|
0d6949ed9e | ||
|
|
2f41cabb1d | ||
|
|
07e086ce44 | ||
|
|
f31cef3f1e | ||
|
|
a4828070df | ||
|
|
781e0619ec | ||
|
|
a8e5777953 | ||
|
|
dd5cdd920d | ||
|
|
0139b7ee84 | ||
|
|
78111d4279 | ||
|
|
899e6eb362 | ||
|
|
f6eb97ec0f | ||
|
|
48a25081ed | ||
|
|
5e575beaff | ||
|
|
861fa5ee38 | ||
|
|
fef237f138 | ||
|
|
21572977b4 | ||
|
|
9109eb616f | ||
|
|
de0b28f9dc | ||
|
|
02fe34216d | ||
|
|
081856bf64 | ||
|
|
62d658c929 | ||
|
|
29069cd63f | ||
|
|
0fe01407a2 | ||
|
|
efd4de62a1 | ||
|
|
2962fce0b7 | ||
|
|
8e73d01829 | ||
|
|
ca24400a0a | ||
|
|
4465d18b4f | ||
|
|
3e2468dcc6 | ||
|
|
e1d69f71e1 | ||
|
|
1a71a8a41f | ||
|
|
1506c41cca | ||
|
|
cd3bbc4e64 | ||
|
|
fc668303da | ||
|
|
8569f812a6 | ||
|
|
0b7140161c | ||
|
|
06e44b8d47 | ||
|
|
51784f64f6 | ||
|
|
c4f82e19b6 | ||
|
|
7941f0a9bc | ||
|
|
d03d538498 | ||
|
|
8741af20ff | ||
|
|
a0c5669166 | ||
|
|
3f4adc2d31 | ||
|
|
fc7dce1634 | ||
|
|
803383ba2c | ||
|
|
9ae79db4cb | ||
|
|
74f85f08d5 | ||
|
|
85ee3859e4 | ||
|
|
a6917a682a | ||
|
|
d77c6ed576 | ||
|
|
ac570c415c | ||
|
|
4ca86c441d | ||
|
|
fbdd15f218 | ||
|
|
afb9a44fe2 | ||
|
|
1751d8bf12 | ||
|
|
fdb7d124d9 | ||
|
|
07623bf94f | ||
|
|
906b6f0a18 | ||
|
|
744294dd53 | ||
|
|
38df7c28bd | ||
|
|
778d651f00 | ||
|
|
f820627fda | ||
|
|
b1f71eda4c | ||
|
|
d64fc6ea85 | ||
|
|
4e7e6cfb3a | ||
|
|
02a60735f0 | ||
|
|
5c2a2f0527 | ||
|
|
281c357605 | ||
|
|
d1f003c190 | ||
|
|
cd4fe5fe2e | ||
|
|
92725db36a | ||
|
|
d2831baacc | ||
|
|
fbf4f988c9 | ||
|
|
636e8f3895 | ||
|
|
f8ab4b03dc | ||
|
|
4552cafdb6 | ||
|
|
883dbb448f | ||
|
|
a217243456 | ||
|
|
affed979ba | ||
|
|
32d67f21eb | ||
|
|
c0437f30e3 | ||
|
|
26b00e184c | ||
|
|
7f2abaa01b | ||
|
|
ccc2f1f0ff | ||
|
|
e0f6cf23e6 | ||
|
|
f980142110 | ||
|
|
0785cf863e | ||
|
|
19fe016567 | ||
|
|
ff3a232863 | ||
|
|
bd28d3b28e | ||
|
|
c6d28370ec | ||
|
|
f523fd5d3c | ||
|
|
e47847c19e | ||
|
|
6919d186bf | ||
|
|
0fd735e16d | ||
|
|
a02bfaf810 | ||
|
|
afdc862cc2 | ||
|
|
19223e51b3 | ||
|
|
37a17f11f8 | ||
|
|
19aff56946 | ||
|
|
378b6f3537 | ||
|
|
268afe536c | ||
|
|
04b698f255 | ||
|
|
f97bc9c152 | ||
|
|
a392b33b51 | ||
|
|
81a43b5314 | ||
|
|
c2f3476569 | ||
|
|
d4edc12dc6 | ||
|
|
b68e55beca | ||
|
|
bc85a3b5fe | ||
|
|
fda33927d4 | ||
|
|
7bb9cf5462 | ||
|
|
cef5cca454 | ||
|
|
77eccc7797 | ||
|
|
e3ac6c799c | ||
|
|
906900fb19 | ||
|
|
4145282415 | ||
|
|
3eb5243a28 | ||
|
|
885629a2f5 | ||
|
|
07a393fb64 | ||
|
|
da28b43d40 | ||
|
|
4f9850bd9d | ||
|
|
f930c6f272 | ||
|
|
fae1ea3f92 | ||
|
|
4b615a6cda | ||
|
|
b491867386 | ||
|
|
f323780848 | ||
|
|
9147369c41 | ||
|
|
5cd621f800 | ||
|
|
1f548d0b84 | ||
|
|
16bc8c2686 | ||
|
|
fbd5238e4e | ||
|
|
67919e4d21 | ||
|
|
76a8d94384 | ||
|
|
19e023928b | ||
|
|
0f0ee9e36e | ||
|
|
391fc7b9c9 | ||
|
|
dbb8429665 | ||
|
|
d9e9fe1d22 | ||
|
|
e2deb1fc99 | ||
|
|
16f3032b3f | ||
|
|
075829500f | ||
|
|
3dab200560 | ||
|
|
0be592cab5 | ||
|
|
7754f9a0a3 | ||
|
|
0b36db91d0 | ||
|
|
699cd73b6a | ||
|
|
4d1783276c | ||
|
|
195937f186 | ||
|
|
9509e083b7 | ||
|
|
29487ed774 | ||
|
|
f2ae215d4b | ||
|
|
99b6e1ba71 | ||
|
|
2f9f44ee9d | ||
|
|
b1137801be | ||
|
|
0eb650f544 | ||
|
|
d543fe45f9 | ||
|
|
f5dab4d9dd | ||
|
|
bb58138e26 | ||
|
|
4d3c208908 | ||
|
|
a89ebacac0 | ||
|
|
9920afdb4d | ||
|
|
2b580ca6fd | ||
|
|
5d7168bc65 | ||
|
|
6d759b8d1d | ||
|
|
68845644f6 | ||
|
|
2d3f26fed2 | ||
|
|
65b9c14255 | ||
|
|
a812b6ea08 | ||
|
|
d58d7dedaf | ||
|
|
e76247a25b | ||
|
|
ea8fe63abd | ||
|
|
0243a8640c | ||
|
|
12230958d6 | ||
|
|
f42a093d4d | ||
|
|
0edc94d00a | ||
|
|
86df4288da | ||
|
|
23b2ff416c | ||
|
|
56b1af8b44 | ||
|
|
9b6b50c92d | ||
|
|
8c65bf88a8 | ||
|
|
46db59eec1 | ||
|
|
400fd23692 | ||
|
|
10ec613843 | ||
|
|
d3bb2ef51c | ||
|
|
baf3e203ab | ||
|
|
d09152e394 | ||
|
|
2fc4cf79b9 | ||
|
|
2514a3fd26 | ||
|
|
954214137f | ||
|
|
f48246398b | ||
|
|
f2c53b1707 | ||
|
|
e4b54f42b9 | ||
|
|
d4ee3fe8cd | ||
|
|
255f57b5f7 | ||
|
|
4f4973ab18 | ||
|
|
abbdd4667e | ||
|
|
be9a35354d | ||
|
|
cae1d15f4d | ||
|
|
b89ff9f1d6 | ||
|
|
6cba1d0c94 | ||
|
|
a2665bc3b9 | ||
|
|
3d72d7e812 | ||
|
|
a79f2865cc | ||
|
|
80a3c275b0 | ||
|
|
7ae6763bc5 | ||
|
|
a5f75ec569 | ||
|
|
0d488cb9ea | ||
|
|
ed063cf6a4 | ||
|
|
30b931bedb | ||
|
|
9d1ed11186 | ||
|
|
58e6fe59b6 | ||
|
|
818f678436 | ||
|
|
ea2177cc62 | ||
|
|
4b1805f3c2 | ||
|
|
96b00f4b77 | ||
|
|
fa843db0ab | ||
|
|
ef200085a8 | ||
|
|
e16443e23f | ||
|
|
0d7e923c93 | ||
|
|
85e9202c15 | ||
|
|
abae88dc6c | ||
|
|
59a0908da4 | ||
|
|
d096eb8854 | ||
|
|
8aa0996e6e | ||
|
|
d2b44ec508 | ||
|
|
9b4782ab98 | ||
|
|
32b94d954f | ||
|
|
7a90ac8783 | ||
|
|
9717eeb798 | ||
|
|
d10b08e86f | ||
|
|
0d96ba220d | ||
|
|
e93970ed4d | ||
|
|
e5affbbc64 | ||
|
|
0dae2b88cc | ||
|
|
9474f281db | ||
|
|
30341cf339 | ||
|
|
937907c6b8 | ||
|
|
1a96535708 | ||
|
|
d1d2037883 | ||
|
|
feb111a4ff | ||
|
|
71d67e2203 | ||
|
|
009c013521 | ||
|
|
32471598ce | ||
|
|
b0416f0a4f | ||
|
|
e11ad0cbf6 | ||
|
|
25bd2c1ff6 | ||
|
|
592280445a | ||
|
|
78716c3f4b | ||
|
|
a3ae0ee314 | ||
|
|
97156c3637 | ||
|
|
9b7673b451 | ||
|
|
4d3b204f09 | ||
|
|
45d7d3c610 | ||
|
|
2745291f59 | ||
|
|
d042f54e05 | ||
|
|
32150f1d38 | ||
|
|
b1fe7345b3 | ||
|
|
bbfc4a768c | ||
|
|
542e4d6a4d | ||
|
|
a649f64655 | ||
|
|
74742965dd | ||
|
|
333fe46196 | ||
|
|
014c6301f6 | ||
|
|
3773ec573e | ||
|
|
bfc0d1575a | ||
|
|
0dc9f6a4c0 | ||
|
|
6b7afe3353 | ||
|
|
9b6b1ba085 | ||
|
|
eb257e0746 | ||
|
|
890151a696 | ||
|
|
ffc63d539a | ||
|
|
db7f9a9ad2 | ||
|
|
1cf94fec6f | ||
|
|
d36fb9eae0 | ||
|
|
4a79c95d37 | ||
|
|
c9aec66dcf | ||
|
|
01e1c22640 | ||
|
|
a0c839514a | ||
|
|
3c72be18ff | ||
|
|
a609738cca | ||
|
|
c940517690 | ||
|
|
8f6237c5f6 | ||
|
|
bef469384b | ||
|
|
d37a98ac9c | ||
|
|
f63dca40ef | ||
|
|
293129c180 | ||
|
|
a4459926b7 | ||
|
|
6a514f3043 | ||
|
|
216bc6ef4b | ||
|
|
29a9e41444 | ||
|
|
2db45dc0c5 | ||
|
|
4c7311e152 | ||
|
|
2f23582d08 | ||
|
|
5e4dc2ce57 | ||
|
|
f5bee4ce89 | ||
|
|
e7a76022bb | ||
|
|
1169ca9239 | ||
|
|
19c63883d0 | ||
|
|
f1a28616a6 | ||
|
|
a4a2ca136a | ||
|
|
95b44b7752 | ||
|
|
1096fb4125 | ||
|
|
b2ef8940a7 | ||
|
|
90ce36f984 | ||
|
|
772de9f364 | ||
|
|
eb9eddfb66 | ||
|
|
3bb50ec996 | ||
|
|
21782c4e6f | ||
|
|
27d55025ac | ||
|
|
d2d0ac9f1c | ||
|
|
9cb955e9b3 | ||
|
|
1c5b8e4168 | ||
|
|
ec696a14e9 | ||
|
|
27ab607d1f | ||
|
|
bff2880965 | ||
|
|
ac2a2d4f82 | ||
|
|
ea2b1909ae | ||
|
|
06dacae358 | ||
|
|
9e588ad413 | ||
|
|
c1704ebf97 | ||
|
|
7a3d154afa | ||
|
|
74cbddff5b | ||
|
|
d83ba74ae3 | ||
|
|
828562ec3d | ||
|
|
39ef9efc4d | ||
|
|
3429f2d5a4 | ||
|
|
d4f8ce5b07 | ||
|
|
7324ebda06 | ||
|
|
411abf55b8 | ||
|
|
82ac0f5e1f | ||
|
|
e3426c1024 | ||
|
|
6394483df4 | ||
|
|
e7b762333d | ||
|
|
51aafe7ede | ||
|
|
182843896d | ||
|
|
6914185680 | ||
|
|
ab28d32b65 | ||
|
|
5c3896b6cc | ||
|
|
25e8658592 | ||
|
|
6d33d10944 | ||
|
|
02cf0ac83d | ||
|
|
93d62cc5c2 | ||
|
|
db943fbcd6 | ||
|
|
1edd8c0767 | ||
|
|
3912c2474c | ||
|
|
6d20bea968 | ||
|
|
aef876e817 | ||
|
|
ae5dd3feb3 | ||
|
|
82934425ab | ||
|
|
632bb6ddd1 | ||
|
|
4ee57a25b0 | ||
|
|
14f59f8e5e | ||
|
|
dfc7e88f26 | ||
|
|
3d6d9ad86d | ||
|
|
a9ddd40dda | ||
|
|
5ac70a9a98 | ||
|
|
9029be7ccc | ||
|
|
a7df8c48b3 | ||
|
|
79ced76347 | ||
|
|
2f8d1013be | ||
|
|
c71f38ecb0 | ||
|
|
c8c0cf395a | ||
|
|
846f95d5b3 | ||
|
|
19f905d2d1 | ||
|
|
288d0ce7c6 | ||
|
|
5e3692a1b4 | ||
|
|
ae94021a21 | ||
|
|
c5240d1c0c | ||
|
|
cb50314915 | ||
|
|
cae4d092c9 | ||
|
|
0789c68f30 | ||
|
|
094e58d04d | ||
|
|
263ffd353f | ||
|
|
d6f46b80d4 | ||
|
|
a312b4a881 | ||
|
|
a49b659014 | ||
|
|
c964e274aa | ||
|
|
7687b7f73a | ||
|
|
c848726f0c | ||
|
|
521653993d | ||
|
|
4b7413295c | ||
|
|
3cc99bf2b0 | ||
|
|
1dc513e7a9 | ||
|
|
522824bb40 | ||
|
|
f39f2b516b | ||
|
|
68832ff6c0 | ||
|
|
8595f2cfc5 | ||
|
|
3f63a69c6f | ||
|
|
dbc3ed9e1c | ||
|
|
c173c2be06 | ||
|
|
7c76937cd7 | ||
|
|
868e3d4b6b | ||
|
|
5dc82a6c93 | ||
|
|
c66bf0b1c9 | ||
|
|
edc7cc4960 | ||
|
|
2ab59a3905 | ||
|
|
f48e640565 | ||
|
|
f1e22cec42 | ||
|
|
f9ff06bdd3 | ||
|
|
af758f24ff | ||
|
|
7d2cf8d305 | ||
|
|
5a25dcb56a | ||
|
|
39c7787c19 | ||
|
|
aad5a337b8 | ||
|
|
7ec5bff235 | ||
|
|
87aad4a2dd | ||
|
|
a91782b69b | ||
|
|
e7f8f9cbd1 | ||
|
|
476aa1b48b | ||
|
|
76f89187ba | ||
|
|
d3b1a62af3 | ||
|
|
0d45c46a2a | ||
|
|
b144b5ec48 | ||
|
|
08c232d70b | ||
|
|
c630d281d3 | ||
|
|
5acf35d542 | ||
|
|
f8e9227c99 | ||
|
|
617f034fa3 | ||
|
|
46d026674f | ||
|
|
318c9debd4 | ||
|
|
f449fbaaaf | ||
|
|
c28591142b | ||
|
|
abf4b74cc3 | ||
|
|
7c90677655 | ||
|
|
7aa858cf02 | ||
|
|
a7a81b53c5 | ||
|
|
18068b1cae | ||
|
|
29368cbbdb | ||
|
|
51bc450448 | ||
|
|
28c0b8e221 | ||
|
|
a85c4fae65 | ||
|
|
18916aea7f | ||
|
|
5b8837a423 | ||
|
|
de96ee2f16 | ||
|
|
6744d4ad98 | ||
|
|
6692e6daad | ||
|
|
03666b478e | ||
|
|
5c20f8340f | ||
|
|
b08bd55b1b | ||
|
|
ec05ca5dfc | ||
|
|
96cdb4ebd9 | ||
|
|
6dca518fff | ||
|
|
5ab5bc7010 | ||
|
|
3e9905565b | ||
|
|
ab96f78050 | ||
|
|
b53be32172 | ||
|
|
a18fea04c7 | ||
|
|
8f221b4b71 | ||
|
|
f911ffa9c1 | ||
|
|
e7e34c107e | ||
|
|
47cc777b04 | ||
|
|
97cb66c128 | ||
|
|
a15904937d | ||
|
|
a377206c43 | ||
|
|
350cc0ee96 | ||
|
|
850213b968 | ||
|
|
f3cb9c6fab | ||
|
|
6406973cc0 | ||
|
|
f28c360ff5 | ||
|
|
bff774ad82 | ||
|
|
8a205f92d9 | ||
|
|
9949e175e1 | ||
|
|
afd7d8fb1d | ||
|
|
bc16f3d0a4 | ||
|
|
0cbe39e834 | ||
|
|
a8d73e567e | ||
|
|
2b7929433d | ||
|
|
406cc4db43 | ||
|
|
8b4fbf0491 | ||
|
|
fcfae4d596 | ||
|
|
64256bd24a | ||
|
|
83d1903276 | ||
|
|
d42c46236b | ||
|
|
a3a19caba8 | ||
|
|
74e6f9776a | ||
|
|
44b602d775 | ||
|
|
cc7710b2c7 | ||
|
|
ff0e164b6f | ||
|
|
c6798b452c | ||
|
|
418982b732 | ||
|
|
f238366db9 | ||
|
|
127f136249 | ||
|
|
b3c31b8c64 | ||
|
|
e80c5fe6d7 | ||
|
|
7368b76e76 | ||
|
|
ed3ff60857 | ||
|
|
3ec0897f01 | ||
|
|
54044697b9 | ||
|
|
494e4d949e | ||
|
|
99858423be | ||
|
|
3c771d97d4 | ||
|
|
608c154bc5 | ||
|
|
f0c2fbf946 | ||
|
|
2f6ad86fc7 | ||
|
|
4051016a8b | ||
|
|
48b5b6e377 | ||
|
|
86d1274d6e | ||
|
|
4fc297a69f | ||
|
|
7f6481f43e | ||
|
|
6dd0696acd | ||
|
|
a3f6f37787 | ||
|
|
e9d1a86353 |
4
.gitignore
vendored
@@ -1,6 +1,8 @@
|
||||
Makefile
|
||||
|
||||
# old skool
|
||||
.svn
|
||||
|
||||
# osx noise
|
||||
.DS_Store
|
||||
profile
|
||||
profile
|
||||
|
||||
@@ -1,3 +1,13 @@
|
||||
To build
|
||||
|
||||
cp src/gcconfig.pri.in src/gcconfig.pri
|
||||
cp qwt/qwtconfig.pri.in qwt/qwtconfig.pri
|
||||
|
||||
Edit both src/gcconfig.pri and qwt/qwtconfig.pri as necessary, then
|
||||
|
||||
qmake
|
||||
make
|
||||
|
||||
To uninstall the older FTDI VCP drivers on Mac OS X, open a Terminal and type:
|
||||
|
||||
sudo mv /System/Library/Extensions/FTDIUSBSerialDriver.kext /tmp
|
||||
3
build.pro
Normal file
@@ -0,0 +1,3 @@
|
||||
TEMPLATE = subdirs
|
||||
SUBDIRS = qwt src
|
||||
CONFIG += ordered
|
||||
BIN
doc/3d.png
Normal file
|
After Width: | Height: | Size: 122 KiB |
37
doc/Makefile
@@ -2,12 +2,16 @@
|
||||
CONTENT=$(wildcard *.content)
|
||||
HTML=$(subst .content,.html,$(CONTENT))
|
||||
TARBALLS=$(wildcard gc_*.tgz)
|
||||
OTHER=logo.jpg sample.gp sample.png cpint.gp cpint.png \
|
||||
screenshot-summary.png screenshot-plot.png \
|
||||
screenshot-cpint.png screenshot-phist.png \
|
||||
screenshot-download.png screenshot-weekly.png \
|
||||
choose-a-cyclist.png main-window.png critical-power.png \
|
||||
power.zones
|
||||
OTHER= 3d.png choose-a-cyclist.png cpint.gp cpint.png critical-power-plot.png critical-power.png \
|
||||
cyclist-info.png editor.png gui-preview.png histogram-analysis.png logo.jpg logo.png \
|
||||
main-window.png map.png metrics-power.png metrics-timedist.png metrics-tiz.png pf-pv-plot.png \
|
||||
pm.png power.zones realtime.png ride-plot.png ride-plot2.png ride-summary.png sample.gp \
|
||||
sample.png weekly-summary.png google-earth.png aerolab.png
|
||||
|
||||
BIN= GoldenCheetah_2.0.0_Linux_x86_64.gz \
|
||||
GoldenCheetah_2.0.0_Linux_x86.gz \
|
||||
GoldenCheetah_2.0.0_Mac_Universal.dmg \
|
||||
GoldenCheetah_2.0.0_Windows_Installer.exe
|
||||
|
||||
all: $(HTML)
|
||||
.PHONY: all clean install
|
||||
@@ -17,7 +21,14 @@ clean:
|
||||
|
||||
install:
|
||||
rsync -avz -e ssh $(HTML) $(TARBALLS) $(OTHER) \
|
||||
srhea.net:wwwroot/goldencheetah.org/
|
||||
liversedge@srhea.net:/home/srhea/wwwroot/goldencheetah.org/
|
||||
|
||||
install-bin:
|
||||
rsync -avz -e ssh $(BIN) \
|
||||
srhea.net:/home/srhea/wwwroot/goldencheetah.org/
|
||||
|
||||
bug-tracker.html: bug-tracker.content genpage.pl
|
||||
./genpage.pl "Bug Tracker" $< > $@
|
||||
|
||||
command-line.html: command-line.content genpage.pl
|
||||
./genpage.pl "Legacy Command-Line Tools" $< > $@
|
||||
@@ -28,9 +39,18 @@ contact.html: contact.content genpage.pl
|
||||
contrib.html: contrib.content genpage.pl
|
||||
./genpage.pl "Contributors" $< > $@
|
||||
|
||||
developers-guide.html: developers-guide.content genpage.pl
|
||||
./genpage.pl "Developer's Guide" $< > $@
|
||||
|
||||
older-releases.html: older-releases.content genpage.pl
|
||||
./genpage.pl "Older Releases" $< > $@
|
||||
|
||||
download.html: download.content genpage.pl
|
||||
./genpage.pl "Download" $< > $@
|
||||
|
||||
release-notes.html: release-notes.content genpage.pl
|
||||
./genpage.pl "Release Notes" $< > $@
|
||||
|
||||
faq.html: faq.content genpage.pl
|
||||
./genpage.pl "Frequently Asked Questions" $< > $@
|
||||
|
||||
@@ -40,6 +60,9 @@ index.html: index.content genpage.pl
|
||||
license.html: license.content genpage.pl
|
||||
./genpage.pl "License" $< > $@
|
||||
|
||||
mailing-list.html: mailing-list.content genpage.pl
|
||||
./genpage.pl "Mailing Lists" $< > $@
|
||||
|
||||
screenshots.html: screenshots.content genpage.pl
|
||||
./genpage.pl "Screenshots" $< > $@
|
||||
|
||||
|
||||
BIN
doc/aerolab.png
Normal file
|
After Width: | Height: | Size: 48 KiB |
97
doc/bug-tracker.content
Normal file
@@ -0,0 +1,97 @@
|
||||
<p>We have an issue tracker set up at
|
||||
<a href=http://bugs.goldencheetah.org/projects/show/goldencheetah>
|
||||
bugs.goldencheetah.org</a>. Below are some guidelines for users and
|
||||
developers for working with the issue tracker.</p>
|
||||
<big><font face="arial,helvetica,sanserif">
|
||||
Report a new bug/feature
|
||||
</font></big>
|
||||
|
||||
<p> If you think that you have found a bug in GoldenCheetah or would like
|
||||
to request a new feature please report it by filing a new issue at our <a
|
||||
href=http://bugs.goldencheetah.org/projects/show/goldencheetah>issue
|
||||
tracker</a>. To report a bug/feature request go to the above link and
|
||||
follow these steps:
|
||||
|
||||
<ol>
|
||||
<li>Login or register for a new account.</li>
|
||||
<li>Click the "new issue" link near the top of the page.</li>
|
||||
<li>Select either "bug" or "feature" from the tracker drop-down menu.</li>
|
||||
<li>Fill out the form including as much detail as possible.<br>
|
||||
You can upload crashreports, problem files, or screenshots if they
|
||||
help document the issue.</li>
|
||||
<li>Click the create button to save your report.<br>
|
||||
This will also send a copy of your report to the Golden-Cheetah-Users
|
||||
mailing list.</li>
|
||||
</ol>
|
||||
<p>Thanks for helping to improve GoldenCheetah.</p>
|
||||
|
||||
<big><font face="arial,helvetica,sanserif">
|
||||
Managing issues in the tracker
|
||||
</font></big>
|
||||
|
||||
<p>To make it easier for all of us to track the status please try to
|
||||
adhere to a few simple guidelines listed below.</p>
|
||||
|
||||
<font face="arial,helvetica,sanserif">
|
||||
<b>Issue Status:</b>
|
||||
</font>
|
||||
<p>Depending on your account status (non-member, reporter, developer, or
|
||||
manager) you may be able to update the status of an existing issue. When
|
||||
working in the bug tracker please update the status appropriately.
|
||||
Current status options are:</p>
|
||||
|
||||
<ul>
|
||||
<li>New: Default status.
|
||||
|
||||
<li>Assigned: issue has been assigned to someone on the project. If you
|
||||
are a Developer you can assign an issue to someone, including
|
||||
yourself. If you are working on a fix, please change the status to
|
||||
Assigned, and post a message stating your plan of attack etc.
|
||||
|
||||
<li>Feedback: This could be used to alert others that you have a
|
||||
proposed fix that you want feed back on. Please attach patches and
|
||||
make a note. Also remember to tag the issue in your patches.
|
||||
|
||||
<li>Resolved: The issue has been corrected. People that have tested the
|
||||
patch or that submitted the bug should update to this status when
|
||||
they feel that it has been fixed. If it turns out that it was not
|
||||
resolved, most users can change the status back to "feedback". If
|
||||
you do so, please leave a note.
|
||||
|
||||
<li>Tempfix: A workaround for the issue has been posted, but we may still be
|
||||
working on a more long term solution.
|
||||
|
||||
<li>Closed: Those with commit access to Github are the only ones that
|
||||
can mark an issue as closed. That said, if you are submitting a
|
||||
patch that fixes and issue, please include the "fixes #<issuenum>"
|
||||
tag to your commit as this will automatically close the issue when your
|
||||
patch is accepted and pushed to github.
|
||||
</ul>
|
||||
|
||||
<font face="arial,helvetica,sanserif">
|
||||
<b>Tagging in messages</b>
|
||||
</font>
|
||||
<p>The tracker has a very basic tagging and markup scheme that is described in
|
||||
detail <a href="http://bugs.goldencheetah.org/help/wiki_syntax.html">here</a>.
|
||||
Perhaps the most useful feature is the ability to use tags to link issues,
|
||||
commits, etc. When commenting on an issue please use the following tags
|
||||
when appropriate to automatically create links when:</p>
|
||||
|
||||
<table align="center" width="600">
|
||||
<tr>
|
||||
<th>Tag</th>
|
||||
<th>Effect</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Issue #2</td>
|
||||
<td>Creates a link to existing Issue #2</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>commit:e76247a</td>
|
||||
<td>Creates a link to commit e76247a</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>source:src/MainWindow.cpp</td>
|
||||
<td>Creates a link to src/Mainwindow.cpp in our git repo</td>
|
||||
</tr>
|
||||
</table>
|
||||
@@ -1,32 +1,61 @@
|
||||
<!-- $Id: contrib.content,v 1.4 2006/09/06 04:07:18 srhea Exp $ -->
|
||||
|
||||
Sean Rhea bought a PowerTap Pro on April 20, 2006, and immediately set to
|
||||
figuring out how to use it from his Mac Powerbook without using Virtual PC.
|
||||
Within a week, he was able to download the raw data. Shortly thereafter, Russ
|
||||
Cox asked what he was up to, and the two worked together to figure out the
|
||||
packing format used. By May 4, they could reproduce the numbers given by the
|
||||
PowerTap software except for minor discrepancies in the time values. David
|
||||
Easter then pointed out how the checksum bytes in the download protocol were
|
||||
used, and Sean Rhea coded up their combined discoveries into the two
|
||||
utilities, <code>ptdl</code> and <code>ptunpk</code>.
|
||||
<p>Sean Rhea bought a PowerTap Pro on April 20, 2006 and immediately set
|
||||
to figuring out how to use it from his Mac without using Virtual PC.
|
||||
With help from Russ Cox and David Easter, he wrote two command-line
|
||||
programs for downloading data from a PowerTap and interpreting that
|
||||
data. Sean released these two tools, <code>ptdl</code> and
|
||||
<code>ptunpk</code>, on May 4, 2006.</p>
|
||||
|
||||
<p>
|
||||
Later that year, Sean needed to learn QT for his real job, and he set about
|
||||
writing a graphical version of <code>ptdl</code> and <code>ptunpk</code> for
|
||||
practice. He released the first graphical version on September 6, 2006,
|
||||
changing the name to GoldenCheetah in reference to an old legend from his days
|
||||
as a runner.
|
||||
<p>Later that year, Sean needed to learn QT for his real job, and he set
|
||||
about writing a graphical version of his software for practice. He
|
||||
released the first graphical version on September 6, 2006, changing the
|
||||
name to GoldenCheetah in reference to an old legend from his days as a
|
||||
runner.</p>
|
||||
|
||||
<p>
|
||||
Since then, a number of others have helped out in various ways.
|
||||
Robert Carlsen helped get the serial port version of the PowerTap Pro working
|
||||
with the Keyspan USB-to-serial adaptor. Robert also figured out how to build
|
||||
universal binaries for Mac OS X. Scott Overfield helped figure out
|
||||
that we should be using the <code>/dev/cu.*</code> devices instead of the
|
||||
<code>/dev/tty.*</code> ones. Aldy Hernandez and Andrew Kruse helped get
|
||||
things working under Linux.
|
||||
Dan Connelly helped find and fix several core dumps.
|
||||
Justin Knotzke contributed code to import comma-separated value files
|
||||
and visually mark intervals on the ride plot. J.T. Conklin added the ability
|
||||
to import TCX files. J.T. also added a pedal force vs. pedal velocity chart. Tom Montgomery added IBike 3 support and cleaned up the Import CSV tool, adding the default ride date when importing new files. Ned Harding resurrected the Windows builds of Golden Cheetah (fixing USB download inconsistencies in the process), then added slew of functions including the long-desired Split Ride feature. (available in version 1.0.305+).
|
||||
<p>Since then, a large community has contributed additional code and
|
||||
other support, including:</p>
|
||||
|
||||
<table width="80%">
|
||||
<tr>
|
||||
<td valign="top" width="33%">
|
||||
<ul>
|
||||
<li>Robert Carlsen</li>
|
||||
<li>Rainer Clasen</li>
|
||||
<li>Chris Cleeland</li>
|
||||
<li>J.T. Conklin</li>
|
||||
<li>Dan Connelly</li>
|
||||
<li>Damien Grauser</li>
|
||||
<li>Steve Gribble</li>
|
||||
<li>Dag Gruneau</li>
|
||||
<li>Ned Harding</li>
|
||||
</ul>
|
||||
</td>
|
||||
<td valign="top" width="33%">
|
||||
<ul>
|
||||
<li>Aldy Hernandez</li>
|
||||
<li>Jamie Kimberley</li>
|
||||
<li>Justin Knotzke</li>
|
||||
<li>Andrew Kruse</li>
|
||||
<li>Mark Liversedge</li>
|
||||
<li>Greg Lonnon</li>
|
||||
<li>Tom Montgomery</li>
|
||||
<li>Eric Murray</li>
|
||||
<li>Scott Overfield</li>
|
||||
</ul>
|
||||
</td>
|
||||
<td valign="top">
|
||||
<ul>
|
||||
<li>Mark Rages</li>
|
||||
<li>Robb Romans</li>
|
||||
<li>Mitsukuni Sato</li>
|
||||
<li>Berend de Schouwer</li>
|
||||
<li>Julian Simioni</li>
|
||||
<li>Greg Steele</li>
|
||||
<li>Tom Weichmann</li>
|
||||
<li>Keisuke Yamaguchi</li>
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
|
||||
BIN
doc/critical-power-plot.png
Normal file
|
After Width: | Height: | Size: 139 KiB |
BIN
doc/cyclist-info.png
Normal file
|
After Width: | Height: | Size: 195 KiB |
566
doc/developers-guide.content
Normal file
@@ -0,0 +1,566 @@
|
||||
<!-- $Id: users-guide.content,v 1.5 2006/05/27 16:32:46 srhea Exp $ -->
|
||||
|
||||
<p>This guide will teach you how to download the GoldenCheetah source code,
|
||||
build it, modify it, and submit your changes to be included in the next
|
||||
release. If you're just looking to use GoldenCheetah, please check out the
|
||||
<a href="users-guide.html">Users Guide</a> or the
|
||||
<a href="download.html">Download Page</a>.</p>
|
||||
|
||||
<big><font face="arial,helvetica,sanserif">
|
||||
Installing dependencies
|
||||
</font></big>
|
||||
|
||||
<p>GC requires a number of libraries. On Mac OS X, you can get most of these
|
||||
through <a href="http://www.macports.org/">Mac Ports</a>. On Linux and other
|
||||
Unixes, you can use whatever package manager your distribution provides. (We
|
||||
list the package names for MacPorts and Ubuntu below.) On Windows, you'll
|
||||
probably need to download and install everything by hand. You might also want
|
||||
to read <a href="old-mailing-list-archives/2009-September/002502.html">this
|
||||
mailing list message</a>.</p>
|
||||
|
||||
<p>You'll need the following:</p>
|
||||
<table align="center" width="500">
|
||||
<tr>
|
||||
<td>Package</td>
|
||||
<td>Version</td>
|
||||
<td>MacPorts</td>
|
||||
<td>Ubuntu</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="http://qt.nokia.com/downloads">Qt</a></td>
|
||||
<td>4.6.0 or later</td>
|
||||
<td>qt4-mac</td>
|
||||
<td>libqt4-dev</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="http://www.boost.org/users/download/">Boost</a></td>
|
||||
<td>1.38.0 or later</td>
|
||||
<td>boost</td>
|
||||
<td>libboost-dev</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="http://git-scm.com/download">git</a></td>
|
||||
<td>any</td>
|
||||
<td>git-core</td>
|
||||
<td>git</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
<p>If you're going to download directly from a PowerTap, you might need to
|
||||
install the <a href="http://www.ftdichip.com/Drivers/D2XX.htm">FTDI USB
|
||||
driver</a>. If you're going to download directly from an SRM, you need to
|
||||
download and install <a href="git://github.com/rclasen/srmio.git">libsrmio</a>.
|
||||
Neither of these libraries is required if you just want to import data you've
|
||||
already downloaded with another program.</p>
|
||||
|
||||
<big><font face="arial,helvetica,sanserif">
|
||||
Checking out the code
|
||||
</font></big>
|
||||
|
||||
<p>Once you've downloaded and installed the above dependencies, you need to
|
||||
check out the GC source code. GC uses <em>git</em> for version control. To
|
||||
checkout the code, execute this command:</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>
|
||||
git clone git://github.com/srhea/GoldenCheetah.git
|
||||
</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>That should create a new directory, <code>GoldenCheetah</code>, in your
|
||||
current working directory. In the rest of this document, we'll reference
|
||||
paths relative to that directory. You can find the source code in
|
||||
<code>GoldenCheetah/src</code>, for instance. Likewise, this
|
||||
document is in <code>GoldenCheetah/doc/developers-guide.content</code>.<p>
|
||||
|
||||
<big><font face="arial,helvetica,sanserif">
|
||||
Building an executable
|
||||
</font></big>
|
||||
|
||||
<p>To build GC, we currently use <em>qmake</em>, which comes with the Qt
|
||||
libraries referenced above. All local configuration is stored in the file
|
||||
<code>gcconfig.pri</code>, which you create by copying
|
||||
<code>gcconfig.pri.in</code>, both in the <code>GoldenCheetah/src</code>
|
||||
directory. Additionally, GoldenCheetah uses a patched version of <a
|
||||
href="http://sourceforge.net/projects/qwt/">Qwt</a> which is located in the
|
||||
<code>GoldenCheetah/qwt</code> directory. You'll need to copy the
|
||||
configuration file <code>qwtconfig.pri.in</code> to <code>qwtconfig.pri</code>
|
||||
and edit that file if needed. The steps you'll take are as follows:</p>
|
||||
|
||||
<blockquote>
|
||||
In the top level GoldenCheetah directory
|
||||
<pre>
|
||||
cp src/gcconfig.pri.in src/gcconfig.pri
|
||||
cp qwt/qwtconfig.pri.in qwt/qwtconfig.pri
|
||||
vi src/gcconfig.pri # Follow the directions at the top of the file.
|
||||
vi qwt/qwtconfig.pri # This may not need to be edited to successfully build.
|
||||
qmake build.pro # called qmake-mac in MacPorts
|
||||
make
|
||||
</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>We're aware that a lot of people would rather use a configure-like script
|
||||
for the build process. We would too, but none of us know
|
||||
<a href="http://www.gnu.org/software/autoconf/">autoconf</a> well
|
||||
enough to integrate it with Qt on Mac, Linux, and Windows. If you can help
|
||||
us out with that, please email the
|
||||
<a href="cgi-bin/mailman/listinfo/golden-cheetah-users">GoldenCheetah User's
|
||||
Mailing List</a>.</p>
|
||||
|
||||
<big><font face="arial,helvetica,sanserif">
|
||||
Making changes
|
||||
</font></big>
|
||||
|
||||
<p>Now that you've got GC up and running, you can add whatever features you want.
|
||||
We generally frown on dogmatic coding conventions, and we're big fans of the
|
||||
"rough consensus and running code" philosophy. That said, please do your best
|
||||
to adhere to the following style guidelines:</p>
|
||||
|
||||
<ul>
|
||||
<li>Use spaces instead of tabs.
|
||||
|
||||
<li>Do not end lines with whitespace. End every file with a newline.
|
||||
Otherwise git becomes angry. This command will
|
||||
highlight any whitespace problems in commit <em>abcd0123</em> in red:
|
||||
|
||||
<blockquote>
|
||||
<pre>
|
||||
git show --color abcd0123
|
||||
</pre>
|
||||
</blockquote>
|
||||
|
||||
<li>Avoid "using namespace ..." in header files.
|
||||
|
||||
<li>Don't declare global variables in header files. If you must use a global
|
||||
variable, declare it <code>static</code> within a .cpp file.
|
||||
|
||||
<li>Only call C++'s operator <code>new</code> within the constructors and
|
||||
<code>reset</code> functions of <code>std::auto_ptr</code>,
|
||||
<code>boost::scoped_pointer</code>, etc. or when passing a parent pointer to a
|
||||
Qt class (so that the parent deletes the child). Never call
|
||||
<code>delete</code> explicitly.
|
||||
|
||||
<li>Do not use <code>malloc</code> or <code>free</code> unless forced to by an
|
||||
external C library.
|
||||
|
||||
<li>Allocate large buffers on the heap, not on the stack.
|
||||
|
||||
<li>When the C++ standard library has an appropriate function, use it.
|
||||
Likewise for Qt and Boost.
|
||||
|
||||
<li>Only use external libraries with GPL-compatible licenses.
|
||||
|
||||
<li>Avoid C-style casts. Learn and use C++'s <code>static_cast</code>,
|
||||
<code>reinterpret_cast</code>, etc.
|
||||
</ul>
|
||||
|
||||
<p>Not all of the GoldenCheetah code follows these guidelines today, but we're
|
||||
working on it. You can help out by adhering to them in new code.</p>
|
||||
|
||||
<hr width="20%"/>
|
||||
|
||||
<p>At some point, you'll probably decide that a change you've made is worth
|
||||
sharing with others. You'll use <em>git</em> again to share your changes, and
|
||||
the following sections will show you how. A warning: git is pretty hard to
|
||||
learn, but it's worth it. Once you get used to it, you'll be surprised you
|
||||
ever put up with another revision control system.</p>
|
||||
|
||||
<big><font face="arial,helvetica,sanserif">
|
||||
Committing changes to git
|
||||
</font></big>
|
||||
|
||||
<p> An example will make this section more concrete. Since my SRM doesn't
|
||||
record altitude, let's say that I get annoyed that the Ride Summary always
|
||||
shows "Elevation Gain (feet): 0.0", so I change the code not to show any ride
|
||||
metric whose value is zero. <em>git-diff</em> shows exactly what I've
|
||||
changed:</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>
|
||||
$ cd GoldenCheetah/src
|
||||
$ git diff
|
||||
diff --git a/src/RideItem.cpp b/src/RideItem.cpp
|
||||
index 6971b9b..c368725 100644
|
||||
--- a/src/RideItem.cpp
|
||||
+++ b/src/RideItem.cpp
|
||||
@@ -362,6 +362,8 @@ RideItem::htmlSummary()
|
||||
assert(displayName.length() > 0);
|
||||
const RideMetric *m = metrics.value(name);
|
||||
assert(m);
|
||||
+ if (m->value(false) == 0.0)
|
||||
+ continue;
|
||||
if (m->units(metricUnits) == "seconds") {
|
||||
QString s("<tr><td>%1:</td><td "
|
||||
"align=\"right\">%2</td></tr>");
|
||||
</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>In order to share this change, I need to use <em>git-commit</em>:</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>
|
||||
$ git commit RideItem.cpp
|
||||
</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>git will open up an editor for me to type a commit message. It's important
|
||||
to take the time to write good commit messages, as they form a history of who
|
||||
has changed which lines of code and for what purpose. The first line of every
|
||||
commit message should be a short description of 50 characters or less. The
|
||||
second line should be blank. Subsequent lines should be less than 80
|
||||
characters long and should describe the change in detail. If your commit
|
||||
addresses an existing bug or feature please add a tag to the body of your
|
||||
commit message. Allowable tags are "fixes" which is used to close an
|
||||
issue and "refs" to reference an issue. For example, adding the text
|
||||
"fixes #2" will close issue #2. Once I write the file and exit the
|
||||
editor, <em>git-log</em> will show the result:</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>
|
||||
$ git log -p -1
|
||||
commit 30303ef2d11f4bead0860b969b4b74814053b76b
|
||||
Author: Sean Rhea <sean.c.rhea@gmail.com>
|
||||
Date: Wed Sep 2 21:04:33 2009 -0400
|
||||
|
||||
don't include zero metrics in ride summary
|
||||
|
||||
When a device doesn't have altitude, there's no reason to show it. Likewise
|
||||
with heart rate if the user wasn't wearing a heart rate monitor during a ride.
|
||||
Maybe in the future this behavior could be enabled on a per-metric basis.
|
||||
|
||||
diff --git a/src/RideItem.cpp b/src/RideItem.cpp
|
||||
index 6971b9b..c368725 100644
|
||||
--- a/src/RideItem.cpp
|
||||
+++ b/src/RideItem.cpp
|
||||
@@ -362,6 +362,8 @@ RideItem::htmlSummary()
|
||||
assert(displayName.length() > 0);
|
||||
const RideMetric *m = metrics.value(name);
|
||||
assert(m);
|
||||
+ if (m->value(false) == 0.0)
|
||||
+ continue;
|
||||
if (m->units(metricUnits) == "seconds") {
|
||||
QString s("<tr><td>%1:</td><td "
|
||||
"align=\"right\">%2</td></tr>");
|
||||
</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>Note that had I changed more than one file, I would have just listed them
|
||||
all when I ran <em>git-commit</em>. For example,</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>
|
||||
$ git commit file1.cpp file2.cpp
|
||||
</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>I can also commit everything I've changed all at once via</p>
|
||||
<blockquote>
|
||||
<pre>
|
||||
$ git commit . # note the 'dot'
|
||||
</pre>
|
||||
</blockquote>
|
||||
|
||||
<big><font face="arial,helvetica,sanserif">
|
||||
Managing commits
|
||||
</font></big>
|
||||
|
||||
<p>git works best if you commit early and often. For example, I usually
|
||||
commit a few times as I'm writing a new feature. Once I get my code to
|
||||
compile, I commit it again. Then if I fix any bugs that turn up during
|
||||
runtime, I commit the bug fixes. Then maybe I go back and clean up the new
|
||||
code, now that I understand the problem better, and I commit those changes,
|
||||
too.</p>
|
||||
|
||||
<p>The reasoning behind all of these commits is that commits are like save
|
||||
points in a video game. If at any point I decide I'm messing things up,
|
||||
I can just go back to the previous commit. <em>git-diff</em> shows me my
|
||||
uncommitted changes. Let's say that I've decided I should also change the
|
||||
text in the Ride Summary to reflect the fact that I'm only showing non-zero
|
||||
metrics now. Here's my change:</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>
|
||||
$ git diff
|
||||
diff --git a/src/RideItem.cpp b/src/RideItem.cpp
|
||||
index c368725..2ff9c49 100644
|
||||
--- a/src/RideItem.cpp
|
||||
+++ b/src/RideItem.cpp
|
||||
@@ -159,13 +159,13 @@ static const char *metricsXml =
|
||||
" precision=\"1\"/>\n"
|
||||
" </metric_group>\n"
|
||||
" <metric_group name=\"Averages\">\n"
|
||||
- " <metric name=\"average_speed\" display_name=\"Speed\"\n"
|
||||
+ " <metric name=\"average_speed\" display_name=\"(Non-zero) Speed\"\n"
|
||||
" precision=\"1\"/>\n"
|
||||
- " <metric name=\"average_power\" display_name=\"Power\"\n"
|
||||
+ " <metric name=\"average_power\" display_name=\"(Non-zero) Power\"\n"
|
||||
" precision=\"0\"/>\n"
|
||||
- " <metric name=\"average_hr\" display_name=\"Heart rate\"\n"
|
||||
+ " <metric name=\"average_hr\" display_name=\"(Non-zero) Heart rate\"\n"
|
||||
" precision=\"0\"/>\n"
|
||||
- " <metric name=\"average_cad\" display_name=\"Cadence\"\n"
|
||||
+ " <metric name=\"average_cad\" display_name=\"(Non-zero) Cadence\"\n"
|
||||
" precision=\"0\"/>\n"
|
||||
" </metric_group>\n"
|
||||
" <metric_group name=\"BikeScore™\" note=\"BikeScore is a trademark
|
||||
</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>But now I decide I don't like that change--I'd rather do it another way.
|
||||
No problem. <em>git-checkout</em> will restore the previous version committed:</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>
|
||||
$ git checkout src/RideItem.cpp
|
||||
</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>If I want to restore the entire directory to the state of the last commit,
|
||||
I checkout the whole directory:</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>
|
||||
$ git checkout . # note the 'dot'
|
||||
</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>Alternatively, if I had already committed this change, I can use
|
||||
<em>git-reset</em> to throw away my latest commit like this:</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>
|
||||
$ git reset --hard HEAD^
|
||||
</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>Be careful with that one, though--it's irreversible.</p>
|
||||
|
||||
<big><font face="arial,helvetica,sanserif">
|
||||
Combining commits
|
||||
</font></big>
|
||||
|
||||
<p>Coming back to our example, let's say I instead decide to change the ride
|
||||
summary a little differently and commit it:</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>
|
||||
$ git log -p -1
|
||||
commit 225f3093a206cbcc296ed1c8a25996ce1968bda6
|
||||
Author: Sean Rhea <sean.c.rhea@gmail.com>
|
||||
Date: Sat Sep 5 16:21:33 2009 -0400
|
||||
|
||||
include "non-zero" in metric group titles
|
||||
|
||||
diff --git a/src/RideItem.cpp b/src/RideItem.cpp
|
||||
index c368725..449e19e 100644
|
||||
--- a/src/RideItem.cpp
|
||||
+++ b/src/RideItem.cpp
|
||||
@@ -146,7 +146,7 @@ double RideItem::timeInZone(int zone)
|
||||
|
||||
static const char *metricsXml =
|
||||
"<metrics>\n"
|
||||
- " <metric_group name=\"Totals\">\n"
|
||||
+ " <metric_group name=\"Non-zero Totals\">\n"
|
||||
" <metric name=\"workout_time\" display_name=\"Workout time\"\n"
|
||||
" precision=\"0\"/>\n"
|
||||
" <metric name=\"time_riding\" display_name=\"Time riding\"\n"
|
||||
@@ -158,7 +158,7 @@ static const char *metricsXml =
|
||||
" <metric name=\"elevation_gain\" display_name=\"Elevation Gain\"\n"
|
||||
" precision=\"1\"/>\n"
|
||||
" </metric_group>\n"
|
||||
- " <metric_group name=\"Averages\">\n"
|
||||
+ " <metric_group name=\"Non-zero Averages\">\n"
|
||||
" <metric name=\"average_speed\" display_name=\"Speed\"\n"
|
||||
" precision=\"1\"/>\n"
|
||||
" <metric name=\"average_power\" display_name=\"Power\"\n"
|
||||
</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>Now I have two commits, which I can see with <em>git-log</em>:</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>
|
||||
$ git log origin/master..devel-guide
|
||||
commit 225f3093a206cbcc296ed1c8a25996ce1968bda6
|
||||
Author: Sean Rhea <sean.c.rhea@gmail.com>
|
||||
Date: Sat Sep 5 16:21:33 2009 -0400
|
||||
|
||||
include "non-zero" in metric group titles
|
||||
|
||||
commit df657cd3f0dcb8484a468c2efb04da77ee0472e0
|
||||
Author: Sean Rhea <sean.c.rhea@gmail.com>
|
||||
Date: Wed Sep 2 13:42:33 2009 -0400
|
||||
|
||||
don't include zero metrics in ride summary
|
||||
|
||||
When a device doesn't have altitude, there's no reason to show it. Likewise
|
||||
with heart rate if the user wasn't wearing a heart rate monitor during a ride.
|
||||
Maybe in the future this behavior could be enabled on a per-metric basis.
|
||||
</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>If I'm happy with my changes, I can share them with the world just
|
||||
like they are using <em>git-format-patch</em>. In this case, however, these
|
||||
two changes should really be combined into one: the second change was
|
||||
something I should have done along with the first, I just didn't think of it
|
||||
at the time. I can use <em>git-rebase -i</em> to combine them:</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>
|
||||
$ git rebase -i origin/master
|
||||
</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>That will bring up an editor window with a list of my changes, like
|
||||
this:</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>
|
||||
pick df657cd don't include zero metrics in ride summary
|
||||
pick 225f309 include "non-zero" in metric group titles
|
||||
|
||||
# Rebase df33fe2..920643f onto df33fe2
|
||||
#
|
||||
# Commands:
|
||||
# p, pick = use commit
|
||||
# e, edit = use commit, but stop for amending
|
||||
# s, squash = use commit, but meld into previous commit
|
||||
#
|
||||
# If you remove a line here THAT COMMIT WILL BE LOST.
|
||||
# However, if you remove everything, the rebase will be aborted.
|
||||
#
|
||||
</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>The directions are pretty self explanatory. You can reorder commits by
|
||||
reordering their lines in this file. You can drop a commit by removing it
|
||||
from the file entirely. You can also change the first word on a line from
|
||||
"pick" to "squash", and git will combine that commit with the one that comes
|
||||
before it. That's what I want to do here. I change line 2 of this file so
|
||||
that the first two lines are:</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>
|
||||
pick df657cd don't include zero metrics in ride summary
|
||||
squash 225f309 include "non-zero" in metric group titles
|
||||
</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>Then I write the file and quit the editor. Git does a little work
|
||||
saying:</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>
|
||||
Rebasing (1/2)
|
||||
</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>And then it brings up another editor window that shows both of my commit
|
||||
messages. I edit the two message to combine them into one, write the file,
|
||||
and exit the editor. git says:</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>
|
||||
Successfully rebased and updated refs/heads/master.
|
||||
</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>And I can see the result with <code>git log -p</code>.</p>
|
||||
|
||||
<big><font face="arial,helvetica,sanserif">
|
||||
Submitting a patch
|
||||
</font></big>
|
||||
|
||||
<p>Okay, <em>now</em> I'm ready to share my change. I'll use
|
||||
<em>git-format-patch</em>:
|
||||
|
||||
<blockquote>
|
||||
<pre>
|
||||
$ git format-patch HEAD^
|
||||
0001-don-t-include-zero-metrics-in-ride-summary.patch
|
||||
</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>In the <code>GoldenCheetah/src</code> directory I'll now find a <em>patch
|
||||
file</em>, <code>0001-don-t-include-zero-metrics-in-ride-summary.patch</code>,
|
||||
that other people can use to include my change in their own local git
|
||||
repositories.</p>
|
||||
|
||||
<p>If you have a patch you'd like to share with others, you can email it to
|
||||
the <a href="cgi-bin/mailman/listinfo/golden-cheetah-users">GoldenCheetah
|
||||
User's Mailing List</a>, and it will be considered for inclusion in the next
|
||||
release of GoldenCheetah. In fact, if you join the mailing list, you'll see
|
||||
lots of patches like this. You may even want to try some of them.</p>
|
||||
|
||||
<big><font face="arial,helvetica,sanserif">
|
||||
Applying patches
|
||||
</font></big>
|
||||
|
||||
<p>Let's say I email the patch above to the mailing list, and it sounds like a
|
||||
useful feature to you. To test it yourself, you can download the patch file
|
||||
to your <code>GoldenCheetah/src</code> directory and apply it to your
|
||||
repository using <em>git-am</em>:</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>
|
||||
$ git am 0001-don-t-include-zero-metrics-in-ride-summary.patch
|
||||
Applying: don't include zero metrics in ride summary
|
||||
</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>If you now type, "git log", you'll see that "don't include zero metrics in
|
||||
ride summary" has been added to your repository.</p>
|
||||
|
||||
<p>If enough people like a patch, and it doesn't introduce any new bugs, one
|
||||
of the GoldenCheetah maintainers will probably commit it to the official GC
|
||||
repository on github.</p>
|
||||
|
||||
<big><font face="arial,helvetica,sanserif">
|
||||
Staying up to date
|
||||
</font></big>
|
||||
|
||||
<p>In order to keep your local repository up to date with
|
||||
the official one, you use <em>git-fetch</em> followed by
|
||||
<em>git-rebase</em>:</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>
|
||||
$ git fetch origin
|
||||
$ git rebase origin/master
|
||||
First, rewinding head to replay your work on top of it...
|
||||
Fast-forwarded master to origin/master.
|
||||
</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>Note that, unlike above, we didn't supply a "-i" option to
|
||||
<em>git-rebase</em> this time.</p>
|
||||
|
||||
<p><em>git-fetch</em> downloads a copy of all the patches at github to
|
||||
your local repository, but it doesn't apply them. <em>git-rebase</em> undoes
|
||||
the changes that are unique to your local repository, applies any new patches
|
||||
from <code>origin/master</code>, and then re-applies your patches.</p>
|
||||
|
||||
<p>If you have uncommitted changes, the rebase will fail:</p>
|
||||
|
||||
<blockquote>
|
||||
<pre>
|
||||
$ git rebase origin/master
|
||||
src/RideItem.cpp: needs update
|
||||
cannot rebase: you have unstaged changes
|
||||
</pre>
|
||||
</blockquote>
|
||||
|
||||
<p>Commit your changes with <em>git-commit</em> and then re-run the
|
||||
<em>git-rebase</em>. It will work this time.</p>
|
||||
|
||||
<p>For developers who are used to subversion, this need to commit changes
|
||||
before rebasing is the most annoying aspect of git. All I can say is that you
|
||||
won't mind it much after time. Because you can use "git rebase -i" to
|
||||
combine, reorder, and even drop commits, a commit in git is much lighter
|
||||
weight than one in subversion. As I said above, commit early and often.</p>
|
||||
|
||||
<p>If the changes from github conflict with yours, you'll have to merge.
|
||||
<em>git-rebase</em> will exit with an error and a list of directions on how to
|
||||
fix things. Read them carefully.</p>
|
||||
|
||||
|
||||
@@ -1,297 +1,72 @@
|
||||
<!-- $Id: download.content,v 1.6 2009/01/09 20:45:03 rcarlsen Exp $ -->
|
||||
|
||||
<p>
|
||||
Golden Cheetah is available as source code and in binary form for
|
||||
Mac OS X Universal Binary, Linux on x86 processors and Windows 32-bit.
|
||||
Golden Cheetah is available in binary form for
|
||||
Linux x86, Mac OS X (universal binary), and Windows.
|
||||
It is also available as source code.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Golden Cheetah downloads data from all versions of the PowerTap
|
||||
computer including the new Joule. If you're using the PowerTap USB cradle
|
||||
(as opposed to the older, serial cable), you may need to install the
|
||||
<a href="http://www.ftdichip.com/Drivers/D2XX.htm">FTDI USB driver</a>
|
||||
before downloading.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
On Linux and Mac OS X, Golden Cheetah also downloads from the SRM PCV. On Mac
|
||||
OS X, you'll need to install <a href="http://osx-pl2303.sourceforge.net/">the
|
||||
open source PL2303 driver</a> to download from an SRM. Please see the
|
||||
<a href="http://bugs.goldencheetah.org/projects/goldencheetah/wiki/">WIKI</a> article
|
||||
- <a href="http://bugs.goldencheetah.org/projects/goldencheetah/wiki/PCV_on_Mac_OS_X">
|
||||
PCV on Mac OS X</a> for further information.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<font face="arial,helvetica,sanserif">
|
||||
<big><strong>Download Release 2.1</strong></big>
|
||||
</font>
|
||||
</p>
|
||||
|
||||
<ul>
|
||||
<li><a href="GoldenCheetah_2.1.0_Windows_Installer.exe">Windows 32-bit (runs on 64bit as well)</a>
|
||||
<li><a href="GoldenCheetah_2.1.0_Mac_Universal.dmg">Mac OS X Universal 10.4->10.7</a><br>
|
||||
<li><a href="GoldenCheetah_2.1.0_Linux_x86.tgz">Linux x86</a><br>
|
||||
<li><a href="GoldenCheetah_2.1.0_Linux_x86_64.tgz">Linux x86_64</a><br>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Please follow the <a href="/users-guid.html">User's Guide</a> on how to install
|
||||
and use Golden Cheetah.
|
||||
</p>
|
||||
<p>
|
||||
Depending on your operating system, you may need to install the <a
|
||||
href="http://www.ftdichip.com/Drivers/D2XX.htm">FTDI USB
|
||||
driver</a> if you're using the PowerTap's new USB download cradle. The FTDI USB drivers are an optional install if you do not plan on downloading from your device using Golden Cheetah.
|
||||
You can also <a href="release-notes.html">view the release notes</a> for 2.1
|
||||
or <a href="older-releases.html">download older releases</a> of Golden Cheetah.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<font face="arial,helvetica,sanserif">
|
||||
<big><strong>Development Releases</strong></big>
|
||||
</font>
|
||||
</p>
|
||||
|
||||
<p>Gareth Coco has also made
|
||||
<a href="http://goldencheetah.stand2surf.net/">regular development builds</a>
|
||||
available. These binaries are based on the latest source code, so they may have
|
||||
more features and less (but sometime more) bugs than the stable release above.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<font face="arial,helvetica,sanserif">
|
||||
<big><strong>Source Code</strong></big>
|
||||
</font>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The Golden Cheetah source code is available via
|
||||
<a href="http://git-scm.com/">git</a>. You need to install
|
||||
<a href="http://www.trolltech.com/products/qt">QT 4.5.x</a> and
|
||||
<a href="http://qwt.sourceforge.net/">qwt 5.0.2</a> (as a static, not
|
||||
dynamic, library) and
|
||||
edit <code>goldencheetah/src/src.pro</code> to point to them
|
||||
before building GoldenCheetah.
|
||||
Use this command to check out the current version of the repository:
|
||||
|
||||
<pre>
|
||||
git clone git://github.com/srhea/GoldenCheetah.git
|
||||
</pre>
|
||||
|
||||
The Golden Cheetah source code is available via git. See the
|
||||
<a href="developers-guide.html">Developer's Guide</a> for more information.
|
||||
You can also <a href="http://github.com/srhea/GoldenCheetah/tree/master/">browse
|
||||
the source on github</a>.
|
||||
|
||||
<p>
|
||||
<font face="arial,helvetica,sanserif">
|
||||
<big><strong>Binaries</strong></big>
|
||||
</font>
|
||||
|
||||
<p>
|
||||
<center>
|
||||
<table width="100%" cellspacing="10">
|
||||
<tr>
|
||||
<td width="20%"><i>Version</i></td>
|
||||
<td width="30%"><i>Files</i></td>
|
||||
<td><i>Description</i></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top">1.1.325</td>
|
||||
<td valign="top">
|
||||
<a href="GoldenCheetah_1.1.325_Linux_x86.gz">Linux x86</a><br>
|
||||
<a href="GoldenCheetah_1.1.325_Linux_x86_64.gz">Linux x86_64</a><br>
|
||||
<a href="GoldenCheetah_1.1.325_Darwin_Universal.dmg">Mac OS X Universal</a><br>
|
||||
<a href="GoldenCheetah_1.1.325_Windows_Installer.exe">Windows 32-bit</a>
|
||||
</td>
|
||||
<td valign="top">
|
||||
<p>
|
||||
First official Windows release courtesy of Ned Harding. Ned put much effort into the port to make the download reliable and created a nice installer, too (Thanks Ned!). He also provided the long-awaited Split Ride feature - break up a ride file into separate rides easily using long time gaps and intervals.
|
||||
<ul>
|
||||
<li>Ant+Sport PowerTap support.
|
||||
<li>Split Rides by time gaps or intervals.
|
||||
<li>Delete ride from list.
|
||||
<li>Use distance or time for x-axis in Ride Plot (Thanks Damain).
|
||||
<li>Numerous bug fixes (Thanks Tom, Dan).
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top">1.0.277</td>
|
||||
<td valign="top">
|
||||
<a href="GoldenCheetah_1.0.277_Linux_x86.gz">Linux x86</a>,<br>
|
||||
<a href="GoldenCheetah_1.0.277_Linux_x86_64.tar.gz">Linux x86_64</a>,<br>
|
||||
<a href="GoldenCheetah_1.0.277_Darwin_Universal.dmg">Mac OS X Universal</a>
|
||||
</td>
|
||||
<td valign="top">
|
||||
<p>*Note: Beginning with this release we are changing to a numbered versioning system. Minor point releases will generally indicate builds with new features, while bugfix releases will increment the final number, which represents the svn revision*</p>
|
||||
<p>Several new features in this release: Critical Power calculator, find best intervals utility, Pedal Force / Pedal Velocity chart, iBike and Ergomo CSV import, GUI power zones creator, separate vertical axes for Power / HR / Cadence and Speed in the Ride plot, sorting rides with the most recent at the top of the list, and many bug fixes courtesy of JT Conklin.
|
||||
</p>
|
||||
<p>You may need to install <a href="http://www.ftdichip.com/Drivers/D2XX.htm">USB drivers</a> from FTDI.
|
||||
</p>
|
||||
<p>
|
||||
For posterity, the <a href="http://robertcarlsen.net/blog/?page_id=49">beta version</a> for Windows, based on r295.
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top">Mar 10, 2008</td>
|
||||
<td valign="top">
|
||||
<a href="GoldenCheetah_2008-03-10_Linux_x86.tgz">Linux x86</a>,<br>
|
||||
<a href="GoldenCheetah_2008-03-10_Darwin_Universal.dmg">Mac OS X Universal</a>
|
||||
</td>
|
||||
<td valign="top">
|
||||
This release introduces <a href="http://www.physfarm.com/Analysis%20of%20Power%20Output%20and%20Training%20Stress%20in%20Cyclists-%20BikeScore.pdf">BikeScore™</a>,
|
||||
a metric of training stress developed by Dr. Philip Skiba. It also
|
||||
fixes several small bugs in earlier releases.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top">Sep 23, 2007</td>
|
||||
<td valign="top">
|
||||
<a href="GoldenCheetah_2007-09-23_Linux_x86.tgz">Linux x86</a>,<br>
|
||||
<a href="GoldenCheetah_2007-09-23_Darwin_i386.dmg">Mac OS X x86</a>,<br>
|
||||
<a href="GoldenCheetah_2007-09-23_Darwin_powerpc.dmg">Mac OS X PowerPC</a>
|
||||
</td>
|
||||
<td valign="top">
|
||||
Bug fix release. CVS imports weren't quite working in the last one.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top">Sep 18, 2007</td>
|
||||
<td valign="top">
|
||||
<a href="GoldenCheetah_2007-09-18_Linux_x86.tgz">Linux x86</a>,<br>
|
||||
<a href="GoldenCheetah_2007-09-18_Darwin_powerpc.dmg">Mac OS X PowerPC</a>
|
||||
</td>
|
||||
<td valign="top">
|
||||
This release adds two small, but excellent features from Justin Knotzke:
|
||||
CSV file imports and visual interval markers in the ride plot.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top">Aug 7, 2007</td>
|
||||
<td valign="top">
|
||||
<a href="GoldenCheetah_2007-08-07_Linux_x86.tgz">Linux x86</a>,<br>
|
||||
<a href="GoldenCheetah_2007-08-07_Darwin_powerpc.dmg">Mac OS X PowerPC</a>
|
||||
</td>
|
||||
<td valign="top">This release fixes a bug in the critical power
|
||||
intervals graph where you could get bad data if you started an interval
|
||||
after a long period of not moving. It also adds really basic zooming to
|
||||
the ride plot: use the left mouse button to zoom in and the right one to
|
||||
return to the previous zoom state. It's pretty crappy right now, but
|
||||
it's better than nothing.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top">Apr 26, 2007</td>
|
||||
<td valign="top">
|
||||
<a href="GoldenCheetah_2007-04-26_Linux_x86.tgz">Linux x86</a>,<br>
|
||||
<a href="GoldenCheetah_2007-04-26_Darwin_powerpc.dmg">Mac OS X PowerPC</a>
|
||||
</td>
|
||||
<td valign="top">This release fixes some bugs and adds a whole bunch of
|
||||
new features:
|
||||
<ul>
|
||||
<li>Now imports .srm files (direct download from SRM hopefully coming
|
||||
soon)
|
||||
<li>New "Weekly Summary" tab shows total weekly hours, miles, and work
|
||||
<li>Power zones can now be entered into a text file, after which GC will
|
||||
display time in each zone in the ride and weekly summaries; for more
|
||||
information on the zone file format, <a href="zones.html">see this
|
||||
page</a>.
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top">Apr 1, 2007</td>
|
||||
<td valign="top">
|
||||
<a href="GoldenCheetah_2007-04-01_Linux_x86.tgz">Linux x86</a>,<br>
|
||||
<a href="GoldenCheetah_2007-04-01_Darwin_powerpc.dmg">Mac OS X PowerPC</a>
|
||||
</td>
|
||||
<td valign="top">This release fixes a bug that was introduced with the
|
||||
hardware echo detection code. If you're using the CycleOps-supplied USB
|
||||
cable to download from your PowerTap unit, this release should make
|
||||
downloads more reliable. (Those using the KeySpan USB-to-serial adaptor
|
||||
or a plain-old serial port shouldn't see any difference.)</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top">Feb 22, 2007</td>
|
||||
<td valign="top">
|
||||
<a href="GoldenCheetah_2007-02-22_Linux_x86.tgz">Linux x86</a>,<br>
|
||||
<a href="GoldenCheetah_2007-02-22_Darwin_powerpc.dmg">Mac OS X PowerPC</a>
|
||||
</td>
|
||||
<td valign="top">Clicking on the Critical Power Plot now displays the
|
||||
interval duration, maximum power for that ride, and maximum power for all
|
||||
rides below the plot. Also fixes a bug for recording intervals longer than
|
||||
two seconds.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top">Feb 12, 2007</td>
|
||||
<td valign="top">
|
||||
<a href="GoldenCheetah_2007-02-12_Linux_x86.tgz">Linux x86</a>,<br>
|
||||
<a href="GoldenCheetah_2007-02-12_Darwin_powerpc.dmg">Mac OS X PowerPC</a>
|
||||
</td>
|
||||
<td valign="top">Interval information now included in ride summary, rides can
|
||||
now be exported as comma-separated values for import into Excel, and better
|
||||
automatic detection of hardware echo. Also includes a number of bux
|
||||
fixes.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top">Jan 30, 2007</td>
|
||||
<td valign="top">
|
||||
<a href="GoldenCheetah_2007-01-30_Linux_x86.tgz">Linux x86</a>,<br>
|
||||
<a href="GoldenCheetah_2007-01-30_Darwin_powerpc.dmg">Mac OS X PowerPC</a>
|
||||
</td>
|
||||
<td valign="top">Bug fix release.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top">Jan 6, 2007</td>
|
||||
<td valign="top"><a href="GoldenCheetah_2007-01-06_Linux_x86.tgz">Linux
|
||||
x86</a></td>
|
||||
<td valign="top">First release for Linux.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top">Dec 25, 2006</td>
|
||||
<td valign="top"><a href="GoldenCheetah_2006-12-25_Darwin_powerpc.dmg">Mac OS
|
||||
X PowerPC</a></td>
|
||||
<td valign="top">Adds the Power Histogram, which shows how much time a rider
|
||||
spent at each particular power level during a ride.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top">Sep 19, 2006</td>
|
||||
<td valign="top"><a href="GoldenCheetah_2006-09-19_Darwin_powerpc.dmg">Mac OS
|
||||
X PowerPC</a></td>
|
||||
<td valign="top">Adds the Critical Power Plot, which shows the highest average
|
||||
power you've achieved for every interval length over all your rides and the
|
||||
selected ride. Also shows download progress in minutes of ride data
|
||||
downloaded.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top">Sep 7, 2006</td>
|
||||
<td valign="top"><a href="GoldenCheetah_2006-09-07_Darwin_powerpc.dmg">Mac OS
|
||||
X PowerPC</a></td>
|
||||
<td valign="top">Adds speed and cadence to the ride plot. Fixes a bug
|
||||
found by George Gilliland where reseting the time during a ride could cause
|
||||
the GUI to crash.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top">Sep 6, 2006</td>
|
||||
<td valign="top"><a href="GoldenCheetah_2006-09-06_Darwin_powerpc.dmg">Mac OS
|
||||
X PowerPC</a></td>
|
||||
<td valign="top">The first release of the Golden Cheetah GUI.</td>
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
</center>
|
||||
|
||||
<p>
|
||||
<hr width="50%">
|
||||
|
||||
<p>
|
||||
<font face="arial,helvetica,sanserif">
|
||||
<big><strong>Older Stuff</strong></big>
|
||||
</font>
|
||||
|
||||
<p>
|
||||
These are the older, source-only, command-line distributions. I've left them
|
||||
up for historical purposes only; I don't recommend using them.
|
||||
|
||||
<center>
|
||||
<table width="100%" cellspacing="10">
|
||||
<tr>
|
||||
<td width="20%"><i>Date</i></td>
|
||||
<td width="30%"><i>File</i></td>
|
||||
<td><i>Description</i></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top">Aug 11, 2006</td>
|
||||
<td valign="top"><a href="gc_2006-08-11.tgz">gc_2006-08-11.tgz</a></td>
|
||||
<td valign="top">ptdl now works with Keyspan USB-to-serial adaptor, after
|
||||
debugging help from Rob Carlsen.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top">May 27, 2006</td>
|
||||
<td valign="top"><a href="gc_2006-05-27.tgz">gc_2006-05-27.tgz</a></td>
|
||||
<td valign="top">Adds the <code>cpint</code> program for computing critical
|
||||
power intervals and the <code>ptpk</code> program for converting from
|
||||
PowerTuned data files (see the <a href="users-guide.html">User's
|
||||
Guide</a>).</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top">May 16, 2006</td>
|
||||
<td valign="top"><a href="gc_2006-05-16.tgz">gc_2006-05-16.tgz</a></td>
|
||||
<td valign="top">The first code release, containing <code>ptdl</code> and
|
||||
<code>ptunpk</code>.</td>
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
</center>
|
||||
|
||||
|
||||
BIN
doc/editor.png
Normal file
|
After Width: | Height: | Size: 155 KiB |
@@ -18,7 +18,8 @@ Applications, double-clicked on it, and nothing happened. What
|
||||
gives?</i></b>
|
||||
|
||||
<p>
|
||||
Are you running OS X Tiger? You need to be. If you are, and you're still
|
||||
Are you running OS X Tiger (10.4) or later? You need to be.
|
||||
If you are, and you're still
|
||||
having this problem, open Terminal (in Applications -> Utilities) and type
|
||||
this at the prompt:
|
||||
|
||||
@@ -29,51 +30,3 @@ this at the prompt:
|
||||
then press <return> and send an email to the mailing list with
|
||||
whatever it prints out. We'll help you debug it.
|
||||
|
||||
<p>
|
||||
<b><i>I've downloaded and unpacked the data. Now what do I do with
|
||||
it?</i></b>
|
||||
|
||||
<p>
|
||||
We highly recommend that you buy and read both Joe Friel's <i>The
|
||||
Cyclist's Training Bible</i> and Allen and Coggan's <i>Training and
|
||||
Racing with a Power Meter</i>. The former is the definitive book about all
|
||||
aspects of cycling training (although we think he's off his rocker in the
|
||||
chapter about diet), and the latter is the definitive book about power-based
|
||||
training.
|
||||
|
||||
<p>
|
||||
Also, if you buy either of these books through the links below, we'll get a
|
||||
referral fee in return, helping us to support this web site. Thanks!
|
||||
|
||||
<center>
|
||||
<iframe
|
||||
src="http://rcm.amazon.com/e/cm?t=goldencheetah-20&o=1&p=8&l=as1&asins=B0006JHZ7Q&fc1=000000&IS2=1<1=_blank&lc1=0000ff&bc1=000000&bg1=ffffff&f=ifr"
|
||||
style="width:120px;height:240px;" scrolling="no" marginwidth="0"
|
||||
marginheight="0" frameborder="0"></iframe>
|
||||
|
||||
<iframe
|
||||
src="http://rcm.amazon.com/e/cm?t=goldencheetah-20&o=1&p=8&l=as1&asins=1931382794&fc1=000000&IS2=1<1=_blank&lc1=0000ff&bc1=000000&bg1=ffffff&f=ifr"
|
||||
style="width:120px;height:240px;" scrolling="no" marginwidth="0"
|
||||
marginheight="0" frameborder="0"></iframe>
|
||||
</center>
|
||||
|
||||
<p>
|
||||
<b><i>Does the output of <code>ptunpk</code> exactly match that of the software
|
||||
included with the PowerTap?</i></b>
|
||||
|
||||
<p>
|
||||
Almost. If you run it in compatibility mode, using the <code>-c</code>
|
||||
option, it matches the PowerTap software's output exactly on everything but
|
||||
the time values, at least for the five sample rides we've tried it with.
|
||||
The times are a little off, but not by more than 0.1%, so we don't consider it
|
||||
a big deal.
|
||||
|
||||
<p>
|
||||
That said, the PowerTap software does some weird things, like converting from
|
||||
kilometers to miles by multiplying by 0.62, but then reporting the miles
|
||||
values with five digits after the decimal place. If you run
|
||||
<code>ptunpk</code> without the <code>-c</code> option, it will unpack the
|
||||
data in the way we think it should. The results mostly match up with the
|
||||
official ones, and are almost certainly identical within the range of accuracy
|
||||
of the device.
|
||||
|
||||
|
||||
@@ -28,14 +28,23 @@ print<<EOF;
|
||||
<head>
|
||||
<title>Golden Cheetah: Cycling Performance Software for Linux, Mac OS X, and Windows</title>
|
||||
<meta name="keywords" content="powertap srm linux mac cycling performance">
|
||||
<style type='text/css'>
|
||||
li {
|
||||
margin: .5em 0
|
||||
}
|
||||
body {
|
||||
color: #000000;
|
||||
background: #ffffff;
|
||||
}
|
||||
:link {
|
||||
color: #5e431b;
|
||||
}
|
||||
:visited {
|
||||
color: #996e2d;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body text="#000000"
|
||||
link="#5e431b"
|
||||
vlink="#996e2d"
|
||||
alink="#000000"
|
||||
bgcolor="#ffffff">
|
||||
|
||||
<table width="95%" border="0" width="100%" cellspacing="10">
|
||||
<tr>
|
||||
|
||||
@@ -46,32 +55,17 @@ print<<EOF;
|
||||
|
||||
<p> <b><a href="index.html">Introduction</a></b>
|
||||
<br> <b><a href="screenshots.html">Screenshots</a>
|
||||
<br> <b><a href="http://bugs.goldencheetah.org/projects/goldencheetah/wiki">Wiki</a>
|
||||
<br> <b><a href="users-guide.html">User's Guide</a>
|
||||
<br> <b><a href="developers-guide.html">Developer's Guide</a>
|
||||
<br> <b><a href="faq.html">FAQ</a>
|
||||
<br> <b><a href="wishlist.html">Wish List</a>
|
||||
<br> <b><a href="license.html">License</a></b>
|
||||
<br> <b><a href="download.html">Download</a></b>
|
||||
<br> <b><a href="contrib.html">Contributors</a></b>
|
||||
<br> <b><a href="search.html">Search</a></b>
|
||||
<br> <b><a href="cgi-bin/mailman/listinfo/golden-cheetah-users">Mailing List</a></b>
|
||||
|
||||
<p>
|
||||
<script type="text/javascript"><!--
|
||||
google_ad_client = "pub-2993461533095312";
|
||||
google_ad_width = 120;
|
||||
google_ad_height = 240;
|
||||
google_ad_format = "120x240_as";
|
||||
google_ad_type = "text";
|
||||
google_ad_channel ="";
|
||||
google_color_border = "FFFFFF";
|
||||
google_color_bg = "FFFFFF";
|
||||
google_color_link = "5E431B";
|
||||
google_color_url = "996E2D";
|
||||
google_color_text = "000000";
|
||||
//--></script>
|
||||
<script type="text/javascript"
|
||||
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
|
||||
</script>
|
||||
<br> <b><a href="mailing-list.html">Mailing List</a></b>
|
||||
<br> <b><a href="bug-tracker.html">Bug Tracker</a></b>
|
||||
|
||||
</center>
|
||||
</td>
|
||||
@@ -115,9 +109,9 @@ while (<FILE>) {
|
||||
}
|
||||
close (FILE);
|
||||
|
||||
if (defined $last_mod) {
|
||||
print "<p><hr><em>Last modified $last_mod.</em>\n";
|
||||
}
|
||||
#if (defined $last_mod) {
|
||||
# print "<p><hr><em>Last modified $last_mod.</em>\n";
|
||||
#}
|
||||
|
||||
print<<EOF;
|
||||
|
||||
|
||||
BIN
doc/google-earth.png
Normal file
|
After Width: | Height: | Size: 311 KiB |
BIN
doc/histogram-analysis.png
Normal file
|
After Width: | Height: | Size: 135 KiB |
@@ -1,22 +1,33 @@
|
||||
<!-- $Id: index.content,v 1.1 2006/05/16 14:24:50 srhea Exp $ -->
|
||||
|
||||
<p>
|
||||
<center>
|
||||
<em>To all those volunteers who selflessly give their time and without whom
|
||||
amateur sport would not exist.</em>
|
||||
<br>
|
||||
-- Graeme Obree, in the dedication of <em>Flying Scotsman</em>
|
||||
</center>
|
||||
|
||||
<p>
|
||||
GoldenCheetah is a software package that:
|
||||
|
||||
<ul>
|
||||
<li>Downloads ride data directly from the CycleOps PowerTap, including the
|
||||
newer Ant+Sport models.<p>
|
||||
<li>Downloads ride data directly from the CycleOps PowerTap and the SRM
|
||||
PowerControl V. Support for SRM PowerControl VI and VII is planned for the
|
||||
future.<p>
|
||||
|
||||
<li>Imports ride data from SRM, Garmin TCX, Polar HRM, and CSV files,
|
||||
including those from Cycling Peaks (TM) and the ergomo.<p>
|
||||
<li>Imports ride data downloaded with other programs, including TrainingPeaks
|
||||
WKO+ and the manufacturers' software for the Ergomo, Garmin, Polar, PowerTap,
|
||||
and SRM devices.<p>
|
||||
|
||||
<li>Provides a rich set of analysis tools, including critial power,
|
||||
BikeScore (TM), power histograms, a best interval finder, and pedal force
|
||||
versus pedal velocity, to name just a few.<p>
|
||||
<li>Provides a rich set of analysis tools, including a critical power graph,
|
||||
BikeScore calculation, histogram analysis, a best interval finder, and a pedal
|
||||
force versus pedal velocity chart, to name just a few.<p>
|
||||
|
||||
<li>Works identically under Linux, Mac OS X, and Windows.<p>
|
||||
<li>Is available for Linux, Mac OS X, and Windows. (The Windows version
|
||||
does not yet support direct downloads from the SRM PowerControl.)<p>
|
||||
|
||||
<li>Is available under an Open Source license.
|
||||
<li>Is released under an Open Source license.
|
||||
</ul>
|
||||
|
||||
<p>
|
||||
@@ -24,3 +35,13 @@ We believe that cyclists should be able to download their power data
|
||||
to the computer of their choice, analyze it in whatever way they see fit, and
|
||||
share their methods of analysis with others.
|
||||
|
||||
<hr width="20%"/>
|
||||
|
||||
<small>
|
||||
<p>
|
||||
* WKO+ and TrainingPeaks are trademarks of Peaksware, LLC.
|
||||
<br/>
|
||||
** BikeScore is a trademark of Dr. Philip Friere Skiba, PhysFarm Training
|
||||
Systems LLC.
|
||||
</p>
|
||||
</small>
|
||||
|
||||
BIN
doc/logo.jpg
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
BIN
doc/logo.png
|
Before Width: | Height: | Size: 229 B After Width: | Height: | Size: 159 KiB |
17
doc/mailing-list.content
Normal file
@@ -0,0 +1,17 @@
|
||||
|
||||
<p>
|
||||
There are two mailing lists for the Golden Cheetah project:
|
||||
|
||||
<p><a href="http://groups.google.com/group/golden-cheetah-users">Golden
|
||||
Cheetah Users</a> is a list for submitting bug reports, feature requests, and
|
||||
constructive criticism. It's a good place to search if you have a question
|
||||
that someone might have already answered. It's also where we discuss new
|
||||
features, plans, etc. On busy days there may be as many as 20 emails sent to
|
||||
Golden Cheetah Users.
|
||||
|
||||
<p><a href="http://groups.google.com/group/golden-cheetah-announce">Golden
|
||||
Cheetah Announce</a> is a lower volume, moderated list where we post
|
||||
announcements of new releases, important bug fixes, etc. If you don't want to
|
||||
get a lot of email, but you do want to know when we put out a new release,
|
||||
this is the list for you. It receives one or two emails per month.
|
||||
|
||||
BIN
doc/map.png
Normal file
|
After Width: | Height: | Size: 267 KiB |
BIN
doc/metrics-power.png
Normal file
|
After Width: | Height: | Size: 121 KiB |
BIN
doc/metrics-timedist.png
Normal file
|
After Width: | Height: | Size: 90 KiB |
BIN
doc/metrics-tiz.png
Normal file
|
After Width: | Height: | Size: 63 KiB |
485
doc/older-releases.content
Normal file
@@ -0,0 +1,485 @@
|
||||
|
||||
<p>
|
||||
This page contains older releases of Golden Cheetah. For the latest version,
|
||||
please see <a href="download.html">the download page</a> instead.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<font face="arial,helvetica,sanserif">
|
||||
<big><strong>Golden Cheetah</strong></big>
|
||||
</font>
|
||||
|
||||
<p>
|
||||
<center>
|
||||
<table width="100%" cellspacing="5">
|
||||
<tr>
|
||||
<td width="15%"><i>Version</i></td>
|
||||
<td width="25%"><i>Files</i></td>
|
||||
<td><i>Description</i></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top">2.0.0</td>
|
||||
<td valign="top">
|
||||
<a href="GoldenCheetah_2.0.0_Linux_x86.gz">Linux x86</a><br>
|
||||
<a href="GoldenCheetah_2.0.0_Linux_x86_64.gz">Linux x86_64</a><br>
|
||||
<a href="GoldenCheetah_2.0.0_Mac_Universal.zip">Mac OS X Universal</a><br>
|
||||
<a href="GoldenCheetah_2.0.0_Windows_Installer.exe">Windows 32-bit</a>
|
||||
</td>
|
||||
<td valign="top">
|
||||
<p>
|
||||
New Features
|
||||
<ul>
|
||||
<li>Aerolab (Andy Froncioni)</li>
|
||||
<li>View ride in Google Maps (Greg Lonnon)</li>
|
||||
<li>Long Term Metrics (Mark Liversedge)</li>
|
||||
<li>User configurable ride metadata (Mark Liversedge)</li>
|
||||
<li>Ride editor and tools (Mark Liversedge)</li>
|
||||
<li>HR Zones and TRIMP Metrics (Damien Grauser)</li>
|
||||
<li>Twitter support (Justin Knotzke)</li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Internationalisation
|
||||
<ul>
|
||||
<li>Updates to French translation (Damien Grauser)</li>
|
||||
<li>Japanese translation (Mitsukuni Sato)</li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
New Logo and Icons
|
||||
<ul>
|
||||
<li>Golden Cheetah Logo(Dan Schmalz)</li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Enhanced Ride Plot
|
||||
<ul>
|
||||
<li>Ride plot stacked view (Damien Grauser)</li>
|
||||
<li>Scrolling Ride Plot (Mark Liversedge)</li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
New Devices and File Formats Supported
|
||||
<ul>
|
||||
<li>Support for Joule BIN File Format (Damien Grauser)</li>
|
||||
<li>Tacx CAF Ride File Format Support (Ilja Booij)</li>
|
||||
<li>Garmin FIT ride file support (Sean Rhea)</li>
|
||||
<li>Export to Google Earth 5.2 KML (Mark Liversedge)</li>
|
||||
<li>Training Peaks PWX ride file support (Mark Liversedge)</li>
|
||||
<li>Polar SRD ride file support (Mark Liversedge)</li>
|
||||
<li>Racermate CompCS/Ergvideo .TXT ride file support (Mark Liversedge)</li>
|
||||
</ul>
|
||||
<p>
|
||||
|
||||
<p>
|
||||
Numerous enhancements and bug fixes from
|
||||
<ul>
|
||||
<li>Julian Baumgartner</li>
|
||||
<li>Robert Carlsen</li>
|
||||
<li>Rainer Clasen</li>
|
||||
<li>Gareth Coco</li>
|
||||
<li>Dag Gruneau</li>
|
||||
<li>Jamie Kimberley</li>
|
||||
<li>Jim Ley</li>
|
||||
<li>Patrick J. McNerthney</li>
|
||||
<li>Austin Roach</li>
|
||||
<li>Ken Sallot</li>
|
||||
<li>Thomas Weichmann</li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Builds, testing and support
|
||||
<ul>
|
||||
<li>Robert Carlsen</li>
|
||||
<li>Gareth Coco</li>
|
||||
<li>Jamie Kimberley</li>
|
||||
<li>Justin Knotzke</li>
|
||||
</ul>
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td valign="top">1.3.0</td>
|
||||
<td valign="top">
|
||||
<a href="GoldenCheetah_1.3.0_Linux_x86.gz">Linux x86</a><br>
|
||||
<a href="GoldenCheetah_1.3.0_Linux_x86_64.gz">Linux x86_64</a><br>
|
||||
<a href="GoldenCheetah_1.3.0_Mac_Universal.zip">Mac OS X Universal</a><br>
|
||||
<a href="GoldenCheetah_1.3.0_Windows_Installer.exe">Windows 32-bit</a>
|
||||
</td>
|
||||
<td valign="top">
|
||||
<p>
|
||||
Lots of new features:
|
||||
<p>
|
||||
Realtime Mode:
|
||||
<ul>
|
||||
<li>Graph data as you ride (Mark Liversedge, Justin Knotzke, Steve Gribble)</li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Charts:
|
||||
<ul>
|
||||
<li>Added Performance Manager (Eric Murray)</li>
|
||||
<li>Added 3D Modeling (Mark Liversedge and Greg Steele)</li>
|
||||
<li>Up to four y-axes on Ride Plot (Sean Rhea)</li>
|
||||
<li>Option to show work instead of power in Critical Power Plot (Sean Rhea)</li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Intervals:
|
||||
<ul>
|
||||
<li>Configurable metrics for intervals (Sean Rhea)</li>
|
||||
<li>Find peak powers and add to intervals (Mark Liversedge)</li>
|
||||
<li>Highlight intervals in plots (Damien Grauser)</li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Device support:
|
||||
<ul>
|
||||
<li>Serial port support on Windows (Mark Liversedge)</li>
|
||||
<li>Erase SRM memory without downloading (Sean Rhea)</li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Imports:
|
||||
<ul>
|
||||
<li>New ride import wizard (Mark Liversedge, Jamie Kimberley)</li>
|
||||
<li>Support Computrainer 3dp file format (Greg Lonnon)</li>
|
||||
<li>Support WKO v3 file format (Mark Liversedge)</li>
|
||||
<li>Support files with Garmin "smart recording" (Greg Lonnon)</li>
|
||||
<li>New GoldenCheetah (.gc) file format (Sean Rhea)</li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
New/improved ride metrics:
|
||||
<ul>
|
||||
<li>Added Joe Friel's Aerobic Decoupling (Sean Rhea)</li>
|
||||
<li>Added training points system by running coach Jack Daniels (Sean Rhea)</li>
|
||||
<li>Better elevation gain estimates (Sean Rhea)</li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Support for more languages:
|
||||
<ul>
|
||||
<li>French (Damien Grauser)</li>
|
||||
<li>Japanese (Mitsukuni Sato, Keisuke Yamaguchi)</li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Other new features:
|
||||
<ul>
|
||||
<li>Group rides into seasons (Justin Knotzke)</li>
|
||||
<li>Better ride calendar (Berend De Schouwer)</li>
|
||||
<li>Ride list pop-up menu (Thomas Weichmann)</li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
</p>
|
||||
<ul>
|
||||
<li>Direct download from SRM (R. Clasen and S. Rhea)
|
||||
<li>WKO+ file import (M. Liversedge)
|
||||
<li>Qollector support (M. Rages)
|
||||
<li>Altitude plotting (T. Weichmann)
|
||||
<li>Manual ride entry (E. Murray)
|
||||
<li>Power zones shading (D. Connell)
|
||||
<li>Weekly summary histograms (R. Carlsen)
|
||||
<li>Automatic CP estimation from CP graph (D. Connell)
|
||||
<li>Support for running off a USB stick (J. Knotzke)
|
||||
<li>OS-specific directory layout (J. Simioni)
|
||||
<li>PF/PV plot improvements (B. de Schouwer)
|
||||
<li>Memory leak fixes (G. Lonnon)
|
||||
</ul>
|
||||
<p>Thanks also to Jamie Kimberley for extensive testing.
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td valign="top">1.2.0</td>
|
||||
<td valign="top">
|
||||
<a href="GoldenCheetah_1.2.0_Linux_x86.tgz">Linux x86</a><br>
|
||||
<a href="GoldenCheetah_1.2.0_Linux_x86_64.tgz">Linux x86_64</a><br>
|
||||
<a href="GoldenCheetah_1.2.0_Darwin_Universal.dmg">Mac OS X Universal</a><br>
|
||||
<a href="GoldenCheetah_1.2.0_Windows_Installer.exe">Windows 32-bit</a>
|
||||
</td>
|
||||
<td valign="top">
|
||||
<p>
|
||||
Lots of new features in this release, including:
|
||||
</p>
|
||||
<ul>
|
||||
<li>Direct download from SRM (R. Clasen and S. Rhea)
|
||||
<li>WKO+ file import (M. Liversedge)
|
||||
<li>Qollector support (M. Rages)
|
||||
<li>Altitude plotting (T. Weichmann)
|
||||
<li>Manual ride entry (E. Murray)
|
||||
<li>Power zones shading (D. Connell)
|
||||
<li>Weekly summary histograms (R. Carlsen)
|
||||
<li>Automatic CP estimation from CP graph (D. Connell)
|
||||
<li>Support for running off a USB stick (J. Knotzke)
|
||||
<li>OS-specific directory layout (J. Simioni)
|
||||
<li>PF/PV plot improvements (B. de Schouwer)
|
||||
<li>Memory leak fixes (G. Lonnon)
|
||||
</ul>
|
||||
<p>Thanks also to Jamie Kimberley for extensive testing.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top">1.1.325</td>
|
||||
<td valign="top">
|
||||
<a href="GoldenCheetah_1.1.325_Linux_x86.gz">Linux x86</a><br>
|
||||
<a href="GoldenCheetah_1.1.325_Linux_x86_64.gz">Linux x86_64</a><br>
|
||||
<a href="GoldenCheetah_1.1.325_Darwin_Universal.dmg">Mac OS X Universal</a><br>
|
||||
<a href="GoldenCheetah_1.1.325_Windows_Installer.exe">Windows 32-bit</a>
|
||||
</td>
|
||||
<td valign="top">
|
||||
<p>
|
||||
First official Windows release courtesy of Ned Harding. Ned put much effort into the port to make the download reliable and created a nice installer, too (Thanks Ned!). He also provided the long-awaited Split Ride feature - break up a ride file into separate rides easily using long time gaps and intervals.
|
||||
<ul>
|
||||
<li>Ant+Sport PowerTap support.
|
||||
<li>Split Rides by time gaps or intervals.
|
||||
<li>Delete ride from list.
|
||||
<li>Use distance or time for x-axis in Ride Plot (Thanks Damain).
|
||||
<li>Numerous bug fixes (Thanks Tom, Dan).
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top">1.0.277</td>
|
||||
<td valign="top">
|
||||
<a href="GoldenCheetah_1.0.277_Linux_x86.gz">Linux x86</a>,<br>
|
||||
<a href="GoldenCheetah_1.0.277_Linux_x86_64.tar.gz">Linux x86_64</a>,<br>
|
||||
<a href="GoldenCheetah_1.0.277_Darwin_Universal.dmg">Mac OS X Universal</a>
|
||||
</td>
|
||||
<td valign="top">
|
||||
<p>*Note: Beginning with this release we are changing to a numbered versioning system. Minor point releases will generally indicate builds with new features, while bugfix releases will increment the final number, which represents the svn revision*</p>
|
||||
<p>Several new features in this release: Critical Power calculator, find best intervals utility, Pedal Force / Pedal Velocity chart, iBike and Ergomo CSV import, GUI power zones creator, separate vertical axes for Power / HR / Cadence and Speed in the Ride plot, sorting rides with the most recent at the top of the list, and many bug fixes courtesy of JT Conklin.
|
||||
</p>
|
||||
<p>You may need to install <a href="http://www.ftdichip.com/Drivers/D2XX.htm">USB drivers</a> from FTDI.
|
||||
</p>
|
||||
<p>
|
||||
For posterity, the <a href="http://robertcarlsen.net/blog/?page_id=49">beta version</a> for Windows, based on r295.
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top">Mar 10, 2008</td>
|
||||
<td valign="top">
|
||||
<a href="GoldenCheetah_2008-03-10_Linux_x86.tgz">Linux x86</a>,<br>
|
||||
<a href="GoldenCheetah_2008-03-10_Darwin_Universal.dmg">Mac OS X Universal</a>
|
||||
</td>
|
||||
<td valign="top">
|
||||
This release introduces <a href="http://www.physfarm.com/Analysis%20of%20Power%20Output%20and%20Training%20Stress%20in%20Cyclists-%20BikeScore.pdf">BikeScore™</a>,
|
||||
a metric of training stress developed by Dr. Philip Skiba. It also
|
||||
fixes several small bugs in earlier releases.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top">Sep 23, 2007</td>
|
||||
<td valign="top">
|
||||
<a href="GoldenCheetah_2007-09-23_Linux_x86.tgz">Linux x86</a>,<br>
|
||||
<a href="GoldenCheetah_2007-09-23_Darwin_i386.dmg">Mac OS X x86</a>,<br>
|
||||
<a href="GoldenCheetah_2007-09-23_Darwin_powerpc.dmg">Mac OS X PowerPC</a>
|
||||
</td>
|
||||
<td valign="top">
|
||||
Bug fix release. CVS imports weren't quite working in the last one.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top">Sep 18, 2007</td>
|
||||
<td valign="top">
|
||||
<a href="GoldenCheetah_2007-09-18_Linux_x86.tgz">Linux x86</a>,<br>
|
||||
<a href="GoldenCheetah_2007-09-18_Darwin_powerpc.dmg">Mac OS X PowerPC</a>
|
||||
</td>
|
||||
<td valign="top">
|
||||
This release adds two small, but excellent features from Justin Knotzke:
|
||||
CSV file imports and visual interval markers in the ride plot.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top">Aug 7, 2007</td>
|
||||
<td valign="top">
|
||||
<a href="GoldenCheetah_2007-08-07_Linux_x86.tgz">Linux x86</a>,<br>
|
||||
<a href="GoldenCheetah_2007-08-07_Darwin_powerpc.dmg">Mac OS X PowerPC</a>
|
||||
</td>
|
||||
<td valign="top">This release fixes a bug in the critical power
|
||||
intervals graph where you could get bad data if you started an interval
|
||||
after a long period of not moving. It also adds really basic zooming to
|
||||
the ride plot: use the left mouse button to zoom in and the right one to
|
||||
return to the previous zoom state. It's pretty crappy right now, but
|
||||
it's better than nothing.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top">Apr 26, 2007</td>
|
||||
<td valign="top">
|
||||
<a href="GoldenCheetah_2007-04-26_Linux_x86.tgz">Linux x86</a>,<br>
|
||||
<a href="GoldenCheetah_2007-04-26_Darwin_powerpc.dmg">Mac OS X PowerPC</a>
|
||||
</td>
|
||||
<td valign="top">This release fixes some bugs and adds a whole bunch of
|
||||
new features:
|
||||
<ul>
|
||||
<li>Now imports .srm files (direct download from SRM hopefully coming
|
||||
soon)
|
||||
<li>New "Weekly Summary" tab shows total weekly hours, miles, and work
|
||||
<li>Power zones can now be entered into a text file, after which GC will
|
||||
display time in each zone in the ride and weekly summaries; for more
|
||||
information on the zone file format, <a href="zones.html">see this
|
||||
page</a>.
|
||||
</ul>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top">Apr 1, 2007</td>
|
||||
<td valign="top">
|
||||
<a href="GoldenCheetah_2007-04-01_Linux_x86.tgz">Linux x86</a>,<br>
|
||||
<a href="GoldenCheetah_2007-04-01_Darwin_powerpc.dmg">Mac OS X PowerPC</a>
|
||||
</td>
|
||||
<td valign="top">This release fixes a bug that was introduced with the
|
||||
hardware echo detection code. If you're using the CycleOps-supplied USB
|
||||
cable to download from your PowerTap unit, this release should make
|
||||
downloads more reliable. (Those using the KeySpan USB-to-serial adaptor
|
||||
or a plain-old serial port shouldn't see any difference.)</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top">Feb 22, 2007</td>
|
||||
<td valign="top">
|
||||
<a href="GoldenCheetah_2007-02-22_Linux_x86.tgz">Linux x86</a>,<br>
|
||||
<a href="GoldenCheetah_2007-02-22_Darwin_powerpc.dmg">Mac OS X PowerPC</a>
|
||||
</td>
|
||||
<td valign="top">Clicking on the Critical Power Plot now displays the
|
||||
interval duration, maximum power for that ride, and maximum power for all
|
||||
rides below the plot. Also fixes a bug for recording intervals longer than
|
||||
two seconds.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top">Feb 12, 2007</td>
|
||||
<td valign="top">
|
||||
<a href="GoldenCheetah_2007-02-12_Linux_x86.tgz">Linux x86</a>,<br>
|
||||
<a href="GoldenCheetah_2007-02-12_Darwin_powerpc.dmg">Mac OS X PowerPC</a>
|
||||
</td>
|
||||
<td valign="top">Interval information now included in ride summary, rides can
|
||||
now be exported as comma-separated values for import into Excel, and better
|
||||
automatic detection of hardware echo. Also includes a number of bux
|
||||
fixes.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top">Jan 30, 2007</td>
|
||||
<td valign="top">
|
||||
<a href="GoldenCheetah_2007-01-30_Linux_x86.tgz">Linux x86</a>,<br>
|
||||
<a href="GoldenCheetah_2007-01-30_Darwin_powerpc.dmg">Mac OS X PowerPC</a>
|
||||
</td>
|
||||
<td valign="top">Bug fix release.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top">Jan 6, 2007</td>
|
||||
<td valign="top"><a href="GoldenCheetah_2007-01-06_Linux_x86.tgz">Linux
|
||||
x86</a></td>
|
||||
<td valign="top">First release for Linux.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top">Dec 25, 2006</td>
|
||||
<td valign="top"><a href="GoldenCheetah_2006-12-25_Darwin_powerpc.dmg">Mac OS
|
||||
X PowerPC</a></td>
|
||||
<td valign="top">Adds the Power Histogram, which shows how much time a rider
|
||||
spent at each particular power level during a ride.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top">Sep 19, 2006</td>
|
||||
<td valign="top"><a href="GoldenCheetah_2006-09-19_Darwin_powerpc.dmg">Mac OS
|
||||
X PowerPC</a></td>
|
||||
<td valign="top">Adds the Critical Power Plot, which shows the highest average
|
||||
power you've achieved for every interval length over all your rides and the
|
||||
selected ride. Also shows download progress in minutes of ride data
|
||||
downloaded.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top">Sep 7, 2006</td>
|
||||
<td valign="top"><a href="GoldenCheetah_2006-09-07_Darwin_powerpc.dmg">Mac OS
|
||||
X PowerPC</a></td>
|
||||
<td valign="top">Adds speed and cadence to the ride plot. Fixes a bug
|
||||
found by George Gilliland where reseting the time during a ride could cause
|
||||
the GUI to crash.</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top">Sep 6, 2006</td>
|
||||
<td valign="top"><a href="GoldenCheetah_2006-09-06_Darwin_powerpc.dmg">Mac OS
|
||||
X PowerPC</a></td>
|
||||
<td valign="top">The first release of the Golden Cheetah GUI.</td>
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
</center>
|
||||
|
||||
<p>
|
||||
<hr width="50%">
|
||||
|
||||
<p>
|
||||
<font face="arial,helvetica,sanserif">
|
||||
<big><strong>Older Stuff</strong></big>
|
||||
</font>
|
||||
|
||||
<p>
|
||||
These are the older, source-only, command-line distributions. I've left them
|
||||
up for historical purposes only; I don't recommend using them.
|
||||
|
||||
<center>
|
||||
<table width="100%" cellspacing="10">
|
||||
<tr>
|
||||
<td width="20%"><i>Date</i></td>
|
||||
<td width="30%"><i>File</i></td>
|
||||
<td><i>Description</i></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top">Aug 11, 2006</td>
|
||||
<td valign="top"><a href="gc_2006-08-11.tgz">gc_2006-08-11.tgz</a></td>
|
||||
<td valign="top">ptdl now works with Keyspan USB-to-serial adaptor, after
|
||||
debugging help from Rob Carlsen.
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top">May 27, 2006</td>
|
||||
<td valign="top"><a href="gc_2006-05-27.tgz">gc_2006-05-27.tgz</a></td>
|
||||
<td valign="top">Adds the <code>cpint</code> program for computing critical
|
||||
power intervals and the <code>ptpk</code> program for converting from
|
||||
PowerTuned data files (see the <a href="users-guide.html">User's
|
||||
Guide</a>).</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td valign="top">May 16, 2006</td>
|
||||
<td valign="top"><a href="gc_2006-05-16.tgz">gc_2006-05-16.tgz</a></td>
|
||||
<td valign="top">The first code release, containing <code>ptdl</code> and
|
||||
<code>ptunpk</code>.</td>
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
</center>
|
||||
|
||||
BIN
doc/pf-pv-plot.png
Normal file
|
After Width: | Height: | Size: 197 KiB |
BIN
doc/pm.png
Normal file
|
After Width: | Height: | Size: 92 KiB |
BIN
doc/realtime.png
Normal file
|
After Width: | Height: | Size: 78 KiB |
259
doc/release-notes.content
Normal file
@@ -0,0 +1,259 @@
|
||||
<p>
|
||||
<font face="arial,helvetica,sanserif">
|
||||
<big><strong>GoldenCheetah 2.1</strong></big>
|
||||
</font>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
New Features and Enhancements
|
||||
<ul>
|
||||
<li>FIT file support for Mac OSX - Rainer Clasen</li>
|
||||
<li>SRM 5 - Rainer Clasen</li>
|
||||
<li>Aerolab Improvements - Damien Grauser</li>
|
||||
<li>O-Sync Macro X device support - Damien Grauser</li>
|
||||
<li>Air density (RHO) Calculator - Steven Gribble</li>
|
||||
<li>Virtual Power - Darren Hague</li>
|
||||
<li>GoldenCheetah JSON - Mark Liversedge</li>
|
||||
<li>Support TrainerRoad.com TCX Files - Mark Liversedge</li>
|
||||
<li>Garmin GPX - Greg Lonnon</li>
|
||||
<li>Sigma SLF/SMF - Frank Zschockelt</li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Internationalisation
|
||||
<ul>
|
||||
<li>Czech (David Kramar)</li>
|
||||
<li>French (Damien Grauser, Guillaume LeMaitre)</li>
|
||||
<li>German (Alexander Pietsch)</li>
|
||||
<li>Italian (Robert Masso)</li>
|
||||
<li>Portugese (Thomas Irps)</li>
|
||||
<li>Portugese-Brazil (Bruno Assis)</li>
|
||||
<li>Japanese (Mitsukuni Sato, Keisuke Yamaguchi)</li>
|
||||
<li>Spanish (Alejandro Martinez)</li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Development Builds
|
||||
<ul>
|
||||
<li>Gareth Coco</li>
|
||||
<li>Jamie Kimberley</li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Full Change Log
|
||||
<pre>
|
||||
Alejandro Martinez (7):
|
||||
Add Spanish Translation and Enable Metrics Translation
|
||||
Add Spanish Translation & Fix Translation Issues
|
||||
Set UTF-8 in charts,metadata and seasons xml files
|
||||
Add HrZones to Weekly Summary and Fix Spanish Translation
|
||||
Update Spanish Translation
|
||||
Enable 3d Plot Translation and include spanish translation
|
||||
Rho Estimator Translation
|
||||
|
||||
Bruno Assis (1):
|
||||
Portugese (Brazil) Translation
|
||||
|
||||
Damien (22):
|
||||
Modify csv import for ergomo file with comma or semicolon separator
|
||||
Remove error logs for unused datas in ride file
|
||||
handle showHr/Speed/Cad/Alt state for stacked view
|
||||
Add summary metrics list to preferences
|
||||
Correct crash with truncated files
|
||||
Add PeakPowerHr metric (average HR during peak power)
|
||||
Altitude scale present with no altitude data.
|
||||
Bug #178 TRIMP is not updated after modification in Rest Hr Tag -> compute metric after save
|
||||
Add a setFocus on the Treelist to correct a MacOs Bug of Qt
|
||||
Modification to handle odd start page and compatible with qt 4.6
|
||||
Correct interval
|
||||
Modify TRIMP formula to use time_riding instead of workout time
|
||||
Modify Aerolab to add interval highlight and zoom + auto offset
|
||||
Aerolab : Change LCD display to LineEdit
|
||||
Correct bug in the peakPowerHr formula
|
||||
Correct encoding in json parser
|
||||
Correct bug #496 for longitude < -65
|
||||
Remove Joule warnings
|
||||
Update french translation for rho estimator
|
||||
Change speed to double in Bin parser
|
||||
Correct intialisation of altitude for TCX without altitude
|
||||
Correct intialisation of altitude for TCX without altitude
|
||||
|
||||
Damien Grauser (2):
|
||||
Update French translation.
|
||||
O_Sync Macro X device support
|
||||
|
||||
Darren Hague (5):
|
||||
Virtual Power; Better GSC-10 pairing support.
|
||||
Corrected - to + in CycleOps formula
|
||||
Use realtime clock for realtime-mode clock
|
||||
Add virtual power support for BT-ATS trainer
|
||||
Remove toMSecsSinceEpoch() and work around
|
||||
|
||||
David (1):
|
||||
Updated Czech translations
|
||||
|
||||
Eric Brandt (1):
|
||||
fix realtime mode load timer and lcd sig. digit display issues
|
||||
|
||||
Frank Zschockelt (2):
|
||||
Support for Sigma SLF/SMF file formats
|
||||
Included 4 sample sigma files in the test/rides directory
|
||||
|
||||
Gareth Coco (25):
|
||||
Changes to map markers
|
||||
FIT file reader fixes
|
||||
Set default Smoothing (secs) in Ride Plot to one (1) second
|
||||
Change start date from UTC to localtime for bin ride file
|
||||
Make interval period on map user defineable
|
||||
Reorder liboauth includes
|
||||
Comment out QwtDesigner build in qwtconfig.pri.in
|
||||
Changed kph to km/h in displays
|
||||
Changed KPH to km/h in displays
|
||||
Update translation .qm files
|
||||
Update gc_fr.qm for updated French translation
|
||||
Fixes for RealtimeController
|
||||
Initialise LAT/LON to zero (0.0) in the parser
|
||||
Updated Spanish Translation
|
||||
Add a Portuguese translation
|
||||
Add a TCX ride exporter
|
||||
Fix interpolation of lat/lon when missing or 0/0
|
||||
Allow CdA to lowest possible in AerolabWindow.cpp
|
||||
Update translation files
|
||||
Ordered build - qwt then src
|
||||
Fixes for Manual Ride Entry
|
||||
Comment added and replace tabs with spaces
|
||||
v2.1dev - Allow ride to be added with no Average HR
|
||||
Update documentation
|
||||
Added v2.0.0 information.
|
||||
|
||||
Greg Lonnon (3):
|
||||
GPX RideFile Support
|
||||
changes to the markers in google maps.
|
||||
Added a QFilesystemWatcher to monitor adding files to the workout directory.
|
||||
|
||||
Ilja Booij (1):
|
||||
fix 'Wrong distance on Tacx caf file import'
|
||||
|
||||
Jamie Kimberley (6):
|
||||
Update download page to reflect build of mac 10.4
|
||||
force use of no elide and scrollbars in main tab
|
||||
Update user guide steps 1 and 2
|
||||
clean up wishlist web page
|
||||
Add other TRIMP metrics to performance manager.
|
||||
update French Translation
|
||||
|
||||
Justin Knotzke (2):
|
||||
Cycleops Test Ride
|
||||
Update of German translation by LukeNRG
|
||||
|
||||
Keisuke Yamaguchi (1):
|
||||
Update Japanese translation files
|
||||
|
||||
LukeNRG (4):
|
||||
German Translation
|
||||
Updated German Translation
|
||||
Updated German Translations
|
||||
German Translations
|
||||
|
||||
Mark Liversedge (59):
|
||||
Updated www.goldencheetah.org for v2.0 release.
|
||||
Joule support fixed on download page.
|
||||
Add link to wiki from the website.
|
||||
Mac PPC binary added to downloads page.
|
||||
Merge branch 'master' of github.com:/srhea/GoldenCheetah
|
||||
Translations Bonanza!
|
||||
Fix Computrainer with Stereo FTDI adaptor
|
||||
Fix 'Save data' in RealtimeWindow
|
||||
Updated Czech translation
|
||||
Fix Wko GPS parsing on 64bit
|
||||
Fix Virtual Power for Fluid2
|
||||
Revert "Add Spanish Translation and Enable Metrics Translation"
|
||||
Fix WKO parser for Ergomo users
|
||||
Better rounding of time in AllPlot
|
||||
Fix WKO+ file reader GPS 'drops'
|
||||
Remove console error for seasons.xml
|
||||
Fix RideSummaryWindow crash
|
||||
Fix RideEditor find dialog for 'between'
|
||||
Fix .man crash in CP plot
|
||||
Better support for Negative, Inf, NaN and High Values
|
||||
Fix annoying gap in CP curve.
|
||||
Fix Save when old .bak exists
|
||||
Fix SummaryWindow crash
|
||||
Merge branch 'master' of github.com:/srhea/GoldenCheetah
|
||||
Don't allow Nan or Inf sample values
|
||||
Fix LogY Intervals on Histogram
|
||||
Fit files sometimes go backwards
|
||||
Guess ride date time for Poweragent CSV files
|
||||
Add JSON support to v2.1
|
||||
Merge branch 'master' of github.com:/srhea/GoldenCheetah
|
||||
Fix date/time handling when importing rides
|
||||
Update .gitignore for Lex/yacc
|
||||
Fix Macro device data crash
|
||||
Support FR310xt latest firmware
|
||||
Fix FitRideFile for header change
|
||||
Fix Download Ride Dialog instructions refresh
|
||||
Merge branch 'master' of github.com:/srhea/GoldenCheetah
|
||||
SplitRide overwrites existing file
|
||||
Revert "SplitRide overwrites existing file"
|
||||
Fix Split Ride file loss bug
|
||||
Merge branch 'master' of github.com:/srhea/GoldenCheetah
|
||||
Check Date/Time unique
|
||||
Summary fixups
|
||||
Updated translation files.
|
||||
Add virtual power for LeMond Revolution
|
||||
Use strtod() to convert text to double
|
||||
Fix FTDI Adaptor on Linux and Mac
|
||||
Merge branch 'master' of github.com:/srhea/GoldenCheetah
|
||||
Better Bounds Checking in RideFile::intervalBegin()
|
||||
Forward support in .json for temp/slope
|
||||
Add Virtual Power for 1UP USA bike trainer
|
||||
FitRideFile distance of zero bug
|
||||
Disable roch text in metadata
|
||||
Fix zero speed in TxtRideFile for Imperial units
|
||||
Support TrainerRoad.com TCX Files/Tcx speed in meters/sec The TCX parser ignored samples where distance is
|
||||
Fix crash if TRIMP zones > 5
|
||||
Fix PWX file intervals
|
||||
Fix SEGV on empty/dodgy FIT files
|
||||
Merge branch 'master' of github.com:/srhea/GoldenCheetah
|
||||
|
||||
Mitsukuni Sato (1):
|
||||
Japanese Translation
|
||||
|
||||
Rainer Clasen (8):
|
||||
Added SRM5 file format read support
|
||||
whitespace cleanup
|
||||
fix reading signed values from srm files
|
||||
Fit: ignore unknown message types
|
||||
Fit: support big/little endian data
|
||||
Fit: handle unknown fields gracefully
|
||||
SrmRideFile: turned assertions into graceful fail
|
||||
FitRideFile: turned assertions into graceful fail
|
||||
|
||||
Roberto Massa (1):
|
||||
Italian Translation
|
||||
|
||||
Roderic Campbell (1):
|
||||
There was what looked like a copy paste error. I changed the zone 7 label to the appropriate 7 instead of
|
||||
|
||||
Steven Gribble (1):
|
||||
This patch adds an air density (rho) calculator feature to GoldenCheetah.
|
||||
|
||||
Thomas Irps (1):
|
||||
Portuguese translation
|
||||
|
||||
Tim Shaffer (1):
|
||||
Make the default date range for Performance Manager a user preference.
|
||||
|
||||
kohasa (1):
|
||||
enabled editing interval duration by keyboard.
|
||||
|
||||
lemaitre (1):
|
||||
Updating of the French translation
|
||||
|
||||
unknown (1):
|
||||
This patch correct altitude for TCX files converted from FIT files These files doesn't have altitude for e
|
||||
</pre>
|
||||
</p>
|
||||
BIN
doc/ride-plot.png
Normal file
|
After Width: | Height: | Size: 192 KiB |
BIN
doc/ride-plot2.png
Normal file
|
After Width: | Height: | Size: 195 KiB |
BIN
doc/ride-summary.png
Normal file
|
After Width: | Height: | Size: 134 KiB |
|
Before Width: | Height: | Size: 58 KiB |
|
Before Width: | Height: | Size: 34 KiB |
|
Before Width: | Height: | Size: 54 KiB |
|
Before Width: | Height: | Size: 82 KiB |
|
Before Width: | Height: | Size: 81 KiB |
|
Before Width: | Height: | Size: 64 KiB |
@@ -3,47 +3,115 @@
|
||||
<p>
|
||||
<center>
|
||||
|
||||
<p>
|
||||
<big><font face="arial,helvetica,sanserif">
|
||||
The Download Dialog
|
||||
Ride Summary
|
||||
</font></big>
|
||||
<p>
|
||||
<img src="screenshot-download.png" alt="Download Dialog" align="center">
|
||||
<img src="ride-summary.png" alt="Ride Summary Screen" align="center">
|
||||
|
||||
<p>
|
||||
<big><font face="arial,helvetica,sanserif">
|
||||
The Ride Summary
|
||||
Plotting Altitude, Cadence, Heart Rate, Power, and Speed
|
||||
</font></big>
|
||||
<p>
|
||||
<img src="screenshot-summary.png" alt="Ride Summary Screen" align="center">
|
||||
<img src="ride-plot.png" alt="Power and HR Plot" align="center">
|
||||
|
||||
<p>
|
||||
<big><font face="arial,helvetica,sanserif">
|
||||
The Power, Heart Rate, Speed, and Cadence Plot
|
||||
Plotting in a Stacked View
|
||||
</font></big>
|
||||
<p>
|
||||
<img src="screenshot-plot.png" alt="Power and HR Plot" align="center">
|
||||
<img src="ride-plot2.png" alt="Stacked Power and HR Plot" align="center">
|
||||
|
||||
<p>
|
||||
<big><font face="arial,helvetica,sanserif">
|
||||
The Critical Power Plot
|
||||
Plotting Critical Power
|
||||
</font></big>
|
||||
<p>
|
||||
<img src="screenshot-cpint.png" alt="The Critical Power Plot" align="center">
|
||||
<img src="critical-power-plot.png" alt="The Critical Power Plot" align="center">
|
||||
|
||||
<p>
|
||||
<big><font face="arial,helvetica,sanserif">
|
||||
The Power Histogram
|
||||
Histogram Analysis
|
||||
</font></big>
|
||||
<p>
|
||||
<img src="screenshot-phist.png" alt="The Power Histogram" align="center">
|
||||
<img src="histogram-analysis.png" alt="The Power Histogram" align="center">
|
||||
|
||||
<p>
|
||||
<big><font face="arial,helvetica,sanserif">
|
||||
Plotting Pedal Force Versus Pedal Velocity
|
||||
</font></big>
|
||||
<p>
|
||||
<img src="pf-pv-plot.png" alt="The Power Histogram" align="center">
|
||||
|
||||
<p>
|
||||
<big><font face="arial,helvetica,sanserif">
|
||||
The Weekly Summary
|
||||
</font></big>
|
||||
<p>
|
||||
<img src="screenshot-weekly.png" alt="The Weekly Summary" align="center">
|
||||
<img src="weekly-summary.png" alt="The Weekly Summary" align="center">
|
||||
|
||||
<p>
|
||||
<big><font face="arial,helvetica,sanserif">
|
||||
Plot from a selection of over 30 metrics
|
||||
</font></big>
|
||||
<p>
|
||||
<img src="metrics-power.png" alt="The Power Metrics" align="center">
|
||||
<p>
|
||||
<big><font face="arial,helvetica,sanserif">
|
||||
Including Time and Distance
|
||||
</font></big>
|
||||
<p>
|
||||
<img src="metrics-timedist.png" alt="The Time and Distance" align="center">
|
||||
<p>
|
||||
<big><font face="arial,helvetica,sanserif">
|
||||
Time In Zone
|
||||
</font></big>
|
||||
<p>
|
||||
<img src="metrics-tiz.png" alt="The Time In Zone" align="center">
|
||||
<p>
|
||||
<big><font face="arial,helvetica,sanserif">
|
||||
Plot with Google Maps
|
||||
</font></big>
|
||||
<p>
|
||||
<img src="map.png" alt="Google Maps" align="center">
|
||||
<p>
|
||||
<big><font face="arial,helvetica,sanserif">
|
||||
Plot in 3 Dimensions
|
||||
</font></big>
|
||||
<p>
|
||||
<img src="3d.png" alt="The 3d plot" align="center">
|
||||
<p>
|
||||
<big><font face="arial,helvetica,sanserif">
|
||||
Edit and Correct Ride Data
|
||||
</font></big>
|
||||
<p>
|
||||
<img src="editor.png" alt="The Ride Editor" align="center">
|
||||
<p>
|
||||
<big><font face="arial,helvetica,sanserif">
|
||||
The Performance Manager
|
||||
</font></big>
|
||||
<p>
|
||||
<img src="pm.png" alt="The Performance Manager" align="center">
|
||||
<p>
|
||||
<big><font face="arial,helvetica,sanserif">
|
||||
Train with a Computrainer or ANT+ Device
|
||||
</font></big>
|
||||
<p>
|
||||
<img src="realtime.png" alt="The Realtime Window" align="center">
|
||||
<p>
|
||||
<big><font face="arial,helvetica,sanserif">
|
||||
Export to Google Earth 5.2
|
||||
</font></big>
|
||||
<p>
|
||||
<img src="google-earth.png" alt="Google Earth 5.2" align="center">
|
||||
<p>
|
||||
<big><font face="arial,helvetica,sanserif">
|
||||
The Aerolab
|
||||
</font></big>
|
||||
<p>
|
||||
<img src="aerolab.png" alt="Aerolab" align="center">
|
||||
</center>
|
||||
|
||||
|
||||
|
||||
@@ -1,14 +1,35 @@
|
||||
<!-- $Id: users-guide.content,v 1.5 2006/05/27 16:32:46 srhea Exp $ -->
|
||||
<p>
|
||||
Note that more detailed information is often available on the
|
||||
<a href = http://bugs.goldencheetah.org/projects/goldencheetah/wiki>
|
||||
Golden Cheetah Wiki</a>.
|
||||
|
||||
<p>
|
||||
What follows is a brief step-by-step guide to installing and setting up
|
||||
Golden Cheetah.
|
||||
|
||||
<p>
|
||||
<big><font face="arial,helvetica,sanserif">
|
||||
Step 1: Installing the FTDI drivers
|
||||
Step 1 (optional): Installing the FTDI drivers
|
||||
</font></big>
|
||||
|
||||
<p>
|
||||
Depending on your operating system, you may need to install the <a
|
||||
href="http://www.ftdichip.com/Drivers/D2XX.htm">FTDI USB
|
||||
driver</a> if you're using the PowerTap's new USB download cradle. The FTDI USB drivers are an optional install if you do not plan on downloading from your device using Golden Cheetah.
|
||||
</p>
|
||||
This step is only needed if you want to download rides from a powertap
|
||||
pro/comp/cervo head unit via the supplied USB cradle. Furthermore, most
|
||||
Windows and Linux systems should recognize the device without installing
|
||||
the drivers below.
|
||||
|
||||
<p>
|
||||
Depending on your operating system, you <i>may</i> need to install the
|
||||
<ahref="http://www.ftdichip.com/Drivers/D2XX.htm">FTDI D2XX driver</a> if
|
||||
you're using the PowerTap's new USB download cradle.
|
||||
Note: version 0.1.7 of the FTDI drivers for Mac seems to be buggy. Until they
|
||||
post a patched version, you can download version 0.1.6
|
||||
<a href="http://bugs.goldencheetah.org/attachments/download/1/Universal_D2XX0.1.6.dmg"> here</a>
|
||||
and install via the terminal. Or if you are not terminal savvy, download an installer that will
|
||||
perform the installation of the 0.1.6 drivers for you
|
||||
<a href="http://bugs.goldencheetah.org/attachments/download/248/Install_D2XX_drivers.mpkg.zip">
|
||||
here</a>.
|
||||
|
||||
<p>
|
||||
If you're running Linux, you may also need to uninstall the <code>brtty</code>
|
||||
@@ -41,22 +62,30 @@ and download the version for your operating system and processor.
|
||||
On Mac OS X, when the download finishes, Mac OS X should automatically open
|
||||
the <code>.dmg</code> file for you. If not, double-click to open it. Drag
|
||||
the GoldenCheetah icon into your Applications folder, and you're done.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The Linux version of GoldenCheetah is distributed as a tarball. Download this
|
||||
file and save it to <code>/tmp</code>, then from a terminal:
|
||||
The Windows version has an installer. Just run the Installer, select where
|
||||
to install the application and away you go.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The Linux version of GoldenCheetah is distributed as a GZipped tar archive.
|
||||
Download this file and save it to <code>/tmp</code>, then from a terminal:
|
||||
|
||||
<pre>
|
||||
cd /tmp
|
||||
tar xzvf GoldenCheetah_DATE_Linux_x86.tgz
|
||||
cd GoldenCheetah_DATE_Linux_x86
|
||||
tar xvzf GoldenCheetah_X.X.X_Linux_ARCH.tgz
|
||||
cd GoldenCheetah_X.X.X_Linux_ARCH
|
||||
sudo chmod u+x GoldenCheetah
|
||||
sudo cp GoldenCheetah /usr/local/bin
|
||||
cd ..
|
||||
rm -rf GoldenCheetah_DATE_Linux_x86.tgz
|
||||
rm -rf GoldenCheetah_X.X.X_Linux_ARCH
|
||||
</pre>
|
||||
|
||||
Be sure to replace "DATE" with the date of the revision you downloaded, such
|
||||
as "2007-09-23".
|
||||
Be sure to replace "X.X.X" with the version of the release you downloaded,
|
||||
such as "2.1.0" and replace "ARCH" with the architecture of the release
|
||||
you download - either "x86" (32bit) or "x84_64" (64bit).
|
||||
|
||||
<p>
|
||||
<big><font face="arial,helvetica,sanserif">
|
||||
@@ -65,7 +94,9 @@ Step 3: Running GoldenCheetah
|
||||
|
||||
<p>
|
||||
To run GoldenCheetah on Mac OS X, double-click on the GoldenCheetah icon in
|
||||
your Applications folder. On Linux, just type "GoldenCheetah" at the prompt.
|
||||
your Applications folder. On Windows, click the Start button, All Programs
|
||||
link, GoldenCheetah folder and then the Golden Cheetah program. On Linux,
|
||||
just type "GoldenCheetah" at the prompt.
|
||||
|
||||
<p>
|
||||
The first time you run GoldenCheetah, you'll get an empty "Choose a Cyclist"
|
||||
@@ -154,25 +185,102 @@ maximum power you can sustain over an hour. Some people call this your
|
||||
rose by any other name would smell as sweet.
|
||||
|
||||
<p>
|
||||
We'll have a dialog box that will let you set up your power zones and
|
||||
critical power in a future version of GoldenCheetah, but for now you'll need
|
||||
to use a text editor. On Linux, that probably means nano, vi, or emacs.
|
||||
On Mac, the easiest editor to use is TextEdit, which is in your Applications
|
||||
folder.
|
||||
There are currently three ways to set up your power zones. Each method has
|
||||
its benefits, so feel free to select the method that best suits your needs.
|
||||
|
||||
<p><b>Method 1: Set via critical power plot.</b>
|
||||
|
||||
<p> GoldenCheetah can determine a value for your CP value based on all
|
||||
of the data in your critical power plot. The calculated value of CP can
|
||||
be used to create a new range in your power.zones file by clicking the
|
||||
"save CP value" button in the lower right corner of the critical power
|
||||
plot tab. The new range will use the default zone definitions (see Method 2).
|
||||
Once the new range is set, you can manually edit the file to change the zone
|
||||
definitions as in Method 3.
|
||||
|
||||
<p>
|
||||
Start by
|
||||
downloading <a href="power.zones">this sample file</a> and saving it in
|
||||
|
||||
<pre>
|
||||
~/Library/GoldenCheetah/Your Name/power.zones
|
||||
</pre>
|
||||
<b>Method 2: User preferences.</b>
|
||||
<p>
|
||||
From the menu bar select GoldenCheetah->Preferences, then click on
|
||||
"cyclist info". The window should look like this:
|
||||
|
||||
<p>
|
||||
where "~" is your home directory (e.g., <code>/Users/srhea</code> on Mac or
|
||||
<code>/home/srhea</code> on Linux) and "Your Name" is the name you chose when
|
||||
you first opened GoldenCheetah. Open the power.zones file in a text editor
|
||||
and you'll see this:
|
||||
<center><img src="cyclist-info.png"></center>
|
||||
|
||||
|
||||
<p>
|
||||
Enter a value for critical power at the top of the dialog and click save
|
||||
to set your CP. New ranges can also be set via this dialog so that you can
|
||||
adjust your CP value throughout the season as your fitness increases (or
|
||||
decreases). Once your CP is set, GoldenCheetah will set up seven power zones
|
||||
based on percentages of your CP value. The zones are:
|
||||
<p>
|
||||
<table align="center" width="450">
|
||||
<tr>
|
||||
<td>Zone</td>
|
||||
<td>Description</td>
|
||||
<td>Low</td>
|
||||
<td>High</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Z1</td>
|
||||
<td>Active Recovery</td>
|
||||
<td>0%</td>
|
||||
<td>55%</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Z2</td>
|
||||
<td>Endurance</td>
|
||||
<td>55%</td>
|
||||
<td>75%</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Z3</td>
|
||||
<td>Tempo</td>
|
||||
<td>75%</td>
|
||||
<td>90%</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Z4</td>
|
||||
<td>Threshold</td>
|
||||
<td>90%</td>
|
||||
<td>105%</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Z5</td>
|
||||
<td>VO2 Max</td>
|
||||
<td>105%</td>
|
||||
<td>120%</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Z6</td>
|
||||
<td>Anaerobic</td>
|
||||
<td>120%</td>
|
||||
<td>150%</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Z7</td>
|
||||
<td>Neuromuscular</td>
|
||||
<td>150%</td>
|
||||
<td>MAX</td>
|
||||
</tr>
|
||||
</table>
|
||||
<p>
|
||||
If you want to use other zones boundaries or labels, you can manually edit
|
||||
the power.zones file as described in Method 3.
|
||||
|
||||
<p>
|
||||
<b>Method 3: Manually edit the power.zones file.</b>
|
||||
<p>
|
||||
To edit/create the power.zones file you'll need to use a text editor.
|
||||
On Linux, that probably means nano, vi, or emacs. On Mac, the easiest
|
||||
editor to use is TextEdit, which is in your Applications folder.
|
||||
|
||||
<p> Start by downloading <a href="power.zones">this sample file</a> and saving
|
||||
it in your rider directory, which is listed in the GoldenCheetah->About GoldenCheetah
|
||||
menu item.
|
||||
<p>
|
||||
Open the power.zones file in a text editor and you'll see this:
|
||||
|
||||
<blockquote>
|
||||
<pre>
|
||||
@@ -221,6 +329,8 @@ with a <code>.txt</code> extension. Use the menu command "Format->Make Plain
|
||||
Text" to get it to let you save the file with a <code>.zones</code> extension
|
||||
instead.
|
||||
|
||||
<p>
|
||||
|
||||
<p>
|
||||
<big><font face="arial,helvetica,sanserif">
|
||||
Legacy Command-Line Tools
|
||||
|
||||
BIN
doc/weekly-summary.png
Normal file
|
After Width: | Height: | Size: 162 KiB |
@@ -1,29 +1,18 @@
|
||||
<big><font face="arial,helvetica,sanserif">
|
||||
I wish GoldenCheetah would let me...
|
||||
</font></big>
|
||||
<p>If you have a new feature that you'd like to see in GoldenCheetah
|
||||
please create a new issue on our
|
||||
<a href=http://bugs.goldencheetah.org/projects/show/goldencheetah>bug/feature
|
||||
tracker</a>. Instructions for doing so are <a href="bug-tracker.html">here</a>.
|
||||
<p>
|
||||
Examples of some features are:
|
||||
<ul>
|
||||
<li>Split one ride into multiple rides</li>
|
||||
<li>Download directly from SRM</li>
|
||||
<li>Graph ride metrics (daily hours, work, BikeScore) over the long
|
||||
term (weeks, seasons)</li>
|
||||
<li>Automatically calculate CP from .cpi files</li>
|
||||
<li>Display the numbers at the bottom of the ride plot, like the
|
||||
critical power graph does</li>
|
||||
<li>Select intervals in the ride plot and display metrics for them
|
||||
at the bottom</li>
|
||||
<li>Pop up an "importing rides" thermometer when importing</li>
|
||||
|
||||
<li>Remember last settings for showPower, showHr, etc., in ride plot</li>
|
||||
<li>Switch ride plot x-axis from time to distance</li>
|
||||
<li>Edit power zones in a dialog</li>
|
||||
<li>-done- Sort rides in AllRides newest to oldest</li>
|
||||
<li>Group rides list into seasons</li>
|
||||
<li>Group rides list by type, course</li>
|
||||
<li>Add lines to CP plot for seasons, last six (eight?) weeks, etc.</li>
|
||||
<li>Create new intervals</li>
|
||||
<li>Ignore zeros in power histogram</li>
|
||||
<li>Show mulitple rides (seasons, etc.) in power histogram</li>
|
||||
<li>Annotate ride plot</li>
|
||||
<li>Label rides by type, course</li>
|
||||
<li>Use the current date as default when importing CSV files</li>
|
||||
</ul>
|
||||
|
||||
|
||||
2
qwt/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
lib
|
||||
qwtconfig.pri
|
||||
409
qwt/CHANGES
Normal file
@@ -0,0 +1,409 @@
|
||||
Release 5.2.1
|
||||
===================
|
||||
|
||||
Bug Fixes
|
||||
---------
|
||||
1) QwtScaleDraw
|
||||
Wrong border dist hints for unregular scale divisions fixed
|
||||
|
||||
Release 5.2.0
|
||||
===================
|
||||
|
||||
Changes
|
||||
-------
|
||||
1) Ported to Qt 4.5.x
|
||||
2) Scaling of non cosmetic pens (for printing to devices in high resolution)
|
||||
3) Clipping of polygons for SVG rendering
|
||||
4) QwtRect removed
|
||||
use QwtClipper instead
|
||||
5) QwtPlotRescaler
|
||||
Introduced
|
||||
6) QwtDoubleInterval
|
||||
BorderMode introduced
|
||||
7) QwtPlotCurve
|
||||
Performance of incremental curve painting ( = draw(from, to) ) improved.
|
||||
8) QwtLegendItem
|
||||
setIdentfierMode renamed to setIdentifierMode
|
||||
9) QwtPlotCanvas::replot() introduced
|
||||
code from QwtPlot::replot shifted
|
||||
10)QwtPlot
|
||||
drawCanvas(), updateAxes() changed from protected to public
|
||||
11)QwtScaleEngine
|
||||
loMargin/hiMargin renamed to lowerMargin/upperMargin
|
||||
12)QwtScaleDiv
|
||||
lBound/hBound renamed to lowerBound/upperBound
|
||||
13)QwtSpline
|
||||
cofficientA/B/C introduced
|
||||
14)QwtDial
|
||||
counter clockwise scales introduced
|
||||
15)QwtPlotMarker
|
||||
Vertical text labels
|
||||
16)doc/qwt-5.2.0.qch added foe browsing the Qwt docs in the Qt assistant
|
||||
|
||||
Bug Fixes
|
||||
---------
|
||||
1) QwtLinearScaleEngine
|
||||
Rounding problems fixed
|
||||
2) Again some print layout problems fixed
|
||||
3) QwtPlotScaleItem: 1 pixel offset fixed
|
||||
4) QwtPlotSpectrogram, clipping of contour lines
|
||||
against the bounding rect
|
||||
5) QwtPlotZoomer::setZoomStack for stacks with unlimited depth
|
||||
6) Printing of rotated tick labels
|
||||
|
||||
|
||||
Release 5.1.1
|
||||
===================
|
||||
|
||||
Bug Fixes
|
||||
---------
|
||||
1) Several compiler incompatibilities fixed
|
||||
2) DBL_EPSILON removed
|
||||
Using DBL_EPSILON in the calculations of the dials/sliders and the
|
||||
scale engines leads to problems with the inaccuracy of floating points.
|
||||
The behaviour has been reverted to 5.0.x.
|
||||
3) QwtSlider/QwtKnob
|
||||
setScaleDraw() fixed.
|
||||
4) QwtRect
|
||||
Pointless private declaration removed
|
||||
|
||||
Release 5.1.0
|
||||
===================
|
||||
|
||||
Changes
|
||||
-------
|
||||
1) QwtSymbol::copy introduced
|
||||
Now it is possible to use derived symbol classes for curves
|
||||
2) QwtPlotScaleItem introduced
|
||||
A new type of plot item for displaying axes on the canvas
|
||||
3) QwtClipper added
|
||||
A collection of clipping algos
|
||||
4) Using DBL_EPSILON
|
||||
This change allows smaller intervals for sliders/dials
|
||||
5) QwtPanner
|
||||
setOrientation() added.
|
||||
6) QwtPlot
|
||||
axisStepSize() added
|
||||
clear is virtual now
|
||||
7) QwtPlotPrintFilter
|
||||
PrintCanvasBackground splitted into PrintBackground, PrintFrameWithScales
|
||||
8) QwtPlotZoomer
|
||||
setZoomStack() added
|
||||
9) Changes for the QwtPolar package
|
||||
QwtLegendItemManager introduced
|
||||
QwtMagnifier introduced
|
||||
10)Suffix rules added in qwtconfig.pri for different targets for
|
||||
debug/release builds.
|
||||
|
||||
Bug Fixes
|
||||
---------
|
||||
1. QwtAbstractScaleDraw::setAbstractScaleDraw
|
||||
Reinitialization problem fixed
|
||||
2. QwtLegendItem
|
||||
key event handlers fixed
|
||||
3. QwtPicker
|
||||
solaris-cc compiler problem fixed
|
||||
4. Inaccurate mapping of scale to widget coordinates fixed
|
||||
5. QwtPlotCurve::draw
|
||||
Updates for Qt 4.3 added
|
||||
6. QwtPlotLayout
|
||||
AlignToCanvas layout calculation fixed
|
||||
7. QwtPlot::print
|
||||
Workaround for a QPen initialization problem,
|
||||
when printing to Pdf, added
|
||||
8. QwtText
|
||||
Layout of rich text documents fixed
|
||||
9. Designer
|
||||
Handling of QwtScaleWidget fixed
|
||||
10. realtime example
|
||||
Qt::WA_PaintOutsidePaintEvent added, ScrollZoomer fixed
|
||||
11. Several others I have forgotten
|
||||
|
||||
Release 5.0.2
|
||||
===================
|
||||
|
||||
Bug Fixes
|
||||
---------
|
||||
1. QwtPlotCurve::Xfy curve type fixed
|
||||
2. Memory leak in QwtLegend fixed
|
||||
3. Vertical alignment of rich texts fixed
|
||||
4. Workaround for a Qt4 bug added, that produces horrible performance
|
||||
when painting curves with a pen width > 1.
|
||||
5. Background for the tracker text of QwtPickers fixed.
|
||||
Improved (faster + better rendered texts) implementation of
|
||||
painting tracker texts, using capabilities of Qt >= 4.3.
|
||||
6. QwtArrowButton/QwtCounter: workaround for layout bug ( Qt < 4.3 )
|
||||
of the Cleanlook style added.
|
||||
7. A couple of minor fixes
|
||||
|
||||
Changes
|
||||
-------
|
||||
1. QSvgGenerator added to the bode example
|
||||
|
||||
Release 5.0.1
|
||||
===================
|
||||
|
||||
Changes
|
||||
-------
|
||||
1. A couple of problems, when building Qwt fixed.
|
||||
2. Displaying Rich Text with Qt 4.x fixed
|
||||
|
||||
Release 5.0.0
|
||||
===================
|
||||
|
||||
Platforms
|
||||
---------
|
||||
Support of Qt3 and Qt4. Qt2 is not supported any longer.
|
||||
|
||||
Key features
|
||||
------------
|
||||
1. Redesign of plot items. Makes it much easier to develop
|
||||
individual items.
|
||||
2. Redesign of the scale classes. All calculations are
|
||||
collected in scale engines, where the application can
|
||||
implement it´s own (f.e log2, or date scales). Now it´s
|
||||
also possible to have individual and completely irregular scales
|
||||
3. Redesign of the QwtText classes. The MathML renderer of
|
||||
the Qt4 solutions package is embedded.
|
||||
work for all expressions/situations.
|
||||
4. New classes for navigating: QwtPanner, QwtMaginfier
|
||||
5. Spectrogram/Contour plots and other classes for displaying
|
||||
raster data added.
|
||||
|
||||
Changes
|
||||
-------
|
||||
5.0.0 is by far the release with the most changes in the history of Qwt
|
||||
- too many to make list.
|
||||
|
||||
|
||||
Release 4.2.0/0.4.2
|
||||
===================
|
||||
|
||||
License
|
||||
--------
|
||||
A couple of exceptions to the LGPL with the intention to allow static
|
||||
linking with commercial applications. See COPYING.
|
||||
|
||||
Key features:
|
||||
-------------
|
||||
1. Designer plugin
|
||||
2. Rich Text support ( f.e. E = m * c<sup>2</sup> ) added.
|
||||
3. QwtDial class family added (QwtDial, QwtCompass, QwtAnalogClock, ...)
|
||||
4. QwtPicker class family added. Includes QwtPlotZoomer, a complete
|
||||
implementation of recursive zooming.
|
||||
5. Device metrics independent printing of QwtPlot. (QPrinter::HighResolution)
|
||||
6. QwtPlot::setCurveBrush(), QwtCurve::setBrush() added. The area
|
||||
between curve and baseline will be filled with this brush.
|
||||
7. Rotation of axis tick labels added. Very useful for axis with long
|
||||
labels like time scales ...
|
||||
8. Added a new abstract QwtData class to plot data from almost any type of
|
||||
container class.
|
||||
9. QwtDoublePoint, QwtDoubleSize, QwtDoubleRect double counterparts
|
||||
for QPoint, QSize, QRect.
|
||||
10. First steps to support Qtopia. All examples can be compiled and started
|
||||
in the qvfb emulator.
|
||||
|
||||
|
||||
Changes:
|
||||
---------
|
||||
1. Rewrite of QwtLegend/QwtLegendItem (no QTable anymore)
|
||||
2. Each plot item will be painted, even if one of the axis it is
|
||||
attached to is disabled. (like in all other releases beside 0.4.1)
|
||||
3. Code for double buffering moved to a new class QwtPaintBuffer.
|
||||
Double buffering can be enabled/disabled now.
|
||||
4. QwtPainter, QwtMetricsMap, QwtLayoutMetrics added
|
||||
Hide paint device metrics dependencies.
|
||||
5. Layout code rewritten and moved to a new class QwtPlotLayout
|
||||
New layout options canvasMargin(), alignCanvasToScales()
|
||||
6. QwtPlot: sizeHint() != minimumSizeHint()
|
||||
9. Internal plot data are private again. A couple of get methods
|
||||
added instead.
|
||||
10. canvas repaints triggered by paint events. Enables event filtering
|
||||
11. QwtPlot::drawCanvasItems added. In opposite to QwtPlot::drawCanvas
|
||||
it is used by the printing code too.
|
||||
12. qwtMax, qwtMin, qwtInt mapped to QMAX, QMIN, qRound from qglobal.h
|
||||
13. operator= for plot item classes changed.
|
||||
14. readOnly property added for sliders.
|
||||
15. valid flag added for QwtDblRange
|
||||
16. QwtCounter wrap around policy: a counter under- or overflow sets
|
||||
focus to the smallest up/down button and disables counting.
|
||||
A space bar keypress release event re-enables counting.
|
||||
17. QwtPushButton added. A class that adds rich text and alignments
|
||||
features to QPushButton, like they are used in QLabel
|
||||
18. Clipped painting code moved from QwtCurve to QwtPainter/QwtRect
|
||||
19. Canvas cache added to optimize trivial repaints.
|
||||
20. QwtPlot::drawCurve added for incremental curve data
|
||||
21. QwtSliderBase, readOnly, isValid added
|
||||
22. Added filtering of the colors of the title and scales to QwtPrintFilter.
|
||||
23. Support of QT_NO_CAST_ASII and QT_NO_COMPAT added
|
||||
24. Batch file added for generating Visual Studio project files
|
||||
25. QwtPlotCurve, QwtPlotMarker, QwtPlotGrid: more methods public
|
||||
26. QwtPlot::setLegendPosition added
|
||||
27. A lot of changes I don't remember, ... sorry.
|
||||
|
||||
Bugfixes:
|
||||
---------
|
||||
1. Autodetection of painter redirection. QPixmap::grabWidget() works
|
||||
with Qwt Widgets again.
|
||||
2. QwtSlider: Rounding double->int conversions instead of simple casts.
|
||||
3. Bad additional line, connected to the first curve point, when zooming
|
||||
deep, fixed.
|
||||
4. QwtMarker: Painting of symbols with width != height fixed
|
||||
5. QwtPlot::plotMouseXXX/canvasMap pixel coordinates synced.
|
||||
Now both include the canvas frame.
|
||||
6. Layout fixed for QwtScaleDraws without tick labels
|
||||
8. Tab focus chains fixed, focus indications added.
|
||||
9. Support QwtAutoScale::Inverted when autoScale is off also.
|
||||
10. Keyboard control, focus indications added.
|
||||
11. Improved QStyle awareness.
|
||||
12. Printing of plots with disabled axes
|
||||
|
||||
Examples
|
||||
--------
|
||||
1. New example linux/cpustat added. Runs also on non linux boxes
|
||||
with dummy values. Beside showing a couple of features that
|
||||
are new with 0.4.1 and 0.4.2, it shows how to extend and customize
|
||||
a QwtPlots.
|
||||
2. Added new example event_filter to demonstrate event filtering.
|
||||
This example shows how to add additional controls to the scales,
|
||||
how to translate mouse clicks on the scales into signals and
|
||||
how to move points on the canvas.
|
||||
3. realtime example shows how to use scrollbars when zooming
|
||||
|
||||
Release 0.4.1
|
||||
============
|
||||
|
||||
Changes:
|
||||
---------
|
||||
1. Platform independent project files. makefiles directory removed.
|
||||
2. RPM spec file template added.
|
||||
3. __declspec formalism added for Win32 DLLs. Requires
|
||||
'DEFINES += QWT_DLL' in the .pro file.
|
||||
4. QString used for visible texts.
|
||||
5. Code for error curves removed. These type of features should be
|
||||
implemented in derived curve classes.
|
||||
6. A lot of Qt 1.2 related code removed/replaced.
|
||||
7. QwtColorFilter, QwtPixFrame removed. QwtPlotPixFrame renamed
|
||||
to QwtPlotCanvas.
|
||||
8. qmodules.h aware. Skips QwtLegend in case of !QT_MODULE_TABLE
|
||||
9. All Widgets including QwtPlot optimized to reduce flicker
|
||||
during resize/repaint.
|
||||
10. QwtPlot curves/markers can be disabled/enabled to hide/show individual
|
||||
curves without removing the curves from the plot.
|
||||
11. Internal maps removed from QwtCurve. QwtCurve::setMap, QwtCurve::setRect,
|
||||
QwtCurve::setRange removed.
|
||||
|
||||
Feature additions:
|
||||
------------------
|
||||
1. Printing
|
||||
QwtPlot::print prints to any type of QPaintDevice now.
|
||||
Hardcoded printer attributes margin, creator and document title have
|
||||
been removed and must/can be set by the applications now.
|
||||
Printing of background and legends added. QwtColorFilter replaced
|
||||
by QwtPlotPrintFilter.
|
||||
2. Layout
|
||||
Many layout fixes and additions. Now all Widgets behave well in
|
||||
QLayouts and provide sensible sizeHints. QwtPlot::setMargin(int) added.
|
||||
Fieldwidth added for QwtPlot::setAxisFormat for application that need
|
||||
range independent width. Title and axis title are Qt:Alignment aware.
|
||||
Qt::WordBreak or multiline titles are possible.
|
||||
3. Legend
|
||||
En/Disabling of single curves in the legend added.
|
||||
QwtPlot::setAutoLegend added.
|
||||
4. Extensibility
|
||||
QwtPlot::insertCurve + QwtPlot::insertMarker added. Now derived
|
||||
classes of QwtPlotCurve and QwtPlotMarker can be added. Virtual
|
||||
methods provided by QwtPlotCurve for sub-classing.
|
||||
QwtScale::setScaleDraw + QwtPlot::setAxisScaleDraw + some virtual
|
||||
methods for QwtScaleDraw added. Application can implement individual
|
||||
axis labels now.
|
||||
5. Sliders
|
||||
QWheelEvent added. The MouseWheel stepsize is controlled by the
|
||||
Scroll Page Size. QwtWheel::setWheelWidth added. QwtKnob::setSymbol,
|
||||
QwtKnob::symbol added.
|
||||
|
||||
Bugfixes:
|
||||
---------
|
||||
1. Workaround for spontanous curves resulting from overruns
|
||||
when zooming too deep.
|
||||
2. Wrong QColorGroup::ColorRole for background colors fixed.
|
||||
Necessary for several non default QStyles.
|
||||
3. QwtWheel fixed for vertical wheels. Better color support.
|
||||
4. QwtSlider fixed.
|
||||
5. Many forgotten others
|
||||
|
||||
Release 0.4.0
|
||||
============
|
||||
|
||||
Bugfixes:
|
||||
---------
|
||||
1. A few occurences of the boolean literal \c false were changed into macro
|
||||
\c FALSE for cross compiler compatibility.
|
||||
2. A few local variables in member functions were renamed to suppress
|
||||
warnings issued by really picky compilers about global/class variables
|
||||
being hidden.
|
||||
3. In qwt_legend.h, a fully qualified name was used in a class declaration.
|
||||
The HPUX compiler chokes on this (and it's ugly), so it was fixed.
|
||||
4. Macro M_2PI is now only defined is this hasn't already been done by the
|
||||
system's clib.
|
||||
|
||||
Feature additions:
|
||||
------------------
|
||||
1. Qwt now works with Qt3.0. In order to achieve this, QwtLegend now no
|
||||
longer derives from QTableView, but from QTable. This seems to have had
|
||||
quite a few consequences. Kudo's to Uwe Rathmann for uploading this nice
|
||||
fix to the CVS tree.
|
||||
2. Getters for a plot's title and title font have been added.
|
||||
|
||||
Release 0.3.0
|
||||
============
|
||||
|
||||
License:
|
||||
--------
|
||||
1. The license has changed from GPL to LGPL.
|
||||
|
||||
Bugfixes:
|
||||
---------
|
||||
1. The makefiles for win32 caused object files to have extension .o instead of
|
||||
.obj. The 'propagate' file was changed to fix this, using tmake's target
|
||||
platform flag.
|
||||
2. There were problems with rint() on win32 platforms. rint() is a BSD call,
|
||||
not even available on all unices. All calls to rint(x) have been replaced
|
||||
by floor(x+.5).
|
||||
3. Some static class data members were initialized with the value of other
|
||||
static class data members (from Qt). This caused programs depend on the
|
||||
initialization order of class members. This is now fixed by replacing the
|
||||
static properties by static signleton factories.
|
||||
4. When a plot was zoomed and then printed, curves and markers laying outside
|
||||
the plot's scale were still printed. The print() function now uses clipping.
|
||||
|
||||
Feature additions:
|
||||
------------------
|
||||
1. Multi-line plot titles are now supported: the PostScript document name is
|
||||
not the plot title, with "\n" characters replaced by "--". Geometry
|
||||
management has been changed to support multi-line titles.
|
||||
2. In the mailinglist, there were often feature requests for features that
|
||||
were in fact implemented, but not available through QwtPlot's API. Many
|
||||
private members have been made protected or even public, to give users
|
||||
more control. This is poor design, but Qwt will be refactored anyway.
|
||||
3. Qwt always displayed floats with 5 digits. This was insufficient for many
|
||||
applications. QwtPlot, QwtScale, QwtAutoScale got some methods to set the
|
||||
label format. This is a printf like format for the numbers at the scales,
|
||||
consisting of 'f' and a precision, or 'g' and the significance.
|
||||
|
||||
Build system:
|
||||
-------------
|
||||
1. The 'makefiles' directory was removed from the cvs tree, and is now only
|
||||
generated for releases. CVS users should have tmake installed, to generate
|
||||
the makefiles themselves.
|
||||
2. The 'examples' directory now uses tmake's 'subdirs' template, to iterate
|
||||
over all subdirectories and build all examples with one command. There was
|
||||
allready a makefile for this, but now the process is automated by tmake.
|
||||
3. Under unix, the library now gets a proper version number. Current version
|
||||
is 0.3.0.
|
||||
|
||||
Documentation:
|
||||
--------------
|
||||
1. All documentation is converted to the Doxygen documentation system. The
|
||||
release contains two settings files, 'Doxygen' and 'Doxygen.users',
|
||||
generating a developer's and user's manual, respectively.
|
||||
543
qwt/COPYING
Normal file
@@ -0,0 +1,543 @@
|
||||
Qwt License
|
||||
Version 1.0, January 1, 2003
|
||||
|
||||
The Qwt library and included programs are provided under the terms
|
||||
of the GNU LESSER GENERAL PUBLIC LICENSE (LGPL) with the following
|
||||
exceptions:
|
||||
|
||||
1. Widgets that are subclassed from Qwt widgets do not
|
||||
constitute a derivative work.
|
||||
|
||||
2. Static linking of applications and widgets to the
|
||||
Qwt library does not constitute a derivative work
|
||||
and does not require the author to provide source
|
||||
code for the application or widget, use the shared
|
||||
Qwt libraries, or link their applications or
|
||||
widgets against a user-supplied version of Qwt.
|
||||
|
||||
If you link the application or widget to a modified
|
||||
version of Qwt, then the changes to Qwt must be
|
||||
provided under the terms of the LGPL in sections
|
||||
1, 2, and 4.
|
||||
|
||||
3. You do not have to provide a copy of the Qwt license
|
||||
with programs that are linked to the Qwt library, nor
|
||||
do you have to identify the Qwt license in your
|
||||
program or documentation as required by section 6
|
||||
of the LGPL.
|
||||
|
||||
|
||||
However, programs must still identify their use of Qwt.
|
||||
The following example statement can be included in user
|
||||
documentation to satisfy this requirement:
|
||||
|
||||
[program/widget] is based in part on the work of
|
||||
the Qwt project (http://qwt.sf.net).
|
||||
|
||||
----------------------------------------------------------------------
|
||||
|
||||
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
Version 2.1, February 1999
|
||||
|
||||
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
|
||||
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
[This is the first released version of the Lesser GPL. It also counts
|
||||
as the successor of the GNU Library Public License, version 2, hence
|
||||
the version number 2.1.]
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
Licenses are intended to guarantee your freedom to share and change
|
||||
free software--to make sure the software is free for all its users.
|
||||
|
||||
This license, the Lesser General Public License, applies to some
|
||||
specially designated software packages--typically libraries--of the
|
||||
Free Software Foundation and other authors who decide to use it. You
|
||||
can use it too, but we suggest you first think carefully about whether
|
||||
this license or the ordinary General Public License is the better
|
||||
strategy to use in any particular case, based on the explanations below.
|
||||
|
||||
When we speak of free software, we are referring to freedom of use,
|
||||
not price. Our General Public Licenses are designed to make sure that
|
||||
you have the freedom to distribute copies of free software (and charge
|
||||
for this service if you wish); that you receive source code or can get
|
||||
it if you want it; that you can change the software and use pieces of
|
||||
it in new free programs; and that you are informed that you can do
|
||||
these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
distributors to deny you these rights or to ask you to surrender these
|
||||
rights. These restrictions translate to certain responsibilities for
|
||||
you if you distribute copies of the library or if you modify it.
|
||||
|
||||
For example, if you distribute copies of the library, whether gratis
|
||||
or for a fee, you must give the recipients all the rights that we gave
|
||||
you. You must make sure that they, too, receive or can get the source
|
||||
code. If you link other code with the library, you must provide
|
||||
complete object files to the recipients, so that they can relink them
|
||||
with the library after making changes to the library and recompiling
|
||||
it. And you must show them these terms so they know their rights.
|
||||
|
||||
We protect your rights with a two-step method: (1) we copyright the
|
||||
library, and (2) we offer you this license, which gives you legal
|
||||
permission to copy, distribute and/or modify the library.
|
||||
|
||||
To protect each distributor, we want to make it very clear that
|
||||
there is no warranty for the free library. Also, if the library is
|
||||
modified by someone else and passed on, the recipients should know
|
||||
that what they have is not the original version, so that the original
|
||||
author's reputation will not be affected by problems that might be
|
||||
introduced by others.
|
||||
|
||||
Finally, software patents pose a constant threat to the existence of
|
||||
any free program. We wish to make sure that a company cannot
|
||||
effectively restrict the users of a free program by obtaining a
|
||||
restrictive license from a patent holder. Therefore, we insist that
|
||||
any patent license obtained for a version of the library must be
|
||||
consistent with the full freedom of use specified in this license.
|
||||
|
||||
Most GNU software, including some libraries, is covered by the
|
||||
ordinary GNU General Public License. This license, the GNU Lesser
|
||||
General Public License, applies to certain designated libraries, and
|
||||
is quite different from the ordinary General Public License. We use
|
||||
this license for certain libraries in order to permit linking those
|
||||
libraries into non-free programs.
|
||||
|
||||
When a program is linked with a library, whether statically or using
|
||||
a shared library, the combination of the two is legally speaking a
|
||||
combined work, a derivative of the original library. The ordinary
|
||||
General Public License therefore permits such linking only if the
|
||||
entire combination fits its criteria of freedom. The Lesser General
|
||||
Public License permits more lax criteria for linking other code with
|
||||
the library.
|
||||
|
||||
We call this license the "Lesser" General Public License because it
|
||||
does Less to protect the user's freedom than the ordinary General
|
||||
Public License. It also provides other free software developers Less
|
||||
of an advantage over competing non-free programs. These disadvantages
|
||||
are the reason we use the ordinary General Public License for many
|
||||
libraries. However, the Lesser license provides advantages in certain
|
||||
special circumstances.
|
||||
|
||||
For example, on rare occasions, there may be a special need to
|
||||
encourage the widest possible use of a certain library, so that it becomes
|
||||
a de-facto standard. To achieve this, non-free programs must be
|
||||
allowed to use the library. A more frequent case is that a free
|
||||
library does the same job as widely used non-free libraries. In this
|
||||
case, there is little to gain by limiting the free library to free
|
||||
software only, so we use the Lesser General Public License.
|
||||
|
||||
In other cases, permission to use a particular library in non-free
|
||||
programs enables a greater number of people to use a large body of
|
||||
free software. For example, permission to use the GNU C Library in
|
||||
non-free programs enables many more people to use the whole GNU
|
||||
operating system, as well as its variant, the GNU/Linux operating
|
||||
system.
|
||||
|
||||
Although the Lesser General Public License is Less protective of the
|
||||
users' freedom, it does ensure that the user of a program that is
|
||||
linked with the Library has the freedom and the wherewithal to run
|
||||
that program using a modified version of the Library.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow. Pay close attention to the difference between a
|
||||
"work based on the library" and a "work that uses the library". The
|
||||
former contains code derived from the library, whereas the latter must
|
||||
be combined with the library in order to run.
|
||||
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License Agreement applies to any software library or other
|
||||
program which contains a notice placed by the copyright holder or
|
||||
other authorized party saying it may be distributed under the terms of
|
||||
this Lesser General Public License (also called "this License").
|
||||
Each licensee is addressed as "you".
|
||||
|
||||
A "library" means a collection of software functions and/or data
|
||||
prepared so as to be conveniently linked with application programs
|
||||
(which use some of those functions and data) to form executables.
|
||||
|
||||
The "Library", below, refers to any such software library or work
|
||||
which has been distributed under these terms. A "work based on the
|
||||
Library" means either the Library or any derivative work under
|
||||
copyright law: that is to say, a work containing the Library or a
|
||||
portion of it, either verbatim or with modifications and/or translated
|
||||
straightforwardly into another language. (Hereinafter, translation is
|
||||
included without limitation in the term "modification".)
|
||||
|
||||
"Source code" for a work means the preferred form of the work for
|
||||
making modifications to it. For a library, complete source code means
|
||||
all the source code for all modules it contains, plus any associated
|
||||
interface definition files, plus the scripts used to control compilation
|
||||
and installation of the library.
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running a program using the Library is not restricted, and output from
|
||||
such a program is covered only if its contents constitute a work based
|
||||
on the Library (independent of the use of the Library in a tool for
|
||||
writing it). Whether that is true depends on what the Library does
|
||||
and what the program that uses the Library does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Library's
|
||||
complete source code as you receive it, in any medium, provided that
|
||||
you conspicuously and appropriately publish on each copy an
|
||||
appropriate copyright notice and disclaimer of warranty; keep intact
|
||||
all the notices that refer to this License and to the absence of any
|
||||
warranty; and distribute a copy of this License along with the
|
||||
Library.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy,
|
||||
and you may at your option offer warranty protection in exchange for a
|
||||
fee.
|
||||
|
||||
2. You may modify your copy or copies of the Library or any portion
|
||||
of it, thus forming a work based on the Library, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) The modified work must itself be a software library.
|
||||
|
||||
b) You must cause the files modified to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
c) You must cause the whole of the work to be licensed at no
|
||||
charge to all third parties under the terms of this License.
|
||||
|
||||
d) If a facility in the modified Library refers to a function or a
|
||||
table of data to be supplied by an application program that uses
|
||||
the facility, other than as an argument passed when the facility
|
||||
is invoked, then you must make a good faith effort to ensure that,
|
||||
in the event an application does not supply such function or
|
||||
table, the facility still operates, and performs whatever part of
|
||||
its purpose remains meaningful.
|
||||
|
||||
(For example, a function in a library to compute square roots has
|
||||
a purpose that is entirely well-defined independent of the
|
||||
application. Therefore, Subsection 2d requires that any
|
||||
application-supplied function or table used by this function must
|
||||
be optional: if the application does not supply it, the square
|
||||
root function must still compute square roots.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Library,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Library, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote
|
||||
it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Library.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Library
|
||||
with the Library (or with a work based on the Library) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may opt to apply the terms of the ordinary GNU General Public
|
||||
License instead of this License to a given copy of the Library. To do
|
||||
this, you must alter all the notices that refer to this License, so
|
||||
that they refer to the ordinary GNU General Public License, version 2,
|
||||
instead of to this License. (If a newer version than version 2 of the
|
||||
ordinary GNU General Public License has appeared, then you can specify
|
||||
that version instead if you wish.) Do not make any other change in
|
||||
these notices.
|
||||
|
||||
Once this change is made in a given copy, it is irreversible for
|
||||
that copy, so the ordinary GNU General Public License applies to all
|
||||
subsequent copies and derivative works made from that copy.
|
||||
|
||||
This option is useful when you wish to copy part of the code of
|
||||
the Library into a program that is not a library.
|
||||
|
||||
4. You may copy and distribute the Library (or a portion or
|
||||
derivative of it, under Section 2) in object code or executable form
|
||||
under the terms of Sections 1 and 2 above provided that you accompany
|
||||
it with the complete corresponding machine-readable source code, which
|
||||
must be distributed under the terms of Sections 1 and 2 above on a
|
||||
medium customarily used for software interchange.
|
||||
|
||||
If distribution of object code is made by offering access to copy
|
||||
from a designated place, then offering equivalent access to copy the
|
||||
source code from the same place satisfies the requirement to
|
||||
distribute the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
5. A program that contains no derivative of any portion of the
|
||||
Library, but is designed to work with the Library by being compiled or
|
||||
linked with it, is called a "work that uses the Library". Such a
|
||||
work, in isolation, is not a derivative work of the Library, and
|
||||
therefore falls outside the scope of this License.
|
||||
|
||||
However, linking a "work that uses the Library" with the Library
|
||||
creates an executable that is a derivative of the Library (because it
|
||||
contains portions of the Library), rather than a "work that uses the
|
||||
library". The executable is therefore covered by this License.
|
||||
Section 6 states terms for distribution of such executables.
|
||||
|
||||
When a "work that uses the Library" uses material from a header file
|
||||
that is part of the Library, the object code for the work may be a
|
||||
derivative work of the Library even though the source code is not.
|
||||
Whether this is true is especially significant if the work can be
|
||||
linked without the Library, or if the work is itself a library. The
|
||||
threshold for this to be true is not precisely defined by law.
|
||||
|
||||
If such an object file uses only numerical parameters, data
|
||||
structure layouts and accessors, and small macros and small inline
|
||||
functions (ten lines or less in length), then the use of the object
|
||||
file is unrestricted, regardless of whether it is legally a derivative
|
||||
work. (Executables containing this object code plus portions of the
|
||||
Library will still fall under Section 6.)
|
||||
|
||||
Otherwise, if the work is a derivative of the Library, you may
|
||||
distribute the object code for the work under the terms of Section 6.
|
||||
Any executables containing that work also fall under Section 6,
|
||||
whether or not they are linked directly with the Library itself.
|
||||
|
||||
6. As an exception to the Sections above, you may also combine or
|
||||
link a "work that uses the Library" with the Library to produce a
|
||||
work containing portions of the Library, and distribute that work
|
||||
under terms of your choice, provided that the terms permit
|
||||
modification of the work for the customer's own use and reverse
|
||||
engineering for debugging such modifications.
|
||||
|
||||
You must give prominent notice with each copy of the work that the
|
||||
Library is used in it and that the Library and its use are covered by
|
||||
this License. You must supply a copy of this License. If the work
|
||||
during execution displays copyright notices, you must include the
|
||||
copyright notice for the Library among them, as well as a reference
|
||||
directing the user to the copy of this License. Also, you must do one
|
||||
of these things:
|
||||
|
||||
a) Accompany the work with the complete corresponding
|
||||
machine-readable source code for the Library including whatever
|
||||
changes were used in the work (which must be distributed under
|
||||
Sections 1 and 2 above); and, if the work is an executable linked
|
||||
with the Library, with the complete machine-readable "work that
|
||||
uses the Library", as object code and/or source code, so that the
|
||||
user can modify the Library and then relink to produce a modified
|
||||
executable containing the modified Library. (It is understood
|
||||
that the user who changes the contents of definitions files in the
|
||||
Library will not necessarily be able to recompile the application
|
||||
to use the modified definitions.)
|
||||
|
||||
b) Use a suitable shared library mechanism for linking with the
|
||||
Library. A suitable mechanism is one that (1) uses at run time a
|
||||
copy of the library already present on the user's computer system,
|
||||
rather than copying library functions into the executable, and (2)
|
||||
will operate properly with a modified version of the library, if
|
||||
the user installs one, as long as the modified version is
|
||||
interface-compatible with the version that the work was made with.
|
||||
|
||||
c) Accompany the work with a written offer, valid for at
|
||||
least three years, to give the same user the materials
|
||||
specified in Subsection 6a, above, for a charge no more
|
||||
than the cost of performing this distribution.
|
||||
|
||||
d) If distribution of the work is made by offering access to copy
|
||||
from a designated place, offer equivalent access to copy the above
|
||||
specified materials from the same place.
|
||||
|
||||
e) Verify that the user has already received a copy of these
|
||||
materials or that you have already sent this user a copy.
|
||||
|
||||
For an executable, the required form of the "work that uses the
|
||||
Library" must include any data and utility programs needed for
|
||||
reproducing the executable from it. However, as a special exception,
|
||||
the materials to be distributed need not include anything that is
|
||||
normally distributed (in either source or binary form) with the major
|
||||
components (compiler, kernel, and so on) of the operating system on
|
||||
which the executable runs, unless that component itself accompanies
|
||||
the executable.
|
||||
|
||||
It may happen that this requirement contradicts the license
|
||||
restrictions of other proprietary libraries that do not normally
|
||||
accompany the operating system. Such a contradiction means you cannot
|
||||
use both them and the Library together in an executable that you
|
||||
distribute.
|
||||
|
||||
7. You may place library facilities that are a work based on the
|
||||
Library side-by-side in a single library together with other library
|
||||
facilities not covered by this License, and distribute such a combined
|
||||
library, provided that the separate distribution of the work based on
|
||||
the Library and of the other library facilities is otherwise
|
||||
permitted, and provided that you do these two things:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work
|
||||
based on the Library, uncombined with any other library
|
||||
facilities. This must be distributed under the terms of the
|
||||
Sections above.
|
||||
|
||||
b) Give prominent notice with the combined library of the fact
|
||||
that part of it is a work based on the Library, and explaining
|
||||
where to find the accompanying uncombined form of the same work.
|
||||
|
||||
8. You may not copy, modify, sublicense, link with, or distribute
|
||||
the Library except as expressly provided under this License. Any
|
||||
attempt otherwise to copy, modify, sublicense, link with, or
|
||||
distribute the Library is void, and will automatically terminate your
|
||||
rights under this License. However, parties who have received copies,
|
||||
or rights, from you under this License will not have their licenses
|
||||
terminated so long as such parties remain in full compliance.
|
||||
|
||||
9. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Library or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Library (or any work based on the
|
||||
Library), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Library or works based on it.
|
||||
|
||||
10. Each time you redistribute the Library (or any work based on the
|
||||
Library), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute, link with or modify the Library
|
||||
subject to these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties with
|
||||
this License.
|
||||
|
||||
11. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Library at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Library by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Library.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under any
|
||||
particular circumstance, the balance of the section is intended to apply,
|
||||
and the section as a whole is intended to apply in other circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
12. If the distribution and/or use of the Library is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Library under this License may add
|
||||
an explicit geographical distribution limitation excluding those countries,
|
||||
so that distribution is permitted only in or among countries not thus
|
||||
excluded. In such case, this License incorporates the limitation as if
|
||||
written in the body of this License.
|
||||
|
||||
13. The Free Software Foundation may publish revised and/or new
|
||||
versions of the Lesser General Public License from time to time.
|
||||
Such new versions will be similar in spirit to the present version,
|
||||
but may differ in detail to address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Library
|
||||
specifies a version number of this License which applies to it and
|
||||
"any later version", you have the option of following the terms and
|
||||
conditions either of that version or of any later version published by
|
||||
the Free Software Foundation. If the Library does not specify a
|
||||
license version number, you may choose any version ever published by
|
||||
the Free Software Foundation.
|
||||
|
||||
14. If you wish to incorporate parts of the Library into other free
|
||||
programs whose distribution conditions are incompatible with these,
|
||||
write to the author to ask for permission. For software which is
|
||||
copyrighted by the Free Software Foundation, write to the Free
|
||||
Software Foundation; we sometimes make exceptions for this. Our
|
||||
decision will be guided by the two goals of preserving the free status
|
||||
of all derivatives of our free software and of promoting the sharing
|
||||
and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
|
||||
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
||||
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
|
||||
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
|
||||
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
|
||||
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
|
||||
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
|
||||
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
|
||||
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
|
||||
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
|
||||
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
|
||||
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
|
||||
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
|
||||
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
||||
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Libraries
|
||||
|
||||
If you develop a new library, and you want it to be of the greatest
|
||||
possible use to the public, we recommend making it free software that
|
||||
everyone can redistribute and change. You can do so by permitting
|
||||
redistribution under these terms (or, alternatively, under the terms of the
|
||||
ordinary General Public License).
|
||||
|
||||
To apply these terms, attach the following notices to the library. It is
|
||||
safest to attach them to the start of each source file to most effectively
|
||||
convey the exclusion of warranty; and each file should have at least the
|
||||
"copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the library's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Lesser General Public
|
||||
License as published by the Free Software Foundation; either
|
||||
version 2.1 of the License, or (at your option) any later version.
|
||||
|
||||
This library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Lesser General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Lesser General Public
|
||||
License along with this library; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or your
|
||||
school, if any, to sign a "copyright disclaimer" for the library, if
|
||||
necessary. Here is a sample; alter the names:
|
||||
|
||||
Yoyodyne, Inc., hereby disclaims all copyright interest in the
|
||||
library `Frob' (a library for tweaking knobs) written by James Random Hacker.
|
||||
|
||||
<signature of Ty Coon>, 1 April 1990
|
||||
Ty Coon, President of Vice
|
||||
|
||||
That's all there is to it!
|
||||
|
||||
|
||||
176
qwt/INSTALL
Normal file
@@ -0,0 +1,176 @@
|
||||
Introduction
|
||||
============
|
||||
|
||||
Qwt uses qmake to build all its components and examples.
|
||||
qmake is part of a Qt distribution.
|
||||
|
||||
qmake reads project files, that contain the options and rules how to
|
||||
build a certain project. A project file ends with the suffix "*.pro".
|
||||
Files that end with the suffix "*.pri" are included by the project
|
||||
files and contain definitions, that are common for several project files.
|
||||
|
||||
qwtconfig.pri is read by all project files of the Qwt package.
|
||||
So the first step is to edit qwtconfig.pri to adjust it to your
|
||||
needs.
|
||||
|
||||
MathML Extension
|
||||
================
|
||||
|
||||
Qwt/Qt4 supports the MathML render engine from the Qt solutions package,
|
||||
that is only available with a commercial Qt license.
|
||||
|
||||
You need a release of qtmmlwidget >= 2.1.
|
||||
Copy the files qtmmlwidget.[cpp|h] to textengines/mathml.
|
||||
|
||||
Documentation
|
||||
==========================
|
||||
|
||||
Qwt includes a class documentation, that is available in various formats:
|
||||
|
||||
- Html files
|
||||
- PDF document
|
||||
- Qt Compressed Help (*.qch ) for the Qt assistant.
|
||||
- Man pages ( UNIX only )
|
||||
|
||||
A) Unix Qt3/Qt4
|
||||
==========================
|
||||
|
||||
qmake
|
||||
make
|
||||
make install
|
||||
|
||||
If you have installed a shared library it's path has to be known to
|
||||
the run-time linker of your operating system. On Linux systems read
|
||||
"man ldconfig" ( or google for it ). Another option is to use
|
||||
the LD_LIBRARY_PATH (on some systems LIBPATH is used instead, on MacOSX
|
||||
it is called DYLD_LIBRARY_PATH) environment variable.
|
||||
|
||||
If you only want to check the Qwt examples without installing something,
|
||||
you can set the LD_LIBRARY_PATH to the lib directory
|
||||
of your local build.
|
||||
|
||||
If you didn't enable autobuilding of the examples in qwtconfig.pri
|
||||
you have to build the examples this way:
|
||||
|
||||
cd examples
|
||||
qmake
|
||||
make
|
||||
|
||||
|
||||
B) Win32/MSVC Qt3/Qt4
|
||||
=====================
|
||||
|
||||
Please read the qmake documentation how to convert
|
||||
your *.pro files into your development environment.
|
||||
|
||||
F.e MSVC with nmake:
|
||||
qmake qwt.pro
|
||||
nmake
|
||||
|
||||
If you didn't enable autobuilding of the examples in qwtconfig.pri
|
||||
you have to build the examples this way:
|
||||
|
||||
cd examples
|
||||
qmake examples.pro
|
||||
nmake
|
||||
|
||||
admin/msvc-qmake.bat helps users of Visual Studio users to
|
||||
generate makefiles or project files (.dsp for MSVC-6.0 or vcproj for
|
||||
MSVC.NET) for Qwt.
|
||||
|
||||
To generate makefiles, type: "admin\msvc-qmake"
|
||||
To generate project files, type: "admin\msvc-qmake vc"
|
||||
|
||||
When you have built a Qwt DLL you need to add the following
|
||||
define to your compiler flags: QWT_DLL.
|
||||
|
||||
Windows doesn't like mixing of debug and release binaries. Most
|
||||
of the problems with using the Qwt designer plugin are because
|
||||
of trying to load a Qwt debug library into a designer release
|
||||
executable.
|
||||
|
||||
|
||||
C) Win32/MinGW Qt4
|
||||
==================
|
||||
|
||||
C1) Windows Shell
|
||||
|
||||
Start a Windows Shell, where Qt4 is initialized. ( F.e. with
|
||||
"Programs->Qt by Trolltech ...->Qt 4.x.x Command Prompt" ).
|
||||
|
||||
qmake qwt.pro
|
||||
make
|
||||
|
||||
If you didn't enable autobuilding of the examples in qwtconfig.pri
|
||||
you have to build the examples this way:
|
||||
|
||||
cd examples
|
||||
qmake examples.pro
|
||||
make
|
||||
make install
|
||||
|
||||
C2) MSYS Shell Qt >= 4.3.0
|
||||
|
||||
Support for the MSYS Shell has been improved in Qt 4.3.0.
|
||||
Now building Qwt from the MSYS Shell works exactly like in UNIX or in the
|
||||
Windows Shell - or at least it should:
|
||||
because of a bug in Qt 4.3.0 you always have to do a "qmake -r".
|
||||
|
||||
C3) MSYS Shell Qt < 4.3.0
|
||||
|
||||
For Qt < 4.3.0 you have to set the MINGW_IN_SHELL variable.
|
||||
make will run into errors with the subdirs target, that can be
|
||||
ignored (make -i).
|
||||
|
||||
export MINGW_IN_SHELL=1;
|
||||
|
||||
qmake
|
||||
make -i
|
||||
make -i install
|
||||
|
||||
If you didn't enable autobuilding of the examples in qwtconfig.pri
|
||||
you have to build the examples this way:
|
||||
|
||||
cd examples
|
||||
qmake examples.pro
|
||||
make -i
|
||||
make -i install
|
||||
|
||||
C1-C3)
|
||||
|
||||
When you have built a Qwt DLL you need to add QWT_DLL to your compiler
|
||||
flags. If you are using qmake for your own builds this done by adding
|
||||
the following line to your profile: "DEFINES += QWT_DLL".
|
||||
|
||||
Windows doesn't like mixing of debug and release binaries. Most
|
||||
of the problems with using the Qwt designer plugin are because
|
||||
of trying to load a Qwt debug library into a designer release
|
||||
executable.
|
||||
|
||||
D) MacOSX
|
||||
|
||||
Well, the Mac is only another Unix system. So read the instructions in A).
|
||||
|
||||
In the recent Qt4 releases the default target of qmake is to generate
|
||||
XCode project files instead of makefiles. So you might need to do the
|
||||
following:
|
||||
|
||||
qmake -spec macx-g++
|
||||
...
|
||||
|
||||
D) Qtopia Core
|
||||
|
||||
I only tested Qwt with Qtopia Core in qvfb (Virtual Framebuffer Devivce)
|
||||
Emulator on my Linux box. To build Qwt for the emulator was as simple as
|
||||
for a regular Unix build.
|
||||
|
||||
qmake
|
||||
make
|
||||
|
||||
E) Qtopia (!= Qtopia Core)
|
||||
|
||||
I once compiled the Qwt library against Qtopia 4.2.0 successfully - but
|
||||
not more. It should be possible to build and install Qwt, but it's
|
||||
not done yet.
|
||||
|
||||
Good luck !
|
||||
33
qwt/README
Normal file
@@ -0,0 +1,33 @@
|
||||
|
||||
The Qwt Widget Library
|
||||
----------------------
|
||||
|
||||
Qwt is an extension to the Qt GUI library from Troll Tech AS.
|
||||
The Qwt library contains widgets and components which are
|
||||
primarily useful for technical and scientifical purposes.
|
||||
It includes a 2-D plotting widget, different kinds of sliders,
|
||||
and much more.
|
||||
|
||||
Qwt is hosted at http://qwt.sf.net
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
||||
Read INSTALL how to build and install Qwt.
|
||||
|
||||
Copyright
|
||||
---------
|
||||
|
||||
Qwt Widget Library
|
||||
Copyright (C) 1997 Josef Wilgen
|
||||
Copyright (C) 2002 Uwe Rathmann
|
||||
|
||||
Qwt is published under the Qwt License, Version 1.0.
|
||||
You should have received a copy of this licence in the file
|
||||
COPYING.
|
||||
|
||||
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.
|
||||
|
||||
|
||||
58
qwt/admin/msvc-qmake.bat
Normal file
@@ -0,0 +1,58 @@
|
||||
REM Batch file to make all Makefiles or all Visual Studio project files
|
||||
REM (*.dsp for MSVC-6.0 or *.vcproj for MSVC-7.0) for Qwt with qmake.
|
||||
REM
|
||||
REM BUG: the designer plugin *.dsp file may not work; the Makefile does.
|
||||
REM
|
||||
REM To make Makefiles, type: msvc-qmake
|
||||
REM To make project files type: msvc-qmake vc
|
||||
|
||||
REM For the Qwt library:
|
||||
cd src
|
||||
qmake -t %1lib% src.pro
|
||||
cd ..
|
||||
|
||||
REM For the designer plugin:
|
||||
cd textengines\mathml
|
||||
qmake -t %1lib mathml.pro
|
||||
cd ..\..
|
||||
|
||||
REM For the designer plugin:
|
||||
cd designer
|
||||
qmake -t %1lib designer.pro
|
||||
cd ..
|
||||
|
||||
REM For the examples:
|
||||
cd examples
|
||||
cd bode
|
||||
qmake -t %1app bode.pro
|
||||
cd ..\cpuplot
|
||||
qmake -t %1app cpuplot.pro
|
||||
cd ..\curvdemo1
|
||||
qmake -t %1app curvdemo1.pro
|
||||
cd ..\curvdemo2
|
||||
qmake -t %1app curvdemo2.pro
|
||||
cd ..\data_plot
|
||||
qmake -t %1app data_plot.pro
|
||||
cd ..\dials
|
||||
qmake -t %1app dials.pro
|
||||
cd ..\event_filter
|
||||
qmake -t %1app event_filter.pro
|
||||
cd ..\histogram
|
||||
qmake -t %1app histogram.pro
|
||||
cd ..\radio
|
||||
qmake -t %1app radio.pro
|
||||
cd ..\realtime_plot
|
||||
qmake -t %1app realtime_plot.pro
|
||||
cd ..\simple_plot
|
||||
qmake -t %1app simple_plot.pro
|
||||
cd ..\sliders
|
||||
qmake -t %1app sliders.pro
|
||||
cd ..\spectrogram
|
||||
qmake -t %1app spectrogram.pro
|
||||
cd ..\svgmap
|
||||
qmake -t %1app svgmap.pro
|
||||
cd ..\sysinfo
|
||||
qmake -t %1app sysinfo.pro
|
||||
cd ..\..
|
||||
|
||||
REM EOF
|
||||
9
qwt/admin/no-qt-keywords.sh
Executable file
@@ -0,0 +1,9 @@
|
||||
#! /bin/sh
|
||||
|
||||
find src -name "qwt_*.h" | xargs grep -l 'signals:' | xargs sed -i "s/signals:/Q_SIGNALS:/"
|
||||
find src -name "qwt_*.h" | xargs grep -l 'slots:' | xargs sed -i "s/signals:/Q_SLOTS:/"
|
||||
find src -name "qwt_*.cpp" | xargs grep -l 'emit ' | xargs sed -i "s/emit /Q_EMIT /"
|
||||
|
||||
echo "CONFIG += no_keywords" >> src/src.pro
|
||||
|
||||
|
||||
299
qwt/admin/svn2package.sh
Executable file
@@ -0,0 +1,299 @@
|
||||
#! /bin/sh
|
||||
#
|
||||
# Generates a Qwt package from sourceforge svn
|
||||
#
|
||||
# Usage: svn2package.sh [-b|--branch <svn-branch>] [packagename]
|
||||
#
|
||||
|
||||
##########################
|
||||
# usage
|
||||
##########################
|
||||
|
||||
function usage() {
|
||||
echo "Usage: $0 [-b|--branch <svn-branch>] [-pdf] [-qch] [packagename]"
|
||||
exit 1
|
||||
}
|
||||
|
||||
################################
|
||||
# checkout
|
||||
################################
|
||||
|
||||
function checkoutQwt() {
|
||||
|
||||
if [ -x $2 ]
|
||||
then
|
||||
rm -r $2
|
||||
if [ $? -ne 0 ]
|
||||
then
|
||||
exit $?
|
||||
fi
|
||||
fi
|
||||
|
||||
svn -q co https://qwt.svn.sourceforge.net/svnroot/qwt/$1/$2
|
||||
if [ $? -ne 0 ]
|
||||
then
|
||||
echo "Can't access sourceforge SVN"
|
||||
exit $?
|
||||
fi
|
||||
|
||||
if [ "$3" != "$2" ]
|
||||
then
|
||||
rm -rf $3
|
||||
mv $2 $3
|
||||
fi
|
||||
}
|
||||
|
||||
##########################
|
||||
# cleanQwt dirname
|
||||
##########################
|
||||
|
||||
function cleanQwt {
|
||||
|
||||
cd $1
|
||||
if [ $? -ne 0 ]
|
||||
then
|
||||
exit $?
|
||||
fi
|
||||
|
||||
find . -name .svn -print | xargs rm -r
|
||||
|
||||
rm TODO
|
||||
rm admin/svn2package.sh
|
||||
|
||||
PROFILES="qwtconfig.pri"
|
||||
for PROFILE in $PROFILES
|
||||
do
|
||||
sed -i -e 's/= debug /= release /' $PROFILE
|
||||
done
|
||||
|
||||
HEADERS=`find . -type f -name '*.h' -print`
|
||||
SOURCES=`find . -type f -name '*.cpp' -print`
|
||||
PROFILES=`find . -type f -name '*.pro' -print`
|
||||
PRIFILES=`find . -type f -name '*.pri' -print`
|
||||
|
||||
for EXPANDFILE in $HEADERS $SOURCES $PROFILES $PRIFILES
|
||||
do
|
||||
expand -4 $EXPANDFILE > $EXPANDFILE.expand
|
||||
mv $EXPANDFILE.expand $EXPANDFILE
|
||||
done
|
||||
|
||||
for SRCFILE in $SOURCES $PROFILES $PRIFILES
|
||||
do
|
||||
sed -i -e '/#warning/d' $SRCFILE
|
||||
done
|
||||
|
||||
sed -i -e "s/\$\$VERSION-svn/$VERSION/" qwtconfig.pri
|
||||
sed -i -e "s/\$\${QwtVersion}-svn/\$\${QwtVersion}/" qwt.prf
|
||||
|
||||
cd - > /dev/null
|
||||
}
|
||||
|
||||
##########################
|
||||
# createDocs dirname
|
||||
##########################
|
||||
|
||||
function createDocs {
|
||||
|
||||
ODIR=`pwd`
|
||||
|
||||
cd $1
|
||||
if [ $? -ne 0 ]
|
||||
then
|
||||
exit $?
|
||||
fi
|
||||
|
||||
cp Doxyfile Doxyfile.doc
|
||||
|
||||
sed -i '/PROJECT_NUMBER/d' Doxyfile.doc
|
||||
echo "PROJECT_NUMBER = $VERSION" >> Doxyfile.doc
|
||||
|
||||
if [ $GENERATE_MAN -ne 0 ]
|
||||
then
|
||||
sed -i -e '/GENERATE_MAN/d' -e '/PROJECT_NUMBER/d' Doxyfile.doc
|
||||
echo 'GENERATE_MAN = YES' >> Doxyfile.doc
|
||||
fi
|
||||
|
||||
if [ $GENERATE_PDF -ne 0 ]
|
||||
then
|
||||
# We need LateX for the qwtdoc.pdf
|
||||
|
||||
sed -i -e '/GENERATE_LATEX/d' -e '/GENERATE_MAN/d' -e '/PROJECT_NUMBER/d' Doxyfile.doc
|
||||
echo 'GENERATE_LATEX = YES' >> Doxyfile.doc
|
||||
echo 'GENERATE_MAN = YES' >> Doxyfile.doc
|
||||
echo "PROJECT_NUMBER = $VERSION" >> Doxyfile.doc
|
||||
fi
|
||||
|
||||
if [ $GENERATE_QCH -ne 0 ]
|
||||
then
|
||||
sed -i -e '/GENERATE_HTMLHELP/d' Doxyfile.doc
|
||||
echo "GENERATE_HTMLHELP = YES" >> Doxyfile.doc
|
||||
fi
|
||||
|
||||
cp ../INSTALL ../COPYING ./
|
||||
|
||||
doxygen Doxyfile.doc > /dev/null
|
||||
if [ $? -ne 0 ]
|
||||
then
|
||||
exit $?
|
||||
fi
|
||||
|
||||
if [ $GENERATE_QCH -ne 0 ]
|
||||
then
|
||||
doxygen2qthelp --namespace=net.sourceforge.qwt-$VERSION --folder=qwt-$VERSION html/index.hhp qwt-$VERSION.qch
|
||||
rm html/index.hh*
|
||||
fi
|
||||
|
||||
rm Doxyfile.doc Doxygen.log INSTALL COPYING
|
||||
rm -r images
|
||||
|
||||
if [ $GENERATE_PDF -ne 0 ]
|
||||
then
|
||||
cd latex
|
||||
make > /dev/null 2>&1
|
||||
if [ $? -ne 0 ]
|
||||
then
|
||||
exit $?
|
||||
fi
|
||||
|
||||
cd ..
|
||||
mkdir pdf
|
||||
mv latex/refman.pdf pdf/qwtdoc.pdf
|
||||
|
||||
rm -r latex
|
||||
fi
|
||||
|
||||
cd $ODIR
|
||||
}
|
||||
|
||||
##########################
|
||||
# posix2dos filename
|
||||
##########################
|
||||
|
||||
function posix2dos {
|
||||
# At least one unix2dos writes to stdout instead of overwriting the input.
|
||||
# The -q option is always enabled in stdin->stdout mode.
|
||||
unix2dos <$1 >$1.dos
|
||||
mv $1.dos $1
|
||||
}
|
||||
|
||||
##########################
|
||||
# prepare4Win dirname
|
||||
##########################
|
||||
|
||||
function prepare4Win {
|
||||
|
||||
cd $1
|
||||
if [ $? -ne 0 ]
|
||||
then
|
||||
exit $?
|
||||
fi
|
||||
|
||||
rm -r doc/man
|
||||
|
||||
# win files, but not uptodate
|
||||
|
||||
BATCHES=`find . -type f -name '*.bat' -print`
|
||||
HEADERS=`find . -type f -name '*.h' -print`
|
||||
SOURCES=`find . -type f -name '*.cpp' -print`
|
||||
PROFILES=`find . -type f -name '*.pro' -print`
|
||||
PRIFILES=`find . -type f -name '*.pri' -print`
|
||||
|
||||
for FILE in $BATCHES $HEADERS $SOURCES $PROFILES $PRIFILES
|
||||
do
|
||||
posix2dos $FILE
|
||||
done
|
||||
|
||||
cd - > /dev/null
|
||||
}
|
||||
|
||||
##########################
|
||||
# prepare4Unix dirname
|
||||
##########################
|
||||
|
||||
function prepare4Unix {
|
||||
|
||||
cd $1
|
||||
if [ $? -ne 0 ]
|
||||
then
|
||||
exit $?
|
||||
fi
|
||||
|
||||
rm -rf admin
|
||||
|
||||
cd - > /dev/null
|
||||
}
|
||||
|
||||
##########################
|
||||
# main
|
||||
##########################
|
||||
|
||||
QWTDIR=
|
||||
SVNDIR=trunk
|
||||
BRANCH=qwt
|
||||
VERSION=
|
||||
GENERATE_PDF=0
|
||||
GENERATE_QCH=0
|
||||
GENERATE_MAN=1
|
||||
|
||||
while [ $# -gt 0 ] ; do
|
||||
case "$1" in
|
||||
-h|--help)
|
||||
usage; exit 1 ;;
|
||||
-b|--branch)
|
||||
shift; SVNDIR=branches; BRANCH=$1; shift;;
|
||||
-pdf)
|
||||
GENERATE_PDF=1; shift;;
|
||||
-qch)
|
||||
GENERATE_QCH=1; shift;;
|
||||
*)
|
||||
QWTDIR=qwt-$1 ; VERSION=$1; shift;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ "$QWTDIR" == "" ]
|
||||
then
|
||||
usage
|
||||
exit 2
|
||||
fi
|
||||
|
||||
TMPDIR=/tmp/$QWTDIR-tmp
|
||||
|
||||
echo -n "checkout to $TMPDIR ... "
|
||||
checkoutQwt $SVNDIR $BRANCH $TMPDIR
|
||||
cleanQwt $TMPDIR
|
||||
echo done
|
||||
|
||||
echo -n "generate documentation ... "
|
||||
createDocs $TMPDIR/doc
|
||||
|
||||
if [ $GENERATE_PDF -ne 0 ]
|
||||
then
|
||||
mv $TMPDIR/doc/pdf/qwtdoc.pdf $QWTDIR.pdf
|
||||
rmdir $TMPDIR/doc/pdf
|
||||
fi
|
||||
|
||||
echo done
|
||||
|
||||
|
||||
DIR=`pwd`
|
||||
echo -n "create packages in $DIR ... "
|
||||
|
||||
cd /tmp
|
||||
|
||||
rm -rf $QWTDIR
|
||||
cp -a $TMPDIR $QWTDIR
|
||||
prepare4Unix $QWTDIR
|
||||
tar cfz $QWTDIR.tgz $QWTDIR
|
||||
tar cfj $QWTDIR.tar.bz2 $QWTDIR
|
||||
|
||||
rm -rf $QWTDIR
|
||||
cp -a $TMPDIR $QWTDIR
|
||||
prepare4Win $QWTDIR
|
||||
zip -r $QWTDIR.zip $QWTDIR > /dev/null
|
||||
|
||||
rm -rf $TMPDIR $QWTDIR
|
||||
|
||||
mv $QWTDIR.tgz $QWTDIR.tar.bz2 $QWTDIR.zip $DIR/
|
||||
echo done
|
||||
|
||||
exit 0
|
||||
4
qwt/designer/.gitignore
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
moc
|
||||
obj
|
||||
plugins
|
||||
resources
|
||||
135
qwt/designer/designer.pro
Normal file
@@ -0,0 +1,135 @@
|
||||
# -*- mode: sh -*- ###########################
|
||||
# Qwt Widget Library
|
||||
# Copyright (C) 1997 Josef Wilgen
|
||||
# Copyright (C) 2002 Uwe Rathmann
|
||||
#
|
||||
# This library is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the Qwt License, Version 1.0
|
||||
##############################################
|
||||
|
||||
QWT_ROOT = ..
|
||||
|
||||
include ( $${QWT_ROOT}/qwtconfig.pri )
|
||||
|
||||
contains(CONFIG, QwtDesigner) {
|
||||
|
||||
CONFIG += warn_on
|
||||
|
||||
SUFFIX_STR =
|
||||
|
||||
VVERSION = $$[QT_VERSION]
|
||||
isEmpty(VVERSION) {
|
||||
|
||||
# Qt 3
|
||||
debug {
|
||||
SUFFIX_STR = $${DEBUG_SUFFIX}
|
||||
}
|
||||
else {
|
||||
SUFFIX_STR = $${RELEASE_SUFFIX}
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
||||
CONFIG(debug, debug|release) {
|
||||
SUFFIX_STR = $${DEBUG_SUFFIX}
|
||||
}
|
||||
else {
|
||||
SUFFIX_STR = $${RELEASE_SUFFIX}
|
||||
}
|
||||
}
|
||||
|
||||
TEMPLATE = lib
|
||||
MOC_DIR = moc
|
||||
OBJECTS_DIR = obj$${SUFFIX_STR}
|
||||
DESTDIR = plugins/designer
|
||||
INCLUDEPATH += $${QWT_ROOT}/src
|
||||
DEPENDPATH += $${QWT_ROOT}/src
|
||||
|
||||
LIBNAME = qwt$${SUFFIX_STR}
|
||||
contains(CONFIG, QwtDll) {
|
||||
win32 {
|
||||
DEFINES += QT_DLL QWT_DLL
|
||||
LIBNAME = $${LIBNAME}$${VER_MAJ}
|
||||
}
|
||||
}
|
||||
|
||||
!contains(CONFIG, QwtPlot) {
|
||||
DEFINES += NO_QWT_PLOT
|
||||
}
|
||||
|
||||
!contains(CONFIG, QwtWidgets) {
|
||||
DEFINES += NO_QWT_WIDGETS
|
||||
}
|
||||
|
||||
unix:LIBS += -L$${QWT_ROOT}/lib -l$${LIBNAME}
|
||||
win32-msvc:LIBS += $${QWT_ROOT}/lib/$${LIBNAME}.lib
|
||||
win32-msvc.net:LIBS += $${QWT_ROOT}/lib/$${LIBNAME}.lib
|
||||
win32-msvc2002:LIBS += $${QWT_ROOT}/lib/$${LIBNAME}.lib
|
||||
win32-msvc2003:LIBS += $${QWT_ROOT}/lib/$${LIBNAME}.lib
|
||||
win32-msvc2005:LIBS += $${QWT_ROOT}/lib/$${LIBNAME}.lib
|
||||
win32-msvc2008:LIBS += $${QWT_ROOT}/lib/$${LIBNAME}.lib
|
||||
win32-g++:LIBS += -L$${QWT_ROOT}/lib -l$${LIBNAME}
|
||||
|
||||
# isEmpty(QT_VERSION) does not work with Qt-4.1.0/MinGW
|
||||
|
||||
VVERSION = $$[QT_VERSION]
|
||||
isEmpty(VVERSION) {
|
||||
# Qt 3
|
||||
TARGET = qwtplugin$${SUFFIX_STR}
|
||||
CONFIG += qt plugin
|
||||
|
||||
UI_DIR = ui
|
||||
|
||||
HEADERS += qwtplugin.h
|
||||
SOURCES += qwtplugin.cpp
|
||||
|
||||
target.path = $(QTDIR)/plugins/designer
|
||||
INSTALLS += target
|
||||
|
||||
IMAGES += \
|
||||
pixmaps/qwtplot.png \
|
||||
pixmaps/qwtanalogclock.png \
|
||||
pixmaps/qwtcounter.png \
|
||||
pixmaps/qwtcompass.png \
|
||||
pixmaps/qwtdial.png \
|
||||
pixmaps/qwtknob.png \
|
||||
pixmaps/qwtscale.png \
|
||||
pixmaps/qwtslider.png \
|
||||
pixmaps/qwtthermo.png \
|
||||
pixmaps/qwtwheel.png \
|
||||
pixmaps/qwtwidget.png
|
||||
|
||||
} else {
|
||||
|
||||
# Qt 4
|
||||
|
||||
TARGET = qwt_designer_plugin$${SUFFIX_STR}
|
||||
CONFIG += qt designer plugin
|
||||
|
||||
RCC_DIR = resources
|
||||
|
||||
HEADERS += \
|
||||
qwt_designer_plugin.h
|
||||
|
||||
SOURCES += \
|
||||
qwt_designer_plugin.cpp
|
||||
|
||||
contains(CONFIG, QwtPlot) {
|
||||
|
||||
HEADERS += \
|
||||
qwt_designer_plotdialog.h
|
||||
|
||||
SOURCES += \
|
||||
qwt_designer_plotdialog.cpp
|
||||
}
|
||||
|
||||
RESOURCES += \
|
||||
qwt_designer_plugin.qrc
|
||||
|
||||
target.path = $$[QT_INSTALL_PLUGINS]/designer
|
||||
INSTALLS += target
|
||||
}
|
||||
}
|
||||
else {
|
||||
TEMPLATE = subdirs # do nothing
|
||||
}
|
||||
BIN
qwt/designer/pixmaps/qwtanalogclock.png
Normal file
|
After Width: | Height: | Size: 422 B |
BIN
qwt/designer/pixmaps/qwtcompass.png
Normal file
|
After Width: | Height: | Size: 992 B |
BIN
qwt/designer/pixmaps/qwtcounter.png
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
BIN
qwt/designer/pixmaps/qwtdial.png
Normal file
|
After Width: | Height: | Size: 433 B |
BIN
qwt/designer/pixmaps/qwtknob.png
Normal file
|
After Width: | Height: | Size: 807 B |
BIN
qwt/designer/pixmaps/qwtplot.png
Normal file
|
After Width: | Height: | Size: 543 B |
BIN
qwt/designer/pixmaps/qwtscale.png
Normal file
|
After Width: | Height: | Size: 373 B |
BIN
qwt/designer/pixmaps/qwtslider.png
Normal file
|
After Width: | Height: | Size: 452 B |
BIN
qwt/designer/pixmaps/qwtthermo.png
Normal file
|
After Width: | Height: | Size: 580 B |
BIN
qwt/designer/pixmaps/qwtwheel.png
Normal file
|
After Width: | Height: | Size: 298 B |
BIN
qwt/designer/pixmaps/qwtwidget.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
42
qwt/designer/qwt_designer_plotdialog.cpp
Normal file
@@ -0,0 +1,42 @@
|
||||
/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
|
||||
* Qwt Widget Library
|
||||
* Copyright (C) 1997 Josef Wilgen
|
||||
* Copyright (C) 2002 Uwe Rathmann
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the Qwt License, Version 1.0
|
||||
*****************************************************************************/
|
||||
|
||||
#include <QLineEdit>
|
||||
#include <QTabWidget>
|
||||
#include <QHBoxLayout>
|
||||
#include <QPushButton>
|
||||
#include "qwt_designer_plotdialog.h"
|
||||
|
||||
using namespace QwtDesignerPlugin;
|
||||
|
||||
PlotDialog::PlotDialog(const QString &properties, QWidget *parent):
|
||||
QDialog(parent)
|
||||
{
|
||||
setWindowTitle("Plot Properties");
|
||||
|
||||
QLineEdit *lineEdit = new QLineEdit(properties);
|
||||
connect(lineEdit, SIGNAL(textChanged(const QString &)),
|
||||
SIGNAL(edited(const QString &)));
|
||||
|
||||
QTabWidget *tabWidget = new QTabWidget(this);
|
||||
tabWidget->addTab(lineEdit, "General");
|
||||
|
||||
QPushButton *closeButton = new QPushButton("Close");
|
||||
connect(closeButton, SIGNAL(clicked()), this, SLOT(accept()));
|
||||
|
||||
QHBoxLayout *buttonLayout = new QHBoxLayout;
|
||||
buttonLayout->addStretch(1);
|
||||
buttonLayout->addWidget(closeButton);
|
||||
|
||||
QVBoxLayout *mainLayout = new QVBoxLayout;
|
||||
mainLayout->addWidget(tabWidget);
|
||||
mainLayout->addLayout(buttonLayout);
|
||||
setLayout(mainLayout);
|
||||
}
|
||||
|
||||
39
qwt/designer/qwt_designer_plotdialog.h
Normal file
@@ -0,0 +1,39 @@
|
||||
/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
|
||||
* Qwt Widget Library
|
||||
* Copyright (C) 1997 Josef Wilgen
|
||||
* Copyright (C) 2002 Uwe Rathmann
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the Qwt License, Version 1.0
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef QWT_DESIGNER_PLOTDIALOG_H
|
||||
#define QWT_DESIGNER_PLOTDIALOG_H
|
||||
|
||||
#include <qglobal.h>
|
||||
|
||||
#if QT_VERSION < 0x040000
|
||||
#ifdef __GNUC__
|
||||
#error This code is Qt4 only
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <QDialog>
|
||||
|
||||
namespace QwtDesignerPlugin
|
||||
{
|
||||
|
||||
class PlotDialog: public QDialog
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
PlotDialog(const QString &properties, QWidget *parent = NULL);
|
||||
|
||||
signals:
|
||||
void edited(const QString&);
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
516
qwt/designer/qwt_designer_plugin.cpp
Normal file
@@ -0,0 +1,516 @@
|
||||
/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
|
||||
* Qwt Widget Library
|
||||
* Copyright (C) 1997 Josef Wilgen
|
||||
* Copyright (C) 2002 Uwe Rathmann
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the Qwt License, Version 1.0
|
||||
*****************************************************************************/
|
||||
|
||||
#if defined(_MSC_VER) /* MSVC Compiler */
|
||||
#pragma warning ( disable : 4786 )
|
||||
#endif
|
||||
|
||||
#include <qglobal.h>
|
||||
#include <qaction.h>
|
||||
#include <QtPlugin>
|
||||
#include <QDesignerFormEditorInterface>
|
||||
#include <QDesignerFormWindowInterface>
|
||||
#include <QDesignerFormWindowCursorInterface>
|
||||
#include <QExtensionManager>
|
||||
#include <QErrorMessage>
|
||||
|
||||
#include "qwt_designer_plugin.h"
|
||||
|
||||
#ifndef NO_QWT_PLOT
|
||||
#include "qwt_designer_plotdialog.h"
|
||||
#include "qwt_plot.h"
|
||||
#include "qwt_scale_widget.h"
|
||||
#endif
|
||||
|
||||
#ifndef NO_QWT_WIDGETS
|
||||
#include "qwt_counter.h"
|
||||
#include "qwt_wheel.h"
|
||||
#include "qwt_thermo.h"
|
||||
#include "qwt_knob.h"
|
||||
#include "qwt_slider.h"
|
||||
#include "qwt_analog_clock.h"
|
||||
#include "qwt_compass.h"
|
||||
#endif
|
||||
|
||||
#include "qwt_text_label.h"
|
||||
|
||||
using namespace QwtDesignerPlugin;
|
||||
|
||||
CustomWidgetInterface::CustomWidgetInterface(QObject *parent):
|
||||
QObject(parent),
|
||||
d_isInitialized(false)
|
||||
{
|
||||
}
|
||||
|
||||
bool CustomWidgetInterface::isContainer() const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool CustomWidgetInterface::isInitialized() const
|
||||
{
|
||||
return d_isInitialized;
|
||||
}
|
||||
|
||||
QIcon CustomWidgetInterface::icon() const
|
||||
{
|
||||
return d_icon;
|
||||
}
|
||||
|
||||
QString CustomWidgetInterface::codeTemplate() const
|
||||
{
|
||||
return d_codeTemplate;
|
||||
}
|
||||
|
||||
QString CustomWidgetInterface::domXml() const
|
||||
{
|
||||
return d_domXml;
|
||||
}
|
||||
|
||||
QString CustomWidgetInterface::group() const
|
||||
{
|
||||
return "Qwt Widgets";
|
||||
}
|
||||
|
||||
QString CustomWidgetInterface::includeFile() const
|
||||
{
|
||||
return d_include;
|
||||
}
|
||||
|
||||
QString CustomWidgetInterface::name() const
|
||||
{
|
||||
return d_name;
|
||||
}
|
||||
|
||||
QString CustomWidgetInterface::toolTip() const
|
||||
{
|
||||
return d_toolTip;
|
||||
}
|
||||
|
||||
QString CustomWidgetInterface::whatsThis() const
|
||||
{
|
||||
return d_whatsThis;
|
||||
}
|
||||
|
||||
void CustomWidgetInterface::initialize(
|
||||
QDesignerFormEditorInterface *formEditor)
|
||||
{
|
||||
if ( d_isInitialized )
|
||||
return;
|
||||
|
||||
QExtensionManager *manager = formEditor->extensionManager();
|
||||
if ( manager )
|
||||
{
|
||||
manager->registerExtensions(new TaskMenuFactory(manager),
|
||||
Q_TYPEID(QDesignerTaskMenuExtension));
|
||||
}
|
||||
|
||||
d_isInitialized = true;
|
||||
}
|
||||
|
||||
#ifndef NO_QWT_PLOT
|
||||
|
||||
PlotInterface::PlotInterface(QObject *parent):
|
||||
CustomWidgetInterface(parent)
|
||||
{
|
||||
d_name = "QwtPlot";
|
||||
d_include = "qwt_plot.h";
|
||||
d_icon = QPixmap(":/pixmaps/qwtplot.png");
|
||||
d_domXml =
|
||||
"<widget class=\"QwtPlot\" name=\"qwtPlot\">\n"
|
||||
" <property name=\"geometry\">\n"
|
||||
" <rect>\n"
|
||||
" <x>0</x>\n"
|
||||
" <y>0</y>\n"
|
||||
" <width>400</width>\n"
|
||||
" <height>200</height>\n"
|
||||
" </rect>\n"
|
||||
" </property>\n"
|
||||
"</widget>\n";
|
||||
}
|
||||
|
||||
QWidget *PlotInterface::createWidget(QWidget *parent)
|
||||
{
|
||||
return new QwtPlot(parent);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef NO_QWT_WIDGETS
|
||||
|
||||
AnalogClockInterface::AnalogClockInterface(QObject *parent):
|
||||
CustomWidgetInterface(parent)
|
||||
{
|
||||
d_name = "QwtAnalogClock";
|
||||
d_include = "qwt_analog_clock.h";
|
||||
d_icon = QPixmap(":/pixmaps/qwtanalogclock.png");
|
||||
d_domXml =
|
||||
"<widget class=\"QwtAnalogClock\" name=\"AnalogClock\">\n"
|
||||
" <property name=\"geometry\">\n"
|
||||
" <rect>\n"
|
||||
" <x>0</x>\n"
|
||||
" <y>0</y>\n"
|
||||
" <width>200</width>\n"
|
||||
" <height>200</height>\n"
|
||||
" </rect>\n"
|
||||
" </property>\n"
|
||||
" <property name=\"lineWidth\">\n"
|
||||
" <number>4</number>\n"
|
||||
" </property>\n"
|
||||
"</widget>\n";
|
||||
}
|
||||
|
||||
QWidget *AnalogClockInterface::createWidget(QWidget *parent)
|
||||
{
|
||||
return new QwtAnalogClock(parent);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef NO_QWT_WIDGETS
|
||||
|
||||
CompassInterface::CompassInterface(QObject *parent):
|
||||
CustomWidgetInterface(parent)
|
||||
{
|
||||
d_name = "QwtCompass";
|
||||
d_include = "qwt_compass.h";
|
||||
d_icon = QPixmap(":/pixmaps/qwtcompass.png");
|
||||
d_domXml =
|
||||
"<widget class=\"QwtCompass\" name=\"Compass\">\n"
|
||||
" <property name=\"geometry\">\n"
|
||||
" <rect>\n"
|
||||
" <x>0</x>\n"
|
||||
" <y>0</y>\n"
|
||||
" <width>200</width>\n"
|
||||
" <height>200</height>\n"
|
||||
" </rect>\n"
|
||||
" </property>\n"
|
||||
" <property name=\"lineWidth\">\n"
|
||||
" <number>4</number>\n"
|
||||
" </property>\n"
|
||||
"</widget>\n";
|
||||
}
|
||||
|
||||
QWidget *CompassInterface::createWidget(QWidget *parent)
|
||||
{
|
||||
return new QwtCompass(parent);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef NO_QWT_WIDGETS
|
||||
|
||||
CounterInterface::CounterInterface(QObject *parent):
|
||||
CustomWidgetInterface(parent)
|
||||
{
|
||||
d_name = "QwtCounter";
|
||||
d_include = "qwt_counter.h";
|
||||
d_icon = QPixmap(":/pixmaps/qwtcounter.png");
|
||||
d_domXml =
|
||||
"<widget class=\"QwtCounter\" name=\"Counter\">\n"
|
||||
"</widget>\n";
|
||||
}
|
||||
|
||||
QWidget *CounterInterface::createWidget(QWidget *parent)
|
||||
{
|
||||
return new QwtCounter(parent);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef NO_QWT_WIDGETS
|
||||
|
||||
DialInterface::DialInterface(QObject *parent):
|
||||
CustomWidgetInterface(parent)
|
||||
{
|
||||
d_name = "QwtDial";
|
||||
d_include = "qwt_dial.h";
|
||||
d_icon = QPixmap(":/pixmaps/qwtdial.png");
|
||||
d_domXml =
|
||||
"<widget class=\"QwtDial\" name=\"Dial\">\n"
|
||||
" <property name=\"geometry\">\n"
|
||||
" <rect>\n"
|
||||
" <x>0</x>\n"
|
||||
" <y>0</y>\n"
|
||||
" <width>200</width>\n"
|
||||
" <height>200</height>\n"
|
||||
" </rect>\n"
|
||||
" </property>\n"
|
||||
" <property name=\"lineWidth\">\n"
|
||||
" <number>4</number>\n"
|
||||
" </property>\n"
|
||||
"</widget>\n";
|
||||
}
|
||||
|
||||
QWidget *DialInterface::createWidget(QWidget *parent)
|
||||
{
|
||||
return new QwtDial(parent);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef NO_QWT_WIDGETS
|
||||
|
||||
KnobInterface::KnobInterface(QObject *parent):
|
||||
CustomWidgetInterface(parent)
|
||||
{
|
||||
d_name = "QwtKnob";
|
||||
d_include = "qwt_knob.h";
|
||||
d_icon = QPixmap(":/pixmaps/qwtknob.png");
|
||||
d_domXml =
|
||||
"<widget class=\"QwtKnob\" name=\"Knob\">\n"
|
||||
" <property name=\"geometry\">\n"
|
||||
" <rect>\n"
|
||||
" <x>0</x>\n"
|
||||
" <y>0</y>\n"
|
||||
" <width>100</width>\n"
|
||||
" <height>100</height>\n"
|
||||
" </rect>\n"
|
||||
" </property>\n"
|
||||
"</widget>\n";
|
||||
}
|
||||
|
||||
QWidget *KnobInterface::createWidget(QWidget *parent)
|
||||
{
|
||||
return new QwtKnob(parent);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef NO_QWT_PLOT
|
||||
|
||||
ScaleWidgetInterface::ScaleWidgetInterface(QObject *parent):
|
||||
CustomWidgetInterface(parent)
|
||||
{
|
||||
d_name = "QwtScaleWidget";
|
||||
d_include = "qwt_scale_widget.h";
|
||||
d_icon = QPixmap(":/pixmaps/qwtscale.png");
|
||||
d_domXml =
|
||||
"<widget class=\"QwtScaleWidget\" name=\"ScaleWidget\">\n"
|
||||
"</widget>\n";
|
||||
}
|
||||
|
||||
QWidget *ScaleWidgetInterface::createWidget(QWidget *parent)
|
||||
{
|
||||
return new QwtScaleWidget(QwtScaleDraw::LeftScale, parent);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef NO_QWT_WIDGETS
|
||||
|
||||
SliderInterface::SliderInterface(QObject *parent):
|
||||
CustomWidgetInterface(parent)
|
||||
{
|
||||
d_name = "QwtSlider";
|
||||
d_include = "qwt_slider.h";
|
||||
d_icon = QPixmap(":/pixmaps/qwtslider.png");
|
||||
d_domXml =
|
||||
"<widget class=\"QwtSlider\" name=\"Slider\">\n"
|
||||
" <property name=\"geometry\">\n"
|
||||
" <rect>\n"
|
||||
" <x>0</x>\n"
|
||||
" <y>0</y>\n"
|
||||
" <width>200</width>\n"
|
||||
" <height>60</height>\n"
|
||||
" </rect>\n"
|
||||
" </property>\n"
|
||||
"</widget>\n";
|
||||
}
|
||||
|
||||
QWidget *SliderInterface::createWidget(QWidget *parent)
|
||||
{
|
||||
QwtSlider *slider = new QwtSlider(parent);
|
||||
#if 0
|
||||
slider->setScalePosition(QwtSlider::Bottom);
|
||||
slider->setRange(0.0, 10.0, 1.0, 0);
|
||||
slider->setValue(3.0);
|
||||
#endif
|
||||
return slider;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
TextLabelInterface::TextLabelInterface(QObject *parent):
|
||||
CustomWidgetInterface(parent)
|
||||
{
|
||||
d_name = "QwtTextLabel";
|
||||
d_include = "qwt_text_label.h";
|
||||
|
||||
#ifdef __GNUC__
|
||||
#warning QwtTextLabel icon is missing
|
||||
#endif
|
||||
|
||||
d_icon = QPixmap(":/pixmaps/qwtwidget.png");
|
||||
d_domXml =
|
||||
"<widget class=\"QwtTextLabel\" name=\"TextLabel\">\n"
|
||||
" <property name=\"geometry\">\n"
|
||||
" <rect>\n"
|
||||
" <x>0</x>\n"
|
||||
" <y>0</y>\n"
|
||||
" <width>100</width>\n"
|
||||
" <height>20</height>\n"
|
||||
" </rect>\n"
|
||||
" </property>\n"
|
||||
"</widget>\n";
|
||||
}
|
||||
|
||||
QWidget *TextLabelInterface::createWidget(QWidget *parent)
|
||||
{
|
||||
return new QwtTextLabel(parent);
|
||||
}
|
||||
|
||||
#ifndef NO_QWT_WIDGETS
|
||||
|
||||
ThermoInterface::ThermoInterface(QObject *parent):
|
||||
CustomWidgetInterface(parent)
|
||||
{
|
||||
d_name = "QwtThermo";
|
||||
d_include = "qwt_thermo.h";
|
||||
d_icon = QPixmap(":/pixmaps/qwtthermo.png");
|
||||
d_domXml =
|
||||
"<widget class=\"QwtThermo\" name=\"Thermo\">\n"
|
||||
"</widget>\n";
|
||||
}
|
||||
|
||||
QWidget *ThermoInterface::createWidget(QWidget *parent)
|
||||
{
|
||||
return new QwtThermo(parent);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef NO_QWT_WIDGETS
|
||||
|
||||
WheelInterface::WheelInterface(QObject *parent):
|
||||
CustomWidgetInterface(parent)
|
||||
{
|
||||
d_name = "QwtWheel";
|
||||
d_include = "qwt_wheel.h";
|
||||
d_icon = QPixmap(":/pixmaps/qwtwheel.png");
|
||||
d_domXml =
|
||||
"<widget class=\"QwtWheel\" name=\"Wheel\">\n"
|
||||
"</widget>\n";
|
||||
}
|
||||
|
||||
QWidget *WheelInterface::createWidget(QWidget *parent)
|
||||
{
|
||||
return new QwtWheel(parent);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
CustomWidgetCollectionInterface::CustomWidgetCollectionInterface(
|
||||
QObject *parent):
|
||||
QObject(parent)
|
||||
{
|
||||
#ifndef NO_QWT_PLOT
|
||||
d_plugins.append(new PlotInterface(this));
|
||||
d_plugins.append(new ScaleWidgetInterface(this));
|
||||
#endif
|
||||
|
||||
#ifndef NO_QWT_WIDGETS
|
||||
d_plugins.append(new AnalogClockInterface(this));
|
||||
d_plugins.append(new CompassInterface(this));
|
||||
d_plugins.append(new CounterInterface(this));
|
||||
d_plugins.append(new DialInterface(this));
|
||||
d_plugins.append(new KnobInterface(this));
|
||||
d_plugins.append(new SliderInterface(this));
|
||||
d_plugins.append(new ThermoInterface(this));
|
||||
d_plugins.append(new WheelInterface(this));
|
||||
#endif
|
||||
|
||||
d_plugins.append(new TextLabelInterface(this));
|
||||
}
|
||||
|
||||
QList<QDesignerCustomWidgetInterface*>
|
||||
CustomWidgetCollectionInterface::customWidgets(void) const
|
||||
{
|
||||
return d_plugins;
|
||||
}
|
||||
|
||||
TaskMenuFactory::TaskMenuFactory(QExtensionManager *parent):
|
||||
QExtensionFactory(parent)
|
||||
{
|
||||
}
|
||||
|
||||
QObject *TaskMenuFactory::createExtension(
|
||||
QObject *object, const QString &iid, QObject *parent) const
|
||||
{
|
||||
if (iid == Q_TYPEID(QDesignerTaskMenuExtension))
|
||||
{
|
||||
#ifndef NO_QWT_PLOT
|
||||
if (QwtPlot *plot = qobject_cast<QwtPlot*>(object))
|
||||
return new TaskMenuExtension(plot, parent);
|
||||
#endif
|
||||
#ifndef NO_QWT_WIDGETS
|
||||
if (QwtDial *dial = qobject_cast<QwtDial*>(object))
|
||||
return new TaskMenuExtension(dial, parent);
|
||||
#endif
|
||||
}
|
||||
|
||||
return QExtensionFactory::createExtension(object, iid, parent);
|
||||
}
|
||||
|
||||
|
||||
TaskMenuExtension::TaskMenuExtension(QWidget *widget, QObject *parent):
|
||||
QObject(parent),
|
||||
d_widget(widget)
|
||||
{
|
||||
d_editAction = new QAction(tr("Edit Qwt Attributes ..."), this);
|
||||
connect(d_editAction, SIGNAL(triggered()),
|
||||
this, SLOT(editProperties()));
|
||||
}
|
||||
|
||||
QList<QAction *> TaskMenuExtension::taskActions() const
|
||||
{
|
||||
QList<QAction *> list;
|
||||
list.append(d_editAction);
|
||||
return list;
|
||||
}
|
||||
|
||||
QAction *TaskMenuExtension::preferredEditAction() const
|
||||
{
|
||||
return d_editAction;
|
||||
}
|
||||
|
||||
void TaskMenuExtension::editProperties()
|
||||
{
|
||||
const QVariant v = d_widget->property("propertiesDocument");
|
||||
if ( v.type() != QVariant::String )
|
||||
return;
|
||||
|
||||
#ifndef NO_QWT_PLOT
|
||||
QString properties = v.toString();
|
||||
|
||||
if ( qobject_cast<QwtPlot*>(d_widget) )
|
||||
{
|
||||
PlotDialog dialog(properties);
|
||||
connect(&dialog, SIGNAL(edited(const QString&)),
|
||||
SLOT(applyProperties(const QString &)));
|
||||
(void)dialog.exec();
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
static QErrorMessage *errorMessage = NULL;
|
||||
if ( errorMessage == NULL )
|
||||
errorMessage = new QErrorMessage();
|
||||
errorMessage->showMessage("Not implemented yet.");
|
||||
}
|
||||
|
||||
void TaskMenuExtension::applyProperties(const QString &properties)
|
||||
{
|
||||
QDesignerFormWindowInterface *formWindow
|
||||
= QDesignerFormWindowInterface::findFormWindow(d_widget);
|
||||
if ( formWindow && formWindow->cursor() )
|
||||
formWindow->cursor()->setProperty("propertiesDocument", properties);
|
||||
}
|
||||
|
||||
Q_EXPORT_PLUGIN2(QwtDesignerPlugin, CustomWidgetCollectionInterface)
|
||||
244
qwt/designer/qwt_designer_plugin.h
Normal file
@@ -0,0 +1,244 @@
|
||||
/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
|
||||
* Qwt Widget Library
|
||||
* Copyright (C) 1997 Josef Wilgen
|
||||
* Copyright (C) 2002 Uwe Rathmann
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the Qwt License, Version 1.0
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef QWT_DESIGNER_PLUGIN_H
|
||||
#define QWT_DESIGNER_PLUGIN_H
|
||||
|
||||
#include <qglobal.h>
|
||||
|
||||
#if QT_VERSION < 0x040000
|
||||
|
||||
#ifdef __GNUC__
|
||||
#error This code is Qt4 only
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#include <QDesignerCustomWidgetInterface>
|
||||
#include <QDesignerTaskMenuExtension>
|
||||
#include <QExtensionFactory>
|
||||
|
||||
namespace QwtDesignerPlugin
|
||||
{
|
||||
|
||||
class CustomWidgetInterface: public QObject,
|
||||
public QDesignerCustomWidgetInterface
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_INTERFACES(QDesignerCustomWidgetInterface)
|
||||
|
||||
public:
|
||||
CustomWidgetInterface(QObject *parent);
|
||||
|
||||
virtual bool isContainer() const;
|
||||
virtual bool isInitialized() const;
|
||||
virtual QIcon icon() const;
|
||||
virtual QString codeTemplate() const;
|
||||
virtual QString domXml() const;
|
||||
virtual QString group() const;
|
||||
virtual QString includeFile() const;
|
||||
virtual QString name() const;
|
||||
virtual QString toolTip() const;
|
||||
virtual QString whatsThis() const;
|
||||
virtual void initialize(QDesignerFormEditorInterface *);
|
||||
|
||||
protected:
|
||||
QString d_name;
|
||||
QString d_include;
|
||||
QString d_toolTip;
|
||||
QString d_whatsThis;
|
||||
QString d_domXml;
|
||||
QString d_codeTemplate;
|
||||
QIcon d_icon;
|
||||
|
||||
private:
|
||||
bool d_isInitialized;
|
||||
};
|
||||
|
||||
class CustomWidgetCollectionInterface: public QObject,
|
||||
public QDesignerCustomWidgetCollectionInterface
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_INTERFACES(QDesignerCustomWidgetCollectionInterface)
|
||||
|
||||
public:
|
||||
CustomWidgetCollectionInterface(QObject *parent = NULL);
|
||||
|
||||
virtual QList<QDesignerCustomWidgetInterface*> customWidgets() const;
|
||||
|
||||
private:
|
||||
QList<QDesignerCustomWidgetInterface*> d_plugins;
|
||||
};
|
||||
|
||||
#ifndef NO_QWT_PLOT
|
||||
class PlotInterface: public CustomWidgetInterface
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_INTERFACES(QDesignerCustomWidgetInterface)
|
||||
|
||||
public:
|
||||
PlotInterface(QObject *parent);
|
||||
virtual QWidget *createWidget(QWidget *parent);
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifndef NO_QWT_WIDGETS
|
||||
class AnalogClockInterface: public CustomWidgetInterface
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_INTERFACES(QDesignerCustomWidgetInterface)
|
||||
|
||||
public:
|
||||
AnalogClockInterface(QObject *parent);
|
||||
virtual QWidget *createWidget(QWidget *parent);
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifndef NO_QWT_WIDGETS
|
||||
class CompassInterface: public CustomWidgetInterface
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_INTERFACES(QDesignerCustomWidgetInterface)
|
||||
|
||||
public:
|
||||
CompassInterface(QObject *parent);
|
||||
virtual QWidget *createWidget(QWidget *parent);
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifndef NO_QWT_WIDGETS
|
||||
class CounterInterface: public CustomWidgetInterface
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_INTERFACES(QDesignerCustomWidgetInterface)
|
||||
|
||||
public:
|
||||
CounterInterface(QObject *parent);
|
||||
virtual QWidget *createWidget(QWidget *parent);
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifndef NO_QWT_WIDGETS
|
||||
class DialInterface: public CustomWidgetInterface
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_INTERFACES(QDesignerCustomWidgetInterface)
|
||||
|
||||
public:
|
||||
DialInterface(QObject *parent);
|
||||
virtual QWidget *createWidget(QWidget *parent);
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifndef NO_QWT_WIDGETS
|
||||
class KnobInterface: public CustomWidgetInterface
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_INTERFACES(QDesignerCustomWidgetInterface)
|
||||
|
||||
public:
|
||||
KnobInterface(QObject *parent);
|
||||
virtual QWidget *createWidget(QWidget *parent);
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifndef NO_QWT_PLOT
|
||||
class ScaleWidgetInterface: public CustomWidgetInterface
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_INTERFACES(QDesignerCustomWidgetInterface)
|
||||
|
||||
public:
|
||||
ScaleWidgetInterface(QObject *parent);
|
||||
virtual QWidget *createWidget(QWidget *parent);
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifndef NO_QWT_WIDGETS
|
||||
class SliderInterface: public CustomWidgetInterface
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_INTERFACES(QDesignerCustomWidgetInterface)
|
||||
|
||||
public:
|
||||
SliderInterface(QObject *parent);
|
||||
virtual QWidget *createWidget(QWidget *parent);
|
||||
};
|
||||
#endif
|
||||
|
||||
class TextLabelInterface: public CustomWidgetInterface
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_INTERFACES(QDesignerCustomWidgetInterface)
|
||||
|
||||
public:
|
||||
TextLabelInterface(QObject *parent);
|
||||
virtual QWidget *createWidget(QWidget *parent);
|
||||
};
|
||||
|
||||
#ifndef NO_QWT_WIDGETS
|
||||
class ThermoInterface: public CustomWidgetInterface
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_INTERFACES(QDesignerCustomWidgetInterface)
|
||||
|
||||
public:
|
||||
ThermoInterface(QObject *parent);
|
||||
virtual QWidget *createWidget(QWidget *parent);
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifndef NO_QWT_WIDGETS
|
||||
class WheelInterface: public CustomWidgetInterface
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_INTERFACES(QDesignerCustomWidgetInterface)
|
||||
|
||||
public:
|
||||
WheelInterface(QObject *parent);
|
||||
virtual QWidget *createWidget(QWidget *parent);
|
||||
};
|
||||
#endif
|
||||
|
||||
class TaskMenuFactory: public QExtensionFactory
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
TaskMenuFactory(QExtensionManager *parent = 0);
|
||||
|
||||
protected:
|
||||
QObject *createExtension(QObject *object,
|
||||
const QString &iid, QObject *parent) const;
|
||||
};
|
||||
|
||||
class TaskMenuExtension: public QObject,
|
||||
public QDesignerTaskMenuExtension
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_INTERFACES(QDesignerTaskMenuExtension)
|
||||
|
||||
public:
|
||||
TaskMenuExtension(QWidget *widget, QObject *parent);
|
||||
|
||||
QAction *preferredEditAction() const;
|
||||
QList<QAction *> taskActions() const;
|
||||
|
||||
private slots:
|
||||
void editProperties();
|
||||
void applyProperties(const QString &);
|
||||
|
||||
private:
|
||||
QAction *d_editAction;
|
||||
QWidget *d_widget;
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
15
qwt/designer/qwt_designer_plugin.qrc
Normal file
@@ -0,0 +1,15 @@
|
||||
<!DOCTYPE RCC><RCC version="1.0">
|
||||
<qresource>
|
||||
<file>pixmaps/qwtplot.png</file>
|
||||
<file>pixmaps/qwtanalogclock.png</file>
|
||||
<file>pixmaps/qwtcounter.png</file>
|
||||
<file>pixmaps/qwtcompass.png</file>
|
||||
<file>pixmaps/qwtdial.png</file>
|
||||
<file>pixmaps/qwtknob.png</file>
|
||||
<file>pixmaps/qwtscale.png</file>
|
||||
<file>pixmaps/qwtslider.png</file>
|
||||
<file>pixmaps/qwtthermo.png</file>
|
||||
<file>pixmaps/qwtwheel.png</file>
|
||||
<file>pixmaps/qwtwidget.png</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
202
qwt/designer/qwtplugin.cpp
Normal file
@@ -0,0 +1,202 @@
|
||||
/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
|
||||
* Qwt Widget Library
|
||||
* Copyright (C) 1997 Josef Wilgen
|
||||
* Copyright (C) 2002 Uwe Rathmann
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the Qwt License, Version 1.0
|
||||
*****************************************************************************/
|
||||
|
||||
#if defined(_MSC_VER) /* MSVC Compiler */
|
||||
#pragma warning ( disable : 4786 )
|
||||
#endif
|
||||
|
||||
#include <qglobal.h>
|
||||
#include <qvaluelist.h>
|
||||
#include <qmime.h>
|
||||
#include <qdragobject.h>
|
||||
|
||||
#include "qwtplugin.h"
|
||||
#include "qwt_text_label.h"
|
||||
|
||||
#ifndef NO_QWT_PLOT
|
||||
#include "qwt_plot.h"
|
||||
#include "qwt_scale_widget.h"
|
||||
#endif
|
||||
|
||||
#ifndef NO_QWT_WIDGETS
|
||||
#include "qwt_counter.h"
|
||||
#include "qwt_wheel.h"
|
||||
#include "qwt_thermo.h"
|
||||
#include "qwt_knob.h"
|
||||
#include "qwt_slider.h"
|
||||
#include "qwt_analog_clock.h"
|
||||
#include "qwt_compass.h"
|
||||
#endif
|
||||
|
||||
namespace
|
||||
{
|
||||
struct Entry
|
||||
{
|
||||
Entry() {}
|
||||
Entry( QString _classname, QString _header, QString _pixmap,
|
||||
QString _tooltip, QString _whatshis):
|
||||
classname(_classname),
|
||||
header(_header),
|
||||
pixmap(_pixmap),
|
||||
tooltip(_tooltip),
|
||||
whatshis(_whatshis)
|
||||
{}
|
||||
|
||||
QString classname;
|
||||
QString header;
|
||||
QString pixmap;
|
||||
QString tooltip;
|
||||
QString whatshis;
|
||||
};
|
||||
|
||||
QValueList<Entry> vec;
|
||||
|
||||
const Entry *entry(const QString& str)
|
||||
{
|
||||
for ( uint i = 0; i < vec.count(); i++ )
|
||||
{
|
||||
if (str == vec[i].classname)
|
||||
return &vec[i];
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
QwtPlugin::QwtPlugin()
|
||||
{
|
||||
#ifndef NO_QWT_PLOT
|
||||
vec.append(Entry("QwtPlot", "qwt_plot.h",
|
||||
"qwtplot.png", "QwtPlot", "whatsthis"));
|
||||
vec.append(Entry("QwtScaleWidget", "qwt_scale_widget.h",
|
||||
"qwtscale.png", "QwtScaleWidget", "whatsthis"));
|
||||
#endif
|
||||
|
||||
#ifndef NO_QWT_WIDGETS
|
||||
vec.append(Entry("QwtAnalogClock", "qwt_analog_clock.h",
|
||||
"qwtanalogclock.png", "QwtAnalogClock", "whatsthis"));
|
||||
vec.append(Entry("QwtCompass", "qwt_compass.h",
|
||||
"qwtcompass.png", "QwtCompass", "whatsthis"));
|
||||
vec.append(Entry("QwtCounter", "qwt_counter.h",
|
||||
"qwtcounter.png", "QwtCounter", "whatsthis"));
|
||||
vec.append(Entry("QwtDial", "qwt_dial.h",
|
||||
"qwtdial.png", "QwtDial", "whatsthis"));
|
||||
vec.append(Entry("QwtKnob", "qwt_knob.h",
|
||||
"qwtknob.png", "QwtKnob", "whatsthis"));
|
||||
vec.append(Entry("QwtSlider", "qwt_slider.h",
|
||||
"qwtslider.png", "QwtSlider", "whatsthis"));
|
||||
vec.append(Entry("QwtThermo", "qwt_thermo.h",
|
||||
"qwtthermo.png", "QwtThermo", "whatsthis"));
|
||||
vec.append(Entry("QwtWheel", "qwt_wheel.h",
|
||||
"qwtwheel.png", "QwtWheel", "whatsthis"));
|
||||
#endif
|
||||
|
||||
vec.append(Entry("QwtTextLabel", "qwt_text_label.h",
|
||||
"qwtwidget.png", "QwtTextLabel", "whatsthis"));
|
||||
|
||||
}
|
||||
|
||||
QWidget* QwtPlugin::create(const QString &key,
|
||||
QWidget* parent, const char* name)
|
||||
{
|
||||
QWidget *w = NULL;
|
||||
|
||||
#ifndef NO_QWT_PLOT
|
||||
if ( key == "QwtPlot" )
|
||||
w = new QwtPlot( parent );
|
||||
else if ( key == "QwtScaleWidget" )
|
||||
w = new QwtScaleWidget( QwtScaleDraw::LeftScale, parent);
|
||||
#endif
|
||||
|
||||
#ifndef NO_QWT_WIDGETS
|
||||
if ( key == "QwtAnalogClock" )
|
||||
w = new QwtAnalogClock( parent);
|
||||
else if ( key == "QwtCounter" )
|
||||
w = new QwtCounter( parent);
|
||||
else if ( key == "QwtCompass" )
|
||||
w = new QwtCompass( parent);
|
||||
else if ( key == "QwtDial" )
|
||||
w = new QwtDial( parent);
|
||||
else if ( key == "QwtWheel" )
|
||||
w = new QwtWheel( parent);
|
||||
else if ( key == "QwtThermo" )
|
||||
w = new QwtThermo( parent);
|
||||
else if ( key == "QwtKnob" )
|
||||
w = new QwtKnob( parent);
|
||||
else if ( key == "QwtSlider" )
|
||||
w = new QwtSlider( parent);
|
||||
#endif
|
||||
|
||||
if ( key == "QwtTextLabel" )
|
||||
w = new QwtTextLabel( parent);
|
||||
|
||||
if ( w )
|
||||
w->setName(name);
|
||||
|
||||
return w;
|
||||
}
|
||||
|
||||
QStringList QwtPlugin::keys() const
|
||||
{
|
||||
QStringList list;
|
||||
|
||||
for (unsigned i = 0; i < vec.count(); i++)
|
||||
list += vec[i].classname;
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
QString QwtPlugin::group( const QString& feature ) const
|
||||
{
|
||||
if (entry(feature) != NULL )
|
||||
return QString("Qwt");
|
||||
return QString::null;
|
||||
}
|
||||
|
||||
QIconSet QwtPlugin::iconSet( const QString& pmap) const
|
||||
{
|
||||
QString pixmapKey("qwtwidget.png");
|
||||
if (entry(pmap) != NULL )
|
||||
pixmapKey = entry(pmap)->pixmap;
|
||||
|
||||
const QMimeSource *ms =
|
||||
QMimeSourceFactory::defaultFactory()->data(pixmapKey);
|
||||
|
||||
QPixmap pixmap;
|
||||
QImageDrag::decode(ms, pixmap);
|
||||
|
||||
return QIconSet(pixmap);
|
||||
}
|
||||
|
||||
QString QwtPlugin::includeFile( const QString& feature ) const
|
||||
{
|
||||
if (entry(feature) != NULL)
|
||||
return entry(feature)->header;
|
||||
return QString::null;
|
||||
}
|
||||
|
||||
QString QwtPlugin::toolTip( const QString& feature ) const
|
||||
{
|
||||
if (entry(feature) != NULL )
|
||||
return entry(feature)->tooltip;
|
||||
return QString::null;
|
||||
}
|
||||
|
||||
QString QwtPlugin::whatsThis( const QString& feature ) const
|
||||
{
|
||||
if (entry(feature) != NULL)
|
||||
return entry(feature)->whatshis;
|
||||
return QString::null;
|
||||
}
|
||||
|
||||
bool QwtPlugin::isContainer( const QString& ) const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
Q_EXPORT_PLUGIN( QwtPlugin )
|
||||
42
qwt/designer/qwtplugin.h
Normal file
@@ -0,0 +1,42 @@
|
||||
/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
|
||||
* Qwt Widget Library
|
||||
* Copyright (C) 1997 Josef Wilgen
|
||||
* Copyright (C) 2002 Uwe Rathmann
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the Qwt License, Version 1.0
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef QWT_PLUGIN_H
|
||||
#define QWT_PLUGIN_H
|
||||
|
||||
#include <qglobal.h>
|
||||
|
||||
#if QT_VERSION >= 0x040000
|
||||
|
||||
#ifdef __GNUC__
|
||||
#error This code is Qt3 only
|
||||
#endif
|
||||
|
||||
This code is Qt3 only
|
||||
|
||||
#endif
|
||||
|
||||
#include <qwidgetplugin.h>
|
||||
|
||||
class QT_WIDGET_PLUGIN_EXPORT QwtPlugin: public QWidgetPlugin
|
||||
{
|
||||
public:
|
||||
QwtPlugin();
|
||||
|
||||
QStringList keys() const;
|
||||
QWidget* create( const QString &classname, QWidget* parent = 0, const char* name = 0 );
|
||||
QString group( const QString& ) const;
|
||||
QIconSet iconSet( const QString& ) const;
|
||||
QString includeFile( const QString& ) const;
|
||||
QString toolTip( const QString& ) const;
|
||||
QString whatsThis( const QString& ) const;
|
||||
bool isContainer( const QString& ) const;
|
||||
};
|
||||
|
||||
#endif
|
||||
1521
qwt/doc/Doxyfile
Normal file
BIN
qwt/doc/images/analogclock.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
qwt/doc/images/cpuplot.png
Normal file
|
After Width: | Height: | Size: 36 KiB |
BIN
qwt/doc/images/curves.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
qwt/doc/images/dials1.png
Normal file
|
After Width: | Height: | Size: 71 KiB |
BIN
qwt/doc/images/dials2.png
Normal file
|
After Width: | Height: | Size: 28 KiB |
BIN
qwt/doc/images/graph.png
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
qwt/doc/images/histogram.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
qwt/doc/images/knob.png
Normal file
|
After Width: | Height: | Size: 6.3 KiB |
BIN
qwt/doc/images/plot.png
Normal file
|
After Width: | Height: | Size: 30 KiB |
BIN
qwt/doc/images/radio.png
Normal file
|
After Width: | Height: | Size: 19 KiB |
BIN
qwt/doc/images/scatterplot.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
BIN
qwt/doc/images/sinus.png
Normal file
|
After Width: | Height: | Size: 29 KiB |
BIN
qwt/doc/images/sliders.png
Normal file
|
After Width: | Height: | Size: 9.1 KiB |
BIN
qwt/doc/images/spectrogram1.png
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
qwt/doc/images/spectrogram2.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
qwt/doc/images/spectrogram3.png
Normal file
|
After Width: | Height: | Size: 55 KiB |
BIN
qwt/doc/images/sysinfo.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
161
qwt/doc/qwt.dox
Normal file
@@ -0,0 +1,161 @@
|
||||
/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
|
||||
* Qwt Widget Library
|
||||
* Copyright (C) 1997 Josef Wilgen
|
||||
* Copyright (C) 2002 Uwe Rathmann
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the Qwt License, Version 1.0
|
||||
*****************************************************************************/
|
||||
|
||||
/*
|
||||
This file contains NO source code, just some documentation for doxygen to
|
||||
parse.
|
||||
*/
|
||||
|
||||
/*!
|
||||
\mainpage Qwt - Qt Widgets for Technical Applications
|
||||
|
||||
The Qwt library contains GUI Components and utility classes which are primarily
|
||||
useful for programs with a technical background. Beside a 2D plot widget
|
||||
it provides scales, sliders, dials, compasses, thermometers, wheels and knobs
|
||||
to control or display values, arrays, or ranges of type double.
|
||||
|
||||
\image html plot.png
|
||||
|
||||
\if homepage
|
||||
\section homepage Project page
|
||||
The official project page is hosted at
|
||||
<a href="http://qwt.sourceforge.net">sourceforge</a>
|
||||
\endif
|
||||
|
||||
\section license License
|
||||
|
||||
Qwt is distributed under the terms of the \ref qwtlicense.
|
||||
|
||||
\section platforms Platforms
|
||||
|
||||
Qwt 5.x might be usable in all environments where you find
|
||||
<a href="http://www.trolltech.com/products/qt">Qt</a>.
|
||||
It is compatible with Qt 3.3.x and Qt 4.x, but the documentation
|
||||
is generated for Qt 4.x.\n
|
||||
|
||||
\section screenshotsonmainpage Screenshots
|
||||
- \ref curvescreenshots\n
|
||||
- \ref scatterscreenshots\n
|
||||
- \ref spectrogramscreenshots\n
|
||||
- \ref histogramscreenshots\n
|
||||
- \ref controlscreenshots\n
|
||||
|
||||
\latexonly Screenshots are only available in the HTML docs.\endlatexonly
|
||||
|
||||
\section downloads Downloads
|
||||
Stable releases, prereleases and snapshots are available at the Qwt <a href="http://sourceforge.net/projects/qwt">project page</a>.
|
||||
|
||||
For getting a snapshot with all bugfixes for the latest 5.2 release:
|
||||
\code svn co https://qwt.svn.sourceforge.net/svnroot/qwt/branches/qwt-5.2 \endcode
|
||||
|
||||
For getting a development snapshot from the SVN repository:
|
||||
\code svn co https://qwt.svn.sourceforge.net/svnroot/qwt/trunk/qwt \endcode
|
||||
|
||||
Qwt doesn't distribute binary packages, but today all major Linux distributors
|
||||
offer one. Note, that these packages often don't include the examples.
|
||||
|
||||
\section installonmainpage Installation
|
||||
|
||||
Have a look at the qwt.pro project file. It is prepared for building
|
||||
dynamic libraries in Win32 and Unix/X11 environments.
|
||||
If you don't know what to do with it, read the file \ref qwtinstall and/or
|
||||
Trolltechs
|
||||
<a href="http://www.trolltech.com/developer/documentation/index.html">qmake</a> documentation. Once you have build the library you have to install
|
||||
all files from the lib, include and doc directories.
|
||||
|
||||
\section support Support
|
||||
- Mailing list\n
|
||||
For all kind of Qwt related questions use the Qwt <a href="http://sourceforge.net/mail/?group_id=13693">mailing list</a>.\n
|
||||
If you prefer newsgroups use the mail to news gateway of <a href="http://dir.gmane.org/gmane.comp.graphics.qwt.general">Gmane</a>.
|
||||
|
||||
- Forum\n
|
||||
<a href="http://www.qtcentre.org">Qt Centre</a> is a great resource for Qt
|
||||
related questions. It has a sub forum, that is dedicated to
|
||||
Qwt related questions.
|
||||
|
||||
- Individual support\n
|
||||
If you are looking for individual support, or need someone who implements
|
||||
your Qwt component/application contact qwt-support@tigertal.de.
|
||||
|
||||
\section relatedprojects Related Projects
|
||||
|
||||
<a href="http://qwtpolar.sourceforge.net">QwtPolar</a>, a polar plot widget.\n
|
||||
<a href="http://qwtplot3d.sourceforge.net">QwtPlot3D</a>, an OpenGL 3D plot widget.\n
|
||||
<a href="http://soft.proindependent.com/qtiplot.html">QtiPlot</a>,
|
||||
data analysis and scientific plotting tool, using QwtPlot.
|
||||
|
||||
\section languagebindings Language Bindings
|
||||
|
||||
<a href="http://pyqwt.sourceforge.net">PyQwt</a>, a set of Qwt Python bindings.\n
|
||||
<a href="http://rubyforge.org/projects/korundum/">Korundum/QtRuby</a>, including a set of Qwt Ruby bindings.\n
|
||||
|
||||
\section donations Donations
|
||||
|
||||
Sourceforge offers a <a href="http://sourceforge.net/docman/display_doc.php?docid=20244&group_id=1"> Donation System</a> via PayPal. You can use it, if you like to <a href="http://sourceforge.net/project/project_donations.php?group_id=13693">support</a> the development of Qwt.
|
||||
|
||||
\section credits Credits:
|
||||
\par Authors:
|
||||
Uwe Rathmann, Josef Wilgen ( <= Qwt 0.2 )
|
||||
\par Project admin:
|
||||
Uwe Rathmann \<rathmann@users.sourceforge.net\>
|
||||
*/
|
||||
|
||||
/*!
|
||||
\page qwtlicense Qwt License, Version 1.0
|
||||
\include "COPYING"
|
||||
*/
|
||||
|
||||
/*!
|
||||
\page qwtinstall INSTALL
|
||||
\include "INSTALL"
|
||||
*/
|
||||
|
||||
/*!
|
||||
\page curvescreenshots Curve Plots
|
||||
\image html plot.png
|
||||
|
||||
\image html sinus.png
|
||||
|
||||
\image html cpuplot.png
|
||||
|
||||
\image html graph.png
|
||||
|
||||
\image html curves.png
|
||||
*/
|
||||
|
||||
/*!
|
||||
\page scatterscreenshots Scatter Plot
|
||||
\image html scatterplot.png
|
||||
*/
|
||||
|
||||
/*!
|
||||
\page spectrogramscreenshots Spectrogram, Contour Plot
|
||||
\image html spectrogram1.png
|
||||
|
||||
\image html spectrogram2.png
|
||||
|
||||
\image html spectrogram3.png
|
||||
|
||||
/*!
|
||||
\page histogramscreenshots Histogram
|
||||
\image html histogram.png
|
||||
*/
|
||||
|
||||
/*!
|
||||
\page controlscreenshots Dials, Compasses, Knobs, Wheels, Sliders, Thermos
|
||||
\image html radio.png
|
||||
|
||||
\image html sliders.png
|
||||
|
||||
\image html dials1.png
|
||||
|
||||
\image html dials2.png
|
||||
|
||||
\image html sysinfo.png
|
||||
*/
|
||||
350
qwt/examples/bode/bode.cpp
Normal file
@@ -0,0 +1,350 @@
|
||||
#include <qregexp.h>
|
||||
#include <qapplication.h>
|
||||
#include <qtoolbar.h>
|
||||
#include <qtoolbutton.h>
|
||||
#include <qlabel.h>
|
||||
#include <qlayout.h>
|
||||
#include <qstatusbar.h>
|
||||
#include <qprinter.h>
|
||||
#include <qpicture.h>
|
||||
#include <qpainter.h>
|
||||
#include <qfiledialog.h>
|
||||
#if QT_VERSION >= 0x040300
|
||||
#ifdef QT_SVG_LIB
|
||||
#include <qsvggenerator.h>
|
||||
#endif
|
||||
#endif
|
||||
#if QT_VERSION >= 0x040000
|
||||
#include <qprintdialog.h>
|
||||
#include <qfileinfo.h>
|
||||
#else
|
||||
#include <qwt_painter.h>
|
||||
#endif
|
||||
#include <qwt_counter.h>
|
||||
#include <qwt_plot_zoomer.h>
|
||||
#include <qwt_plot_panner.h>
|
||||
#include <qwt_text.h>
|
||||
#include <qwt_math.h>
|
||||
#include "pixmaps.h"
|
||||
#include "bode_plot.h"
|
||||
#include "bode.h"
|
||||
|
||||
class Zoomer: public QwtPlotZoomer
|
||||
{
|
||||
public:
|
||||
Zoomer(int xAxis, int yAxis, QwtPlotCanvas *canvas):
|
||||
QwtPlotZoomer(xAxis, yAxis, canvas)
|
||||
{
|
||||
setSelectionFlags(QwtPicker::DragSelection | QwtPicker::CornerToCorner);
|
||||
setTrackerMode(QwtPicker::AlwaysOff);
|
||||
setRubberBand(QwtPicker::NoRubberBand);
|
||||
|
||||
// RightButton: zoom out by 1
|
||||
// Ctrl+RightButton: zoom out to full size
|
||||
|
||||
#if QT_VERSION < 0x040000
|
||||
setMousePattern(QwtEventPattern::MouseSelect2,
|
||||
Qt::RightButton, Qt::ControlButton);
|
||||
#else
|
||||
setMousePattern(QwtEventPattern::MouseSelect2,
|
||||
Qt::RightButton, Qt::ControlModifier);
|
||||
#endif
|
||||
setMousePattern(QwtEventPattern::MouseSelect3,
|
||||
Qt::RightButton);
|
||||
}
|
||||
};
|
||||
|
||||
//-----------------------------------------------------------------
|
||||
//
|
||||
// bode.cpp -- A demo program featuring QwtPlot and QwtCounter
|
||||
//
|
||||
// This example demonstrates the mapping of different curves
|
||||
// to different axes in a QwtPlot widget. It also shows how to
|
||||
// display the cursor position and how to implement zooming.
|
||||
//
|
||||
//-----------------------------------------------------------------
|
||||
|
||||
MainWin::MainWin(QWidget *parent):
|
||||
QMainWindow(parent)
|
||||
{
|
||||
d_plot = new BodePlot(this);
|
||||
d_plot->setMargin(5);
|
||||
|
||||
#if QT_VERSION >= 0x040000
|
||||
setContextMenuPolicy(Qt::NoContextMenu);
|
||||
#endif
|
||||
|
||||
d_zoomer[0] = new Zoomer( QwtPlot::xBottom, QwtPlot::yLeft,
|
||||
d_plot->canvas());
|
||||
d_zoomer[0]->setRubberBand(QwtPicker::RectRubberBand);
|
||||
d_zoomer[0]->setRubberBandPen(QColor(Qt::green));
|
||||
d_zoomer[0]->setTrackerMode(QwtPicker::ActiveOnly);
|
||||
d_zoomer[0]->setTrackerPen(QColor(Qt::white));
|
||||
|
||||
d_zoomer[1] = new Zoomer(QwtPlot::xTop, QwtPlot::yRight,
|
||||
d_plot->canvas());
|
||||
|
||||
d_panner = new QwtPlotPanner(d_plot->canvas());
|
||||
d_panner->setMouseButton(Qt::MidButton);
|
||||
|
||||
d_picker = new QwtPlotPicker(QwtPlot::xBottom, QwtPlot::yLeft,
|
||||
QwtPicker::PointSelection | QwtPicker::DragSelection,
|
||||
QwtPlotPicker::CrossRubberBand, QwtPicker::AlwaysOn,
|
||||
d_plot->canvas());
|
||||
d_picker->setRubberBandPen(QColor(Qt::green));
|
||||
d_picker->setRubberBand(QwtPicker::CrossRubberBand);
|
||||
d_picker->setTrackerPen(QColor(Qt::white));
|
||||
|
||||
setCentralWidget(d_plot);
|
||||
|
||||
QToolBar *toolBar = new QToolBar(this);
|
||||
|
||||
QToolButton *btnZoom = new QToolButton(toolBar);
|
||||
#if QT_VERSION >= 0x040000
|
||||
btnZoom->setText("Zoom");
|
||||
btnZoom->setIcon(QIcon(zoom_xpm));
|
||||
btnZoom->setCheckable(true);
|
||||
btnZoom->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
|
||||
#else
|
||||
btnZoom->setTextLabel("Zoom");
|
||||
btnZoom->setPixmap(zoom_xpm);
|
||||
btnZoom->setToggleButton(true);
|
||||
btnZoom->setUsesTextLabel(true);
|
||||
#endif
|
||||
|
||||
QToolButton *btnPrint = new QToolButton(toolBar);
|
||||
#if QT_VERSION >= 0x040000
|
||||
btnPrint->setText("Print");
|
||||
btnPrint->setIcon(QIcon(print_xpm));
|
||||
btnPrint->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
|
||||
#else
|
||||
btnPrint->setTextLabel("Print");
|
||||
btnPrint->setPixmap(print_xpm);
|
||||
btnPrint->setUsesTextLabel(true);
|
||||
#endif
|
||||
|
||||
#if QT_VERSION < 0x040000
|
||||
QToolButton *btnSVG = new QToolButton(toolBar);
|
||||
btnSVG->setTextLabel("SVG");
|
||||
btnSVG->setPixmap(print_xpm);
|
||||
btnSVG->setUsesTextLabel(true);
|
||||
#elif QT_VERSION >= 0x040300
|
||||
#ifdef QT_SVG_LIB
|
||||
QToolButton *btnSVG = new QToolButton(toolBar);
|
||||
btnSVG->setText("SVG");
|
||||
btnSVG->setIcon(QIcon(print_xpm));
|
||||
btnSVG->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if QT_VERSION >= 0x040000
|
||||
toolBar->addWidget(btnZoom);
|
||||
toolBar->addWidget(btnPrint);
|
||||
#if QT_VERSION >= 0x040300
|
||||
#ifdef QT_SVG_LIB
|
||||
toolBar->addWidget(btnSVG);
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
toolBar->addSeparator();
|
||||
|
||||
QWidget *hBox = new QWidget(toolBar);
|
||||
|
||||
QHBoxLayout *layout = new QHBoxLayout(hBox);
|
||||
layout->setSpacing(0);
|
||||
layout->addWidget(new QWidget(hBox), 10); // spacer
|
||||
layout->addWidget(new QLabel("Damping Factor", hBox), 0);
|
||||
layout->addSpacing(10);
|
||||
|
||||
QwtCounter *cntDamp = new QwtCounter(hBox);
|
||||
cntDamp->setRange(0.0, 5.0, 0.01);
|
||||
cntDamp->setValue(0.0);
|
||||
|
||||
layout->addWidget(cntDamp, 0);
|
||||
|
||||
#if QT_VERSION >= 0x040000
|
||||
(void)toolBar->addWidget(hBox);
|
||||
#else
|
||||
toolBar->setStretchableWidget(hBox);
|
||||
#endif
|
||||
|
||||
addToolBar(toolBar);
|
||||
#ifndef QT_NO_STATUSBAR
|
||||
(void)statusBar();
|
||||
#endif
|
||||
|
||||
enableZoomMode(false);
|
||||
showInfo();
|
||||
|
||||
connect(cntDamp, SIGNAL(valueChanged(double)),
|
||||
d_plot, SLOT(setDamp(double)));
|
||||
|
||||
connect(btnPrint, SIGNAL(clicked()), SLOT(print()));
|
||||
#if QT_VERSION < 0x040000
|
||||
connect(btnSVG, SIGNAL(clicked()), SLOT(exportSVG()));
|
||||
#elif QT_VERSION >= 0x040300
|
||||
#ifdef QT_SVG_LIB
|
||||
connect(btnSVG, SIGNAL(clicked()), SLOT(exportSVG()));
|
||||
#endif
|
||||
#endif
|
||||
connect(btnZoom, SIGNAL(toggled(bool)), SLOT(enableZoomMode(bool)));
|
||||
|
||||
connect(d_picker, SIGNAL(moved(const QPoint &)),
|
||||
SLOT(moved(const QPoint &)));
|
||||
connect(d_picker, SIGNAL(selected(const QwtPolygon &)),
|
||||
SLOT(selected(const QwtPolygon &)));
|
||||
}
|
||||
|
||||
void MainWin::print()
|
||||
{
|
||||
#if 1
|
||||
QPrinter printer;
|
||||
#else
|
||||
QPrinter printer(QPrinter::HighResolution);
|
||||
#if QT_VERSION < 0x040000
|
||||
printer.setOutputToFile(true);
|
||||
printer.setOutputFileName("/tmp/bode.ps");
|
||||
printer.setColorMode(QPrinter::Color);
|
||||
#else
|
||||
printer.setOutputFileName("/tmp/bode.pdf");
|
||||
#endif
|
||||
#endif
|
||||
|
||||
QString docName = d_plot->title().text();
|
||||
if ( !docName.isEmpty() )
|
||||
{
|
||||
docName.replace (QRegExp (QString::fromLatin1 ("\n")), tr (" -- "));
|
||||
printer.setDocName (docName);
|
||||
}
|
||||
|
||||
printer.setCreator("Bode example");
|
||||
printer.setOrientation(QPrinter::Landscape);
|
||||
|
||||
#if QT_VERSION >= 0x040000
|
||||
QPrintDialog dialog(&printer);
|
||||
if ( dialog.exec() )
|
||||
{
|
||||
#else
|
||||
if (printer.setup())
|
||||
{
|
||||
#endif
|
||||
QwtPlotPrintFilter filter;
|
||||
if ( printer.colorMode() == QPrinter::GrayScale )
|
||||
{
|
||||
int options = QwtPlotPrintFilter::PrintAll;
|
||||
options &= ~QwtPlotPrintFilter::PrintBackground;
|
||||
options |= QwtPlotPrintFilter::PrintFrameWithScales;
|
||||
filter.setOptions(options);
|
||||
}
|
||||
d_plot->print(printer, filter);
|
||||
}
|
||||
}
|
||||
|
||||
void MainWin::exportSVG()
|
||||
{
|
||||
QString fileName = "bode.svg";
|
||||
|
||||
#if QT_VERSION < 0x040000
|
||||
|
||||
#ifndef QT_NO_FILEDIALOG
|
||||
fileName = QFileDialog::getSaveFileName(
|
||||
"bode.svg", "SVG Documents (*.svg)", this);
|
||||
#endif
|
||||
if ( !fileName.isEmpty() )
|
||||
{
|
||||
// enable workaround for Qt3 misalignments
|
||||
QwtPainter::setSVGMode(true);
|
||||
|
||||
QPicture picture;
|
||||
|
||||
QPainter p(&picture);
|
||||
d_plot->print(&p, QRect(0, 0, 800, 600));
|
||||
p.end();
|
||||
|
||||
picture.save(fileName, "svg");
|
||||
}
|
||||
|
||||
#elif QT_VERSION >= 0x040300
|
||||
|
||||
#ifdef QT_SVG_LIB
|
||||
#ifndef QT_NO_FILEDIALOG
|
||||
fileName = QFileDialog::getSaveFileName(
|
||||
this, "Export File Name", QString(),
|
||||
"SVG Documents (*.svg)");
|
||||
#endif
|
||||
if ( !fileName.isEmpty() )
|
||||
{
|
||||
QSvgGenerator generator;
|
||||
generator.setFileName(fileName);
|
||||
generator.setSize(QSize(800, 600));
|
||||
|
||||
d_plot->print(generator);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
void MainWin::enableZoomMode(bool on)
|
||||
{
|
||||
d_panner->setEnabled(on);
|
||||
|
||||
d_zoomer[0]->setEnabled(on);
|
||||
d_zoomer[0]->zoom(0);
|
||||
|
||||
d_zoomer[1]->setEnabled(on);
|
||||
d_zoomer[1]->zoom(0);
|
||||
|
||||
d_picker->setEnabled(!on);
|
||||
|
||||
showInfo();
|
||||
}
|
||||
|
||||
void MainWin::showInfo(QString text)
|
||||
{
|
||||
if ( text == QString::null )
|
||||
{
|
||||
if ( d_picker->rubberBand() )
|
||||
text = "Cursor Pos: Press left mouse button in plot region";
|
||||
else
|
||||
text = "Zoom: Press mouse button and drag";
|
||||
}
|
||||
|
||||
#ifndef QT_NO_STATUSBAR
|
||||
#if QT_VERSION >= 0x040000
|
||||
statusBar()->showMessage(text);
|
||||
#else
|
||||
statusBar()->message(text);
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
void MainWin::moved(const QPoint &pos)
|
||||
{
|
||||
QString info;
|
||||
info.sprintf("Freq=%g, Ampl=%g, Phase=%g",
|
||||
d_plot->invTransform(QwtPlot::xBottom, pos.x()),
|
||||
d_plot->invTransform(QwtPlot::yLeft, pos.y()),
|
||||
d_plot->invTransform(QwtPlot::yRight, pos.y())
|
||||
);
|
||||
showInfo(info);
|
||||
}
|
||||
|
||||
void MainWin::selected(const QwtPolygon &)
|
||||
{
|
||||
showInfo();
|
||||
}
|
||||
|
||||
int main (int argc, char **argv)
|
||||
{
|
||||
QApplication a(argc, argv);
|
||||
|
||||
MainWin w;
|
||||
#if QT_VERSION < 0x040000
|
||||
a.setMainWidget(&w);
|
||||
#endif
|
||||
w.resize(540,400);
|
||||
w.show();
|
||||
|
||||
int rv = a.exec();
|
||||
return rv;
|
||||
}
|
||||
32
qwt/examples/bode/bode.h
Normal file
@@ -0,0 +1,32 @@
|
||||
#include <qmainwindow.h>
|
||||
#include <qwt_polygon.h>
|
||||
|
||||
class QwtPlotZoomer;
|
||||
class QwtPlotPicker;
|
||||
class QwtPlotPanner;
|
||||
class BodePlot;
|
||||
|
||||
class MainWin : public QMainWindow
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
MainWin(QWidget *parent = 0);
|
||||
|
||||
private slots:
|
||||
void moved(const QPoint &);
|
||||
void selected(const QwtPolygon &);
|
||||
|
||||
void print();
|
||||
void exportSVG();
|
||||
void enableZoomMode(bool);
|
||||
|
||||
private:
|
||||
void showInfo(QString text = QString::null);
|
||||
|
||||
BodePlot *d_plot;
|
||||
|
||||
QwtPlotZoomer *d_zoomer[2];
|
||||
QwtPlotPicker *d_picker;
|
||||
QwtPlotPanner *d_panner;
|
||||
};
|
||||
23
qwt/examples/bode/bode.pro
Normal file
@@ -0,0 +1,23 @@
|
||||
# -*- mode: sh -*- ################################################
|
||||
# Qwt Widget Library
|
||||
# Copyright (C) 1997 Josef Wilgen
|
||||
# Copyright (C) 2002 Uwe Rathmann
|
||||
#
|
||||
# This library is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the Qwt License, Version 1.0
|
||||
###################################################################
|
||||
|
||||
include( ../examples.pri )
|
||||
|
||||
TARGET = bode
|
||||
QT += svg
|
||||
|
||||
HEADERS = \
|
||||
bode.h \
|
||||
bode_plot.h \
|
||||
cplx.h \
|
||||
pixmaps.h
|
||||
|
||||
SOURCES = \
|
||||
bode.cpp \
|
||||
bode_plot.cpp
|
||||
181
qwt/examples/bode/bode_plot.cpp
Normal file
@@ -0,0 +1,181 @@
|
||||
#include <qwt_math.h>
|
||||
#include <qwt_scale_engine.h>
|
||||
#include <qwt_symbol.h>
|
||||
#include <qwt_plot_grid.h>
|
||||
#include <qwt_plot_marker.h>
|
||||
#include <qwt_plot_curve.h>
|
||||
#include <qwt_legend.h>
|
||||
#include <qwt_text.h>
|
||||
#include "cplx.h"
|
||||
#include "bode_plot.h"
|
||||
|
||||
static void logSpace(double *array, int size, double xmin, double xmax)
|
||||
{
|
||||
if ((xmin <= 0.0) || (xmax <= 0.0) || (size <= 0))
|
||||
return;
|
||||
|
||||
const int imax = size -1;
|
||||
|
||||
array[0] = xmin;
|
||||
array[imax] = xmax;
|
||||
|
||||
const double lxmin = log(xmin);
|
||||
const double lxmax = log(xmax);
|
||||
const double lstep = (lxmax - lxmin) / double(imax);
|
||||
|
||||
for (int i = 1; i < imax; i++)
|
||||
array[i] = exp(lxmin + double(i) * lstep);
|
||||
}
|
||||
|
||||
BodePlot::BodePlot(QWidget *parent):
|
||||
QwtPlot(parent)
|
||||
{
|
||||
setAutoReplot(false);
|
||||
|
||||
setTitle("Frequency Response of a Second-Order System");
|
||||
|
||||
setCanvasBackground(QColor(Qt::darkBlue));
|
||||
|
||||
// legend
|
||||
QwtLegend *legend = new QwtLegend;
|
||||
legend->setFrameStyle(QFrame::Box|QFrame::Sunken);
|
||||
insertLegend(legend, QwtPlot::BottomLegend);
|
||||
|
||||
// grid
|
||||
QwtPlotGrid *grid = new QwtPlotGrid;
|
||||
grid->enableXMin(true);
|
||||
grid->setMajPen(QPen(Qt::white, 0, Qt::DotLine));
|
||||
grid->setMinPen(QPen(Qt::gray, 0 , Qt::DotLine));
|
||||
grid->attach(this);
|
||||
|
||||
// axes
|
||||
enableAxis(QwtPlot::yRight);
|
||||
setAxisTitle(QwtPlot::xBottom, "Normalized Frequency");
|
||||
setAxisTitle(QwtPlot::yLeft, "Amplitude [dB]");
|
||||
setAxisTitle(QwtPlot::yRight, "Phase [deg]");
|
||||
|
||||
setAxisMaxMajor(QwtPlot::xBottom, 6);
|
||||
setAxisMaxMinor(QwtPlot::xBottom, 10);
|
||||
setAxisScaleEngine(QwtPlot::xBottom, new QwtLog10ScaleEngine);
|
||||
|
||||
// curves
|
||||
d_crv1 = new QwtPlotCurve("Amplitude");
|
||||
#if QT_VERSION >= 0x040000
|
||||
d_crv1->setRenderHint(QwtPlotItem::RenderAntialiased);
|
||||
#endif
|
||||
d_crv1->setPen(QPen(Qt::yellow));
|
||||
d_crv1->setYAxis(QwtPlot::yLeft);
|
||||
d_crv1->attach(this);
|
||||
|
||||
d_crv2 = new QwtPlotCurve("Phase");
|
||||
#if QT_VERSION >= 0x040000
|
||||
d_crv2->setRenderHint(QwtPlotItem::RenderAntialiased);
|
||||
#endif
|
||||
d_crv2->setPen(QPen(Qt::cyan));
|
||||
d_crv2->setYAxis(QwtPlot::yRight);
|
||||
d_crv2->attach(this);
|
||||
|
||||
// marker
|
||||
d_mrk1 = new QwtPlotMarker();
|
||||
d_mrk1->setValue(0.0, 0.0);
|
||||
d_mrk1->setLineStyle(QwtPlotMarker::VLine);
|
||||
d_mrk1->setLabelAlignment(Qt::AlignRight | Qt::AlignBottom);
|
||||
d_mrk1->setLinePen(QPen(Qt::green, 0, Qt::DashDotLine));
|
||||
d_mrk1->attach(this);
|
||||
|
||||
d_mrk2 = new QwtPlotMarker();
|
||||
d_mrk2->setLineStyle(QwtPlotMarker::HLine);
|
||||
d_mrk2->setLabelAlignment(Qt::AlignRight | Qt::AlignBottom);
|
||||
d_mrk2->setLinePen(QPen(QColor(200,150,0), 0, Qt::DashDotLine));
|
||||
d_mrk2->setSymbol( QwtSymbol(QwtSymbol::Diamond,
|
||||
QColor(Qt::yellow), QColor(Qt::green), QSize(7,7)));
|
||||
d_mrk2->attach(this);
|
||||
|
||||
setDamp(0.0);
|
||||
|
||||
setAutoReplot(true);
|
||||
}
|
||||
|
||||
void BodePlot::showData(double *frequency, double *amplitude,
|
||||
double *phase, int count)
|
||||
{
|
||||
d_crv1->setData(frequency, amplitude, count);
|
||||
d_crv2->setData(frequency, phase, count);
|
||||
}
|
||||
|
||||
void BodePlot::showPeak(double freq, double amplitude)
|
||||
{
|
||||
QString label;
|
||||
label.sprintf("Peak: %.3g dB", amplitude);
|
||||
|
||||
QwtText text(label);
|
||||
text.setFont(QFont("Helvetica", 10, QFont::Bold));
|
||||
text.setColor(QColor(200,150,0));
|
||||
|
||||
d_mrk2->setValue(freq, amplitude);
|
||||
d_mrk2->setLabel(text);
|
||||
}
|
||||
|
||||
void BodePlot::show3dB(double freq)
|
||||
{
|
||||
QString label;
|
||||
label.sprintf("-3 dB at f = %.3g", freq);
|
||||
|
||||
QwtText text(label);
|
||||
text.setFont(QFont("Helvetica", 10, QFont::Bold));
|
||||
text.setColor(Qt::green);
|
||||
|
||||
d_mrk1->setValue(freq, 0.0);
|
||||
d_mrk1->setLabel(text);
|
||||
}
|
||||
|
||||
//
|
||||
// re-calculate frequency response
|
||||
//
|
||||
void BodePlot::setDamp(double damping)
|
||||
{
|
||||
const bool doReplot = autoReplot();
|
||||
setAutoReplot(false);
|
||||
|
||||
const int ArraySize = 200;
|
||||
|
||||
double frequency[ArraySize];
|
||||
double amplitude[ArraySize];
|
||||
double phase[ArraySize];
|
||||
|
||||
// build frequency vector with logarithmic division
|
||||
logSpace(frequency, ArraySize, 0.01, 100);
|
||||
|
||||
int i3 = 1;
|
||||
double fmax = 1;
|
||||
double amax = -1000.0;
|
||||
|
||||
for (int i = 0; i < ArraySize; i++)
|
||||
{
|
||||
double f = frequency[i];
|
||||
cplx g = cplx(1.0) / cplx(1.0 - f * f, 2.0 * damping * f);
|
||||
amplitude[i] = 20.0 * log10(sqrt( g.real()*g.real() + g.imag()*g.imag()));
|
||||
phase[i] = atan2(g.imag(), g.real()) * (180.0 / M_PI);
|
||||
|
||||
if ((i3 <= 1) && (amplitude[i] < -3.0))
|
||||
i3 = i;
|
||||
if (amplitude[i] > amax)
|
||||
{
|
||||
amax = amplitude[i];
|
||||
fmax = frequency[i];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
double f3 = frequency[i3] -
|
||||
(frequency[i3] - frequency[i3 - 1])
|
||||
/ (amplitude[i3] - amplitude[i3 -1]) * (amplitude[i3] + 3);
|
||||
|
||||
showPeak(fmax, amax);
|
||||
show3dB(f3);
|
||||
showData(frequency, amplitude, phase, ArraySize);
|
||||
|
||||
setAutoReplot(doReplot);
|
||||
|
||||
replot();
|
||||
}
|
||||
25
qwt/examples/bode/bode_plot.h
Normal file
@@ -0,0 +1,25 @@
|
||||
#include <qwt_plot.h>
|
||||
|
||||
class QwtPlotCurve;
|
||||
class QwtPlotMarker;
|
||||
|
||||
class BodePlot: public QwtPlot
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
BodePlot(QWidget *parent);
|
||||
|
||||
public slots:
|
||||
void setDamp(double damping);
|
||||
|
||||
private:
|
||||
void showData(double *frequency, double *amplitude,
|
||||
double *phase, int count);
|
||||
void showPeak(double freq, double amplitude);
|
||||
void show3dB(double freq);
|
||||
|
||||
QwtPlotCurve *d_crv1;
|
||||
QwtPlotCurve *d_crv2;
|
||||
QwtPlotMarker *d_mrk1;
|
||||
QwtPlotMarker *d_mrk2;
|
||||
};
|
||||
62
qwt/examples/bode/cplx.h
Normal file
@@ -0,0 +1,62 @@
|
||||
#ifndef BODE_CPLX_H
|
||||
#define BODE_CPLX_H
|
||||
|
||||
#include <math.h>
|
||||
|
||||
|
||||
class cplx {
|
||||
private:
|
||||
double re,im;
|
||||
|
||||
public:
|
||||
|
||||
double real() {return re;}
|
||||
double imag() {return im;}
|
||||
|
||||
cplx() {
|
||||
re = 0.0;
|
||||
im = -0.0;
|
||||
}
|
||||
|
||||
cplx& operator= (cplx a) {
|
||||
re = a.re;
|
||||
im = a.im;
|
||||
return *this;
|
||||
}
|
||||
|
||||
cplx(double r, double i = 0.0) {
|
||||
re = r;
|
||||
im = i;
|
||||
}
|
||||
|
||||
friend cplx operator * (cplx x1, cplx x2);
|
||||
friend cplx operator + (cplx x1, cplx x2);
|
||||
friend cplx operator - (cplx x1, cplx x2);
|
||||
friend cplx operator / (cplx x1, cplx x2);
|
||||
|
||||
};
|
||||
|
||||
inline cplx operator+(cplx x1, cplx x2)
|
||||
{
|
||||
return cplx(x1.re + x2.re, x1.im + x2.im);
|
||||
}
|
||||
|
||||
inline cplx operator-(cplx x1, cplx x2)
|
||||
{
|
||||
return cplx(x1.re - x2.re, x1.im - x2.im);
|
||||
}
|
||||
|
||||
inline cplx operator*(cplx x1, cplx x2)
|
||||
{
|
||||
return cplx(x1.re * x2.re - x1.im * x2.im,
|
||||
x1.re * x2.im + x2.re * x1.im);
|
||||
}
|
||||
|
||||
inline cplx operator/(cplx x1, cplx x2)
|
||||
{
|
||||
double denom = x2.re * x2.re + x2.im * x2.im;
|
||||
return cplx( (x1.re * x2.re + x1.im * x2.im) /denom,
|
||||
(x1.im * x2.re - x2.im * x1.re) / denom);
|
||||
}
|
||||
|
||||
#endif
|
||||
95
qwt/examples/bode/pixmaps.h
Normal file
@@ -0,0 +1,95 @@
|
||||
#ifndef PIXMAPS_H
|
||||
#define PIXMAPS_H
|
||||
|
||||
static const char *print_xpm[]={
|
||||
"32 32 12 1",
|
||||
"a c #ffffff",
|
||||
"h c #ffff00",
|
||||
"c c #ffffff",
|
||||
"f c #dcdcdc",
|
||||
"b c #c0c0c0",
|
||||
"j c #a0a0a4",
|
||||
"e c #808080",
|
||||
"g c #808000",
|
||||
"d c #585858",
|
||||
"i c #00ff00",
|
||||
"# c #000000",
|
||||
". c None",
|
||||
"................................",
|
||||
"................................",
|
||||
"...........###..................",
|
||||
"..........#abb###...............",
|
||||
".........#aabbbbb###............",
|
||||
".........#ddaaabbbbb###.........",
|
||||
"........#ddddddaaabbbbb###......",
|
||||
".......#deffddddddaaabbbbb###...",
|
||||
"......#deaaabbbddddddaaabbbbb###",
|
||||
".....#deaaaaaaabbbddddddaaabbbb#",
|
||||
"....#deaaabbbaaaa#ddedddfggaaad#",
|
||||
"...#deaaaaaaaaaa#ddeeeeafgggfdd#",
|
||||
"..#deaaabbbaaaa#ddeeeeabbbbgfdd#",
|
||||
".#deeefaaaaaaa#ddeeeeabbhhbbadd#",
|
||||
"#aabbbeeefaaa#ddeeeeabbbbbbaddd#",
|
||||
"#bbaaabbbeee#ddeeeeabbiibbadddd#",
|
||||
"#bbbbbaaabbbeeeeeeabbbbbbaddddd#",
|
||||
"#bjbbbbbbaaabbbbeabbbbbbadddddd#",
|
||||
"#bjjjjbbbbbbaaaeabbbbbbaddddddd#",
|
||||
"#bjaaajjjbbbbbbaaabbbbadddddddd#",
|
||||
"#bbbbbaaajjjbbbbbbaaaaddddddddd#",
|
||||
"#bjbbbbbbaaajjjbbbbbbddddddddd#.",
|
||||
"#bjjjjbbbbbbaaajjjbbbdddddddd#..",
|
||||
"#bjaaajjjbbbbbbjaajjbddddddd#...",
|
||||
"#bbbbbaaajjjbbbjbbaabdddddd#....",
|
||||
"###bbbbbbaaajjjjbbbbbddddd#.....",
|
||||
"...###bbbbbbaaajbbbbbdddd#......",
|
||||
"......###bbbbbbjbbbbbddd#.......",
|
||||
".........###bbbbbbbbbdd#........",
|
||||
"............###bbbbbbd#.........",
|
||||
"...............###bbb#..........",
|
||||
"..................###..........."};
|
||||
|
||||
|
||||
static const char *zoom_xpm[]={
|
||||
"32 32 8 1",
|
||||
"# c #000000",
|
||||
"b c #c0c0c0",
|
||||
"a c #ffffff",
|
||||
"e c #585858",
|
||||
"d c #a0a0a4",
|
||||
"c c #0000ff",
|
||||
"f c #00ffff",
|
||||
". c None",
|
||||
"..######################........",
|
||||
".#a#baaaaaaaaaaaaaaaaaa#........",
|
||||
"#aa#baaaaaaaaaaaaaccaca#........",
|
||||
"####baaaaaaaaaaaaaaaaca####.....",
|
||||
"#bbbbaaaaaaaaaaaacccaaa#da#.....",
|
||||
"#aaaaaaaaaaaaaaaacccaca#da#.....",
|
||||
"#aaaaaaaaaaaaaaaaaccaca#da#.....",
|
||||
"#aaaaaaaaaabe###ebaaaaa#da#.....",
|
||||
"#aaaaaaaaa#########aaaa#da#.....",
|
||||
"#aaaaaaaa###dbbbb###aaa#da#.....",
|
||||
"#aaaaaaa###aaaaffb###aa#da#.....",
|
||||
"#aaaaaab##aaccaaafb##ba#da#.....",
|
||||
"#aaaaaae#daaccaccaad#ea#da#.....",
|
||||
"#aaaaaa##aaaaaaccaab##a#da#.....",
|
||||
"#aaaaaa##aacccaaaaab##a#da#.....",
|
||||
"#aaaaaa##aaccccaccab##a#da#.....",
|
||||
"#aaaaaae#daccccaccad#ea#da#.....",
|
||||
"#aaaaaab##aacccaaaa##da#da#.....",
|
||||
"#aaccacd###aaaaaaa###da#da#.....",
|
||||
"#aaaaacad###daaad#####a#da#.....",
|
||||
"#acccaaaad##########da##da#.....",
|
||||
"#acccacaaadde###edd#eda#da#.....",
|
||||
"#aaccacaaaabdddddbdd#eda#a#.....",
|
||||
"#aaaaaaaaaaaaaaaaaadd#eda##.....",
|
||||
"#aaaaaaaaaaaaaaaaaaadd#eda#.....",
|
||||
"#aaaaaaaccacaaaaaaaaadd#eda#....",
|
||||
"#aaaaaaaaaacaaaaaaaaaad##eda#...",
|
||||
"#aaaaaacccaaaaaaaaaaaaa#d#eda#..",
|
||||
"########################dd#eda#.",
|
||||
"...#dddddddddddddddddddddd##eda#",
|
||||
"...#aaaaaaaaaaaaaaaaaaaaaa#.####",
|
||||
"...########################..##."};
|
||||
|
||||
#endif
|
||||
57
qwt/examples/cpuplot/cpupiemarker.cpp
Normal file
@@ -0,0 +1,57 @@
|
||||
#include <qpainter.h>
|
||||
#include <qwt_scale_map.h>
|
||||
#include <qwt_plot_curve.h>
|
||||
#include "cpuplot.h"
|
||||
#include "cpupiemarker.h"
|
||||
|
||||
CpuPieMarker::CpuPieMarker()
|
||||
{
|
||||
setZ(1000);
|
||||
#if QT_VERSION >= 0x040000
|
||||
setRenderHint(QwtPlotItem::RenderAntialiased, true);
|
||||
#endif
|
||||
}
|
||||
|
||||
int CpuPieMarker::rtti() const
|
||||
{
|
||||
return QwtPlotItem::Rtti_PlotUserItem;
|
||||
}
|
||||
|
||||
void CpuPieMarker::draw(QPainter *p,
|
||||
const QwtScaleMap &, const QwtScaleMap &,
|
||||
const QRect &rect) const
|
||||
{
|
||||
const CpuPlot *cpuPlot = (CpuPlot *)plot();
|
||||
|
||||
const QwtScaleMap yMap = cpuPlot->canvasMap(QwtPlot::yLeft);
|
||||
|
||||
const int margin = 5;
|
||||
|
||||
QRect pieRect;
|
||||
pieRect.setX(rect.x() + margin);
|
||||
pieRect.setY(rect.y() + margin);
|
||||
pieRect.setHeight(yMap.transform(80.0));
|
||||
pieRect.setWidth(pieRect.height());
|
||||
|
||||
const int dataType[] = { CpuPlot::User, CpuPlot::System, CpuPlot::Idle };
|
||||
|
||||
int angle = (int)(5760 * 0.75);
|
||||
for ( unsigned int i = 0;
|
||||
i < sizeof(dataType) / sizeof(dataType[0]); i++ )
|
||||
{
|
||||
const QwtPlotCurve *curve = cpuPlot->cpuCurve(dataType[i]);
|
||||
if ( curve->dataSize() > 0 )
|
||||
{
|
||||
const int value = (int)(5760 * curve->y(0) / 100.0);
|
||||
|
||||
p->save();
|
||||
p->setBrush(QBrush(curve->pen().color(), Qt::SolidPattern));
|
||||
if ( value != 0 )
|
||||
p->drawPie(pieRect, -angle, -value);
|
||||
p->restore();
|
||||
|
||||
angle += value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
18
qwt/examples/cpuplot/cpupiemarker.h
Normal file
@@ -0,0 +1,18 @@
|
||||
//-----------------------------------------------------------------
|
||||
// This class shows how to extend QwtPlotItems. It displays a
|
||||
// pie chart of user/total/idle cpu usage in percent.
|
||||
//-----------------------------------------------------------------
|
||||
|
||||
#include <qwt_plot_item.h>
|
||||
|
||||
class CpuPieMarker: public QwtPlotItem
|
||||
{
|
||||
public:
|
||||
CpuPieMarker();
|
||||
|
||||
virtual int rtti() const;
|
||||
|
||||
virtual void draw(QPainter *p,
|
||||
const QwtScaleMap &, const QwtScaleMap &,
|
||||
const QRect &rect) const;
|
||||
};
|
||||
244
qwt/examples/cpuplot/cpuplot.cpp
Normal file
@@ -0,0 +1,244 @@
|
||||
#include <qapplication.h>
|
||||
#include <qlayout.h>
|
||||
#include <qlabel.h>
|
||||
#include <qpainter.h>
|
||||
#include <qwt_plot_layout.h>
|
||||
#include <qwt_plot_curve.h>
|
||||
#include <qwt_scale_draw.h>
|
||||
#include <qwt_scale_widget.h>
|
||||
#include <qwt_legend.h>
|
||||
#include <qwt_legend_item.h>
|
||||
#include "cpupiemarker.h"
|
||||
#include "cpuplot.h"
|
||||
|
||||
class TimeScaleDraw: public QwtScaleDraw
|
||||
{
|
||||
public:
|
||||
TimeScaleDraw(const QTime &base):
|
||||
baseTime(base)
|
||||
{
|
||||
}
|
||||
virtual QwtText label(double v) const
|
||||
{
|
||||
QTime upTime = baseTime.addSecs((int)v);
|
||||
return upTime.toString();
|
||||
}
|
||||
private:
|
||||
QTime baseTime;
|
||||
};
|
||||
|
||||
class Background: public QwtPlotItem
|
||||
{
|
||||
public:
|
||||
Background()
|
||||
{
|
||||
setZ(0.0);
|
||||
}
|
||||
|
||||
virtual int rtti() const
|
||||
{
|
||||
return QwtPlotItem::Rtti_PlotUserItem;
|
||||
}
|
||||
|
||||
virtual void draw(QPainter *painter,
|
||||
const QwtScaleMap &, const QwtScaleMap &yMap,
|
||||
const QRect &rect) const
|
||||
{
|
||||
QColor c(Qt::white);
|
||||
QRect r = rect;
|
||||
|
||||
for ( int i = 100; i > 0; i -= 10 )
|
||||
{
|
||||
r.setBottom(yMap.transform(i - 10));
|
||||
r.setTop(yMap.transform(i));
|
||||
painter->fillRect(r, c);
|
||||
|
||||
c = c.dark(110);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
class CpuCurve: public QwtPlotCurve
|
||||
{
|
||||
public:
|
||||
CpuCurve(const QString &title):
|
||||
QwtPlotCurve(title)
|
||||
{
|
||||
#if QT_VERSION >= 0x040000
|
||||
setRenderHint(QwtPlotItem::RenderAntialiased);
|
||||
#endif
|
||||
}
|
||||
|
||||
void setColor(const QColor &color)
|
||||
{
|
||||
#if QT_VERSION >= 0x040000
|
||||
QColor c = color;
|
||||
c.setAlpha(150);
|
||||
|
||||
setPen(c);
|
||||
setBrush(c);
|
||||
#else
|
||||
setPen(color);
|
||||
setBrush(QBrush(color, Qt::Dense4Pattern));
|
||||
#endif
|
||||
}
|
||||
};
|
||||
|
||||
CpuPlot::CpuPlot(QWidget *parent):
|
||||
QwtPlot(parent),
|
||||
dataCount(0)
|
||||
{
|
||||
setAutoReplot(false);
|
||||
|
||||
plotLayout()->setAlignCanvasToScales(true);
|
||||
|
||||
QwtLegend *legend = new QwtLegend;
|
||||
legend->setItemMode(QwtLegend::CheckableItem);
|
||||
insertLegend(legend, QwtPlot::RightLegend);
|
||||
|
||||
setAxisTitle(QwtPlot::xBottom, " System Uptime [h:m:s]");
|
||||
setAxisScaleDraw(QwtPlot::xBottom,
|
||||
new TimeScaleDraw(cpuStat.upTime()));
|
||||
setAxisScale(QwtPlot::xBottom, 0, HISTORY);
|
||||
setAxisLabelRotation(QwtPlot::xBottom, -50.0);
|
||||
setAxisLabelAlignment(QwtPlot::xBottom, Qt::AlignLeft | Qt::AlignBottom);
|
||||
|
||||
/*
|
||||
In situations, when there is a label at the most right position of the
|
||||
scale, additional space is needed to display the overlapping part
|
||||
of the label would be taken by reducing the width of scale and canvas.
|
||||
To avoid this "jumping canvas" effect, we add a permanent margin.
|
||||
We don't need to do the same for the left border, because there
|
||||
is enough space for the overlapping label below the left scale.
|
||||
*/
|
||||
|
||||
QwtScaleWidget *scaleWidget = axisWidget(QwtPlot::xBottom);
|
||||
const int fmh = QFontMetrics(scaleWidget->font()).height();
|
||||
scaleWidget->setMinBorderDist(0, fmh / 2);
|
||||
|
||||
setAxisTitle(QwtPlot::yLeft, "Cpu Usage [%]");
|
||||
setAxisScale(QwtPlot::yLeft, 0, 100);
|
||||
|
||||
Background *bg = new Background();
|
||||
bg->attach(this);
|
||||
|
||||
CpuPieMarker *pie = new CpuPieMarker();
|
||||
pie->attach(this);
|
||||
|
||||
CpuCurve *curve;
|
||||
|
||||
curve = new CpuCurve("System");
|
||||
curve->setColor(Qt::red);
|
||||
curve->attach(this);
|
||||
data[System].curve = curve;
|
||||
|
||||
curve = new CpuCurve("User");
|
||||
curve->setColor(Qt::blue);
|
||||
curve->setZ(curve->z() - 1);
|
||||
curve->attach(this);
|
||||
data[User].curve = curve;
|
||||
|
||||
curve = new CpuCurve("Total");
|
||||
curve->setColor(Qt::black);
|
||||
curve->setZ(curve->z() - 2);
|
||||
curve->attach(this);
|
||||
data[Total].curve = curve;
|
||||
|
||||
curve = new CpuCurve("Idle");
|
||||
curve->setColor(Qt::darkCyan);
|
||||
curve->setZ(curve->z() - 3);
|
||||
curve->attach(this);
|
||||
data[Idle].curve = curve;
|
||||
|
||||
showCurve(data[System].curve, true);
|
||||
showCurve(data[User].curve, true);
|
||||
showCurve(data[Total].curve, false);
|
||||
showCurve(data[Idle].curve, false);
|
||||
|
||||
for ( int i = 0; i < HISTORY; i++ )
|
||||
timeData[HISTORY - 1 - i] = i;
|
||||
|
||||
(void)startTimer(1000); // 1 second
|
||||
|
||||
connect(this, SIGNAL(legendChecked(QwtPlotItem *, bool)),
|
||||
SLOT(showCurve(QwtPlotItem *, bool)));
|
||||
}
|
||||
|
||||
void CpuPlot::timerEvent(QTimerEvent *)
|
||||
{
|
||||
for ( int i = dataCount; i > 0; i-- )
|
||||
{
|
||||
for ( int c = 0; c < NCpuData; c++ )
|
||||
{
|
||||
if ( i < HISTORY )
|
||||
data[c].data[i] = data[c].data[i-1];
|
||||
}
|
||||
}
|
||||
|
||||
cpuStat.statistic(data[User].data[0], data[System].data[0]);
|
||||
|
||||
data[Total].data[0] = data[User].data[0] +
|
||||
data[System].data[0];
|
||||
data[Idle].data[0] = 100.0 - data[Total].data[0];
|
||||
|
||||
if ( dataCount < HISTORY )
|
||||
dataCount++;
|
||||
|
||||
for ( int j = 0; j < HISTORY; j++ )
|
||||
timeData[j]++;
|
||||
|
||||
setAxisScale(QwtPlot::xBottom,
|
||||
timeData[HISTORY - 1], timeData[0]);
|
||||
|
||||
for ( int c = 0; c < NCpuData; c++ )
|
||||
{
|
||||
data[c].curve->setRawData(
|
||||
timeData, data[c].data, dataCount);
|
||||
}
|
||||
|
||||
replot();
|
||||
}
|
||||
|
||||
void CpuPlot::showCurve(QwtPlotItem *item, bool on)
|
||||
{
|
||||
item->setVisible(on);
|
||||
QWidget *w = legend()->find(item);
|
||||
if ( w && w->inherits("QwtLegendItem") )
|
||||
((QwtLegendItem *)w)->setChecked(on);
|
||||
|
||||
replot();
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
QApplication a(argc, argv);
|
||||
|
||||
QWidget vBox;
|
||||
#if QT_VERSION >= 0x040000
|
||||
vBox.setWindowTitle("Cpu Plot");
|
||||
#else
|
||||
vBox.setCaption("Cpu Plot");
|
||||
#endif
|
||||
|
||||
CpuPlot *plot = new CpuPlot(&vBox);
|
||||
plot->setTitle("History");
|
||||
plot->setMargin(5);
|
||||
|
||||
QString info("Press the legend to en/disable a curve");
|
||||
|
||||
QLabel *label = new QLabel(info, &vBox);
|
||||
|
||||
QVBoxLayout *layout = new QVBoxLayout(&vBox);
|
||||
layout->addWidget(plot);
|
||||
layout->addWidget(label);
|
||||
|
||||
#if QT_VERSION < 0x040000
|
||||
a.setMainWidget(&vBox);
|
||||
#endif
|
||||
|
||||
vBox.resize(600,400);
|
||||
vBox.show();
|
||||
|
||||
return a.exec();
|
||||
}
|
||||
|
||||