Compare commits
2441 Commits
xrced-0_1_
...
Py-0-9-3
Author | SHA1 | Date | |
---|---|---|---|
|
ca7f8f3d51 | ||
|
db90456c7a | ||
|
8faa1f356d | ||
|
4f62b37a95 | ||
|
a8a844ded4 | ||
|
72f7f6a467 | ||
|
aaf015186e | ||
|
f0e615b6ab | ||
|
3adf0c5b2b | ||
|
06f8e28786 | ||
|
e4cfa0ee7f | ||
|
31f9c02b94 | ||
|
07b0a4da6d | ||
|
8b497a012c | ||
|
f531d3c4d4 | ||
|
f9a53b0880 | ||
|
7abe75210f | ||
|
1aad7d9118 | ||
|
3a78892d31 | ||
|
5e899a81d9 | ||
|
b4d05d410b | ||
|
8c5d4072b1 | ||
|
7ba2b66675 | ||
|
74b4ca1c60 | ||
|
15b6268b64 | ||
|
2034324361 | ||
|
cad8feccb8 | ||
|
0bf23aa272 | ||
|
9f1b05c6ed | ||
|
5e0a6ccf92 | ||
|
0b51434e6e | ||
|
d4d9af78c2 | ||
|
198c577357 | ||
|
467760b6d4 | ||
|
f3927bf5d3 | ||
|
f00a46313d | ||
|
aa22c8def6 | ||
|
191845f266 | ||
|
83fbc2a202 | ||
|
935835b927 | ||
|
228401620b | ||
|
52245f7a59 | ||
|
78856556a9 | ||
|
cde2e5f7f3 | ||
|
1cca2da448 | ||
|
5f00f92581 | ||
|
6be25ecd5c | ||
|
0aae3952c7 | ||
|
0b2c06fef3 | ||
|
0bbf4cf70c | ||
|
a974cefd4d | ||
|
d093b6cee2 | ||
|
6784a588c5 | ||
|
9902e8a2f8 | ||
|
68cbf3f89f | ||
|
7993dbdd97 | ||
|
455b55a6a8 | ||
|
57b939855d | ||
|
889285fd21 | ||
|
ec5b49cf64 | ||
|
18d69bb3bb | ||
|
3c775050a0 | ||
|
bb676f2daf | ||
|
8bb3c88570 | ||
|
07421d20b5 | ||
|
032b711c92 | ||
|
144c947fab | ||
|
cda910b673 | ||
|
5c44c2ff04 | ||
|
c8434ee2f4 | ||
|
30097f6f29 | ||
|
d05a1ebd09 | ||
|
44aaf1af69 | ||
|
ce720741f0 | ||
|
e0ea65c81b | ||
|
bbb24b614a | ||
|
3e01b8d2cb | ||
|
5ea8a0241b | ||
|
cf1ae91a8c | ||
|
1ae1842962 | ||
|
ec58a24047 | ||
|
ac0f346dca | ||
|
faa232e903 | ||
|
c7b539b354 | ||
|
3bfecd48e0 | ||
|
cb3e6a679e | ||
|
539125ef9c | ||
|
d1ce423c3e | ||
|
c1cdbd128c | ||
|
0e3585e9b8 | ||
|
75cf127cf9 | ||
|
9245f5cd38 | ||
|
3450d39e45 | ||
|
2a1d234f6c | ||
|
05ed6a12d4 | ||
|
72213c85e9 | ||
|
1c4a0ca4c1 | ||
|
7e6e96f608 | ||
|
e59fcce8b5 | ||
|
f8480f281c | ||
|
3dd0697400 | ||
|
0e573042c4 | ||
|
82dc259d6c | ||
|
31aa986e27 | ||
|
259da6c52a | ||
|
9d7fde109c | ||
|
652a4489b8 | ||
|
84a4784aba | ||
|
3f8d9bc981 | ||
|
a13500d541 | ||
|
8db2ef43d0 | ||
|
4066177bfd | ||
|
d461d28e0e | ||
|
bbd3070ca3 | ||
|
1f4514b378 | ||
|
805a614d5a | ||
|
849e641411 | ||
|
bf2b70693b | ||
|
9fb83fe107 | ||
|
857a68a6a8 | ||
|
3a0bd3d5cd | ||
|
9f4a5bc2c7 | ||
|
6eae09a1aa | ||
|
c14dc56ac0 | ||
|
5eace63e83 | ||
|
ca7f743abb | ||
|
b1724637b8 | ||
|
6683f9b239 | ||
|
ee8a3ffa4f | ||
|
b1aaaadc5a | ||
|
914a37e5fd | ||
|
6b6a271f4d | ||
|
0d8391fdd2 | ||
|
cec2758435 | ||
|
9c075e212d | ||
|
22d0d332bd | ||
|
8db75328d6 | ||
|
4be2c4b3a6 | ||
|
fb446a01f1 | ||
|
8e6cba6943 | ||
|
945eecbe0f | ||
|
0edd44ba7c | ||
|
f4e096c56e | ||
|
46674d3538 | ||
|
877708ff94 | ||
|
66a7ee10c9 | ||
|
de2fb611f7 | ||
|
0ae780c7c3 | ||
|
4d831c9265 | ||
|
ad7462e21d | ||
|
0350e78d7c | ||
|
133dcca6b8 | ||
|
ddab8bea0a | ||
|
edfbd496c2 | ||
|
38046fb37c | ||
|
04231ab0c4 | ||
|
809a1985f7 | ||
|
99654c4ef6 | ||
|
115cacce0c | ||
|
ccecc6542b | ||
|
6d8baa7536 | ||
|
e7cbbff330 | ||
|
a54c4cc2d1 | ||
|
dc1e40c83f | ||
|
4dd3328bec | ||
|
7f1d11ee6b | ||
|
d199418df1 | ||
|
e3a3fdc83f | ||
|
6101d2d48b | ||
|
6168f561d8 | ||
|
1fc4b8e5d6 | ||
|
b89c96ee05 | ||
|
1f1b5e9336 | ||
|
09755e7491 | ||
|
867d00bc71 | ||
|
60541ceb57 | ||
|
8fcdff23a5 | ||
|
820a477a59 | ||
|
6989d60149 | ||
|
0c0042aa83 | ||
|
93846b2ced | ||
|
cc744424c1 | ||
|
9e039e3753 | ||
|
21de2c2911 | ||
|
3cf67e09d5 | ||
|
86f63b95c4 | ||
|
4ae711c91a | ||
|
3c097668f5 | ||
|
69ce96e476 | ||
|
425e9cb2df | ||
|
043ec5267a | ||
|
0d9f985f37 | ||
|
cb181d559c | ||
|
feac3e3a38 | ||
|
48e5489066 | ||
|
d8970354a9 | ||
|
b3eeb688ea | ||
|
ab3e843d47 | ||
|
73f62345d2 | ||
|
08d8451c88 | ||
|
7daba52772 | ||
|
1091d8a834 | ||
|
8144bb6320 | ||
|
7828f07191 | ||
|
184a08cfb9 | ||
|
346dd7d756 | ||
|
fa32ef75e4 | ||
|
55f55e8a8d | ||
|
bd07ff5792 | ||
|
66633caba3 | ||
|
fe5d9397f3 | ||
|
6f821c3329 | ||
|
5fab111751 | ||
|
d80b0153dd | ||
|
0f50de85ff | ||
|
9e3f80cb3c | ||
|
8a20a0d191 | ||
|
80af91bba4 | ||
|
1d5d2fcfd4 | ||
|
517386c7f7 | ||
|
dbe7347394 | ||
|
11ed408c51 | ||
|
51d2edccb7 | ||
|
fb85527783 | ||
|
251d904621 | ||
|
f4bf101605 | ||
|
a0a54ebd4b | ||
|
6eac572a5e | ||
|
ebacdfcde4 | ||
|
5e4196efab | ||
|
15134cb5b1 | ||
|
caf5419ccf | ||
|
d5b23cc0b9 | ||
|
b6780e979a | ||
|
90a6046ab2 | ||
|
296252dcf5 | ||
|
0653df2501 | ||
|
0b148b75c4 | ||
|
3a42fa9cec | ||
|
ca93cfe6b8 | ||
|
cd0a3c88a3 | ||
|
90dab4e65a | ||
|
3a547e0e37 | ||
|
1d6e7c3803 | ||
|
76bad0760c | ||
|
972e8710d4 | ||
|
3fd82ab921 | ||
|
4c2a85bbd8 | ||
|
5940a2978d | ||
|
24a62af3f8 | ||
|
6333b4be27 | ||
|
15a126c5e3 | ||
|
728a6147f9 | ||
|
d643e8ca24 | ||
|
466a37b313 | ||
|
4aac1f88a6 | ||
|
7dc607d0a1 | ||
|
f4841924a0 | ||
|
f73cf2885e | ||
|
f4e8f51c54 | ||
|
f40d1e7e5b | ||
|
189be6523c | ||
|
f175a6e3dc | ||
|
e6874ccf25 | ||
|
ef596c3261 | ||
|
7fba7cfd5d | ||
|
7e650857ce | ||
|
d723d6c834 | ||
|
2dd9b2717f | ||
|
b7f8adfd2d | ||
|
7c79b1598f | ||
|
d95204cac1 | ||
|
2fe2de5c21 | ||
|
3cac4ac95a | ||
|
966c319c64 | ||
|
5de3edd09e | ||
|
522652591a | ||
|
f9747bcfed | ||
|
253f27bde8 | ||
|
e80c838693 | ||
|
be9d7aa6f5 | ||
|
47b4af9e09 | ||
|
c334e639dc | ||
|
37a4073bef | ||
|
8519136eed | ||
|
763094830f | ||
|
10f42c3352 | ||
|
3d0c2f20f0 | ||
|
57a6d29c2e | ||
|
18b8a5519f | ||
|
dde2f47eb1 | ||
|
b64d8f9463 | ||
|
6179ac0699 | ||
|
678350199f | ||
|
7739ea4c67 | ||
|
236de41c27 | ||
|
34b072a685 | ||
|
c2f3aa47be | ||
|
8c5d3fc7e8 | ||
|
90346640db | ||
|
0097dbcc26 | ||
|
27feadf334 | ||
|
b7094fec10 | ||
|
79d4530dad | ||
|
f30d4a7421 | ||
|
2a15016acd | ||
|
d38c6e6e3f | ||
|
216c39aeda | ||
|
b4746de9ec | ||
|
412a5ab4ef | ||
|
8d009f3f65 | ||
|
ead0537623 | ||
|
767e098382 | ||
|
49f98fb4ab | ||
|
56b41acdc9 | ||
|
a2516a408b | ||
|
f0dd2a408c | ||
|
96ba8a28f6 | ||
|
18b0ae28c6 | ||
|
3ee2294bac | ||
|
c1125823f1 | ||
|
e433b5b4c6 | ||
|
a8110d1e1e | ||
|
6bf7626a0c | ||
|
a10572ce53 | ||
|
87edb19b4d | ||
|
0a0a0d5cf3 | ||
|
e702e59878 | ||
|
fa499d55ca | ||
|
d7ace383ec | ||
|
e5125b7488 | ||
|
fbb447e2c4 | ||
|
61762bf46f | ||
|
0c1c17961d | ||
|
8ac7b0858a | ||
|
96a96e730f | ||
|
a1c6cbf16e | ||
|
16e4e873a2 | ||
|
209d266d50 | ||
|
d10f0b94b8 | ||
|
151796fa32 | ||
|
0cbe0b1784 | ||
|
1f1c4a921b | ||
|
2ac01a6ca3 | ||
|
7afcee21b2 | ||
|
ba692f5788 | ||
|
63d2cc405d | ||
|
70e0dca9ef | ||
|
95bbb2b9a4 | ||
|
16ec06b235 | ||
|
d5081b7888 | ||
|
b1a6341a26 | ||
|
3b9de29c38 | ||
|
e1663a1065 | ||
|
51304829d6 | ||
|
e59530f9e0 | ||
|
e2e8bf2d64 | ||
|
21ba2ace60 | ||
|
568abcbd3a | ||
|
6523dea767 | ||
|
600afbe5da | ||
|
d4d283bf1b | ||
|
376c6d4008 | ||
|
f2301c5757 | ||
|
5b4c6454ec | ||
|
cf519177cc | ||
|
46e620fc8b | ||
|
f5abdcb3c3 | ||
|
e874fa1bd5 | ||
|
1476cdecb0 | ||
|
4125fb9694 | ||
|
fdda9a6b9d | ||
|
ca01f8dfe5 | ||
|
a741b4e4bd | ||
|
2d0e6b13c2 | ||
|
f3e305f049 | ||
|
96ec96d318 | ||
|
2381ea4581 | ||
|
f61ae9fb62 | ||
|
5f6044310d | ||
|
a068ecbc5f | ||
|
b7850f8fe4 | ||
|
9ec1cc00f2 | ||
|
35089a8a57 | ||
|
0eca8d4044 | ||
|
27f4f38e85 | ||
|
6844c083a1 | ||
|
f5d220099f | ||
|
ec100e892a | ||
|
bf16cbc3d6 | ||
|
526bdb340c | ||
|
71df851e7f | ||
|
83ef7e2eaf | ||
|
bcacb15d36 | ||
|
6bc7d0dda4 | ||
|
2062833988 | ||
|
8e8ee87b86 | ||
|
5402151db6 | ||
|
63482228c2 | ||
|
7296575156 | ||
|
46ddee38b0 | ||
|
0e8922d54e | ||
|
2b369f8133 | ||
|
3473885694 | ||
|
7b32730bab | ||
|
c6afc57c82 | ||
|
fd788c22d5 | ||
|
04df6d82a3 | ||
|
6999716b96 | ||
|
c1a23315cd | ||
|
d33b133cd6 | ||
|
b022709ac5 | ||
|
73e90c7137 | ||
|
152ce11a13 | ||
|
7a9539b77a | ||
|
e885525adb | ||
|
19eea942ad | ||
|
ee6c4f6f44 | ||
|
19210eea93 | ||
|
6a2dbd8ca4 | ||
|
50cbce6d06 | ||
|
8d1faa443c | ||
|
c0ce485169 | ||
|
fcede292cc | ||
|
646a6e4347 | ||
|
eeab02964a | ||
|
7552d17984 | ||
|
80e3d51279 | ||
|
b2257cfcec | ||
|
78a07fd17b | ||
|
8016d8e124 | ||
|
6306f9664b | ||
|
adf64959aa | ||
|
ba0d19c23f | ||
|
15cefc9dc9 | ||
|
c338206c96 | ||
|
6d42225630 | ||
|
060f9ce148 | ||
|
f71203a294 | ||
|
ff486b6e97 | ||
|
c29c603597 | ||
|
50745b84b2 | ||
|
7e5799ed42 | ||
|
6af862d577 | ||
|
caa7ab9b29 | ||
|
0ea1d3f095 | ||
|
db1c50bccd | ||
|
87709afba0 | ||
|
780c98f7e6 | ||
|
5c9194275a | ||
|
0888aa4b90 | ||
|
e788f7edfe | ||
|
a031ea171a | ||
|
000c548490 | ||
|
953a8d6472 | ||
|
04679d6d10 | ||
|
617b1fbb04 | ||
|
aa88de778a | ||
|
a49932b757 | ||
|
73265c5504 | ||
|
c1f7ecdf3b | ||
|
1e3d20528d | ||
|
5c1933ad4b | ||
|
9290f03940 | ||
|
e47201cf41 | ||
|
2d77bf096f | ||
|
7a4ac109ec | ||
|
9f7110bcbf | ||
|
7dcfae6d49 | ||
|
57ffafaae1 | ||
|
3fd659e9e4 | ||
|
75dba7c0af | ||
|
3ac92fa641 | ||
|
79f3f7cdb2 | ||
|
d42aedcaca | ||
|
0f3a8b518b | ||
|
4f26bc4784 | ||
|
e453562c32 | ||
|
6e537cd2e2 | ||
|
6bf9dc1356 | ||
|
ab28df5f10 | ||
|
7edf0f4df1 | ||
|
d71b6fee3d | ||
|
90a50fd5bd | ||
|
e6380ade7a | ||
|
b42599763b | ||
|
e1168afdf1 | ||
|
c3fd661722 | ||
|
ef15d07386 | ||
|
9bb36c5e85 | ||
|
34499797f3 | ||
|
e2fbb6551a | ||
|
d99e873817 | ||
|
d5c45cc949 | ||
|
4e78ec2f5a | ||
|
bb27f7d002 | ||
|
d4851eb741 | ||
|
53c72358c0 | ||
|
5ede8ea93d | ||
|
ffa0e0d51d | ||
|
5416dbea9b | ||
|
8a7a789e63 | ||
|
d6c8f96094 | ||
|
5fc42941db | ||
|
15682dd0cd | ||
|
bd1f3340cb | ||
|
5009d37d51 | ||
|
cc715ad02b | ||
|
5aff4a31b3 | ||
|
2eb717eb22 | ||
|
0895fb72c3 | ||
|
845cff4d72 | ||
|
6c2298b2db | ||
|
984424b443 | ||
|
c8ad57a77a | ||
|
ff5bb76716 | ||
|
9831428651 | ||
|
519a8af2fa | ||
|
af8b8aa277 | ||
|
6f5d76722b | ||
|
36f7711df6 | ||
|
8cd8ce0be2 | ||
|
be01c1a550 | ||
|
7fefeea078 | ||
|
a5d0a5701f | ||
|
d6738b5fb6 | ||
|
7356db934c | ||
|
99e67248a7 | ||
|
5fdb1fb356 | ||
|
088fa4c076 | ||
|
11f9207e9e | ||
|
7160e19699 | ||
|
ce231d2667 | ||
|
ddadc73ae5 | ||
|
9a27fdf2c6 | ||
|
b8a31222b9 | ||
|
3d3fd07689 | ||
|
1a24baa1a0 | ||
|
f0f3ef30ba | ||
|
65c3c03f4a | ||
|
855ff63b6a | ||
|
3e4c97edf2 | ||
|
4182609042 | ||
|
30d61191be | ||
|
ff7744a993 | ||
|
ec3435a947 | ||
|
86a574a07a | ||
|
336b1df17d | ||
|
adf520e7a8 | ||
|
7b452d0dc8 | ||
|
5c8c438c33 | ||
|
2b312fb177 | ||
|
0866ab9046 | ||
|
613df03afb | ||
|
00e8c2009e | ||
|
c0bfa2acd4 | ||
|
f97ef56b88 | ||
|
db15725500 | ||
|
01771b15dd | ||
|
346573fc95 | ||
|
14ca9dc4b0 | ||
|
e0b302e05d | ||
|
2352d3f843 | ||
|
feb2d6d223 | ||
|
c71bb017ee | ||
|
dac982f799 | ||
|
1deeb8c822 | ||
|
cdc77b67db | ||
|
0b7bf40bbc | ||
|
082640752d | ||
|
21f9c5560d | ||
|
268df712a3 | ||
|
1b4c5c70bb | ||
|
0842947f77 | ||
|
41350749c7 | ||
|
a25cf84937 | ||
|
9426087491 | ||
|
c5d4a908ee | ||
|
7779af28db | ||
|
e09838afc4 | ||
|
28118dbd1d | ||
|
f632c16831 | ||
|
2f511ce8d0 | ||
|
aeeb59a436 | ||
|
c9462e363c | ||
|
b148feb55e | ||
|
09dbc89e7b | ||
|
e96dfa70f5 | ||
|
10b9b230e1 | ||
|
742c06e8aa | ||
|
f864dfa8f7 | ||
|
4ed72fe0c3 | ||
|
f32edf89b1 | ||
|
a2743d3433 | ||
|
c69021d8cd | ||
|
f6bef341eb | ||
|
44571a5d27 | ||
|
1daf3f08fd | ||
|
da6c39648e | ||
|
5e0701b3a5 | ||
|
7f9e738a57 | ||
|
1096092fbc | ||
|
76e0d41aaf | ||
|
d05cabeedc | ||
|
056ace7e98 | ||
|
ff27cad84b | ||
|
e71d7ac230 | ||
|
0bb26f5835 | ||
|
a933edba06 | ||
|
3079d52188 | ||
|
674fa4d446 | ||
|
ad72f14fdf | ||
|
2383b8d3fe | ||
|
f09eff9aea | ||
|
1152dd24a2 | ||
|
4ff30320ce | ||
|
8b061b2af9 | ||
|
9ac09df9c6 | ||
|
6f9fbb55ab | ||
|
35825a5dcc | ||
|
f9940dab60 | ||
|
9fe6f6c258 | ||
|
bd969821f9 | ||
|
c7e25919c6 | ||
|
1952003649 | ||
|
0fb551a0a2 | ||
|
ea2d63b55b | ||
|
603c2b68de | ||
|
8c090824f2 | ||
|
5748250fd4 | ||
|
e0754b1233 | ||
|
10fc146318 | ||
|
643280d7bf | ||
|
2c439fe7b6 | ||
|
fb04fd266a | ||
|
859a5e3406 | ||
|
8497a90d5c | ||
|
bba6d4f731 | ||
|
d7116a786d | ||
|
ef1694d6f0 | ||
|
3ef4ba7fca | ||
|
a9c1f709af | ||
|
12f07f17cf | ||
|
fea1441f62 | ||
|
92f7a00667 | ||
|
8612f8167b | ||
|
98f8dcdab6 | ||
|
b35d468f66 | ||
|
45e2c6f716 | ||
|
0a5f534430 | ||
|
6fad3ddb82 | ||
|
c9cc9d67bc | ||
|
791ed2d3d1 | ||
|
a16bcfcef2 | ||
|
e2a07240ee | ||
|
ba82f67d6d | ||
|
ef48bdb011 | ||
|
c5ae760f0c | ||
|
93701e2a00 | ||
|
0e66b22778 | ||
|
146dd475ae | ||
|
bf0793e2bb | ||
|
e9e466c134 | ||
|
b80ff307a1 | ||
|
e71a8700c4 | ||
|
3728b81a27 | ||
|
146afc4d24 | ||
|
e275abbd9b | ||
|
4115304e1f | ||
|
85aa152733 | ||
|
2402819570 | ||
|
78e7a73d4f | ||
|
ffac66d530 | ||
|
5dc5e70e20 | ||
|
376b7bd99e | ||
|
2695ce5a87 | ||
|
173b026f6c | ||
|
0f20644152 | ||
|
004612c018 | ||
|
b7726792a9 | ||
|
5712d9371c | ||
|
af48798d9c | ||
|
448363cd84 | ||
|
63ad6bbb1b | ||
|
6f8b147bf6 | ||
|
a58fefdcbb | ||
|
94095266a7 | ||
|
66765a238d | ||
|
a0dc39c565 | ||
|
8cd6b6b985 | ||
|
96de476467 | ||
|
e8e8026ec7 | ||
|
0776fe07e4 | ||
|
09c5557e7a | ||
|
e216a18080 | ||
|
e5503d67f9 | ||
|
62acf6c87c | ||
|
f474f6a241 | ||
|
4a1a1d848d | ||
|
99a5137c2d | ||
|
6b0fd7830e | ||
|
1176373c57 | ||
|
c506b569a9 | ||
|
6a6e183c12 | ||
|
f1ebf6088a | ||
|
cf83df6d61 | ||
|
08efbf69b1 | ||
|
c678a73f7e | ||
|
ce60b8194a | ||
|
a593039f68 | ||
|
464242f3d1 | ||
|
141e492284 | ||
|
8b52d1be62 | ||
|
1e89000cc8 | ||
|
ce589e8291 | ||
|
5cc33b058c | ||
|
64386c666c | ||
|
9d5aa5d876 | ||
|
fad7abc046 | ||
|
824d857df1 | ||
|
a24ce8f811 | ||
|
919d1806cc | ||
|
89b6b3cccb | ||
|
d00fe0d422 | ||
|
7a7fb211dc | ||
|
fd4b068652 | ||
|
ae8b9dcc4a | ||
|
5c80bed5e7 | ||
|
1b3864922c | ||
|
62e3042f36 | ||
|
efe8d3eb34 | ||
|
5d054a19fd | ||
|
83e991d00e | ||
|
d268268837 | ||
|
d8ac6a6267 | ||
|
d6b4de54b5 | ||
|
ba8161f46b | ||
|
59f89e9738 | ||
|
88cd49f777 | ||
|
d2d844fa99 | ||
|
9b945ca87a | ||
|
4140358663 | ||
|
22b3452638 | ||
|
8ed35e7493 | ||
|
ea841e4340 | ||
|
ed23e4b31b | ||
|
5d5c8aa70e | ||
|
9e52ade763 | ||
|
62107846d2 | ||
|
2321b3c778 | ||
|
6416289540 | ||
|
8245592fde | ||
|
c2a79c3e1c | ||
|
5f933e58ef | ||
|
81c9a1a8e7 | ||
|
4f10f2e0e1 | ||
|
ab829dd986 | ||
|
f50d205d88 | ||
|
e19e065d15 | ||
|
e231bca2ab | ||
|
fce40eebe3 | ||
|
058eaf8285 | ||
|
09aceb98d9 | ||
|
9e94c29759 | ||
|
e5088d14a2 | ||
|
a0bcb6934e | ||
|
b28d567bb0 | ||
|
c44ad973b9 | ||
|
3d20fa7032 | ||
|
dc5003c6f3 | ||
|
0da58ad502 | ||
|
9d308583a4 | ||
|
9a345c9277 | ||
|
9487b29313 | ||
|
f8faaa532a | ||
|
094cb15ba0 | ||
|
e5490e6eb8 | ||
|
91c04f6445 | ||
|
b5bc85ca42 | ||
|
680011889d | ||
|
af21489292 | ||
|
2d50f4b5f2 | ||
|
466a7a71c7 | ||
|
5b7fd7d337 | ||
|
0cf2523391 | ||
|
2b3986f719 | ||
|
846173c976 | ||
|
a5243c0dbe | ||
|
bf9728b3d7 | ||
|
3fd1786b81 | ||
|
2c7015513f | ||
|
0733b715d6 | ||
|
c9cdb51104 | ||
|
9e1c4c0ab4 | ||
|
091adf6727 | ||
|
410b0c776d | ||
|
b0b5189e03 | ||
|
3b4b3d8550 | ||
|
e05c4ff66a | ||
|
87d05605b5 | ||
|
bc9406afe6 | ||
|
9856829d76 | ||
|
eddd296499 | ||
|
bed2d80c90 | ||
|
09007b50a0 | ||
|
98a67aa507 | ||
|
6c11eb5b41 | ||
|
f7732c4385 | ||
|
5a242608b5 | ||
|
756284f00a | ||
|
0bab18a8e0 | ||
|
9279e47404 | ||
|
031febef4f | ||
|
ffa0f3dd9b | ||
|
915f4a09b5 | ||
|
d38b3b9620 | ||
|
09e6ff8c42 | ||
|
8ac35652ba | ||
|
0cc89f950e | ||
|
073233381b | ||
|
b6f6e5a77e | ||
|
4db672bd7c | ||
|
54a6eb4dee | ||
|
d8134e0bec | ||
|
24d3bad8d6 | ||
|
592778bad6 | ||
|
9f8ef6c168 | ||
|
9339eb0fe4 | ||
|
11acaf87d7 | ||
|
a0973ce40c | ||
|
3bd7099bb4 | ||
|
f17ce86047 | ||
|
8686744068 | ||
|
3dbebf5144 | ||
|
125372dd45 | ||
|
46be20d9be | ||
|
84406ac8be | ||
|
58ccbbc7b7 | ||
|
d842ec8482 | ||
|
509b8f9b5f | ||
|
4d2a9c1a5f | ||
|
e63aab5adf | ||
|
e44b4b86f1 | ||
|
9d05742271 | ||
|
c47e337d22 | ||
|
66a1929a95 | ||
|
8756135df1 | ||
|
f6f41ac61a | ||
|
c21b5bcd98 | ||
|
9137f764b6 | ||
|
deae97bfa5 | ||
|
ebad4a640c | ||
|
2469ff1643 | ||
|
70f8442083 | ||
|
17d270987a | ||
|
28b9bd356d | ||
|
8c879ff9c5 | ||
|
9f5fc44733 | ||
|
2721bd7e21 | ||
|
1ed0735c53 | ||
|
23200777d1 | ||
|
19778f31bd | ||
|
38643da5dc | ||
|
c7999962a3 | ||
|
9eb210eadb | ||
|
bcbdee05d3 | ||
|
068dd44056 | ||
|
607422284d | ||
|
5022eecae0 | ||
|
5e0033c406 | ||
|
58a44689c3 | ||
|
82e3ab8724 | ||
|
9e6fc6c899 | ||
|
8c95ef116d | ||
|
4cc1012b97 | ||
|
0bbcffb2f5 | ||
|
cec20f68b2 | ||
|
a882b4926b | ||
|
b836e27d04 | ||
|
ca81525a72 | ||
|
885e38e0c4 | ||
|
ec5a3c3d14 | ||
|
0290bdd203 | ||
|
901384b2fc | ||
|
c01309bf55 | ||
|
9ca5ec8bfc | ||
|
68efcd79bc | ||
|
8e10035b0a | ||
|
854b358232 | ||
|
b8b2cdd3ea | ||
|
a548432b31 | ||
|
86536988d6 | ||
|
159f1012bc | ||
|
fe6531fc30 | ||
|
47c902be43 | ||
|
78e5c4e9b5 | ||
|
3416be29f9 | ||
|
b22eeb9e6d | ||
|
63c691437e | ||
|
844b310037 | ||
|
bfe54e52da | ||
|
4764327b40 | ||
|
301007ffa5 | ||
|
8187d73595 | ||
|
ba12c0a766 | ||
|
7c834ad6d6 | ||
|
c9569d2308 | ||
|
fe84bd4bdc | ||
|
a568802deb | ||
|
544f6e1665 | ||
|
7ef8b21728 | ||
|
1356efc2eb | ||
|
ef68facf71 | ||
|
c97cc71ff0 | ||
|
aa786eb505 | ||
|
4932ae4a15 | ||
|
96e5c58555 | ||
|
83609d6f72 | ||
|
bb722da782 | ||
|
37b68131d0 | ||
|
9b07c5a436 | ||
|
d0acfee780 | ||
|
375c124f0d | ||
|
80977b9444 | ||
|
d4507593e1 | ||
|
50c09563d0 | ||
|
003d61a3e6 | ||
|
bd3b579a5a | ||
|
3d6c0694f6 | ||
|
1c411e3d43 | ||
|
004d7d7445 | ||
|
bee5ccc4aa | ||
|
6fc391d57d | ||
|
ea85794973 | ||
|
71ae0a1095 | ||
|
ee6beb764e | ||
|
1b8fa9023e | ||
|
867509e0e2 | ||
|
facb711c38 | ||
|
7263a166db | ||
|
45a9c81318 | ||
|
d30eb33cc5 | ||
|
186e869e81 | ||
|
4b994df96f | ||
|
c1e39ae9b3 | ||
|
79815f2675 | ||
|
9920902f18 | ||
|
a0c711c0d2 | ||
|
00b7e47d1b | ||
|
a9dbe85be2 | ||
|
843ab900d9 | ||
|
733e6b6d19 | ||
|
6049fb0a7d | ||
|
829be437b1 | ||
|
de0aa99a70 | ||
|
84998713ea | ||
|
364faf634e | ||
|
8774540e37 | ||
|
ef5d4fc7e0 | ||
|
f79cf03477 | ||
|
720d270f0e | ||
|
1c24ca6cdb | ||
|
7cf9a3037f | ||
|
034891ed2b | ||
|
2714ef2ab0 | ||
|
d45aa93b61 | ||
|
5505bde35b | ||
|
2c25b1aa80 | ||
|
9ce0bb1007 | ||
|
51f129fb20 | ||
|
0539ad924a | ||
|
14f4cf769e | ||
|
2725571fda | ||
|
27e5b95c62 | ||
|
c85cc2d5ef | ||
|
f972a14420 | ||
|
5c4d09a233 | ||
|
680419f53f | ||
|
c9631d614b | ||
|
0a7bbcd9b6 | ||
|
92fea4048b | ||
|
ba8a84c9d1 | ||
|
f8604a7be7 | ||
|
d0873f2b11 | ||
|
d659a731e3 | ||
|
26e8b4d3af | ||
|
7777a461c3 | ||
|
71658b2fde | ||
|
90ef1bfc7b | ||
|
d9297fb37e | ||
|
34624546c2 | ||
|
7d0b9dea9b | ||
|
3c969e8f7a | ||
|
5872b92e95 | ||
|
bd3f6acd4d | ||
|
f0f3dbd75e | ||
|
bf2e21452d | ||
|
89505f6a9c | ||
|
238ab89099 | ||
|
f7c3abb0a2 | ||
|
f34f2e9aef | ||
|
3a6c8ddf30 | ||
|
30280ee3df | ||
|
492b18a5a4 | ||
|
77c36d3df9 | ||
|
98cbc5c60b | ||
|
bcba0550bd | ||
|
194e741cea | ||
|
437a9c0ad3 | ||
|
4f24cfc0ae | ||
|
740a6ab3e1 | ||
|
3c582354e9 | ||
|
850e2779fb | ||
|
f11270d478 | ||
|
5b6f98d439 | ||
|
4f727d46b3 | ||
|
d0300a62a7 | ||
|
2e2675087c | ||
|
a7d8906428 | ||
|
d3c5a8b1aa | ||
|
ed0d1c7fcf | ||
|
e7f94796de | ||
|
cdc34da45b | ||
|
6a9423b5df | ||
|
568e0fb6cc | ||
|
9a5bffb8ab | ||
|
8d30ee37ba | ||
|
b85fd46650 | ||
|
44c2734d93 | ||
|
c74807054b | ||
|
616538882e | ||
|
209da8588e | ||
|
76a10f2598 | ||
|
ab7def879f | ||
|
c0a6a6df9e | ||
|
f2c424c93f | ||
|
9aa03e7493 | ||
|
788a1cbacb | ||
|
f728abae13 | ||
|
6d9fd10c04 | ||
|
421ef4c99b | ||
|
8258ba4fc1 | ||
|
473419f996 | ||
|
daa249f2b9 | ||
|
5c1926da55 | ||
|
29b763ef35 | ||
|
23ea56928a | ||
|
49d884109c | ||
|
4cccdfae2e | ||
|
64dfb023eb | ||
|
a57fa3cc36 | ||
|
92b0b005bd | ||
|
6f8f404d14 | ||
|
bbdcb4462a | ||
|
2fd1eea0fd | ||
|
ae260fd6c5 | ||
|
774426473a | ||
|
ac49dfe39a | ||
|
ac878b40d5 | ||
|
c1d0d47326 | ||
|
3a0ea6aadd | ||
|
ee4ae17a72 | ||
|
4c1916e923 | ||
|
df4b33919c | ||
|
42ac4a136f | ||
|
2bd1f49272 | ||
|
6d92b8c675 | ||
|
25f8fb989c | ||
|
22b115a7ff | ||
|
26ed67330e | ||
|
4eb299c93a | ||
|
11e4d606da | ||
|
710db296ec | ||
|
3ba30b3a43 | ||
|
dd9f745fde | ||
|
16efc98226 | ||
|
1465ed5e05 | ||
|
19627eeb7c | ||
|
ce635ce794 | ||
|
ced9b1048c | ||
|
ab60f861e4 | ||
|
6c8a9c7208 | ||
|
5b6ec72d86 | ||
|
54e0d4ab33 | ||
|
8f14f1266a | ||
|
5e7604bc22 | ||
|
371efb285b | ||
|
3a0b9a4453 | ||
|
335ac56efb | ||
|
3b2012561d | ||
|
6ceec818b2 | ||
|
565cb6ad50 | ||
|
98e5d72dd5 | ||
|
654992af19 | ||
|
d1af2c3470 | ||
|
2d364cbfae | ||
|
cd58502e05 | ||
|
1161316c67 | ||
|
07c8746bad | ||
|
4c33f8dc50 | ||
|
581b33ff45 | ||
|
e6881a71e5 | ||
|
e55bc9a4ff | ||
|
38353dcfac | ||
|
31c9ca379c | ||
|
5e21d41f51 | ||
|
405c7870da | ||
|
7d940904da | ||
|
0c8d205343 | ||
|
2ff24ec7ed | ||
|
aa0cd0a6e4 | ||
|
de274a5cbb | ||
|
cd8b84f98e | ||
|
c950107aa8 | ||
|
13166ef936 | ||
|
e7a96246fa | ||
|
515c91da66 | ||
|
c5ee986890 | ||
|
601501d0d0 | ||
|
03a1817871 | ||
|
201ebeaa96 | ||
|
7a51b801c9 | ||
|
b62b320a40 | ||
|
82161eb375 | ||
|
adb5f43a58 | ||
|
7cc3aa347b | ||
|
db7e947f1b | ||
|
ee9e836596 | ||
|
a490d0f89c | ||
|
16b5e0e8e1 | ||
|
a4c2ca659e | ||
|
4a960821a5 | ||
|
63332eca01 | ||
|
6e7b4ded7c | ||
|
20f5eb5e7c | ||
|
471e73eb08 | ||
|
ce41e186c1 | ||
|
17eb2d7376 | ||
|
7c0f7a55ff | ||
|
a1c41ce60b | ||
|
95b00f921e | ||
|
43f1aa9f29 | ||
|
7327a6b237 | ||
|
08056b1a7e | ||
|
6d7e7d60b5 | ||
|
064431c525 | ||
|
2fa1b7c69e | ||
|
8fd104a045 | ||
|
e534bea08c | ||
|
0afdca9e67 | ||
|
f8227642cf | ||
|
76f27d0177 | ||
|
f31e566dca | ||
|
b977811c6d | ||
|
a082f710b0 | ||
|
c6bb9af766 | ||
|
8abad03e29 | ||
|
6e293047a4 | ||
|
8ec7e66529 | ||
|
a54e8d7638 | ||
|
6414974cf5 | ||
|
b36feae3ff | ||
|
0e13f07324 | ||
|
b3012816c0 | ||
|
69cddbaab2 | ||
|
b7c2485e31 | ||
|
26dd1a0095 | ||
|
022d639781 | ||
|
7b647d199f | ||
|
2cdd43432e | ||
|
531a2584c6 | ||
|
080fc15766 | ||
|
a5ec1be3ba | ||
|
1b979ef235 | ||
|
d2e47a817f | ||
|
aa0db7fda2 | ||
|
15e9b46e14 | ||
|
d954628eed | ||
|
83c627bba3 | ||
|
2dc4e0b986 | ||
|
ae156f4e78 | ||
|
908e3601e8 | ||
|
04d53786f0 | ||
|
89fb932dc8 | ||
|
4446474c49 | ||
|
5b4532b24b | ||
|
5b8c58c590 | ||
|
dd92c92cc4 | ||
|
0b02859ebf | ||
|
5db1613aae | ||
|
3563e7bce7 | ||
|
5b0cb302bc | ||
|
095038b75b | ||
|
e05d0c18a6 | ||
|
b29612a525 | ||
|
615e5a0c13 | ||
|
f1a360a475 | ||
|
d72e16bf3c | ||
|
7e56135a5a | ||
|
9d9015cbdb | ||
|
75bb03e61e | ||
|
9382b1c75b | ||
|
2d5b1ffde7 | ||
|
e47e2832b8 | ||
|
64d6b78b91 | ||
|
1ff3083509 | ||
|
f3ef27eaba | ||
|
34fb706af5 | ||
|
d480230471 | ||
|
bd66e90287 | ||
|
9afed9b15c | ||
|
818d7d0e0f | ||
|
582d404c55 | ||
|
6374a2f397 | ||
|
9dc76efa99 | ||
|
9e691dd614 | ||
|
9370c6ba12 | ||
|
edf3c8adcd | ||
|
cfa31db743 | ||
|
18f5df1f04 | ||
|
f6b4e6c9a7 | ||
|
6db8abb44c | ||
|
b71970b1e7 | ||
|
b57383f867 | ||
|
f7530f9459 | ||
|
238027e84e | ||
|
38414871f8 | ||
|
32da2feced | ||
|
4742e89355 | ||
|
361c4fd211 | ||
|
89e7b419b8 | ||
|
dcea3abb2d | ||
|
dc7543e6e3 | ||
|
ffa5c6a998 | ||
|
cf2adb6217 | ||
|
c652c9484d | ||
|
0ad25b6293 | ||
|
0d851d75c5 | ||
|
00a0b58ebb | ||
|
92e9e17800 | ||
|
508fff4ae5 | ||
|
f9c32e7a63 | ||
|
f3e9a788e8 | ||
|
2dd1c99c45 | ||
|
62aa2088fd | ||
|
f096b09e6d | ||
|
955bee323f | ||
|
d827d4acf0 | ||
|
76bad85642 | ||
|
f86c833fe0 | ||
|
2fa5f840d5 | ||
|
0ee0d1c04f | ||
|
616dfc166c | ||
|
a195843d96 | ||
|
3523682dea | ||
|
b330463c67 | ||
|
d77fd28881 | ||
|
0706d7cf53 | ||
|
4e51e03f4f | ||
|
ec73fc1643 | ||
|
796fbddc3b | ||
|
762f58ab21 | ||
|
ec96a73450 | ||
|
38b17a7ffd | ||
|
170531ee4b | ||
|
f83ca04634 | ||
|
57cb8e4e82 | ||
|
86d56a0fc3 | ||
|
a895d61d5c | ||
|
5c07db1928 | ||
|
56d3350d72 | ||
|
39e44445a6 | ||
|
73043256f9 | ||
|
491b7d54a4 | ||
|
317d85019d | ||
|
782d2f5d12 | ||
|
94484e61d4 | ||
|
b7dbf2d867 | ||
|
d4118cc7b1 | ||
|
5228a0a58d | ||
|
73fda6b066 | ||
|
a98477bd0b | ||
|
c25bc243eb | ||
|
849be528fe | ||
|
64a948febc | ||
|
3e3e9290c7 | ||
|
e591a85a40 | ||
|
358f4baccc | ||
|
0c79540c63 | ||
|
b496757eae | ||
|
026525162c | ||
|
d45ca1a3fd | ||
|
97d2a1b925 | ||
|
1049d39836 | ||
|
593f309670 | ||
|
4198a06d0b | ||
|
162d01ab37 | ||
|
70b11c4fbe | ||
|
a76b692c36 | ||
|
70bfcd7c2c | ||
|
405b381007 | ||
|
82d82b61a5 | ||
|
cbfcce261d | ||
|
2687753081 | ||
|
fa21e82965 | ||
|
6649d1f319 | ||
|
ef03028539 | ||
|
ba74ca2dcc | ||
|
3fc4d88ac7 | ||
|
71276fddc8 | ||
|
1ae9592c47 | ||
|
7ef2287cb6 | ||
|
564d204d9f | ||
|
f6eae83ac3 | ||
|
f9815d36c3 | ||
|
aa9d49e1b8 | ||
|
ccdcca678f | ||
|
bfca29edaa | ||
|
27c37449b5 | ||
|
a25184b7a7 | ||
|
616415f904 | ||
|
6e206a04b6 | ||
|
65526477ba | ||
|
4add7c0b34 | ||
|
932567700e | ||
|
2040148fdd | ||
|
5a69cbab1f | ||
|
d9c0f1d7b7 | ||
|
d525e47c9a | ||
|
5f21a9528b | ||
|
0989a5ccde | ||
|
567a33a273 | ||
|
3b4cc84765 | ||
|
5c38b2916b | ||
|
3af61dfc11 | ||
|
c2b281c55b | ||
|
30b1489968 | ||
|
03038a1f5b | ||
|
f9c79f9dd7 | ||
|
dde162ff42 | ||
|
118261a503 | ||
|
d0745bc223 | ||
|
0ca587ef40 | ||
|
c619684a9f | ||
|
58bfd03bef | ||
|
00c4f94c27 | ||
|
1af2cfd4d8 | ||
|
86ef8240b9 | ||
|
344743eaa5 | ||
|
2dbc17690f | ||
|
381ec34571 | ||
|
1daa4e5b71 | ||
|
36dd289df0 | ||
|
ffdbb93689 | ||
|
7e6c1c34b3 | ||
|
ca827deb02 | ||
|
0f5edc6dbf | ||
|
d1ab3c23cc | ||
|
3dbec2dc52 | ||
|
29ffee2cd2 | ||
|
89a48d9401 | ||
|
928691d735 | ||
|
d617f86238 | ||
|
250c383f08 | ||
|
b5ae0a9a3b | ||
|
952a4831ee | ||
|
94e9962182 | ||
|
321267f659 | ||
|
21f442c3e5 | ||
|
cda461a616 | ||
|
4c50ccaa92 | ||
|
9ae87f7be3 | ||
|
19a31e1aec | ||
|
b60c0b7030 | ||
|
c3674db226 | ||
|
56fcc081a5 | ||
|
fab6654943 | ||
|
e0f9dd5156 | ||
|
490c977984 | ||
|
4e60199541 | ||
|
1077f448d5 | ||
|
27d9601235 | ||
|
2a54504cb6 | ||
|
20cb8d638d | ||
|
83ab6406d6 | ||
|
133a84d281 | ||
|
137cd39ec5 | ||
|
00608d228d | ||
|
557ef33173 | ||
|
b836e27a15 | ||
|
70be044335 | ||
|
7e2955b75c | ||
|
a6ba320faf | ||
|
91f46fbadc | ||
|
9b1b2084b0 | ||
|
fd4fea4228 | ||
|
ee53c6ba0f | ||
|
593ec30ad0 | ||
|
f2c9f0a505 | ||
|
ad99843335 | ||
|
5cc29dd12d | ||
|
84efc067be | ||
|
35c8abd8b9 | ||
|
6418db84dc | ||
|
cd84d4a071 | ||
|
9348cc035a | ||
|
d9efe8b65d | ||
|
dd7555cd31 | ||
|
30aa1a88c3 | ||
|
c309b8651f | ||
|
638082f272 | ||
|
4fbdc56aa7 | ||
|
453a359a9e | ||
|
96ba157d97 | ||
|
d5f8e9457b | ||
|
ea541b7362 | ||
|
61de8ba064 | ||
|
64725871e0 | ||
|
79649b31d6 | ||
|
1cd902a094 | ||
|
ea836c51a2 | ||
|
f497f4616b | ||
|
e9e2172042 | ||
|
caf5371ff9 | ||
|
64818c920a | ||
|
1bb650e720 | ||
|
642d2b8fa1 | ||
|
239502350a | ||
|
cb3bed8054 | ||
|
60f719d8fa | ||
|
cb0c6f3187 | ||
|
5d051320d7 | ||
|
5ab37bdbb2 | ||
|
adbec32f1a | ||
|
bd37ea5198 | ||
|
859d23845b | ||
|
b591964667 | ||
|
19ca811a88 | ||
|
559d67b977 | ||
|
4549842ab6 | ||
|
d9c9481f26 | ||
|
159d1933fe | ||
|
79301257f8 | ||
|
2be337cfc7 | ||
|
74f9e8e3d9 | ||
|
a48820e9f4 | ||
|
8979386806 | ||
|
6967f8b779 | ||
|
417093fe28 | ||
|
a973354bf6 | ||
|
18cb97fb87 | ||
|
eb6db0e4b8 | ||
|
650164d34c | ||
|
f129aba820 | ||
|
070ebc8f41 | ||
|
940c78efaa | ||
|
cf57a49688 | ||
|
f9ec86744d | ||
|
79ebf0e9df | ||
|
119d4544ed | ||
|
2478f42a4c | ||
|
9e55933fbf | ||
|
0e666140b3 | ||
|
17cd498d12 | ||
|
46c14bac9d | ||
|
d195381766 | ||
|
b65e4260a7 | ||
|
eca005a814 | ||
|
27827232cd | ||
|
4e06001fcb | ||
|
c9dd6cb722 | ||
|
e68127f05b | ||
|
5312a4b81d | ||
|
f1574c2f42 | ||
|
38d1a89a2c | ||
|
f9b549e095 | ||
|
d62badf629 | ||
|
a81d920c91 | ||
|
10284f5ae6 | ||
|
6defe40555 | ||
|
f086dd84c4 | ||
|
045b46ea28 | ||
|
36b5a8204e | ||
|
fcdafae8d3 | ||
|
7ad7d8fe2c | ||
|
2ce91bf170 | ||
|
3cffacf8fc | ||
|
da3ee1979a | ||
|
751d1f5b77 | ||
|
fbd3b09c78 | ||
|
fb7eaf0d7b | ||
|
3ce9929378 | ||
|
a7ddd72ef9 | ||
|
21c9fbe5ee | ||
|
45fb821840 | ||
|
09a2fd9ce2 | ||
|
aca021757f | ||
|
7f65647a0b | ||
|
812919f6af | ||
|
31d10eb085 | ||
|
3d9d488655 | ||
|
1eab83f91a | ||
|
342e11c27b | ||
|
462c9d9cc2 | ||
|
6b93408e4f | ||
|
8291c05432 | ||
|
18b56e7057 | ||
|
99d2852f8c | ||
|
9798a2f0ac | ||
|
5f7a7263c3 | ||
|
71ea40203d | ||
|
5aaa9f10e4 | ||
|
cf3ea57675 | ||
|
fe80017b0b | ||
|
daddf28343 | ||
|
36483fa725 | ||
|
c23c3a0ac3 | ||
|
110629ecfb | ||
|
840eac6e39 | ||
|
621ac7b903 | ||
|
2bdd804134 | ||
|
86c426f201 | ||
|
23d6e3a4be | ||
|
06de870e3f | ||
|
c77f57b50a | ||
|
df011ca6e2 | ||
|
3376ead7b5 | ||
|
736333bf45 | ||
|
a5c0a4ca9c | ||
|
8a243ef08e | ||
|
7ae404f97a | ||
|
667e69a3c6 | ||
|
bbeb9cc4e8 | ||
|
63c1d521d4 | ||
|
63e0edead7 | ||
|
3cc4d9a7c3 | ||
|
7ade29f1f8 | ||
|
721e57e874 | ||
|
a4b19428bb | ||
|
11b2a58e92 | ||
|
b99b7c9272 | ||
|
56ad7f8d5f | ||
|
821a27d77d | ||
|
0d75432b09 | ||
|
693d703b42 | ||
|
c625623299 | ||
|
e815a4feaf | ||
|
4febf1174f | ||
|
9704351e8e | ||
|
44aca7b8ad | ||
|
e2bc35e0b3 | ||
|
424fc76cad | ||
|
cfeff0e610 | ||
|
c5c470e6ec | ||
|
4780bb00a5 | ||
|
540afe043f | ||
|
bb240b5157 | ||
|
74fbdb9e3b | ||
|
3fe5213e43 | ||
|
0b07750580 | ||
|
1c3c514dfa | ||
|
2466a3a892 | ||
|
26e3a24354 | ||
|
2a29de09fc | ||
|
13b14ee5ad | ||
|
522b6f2994 | ||
|
02525259a1 | ||
|
642246664c | ||
|
2cdf28e928 | ||
|
918392e70f | ||
|
7079cf814e | ||
|
30becbd63d | ||
|
823ef93f89 | ||
|
b32d67f03d | ||
|
57327441a0 | ||
|
245f9233fc | ||
|
a8e8c0adf2 | ||
|
3e87f7c085 | ||
|
f8a1c24cca | ||
|
9c2a975b3c | ||
|
6c85e4ea6c | ||
|
ef84703240 | ||
|
9b126063b3 | ||
|
92bcb27d52 | ||
|
19d9393211 | ||
|
02160d547f | ||
|
523c689abb | ||
|
516a7db375 | ||
|
1f6665c4a7 | ||
|
d0041c5d85 | ||
|
ac0ab0af7c | ||
|
9c3ae8f70d | ||
|
611024d19f | ||
|
c338913066 | ||
|
d985da38ab | ||
|
5fc426be1c | ||
|
28e1cf0c92 | ||
|
9edfe06a3c | ||
|
d1207a5142 | ||
|
e2c61e5080 | ||
|
5a8bec2332 | ||
|
e95a9bf0fd | ||
|
c7c772d6f2 | ||
|
a7cc2111b8 | ||
|
f540de4447 | ||
|
bca584ff5e | ||
|
343ecf673b | ||
|
4acfbf894d | ||
|
ee950b94e2 | ||
|
e5c923ce11 | ||
|
d1c6feb36f | ||
|
d596568d78 | ||
|
f22fe04411 | ||
|
4efd2698e9 | ||
|
1fc853e5e7 | ||
|
d150c524ed | ||
|
114bf539c7 | ||
|
0f4008d545 | ||
|
8cec24b7b4 | ||
|
ad9b9a0f7b | ||
|
c89124b7c0 | ||
|
348ffb021f | ||
|
7d4d26e6f0 | ||
|
0850f7534a | ||
|
454bf1cbe0 | ||
|
a80f274b76 | ||
|
4aabda8557 | ||
|
af2a45e596 | ||
|
9cb97b123e | ||
|
51bc5688a0 | ||
|
67c7e6f7b8 | ||
|
49f54610cc | ||
|
6f163e3d7b | ||
|
c8a85f4c87 | ||
|
cf8bac5170 | ||
|
ea2093eb26 | ||
|
2fcfadb4f5 | ||
|
855a407f92 | ||
|
3801f213a8 | ||
|
027f7d8921 | ||
|
03bef50de5 | ||
|
0c9b6a3c59 | ||
|
1a0b595dcd | ||
|
a81052ed96 | ||
|
ed46dceab3 | ||
|
fdb1afcd50 | ||
|
143de0ca83 | ||
|
27e208b84d | ||
|
21905d7265 | ||
|
26d08cc602 | ||
|
c606ab69eb | ||
|
d056288d67 | ||
|
8f92c81ebd | ||
|
8f6df1fa78 | ||
|
4d384f006c | ||
|
7d0946bee1 | ||
|
4c0c84886b | ||
|
6d76da42e1 | ||
|
e29c3411d3 | ||
|
9905679b18 | ||
|
5b6a40fb0e | ||
|
3f3ccd46c6 | ||
|
054cab527c | ||
|
ebf126595a | ||
|
748b03e9c0 | ||
|
934a9da8db | ||
|
bdac73ce95 | ||
|
ce25ec0551 | ||
|
12c2f18f3b | ||
|
8444bc2a0f | ||
|
a5716ecb20 | ||
|
3605c20da2 | ||
|
6b0558e07d | ||
|
08ed73f47b | ||
|
ea54a476a4 | ||
|
5c3290a9de | ||
|
de9e98335d | ||
|
d10de62799 | ||
|
bd747ce4af | ||
|
1ae0c8d334 | ||
|
82f9014293 | ||
|
7a884e16cb | ||
|
f27187f468 | ||
|
fd5630b45c | ||
|
efb5bca6cc | ||
|
b7f3131ac8 | ||
|
ece34aec85 | ||
|
7daa1f1866 | ||
|
3548d6186b | ||
|
9264d711e6 | ||
|
c1ecde9821 | ||
|
ce78ea2a46 | ||
|
88ecce35e8 | ||
|
ba75150d36 | ||
|
6427c15c98 | ||
|
c4f0ba3f89 | ||
|
3e69c7670f | ||
|
d5c363173a | ||
|
fddf5d878a | ||
|
dfd2ef2854 | ||
|
679215afbf | ||
|
34b75f4706 | ||
|
d0c22ffa5b | ||
|
0ce85b3d22 | ||
|
463318d6e8 | ||
|
719d607331 | ||
|
5f053923e2 | ||
|
866a1da2da | ||
|
14ee3dc323 | ||
|
305f6124d4 | ||
|
e425da62de | ||
|
6c4a74f67e | ||
|
4d9bcf27a8 | ||
|
50c7b3cd58 | ||
|
21b132347d | ||
|
17ffbcef2e | ||
|
f9829ca9f6 | ||
|
a6d9a74902 | ||
|
20e2e78607 | ||
|
00bb90a5ef | ||
|
57350623b6 | ||
|
2b46f72b18 | ||
|
1502cb12e1 | ||
|
c77f5e912d | ||
|
35c9aadc34 | ||
|
dbad89ddf6 | ||
|
23c618498b | ||
|
8a69a46a6c | ||
|
e3ecd8d90b | ||
|
05dce81b01 | ||
|
790072cb11 | ||
|
adf499e8bd | ||
|
04328e6e30 | ||
|
43989cd7fd | ||
|
5e119f2478 | ||
|
8f968c7be2 | ||
|
06c2fab604 | ||
|
aa9bb779bb | ||
|
a5801aa78e | ||
|
97d5c8bff8 | ||
|
619659372c | ||
|
e22cbf697e | ||
|
bdc68939fb | ||
|
93f1e6d330 | ||
|
9814147718 | ||
|
af68a70285 | ||
|
437753d80c | ||
|
6fb932d8cc | ||
|
d992c3caa5 | ||
|
769caa0789 | ||
|
ae361aca86 | ||
|
d01e3d8d9e | ||
|
49cbccdd3f | ||
|
8ca8f1340c | ||
|
50297bd752 | ||
|
9b9a7d8baa | ||
|
52b79074ce | ||
|
24affeb7e1 | ||
|
dd8838213d | ||
|
67167e345d | ||
|
26227372e3 | ||
|
045d7116f4 | ||
|
be5827b6e7 | ||
|
7a3ea24b51 | ||
|
b9f92f36bc | ||
|
b181a4bfb1 | ||
|
f455ea7dc9 | ||
|
5c704db5e1 | ||
|
28f350310d | ||
|
3aeb16e92d | ||
|
9dd12fa0af | ||
|
73a0aac054 | ||
|
bae090fcff | ||
|
72856fe8cd | ||
|
1b420e0e7c | ||
|
afb297caee | ||
|
2e64c8e7bc | ||
|
3edae636f9 | ||
|
185bb8af9a | ||
|
39560cbe68 | ||
|
01e3574ea2 | ||
|
486ed00cfe | ||
|
151ed6057f | ||
|
f67135ca25 | ||
|
5bac9640f9 | ||
|
3d8ac780e2 | ||
|
51196589e2 | ||
|
0ed7a79cbc | ||
|
4e790786bb | ||
|
5654877f78 | ||
|
a1e086943a | ||
|
1169ba95f0 | ||
|
1354418055 | ||
|
414ea21e24 | ||
|
a5235cf098 | ||
|
16587f5357 | ||
|
9a13e426cc | ||
|
f38c82258a | ||
|
530bdadcbe | ||
|
1ec8142197 | ||
|
24e0bc7209 | ||
|
88b41be334 | ||
|
b595f70996 | ||
|
a4b1f32cdf | ||
|
30165730d8 | ||
|
ff103774e6 | ||
|
f76db005a8 | ||
|
4d31c9cfff | ||
|
1dab51b3ac | ||
|
1cc446e91b | ||
|
58e14084c2 | ||
|
dcbcbc4065 | ||
|
cafe0fd75e | ||
|
915438c6ea | ||
|
53c2cc7d4b | ||
|
3fdbab8395 | ||
|
753c7aa54a | ||
|
fb873a1847 | ||
|
f6238d1f84 | ||
|
26b756a164 | ||
|
38ad0cc850 | ||
|
6eaddc4352 | ||
|
74d6a72f02 | ||
|
21b2e8833c | ||
|
2877ca7efe | ||
|
a228573797 | ||
|
f31cebc32c | ||
|
1fe3ac8f61 | ||
|
20951f66bf | ||
|
6011930cb0 | ||
|
a68010a153 | ||
|
e3e500d8c2 | ||
|
959880045d | ||
|
704899c217 | ||
|
0dcaf1ea0e | ||
|
bd126f0e8f | ||
|
9e0bac7652 | ||
|
0415aa8563 | ||
|
ed15d90624 | ||
|
b4b8452ecd | ||
|
fd89740e89 | ||
|
28c4610ed5 | ||
|
2b331055b9 | ||
|
368e6e1002 | ||
|
9a7f62c35e | ||
|
45a52767bd | ||
|
888eaa3d8c | ||
|
e583ba068d | ||
|
c97945a001 | ||
|
7b3e550c25 | ||
|
63459a582a | ||
|
1917819470 | ||
|
4581a29d2d | ||
|
987b309827 | ||
|
4a9150f9c8 | ||
|
9cb9c214f6 | ||
|
5a96f6be9c | ||
|
bc86e2c68f | ||
|
6df6345a73 | ||
|
eb8a028c10 | ||
|
3769cf4948 | ||
|
4aaf7903fb | ||
|
7716ac56a5 | ||
|
cd83a3c3db | ||
|
5267017927 | ||
|
7d9c68a4de | ||
|
6b362ffce5 | ||
|
1ecc9552dc | ||
|
911bdf159b | ||
|
4f5ceafdcb | ||
|
cffd3ee7c4 | ||
|
e593d8f008 | ||
|
f2e9222d6e | ||
|
b7b023c234 | ||
|
bb499f2fb6 | ||
|
6d979490a5 | ||
|
ee29e26938 | ||
|
58072c4313 | ||
|
bff010281d | ||
|
a574cf21c5 | ||
|
1dc2721af8 | ||
|
bf1e895f19 | ||
|
c7c0e05cf0 | ||
|
a14f68f247 | ||
|
759c8b5299 | ||
|
b867e68cef | ||
|
5ce5f94ea2 | ||
|
e2c7efa04b | ||
|
fabe27dcb5 | ||
|
a84d0043c6 | ||
|
d76fec130d | ||
|
f17fb6a086 | ||
|
01598df990 | ||
|
3049550ceb | ||
|
bbd230a11d | ||
|
9064852f8e | ||
|
8b1632ebe7 | ||
|
0cc3981cd9 | ||
|
ca351a69c3 | ||
|
410cab65fd | ||
|
9b0668e1a2 | ||
|
7962c237dd | ||
|
f3654dd181 | ||
|
6fb39fe84b | ||
|
867be82e3a | ||
|
36435f9c0f | ||
|
2dfc97eea1 | ||
|
85f726f26a | ||
|
b8a141538a | ||
|
5f88717aa8 | ||
|
2301d67573 | ||
|
a9e11379a1 | ||
|
128995861e | ||
|
1d6704b6a9 | ||
|
3a582e90c0 | ||
|
f385722728 | ||
|
d480da3f17 | ||
|
5df61649d9 | ||
|
d399635e06 | ||
|
b6241cc22d | ||
|
55f8e9befc | ||
|
aff6c6037d | ||
|
664785bce9 | ||
|
1c8be62219 | ||
|
344ec96065 | ||
|
080b9373ff | ||
|
53630547cf | ||
|
20ea7ff9d7 | ||
|
80cf014b43 | ||
|
052a4b0f2f | ||
|
1aa3e8d8f6 | ||
|
4383c2b97a | ||
|
385112a8b3 | ||
|
0fce57ac76 | ||
|
0e808f5d5a | ||
|
7ed43ac2e8 | ||
|
8c3de19796 | ||
|
8f5c320767 | ||
|
9ac8b5637a | ||
|
d7f50f5f27 | ||
|
cb702cedd1 | ||
|
2383b3b5f2 | ||
|
ceecd70a6b | ||
|
8f05d8f9d5 | ||
|
6fb2eb9c0c | ||
|
d06d0bc30a | ||
|
d6c9911e4d | ||
|
70e8d9f69c | ||
|
b905c12598 | ||
|
bab7e01267 | ||
|
6886d3e782 | ||
|
8edcec6652 | ||
|
611c1e0e6f | ||
|
35891ce060 | ||
|
b9a9ef0453 | ||
|
8bbb50ba61 | ||
|
5b47d4f175 | ||
|
21cb83e8c9 | ||
|
01f12b1adf | ||
|
7ec0705909 | ||
|
964a710a54 | ||
|
9f9cebfb6c | ||
|
66cf613e7b | ||
|
6df55f5e46 | ||
|
f5acd489cb | ||
|
d3f6d73cf8 | ||
|
aa4ebcb98d | ||
|
f4c049b60e | ||
|
94bccc31db | ||
|
c79c41ca66 | ||
|
fa1837fe14 | ||
|
93f4047227 | ||
|
ae5dcdf0e6 | ||
|
fe164e5138 | ||
|
05ae76ec1d | ||
|
85e5952bfe | ||
|
405fff1bad | ||
|
5a86eeac8c | ||
|
aaa7e220f7 | ||
|
282eb70450 | ||
|
3f5a4243c9 | ||
|
9b9fb7c234 | ||
|
6186e29350 | ||
|
caaff22c06 | ||
|
e1e57f73b3 | ||
|
e0724c9d18 | ||
|
892a61dd37 | ||
|
af4efc1d0c | ||
|
d402f19c82 | ||
|
5f79bebb29 | ||
|
fc6f3208b2 | ||
|
c60cc91708 | ||
|
0f7730c502 | ||
|
638104abce | ||
|
e4c937788a | ||
|
a7c3dae3a1 | ||
|
56e770d6b7 | ||
|
0c59640539 | ||
|
ebfb098877 | ||
|
e92b5a2c94 | ||
|
e3a3ef96f1 | ||
|
0c3f3a52e4 | ||
|
cac85ffa8b | ||
|
bc4103a66e | ||
|
160c7ecbad | ||
|
d29e4f03d9 | ||
|
b598e25cad | ||
|
ef807ad05c | ||
|
75ff83b629 | ||
|
9f98d38391 | ||
|
cf24909108 | ||
|
1599228964 | ||
|
54b25889d2 | ||
|
0ab495989d | ||
|
0bfca7f379 | ||
|
d87f50a85e | ||
|
94d07a6abd | ||
|
fc9d18d36f | ||
|
a926f0f996 | ||
|
a824bcf272 | ||
|
5dc4c9e92d | ||
|
824b2f9451 | ||
|
6e76ef7230 | ||
|
dab0267b99 | ||
|
0c3eefe809 | ||
|
1351c353d3 | ||
|
5f60853843 | ||
|
d8c159fbfd | ||
|
3095762276 | ||
|
186af62077 | ||
|
8f3c90b718 | ||
|
f371aaacb4 | ||
|
51148dfb8e | ||
|
d089223aa3 | ||
|
87c6ba105c | ||
|
a35b6da53a | ||
|
110904ad7e | ||
|
a068a1ce8d | ||
|
ed0fb5f1dc | ||
|
f1c2a09edf | ||
|
1f7d25a152 | ||
|
4d2912d600 | ||
|
f481b72d90 | ||
|
7fb7ed97e9 | ||
|
b4bcb03448 | ||
|
6e2e9a9abd | ||
|
42b2b3947f | ||
|
ef5941b3d8 | ||
|
936284fe41 | ||
|
47cfa2bd4c | ||
|
a693d65e54 | ||
|
9a713b1149 | ||
|
0ea0ed4778 | ||
|
ce72acc2c6 | ||
|
ed9cd416f1 | ||
|
2beacbf5e9 | ||
|
f8300041bd | ||
|
8dcb2ef2ee | ||
|
d5f0a2b396 | ||
|
829fe079bc | ||
|
6a9f0d173e | ||
|
8f40c2b250 | ||
|
8dfed6e742 | ||
|
97138ef264 | ||
|
7f42651bb1 | ||
|
6a8dabe2ae | ||
|
5de6e36941 | ||
|
8b26aa07de | ||
|
e771b7e4ac | ||
|
3fe4f9bf40 | ||
|
f63cfda54f | ||
|
36060e25b0 | ||
|
dccca5634f | ||
|
699c00400a | ||
|
2b3a3838ee | ||
|
f0a3fd5400 | ||
|
1553df7c3e | ||
|
4b2452426b | ||
|
8a8578cebb | ||
|
4a5fc54878 | ||
|
8677ac53d2 | ||
|
08314c6f4f | ||
|
ccee086514 | ||
|
2f4ed3b275 | ||
|
9891e5609d | ||
|
601a6d1cc5 | ||
|
5896402ea4 | ||
|
d1274ec7b9 | ||
|
7fcfab5e21 | ||
|
09cb4267da | ||
|
cd12eca16a | ||
|
ba97061f8e | ||
|
d51bad0347 | ||
|
3a6fb21d40 | ||
|
9e99b53208 | ||
|
02b0f5f67e | ||
|
00a71a011f | ||
|
30438673e3 | ||
|
f95c44324e | ||
|
6302278380 | ||
|
5a751e2699 | ||
|
92340b2ae8 | ||
|
7c630a2d4f | ||
|
431aa4766e | ||
|
1adbd752e1 | ||
|
a4d52e98b7 | ||
|
a1bc5f4446 | ||
|
e22babff50 | ||
|
c033876ec0 | ||
|
728d6d7d3a | ||
|
5364b91a46 | ||
|
f420fdcfe2 | ||
|
90fa618ee0 | ||
|
18ede604de | ||
|
2667e31153 | ||
|
171c9b26e3 | ||
|
8ab3e5a672 | ||
|
049d5d2cca | ||
|
7c603b9907 | ||
|
6af4efb2f9 | ||
|
5b7745fa47 | ||
|
01a88a5b8b | ||
|
635f9b534e | ||
|
1553a6f2f2 | ||
|
d73361fed5 | ||
|
a5b317c973 | ||
|
d3a5c14ab4 | ||
|
9df4bbf74c | ||
|
acc4028ecd | ||
|
e3dbaff33f | ||
|
91ae025ee2 | ||
|
6f45003cae | ||
|
cab1dfd13b | ||
|
665bb65698 | ||
|
74587a6b43 | ||
|
32b26030fe | ||
|
714e26a551 | ||
|
a61aefe37f | ||
|
349ac76e9a | ||
|
4f3f29fe0a | ||
|
bb4f30c0d8 | ||
|
047c8f9bd7 | ||
|
fd9ac68eb7 | ||
|
a6e369b062 | ||
|
f9c7ec45b8 | ||
|
64b2a65697 | ||
|
252b2c1c34 | ||
|
800e14138e | ||
|
a46cc43fed | ||
|
944b29b835 | ||
|
82898ed9df | ||
|
9007386bc8 | ||
|
e924448838 | ||
|
b0b7a18d2d | ||
|
a45376e42f | ||
|
daa820fd8b | ||
|
fbf9b66e03 | ||
|
441534fce3 | ||
|
e328b2a64d | ||
|
69b0c112e7 | ||
|
06cdbdacb2 | ||
|
366f5f1fd0 | ||
|
86181cbde1 | ||
|
775462816e | ||
|
b1210f9b69 | ||
|
37a911e683 | ||
|
3b6b0309b1 | ||
|
56089cb7e4 | ||
|
16ca2afc73 | ||
|
9fd7ddfcc5 | ||
|
68a8e04526 | ||
|
2bdb21c40b | ||
|
b5cee9c500 | ||
|
edb22d6af1 | ||
|
da266dd05c | ||
|
1e4d96486a | ||
|
54946ca676 | ||
|
2b6484e38e | ||
|
eb2aa24703 | ||
|
3d9d1df8d1 | ||
|
e1c77fa8f1 | ||
|
d329818b2a | ||
|
bd5dd71130 | ||
|
aa4497caf2 | ||
|
c7195026a0 | ||
|
6bc69f3752 | ||
|
c9bd8aeb25 | ||
|
ac153e89cc | ||
|
86f964c3dd | ||
|
c280423d85 | ||
|
e03cdae726 | ||
|
51b30d5943 | ||
|
65da7c0105 | ||
|
762b5367f7 | ||
|
62ac23612f | ||
|
621b9ba223 | ||
|
82e547d3d6 | ||
|
3a9dd8d618 | ||
|
26f10d1c2b | ||
|
cea0b70615 | ||
|
8f41f92614 | ||
|
4fe82ce139 | ||
|
51dbcf35ff | ||
|
0debb1231a | ||
|
bbce9725f5 | ||
|
8ce31375f2 | ||
|
d4ffadcd7c | ||
|
372b0e766c | ||
|
c6de9c117b | ||
|
af0cf516b0 | ||
|
c20c9f8034 | ||
|
e722a0b9d9 | ||
|
8c92ffaa71 | ||
|
6bd20f9d73 | ||
|
7a0afd5cfe | ||
|
7fbab51529 | ||
|
dad0803d48 | ||
|
3f7406ab30 | ||
|
9312e5d6db | ||
|
1d4874621e | ||
|
7d1ab59731 | ||
|
3512d53ddd | ||
|
a275e42188 | ||
|
1681cdd7f1 | ||
|
690df84c1c | ||
|
8eca8095e4 | ||
|
db2995da83 | ||
|
f93107bcae | ||
|
ace9a61933 | ||
|
97ea5edb3d | ||
|
d0fd5a294d | ||
|
af2e6a4295 | ||
|
6397b59b65 | ||
|
fe3f379193 | ||
|
44b283fef0 | ||
|
5aedd93815 | ||
|
742e672095 | ||
|
fc0322d338 | ||
|
dd0d47090a | ||
|
fdfc424e32 | ||
|
4d1c976da4 | ||
|
9d43a2054e | ||
|
970a937c34 | ||
|
8d5e66bc14 | ||
|
ce500334d8 | ||
|
f50b6e1d9b | ||
|
292cc8c93e | ||
|
5aee9bc480 | ||
|
4ffb82ac32 | ||
|
58b5a13da5 | ||
|
b1b937339c | ||
|
0fcac944f3 | ||
|
03cd51b0b6 | ||
|
63a8541c13 | ||
|
4a32c38f67 | ||
|
5d0c8a9857 | ||
|
9ca0f57c31 | ||
|
7fc06f31e1 | ||
|
0edfce279c | ||
|
5c3e4ed256 | ||
|
5ea82140ee | ||
|
4c77c8865a | ||
|
2a9e9415fa | ||
|
45dae01189 | ||
|
f21f85abdb | ||
|
192bb0de73 | ||
|
e8d2bf7311 | ||
|
ff9d0a5c41 | ||
|
5559999404 | ||
|
9e8c78dbf8 | ||
|
ca93de9778 | ||
|
ebfa00d564 | ||
|
492b704acd | ||
|
fc253b5bd3 | ||
|
335f8251c4 | ||
|
52000d0bbb | ||
|
e9db9d29b8 | ||
|
fcbe4b8952 | ||
|
56b8d9a67c | ||
|
66eb448aa2 | ||
|
1f6b7faabc | ||
|
10acf8094e | ||
|
3d940df52b | ||
|
48acff7892 | ||
|
3ce501311b | ||
|
5e3012152c | ||
|
7174c830f7 | ||
|
74f4b82837 | ||
|
4b6cc55fd6 | ||
|
33ed3832af | ||
|
28825fa22a | ||
|
b5177a3fe4 | ||
|
6d49dd8f05 | ||
|
938bafd72a | ||
|
d0c7b7d2b7 | ||
|
d9a149b1cc | ||
|
22d9535cee | ||
|
e9b885213e | ||
|
17a6d5c37b | ||
|
76a3435748 | ||
|
f3cfdd41c8 | ||
|
1df7d9c158 | ||
|
6f793e7d30 | ||
|
4a39ae8916 | ||
|
ecc4fd1e37 | ||
|
a26c4b2ee7 | ||
|
07b3c46cb6 | ||
|
27579129e9 | ||
|
d7561efabf | ||
|
04ffef0afc | ||
|
61c2fbda5b | ||
|
34a8dbd28e | ||
|
c1094350b3 | ||
|
44314d0d50 | ||
|
d4aeebb808 | ||
|
0357e1513d | ||
|
4bfedab037 | ||
|
556469d8ba | ||
|
91bbbdf8a6 | ||
|
7242785858 | ||
|
833adb3bb1 | ||
|
e2531c0c29 | ||
|
490317bb9f | ||
|
4df9aff134 | ||
|
8ffb0bb9f0 | ||
|
7143fe6b26 | ||
|
c6ec726bd8 | ||
|
ad2e39c11d | ||
|
a34d639546 | ||
|
1b3947754a | ||
|
f637c8e680 | ||
|
9551c623db | ||
|
59a6c6e6c9 | ||
|
9ad7df7d60 | ||
|
c175803628 | ||
|
64e8d107f0 | ||
|
93add80831 | ||
|
b2162f4c83 | ||
|
69c18e92a0 | ||
|
63b53115ce | ||
|
f14f5c6740 | ||
|
3f4d464b9b | ||
|
b8595cfb2a | ||
|
d2121dd382 | ||
|
e19f4ed3fa | ||
|
07cbd27aaa | ||
|
6d9a4c4d6f | ||
|
b254accad1 | ||
|
302adc47d6 | ||
|
93fe555876 | ||
|
9441da1902 | ||
|
fa0e662ad9 | ||
|
2bcf7f2fed | ||
|
7e9dfde99b | ||
|
65653bad15 | ||
|
a14865055c | ||
|
63684edb71 | ||
|
a19f8994da | ||
|
fda7f3a124 | ||
|
fe25fb0c68 | ||
|
536d412453 | ||
|
4849c8132b | ||
|
ddbbd35e11 | ||
|
326330ac79 | ||
|
69cb65e162 | ||
|
63d063a1db | ||
|
c0d4a6b3c1 | ||
|
2304dc6eaa | ||
|
ead7e5c1bf | ||
|
db74b98be8 | ||
|
663e452b5e | ||
|
2c08b4c50e | ||
|
73c6d13263 | ||
|
a44c9d41d7 | ||
|
5ec87fd62f | ||
|
72d490511c | ||
|
8f37ed893c | ||
|
1cb08da2e2 | ||
|
51e247cc98 | ||
|
8f5617e6ff | ||
|
91916eeab9 | ||
|
164d6a95e6 | ||
|
20b7206cb2 | ||
|
79aa7172fb | ||
|
197daf705d | ||
|
6056c203bd | ||
|
460ad82472 | ||
|
4547ef2757 | ||
|
76d321e2d1 | ||
|
d36d6728e1 | ||
|
3ec9ba300d | ||
|
0459ba31a6 | ||
|
e6c9b3243c | ||
|
2d2fb2f198 | ||
|
88becfa938 | ||
|
8de8e59e06 | ||
|
5fb99fe76f | ||
|
1176111c0d | ||
|
02b2d73690 | ||
|
c3f482c546 | ||
|
39b68c98df | ||
|
702fe1fccf | ||
|
8c2d31e9f3 | ||
|
22589ec364 | ||
|
ad28a8de8b | ||
|
639cee3157 | ||
|
32742e5755 | ||
|
2a32fcda98 | ||
|
66eea1c2c4 | ||
|
fa4e86eee7 | ||
|
5a52b2251a | ||
|
69e9c9b2de | ||
|
9edd8e7d41 | ||
|
363f292868 | ||
|
465b35f3ca | ||
|
5a23b3de1d | ||
|
27c6aa1349 | ||
|
c4c97ccbd6 | ||
|
bf99a7849d | ||
|
77d95b6731 | ||
|
438a907d06 | ||
|
802c95f5b7 | ||
|
8a5750ee11 | ||
|
1c911c5ef2 | ||
|
adad970da3 | ||
|
b299c11105 | ||
|
f0e2ef329d | ||
|
d55a4efc0f | ||
|
ae6db164e2 | ||
|
2a44fbe1a4 | ||
|
5c649b815c | ||
|
965079dde9 | ||
|
00924b9de2 | ||
|
e3bd1146c7 | ||
|
d2da899a2e | ||
|
ddb8d0503e | ||
|
0f48627c76 | ||
|
b883a5da0c | ||
|
73f6b0b14e | ||
|
514d2dbb87 | ||
|
e138d10b74 |
@@ -1,262 +0,0 @@
|
|||||||
0.1.5-3
|
|
||||||
-------
|
|
||||||
|
|
||||||
xxxStdDialogButtonSizer pulldown menu with standard buttons.
|
|
||||||
|
|
||||||
Some fixes for selecting tools inside toolbar with test window open
|
|
||||||
(whole toolbar is selected).
|
|
||||||
|
|
||||||
Toolbars can be added inside windows.
|
|
||||||
|
|
||||||
0.1.5-2
|
|
||||||
-------
|
|
||||||
|
|
||||||
Using wx.GetDefaultPyEncoding/wx.SetDefaultPyEncoding for changing active encoding.
|
|
||||||
|
|
||||||
Fixed pasting siblings (Ctrl key pressed while pasting).
|
|
||||||
|
|
||||||
Dealed with ascii build (Python does not recognize 'ascii' as valid encoding).
|
|
||||||
If encoding is not specified it is not written in XRC. Will add more
|
|
||||||
customization in the future.
|
|
||||||
|
|
||||||
Changed to use SimpleTool instead or Toggle tool (does not work on Win32).
|
|
||||||
|
|
||||||
0.1.5-1
|
|
||||||
-------
|
|
||||||
|
|
||||||
Added wxWizard, wxWizardPageSimple (only from pull-down menu).
|
|
||||||
|
|
||||||
Hide command for test window.
|
|
||||||
|
|
||||||
Replacing classes works better.
|
|
||||||
|
|
||||||
Added Locate tool.
|
|
||||||
|
|
||||||
0.1.4-1
|
|
||||||
-------
|
|
||||||
|
|
||||||
Edit->Locate command (Ctrl-L) for quick selection of items.
|
|
||||||
Works with event-handling controls (buttons, text fields) but
|
|
||||||
not with labels/sizers.
|
|
||||||
|
|
||||||
Some improvements: relative paths for files supplied as command-
|
|
||||||
line argument work correctly, notebook panels are highlighted
|
|
||||||
better.
|
|
||||||
|
|
||||||
0.1.2-1
|
|
||||||
_______
|
|
||||||
|
|
||||||
Added support for wxGridBagSizer (supported in wxPython 2.5).
|
|
||||||
|
|
||||||
0.1.1-5
|
|
||||||
-------
|
|
||||||
|
|
||||||
Added subclass attribute.
|
|
||||||
|
|
||||||
0.1.1-4
|
|
||||||
-------
|
|
||||||
|
|
||||||
Fixed problems with wxStaticBitmap (stock_id attribute, icon type
|
|
||||||
switching).
|
|
||||||
|
|
||||||
Changed some dimensions in properties panel elements.
|
|
||||||
|
|
||||||
0.1.1-3
|
|
||||||
-------
|
|
||||||
|
|
||||||
Sizes of some controls were not normal on wxMSW. Fixed.
|
|
||||||
|
|
||||||
Some changes to test window code to make it resize better and to
|
|
||||||
have focus control with sawfish for all types of windows.
|
|
||||||
|
|
||||||
0.1.1-2
|
|
||||||
-------
|
|
||||||
|
|
||||||
Bugs with currentEncoding and frame testing fixed.
|
|
||||||
|
|
||||||
Some required parameters are set to default if missing.
|
|
||||||
|
|
||||||
Unsupported classes are tolerated, with warning message.
|
|
||||||
|
|
||||||
wxScrolledWindow added (to 'control' pulldown menu, not yet to the
|
|
||||||
tool palette).
|
|
||||||
|
|
||||||
Multi-line editing for labels and some values (wxTextCtrl,
|
|
||||||
wxHtmlWindow).
|
|
||||||
|
|
||||||
0.1.1-1
|
|
||||||
-------
|
|
||||||
|
|
||||||
Changed internationalization support. '-i' option removed, default
|
|
||||||
encoding is used (should be defined in sitecustomize.py, or 'ascii' by
|
|
||||||
default). When XRC file is opened with encoding specified,
|
|
||||||
translations are not used.
|
|
||||||
|
|
||||||
0.1.1
|
|
||||||
-----
|
|
||||||
|
|
||||||
Replace command added (not quite finished yet).
|
|
||||||
|
|
||||||
0.1.0
|
|
||||||
-----
|
|
||||||
|
|
||||||
Finally implemented tools panel for almost all controls (except
|
|
||||||
wxHtmlWindow, wxCalendarCtrl and wxGenericDirCtrl - they are too
|
|
||||||
rarely used).
|
|
||||||
|
|
||||||
Changed some sizes in panel to better work with different fonts.
|
|
||||||
|
|
||||||
Fixed double-refreshing after Ctrl+R.
|
|
||||||
|
|
||||||
Maybe something else that I've forgot. It's been a looong day... :)
|
|
||||||
|
|
||||||
|
|
||||||
0.0.9-6
|
|
||||||
-------
|
|
||||||
|
|
||||||
Added dialog unit support.
|
|
||||||
|
|
||||||
Dealing with non-specified required values (set to defaults, if exist).
|
|
||||||
|
|
||||||
Added 'minsize' parameter of sizeritem.
|
|
||||||
|
|
||||||
Added '-i' option to turn off translations and use international characters.
|
|
||||||
|
|
||||||
0.0.9-5
|
|
||||||
-------
|
|
||||||
|
|
||||||
Mac platform-specific checks.
|
|
||||||
|
|
||||||
0.0.9-4
|
|
||||||
-------
|
|
||||||
|
|
||||||
Implemented standard bitmap selection.
|
|
||||||
|
|
||||||
Fixed a bug in FlexGridSizer code.
|
|
||||||
|
|
||||||
0.0.9-3
|
|
||||||
-------
|
|
||||||
|
|
||||||
File browsing (for bitmaps/icons, etc.) had a small problem when current
|
|
||||||
file was not saved yet.
|
|
||||||
|
|
||||||
0.0.9-2
|
|
||||||
-------
|
|
||||||
|
|
||||||
Small bug fix for initial don't panic message.
|
|
||||||
|
|
||||||
0.0.9-1
|
|
||||||
-------
|
|
||||||
|
|
||||||
Changed program structure, reduced use of global variables (grouped in
|
|
||||||
module 'globals', which creates an instanse 'g' of class Globals.
|
|
||||||
|
|
||||||
First version of undo/redo working!
|
|
||||||
|
|
||||||
Support for toolbars inside panels and frames.
|
|
||||||
|
|
||||||
Added 'container' submenu for creating Panel, Notebook and ToolBar objects.
|
|
||||||
|
|
||||||
wxMSW-only: added code to switch focus back to main window when test
|
|
||||||
window is updated.
|
|
||||||
|
|
||||||
0.0.8-2
|
|
||||||
-------
|
|
||||||
|
|
||||||
Fixed unicode problem for unicode build.
|
|
||||||
|
|
||||||
0.0.8-1
|
|
||||||
-------
|
|
||||||
|
|
||||||
Using WX_2_4_BRANCH.
|
|
||||||
|
|
||||||
Added new controls: wxSpinCtrl, wxGenericDirCtrl, unknown (custom
|
|
||||||
control), improved wxXRC format suppor (menu styles, etc.).
|
|
||||||
|
|
||||||
Some I18N support: parsing "encoding" attribute in XML header, later
|
|
||||||
it can be modified in "properties" panel for "XML tree".
|
|
||||||
|
|
||||||
UNIX note: currently XML writing for non-ascii chars works only if
|
|
||||||
sys.getdefaultencoding() returns good value. To do this, one has to
|
|
||||||
put following lines to "sitecustomize.py" file:
|
|
||||||
|
|
||||||
# Start code segment
|
|
||||||
import sys
|
|
||||||
sys.setdefaultencoding('iso-8859-1') # or whatever
|
|
||||||
# End code segment
|
|
||||||
|
|
||||||
0.0.7
|
|
||||||
-----
|
|
||||||
|
|
||||||
Some command-line arguments.
|
|
||||||
|
|
||||||
"Test window" command and toolbar button.
|
|
||||||
|
|
||||||
New panel interphace (wxHTMLWindow is not used anymore).
|
|
||||||
|
|
||||||
Toggling between embedded and detached panel.
|
|
||||||
|
|
||||||
Cache for already used windows.
|
|
||||||
|
|
||||||
Current top-level control is bold, if test window shown.
|
|
||||||
|
|
||||||
Undo/redo broken.
|
|
||||||
|
|
||||||
CheckListBox does not work unless wxXRC source fixed (in both wxPytnon and
|
|
||||||
wxWin):
|
|
||||||
|
|
||||||
contrib/src/xrc/xmlrsall.cpp
|
|
||||||
45,46c45,46
|
|
||||||
< AddHandler(new wxListCtrlXmlHandler);
|
|
||||||
< #if CHECKLISTBOX
|
|
||||||
---
|
|
||||||
> AddHandler(new wxListCtrlXmlHandler);
|
|
||||||
> #if wxUSE_CHECKLISTBOX
|
|
||||||
|
|
||||||
This is fixed in CVS.
|
|
||||||
|
|
||||||
0.0.6
|
|
||||||
-----
|
|
||||||
|
|
||||||
Toolbar, bitmap, icon support (no display yet).
|
|
||||||
|
|
||||||
Changed parameter objects, added support for multiple parameters (like
|
|
||||||
`growablecols').
|
|
||||||
|
|
||||||
Fixed double-clicking problem with tree control on Windows.
|
|
||||||
|
|
||||||
Some performance improovements.
|
|
||||||
|
|
||||||
|
|
||||||
0.0.5
|
|
||||||
-----
|
|
||||||
|
|
||||||
Added notebook with properties page and style page. Fixed some problems
|
|
||||||
on Windows.
|
|
||||||
|
|
||||||
|
|
||||||
0.0.4
|
|
||||||
-----
|
|
||||||
|
|
||||||
Some fixes suggested by RD
|
|
||||||
|
|
||||||
|
|
||||||
0.0.3
|
|
||||||
-----
|
|
||||||
|
|
||||||
Faster preview window refresh.
|
|
||||||
|
|
||||||
Cut/Paste works better.
|
|
||||||
|
|
||||||
Some tree icons.
|
|
||||||
|
|
||||||
Tree item names.
|
|
||||||
|
|
||||||
Bugfixes.
|
|
||||||
|
|
||||||
|
|
||||||
0.0.2
|
|
||||||
-----
|
|
||||||
|
|
||||||
The first release.
|
|
||||||
|
|
@@ -1,68 +0,0 @@
|
|||||||
********************************************************************************
|
|
||||||
|
|
||||||
XRCed README
|
|
||||||
|
|
||||||
********************************************************************************
|
|
||||||
|
|
||||||
System requirements
|
|
||||||
-------------------
|
|
||||||
|
|
||||||
XRCed requires wxWindows and wxPython greater or equal to 2.3.3, and
|
|
||||||
Python 2.2 or newer (it may work with earlier version, but was not tested).
|
|
||||||
|
|
||||||
wxPython must be compiled with XRC support.
|
|
||||||
|
|
||||||
|
|
||||||
Short manual
|
|
||||||
------------
|
|
||||||
|
|
||||||
XRCed's idea is very straightforward: it is a visual tool for editing an XML
|
|
||||||
file conforming to XRC format. Every operation performed in XRCed has direct
|
|
||||||
correspondence to XML structure. So it is not really a usual point-and-click
|
|
||||||
GUI builder, but don't let that scare you.
|
|
||||||
|
|
||||||
To start xrced, change to the directory where you installed it and run
|
|
||||||
"python2.2 xrced.py".
|
|
||||||
|
|
||||||
On UNIX you can edit wrapper script "xrced.sh" to point to your installation
|
|
||||||
directory.
|
|
||||||
|
|
||||||
To create an object, first you should select some object in the tree (or the
|
|
||||||
root item if it's empty) then press the right mouse button and select an
|
|
||||||
appropriate command. The pulldown menu is context-dependent on the selected
|
|
||||||
object.
|
|
||||||
|
|
||||||
XRCed tries to guess if new object should be added as a next sibling or a
|
|
||||||
child of current object, depending on the possibility of the object to have
|
|
||||||
child objects and expanded state (if tree item is collapsed, new object will
|
|
||||||
be sibling). You can change this behavior to create siblings by pressing and
|
|
||||||
holding the Shift and Control keys before clicking the mouse.
|
|
||||||
|
|
||||||
Pressed Control key while pressing right button makes next item a sibling of
|
|
||||||
selected item regardless of its expanded state.
|
|
||||||
|
|
||||||
Pressed Shift key changes the place for inserting new child to be before
|
|
||||||
selected child, not after as by default.
|
|
||||||
|
|
||||||
Panel on the right contains object properties. Properties which are optional
|
|
||||||
should be "checked" first. This panel can be made separate by unchecking
|
|
||||||
"Embed Panel" in View menu.
|
|
||||||
|
|
||||||
All properties can be edited as text, and some are supplied with special
|
|
||||||
editing controls.
|
|
||||||
|
|
||||||
The names of the properties are exactly as in XRC file, and it's usually not
|
|
||||||
hard to guess what they do. XML ID is the name of the window, and must be
|
|
||||||
present for top-level windows (though this is not enforced by XRCed).
|
|
||||||
|
|
||||||
To display the preview window double-click a top-level object (you should
|
|
||||||
assign an XMLID to it first), press "Test" toolbar button or select command
|
|
||||||
from View menu, or press F5. After that, if you select a child object, it
|
|
||||||
becomes highlighted, and if you change it, preview is updated when you select
|
|
||||||
another item or press Ctrl-R (refresh). To turn off automatic update, toggle
|
|
||||||
"View->Auto-refresh" or toolbar auto-refresh button (to the right of the
|
|
||||||
refresh button).
|
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
Copyright 2001-2003 Roman Rolinsky <rollrom@xrced.sourceforge.net>
|
|
@@ -1,29 +0,0 @@
|
|||||||
TODO for XRCed
|
|
||||||
==============
|
|
||||||
|
|
||||||
- better help
|
|
||||||
|
|
||||||
+ undo/redo
|
|
||||||
|
|
||||||
+ tree icons
|
|
||||||
|
|
||||||
- replace object with another, keeping children
|
|
||||||
|
|
||||||
+ write tmp file for current dialog/panel/etc.
|
|
||||||
|
|
||||||
+ XML indents
|
|
||||||
|
|
||||||
+ select same notebook pages after update
|
|
||||||
|
|
||||||
- put some default values in tree ctrl etc.
|
|
||||||
|
|
||||||
- special (fast) update for some values: pos/size, value/content, sizeritem
|
|
||||||
stuff (?), well, as much as possible
|
|
||||||
|
|
||||||
- highlighting with better method
|
|
||||||
|
|
||||||
- import XRC/WXR files
|
|
||||||
|
|
||||||
+ disable some window creation when it's not valid
|
|
||||||
|
|
||||||
- selecting object by clicking in test window
|
|
Before Width: | Height: | Size: 542 B |
Before Width: | Height: | Size: 677 B |
@@ -1,4 +0,0 @@
|
|||||||
#
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@@ -1,34 +0,0 @@
|
|||||||
"""
|
|
||||||
A simple script to encode all the images the XRCed needs into a Python module
|
|
||||||
"""
|
|
||||||
|
|
||||||
import sys, os, glob
|
|
||||||
from wx.tools import img2py
|
|
||||||
|
|
||||||
def main():
|
|
||||||
output = 'images.py'
|
|
||||||
|
|
||||||
# get the list of PNG files
|
|
||||||
files = glob.glob('src-images/*.png')
|
|
||||||
files.sort()
|
|
||||||
|
|
||||||
# Truncate the inages module
|
|
||||||
open(output, 'w')
|
|
||||||
|
|
||||||
# call img2py on each file
|
|
||||||
for file in files:
|
|
||||||
|
|
||||||
# extract the basename to be used as the image name
|
|
||||||
name = os.path.splitext(os.path.basename(file))[0]
|
|
||||||
|
|
||||||
# encode it
|
|
||||||
if file == files[0]:
|
|
||||||
cmd = "-u -i -n %s %s %s" % (name, file, output)
|
|
||||||
else:
|
|
||||||
cmd = "-a -u -i -n %s %s %s" % (name, file, output)
|
|
||||||
img2py.main(cmd.split())
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
main()
|
|
||||||
|
|
@@ -1,63 +0,0 @@
|
|||||||
# Name: globals.py
|
|
||||||
# Purpose: XRC editor, global variables
|
|
||||||
# Author: Roman Rolinsky <rolinsky@mema.ucl.ac.be>
|
|
||||||
# Created: 02.12.2002
|
|
||||||
# RCS-ID: $Id$
|
|
||||||
|
|
||||||
from wxPython.wx import *
|
|
||||||
from wxPython.xrc import *
|
|
||||||
try:
|
|
||||||
from wxPython.wizard import *
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
import sys
|
|
||||||
|
|
||||||
# Global constants
|
|
||||||
|
|
||||||
progname = 'XRCed'
|
|
||||||
version = '0.1.5-3'
|
|
||||||
# Can be changed to set other default encoding different
|
|
||||||
#defaultEncoding = ''
|
|
||||||
# you comment above and can uncomment this:
|
|
||||||
defaultEncoding = wxGetDefaultPyEncoding()
|
|
||||||
|
|
||||||
try:
|
|
||||||
True
|
|
||||||
except NameError:
|
|
||||||
True = 1==1
|
|
||||||
False = 1==0
|
|
||||||
|
|
||||||
# Global variables
|
|
||||||
|
|
||||||
class Globals:
|
|
||||||
panel = None
|
|
||||||
tree = None
|
|
||||||
frame = None
|
|
||||||
tools = None
|
|
||||||
undoMan = None
|
|
||||||
testWin = None
|
|
||||||
testWinPos = wxDefaultPosition
|
|
||||||
currentXXX = None
|
|
||||||
currentEncoding = defaultEncoding
|
|
||||||
|
|
||||||
def _makeFonts(self):
|
|
||||||
self._sysFont = wxSystemSettings_GetFont(wxSYS_SYSTEM_FONT)
|
|
||||||
self._labelFont = wxFont(self._sysFont.GetPointSize(), wxDEFAULT, wxNORMAL, wxBOLD)
|
|
||||||
self._modernFont = wxFont(self._sysFont.GetPointSize(), wxMODERN, wxNORMAL, wxNORMAL)
|
|
||||||
self._smallerFont = wxFont(self._sysFont.GetPointSize()-2, wxDEFAULT, wxNORMAL, wxNORMAL)
|
|
||||||
|
|
||||||
def sysFont(self):
|
|
||||||
if not hasattr(self, "_sysFont"): self._makeFonts()
|
|
||||||
return self._sysFont
|
|
||||||
def labelFont(self):
|
|
||||||
if not hasattr(self, "_labelFont"): self._makeFonts()
|
|
||||||
return self._labelFont
|
|
||||||
def modernFont(self):
|
|
||||||
if not hasattr(self, "_modernFont"): self._makeFonts()
|
|
||||||
return self._modernFont
|
|
||||||
def smallerFont(self):
|
|
||||||
if not hasattr(self, "_smallerFont"): self._makeFonts()
|
|
||||||
return self._smallerFont
|
|
||||||
|
|
||||||
|
|
||||||
g = Globals()
|
|
@@ -1,23 +0,0 @@
|
|||||||
Copyright (c) 2002, Roman Rolinsky <rollrom@users.sourceforge.net>
|
|
||||||
All rights reserved.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer.
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
||||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
|
||||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
||||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
||||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
|
||||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
|
||||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
||||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
|
||||||
POSSIBILITY OF SUCH DAMAGE.
|
|
@@ -1,384 +0,0 @@
|
|||||||
# Name: panel.py
|
|
||||||
# Purpose: XRC editor, Panel class and related
|
|
||||||
# Author: Roman Rolinsky <rolinsky@mema.ucl.ac.be>
|
|
||||||
# Created: 02.12.2002
|
|
||||||
# RCS-ID: $Id$
|
|
||||||
|
|
||||||
from xxx import * # xxx imports globals and params
|
|
||||||
from undo import *
|
|
||||||
from wxPython.html import wxHtmlWindow
|
|
||||||
|
|
||||||
# Properties panel containing notebook
|
|
||||||
class Panel(wxNotebook):
|
|
||||||
def __init__(self, parent, id = -1):
|
|
||||||
if wxPlatform != '__WXMAC__': # some problems with this style on macs
|
|
||||||
wxNotebook.__init__(self, parent, id, style=wxNB_BOTTOM)
|
|
||||||
else:
|
|
||||||
wxNotebook.__init__(self, parent, id)
|
|
||||||
global panel
|
|
||||||
g.panel = panel = self
|
|
||||||
self.modified = False
|
|
||||||
|
|
||||||
# Set common button size for parameter buttons
|
|
||||||
bTmp = wxButton(self, -1, '')
|
|
||||||
import params
|
|
||||||
params.buttonSize = (self.DLG_SZE(buttonSize)[0], bTmp.GetSize()[1])
|
|
||||||
bTmp.Destroy()
|
|
||||||
del bTmp
|
|
||||||
|
|
||||||
# List of child windows
|
|
||||||
self.pages = []
|
|
||||||
# Create scrolled windows for pages
|
|
||||||
self.page1 = wxScrolledWindow(self, -1)
|
|
||||||
sizer = wxBoxSizer()
|
|
||||||
sizer.Add(wxBoxSizer()) # dummy sizer
|
|
||||||
self.page1.SetAutoLayout(True)
|
|
||||||
self.page1.SetSizer(sizer)
|
|
||||||
self.AddPage(self.page1, 'Properties')
|
|
||||||
# Second page
|
|
||||||
self.page2 = wxScrolledWindow(self, -1)
|
|
||||||
self.page2.Hide()
|
|
||||||
sizer = wxBoxSizer()
|
|
||||||
sizer.Add(wxBoxSizer()) # dummy sizer
|
|
||||||
self.page2.SetAutoLayout(True)
|
|
||||||
self.page2.SetSizer(sizer)
|
|
||||||
# Cache for already used panels
|
|
||||||
self.pageCache = {} # cached property panels
|
|
||||||
self.stylePageCache = {} # cached style panels
|
|
||||||
|
|
||||||
# Delete child windows and recreate page sizer
|
|
||||||
def ResetPage(self, page):
|
|
||||||
topSizer = page.GetSizer()
|
|
||||||
sizer = topSizer.GetChildren()[0].GetSizer()
|
|
||||||
for w in page.GetChildren():
|
|
||||||
sizer.Detach(w)
|
|
||||||
if isinstance(w, ParamPage):
|
|
||||||
if w.IsShown():
|
|
||||||
w.Hide()
|
|
||||||
else:
|
|
||||||
w.Destroy()
|
|
||||||
topSizer.Remove(sizer)
|
|
||||||
# Create new windows
|
|
||||||
sizer = wxBoxSizer(wxVERTICAL)
|
|
||||||
# Special case - resize html window
|
|
||||||
if g.conf.panic:
|
|
||||||
topSizer.Add(sizer, 1, wxEXPAND)
|
|
||||||
else:
|
|
||||||
topSizer.Add(sizer, 0, wxALL, 5)
|
|
||||||
return sizer
|
|
||||||
|
|
||||||
def SetData(self, xxx):
|
|
||||||
self.pages = []
|
|
||||||
# First page
|
|
||||||
# Remove current objects and sizer
|
|
||||||
sizer = self.ResetPage(self.page1)
|
|
||||||
if not xxx or (not xxx.allParams and not xxx.hasName and not xxx.hasChild):
|
|
||||||
if g.tree.selection:
|
|
||||||
sizer.Add(wxStaticText(self.page1, -1, 'This item has no properties.'))
|
|
||||||
else: # nothing selected
|
|
||||||
# If first time, show some help
|
|
||||||
if g.conf.panic:
|
|
||||||
html = wxHtmlWindow(self.page1, -1, wxDefaultPosition,
|
|
||||||
wxDefaultSize, wxSUNKEN_BORDER)
|
|
||||||
html.SetPage(g.helpText)
|
|
||||||
sizer.Add(html, 1, wxEXPAND)
|
|
||||||
g.conf.panic = False
|
|
||||||
else:
|
|
||||||
sizer.Add(wxStaticText(self.page1, -1, 'Select a tree item.'))
|
|
||||||
else:
|
|
||||||
g.currentXXX = xxx.treeObject()
|
|
||||||
# Normal or SizerItem page
|
|
||||||
isGBSizerItem = isinstance(xxx.parent, xxxGridBagSizer)
|
|
||||||
cacheID = (xxx.__class__, isGBSizerItem)
|
|
||||||
try:
|
|
||||||
page = self.pageCache[cacheID]
|
|
||||||
page.box.SetLabel(xxx.panelName())
|
|
||||||
page.Show()
|
|
||||||
except KeyError:
|
|
||||||
page = PropPage(self.page1, xxx.panelName(), xxx)
|
|
||||||
self.pageCache[cacheID] = page
|
|
||||||
page.SetValues(xxx)
|
|
||||||
self.pages.append(page)
|
|
||||||
sizer.Add(page, 1, wxEXPAND)
|
|
||||||
if xxx.hasChild:
|
|
||||||
# Special label for child objects - they may have different GUI
|
|
||||||
cacheID = (xxx.child.__class__, xxx.__class__)
|
|
||||||
try:
|
|
||||||
page = self.pageCache[cacheID]
|
|
||||||
page.box.SetLabel(xxx.child.panelName())
|
|
||||||
page.Show()
|
|
||||||
except KeyError:
|
|
||||||
page = PropPage(self.page1, xxx.child.panelName(), xxx.child)
|
|
||||||
self.pageCache[cacheID] = page
|
|
||||||
page.SetValues(xxx.child)
|
|
||||||
self.pages.append(page)
|
|
||||||
sizer.Add(page, 0, wxEXPAND | wxTOP, 5)
|
|
||||||
self.page1.Layout()
|
|
||||||
size = self.page1.GetSizer().GetMinSize()
|
|
||||||
self.page1.SetScrollbars(1, 1, size.width, size.height, 0, 0, True)
|
|
||||||
|
|
||||||
# Second page
|
|
||||||
# Create if does not exist
|
|
||||||
if xxx and xxx.treeObject().hasStyle:
|
|
||||||
xxx = xxx.treeObject()
|
|
||||||
# Simplest case: set data if class is the same
|
|
||||||
sizer = self.ResetPage(self.page2)
|
|
||||||
try:
|
|
||||||
page = self.stylePageCache[xxx.__class__]
|
|
||||||
page.Show()
|
|
||||||
except KeyError:
|
|
||||||
page = StylePage(self.page2, xxx.className + ' style', xxx)
|
|
||||||
self.stylePageCache[xxx.__class__] = page
|
|
||||||
page.SetValues(xxx)
|
|
||||||
self.pages.append(page)
|
|
||||||
sizer.Add(page, 0, wxEXPAND)
|
|
||||||
# Add page if not exists
|
|
||||||
if not self.GetPageCount() == 2:
|
|
||||||
self.AddPage(self.page2, 'Style')
|
|
||||||
self.page2.Layout()
|
|
||||||
if 'wxGTK' in wx.PlatformInfo:
|
|
||||||
self.page2.Show(True)
|
|
||||||
size = self.page2.GetSizer().GetMinSize()
|
|
||||||
self.page2.SetScrollbars(1, 1, size.width, size.height, 0, 0, True)
|
|
||||||
else:
|
|
||||||
# Remove page if exists
|
|
||||||
if self.GetPageCount() == 2:
|
|
||||||
self.SetSelection(0)
|
|
||||||
self.page1.Refresh()
|
|
||||||
self.RemovePage(1)
|
|
||||||
self.modified = False
|
|
||||||
|
|
||||||
def Clear(self):
|
|
||||||
self.SetData(None)
|
|
||||||
self.modified = False
|
|
||||||
|
|
||||||
# If some parameter has changed
|
|
||||||
def IsModified(self):
|
|
||||||
return self.modified
|
|
||||||
|
|
||||||
def SetModified(self, value):
|
|
||||||
# Register undo object when modifying first time
|
|
||||||
if not self.modified and value:
|
|
||||||
g.undoMan.RegisterUndo(UndoEdit())
|
|
||||||
self.modified = value
|
|
||||||
|
|
||||||
def Apply(self):
|
|
||||||
for p in self.pages: p.Apply()
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
|
|
||||||
# General class for notebook pages
|
|
||||||
class ParamPage(wxPanel):
|
|
||||||
def __init__(self, parent, xxx):
|
|
||||||
wxPanel.__init__(self, parent, -1)
|
|
||||||
self.xxx = xxx
|
|
||||||
# Register event handlers
|
|
||||||
for id in paramIDs.values():
|
|
||||||
EVT_CHECKBOX(self, id, self.OnCheckParams)
|
|
||||||
self.checks = {}
|
|
||||||
self.controls = {} # save python objects
|
|
||||||
self.controlName = None
|
|
||||||
|
|
||||||
def OnCheckParams(self, evt):
|
|
||||||
xxx = self.xxx
|
|
||||||
param = evt.GetEventObject().GetName()
|
|
||||||
w = self.controls[param]
|
|
||||||
w.Enable(True)
|
|
||||||
objElem = xxx.element
|
|
||||||
if evt.IsChecked():
|
|
||||||
# Ad new text node in order of allParams
|
|
||||||
w.SetValue('') # set empty (default) value
|
|
||||||
w.SetModified() # mark as changed
|
|
||||||
elem = g.tree.dom.createElement(param)
|
|
||||||
# Some classes are special
|
|
||||||
if param == 'font':
|
|
||||||
xxx.params[param] = xxxParamFont(xxx.element, elem)
|
|
||||||
elif param in xxxObject.bitmapTags:
|
|
||||||
xxx.params[param] = xxxParamBitmap(elem)
|
|
||||||
else:
|
|
||||||
xxx.params[param] = xxxParam(elem)
|
|
||||||
# Find place to put new element: first present element after param
|
|
||||||
found = False
|
|
||||||
if xxx.hasStyle:
|
|
||||||
paramStyles = xxx.allParams + xxx.styles
|
|
||||||
else:
|
|
||||||
paramStyles = xxx.allParams
|
|
||||||
for p in paramStyles[paramStyles.index(param) + 1:]:
|
|
||||||
# Content params don't have same type
|
|
||||||
if xxx.params.has_key(p) and p != 'content':
|
|
||||||
found = True
|
|
||||||
break
|
|
||||||
if found:
|
|
||||||
nextTextElem = xxx.params[p].node
|
|
||||||
objElem.insertBefore(elem, nextTextElem)
|
|
||||||
else:
|
|
||||||
objElem.appendChild(elem)
|
|
||||||
else:
|
|
||||||
# Remove parameter
|
|
||||||
xxx.params[param].remove()
|
|
||||||
del xxx.params[param]
|
|
||||||
w.SetValue('')
|
|
||||||
w.modified = False # mark as not changed
|
|
||||||
w.Enable(False)
|
|
||||||
# Set modified flag (provokes undo storing is necessary)
|
|
||||||
panel.SetModified(True)
|
|
||||||
def Apply(self):
|
|
||||||
xxx = self.xxx
|
|
||||||
if self.controlName:
|
|
||||||
name = self.controlName.GetValue()
|
|
||||||
if xxx.name != name:
|
|
||||||
xxx.name = name
|
|
||||||
xxx.element.setAttribute('name', name)
|
|
||||||
for param, w in self.controls.items():
|
|
||||||
if w.modified:
|
|
||||||
paramObj = xxx.params[param]
|
|
||||||
value = w.GetValue()
|
|
||||||
if param in xxx.specials:
|
|
||||||
xxx.setSpecial(param, value)
|
|
||||||
else:
|
|
||||||
paramObj.update(value)
|
|
||||||
# Save current state
|
|
||||||
def SaveState(self):
|
|
||||||
self.origChecks = map(lambda i: (i[0], i[1].GetValue()), self.checks.items())
|
|
||||||
self.origControls = map(lambda i: (i[0], i[1].GetValue(), i[1].IsEnabled()),
|
|
||||||
self.controls.items())
|
|
||||||
if self.controlName:
|
|
||||||
self.origName = self.controlName.GetValue()
|
|
||||||
# Return original values
|
|
||||||
def GetState(self):
|
|
||||||
if self.controlName:
|
|
||||||
return (self.origChecks, self.origControls, self.origName)
|
|
||||||
else:
|
|
||||||
return (self.origChecks, self.origControls)
|
|
||||||
# Set values from undo data
|
|
||||||
def SetState(self, state):
|
|
||||||
for k,v in state[0]:
|
|
||||||
self.checks[k].SetValue(v)
|
|
||||||
for k,v,e in state[1]:
|
|
||||||
self.controls[k].SetValue(v)
|
|
||||||
self.controls[k].Enable(e)
|
|
||||||
if e: self.controls[k].modified = True
|
|
||||||
if self.controlName:
|
|
||||||
self.controlName.SetValue(state[2])
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
|
|
||||||
LABEL_WIDTH = 125
|
|
||||||
|
|
||||||
# Panel for displaying properties
|
|
||||||
class PropPage(ParamPage):
|
|
||||||
def __init__(self, parent, label, xxx):
|
|
||||||
ParamPage.__init__(self, parent, xxx)
|
|
||||||
self.box = wxStaticBox(self, -1, label)
|
|
||||||
self.box.SetFont(g.labelFont())
|
|
||||||
topSizer = wxStaticBoxSizer(self.box, wxVERTICAL)
|
|
||||||
sizer = wxFlexGridSizer(len(xxx.allParams), 2, 1, 1)
|
|
||||||
sizer.AddGrowableCol(1)
|
|
||||||
if xxx.hasName:
|
|
||||||
label = wxStaticText(self, -1, 'XML ID:', size=(LABEL_WIDTH,-1))
|
|
||||||
control = ParamText(self, 'XML_name', 200)
|
|
||||||
sizer.AddMany([ (label, 0, wxALIGN_CENTER_VERTICAL),
|
|
||||||
(control, 0, wxALIGN_CENTER_VERTICAL | wxBOTTOM | wxGROW, 5) ])
|
|
||||||
self.controlName = control
|
|
||||||
for param in xxx.allParams:
|
|
||||||
present = xxx.params.has_key(param)
|
|
||||||
if param in xxx.required:
|
|
||||||
label = wxStaticText(self, paramIDs[param], param + ':',
|
|
||||||
size = (LABEL_WIDTH,-1), name = param)
|
|
||||||
else:
|
|
||||||
# Notebook has one very loooooong parameter
|
|
||||||
if param == 'usenotebooksizer': sParam = 'usesizer:'
|
|
||||||
else: sParam = param + ':'
|
|
||||||
label = wxCheckBox(self, paramIDs[param], sParam,
|
|
||||||
size = (LABEL_WIDTH,-1), name = param)
|
|
||||||
self.checks[param] = label
|
|
||||||
try:
|
|
||||||
typeClass = xxx.paramDict[param]
|
|
||||||
except KeyError:
|
|
||||||
try:
|
|
||||||
# Standart type
|
|
||||||
typeClass = paramDict[param]
|
|
||||||
except KeyError:
|
|
||||||
# Default
|
|
||||||
typeClass = ParamText
|
|
||||||
control = typeClass(self, param)
|
|
||||||
control.Enable(present)
|
|
||||||
sizer.AddMany([ (label, 0, wxALIGN_CENTER_VERTICAL),
|
|
||||||
(control, 0, wxALIGN_CENTER_VERTICAL | wxGROW) ])
|
|
||||||
self.controls[param] = control
|
|
||||||
topSizer.Add(sizer, 1, wxALL | wxEXPAND, 3)
|
|
||||||
self.SetAutoLayout(True)
|
|
||||||
self.SetSizer(topSizer)
|
|
||||||
topSizer.Fit(self)
|
|
||||||
def SetValues(self, xxx):
|
|
||||||
self.xxx = xxx
|
|
||||||
self.origChecks = []
|
|
||||||
self.origControls = []
|
|
||||||
# Set values, checkboxes to False, disable defaults
|
|
||||||
if xxx.hasName:
|
|
||||||
self.controlName.SetValue(xxx.name)
|
|
||||||
self.origName = xxx.name
|
|
||||||
for param in xxx.allParams:
|
|
||||||
w = self.controls[param]
|
|
||||||
w.modified = False
|
|
||||||
try:
|
|
||||||
value = xxx.params[param].value()
|
|
||||||
w.Enable(True)
|
|
||||||
w.SetValue(value)
|
|
||||||
if not param in xxx.required:
|
|
||||||
self.checks[param].SetValue(True)
|
|
||||||
self.origChecks.append((param, True))
|
|
||||||
self.origControls.append((param, value, True))
|
|
||||||
except KeyError:
|
|
||||||
self.checks[param].SetValue(False)
|
|
||||||
w.SetValue('')
|
|
||||||
w.Enable(False)
|
|
||||||
self.origChecks.append((param, False))
|
|
||||||
self.origControls.append((param, '', False))
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
|
|
||||||
# Style notebook page
|
|
||||||
class StylePage(ParamPage):
|
|
||||||
def __init__(self, parent, label, xxx):
|
|
||||||
ParamPage.__init__(self, parent, xxx)
|
|
||||||
box = wxStaticBox(self, -1, label)
|
|
||||||
box.SetFont(g.labelFont())
|
|
||||||
topSizer = wxStaticBoxSizer(box, wxVERTICAL)
|
|
||||||
sizer = wxFlexGridSizer(len(xxx.styles), 2, 1, 1)
|
|
||||||
sizer.AddGrowableCol(1)
|
|
||||||
for param in xxx.styles:
|
|
||||||
present = xxx.params.has_key(param)
|
|
||||||
check = wxCheckBox(self, paramIDs[param],
|
|
||||||
param + ':', size = (LABEL_WIDTH,-1), name = param)
|
|
||||||
check.SetValue(present)
|
|
||||||
control = paramDict[param](self, name = param)
|
|
||||||
control.Enable(present)
|
|
||||||
sizer.AddMany([ (check, 0, wxALIGN_CENTER_VERTICAL),
|
|
||||||
(control, 0, wxALIGN_CENTER_VERTICAL | wxGROW) ])
|
|
||||||
self.checks[param] = check
|
|
||||||
self.controls[param] = control
|
|
||||||
topSizer.Add(sizer, 1, wxALL | wxEXPAND, 3)
|
|
||||||
self.SetAutoLayout(True)
|
|
||||||
self.SetSizer(topSizer)
|
|
||||||
topSizer.Fit(self)
|
|
||||||
# Set data for a cahced page
|
|
||||||
def SetValues(self, xxx):
|
|
||||||
self.xxx = xxx
|
|
||||||
self.origChecks = []
|
|
||||||
self.origControls = []
|
|
||||||
for param in xxx.styles:
|
|
||||||
present = xxx.params.has_key(param)
|
|
||||||
check = self.checks[param]
|
|
||||||
check.SetValue(present)
|
|
||||||
w = self.controls[param]
|
|
||||||
w.modified = False
|
|
||||||
if present:
|
|
||||||
value = xxx.params[param].value()
|
|
||||||
else:
|
|
||||||
value = ''
|
|
||||||
w.SetValue(value)
|
|
||||||
w.Enable(present)
|
|
||||||
self.origChecks.append((param, present))
|
|
||||||
self.origControls.append((param, value, present))
|
|
||||||
|
|
@@ -1,879 +0,0 @@
|
|||||||
# Name: params.py
|
|
||||||
# Purpose: Classes for parameter introduction
|
|
||||||
# Author: Roman Rolinsky <rolinsky@mema.ucl.ac.be>
|
|
||||||
# Created: 22.08.2001
|
|
||||||
# RCS-ID: $Id$
|
|
||||||
|
|
||||||
import string
|
|
||||||
import os.path
|
|
||||||
from globals import *
|
|
||||||
from types import *
|
|
||||||
from wxPython.xrc import *
|
|
||||||
|
|
||||||
genericStyles = [
|
|
||||||
'wxSIMPLE_BORDER', 'wxDOUBLE_BORDER', 'wxSUNKEN_BORDER',
|
|
||||||
'wxRAISED_BORDER', 'wxSTATIC_BORDER', 'wxNO_BORDER',
|
|
||||||
'wxTRANSPARENT_WINDOW', 'wxTAB_TRAVERSAL',
|
|
||||||
'wxWANTS_CHARS',
|
|
||||||
'wxNO_FULL_REPAINT_ON_RESIZE',
|
|
||||||
'wxVSCROLL', 'wxHSCROLL', 'wxALWAYS_SHOW_SB',
|
|
||||||
'wxCLIP_CHILDREN',
|
|
||||||
'wxFULL_REPAINT_ON_RESIZE'
|
|
||||||
]
|
|
||||||
|
|
||||||
genericExStyles = [
|
|
||||||
'wxWS_EX_VALIDATE_RECURSIVELY',
|
|
||||||
'wxWS_EX_BLOCK_EVENTS',
|
|
||||||
'wxWS_EX_TRANSIENT',
|
|
||||||
'wxFRAME_EX_CONTEXTHELP',
|
|
||||||
'wxWS_EX_PROCESS_IDLE',
|
|
||||||
'wxWS_EX_PROCESS_UI_UPDATES'
|
|
||||||
]
|
|
||||||
|
|
||||||
buttonSize = (35,-1) # in dialog units, transformed to pixels in panel ctor
|
|
||||||
|
|
||||||
# Class that can properly disable children
|
|
||||||
class PPanel(wxPanel):
|
|
||||||
def __init__(self, parent, name):
|
|
||||||
wxPanel.__init__(self, parent, -1, name=name)
|
|
||||||
self.modified = self.freeze = False
|
|
||||||
def Enable(self, value):
|
|
||||||
# Something strange is going on with enable so we make sure...
|
|
||||||
for w in self.GetChildren():
|
|
||||||
w.Enable(value)
|
|
||||||
wxPanel.Enable(self, value)
|
|
||||||
def SetModified(self):
|
|
||||||
self.modified = True
|
|
||||||
g.panel.SetModified(True)
|
|
||||||
# Common method to set modified state
|
|
||||||
def OnChange(self, evt):
|
|
||||||
if self.freeze: return
|
|
||||||
self.SetModified()
|
|
||||||
evt.Skip()
|
|
||||||
|
|
||||||
class ParamBinaryOr(PPanel):
|
|
||||||
def __init__(self, parent, name):
|
|
||||||
PPanel.__init__(self, parent, name)
|
|
||||||
self.ID_TEXT_CTRL = wxNewId()
|
|
||||||
self.ID_BUTTON_CHOICES = wxNewId()
|
|
||||||
sizer = wxBoxSizer()
|
|
||||||
self.text = wxTextCtrl(self, self.ID_TEXT_CTRL, size=wxSize(200,-1))
|
|
||||||
sizer.Add(self.text, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, 5)
|
|
||||||
self.button = wxButton(self, self.ID_BUTTON_CHOICES, 'Edit...', size=buttonSize)
|
|
||||||
sizer.Add(self.button, 0, wxALIGN_CENTER_VERTICAL)
|
|
||||||
self.SetAutoLayout(True)
|
|
||||||
self.SetSizer(sizer)
|
|
||||||
sizer.Fit(self)
|
|
||||||
EVT_BUTTON(self, self.ID_BUTTON_CHOICES, self.OnButtonChoices)
|
|
||||||
EVT_TEXT(self, self.ID_TEXT_CTRL, self.OnChange)
|
|
||||||
def GetValue(self):
|
|
||||||
return self.text.GetValue()
|
|
||||||
def SetValue(self, value):
|
|
||||||
self.freeze = True
|
|
||||||
self.text.SetValue(value)
|
|
||||||
self.freeze = False
|
|
||||||
def OnButtonChoices(self, evt):
|
|
||||||
dlg = g.frame.res.LoadDialog(self, 'DIALOG_CHOICES')
|
|
||||||
listBox = XRCCTRL(dlg, 'CHECK_LIST')
|
|
||||||
listBox.InsertItems(self.values, 0)
|
|
||||||
value = map(string.strip, self.text.GetValue().split('|'))
|
|
||||||
if value == ['']: value = []
|
|
||||||
ignored = []
|
|
||||||
for i in value:
|
|
||||||
try:
|
|
||||||
listBox.Check(self.values.index(i))
|
|
||||||
except ValueError:
|
|
||||||
# Try to find equal
|
|
||||||
if self.equal.has_key(i):
|
|
||||||
listBox.Check(self.values.index(self.equal[i]))
|
|
||||||
else:
|
|
||||||
print 'WARNING: unknown flag: %s: ignored.' % i
|
|
||||||
ignored.append(i)
|
|
||||||
if dlg.ShowModal() == wxID_OK:
|
|
||||||
value = []
|
|
||||||
for i in range(listBox.GetCount()):
|
|
||||||
if listBox.IsChecked(i):
|
|
||||||
value.append(self.values[i])
|
|
||||||
# Add ignored flags
|
|
||||||
value.extend(ignored)
|
|
||||||
if value:
|
|
||||||
self.SetValue(reduce(lambda a,b: a+'|'+b, value))
|
|
||||||
else:
|
|
||||||
self.SetValue('')
|
|
||||||
self.SetModified()
|
|
||||||
dlg.Destroy()
|
|
||||||
|
|
||||||
class ParamFlag(ParamBinaryOr):
|
|
||||||
values = ['wxTOP', 'wxBOTTOM', 'wxLEFT', 'wxRIGHT', 'wxALL',
|
|
||||||
'wxEXPAND', 'wxGROW', 'wxSHAPED', 'wxALIGN_CENTRE', 'wxALIGN_RIGHT',
|
|
||||||
'wxFIXED_MINSIZE',
|
|
||||||
'wxALIGN_BOTTOM', 'wxALIGN_CENTRE_VERTICAL',
|
|
||||||
'wxALIGN_CENTRE_HORIZONTAL',
|
|
||||||
]
|
|
||||||
equal = {'wxALIGN_CENTER': 'wxALIGN_CENTRE',
|
|
||||||
'wxALIGN_CENTER_VERTICAL': 'wxALIGN_CENTRE_VERTICAL',
|
|
||||||
'wxALIGN_CENTER_HORIZONTAL': 'wxALIGN_CENTRE_HORIZONTAL'}
|
|
||||||
def __init__(self, parent, name):
|
|
||||||
ParamBinaryOr.__init__(self, parent, name)
|
|
||||||
|
|
||||||
class ParamStyle(ParamBinaryOr):
|
|
||||||
equal = {'wxALIGN_CENTER': 'wxALIGN_CENTRE'}
|
|
||||||
def __init__(self, parent, name):
|
|
||||||
self.values = g.currentXXX.winStyles + genericStyles
|
|
||||||
ParamBinaryOr.__init__(self, parent, name)
|
|
||||||
|
|
||||||
class ParamNonGenericStyle(ParamBinaryOr):
|
|
||||||
def __init__(self, parent, name):
|
|
||||||
self.values = g.currentXXX.winStyles
|
|
||||||
ParamBinaryOr.__init__(self, parent, name)
|
|
||||||
|
|
||||||
class ParamExStyle(ParamBinaryOr):
|
|
||||||
def __init__(self, parent, name):
|
|
||||||
if g.currentXXX:
|
|
||||||
self.values = g.currentXXX.exStyles + genericExStyles
|
|
||||||
else:
|
|
||||||
self.values = []
|
|
||||||
ParamBinaryOr.__init__(self, parent, name)
|
|
||||||
|
|
||||||
class ParamColour(PPanel):
|
|
||||||
def __init__(self, parent, name):
|
|
||||||
PPanel.__init__(self, parent, name)
|
|
||||||
self.ID_TEXT_CTRL = wxNewId()
|
|
||||||
self.ID_BUTTON = wxNewId()
|
|
||||||
sizer = wxBoxSizer()
|
|
||||||
self.text = wxTextCtrl(self, self.ID_TEXT_CTRL, size=(65,-1))
|
|
||||||
sizer.Add(self.text, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, 5)
|
|
||||||
self.button = wxPanel(self, self.ID_BUTTON, wxDefaultPosition, wxSize(20, 1))
|
|
||||||
sizer.Add(self.button, 0, wxGROW | wxALIGN_CENTER_VERTICAL)
|
|
||||||
self.SetAutoLayout(True)
|
|
||||||
self.SetSizer(sizer)
|
|
||||||
sizer.Fit(self)
|
|
||||||
self.textModified = False
|
|
||||||
EVT_PAINT(self.button, self.OnPaintButton)
|
|
||||||
EVT_TEXT(self, self.ID_TEXT_CTRL, self.OnChange)
|
|
||||||
EVT_LEFT_DOWN(self.button, self.OnLeftDown)
|
|
||||||
def GetValue(self):
|
|
||||||
return self.text.GetValue()
|
|
||||||
def SetValue(self, value):
|
|
||||||
self.freeze = True
|
|
||||||
if not value: value = '#FFFFFF'
|
|
||||||
self.text.SetValue(str(value)) # update text ctrl
|
|
||||||
colour = wxColour(int(value[1:3], 16), int(value[3:5], 16), int(value[5:7], 16))
|
|
||||||
self.button.SetBackgroundColour(colour)
|
|
||||||
self.button.Refresh()
|
|
||||||
self.freeze = False
|
|
||||||
def OnPaintButton(self, evt):
|
|
||||||
dc = wxPaintDC(self.button)
|
|
||||||
dc.SetBrush(wxTRANSPARENT_BRUSH)
|
|
||||||
if self.IsEnabled(): dc.SetPen(wxBLACK_PEN)
|
|
||||||
else: dc.SetPen(wxGREY_PEN)
|
|
||||||
size = self.button.GetSize()
|
|
||||||
dc.DrawRectangle(0, 0, size.width, size.height)
|
|
||||||
def OnLeftDown(self, evt):
|
|
||||||
data = wxColourData()
|
|
||||||
data.SetColour(self.GetValue())
|
|
||||||
dlg = wxColourDialog(self, data)
|
|
||||||
if dlg.ShowModal() == wxID_OK:
|
|
||||||
self.SetValue('#%02X%02X%02X' % dlg.GetColourData().GetColour().Get())
|
|
||||||
self.SetModified()
|
|
||||||
dlg.Destroy()
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
|
|
||||||
# Mapping from wx constants ro XML strings
|
|
||||||
fontFamiliesWx2Xml = {wxDEFAULT: 'default', wxDECORATIVE: 'decorative',
|
|
||||||
wxROMAN: 'roman', wxSCRIPT: 'script', wxSWISS: 'swiss',
|
|
||||||
wxMODERN: 'modern'}
|
|
||||||
fontStylesWx2Xml = {wxNORMAL: 'normal', wxSLANT: 'slant', wxITALIC: 'italic'}
|
|
||||||
fontWeightsWx2Xml = {wxNORMAL: 'normal', wxLIGHT: 'light', wxBOLD: 'bold'}
|
|
||||||
def ReverseMap(m):
|
|
||||||
rm = {}
|
|
||||||
for k,v in m.items(): rm[v] = k
|
|
||||||
return rm
|
|
||||||
fontFamiliesXml2wx = ReverseMap(fontFamiliesWx2Xml)
|
|
||||||
fontStylesXml2wx = ReverseMap(fontStylesWx2Xml)
|
|
||||||
fontWeightsXml2wx = ReverseMap(fontWeightsWx2Xml)
|
|
||||||
|
|
||||||
class ParamFont(PPanel):
|
|
||||||
def __init__(self, parent, name):
|
|
||||||
PPanel.__init__(self, parent, name)
|
|
||||||
self.ID_TEXT_CTRL = wxNewId()
|
|
||||||
self.ID_BUTTON_SELECT = wxNewId()
|
|
||||||
sizer = wxBoxSizer()
|
|
||||||
self.text = wxTextCtrl(self, self.ID_TEXT_CTRL, size=(200,-1))
|
|
||||||
sizer.Add(self.text, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, 5)
|
|
||||||
self.button = wxButton(self, self.ID_BUTTON_SELECT, 'Select...', size=buttonSize)
|
|
||||||
sizer.Add(self.button, 0, wxALIGN_CENTER_VERTICAL)
|
|
||||||
self.SetAutoLayout(True)
|
|
||||||
self.SetSizer(sizer)
|
|
||||||
sizer.Fit(self)
|
|
||||||
self.textModified = False
|
|
||||||
EVT_BUTTON(self, self.ID_BUTTON_SELECT, self.OnButtonSelect)
|
|
||||||
EVT_TEXT(self, self.ID_TEXT_CTRL, self.OnChange)
|
|
||||||
def OnChange(self, evt):
|
|
||||||
PPanel.OnChange(self, evt)
|
|
||||||
self.textModified = True
|
|
||||||
def _defaultValue(self):
|
|
||||||
return ['12', 'default', 'normal', 'normal', '0', '', '']
|
|
||||||
def GetValue(self):
|
|
||||||
if self.textModified: # text has newer value
|
|
||||||
try:
|
|
||||||
return eval(self.text.GetValue())
|
|
||||||
except SyntaxError:
|
|
||||||
wxLogError('Syntax error in parameter value: ' + self.GetName())
|
|
||||||
return self._defaultValue()
|
|
||||||
return self.value
|
|
||||||
def SetValue(self, value):
|
|
||||||
self.freeze = True # disable other handlers
|
|
||||||
if not value: value = self._defaultValue()
|
|
||||||
self.value = value
|
|
||||||
self.text.SetValue(str(value)) # update text ctrl
|
|
||||||
self.freeze = False
|
|
||||||
def OnButtonSelect(self, evt):
|
|
||||||
if self.textModified: # text has newer value
|
|
||||||
try:
|
|
||||||
self.value = eval(self.text.GetValue())
|
|
||||||
except SyntaxError:
|
|
||||||
wxLogError('Syntax error in parameter value: ' + self.GetName())
|
|
||||||
self.value = self._defaultValue()
|
|
||||||
# Make initial font
|
|
||||||
# Default values
|
|
||||||
size = 12
|
|
||||||
family = wxDEFAULT
|
|
||||||
style = weight = wxNORMAL
|
|
||||||
underlined = 0
|
|
||||||
face = ''
|
|
||||||
enc = wxFONTENCODING_DEFAULT
|
|
||||||
# Fall back to default if exceptions
|
|
||||||
error = False
|
|
||||||
try:
|
|
||||||
try: size = int(self.value[0])
|
|
||||||
except ValueError: error = True; wxLogError('Invalid size specification')
|
|
||||||
try: family = fontFamiliesXml2wx[self.value[1]]
|
|
||||||
except KeyError: error = True; wxLogError('Invalid family specification')
|
|
||||||
try: style = fontStylesXml2wx[self.value[2]]
|
|
||||||
except KeyError: error = True; wxLogError('Invalid style specification')
|
|
||||||
try: weight = fontWeightsXml2wx[self.value[3]]
|
|
||||||
except KeyError: error = True; wxLogError('Invalid weight specification')
|
|
||||||
try: underlined = bool(self.value[4])
|
|
||||||
except ValueError: error = True; wxLogError('Invalid underlined flag specification')
|
|
||||||
face = self.value[5]
|
|
||||||
except IndexError:
|
|
||||||
error = True
|
|
||||||
mapper = wxFontMapper()
|
|
||||||
if not self.value[6]: enc = mapper.CharsetToEncoding(self.value[6])
|
|
||||||
|
|
||||||
if error: wxLogError('Invalid font specification')
|
|
||||||
if enc == wxFONTENCODING_DEFAULT: enc = wxFONTENCODING_SYSTEM
|
|
||||||
font = wxFont(size, family, style, weight, underlined, face, enc)
|
|
||||||
data = wxFontData()
|
|
||||||
data.SetInitialFont(font)
|
|
||||||
dlg = wxFontDialog(self, data)
|
|
||||||
if dlg.ShowModal() == wxID_OK:
|
|
||||||
font = dlg.GetFontData().GetChosenFont()
|
|
||||||
print font.GetEncoding()
|
|
||||||
if font.GetEncoding() == wxFONTENCODING_SYSTEM:
|
|
||||||
encName = ''
|
|
||||||
else:
|
|
||||||
encName = wxFontMapper_GetEncodingName(font.GetEncoding()).encode()
|
|
||||||
value = [str(font.GetPointSize()),
|
|
||||||
fontFamiliesWx2Xml.get(font.GetFamily(), "default"),
|
|
||||||
fontStylesWx2Xml.get(font.GetStyle(), "normal"),
|
|
||||||
fontWeightsWx2Xml.get(font.GetWeight(), "normal"),
|
|
||||||
str(int(font.GetUnderlined())),
|
|
||||||
font.GetFaceName().encode(),
|
|
||||||
encName
|
|
||||||
]
|
|
||||||
# Add ignored flags
|
|
||||||
self.SetValue(value)
|
|
||||||
self.SetModified()
|
|
||||||
self.textModified = False
|
|
||||||
dlg.Destroy()
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
|
|
||||||
class ParamInt(PPanel):
|
|
||||||
def __init__(self, parent, name):
|
|
||||||
PPanel.__init__(self, parent, name)
|
|
||||||
self.ID_SPIN_CTRL = wxNewId()
|
|
||||||
sizer = wxBoxSizer()
|
|
||||||
self.spin = wxSpinCtrl(self, self.ID_SPIN_CTRL, size=(50,-1))
|
|
||||||
sizer.Add(self.spin)
|
|
||||||
self.SetAutoLayout(True)
|
|
||||||
self.SetSizer(sizer)
|
|
||||||
sizer.Fit(self)
|
|
||||||
EVT_SPINCTRL(self, self.ID_SPIN_CTRL, self.OnChange)
|
|
||||||
def GetValue(self):
|
|
||||||
return str(self.spin.GetValue())
|
|
||||||
def SetValue(self, value):
|
|
||||||
self.freeze = True
|
|
||||||
if not value: value = 0
|
|
||||||
self.spin.SetValue(int(value))
|
|
||||||
self.freeze = False
|
|
||||||
|
|
||||||
# Same as int but allows dialog units (XXXd)
|
|
||||||
class ParamUnit(PPanel):
|
|
||||||
def __init__(self, parent, name):
|
|
||||||
PPanel.__init__(self, parent, name)
|
|
||||||
self.ID_TEXT_CTRL = wxNewId()
|
|
||||||
self.ID_SPIN_BUTTON = wxNewId()
|
|
||||||
sizer = wxBoxSizer()
|
|
||||||
self.text = wxTextCtrl(self, self.ID_TEXT_CTRL, size=(35,-1))
|
|
||||||
self.spin = wxSpinButton(self, self.ID_SPIN_BUTTON, style = wxSP_VERTICAL, size=(-1,1))
|
|
||||||
self.spin.SetRange(-10000, 10000)
|
|
||||||
sizer.Add(self.text, 0, wxEXPAND | wxRIGHT, 2)
|
|
||||||
sizer.Add(self.spin, 0, wxEXPAND)
|
|
||||||
self.SetAutoLayout(True)
|
|
||||||
self.SetSizer(sizer)
|
|
||||||
sizer.Fit(self)
|
|
||||||
EVT_SPIN_UP(self, self.ID_SPIN_BUTTON, self.OnSpinUp)
|
|
||||||
EVT_SPIN_DOWN(self, self.ID_SPIN_BUTTON, self.OnSpinDown)
|
|
||||||
def GetValue(self):
|
|
||||||
return self.text.GetValue()
|
|
||||||
def SetValue(self, value):
|
|
||||||
self.freeze = True
|
|
||||||
if not value: value = '0'
|
|
||||||
self.text.SetValue(value)
|
|
||||||
self.freeze = False
|
|
||||||
def Change(self, x):
|
|
||||||
# Check if we are working with dialog units
|
|
||||||
value = self.text.GetValue()
|
|
||||||
units = ''
|
|
||||||
if value[-1].upper() == 'D':
|
|
||||||
units = value[-1]
|
|
||||||
value = value[:-1]
|
|
||||||
try:
|
|
||||||
intValue = int(value) + x
|
|
||||||
self.spin.SetValue(intValue)
|
|
||||||
self.text.SetValue(str(intValue) + units)
|
|
||||||
self.SetModified()
|
|
||||||
except:
|
|
||||||
# !!! Strange, if I use wxLogWarning, event is re-generated
|
|
||||||
print 'incorrect unit format'
|
|
||||||
def OnSpinUp(self, evt):
|
|
||||||
self.Change(1)
|
|
||||||
def OnSpinDown(self, evt):
|
|
||||||
self.Change(-1)
|
|
||||||
|
|
||||||
class ParamMultilineText(PPanel):
|
|
||||||
def __init__(self, parent, name, textWidth=-1):
|
|
||||||
PPanel.__init__(self, parent, name)
|
|
||||||
self.ID_TEXT_CTRL = wxNewId()
|
|
||||||
self.ID_BUTTON_EDIT = wxNewId()
|
|
||||||
sizer = wxBoxSizer()
|
|
||||||
self.text = wxTextCtrl(self, self.ID_TEXT_CTRL, size=wxSize(200,-1))
|
|
||||||
sizer.Add(self.text, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, 5)
|
|
||||||
self.button = wxButton(self, self.ID_BUTTON_EDIT, 'Edit...', size=buttonSize)
|
|
||||||
sizer.Add(self.button, 0, wxALIGN_CENTER_VERTICAL)
|
|
||||||
self.SetAutoLayout(True)
|
|
||||||
self.SetSizer(sizer)
|
|
||||||
sizer.Fit(self)
|
|
||||||
EVT_BUTTON(self, self.ID_BUTTON_EDIT, self.OnButtonEdit)
|
|
||||||
EVT_TEXT(self, self.ID_TEXT_CTRL, self.OnChange)
|
|
||||||
def GetValue(self):
|
|
||||||
return self.text.GetValue()
|
|
||||||
def SetValue(self, value):
|
|
||||||
self.freeze = True # disable other handlers
|
|
||||||
self.text.SetValue(value)
|
|
||||||
self.freeze = False # disable other handlers
|
|
||||||
def OnButtonEdit(self, evt):
|
|
||||||
dlg = g.frame.res.LoadDialog(self, 'DIALOG_TEXT')
|
|
||||||
textCtrl = XRCCTRL(dlg, 'TEXT')
|
|
||||||
textCtrl.SetValue(self.text.GetValue())
|
|
||||||
if dlg.ShowModal() == wxID_OK:
|
|
||||||
self.text.SetValue(textCtrl.GetValue())
|
|
||||||
self.SetModified()
|
|
||||||
dlg.Destroy()
|
|
||||||
|
|
||||||
class ParamText(PPanel):
|
|
||||||
def __init__(self, parent, name, textWidth=-1):
|
|
||||||
PPanel.__init__(self, parent, name)
|
|
||||||
self.ID_TEXT_CTRL = wxNewId()
|
|
||||||
# We use sizer even here to have the same size of text control
|
|
||||||
sizer = wxBoxSizer()
|
|
||||||
self.text = wxTextCtrl(self, self.ID_TEXT_CTRL, size=wxSize(textWidth,-1))
|
|
||||||
if textWidth == -1: option = 1
|
|
||||||
else: option = 0
|
|
||||||
sizer.Add(self.text, option, wxALIGN_CENTER_VERTICAL)
|
|
||||||
self.SetAutoLayout(True)
|
|
||||||
self.SetSizer(sizer)
|
|
||||||
sizer.Fit(self)
|
|
||||||
EVT_TEXT(self, self.ID_TEXT_CTRL, self.OnChange)
|
|
||||||
def GetValue(self):
|
|
||||||
return self.text.GetValue()
|
|
||||||
def SetValue(self, value):
|
|
||||||
self.freeze = True # disable other handlers
|
|
||||||
self.text.SetValue(value)
|
|
||||||
self.freeze = False # disable other handlers
|
|
||||||
|
|
||||||
class ParamAccel(ParamText):
|
|
||||||
def __init__(self, parent, name):
|
|
||||||
ParamText.__init__(self, parent, name, 100)
|
|
||||||
|
|
||||||
class ParamPosSize(ParamText):
|
|
||||||
def __init__(self, parent, name):
|
|
||||||
ParamText.__init__(self, parent, name, 80)
|
|
||||||
|
|
||||||
class ParamLabel(ParamText):
|
|
||||||
def __init__(self, parent, name):
|
|
||||||
ParamText.__init__(self, parent, name, 200)
|
|
||||||
|
|
||||||
class ParamEncoding(ParamText):
|
|
||||||
def __init__(self, parent, name):
|
|
||||||
ParamText.__init__(self, parent, name, 100)
|
|
||||||
|
|
||||||
class ContentDialog(wxDialog):
|
|
||||||
def __init__(self, parent, value):
|
|
||||||
# Load from resource
|
|
||||||
pre = wxPreDialog()
|
|
||||||
g.frame.res.LoadOnDialog(pre, parent, 'DIALOG_CONTENT')
|
|
||||||
self.this = pre.this
|
|
||||||
self._setOORInfo(self)
|
|
||||||
self.list = XRCCTRL(self, 'LIST')
|
|
||||||
# Set list items
|
|
||||||
for v in value:
|
|
||||||
self.list.Append(v)
|
|
||||||
self.SetAutoLayout(True)
|
|
||||||
self.GetSizer().Fit(self)
|
|
||||||
# Callbacks
|
|
||||||
self.ID_BUTTON_APPEND = XRCID('BUTTON_APPEND')
|
|
||||||
self.ID_BUTTON_REMOVE = XRCID('BUTTON_REMOVE')
|
|
||||||
self.ID_BUTTON_UP = XRCID('BUTTON_UP')
|
|
||||||
self.ID_BUTTON_DOWN = XRCID('BUTTON_DOWN')
|
|
||||||
EVT_BUTTON(self, self.ID_BUTTON_UP, self.OnButtonUp)
|
|
||||||
EVT_BUTTON(self, self.ID_BUTTON_DOWN, self.OnButtonDown)
|
|
||||||
EVT_BUTTON(self, self.ID_BUTTON_APPEND, self.OnButtonAppend)
|
|
||||||
EVT_BUTTON(self, self.ID_BUTTON_REMOVE, self.OnButtonRemove)
|
|
||||||
EVT_UPDATE_UI(self, self.ID_BUTTON_UP, self.OnUpdateUI)
|
|
||||||
EVT_UPDATE_UI(self, self.ID_BUTTON_DOWN, self.OnUpdateUI)
|
|
||||||
EVT_UPDATE_UI(self, self.ID_BUTTON_REMOVE, self.OnUpdateUI)
|
|
||||||
def OnButtonUp(self, evt):
|
|
||||||
i = self.list.GetSelection()
|
|
||||||
str = self.list.GetString(i)
|
|
||||||
self.list.Delete(i)
|
|
||||||
self.list.InsertItems([str], i-1)
|
|
||||||
self.list.SetSelection(i-1)
|
|
||||||
def OnButtonDown(self, evt):
|
|
||||||
i = self.list.GetSelection()
|
|
||||||
str = self.list.GetString(i)
|
|
||||||
self.list.Delete(i)
|
|
||||||
self.list.InsertItems([str], i+1)
|
|
||||||
self.list.SetSelection(i+1)
|
|
||||||
def OnButtonAppend(self, evt):
|
|
||||||
str = wxGetTextFromUser('Enter new item:', 'Append', '', self)
|
|
||||||
self.list.Append(str)
|
|
||||||
def OnButtonRemove(self, evt):
|
|
||||||
self.list.Delete(self.list.GetSelection())
|
|
||||||
def OnUpdateUI(self, evt):
|
|
||||||
if evt.GetId() == self.ID_BUTTON_REMOVE:
|
|
||||||
evt.Enable(self.list.GetSelection() != -1)
|
|
||||||
elif evt.GetId() == self.ID_BUTTON_UP:
|
|
||||||
evt.Enable(self.list.GetSelection() > 0)
|
|
||||||
elif evt.GetId() == self.ID_BUTTON_DOWN:
|
|
||||||
evt.Enable(self.list.GetSelection() != -1 and \
|
|
||||||
self.list.GetSelection() < self.list.GetCount() - 1)
|
|
||||||
|
|
||||||
class ContentCheckListDialog(wxDialog):
|
|
||||||
def __init__(self, parent, value):
|
|
||||||
pre = wxPreDialog()
|
|
||||||
g.frame.res.LoadOnDialog(pre, parent, 'DIALOG_CONTENT_CHECK_LIST')
|
|
||||||
self.this = pre.this
|
|
||||||
self._setOORInfo(self)
|
|
||||||
self.list = XRCCTRL(self, 'CHECK_LIST')
|
|
||||||
# Set list items
|
|
||||||
i = 0
|
|
||||||
for v,ch in value:
|
|
||||||
self.list.Append(v)
|
|
||||||
self.list.Check(i, ch)
|
|
||||||
i += 1
|
|
||||||
self.SetAutoLayout(True)
|
|
||||||
self.GetSizer().Fit(self)
|
|
||||||
# Callbacks
|
|
||||||
self.ID_BUTTON_APPEND = XRCID('BUTTON_APPEND')
|
|
||||||
self.ID_BUTTON_REMOVE = XRCID('BUTTON_REMOVE')
|
|
||||||
self.ID_BUTTON_UP = XRCID('BUTTON_UP')
|
|
||||||
self.ID_BUTTON_DOWN = XRCID('BUTTON_DOWN')
|
|
||||||
EVT_CHECKLISTBOX(self, self.list.GetId(), self.OnCheck)
|
|
||||||
EVT_BUTTON(self, self.ID_BUTTON_UP, self.OnButtonUp)
|
|
||||||
EVT_BUTTON(self, self.ID_BUTTON_DOWN, self.OnButtonDown)
|
|
||||||
EVT_BUTTON(self, self.ID_BUTTON_APPEND, self.OnButtonAppend)
|
|
||||||
EVT_BUTTON(self, self.ID_BUTTON_REMOVE, self.OnButtonRemove)
|
|
||||||
EVT_UPDATE_UI(self, self.ID_BUTTON_UP, self.OnUpdateUI)
|
|
||||||
EVT_UPDATE_UI(self, self.ID_BUTTON_DOWN, self.OnUpdateUI)
|
|
||||||
EVT_UPDATE_UI(self, self.ID_BUTTON_REMOVE, self.OnUpdateUI)
|
|
||||||
def OnCheck(self, evt):
|
|
||||||
# !!! Wrong wxGTK (wxMSW?) behavior: toggling selection if checking
|
|
||||||
self.list.Deselect(evt.GetSelection())
|
|
||||||
def OnButtonUp(self, evt):
|
|
||||||
i = self.list.GetSelection()
|
|
||||||
str, ch = self.list.GetString(i), self.list.IsChecked(i)
|
|
||||||
self.list.Delete(i)
|
|
||||||
self.list.InsertItems([str], i-1)
|
|
||||||
self.list.Check(i-1, ch)
|
|
||||||
self.list.SetSelection(i-1)
|
|
||||||
def OnButtonDown(self, evt):
|
|
||||||
i = self.list.GetSelection()
|
|
||||||
str, ch = self.list.GetString(i), self.list.IsChecked(i)
|
|
||||||
self.list.Delete(i)
|
|
||||||
self.list.InsertItems([str], i+1)
|
|
||||||
self.list.Check(i+1, ch)
|
|
||||||
self.list.SetSelection(i+1)
|
|
||||||
def OnButtonAppend(self, evt):
|
|
||||||
str = wxGetTextFromUser('Enter new item:', 'Append', '', self)
|
|
||||||
self.list.Append(str)
|
|
||||||
def OnButtonRemove(self, evt):
|
|
||||||
self.list.Delete(self.list.GetSelection())
|
|
||||||
def OnUpdateUI(self, evt):
|
|
||||||
if evt.GetId() == self.ID_BUTTON_REMOVE:
|
|
||||||
evt.Enable(self.list.GetSelection() != -1)
|
|
||||||
elif evt.GetId() == self.ID_BUTTON_UP:
|
|
||||||
evt.Enable(self.list.GetSelection() > 0)
|
|
||||||
elif evt.GetId() == self.ID_BUTTON_DOWN:
|
|
||||||
evt.Enable(self.list.GetSelection() != -1 and \
|
|
||||||
self.list.GetSelection() < self.list.GetCount() - 1)
|
|
||||||
|
|
||||||
class ParamContent(PPanel):
|
|
||||||
def __init__(self, parent, name):
|
|
||||||
PPanel.__init__(self, parent, name)
|
|
||||||
self.ID_TEXT_CTRL = wxNewId()
|
|
||||||
self.ID_BUTTON_EDIT = wxNewId()
|
|
||||||
sizer = wxBoxSizer()
|
|
||||||
self.text = wxTextCtrl(self, self.ID_TEXT_CTRL, size=wxSize(200,-1))
|
|
||||||
sizer.Add(self.text, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, 5)
|
|
||||||
self.button = wxButton(self, self.ID_BUTTON_EDIT, 'Edit...', size=buttonSize)
|
|
||||||
sizer.Add(self.button, 0, wxALIGN_CENTER_VERTICAL)
|
|
||||||
self.SetAutoLayout(True)
|
|
||||||
self.SetSizer(sizer)
|
|
||||||
sizer.Fit(self)
|
|
||||||
self.textModified = False
|
|
||||||
EVT_BUTTON(self, self.ID_BUTTON_EDIT, self.OnButtonEdit)
|
|
||||||
EVT_TEXT(self, self.ID_TEXT_CTRL, self.OnChange)
|
|
||||||
def OnChange(self, evt):
|
|
||||||
PPanel.OnChange(self, evt)
|
|
||||||
self.textModified = True
|
|
||||||
def GetValue(self):
|
|
||||||
if self.textModified: # text has newer value
|
|
||||||
try:
|
|
||||||
return eval(self.text.GetValue())
|
|
||||||
except SyntaxError:
|
|
||||||
wxLogError('Syntax error in parameter value: ' + self.GetName())
|
|
||||||
return []
|
|
||||||
return self.value
|
|
||||||
def SetValue(self, value):
|
|
||||||
self.freeze = True
|
|
||||||
if not value: value = []
|
|
||||||
self.value = value
|
|
||||||
self.text.SetValue(str(value)) # update text ctrl
|
|
||||||
self.freeze = False
|
|
||||||
def OnButtonEdit(self, evt):
|
|
||||||
if self.textModified: # text has newer value
|
|
||||||
try:
|
|
||||||
self.value = eval(self.text.GetValue())
|
|
||||||
except SyntaxError:
|
|
||||||
wxLogError('Syntax error in parameter value: ' + self.GetName())
|
|
||||||
self.value = []
|
|
||||||
dlg = ContentDialog(self, self.value)
|
|
||||||
if dlg.ShowModal() == wxID_OK:
|
|
||||||
value = []
|
|
||||||
for i in range(dlg.list.GetCount()):
|
|
||||||
value.append(dlg.list.GetString(i))
|
|
||||||
# Add ignored flags
|
|
||||||
self.SetValue(value)
|
|
||||||
self.SetModified()
|
|
||||||
self.textModified = False
|
|
||||||
dlg.Destroy()
|
|
||||||
|
|
||||||
# CheckList content
|
|
||||||
class ParamContentCheckList(ParamContent):
|
|
||||||
def __init__(self, parent, name):
|
|
||||||
ParamContent.__init__(self, parent, name)
|
|
||||||
def OnButtonEdit(self, evt):
|
|
||||||
if self.textModified: # text has newer value
|
|
||||||
try:
|
|
||||||
self.value = eval(self.text.GetValue())
|
|
||||||
except SyntaxError:
|
|
||||||
wxLogError('Syntax error in parameter value: ' + self.GetName())
|
|
||||||
self.value = []
|
|
||||||
dlg = ContentCheckListDialog(self, self.value)
|
|
||||||
if dlg.ShowModal() == wxID_OK:
|
|
||||||
value = []
|
|
||||||
for i in range(dlg.list.GetCount()):
|
|
||||||
value.append((dlg.list.GetString(i), dlg.list.IsChecked(i)))
|
|
||||||
# Add ignored flags
|
|
||||||
self.SetValue(value)
|
|
||||||
self.SetModified()
|
|
||||||
self.textModified = False
|
|
||||||
dlg.Destroy()
|
|
||||||
|
|
||||||
class IntListDialog(wxDialog):
|
|
||||||
def __init__(self, parent, value):
|
|
||||||
pre = wxPreDialog()
|
|
||||||
g.frame.res.LoadOnDialog(pre, parent, 'DIALOG_INTLIST')
|
|
||||||
self.this = pre.this
|
|
||||||
self._setOORInfo(self)
|
|
||||||
self.list = XRCCTRL(self, 'LIST')
|
|
||||||
# Set list items
|
|
||||||
value.sort()
|
|
||||||
for v in value:
|
|
||||||
if type(v) != IntType:
|
|
||||||
wxLogError('Invalid item type')
|
|
||||||
else:
|
|
||||||
self.list.Append(str(v))
|
|
||||||
self.SetAutoLayout(True)
|
|
||||||
self.GetSizer().Fit(self)
|
|
||||||
# Callbacks
|
|
||||||
self.ID_BUTTON_ADD = XRCID('BUTTON_ADD')
|
|
||||||
self.ID_BUTTON_REMOVE = XRCID('BUTTON_REMOVE')
|
|
||||||
EVT_BUTTON(self, self.ID_BUTTON_ADD, self.OnButtonAppend)
|
|
||||||
EVT_BUTTON(self, self.ID_BUTTON_REMOVE, self.OnButtonRemove)
|
|
||||||
EVT_UPDATE_UI(self, self.ID_BUTTON_REMOVE, self.OnUpdateUI)
|
|
||||||
def OnButtonAppend(self, evt):
|
|
||||||
s = wxGetTextFromUser('Enter new number:', 'Add', '', self)
|
|
||||||
if not s: return
|
|
||||||
# Check that it's unique
|
|
||||||
try:
|
|
||||||
v = int(s)
|
|
||||||
s = str(v) # to be sure
|
|
||||||
i = self.list.FindString(s)
|
|
||||||
if i == -1: # ignore non-unique
|
|
||||||
# Find place to insert
|
|
||||||
found = False
|
|
||||||
for i in range(self.list.GetCount()):
|
|
||||||
if int(self.list.GetString(i)) > v:
|
|
||||||
found = True
|
|
||||||
break
|
|
||||||
if found: self.list.InsertItems([s], i)
|
|
||||||
else: self.list.Append(s)
|
|
||||||
except ValueError:
|
|
||||||
wxLogError('List item is not an int!')
|
|
||||||
def OnButtonRemove(self, evt):
|
|
||||||
self.list.Delete(self.list.GetSelection())
|
|
||||||
def OnUpdateUI(self, evt):
|
|
||||||
if evt.GetId() == self.ID_BUTTON_REMOVE:
|
|
||||||
evt.Enable(self.list.GetSelection() != -1)
|
|
||||||
|
|
||||||
# For growable list
|
|
||||||
class ParamIntList(ParamContent):
|
|
||||||
def __init__(self, parent, name):
|
|
||||||
ParamContent.__init__(self, parent, name)
|
|
||||||
def OnButtonEdit(self, evt):
|
|
||||||
if self.textModified: # text has newer value
|
|
||||||
try:
|
|
||||||
self.value = eval(self.text.GetValue())
|
|
||||||
except SyntaxError:
|
|
||||||
wxLogError('Syntax error in parameter value: ' + self.GetName())
|
|
||||||
self.value = []
|
|
||||||
dlg = IntListDialog(self, self.value)
|
|
||||||
if dlg.ShowModal() == wxID_OK:
|
|
||||||
value = []
|
|
||||||
for i in range(dlg.list.GetCount()):
|
|
||||||
value.append(int(dlg.list.GetString(i)))
|
|
||||||
# Add ignored flags
|
|
||||||
self.SetValue(value)
|
|
||||||
self.SetModified()
|
|
||||||
self.textModified = False
|
|
||||||
dlg.Destroy()
|
|
||||||
|
|
||||||
# Boxless radiobox
|
|
||||||
class RadioBox(PPanel):
|
|
||||||
def __init__(self, parent, id, choices,
|
|
||||||
pos=wxDefaultPosition, name='radiobox'):
|
|
||||||
PPanel.__init__(self, parent, name)
|
|
||||||
self.choices = choices
|
|
||||||
topSizer = wxBoxSizer()
|
|
||||||
for i in choices:
|
|
||||||
button = wxRadioButton(self, -1, i, size=(-1,buttonSize[1]), name=i)
|
|
||||||
topSizer.Add(button, 0, wxRIGHT, 5)
|
|
||||||
EVT_RADIOBUTTON(self, button.GetId(), self.OnRadioChoice)
|
|
||||||
self.SetAutoLayout(True)
|
|
||||||
self.SetSizer(topSizer)
|
|
||||||
topSizer.Fit(self)
|
|
||||||
def SetStringSelection(self, value):
|
|
||||||
self.freeze = True
|
|
||||||
for i in self.choices:
|
|
||||||
self.FindWindowByName(i).SetValue(i == value)
|
|
||||||
self.value = value
|
|
||||||
self.freeze = False
|
|
||||||
def OnRadioChoice(self, evt):
|
|
||||||
if self.freeze: return
|
|
||||||
if evt.GetSelection():
|
|
||||||
self.value = evt.GetEventObject().GetName()
|
|
||||||
self.SetModified()
|
|
||||||
def GetStringSelection(self):
|
|
||||||
return self.value
|
|
||||||
|
|
||||||
class ParamBool(RadioBox):
|
|
||||||
values = {'yes': '1', 'no': '0'}
|
|
||||||
seulav = {'1': 'yes', '0': 'no'}
|
|
||||||
def __init__(self, parent, name):
|
|
||||||
RadioBox.__init__(self, parent, -1, choices=self.values.keys(), name=name)
|
|
||||||
def GetValue(self):
|
|
||||||
return self.values[self.GetStringSelection()]
|
|
||||||
def SetValue(self, value):
|
|
||||||
if not value: value = '1'
|
|
||||||
self.SetStringSelection(self.seulav[value])
|
|
||||||
|
|
||||||
class ParamOrient(RadioBox):
|
|
||||||
values = {'horizontal': 'wxHORIZONTAL', 'vertical': 'wxVERTICAL'}
|
|
||||||
seulav = {'wxHORIZONTAL': 'horizontal', 'wxVERTICAL': 'vertical'}
|
|
||||||
def __init__(self, parent, name):
|
|
||||||
RadioBox.__init__(self, parent, -1, choices=self.values.keys(), name=name)
|
|
||||||
def GetValue(self):
|
|
||||||
return self.values[self.GetStringSelection()]
|
|
||||||
def SetValue(self, value):
|
|
||||||
if not value: value = 'wxHORIZONTAL'
|
|
||||||
self.SetStringSelection(self.seulav[value])
|
|
||||||
|
|
||||||
class ParamOrientation(RadioBox):
|
|
||||||
values = {'horizontal': 'horizontal', 'vertical': 'vertical'}
|
|
||||||
seulav = {'horizontal': 'horizontal', 'vertical': 'vertical'}
|
|
||||||
def __init__(self, parent, name):
|
|
||||||
RadioBox.__init__(self, parent, -1, choices=self.values.keys(), name=name)
|
|
||||||
def GetValue(self):
|
|
||||||
return self.values[self.GetStringSelection()]
|
|
||||||
def SetValue(self, value):
|
|
||||||
if not value: value = 'vertical'
|
|
||||||
self.SetStringSelection(self.seulav[value])
|
|
||||||
|
|
||||||
class ParamFile(PPanel):
|
|
||||||
def __init__(self, parent, name):
|
|
||||||
PPanel.__init__(self, parent, name)
|
|
||||||
self.ID_TEXT_CTRL = wxNewId()
|
|
||||||
self.ID_BUTTON_BROWSE = wxNewId()
|
|
||||||
sizer = wxBoxSizer()
|
|
||||||
self.text = wxTextCtrl(self, self.ID_TEXT_CTRL, size=wxSize(200,-1))
|
|
||||||
sizer.Add(self.text, 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, 5)
|
|
||||||
self.button = wxButton(self, self.ID_BUTTON_BROWSE, 'Browse...',size=buttonSize)
|
|
||||||
sizer.Add(self.button, 0, wxALIGN_CENTER_VERTICAL)
|
|
||||||
self.SetAutoLayout(True)
|
|
||||||
self.SetSizer(sizer)
|
|
||||||
sizer.Fit(self)
|
|
||||||
self.textModified = False
|
|
||||||
EVT_BUTTON(self, self.ID_BUTTON_BROWSE, self.OnButtonBrowse)
|
|
||||||
EVT_TEXT(self, self.ID_TEXT_CTRL, self.OnChange)
|
|
||||||
def OnChange(self, evt):
|
|
||||||
PPanel.OnChange(self, evt)
|
|
||||||
self.textModified = True
|
|
||||||
def GetValue(self):
|
|
||||||
if self.textModified: # text has newer value
|
|
||||||
return self.text.GetValue()
|
|
||||||
return self.value
|
|
||||||
def SetValue(self, value):
|
|
||||||
self.freeze = True
|
|
||||||
self.value = value
|
|
||||||
self.text.SetValue(value) # update text ctrl
|
|
||||||
self.freeze = False
|
|
||||||
def OnButtonBrowse(self, evt):
|
|
||||||
if self.textModified: # text has newer value
|
|
||||||
self.value = self.text.GetValue()
|
|
||||||
dlg = wxFileDialog(self,
|
|
||||||
defaultDir = os.path.abspath(os.path.dirname(self.value)),
|
|
||||||
defaultFile = os.path.basename(self.value))
|
|
||||||
if dlg.ShowModal() == wxID_OK:
|
|
||||||
# Get common part of selected path and current
|
|
||||||
if g.frame.dataFile:
|
|
||||||
curpath = os.path.abspath(g.frame.dataFile)
|
|
||||||
else:
|
|
||||||
curpath = os.path.join(os.getcwd(), '')
|
|
||||||
common = os.path.commonprefix([curpath, dlg.GetPath()])
|
|
||||||
self.SetValue(dlg.GetPath()[len(common):])
|
|
||||||
self.SetModified()
|
|
||||||
self.textModified = False
|
|
||||||
dlg.Destroy()
|
|
||||||
|
|
||||||
class ParamBitmap(PPanel):
|
|
||||||
def __init__(self, parent, name):
|
|
||||||
pre = wxPrePanel()
|
|
||||||
g.frame.res.LoadOnPanel(pre, parent, 'PANEL_BITMAP')
|
|
||||||
self.this = pre.this
|
|
||||||
self._setOORInfo(self)
|
|
||||||
self.modified = self.freeze = False
|
|
||||||
self.radio_std = XRCCTRL(self, 'RADIO_STD')
|
|
||||||
self.radio_file = XRCCTRL(self, 'RADIO_FILE')
|
|
||||||
self.combo = XRCCTRL(self, 'COMBO_STD')
|
|
||||||
self.text = XRCCTRL(self, 'TEXT_FILE')
|
|
||||||
self.button = XRCCTRL(self, 'BUTTON_BROWSE')
|
|
||||||
self.textModified = False
|
|
||||||
self.SetAutoLayout(True)
|
|
||||||
self.GetSizer().SetMinSize((260, -1))
|
|
||||||
self.GetSizer().Fit(self)
|
|
||||||
EVT_RADIOBUTTON(self, XRCID('RADIO_STD'), self.OnRadioStd)
|
|
||||||
EVT_RADIOBUTTON(self, XRCID('RADIO_FILE'), self.OnRadioFile)
|
|
||||||
EVT_BUTTON(self, XRCID('BUTTON_BROWSE'), self.OnButtonBrowse)
|
|
||||||
EVT_COMBOBOX(self, XRCID('COMBO_STD'), self.OnCombo)
|
|
||||||
EVT_TEXT(self, XRCID('COMBO_STD'), self.OnChange)
|
|
||||||
EVT_TEXT(self, XRCID('TEXT_FILE'), self.OnChange)
|
|
||||||
def OnRadioStd(self, evt):
|
|
||||||
self.SetModified()
|
|
||||||
self.SetValue(['wxART_MISSING_IMAGE',''])
|
|
||||||
def OnRadioFile(self, evt):
|
|
||||||
self.SetModified()
|
|
||||||
self.SetValue(['',''])
|
|
||||||
def updateRadios(self):
|
|
||||||
if self.value[0]:
|
|
||||||
self.radio_std.SetValue(True)
|
|
||||||
self.radio_file.SetValue(False)
|
|
||||||
self.text.Enable(False)
|
|
||||||
self.button.Enable(False)
|
|
||||||
self.combo.Enable(True)
|
|
||||||
else:
|
|
||||||
self.radio_std.SetValue(False)
|
|
||||||
self.radio_file.SetValue(True)
|
|
||||||
self.text.Enable(True)
|
|
||||||
self.button.Enable(True)
|
|
||||||
self.combo.Enable(False)
|
|
||||||
def OnChange(self, evt):
|
|
||||||
PPanel.OnChange(self, evt)
|
|
||||||
self.textModified = True
|
|
||||||
def OnCombo(self, evt):
|
|
||||||
PPanel.OnChange(self, evt)
|
|
||||||
self.value[0] = self.combo.GetValue()
|
|
||||||
def GetValue(self):
|
|
||||||
if self.textModified: # text has newer value
|
|
||||||
return [self.combo.GetValue(), self.text.GetValue()]
|
|
||||||
return self.value
|
|
||||||
def SetValue(self, value):
|
|
||||||
self.freeze = True
|
|
||||||
if not value:
|
|
||||||
self.value = ['', '']
|
|
||||||
else:
|
|
||||||
self.value = value
|
|
||||||
self.combo.SetValue(self.value[0])
|
|
||||||
self.text.SetValue(self.value[1]) # update text ctrl
|
|
||||||
self.updateRadios()
|
|
||||||
self.freeze = False
|
|
||||||
def OnButtonBrowse(self, evt):
|
|
||||||
if self.textModified: # text has newer value
|
|
||||||
self.value[1] = self.text.GetValue()
|
|
||||||
dlg = wxFileDialog(self,
|
|
||||||
defaultDir = os.path.abspath(os.path.dirname(self.value[1])),
|
|
||||||
defaultFile = os.path.basename(self.value[1]))
|
|
||||||
if dlg.ShowModal() == wxID_OK:
|
|
||||||
# Get common part of selected path and current
|
|
||||||
if g.frame.dataFile:
|
|
||||||
curpath = os.path.abspath(g.frame.dataFile)
|
|
||||||
else:
|
|
||||||
curpath = os.path.join(os.getcwd(), '')
|
|
||||||
common = os.path.commonprefix([curpath, dlg.GetPath()])
|
|
||||||
self.SetValue(['', dlg.GetPath()[len(common):]])
|
|
||||||
self.SetModified()
|
|
||||||
self.textModified = False
|
|
||||||
dlg.Destroy()
|
|
||||||
|
|
||||||
paramDict = {
|
|
||||||
'flag': ParamFlag,
|
|
||||||
'style': ParamStyle, 'exstyle': ParamExStyle,
|
|
||||||
'pos': ParamPosSize, 'size': ParamPosSize,
|
|
||||||
'cellpos': ParamPosSize, 'cellspan': ParamPosSize,
|
|
||||||
'border': ParamUnit, 'cols': ParamInt, 'rows': ParamInt,
|
|
||||||
'vgap': ParamUnit, 'hgap': ParamUnit,
|
|
||||||
'checkable': ParamBool, 'checked': ParamBool, 'radio': ParamBool,
|
|
||||||
'accel': ParamAccel,
|
|
||||||
'label': ParamMultilineText, 'title': ParamText, 'value': ParamText,
|
|
||||||
'content': ParamContent, 'selection': ParamInt,
|
|
||||||
'min': ParamInt, 'max': ParamInt,
|
|
||||||
'fg': ParamColour, 'bg': ParamColour, 'font': ParamFont,
|
|
||||||
'enabled': ParamBool, 'focused': ParamBool, 'hidden': ParamBool,
|
|
||||||
'tooltip': ParamText, 'bitmap': ParamBitmap, 'icon': ParamBitmap,
|
|
||||||
'encoding': ParamEncoding
|
|
||||||
}
|
|
@@ -1,24 +0,0 @@
|
|||||||
(require 'sawmill-defaults)
|
|
||||||
|
|
||||||
;;; Define two hooks to reset focus behavior while mapping test window
|
|
||||||
|
|
||||||
(define (xrced-match-window-before w)
|
|
||||||
(setq prop (aref (get-x-text-property w 'WM_CLASS) 0))
|
|
||||||
(cond ((equal prop "_XRCED_T_W")
|
|
||||||
(setq transients-get-focus-b transients-get-focus)
|
|
||||||
(setq transients-get-focus nil)
|
|
||||||
(setq focus-windows-when-mapped-b focus-windows-when-mapped)
|
|
||||||
(setq focus-windows-when-mapped nil)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
(define (xrced-match-window-after w)
|
|
||||||
(setq prop (aref (get-x-text-property w 'WM_CLASS) 0))
|
|
||||||
(cond ((equal prop "_XRCED_T_W")
|
|
||||||
(setq transients-get-focus-b transients-get-focus-b)
|
|
||||||
(setq focus-windows-when-mapped focus-windows-when-mapped-b)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
(add-hook 'map-notify-hook xrced-match-window-before)
|
|
||||||
(add-hook 'map-notify-hook xrced-match-window-after 't)
|
|
Before Width: | Height: | Size: 316 B |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 513 B |
Before Width: | Height: | Size: 502 B |
Before Width: | Height: | Size: 275 B |
Before Width: | Height: | Size: 350 B |
Before Width: | Height: | Size: 616 B |
Before Width: | Height: | Size: 141 B |
Before Width: | Height: | Size: 182 B |
Before Width: | Height: | Size: 117 B |
Before Width: | Height: | Size: 233 B |
Before Width: | Height: | Size: 193 B |
Before Width: | Height: | Size: 233 B |
Before Width: | Height: | Size: 154 B |
Before Width: | Height: | Size: 146 B |
Before Width: | Height: | Size: 139 B |
Before Width: | Height: | Size: 131 B |
Before Width: | Height: | Size: 141 B |
Before Width: | Height: | Size: 189 B |
Before Width: | Height: | Size: 133 B |
Before Width: | Height: | Size: 184 B |
Before Width: | Height: | Size: 167 B |
Before Width: | Height: | Size: 166 B |
Before Width: | Height: | Size: 171 B |
Before Width: | Height: | Size: 135 B |
Before Width: | Height: | Size: 253 B |
Before Width: | Height: | Size: 140 B |
Before Width: | Height: | Size: 296 B |
Before Width: | Height: | Size: 200 B |
Before Width: | Height: | Size: 170 B |
Before Width: | Height: | Size: 254 B |
Before Width: | Height: | Size: 80 B |
Before Width: | Height: | Size: 185 B |
Before Width: | Height: | Size: 249 B |
Before Width: | Height: | Size: 161 B |
Before Width: | Height: | Size: 308 B |
Before Width: | Height: | Size: 182 B |
Before Width: | Height: | Size: 576 B |
Before Width: | Height: | Size: 189 B |
Before Width: | Height: | Size: 173 B |
Before Width: | Height: | Size: 82 B |
Before Width: | Height: | Size: 166 B |
Before Width: | Height: | Size: 129 B |
Before Width: | Height: | Size: 119 B |
Before Width: | Height: | Size: 165 B |
Before Width: | Height: | Size: 154 B |
Before Width: | Height: | Size: 145 B |
Before Width: | Height: | Size: 154 B |
Before Width: | Height: | Size: 146 B |
Before Width: | Height: | Size: 131 B |
Before Width: | Height: | Size: 166 B |
Before Width: | Height: | Size: 171 B |
Before Width: | Height: | Size: 139 B |
Before Width: | Height: | Size: 140 B |
Before Width: | Height: | Size: 170 B |
Before Width: | Height: | Size: 103 B |
Before Width: | Height: | Size: 139 B |
Before Width: | Height: | Size: 133 B |
Before Width: | Height: | Size: 189 B |
Before Width: | Height: | Size: 141 B |
Before Width: | Height: | Size: 136 B |
Before Width: | Height: | Size: 173 B |
Before Width: | Height: | Size: 177 B |
Before Width: | Height: | Size: 141 B |
Before Width: | Height: | Size: 185 B |
@@ -1,285 +0,0 @@
|
|||||||
# Name: tools.py
|
|
||||||
# Purpose: XRC editor, toolbar
|
|
||||||
# Author: Roman Rolinsky <rolinsky@mema.ucl.ac.be>
|
|
||||||
# Created: 19.03.2003
|
|
||||||
# RCS-ID: $Id$
|
|
||||||
|
|
||||||
from xxx import * # xxx imports globals and params
|
|
||||||
from tree import ID_NEW
|
|
||||||
|
|
||||||
# Icons
|
|
||||||
import images
|
|
||||||
|
|
||||||
# Groups of controls
|
|
||||||
GROUPNUM = 4
|
|
||||||
GROUP_WINDOWS, GROUP_MENUS, GROUP_SIZERS, GROUP_CONTROLS = range(GROUPNUM)
|
|
||||||
|
|
||||||
# States depending on current selection and Control/Shift keys
|
|
||||||
STATE_ROOT, STATE_MENUBAR, STATE_TOOLBAR, STATE_MENU, STATE_ELSE = range(5)
|
|
||||||
|
|
||||||
# Left toolbar for GUI elements
|
|
||||||
class Tools(wxPanel):
|
|
||||||
TOOL_SIZE = (30, 30)
|
|
||||||
def __init__(self, parent):
|
|
||||||
if wxPlatform == '__WXGTK__':
|
|
||||||
wxPanel.__init__(self, parent, -1,
|
|
||||||
style=wxRAISED_BORDER|wxWANTS_CHARS)
|
|
||||||
else:
|
|
||||||
wxPanel.__init__(self, parent, -1, style=wxWANTS_CHARS)
|
|
||||||
# Create sizer for groups
|
|
||||||
self.sizer = wxBoxSizer(wxVERTICAL)
|
|
||||||
# Data to create buttons
|
|
||||||
pullDownMenu = g.pullDownMenu
|
|
||||||
self.groups = []
|
|
||||||
self.ctrl = self.shift = False
|
|
||||||
# Current state (what to enable/disable)
|
|
||||||
self.state = None
|
|
||||||
groups = [
|
|
||||||
["Windows",
|
|
||||||
(ID_NEW.FRAME, images.getToolFrameBitmap()),
|
|
||||||
(ID_NEW.DIALOG, images.getToolDialogBitmap()),
|
|
||||||
(ID_NEW.PANEL, images.getToolPanelBitmap())],
|
|
||||||
["Menus",
|
|
||||||
(ID_NEW.TOOL_BAR, images.getToolToolBarBitmap()),
|
|
||||||
(ID_NEW.MENU_BAR, images.getToolMenuBarBitmap()),
|
|
||||||
(ID_NEW.MENU, images.getToolMenuBitmap()),
|
|
||||||
(ID_NEW.TOOL, images.getToolToolBitmap()),
|
|
||||||
(ID_NEW.MENU_ITEM, images.getToolMenuItemBitmap()),
|
|
||||||
(ID_NEW.SEPARATOR, images.getToolSeparatorBitmap())],
|
|
||||||
["Sizers",
|
|
||||||
(ID_NEW.BOX_SIZER, images.getToolBoxSizerBitmap()),
|
|
||||||
(ID_NEW.STATIC_BOX_SIZER, images.getToolStaticBoxSizerBitmap()),
|
|
||||||
(ID_NEW.GRID_SIZER, images.getToolGridSizerBitmap()),
|
|
||||||
(ID_NEW.FLEX_GRID_SIZER, images.getToolFlexGridSizerBitmap()),
|
|
||||||
(ID_NEW.GRID_BAG_SIZER, images.getToolGridBagSizerBitmap()),
|
|
||||||
(ID_NEW.SPACER, images.getToolSpacerBitmap())],
|
|
||||||
["Controls",
|
|
||||||
(ID_NEW.STATIC_TEXT, images.getToolStaticTextBitmap()),
|
|
||||||
(ID_NEW.STATIC_BITMAP, images.getToolStaticBitmapBitmap()),
|
|
||||||
(ID_NEW.STATIC_LINE, images.getToolStaticLineBitmap()),
|
|
||||||
|
|
||||||
(ID_NEW.BUTTON, images.getToolButtonBitmap()),
|
|
||||||
(ID_NEW.BITMAP_BUTTON, images.getToolBitmapButtonBitmap()),
|
|
||||||
(ID_NEW.STATIC_BOX, images.getToolStaticBoxBitmap()),
|
|
||||||
|
|
||||||
(ID_NEW.TEXT_CTRL, images.getToolTextCtrlBitmap()),
|
|
||||||
(ID_NEW.COMBO_BOX, images.getToolComboBoxBitmap()),
|
|
||||||
(ID_NEW.CHOICE, images.getToolChoiceBitmap()),
|
|
||||||
|
|
||||||
(ID_NEW.RADIO_BUTTON, images.getToolRadioButtonBitmap()),
|
|
||||||
(ID_NEW.CHECK_BOX, images.getToolCheckBoxBitmap()),
|
|
||||||
(ID_NEW.RADIO_BOX, images.getToolRadioBoxBitmap()),
|
|
||||||
|
|
||||||
(ID_NEW.SPIN_CTRL, images.getToolSpinCtrlBitmap()),
|
|
||||||
(ID_NEW.SPIN_BUTTON, images.getToolSpinButtonBitmap()),
|
|
||||||
(ID_NEW.SCROLL_BAR, images.getToolScrollBarBitmap()),
|
|
||||||
|
|
||||||
(ID_NEW.SLIDER, images.getToolSliderBitmap()),
|
|
||||||
(ID_NEW.GAUGE, images.getToolGaugeBitmap()),
|
|
||||||
(ID_NEW.TREE_CTRL, images.getToolTreeCtrlBitmap()),
|
|
||||||
|
|
||||||
(ID_NEW.LIST_BOX, images.getToolListBoxBitmap()),
|
|
||||||
(ID_NEW.CHECK_LIST, images.getToolCheckListBitmap()),
|
|
||||||
(ID_NEW.LIST_CTRL, images.getToolListCtrlBitmap()),
|
|
||||||
|
|
||||||
(ID_NEW.NOTEBOOK, images.getToolNotebookBitmap()),
|
|
||||||
(ID_NEW.SPLITTER_WINDOW, images.getToolSplitterWindowBitmap()),
|
|
||||||
|
|
||||||
(ID_NEW.UNKNOWN, images.getToolUnknownBitmap())]
|
|
||||||
]
|
|
||||||
for grp in groups:
|
|
||||||
self.AddGroup(grp[0])
|
|
||||||
for b in grp[1:]:
|
|
||||||
self.AddButton(b[0], b[1], g.pullDownMenu.createMap[b[0]])
|
|
||||||
self.SetAutoLayout(True)
|
|
||||||
self.SetSizerAndFit(self.sizer)
|
|
||||||
# Allow to be resized in vertical direction only
|
|
||||||
self.SetSizeHints(self.GetSize()[0], -1)
|
|
||||||
# Events
|
|
||||||
EVT_COMMAND_RANGE(self, ID_NEW.PANEL, ID_NEW.LAST,
|
|
||||||
wxEVT_COMMAND_BUTTON_CLICKED, g.frame.OnCreate)
|
|
||||||
EVT_KEY_DOWN(self, self.OnKeyDown)
|
|
||||||
EVT_KEY_UP(self, self.OnKeyUp)
|
|
||||||
|
|
||||||
def AddButton(self, id, image, text):
|
|
||||||
from wxPython.lib import buttons
|
|
||||||
button = buttons.wxGenBitmapButton(self, id, image, size=self.TOOL_SIZE,
|
|
||||||
style=wxNO_BORDER|wxWANTS_CHARS)
|
|
||||||
button.SetBezelWidth(0)
|
|
||||||
EVT_KEY_DOWN(button, self.OnKeyDown)
|
|
||||||
EVT_KEY_UP(button, self.OnKeyUp)
|
|
||||||
button.SetToolTipString(text)
|
|
||||||
self.curSizer.Add(button)
|
|
||||||
self.groups[-1][1][id] = button
|
|
||||||
|
|
||||||
def AddGroup(self, name):
|
|
||||||
# Each group is inside box
|
|
||||||
box = wxStaticBox(self, -1, name, style=wxWANTS_CHARS)
|
|
||||||
box.SetFont(g.smallerFont())
|
|
||||||
boxSizer = wxStaticBoxSizer(box, wxVERTICAL)
|
|
||||||
boxSizer.Add((0, 4))
|
|
||||||
self.curSizer = wxGridSizer(0, 3)
|
|
||||||
boxSizer.Add(self.curSizer)
|
|
||||||
self.sizer.Add(boxSizer, 0, wxTOP | wxLEFT | wxRIGHT, 4)
|
|
||||||
self.groups.append((box,{}))
|
|
||||||
|
|
||||||
# Enable/disable group
|
|
||||||
def EnableGroup(self, gnum, enable = True):
|
|
||||||
grp = self.groups[gnum]
|
|
||||||
grp[0].Enable(enable)
|
|
||||||
for b in grp[1].values(): b.Enable(enable)
|
|
||||||
|
|
||||||
# Enable/disable group item
|
|
||||||
def EnableGroupItem(self, gnum, id, enable = True):
|
|
||||||
grp = self.groups[gnum]
|
|
||||||
grp[1][id].Enable(enable)
|
|
||||||
|
|
||||||
# Enable/disable group items
|
|
||||||
def EnableGroupItems(self, gnum, ids, enable = True):
|
|
||||||
grp = self.groups[gnum]
|
|
||||||
for id in ids:
|
|
||||||
grp[1][id].Enable(enable)
|
|
||||||
|
|
||||||
# Process key events
|
|
||||||
def OnKeyDown(self, evt):
|
|
||||||
if evt.GetKeyCode() == WXK_CONTROL:
|
|
||||||
g.tree.ctrl = True
|
|
||||||
elif evt.GetKeyCode() == WXK_SHIFT:
|
|
||||||
g.tree.shift = True
|
|
||||||
self.UpdateIfNeeded()
|
|
||||||
evt.Skip()
|
|
||||||
|
|
||||||
def OnKeyUp(self, evt):
|
|
||||||
if evt.GetKeyCode() == WXK_CONTROL:
|
|
||||||
g.tree.ctrl = False
|
|
||||||
elif evt.GetKeyCode() == WXK_SHIFT:
|
|
||||||
g.tree.shift = False
|
|
||||||
self.UpdateIfNeeded()
|
|
||||||
evt.Skip()
|
|
||||||
|
|
||||||
def OnMouse(self, evt):
|
|
||||||
# Update control and shift states
|
|
||||||
g.tree.ctrl = evt.ControlDown()
|
|
||||||
g.tree.shift = evt.ShiftDown()
|
|
||||||
self.UpdateIfNeeded()
|
|
||||||
evt.Skip()
|
|
||||||
|
|
||||||
# Update UI after key presses, if necessary
|
|
||||||
def UpdateIfNeeded(self):
|
|
||||||
tree = g.tree
|
|
||||||
if self.ctrl != tree.ctrl or self.shift != tree.shift:
|
|
||||||
# Enabling is needed only for ctrl
|
|
||||||
if self.ctrl != tree.ctrl: self.UpdateUI()
|
|
||||||
self.ctrl = tree.ctrl
|
|
||||||
self.shift = tree.shift
|
|
||||||
if tree.ctrl:
|
|
||||||
status = 'SBL'
|
|
||||||
elif tree.shift:
|
|
||||||
status = 'INS'
|
|
||||||
else:
|
|
||||||
status = ''
|
|
||||||
g.frame.SetStatusText(status, 1)
|
|
||||||
|
|
||||||
# Update interface
|
|
||||||
def UpdateUI(self):
|
|
||||||
if not self.IsShown(): return
|
|
||||||
# Update status bar
|
|
||||||
pullDownMenu = g.pullDownMenu
|
|
||||||
tree = g.tree
|
|
||||||
item = tree.selection
|
|
||||||
# If nothing selected, disable everything and return
|
|
||||||
if not item:
|
|
||||||
# Disable everything
|
|
||||||
for grp in range(GROUPNUM):
|
|
||||||
self.EnableGroup(grp, False)
|
|
||||||
self.state = None
|
|
||||||
return
|
|
||||||
if tree.ctrl: needInsert = True
|
|
||||||
else: needInsert = tree.NeedInsert(item)
|
|
||||||
# Enable depending on selection
|
|
||||||
if item == tree.root or needInsert and tree.GetItemParent(item) == tree.root:
|
|
||||||
state = STATE_ROOT
|
|
||||||
else:
|
|
||||||
xxx = tree.GetPyData(item).treeObject()
|
|
||||||
# Check parent for possible child nodes if inserting sibling
|
|
||||||
if needInsert: xxx = xxx.parent
|
|
||||||
if xxx.__class__ == xxxMenuBar:
|
|
||||||
state = STATE_MENUBAR
|
|
||||||
elif xxx.__class__ in [xxxToolBar, xxxTool] or \
|
|
||||||
xxx.__class__ == xxxSeparator and xxx.parent.__class__ == xxxToolBar:
|
|
||||||
state = STATE_TOOLBAR
|
|
||||||
elif xxx.__class__ in [xxxMenu, xxxMenuItem]:
|
|
||||||
state = STATE_MENU
|
|
||||||
else:
|
|
||||||
state = STATE_ELSE
|
|
||||||
|
|
||||||
# Enable depending on selection
|
|
||||||
if state != self.state:
|
|
||||||
# Disable everything
|
|
||||||
for grp in range(GROUPNUM):
|
|
||||||
self.EnableGroup(grp, False)
|
|
||||||
# Enable some
|
|
||||||
if state == STATE_ROOT:
|
|
||||||
self.EnableGroup(GROUP_WINDOWS, True)
|
|
||||||
self.EnableGroup(GROUP_MENUS, True)
|
|
||||||
# But disable items
|
|
||||||
self.EnableGroupItems(GROUP_MENUS,
|
|
||||||
[ ID_NEW.TOOL,
|
|
||||||
ID_NEW.MENU_ITEM,
|
|
||||||
ID_NEW.SEPARATOR ],
|
|
||||||
False)
|
|
||||||
elif state == STATE_MENUBAR:
|
|
||||||
self.EnableGroup(GROUP_MENUS)
|
|
||||||
self.EnableGroupItems(GROUP_MENUS,
|
|
||||||
[ ID_NEW.TOOL_BAR,
|
|
||||||
ID_NEW.MENU_BAR,
|
|
||||||
ID_NEW.TOOL ],
|
|
||||||
False)
|
|
||||||
elif state == STATE_TOOLBAR:
|
|
||||||
self.EnableGroup(GROUP_MENUS)
|
|
||||||
self.EnableGroupItems(GROUP_MENUS,
|
|
||||||
[ ID_NEW.TOOL_BAR,
|
|
||||||
ID_NEW.MENU,
|
|
||||||
ID_NEW.MENU_BAR,
|
|
||||||
ID_NEW.MENU_ITEM ],
|
|
||||||
False)
|
|
||||||
self.EnableGroup(GROUP_CONTROLS)
|
|
||||||
self.EnableGroupItems(GROUP_CONTROLS,
|
|
||||||
[ ID_NEW.TREE_CTRL,
|
|
||||||
ID_NEW.NOTEBOOK,
|
|
||||||
ID_NEW.SPLITTER_WINDOW ],
|
|
||||||
False)
|
|
||||||
elif state == STATE_MENU:
|
|
||||||
self.EnableGroup(GROUP_MENUS)
|
|
||||||
self.EnableGroupItems(GROUP_MENUS,
|
|
||||||
[ ID_NEW.TOOL_BAR,
|
|
||||||
ID_NEW.MENU_BAR,
|
|
||||||
ID_NEW.TOOL ],
|
|
||||||
False)
|
|
||||||
else:
|
|
||||||
self.EnableGroup(GROUP_WINDOWS)
|
|
||||||
self.EnableGroupItems(GROUP_WINDOWS,
|
|
||||||
[ ID_NEW.FRAME,
|
|
||||||
ID_NEW.DIALOG ],
|
|
||||||
False)
|
|
||||||
self.EnableGroup(GROUP_MENUS)
|
|
||||||
self.EnableGroupItems(GROUP_MENUS,
|
|
||||||
[ ID_NEW.MENU_BAR,
|
|
||||||
ID_NEW.MENU_BAR,
|
|
||||||
ID_NEW.MENU,
|
|
||||||
ID_NEW.MENU_ITEM,
|
|
||||||
ID_NEW.TOOL,
|
|
||||||
ID_NEW.SEPARATOR ],
|
|
||||||
False)
|
|
||||||
self.EnableGroup(GROUP_SIZERS)
|
|
||||||
self.EnableGroup(GROUP_CONTROLS)
|
|
||||||
# Special case for notebook (always executed)
|
|
||||||
if state == STATE_ELSE:
|
|
||||||
if xxx.__class__ == xxxNotebook:
|
|
||||||
self.EnableGroup(GROUP_SIZERS, False)
|
|
||||||
else:
|
|
||||||
self.EnableGroup(GROUP_SIZERS)
|
|
||||||
if not (xxx.isSizer or xxx.parent and xxx.parent.isSizer):
|
|
||||||
self.EnableGroupItem(GROUP_SIZERS, ID_NEW.SPACER, False)
|
|
||||||
# Save state
|
|
||||||
self.state = state
|
|
@@ -1,151 +0,0 @@
|
|||||||
# Name: undo.py
|
|
||||||
# Purpose: XRC editor, undo/redo module
|
|
||||||
# Author: Roman Rolinsky <rolinsky@mema.ucl.ac.be>
|
|
||||||
# Created: 01.12.2002
|
|
||||||
# RCS-ID: $Id$
|
|
||||||
|
|
||||||
from globals import *
|
|
||||||
#from panel import *
|
|
||||||
|
|
||||||
# Undo/redo classes
|
|
||||||
class UndoManager:
|
|
||||||
# Undo/redo stacks
|
|
||||||
undo = []
|
|
||||||
redo = []
|
|
||||||
def RegisterUndo(self, undoObj):
|
|
||||||
self.undo.append(undoObj)
|
|
||||||
for i in self.redo: i.destroy()
|
|
||||||
self.redo = []
|
|
||||||
def Undo(self):
|
|
||||||
undoObj = self.undo.pop()
|
|
||||||
undoObj.undo()
|
|
||||||
self.redo.append(undoObj)
|
|
||||||
g.frame.modified = True
|
|
||||||
g.frame.SetStatusText('Undone')
|
|
||||||
def Redo(self):
|
|
||||||
undoObj = self.redo.pop()
|
|
||||||
undoObj.redo()
|
|
||||||
self.undo.append(undoObj)
|
|
||||||
g.frame.modified = True
|
|
||||||
g.frame.SetStatusText('Redone')
|
|
||||||
def Clear(self):
|
|
||||||
for i in self.undo: i.destroy()
|
|
||||||
self.undo = []
|
|
||||||
for i in self.redo: i.destroy()
|
|
||||||
self.redo = []
|
|
||||||
def CanUndo(self):
|
|
||||||
return not not self.undo
|
|
||||||
def CanRedo(self):
|
|
||||||
return not not self.redo
|
|
||||||
|
|
||||||
class UndoCutDelete:
|
|
||||||
def __init__(self, itemIndex, parent, elem):
|
|
||||||
self.itemIndex = itemIndex
|
|
||||||
self.parent = parent
|
|
||||||
self.elem = elem
|
|
||||||
def destroy(self):
|
|
||||||
if self.elem: self.elem.unlink()
|
|
||||||
def undo(self):
|
|
||||||
item = g.tree.InsertNode(g.tree.ItemAtFullIndex(self.itemIndex[:-1]),
|
|
||||||
self.parent, self.elem,
|
|
||||||
g.tree.ItemAtFullIndex(self.itemIndex))
|
|
||||||
# Scroll to show new item (!!! redundant?)
|
|
||||||
g.tree.EnsureVisible(item)
|
|
||||||
g.tree.SelectItem(item)
|
|
||||||
self.elem = None
|
|
||||||
# Update testWin if needed
|
|
||||||
if g.testWin and g.tree.IsHighlatable(item):
|
|
||||||
if g.conf.autoRefresh:
|
|
||||||
g.tree.needUpdate = True
|
|
||||||
g.tree.pendingHighLight = item
|
|
||||||
else:
|
|
||||||
g.tree.pendingHighLight = None
|
|
||||||
def redo(self):
|
|
||||||
item = g.tree.ItemAtFullIndex(self.itemIndex)
|
|
||||||
# Delete testWin?
|
|
||||||
if g.testWin:
|
|
||||||
# If deleting top-level item, delete testWin
|
|
||||||
if item == g.testWin.item:
|
|
||||||
g.testWin.Destroy()
|
|
||||||
g.testWin = None
|
|
||||||
else:
|
|
||||||
# Remove highlight, update testWin
|
|
||||||
if g.testWin.highLight:
|
|
||||||
g.testWin.highLight.Remove()
|
|
||||||
g.tree.needUpdate = True
|
|
||||||
self.elem = g.tree.RemoveLeaf(item)
|
|
||||||
g.tree.Unselect()
|
|
||||||
g.panel.Clear()
|
|
||||||
|
|
||||||
class UndoPasteCreate:
|
|
||||||
def __init__(self, itemParent, parent, item, selected):
|
|
||||||
self.itemParentIndex = g.tree.ItemFullIndex(itemParent)
|
|
||||||
self.parent = parent
|
|
||||||
self.itemIndex = g.tree.ItemFullIndex(item) # pasted item
|
|
||||||
self.selectedIndex = g.tree.ItemFullIndex(selected) # maybe different from item
|
|
||||||
self.elem = None
|
|
||||||
def destroy(self):
|
|
||||||
if self.elem: self.elem.unlink()
|
|
||||||
def undo(self):
|
|
||||||
self.elem = g.tree.RemoveLeaf(g.tree.ItemAtFullIndex(self.itemIndex))
|
|
||||||
# Restore old selection
|
|
||||||
selected = g.tree.ItemAtFullIndex(self.selectedIndex)
|
|
||||||
g.tree.EnsureVisible(selected)
|
|
||||||
g.tree.SelectItem(selected)
|
|
||||||
# Delete testWin?
|
|
||||||
if g.testWin:
|
|
||||||
# If deleting top-level item, delete testWin
|
|
||||||
if selected == g.testWin.item:
|
|
||||||
g.testWin.Destroy()
|
|
||||||
g.testWin = None
|
|
||||||
else:
|
|
||||||
# Remove highlight, update testWin
|
|
||||||
if g.testWin.highLight:
|
|
||||||
g.testWin.highLight.Remove()
|
|
||||||
g.tree.needUpdate = True
|
|
||||||
def redo(self):
|
|
||||||
item = g.tree.InsertNode(g.tree.ItemAtFullIndex(self.itemParentIndex),
|
|
||||||
self.parent, self.elem,
|
|
||||||
g.tree.ItemAtFullIndex(self.itemIndex))
|
|
||||||
# Scroll to show new item
|
|
||||||
g.tree.EnsureVisible(item)
|
|
||||||
g.tree.SelectItem(item)
|
|
||||||
self.elem = None
|
|
||||||
# Update testWin if needed
|
|
||||||
if g.testWin and g.tree.IsHighlatable(item):
|
|
||||||
if g.conf.autoRefresh:
|
|
||||||
g.tree.needUpdate = True
|
|
||||||
g.tree.pendingHighLight = item
|
|
||||||
else:
|
|
||||||
g.tree.pendingHighLight = None
|
|
||||||
|
|
||||||
class UndoEdit:
|
|
||||||
def __init__(self):
|
|
||||||
self.pages = map(ParamPage.GetState, g.panel.pages)
|
|
||||||
self.selectedIndex = g.tree.ItemFullIndex(g.tree.GetSelection())
|
|
||||||
def destroy(self):
|
|
||||||
pass
|
|
||||||
# Update test view
|
|
||||||
def update(self, selected):
|
|
||||||
g.tree.Apply(g.tree.GetPyData(selected), selected)
|
|
||||||
# Update view
|
|
||||||
if g.testWin:
|
|
||||||
if g.testWin.highLight:
|
|
||||||
g.testWin.highLight.Remove()
|
|
||||||
g.tree.pendingHighLight = selected
|
|
||||||
if g.testWin:
|
|
||||||
g.tree.needUpdate = True
|
|
||||||
def undo(self):
|
|
||||||
# Restore selection
|
|
||||||
selected = g.tree.ItemAtFullIndex(self.selectedIndex)
|
|
||||||
if selected != g.tree.GetSelection():
|
|
||||||
g.tree.SelectItem(selected)
|
|
||||||
# Save current state for redo
|
|
||||||
map(ParamPage.SaveState, g.panel.pages)
|
|
||||||
pages = map(ParamPage.GetState, g.panel.pages)
|
|
||||||
map(ParamPage.SetState, g.panel.pages, self.pages)
|
|
||||||
self.pages = pages
|
|
||||||
self.update(selected)
|
|
||||||
def redo(self):
|
|
||||||
self.undo()
|
|
||||||
self.update(g.tree.GetSelection())
|
|
Before Width: | Height: | Size: 2.2 KiB |
@@ -1 +0,0 @@
|
|||||||
python2.2 YOUR_PATH_TO_XRCED/xrced.py $*
|
|
@@ -1,434 +0,0 @@
|
|||||||
<?xml version="1.0"?>
|
|
||||||
<resource>
|
|
||||||
<object class="wxDialog" name="DIALOG_TEXT">
|
|
||||||
<title>Text Dialog</title>
|
|
||||||
<centered>1</centered>
|
|
||||||
<object class="wxBoxSizer">
|
|
||||||
<orient>wxVERTICAL</orient>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<object class="wxBoxSizer">
|
|
||||||
<orient>wxHORIZONTAL</orient>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<object class="wxTextCtrl" name="TEXT">
|
|
||||||
<size>250,100</size>
|
|
||||||
<style>wxTE_MULTILINE</style>
|
|
||||||
</object>
|
|
||||||
<option>1</option>
|
|
||||||
<flag>wxALL|wxEXPAND</flag>
|
|
||||||
<border>5</border>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<option>1</option>
|
|
||||||
<flag>wxEXPAND</flag>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<object class="wxStaticLine"/>
|
|
||||||
<flag>wxEXPAND</flag>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<object class="wxBoxSizer">
|
|
||||||
<orient>wxHORIZONTAL</orient>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<object class="wxButton" name="wxID_OK">
|
|
||||||
<label>OK</label>
|
|
||||||
<default>1</default>
|
|
||||||
</object>
|
|
||||||
<flag>wxRIGHT</flag>
|
|
||||||
<border>10</border>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<object class="wxButton" name="wxID_CANCEL">
|
|
||||||
<label>Cancel</label>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<flag>wxALL|wxALIGN_CENTRE_HORIZONTAL</flag>
|
|
||||||
<border>10</border>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<style>wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER</style>
|
|
||||||
</object>
|
|
||||||
<object class="wxDialog" name="DIALOG_CONTENT">
|
|
||||||
<title>Content</title>
|
|
||||||
<centered>1</centered>
|
|
||||||
<size>250,300</size>
|
|
||||||
<object class="wxBoxSizer">
|
|
||||||
<orient>wxVERTICAL</orient>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<object class="wxBoxSizer">
|
|
||||||
<orient>wxHORIZONTAL</orient>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<object class="wxListBox" name="LIST">
|
|
||||||
<content/>
|
|
||||||
</object>
|
|
||||||
<option>1</option>
|
|
||||||
<flag>wxTOP|wxBOTTOM|wxLEFT|wxEXPAND</flag>
|
|
||||||
<border>5</border>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<object class="wxBoxSizer">
|
|
||||||
<orient>wxVERTICAL</orient>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<object class="wxButton" name="BUTTON_UP">
|
|
||||||
<label>Move Up</label>
|
|
||||||
</object>
|
|
||||||
<flag>wxBOTTOM|wxEXPAND</flag>
|
|
||||||
<border>5</border>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<object class="wxButton" name="BUTTON_DOWN">
|
|
||||||
<label>Move Down</label>
|
|
||||||
</object>
|
|
||||||
<flag>wxEXPAND</flag>
|
|
||||||
</object>
|
|
||||||
<object class="spacer">
|
|
||||||
<size>10,20</size>
|
|
||||||
<option>1</option>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<object class="wxButton" name="BUTTON_APPEND">
|
|
||||||
<label>Append...</label>
|
|
||||||
</object>
|
|
||||||
<flag>wxBOTTOM|wxEXPAND</flag>
|
|
||||||
<border>5</border>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<object class="wxButton" name="BUTTON_REMOVE">
|
|
||||||
<label>Remove</label>
|
|
||||||
</object>
|
|
||||||
<flag>wxEXPAND</flag>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<flag>wxALL|wxEXPAND</flag>
|
|
||||||
<border>5</border>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<option>1</option>
|
|
||||||
<flag>wxEXPAND</flag>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<object class="wxStaticLine"/>
|
|
||||||
<flag>wxEXPAND</flag>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<object class="wxBoxSizer">
|
|
||||||
<orient>wxHORIZONTAL</orient>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<object class="wxButton" name="wxID_OK">
|
|
||||||
<label>OK</label>
|
|
||||||
<default>1</default>
|
|
||||||
</object>
|
|
||||||
<flag>wxRIGHT</flag>
|
|
||||||
<border>10</border>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<object class="wxButton" name="wxID_CANCEL">
|
|
||||||
<label>Cancel</label>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<flag>wxALL|wxALIGN_CENTRE_HORIZONTAL</flag>
|
|
||||||
<border>10</border>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<style>wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER</style>
|
|
||||||
</object>
|
|
||||||
<object class="wxDialog" name="DIALOG_CONTENT_CHECK_LIST">
|
|
||||||
<title>Content</title>
|
|
||||||
<centered>1</centered>
|
|
||||||
<size>250,300</size>
|
|
||||||
<object class="wxBoxSizer">
|
|
||||||
<orient>wxVERTICAL</orient>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<object class="wxBoxSizer">
|
|
||||||
<orient>wxHORIZONTAL</orient>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<object class="wxCheckListBox" name="CHECK_LIST">
|
|
||||||
<content/>
|
|
||||||
</object>
|
|
||||||
<option>1</option>
|
|
||||||
<flag>wxTOP|wxBOTTOM|wxLEFT|wxEXPAND</flag>
|
|
||||||
<border>5</border>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<object class="wxBoxSizer">
|
|
||||||
<orient>wxVERTICAL</orient>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<object class="wxButton" name="BUTTON_UP">
|
|
||||||
<label>Move Up</label>
|
|
||||||
</object>
|
|
||||||
<flag>wxBOTTOM|wxEXPAND</flag>
|
|
||||||
<border>5</border>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<object class="wxButton" name="BUTTON_DOWN">
|
|
||||||
<label>Move Down</label>
|
|
||||||
</object>
|
|
||||||
<flag>wxEXPAND</flag>
|
|
||||||
</object>
|
|
||||||
<object class="spacer">
|
|
||||||
<size>10,20</size>
|
|
||||||
<option>1</option>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<object class="wxButton" name="BUTTON_APPEND">
|
|
||||||
<label>Append...</label>
|
|
||||||
</object>
|
|
||||||
<flag>wxBOTTOM|wxEXPAND</flag>
|
|
||||||
<border>5</border>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<object class="wxButton" name="BUTTON_REMOVE">
|
|
||||||
<label>Remove</label>
|
|
||||||
</object>
|
|
||||||
<flag>wxEXPAND</flag>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<flag>wxALL|wxEXPAND</flag>
|
|
||||||
<border>5</border>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<option>1</option>
|
|
||||||
<flag>wxEXPAND</flag>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<object class="wxStaticLine"/>
|
|
||||||
<flag>wxEXPAND</flag>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<object class="wxBoxSizer">
|
|
||||||
<orient>wxHORIZONTAL</orient>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<object class="wxButton" name="wxID_OK">
|
|
||||||
<label>OK</label>
|
|
||||||
<default>1</default>
|
|
||||||
</object>
|
|
||||||
<flag>wxRIGHT</flag>
|
|
||||||
<border>10</border>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<object class="wxButton" name="wxID_CANCEL">
|
|
||||||
<label>Cancel</label>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<flag>wxALL|wxALIGN_CENTRE_HORIZONTAL</flag>
|
|
||||||
<border>10</border>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<style>wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER</style>
|
|
||||||
</object>
|
|
||||||
<object class="wxDialog" name="DIALOG_CHOICES">
|
|
||||||
<title>Choices</title>
|
|
||||||
<centered>1</centered>
|
|
||||||
<object class="wxBoxSizer">
|
|
||||||
<orient>wxVERTICAL</orient>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<object class="wxCheckListBox" name="CHECK_LIST">
|
|
||||||
<content/>
|
|
||||||
<size>250,250</size>
|
|
||||||
<style></style>
|
|
||||||
</object>
|
|
||||||
<option>1</option>
|
|
||||||
<flag>wxALL|wxEXPAND</flag>
|
|
||||||
<border>5</border>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<object class="wxStaticLine"/>
|
|
||||||
<flag>wxEXPAND</flag>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<object class="wxBoxSizer">
|
|
||||||
<orient>wxHORIZONTAL</orient>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<object class="wxButton" name="wxID_OK">
|
|
||||||
<label>OK</label>
|
|
||||||
<default>1</default>
|
|
||||||
</object>
|
|
||||||
<flag>wxRIGHT</flag>
|
|
||||||
<border>10</border>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<object class="wxButton" name="wxID_CANCEL">
|
|
||||||
<label>Cancel</label>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<flag>wxALL|wxALIGN_CENTRE_HORIZONTAL</flag>
|
|
||||||
<border>10</border>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<style>wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER</style>
|
|
||||||
</object>
|
|
||||||
<object class="wxDialog" name="DIALOG_INTLIST">
|
|
||||||
<title>Numbers</title>
|
|
||||||
<centered>1</centered>
|
|
||||||
<size>100,300</size>
|
|
||||||
<object class="wxBoxSizer">
|
|
||||||
<orient>wxVERTICAL</orient>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<object class="wxBoxSizer">
|
|
||||||
<orient>wxVERTICAL</orient>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<object class="wxListBox" name="LIST">
|
|
||||||
<content/>
|
|
||||||
<size>80,100</size>
|
|
||||||
<style>wxLB_SORT</style>
|
|
||||||
</object>
|
|
||||||
<option>1</option>
|
|
||||||
<flag>wxALL|wxALIGN_CENTRE_HORIZONTAL</flag>
|
|
||||||
<border>10</border>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<object class="wxBoxSizer">
|
|
||||||
<orient>wxVERTICAL</orient>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<object class="wxButton" name="BUTTON_ADD">
|
|
||||||
<label>Add...</label>
|
|
||||||
</object>
|
|
||||||
<flag>wxBOTTOM</flag>
|
|
||||||
<border>3</border>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<object class="wxButton" name="BUTTON_REMOVE">
|
|
||||||
<label>Remove</label>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<flag>wxALL|wxALIGN_CENTRE_HORIZONTAL</flag>
|
|
||||||
<border>5</border>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<option>1</option>
|
|
||||||
<flag>wxEXPAND</flag>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<object class="wxStaticLine"/>
|
|
||||||
<flag>wxEXPAND</flag>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<object class="wxBoxSizer">
|
|
||||||
<orient>wxVERTICAL</orient>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<object class="wxButton" name="wxID_OK">
|
|
||||||
<label>OK</label>
|
|
||||||
<default>1</default>
|
|
||||||
</object>
|
|
||||||
<flag>wxBOTTOM</flag>
|
|
||||||
<border>5</border>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<object class="wxButton" name="wxID_CANCEL">
|
|
||||||
<label>Cancel</label>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<flag>wxALL|wxALIGN_CENTRE_HORIZONTAL</flag>
|
|
||||||
<border>10</border>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<style>wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER</style>
|
|
||||||
</object>
|
|
||||||
<object class="wxPanel" name="PANEL_BITMAP">
|
|
||||||
<object class="wxStaticBoxSizer">
|
|
||||||
<label></label>
|
|
||||||
<orient>wxVERTICAL</orient>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<object class="wxFlexGridSizer">
|
|
||||||
<cols>2</cols>
|
|
||||||
<rows>2</rows>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<object class="wxRadioButton" name="RADIO_STD">
|
|
||||||
<label>art:</label>
|
|
||||||
</object>
|
|
||||||
<flag>wxALIGN_CENTRE_VERTICAL</flag>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<object class="wxComboBox" name="COMBO_STD">
|
|
||||||
<content>
|
|
||||||
<item>wxART_ADD_BOOKMARK</item>
|
|
||||||
<item>wxART_DEL_BOOKMARK</item>
|
|
||||||
<item>wxART_HELP_SIDE_PANEL</item>
|
|
||||||
<item>wxART_HELP_SETTINGS</item>
|
|
||||||
<item>wxART_HELP_BOOK</item>
|
|
||||||
<item>wxART_HELP_FOLDER</item>
|
|
||||||
<item>wxART_HELP_PAGE</item>
|
|
||||||
<item>wxART_GO_BACK</item>
|
|
||||||
<item>wxART_GO_FORWARD</item>
|
|
||||||
<item>wxART_GO_UP</item>
|
|
||||||
<item>wxART_GO_DOWN</item>
|
|
||||||
<item>wxART_GO_TO_PARENT</item>
|
|
||||||
<item>wxART_GO_HOME</item>
|
|
||||||
<item>wxART_FILE_OPEN</item>
|
|
||||||
<item>wxART_FILE_SAVE</item>
|
|
||||||
<item>wxART_FILE_SAVE_AS</item>
|
|
||||||
<item>wxART_PRINT</item>
|
|
||||||
<item>wxART_HELP</item>
|
|
||||||
<item>wxART_TIP</item>
|
|
||||||
<item>wxART_REPORT_VIEW</item>
|
|
||||||
<item>wxART_LIST_VIEW</item>
|
|
||||||
<item>wxART_NEW_DIR</item>
|
|
||||||
<item>wxART_HARDDISK</item>
|
|
||||||
<item>wxART_FLOPPY</item>
|
|
||||||
<item>wxART_CDROM</item>
|
|
||||||
<item>wxART_REMOVABLE</item>
|
|
||||||
<item>wxART_FOLDER</item>
|
|
||||||
<item>wxART_FOLDER_OPEN</item>
|
|
||||||
<item>wxART_GO_DIR_UP</item>
|
|
||||||
<item>wxART_EXECUTABLE_FILE</item>
|
|
||||||
<item>wxART_NORMAL_FILE</item>
|
|
||||||
<item>wxART_TICK_MARK</item>
|
|
||||||
<item>wxART_CROSS_MARK</item>
|
|
||||||
<item>wxART_ERROR</item>
|
|
||||||
<item>wxART_QUESTION</item>
|
|
||||||
<item>wxART_WARNING</item>
|
|
||||||
<item>wxART_INFORMATION</item>
|
|
||||||
<item>wxART_MISSING_IMAGE</item>
|
|
||||||
<item>wxART_COPY</item>
|
|
||||||
<item>wxART_CUT</item>
|
|
||||||
<item>wxART_PASTE</item>
|
|
||||||
<item>wxART_DELETE</item>
|
|
||||||
<item>wxART_NEW</item>
|
|
||||||
<item>wxART_UNDO</item>
|
|
||||||
<item>wxART_REDO</item>
|
|
||||||
<item>wxART_QUIT</item>
|
|
||||||
<item>wxART_FIND</item>
|
|
||||||
<item>wxART_FIND_AND_REPLACE</item>
|
|
||||||
</content>
|
|
||||||
</object>
|
|
||||||
<flag>wxRIGHT|wxEXPAND</flag>
|
|
||||||
<border>5</border>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<object class="wxRadioButton" name="RADIO_FILE">
|
|
||||||
<label>file:</label>
|
|
||||||
</object>
|
|
||||||
<flag>wxALIGN_CENTRE_VERTICAL</flag>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<object class="wxBoxSizer">
|
|
||||||
<orient>wxHORIZONTAL</orient>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<object class="wxTextCtrl" name="TEXT_FILE"/>
|
|
||||||
<option>1</option>
|
|
||||||
<flag>wxRIGHT|wxEXPAND</flag>
|
|
||||||
<border>5</border>
|
|
||||||
</object>
|
|
||||||
<object class="sizeritem">
|
|
||||||
<object class="wxButton" name="BUTTON_BROWSE">
|
|
||||||
<label>Browse...</label>
|
|
||||||
<size>40,-1d</size>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<flag>wxRIGHT|wxEXPAND</flag>
|
|
||||||
<border>5</border>
|
|
||||||
</object>
|
|
||||||
<vgap>2</vgap>
|
|
||||||
<growablecols>1</growablecols>
|
|
||||||
</object>
|
|
||||||
<flag>wxEXPAND</flag>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
</resource>
|
|
@@ -1,937 +0,0 @@
|
|||||||
# Name: xxx.py ('xxx' is easy to distinguish from 'wx' :) )
|
|
||||||
# Purpose: XML interface classes
|
|
||||||
# Author: Roman Rolinsky <rolinsky@mema.ucl.ac.be>
|
|
||||||
# Created: 22.08.2001
|
|
||||||
# RCS-ID: $Id$
|
|
||||||
|
|
||||||
from xml.dom import minidom
|
|
||||||
from globals import *
|
|
||||||
from params import *
|
|
||||||
|
|
||||||
# Base class for interface parameter classes
|
|
||||||
class xxxNode:
|
|
||||||
def __init__(self, node):
|
|
||||||
self.node = node
|
|
||||||
def remove(self):
|
|
||||||
self.node.parentNode.removeChild(self.node)
|
|
||||||
self.node.unlink()
|
|
||||||
|
|
||||||
# Generic (text) parameter class
|
|
||||||
class xxxParam(xxxNode):
|
|
||||||
# Standard use: for text nodes
|
|
||||||
def __init__(self, node):
|
|
||||||
xxxNode.__init__(self, node)
|
|
||||||
if not node.hasChildNodes():
|
|
||||||
# If does not have child nodes, create empty text node
|
|
||||||
text = g.tree.dom.createTextNode('')
|
|
||||||
node.appendChild(text)
|
|
||||||
else:
|
|
||||||
text = node.childNodes[0] # first child must be text node
|
|
||||||
assert text.nodeType == minidom.Node.TEXT_NODE
|
|
||||||
# Append other text nodes if present and delete them
|
|
||||||
extraText = ''
|
|
||||||
for n in node.childNodes[1:]:
|
|
||||||
if n.nodeType == minidom.Node.TEXT_NODE:
|
|
||||||
extraText += n.data
|
|
||||||
node.removeChild(n)
|
|
||||||
n.unlink()
|
|
||||||
else: break
|
|
||||||
if extraText: text.data = text.data + extraText
|
|
||||||
# Use convertion from unicode to current encoding
|
|
||||||
self.textNode = text
|
|
||||||
# Value returns string
|
|
||||||
if wxUSE_UNICODE: # no conversion is needed
|
|
||||||
def value(self):
|
|
||||||
return self.textNode.data
|
|
||||||
def update(self, value):
|
|
||||||
self.textNode.data = value
|
|
||||||
else:
|
|
||||||
def value(self):
|
|
||||||
try:
|
|
||||||
return self.textNode.data.encode(g.currentEncoding)
|
|
||||||
except LookupError:
|
|
||||||
return self.textNode.data.encode()
|
|
||||||
def update(self, value):
|
|
||||||
try: # handle exception if encoding is wrong
|
|
||||||
self.textNode.data = unicode(value, g.currentEncoding)
|
|
||||||
except UnicodeDecodeError:
|
|
||||||
self.textNode.data = unicode(value)
|
|
||||||
#wxLogMessage("Unicode error: set encoding in file\nglobals.py to something appropriate")
|
|
||||||
|
|
||||||
# Integer parameter
|
|
||||||
class xxxParamInt(xxxParam):
|
|
||||||
# Standard use: for text nodes
|
|
||||||
def __init__(self, node):
|
|
||||||
xxxParam.__init__(self, node)
|
|
||||||
# Value returns string
|
|
||||||
def value(self):
|
|
||||||
try:
|
|
||||||
return int(self.textNode.data)
|
|
||||||
except ValueError:
|
|
||||||
return -1 # invalid value
|
|
||||||
def update(self, value):
|
|
||||||
self.textNode.data = str(value)
|
|
||||||
|
|
||||||
# Content parameter
|
|
||||||
class xxxParamContent(xxxNode):
|
|
||||||
def __init__(self, node):
|
|
||||||
xxxNode.__init__(self, node)
|
|
||||||
data, l = [], [] # data is needed to quicker value retrieval
|
|
||||||
nodes = node.childNodes[:] # make a copy of the child list
|
|
||||||
for n in nodes:
|
|
||||||
if n.nodeType == minidom.Node.ELEMENT_NODE:
|
|
||||||
assert n.tagName == 'item', 'bad content content'
|
|
||||||
if not n.hasChildNodes():
|
|
||||||
# If does not have child nodes, create empty text node
|
|
||||||
text = g.tree.dom.createTextNode('')
|
|
||||||
node.appendChild(text)
|
|
||||||
else:
|
|
||||||
# !!! normalize?
|
|
||||||
text = n.childNodes[0] # first child must be text node
|
|
||||||
assert text.nodeType == minidom.Node.TEXT_NODE
|
|
||||||
l.append(text)
|
|
||||||
data.append(str(text.data))
|
|
||||||
else: # remove other
|
|
||||||
node.removeChild(n)
|
|
||||||
n.unlink()
|
|
||||||
self.l, self.data = l, data
|
|
||||||
def value(self):
|
|
||||||
return self.data
|
|
||||||
def update(self, value):
|
|
||||||
# If number if items is not the same, recreate children
|
|
||||||
if len(value) != len(self.l): # remove first if number of items has changed
|
|
||||||
childNodes = self.node.childNodes[:]
|
|
||||||
for n in childNodes:
|
|
||||||
self.node.removeChild(n)
|
|
||||||
l = []
|
|
||||||
for str in value:
|
|
||||||
itemElem = g.tree.dom.createElement('item')
|
|
||||||
itemText = g.tree.dom.createTextNode(str)
|
|
||||||
itemElem.appendChild(itemText)
|
|
||||||
self.node.appendChild(itemElem)
|
|
||||||
l.append(itemText)
|
|
||||||
self.l = l
|
|
||||||
else:
|
|
||||||
for i in range(len(value)):
|
|
||||||
self.l[i].data = value[i]
|
|
||||||
self.data = value
|
|
||||||
|
|
||||||
# Content parameter for checklist
|
|
||||||
class xxxParamContentCheckList(xxxNode):
|
|
||||||
def __init__(self, node):
|
|
||||||
xxxNode.__init__(self, node)
|
|
||||||
data, l = [], [] # data is needed to quicker value retrieval
|
|
||||||
nodes = node.childNodes[:] # make a copy of the child list
|
|
||||||
for n in nodes:
|
|
||||||
if n.nodeType == minidom.Node.ELEMENT_NODE:
|
|
||||||
assert n.tagName == 'item', 'bad content content'
|
|
||||||
checked = n.getAttribute('checked')
|
|
||||||
if not checked: checked = 0
|
|
||||||
if not n.hasChildNodes():
|
|
||||||
# If does not have child nodes, create empty text node
|
|
||||||
text = g.tree.dom.createTextNode('')
|
|
||||||
node.appendChild(text)
|
|
||||||
else:
|
|
||||||
# !!! normalize?
|
|
||||||
text = n.childNodes[0] # first child must be text node
|
|
||||||
assert text.nodeType == minidom.Node.TEXT_NODE
|
|
||||||
l.append((text, n))
|
|
||||||
data.append((str(text.data), int(checked)))
|
|
||||||
else: # remove other
|
|
||||||
node.removeChild(n)
|
|
||||||
n.unlink()
|
|
||||||
self.l, self.data = l, data
|
|
||||||
def value(self):
|
|
||||||
return self.data
|
|
||||||
def update(self, value):
|
|
||||||
# If number if items is not the same, recreate children
|
|
||||||
if len(value) != len(self.l): # remove first if number of items has changed
|
|
||||||
childNodes = self.node.childNodes[:]
|
|
||||||
for n in childNodes:
|
|
||||||
self.node.removeChild(n)
|
|
||||||
l = []
|
|
||||||
for s,ch in value:
|
|
||||||
itemElem = g.tree.dom.createElement('item')
|
|
||||||
# Add checked only if True
|
|
||||||
if ch: itemElem.setAttribute('checked', '1')
|
|
||||||
itemText = g.tree.dom.createTextNode(s)
|
|
||||||
itemElem.appendChild(itemText)
|
|
||||||
self.node.appendChild(itemElem)
|
|
||||||
l.append((itemText, itemElem))
|
|
||||||
self.l = l
|
|
||||||
else:
|
|
||||||
for i in range(len(value)):
|
|
||||||
self.l[i][0].data = value[i][0]
|
|
||||||
self.l[i][1].setAttribute('checked', str(value[i][1]))
|
|
||||||
self.data = value
|
|
||||||
|
|
||||||
# Bitmap parameter
|
|
||||||
class xxxParamBitmap(xxxParam):
|
|
||||||
def __init__(self, node):
|
|
||||||
xxxParam.__init__(self, node)
|
|
||||||
self.stock_id = node.getAttribute('stock_id')
|
|
||||||
def value(self):
|
|
||||||
return [self.stock_id, xxxParam.value(self)]
|
|
||||||
def update(self, value):
|
|
||||||
self.stock_id = value[0]
|
|
||||||
if self.stock_id:
|
|
||||||
self.node.setAttribute('stock_id', self.stock_id)
|
|
||||||
elif self.node.hasAttribute('stock_id'):
|
|
||||||
self.node.removeAttribute('stock_id')
|
|
||||||
xxxParam.update(self, value[1])
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
|
|
||||||
# Classes to interface DOM objects
|
|
||||||
class xxxObject:
|
|
||||||
# Default behavior
|
|
||||||
hasChildren = False # has children elements?
|
|
||||||
hasStyle = True # almost everyone
|
|
||||||
hasName = True # has name attribute?
|
|
||||||
isSizer = hasChild = False
|
|
||||||
allParams = None # Some nodes have no parameters
|
|
||||||
# Style parameters (all optional)
|
|
||||||
styles = ['fg', 'bg', 'font', 'enabled', 'focused', 'hidden', 'tooltip']
|
|
||||||
# Special parameters
|
|
||||||
specials = []
|
|
||||||
# Bitmap tags
|
|
||||||
bitmapTags = ['bitmap', 'bitmap2', 'icon']
|
|
||||||
# Required paremeters: none by default
|
|
||||||
required = []
|
|
||||||
# Default parameters with default values
|
|
||||||
default = {}
|
|
||||||
# Parameter types
|
|
||||||
paramDict = {}
|
|
||||||
# Window styles and extended styles
|
|
||||||
winStyles = []
|
|
||||||
# Tree icon index
|
|
||||||
#image = -1
|
|
||||||
# Construct a new xxx object from DOM element
|
|
||||||
# parent is parent xxx object (or None if none), element is DOM element object
|
|
||||||
def __init__(self, parent, element):
|
|
||||||
self.parent = parent
|
|
||||||
self.element = element
|
|
||||||
self.undo = None
|
|
||||||
# Get attributes
|
|
||||||
self.className = element.getAttribute('class')
|
|
||||||
self.subclass = element.getAttribute('subclass')
|
|
||||||
if self.hasName: self.name = element.getAttribute('name')
|
|
||||||
# Set parameters (text element children)
|
|
||||||
self.params = {}
|
|
||||||
nodes = element.childNodes[:]
|
|
||||||
for node in nodes:
|
|
||||||
if node.nodeType == minidom.Node.ELEMENT_NODE:
|
|
||||||
tag = node.tagName
|
|
||||||
if tag == 'object':
|
|
||||||
continue # do nothing for object children here
|
|
||||||
if tag not in self.allParams and tag not in self.styles:
|
|
||||||
print 'WARNING: unknown parameter for %s: %s' % \
|
|
||||||
(self.className, tag)
|
|
||||||
elif tag in self.specials:
|
|
||||||
self.special(tag, node)
|
|
||||||
elif tag == 'content':
|
|
||||||
if self.className == 'wxCheckListBox':
|
|
||||||
self.params[tag] = xxxParamContentCheckList(node)
|
|
||||||
else:
|
|
||||||
self.params[tag] = xxxParamContent(node)
|
|
||||||
elif tag == 'font': # has children
|
|
||||||
self.params[tag] = xxxParamFont(element, node)
|
|
||||||
elif tag in self.bitmapTags:
|
|
||||||
# Can have attributes
|
|
||||||
self.params[tag] = xxxParamBitmap(node)
|
|
||||||
else: # simple parameter
|
|
||||||
self.params[tag] = xxxParam(node)
|
|
||||||
elif node.nodeType == minidom.Node.TEXT_NODE and node.data.isspace():
|
|
||||||
# Remove empty text nodes
|
|
||||||
element.removeChild(node)
|
|
||||||
node.unlink()
|
|
||||||
|
|
||||||
# Check that all required params are set
|
|
||||||
for param in self.required:
|
|
||||||
if not self.params.has_key(param):
|
|
||||||
# If default is specified, set it
|
|
||||||
if self.default.has_key(param):
|
|
||||||
elem = g.tree.dom.createElement(param)
|
|
||||||
if param == 'content':
|
|
||||||
if self.className == 'wxCheckListBox':
|
|
||||||
self.params[param] = xxxParamContentCheckList(elem)
|
|
||||||
else:
|
|
||||||
self.params[param] = xxxParamContent(elem)
|
|
||||||
else:
|
|
||||||
self.params[param] = xxxParam(elem)
|
|
||||||
# Find place to put new element: first present element after param
|
|
||||||
found = False
|
|
||||||
paramStyles = self.allParams + self.styles
|
|
||||||
for p in paramStyles[paramStyles.index(param) + 1:]:
|
|
||||||
# Content params don't have same type
|
|
||||||
if self.params.has_key(p) and p != 'content':
|
|
||||||
found = True
|
|
||||||
break
|
|
||||||
if found:
|
|
||||||
nextTextElem = self.params[p].node
|
|
||||||
self.element.insertBefore(elem, nextTextElem)
|
|
||||||
else:
|
|
||||||
self.element.appendChild(elem)
|
|
||||||
else:
|
|
||||||
wxLogWarning('Required parameter %s of %s missing' %
|
|
||||||
(param, self.className))
|
|
||||||
# Returns real tree object
|
|
||||||
def treeObject(self):
|
|
||||||
if self.hasChild: return self.child
|
|
||||||
return self
|
|
||||||
# Returns tree image index
|
|
||||||
def treeImage(self):
|
|
||||||
if self.hasChild: return self.child.treeImage()
|
|
||||||
return self.image
|
|
||||||
# Class name plus wx name
|
|
||||||
def treeName(self):
|
|
||||||
if self.hasChild: return self.child.treeName()
|
|
||||||
if self.subclass: className = self.subclass
|
|
||||||
else: className = self.className
|
|
||||||
if self.hasName and self.name: return className + ' "' + self.name + '"'
|
|
||||||
return className
|
|
||||||
# Class name or subclass
|
|
||||||
def panelName(self):
|
|
||||||
if self.subclass: return self.subclass + '(' + self.className + ')'
|
|
||||||
else: return self.className
|
|
||||||
# Sets name of tree object
|
|
||||||
def setTreeName(self, name):
|
|
||||||
if self.hasChild: obj = self.child
|
|
||||||
else: obj = self
|
|
||||||
obj.name = name
|
|
||||||
obj.element.setAttribute('name', name)
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
|
|
||||||
# This is a little special: it is both xxxObject and xxxNode
|
|
||||||
class xxxParamFont(xxxObject, xxxNode):
|
|
||||||
allParams = ['size', 'family', 'style', 'weight', 'underlined',
|
|
||||||
'face', 'encoding']
|
|
||||||
def __init__(self, parent, element):
|
|
||||||
xxxObject.__init__(self, parent, element)
|
|
||||||
xxxNode.__init__(self, element)
|
|
||||||
self.parentNode = parent # required to behave similar to DOM node
|
|
||||||
v = []
|
|
||||||
for p in self.allParams:
|
|
||||||
try:
|
|
||||||
v.append(str(self.params[p].value()))
|
|
||||||
except KeyError:
|
|
||||||
v.append('')
|
|
||||||
self.data = v
|
|
||||||
def update(self, value):
|
|
||||||
# `value' is a list of strings corresponding to all parameters
|
|
||||||
elem = self.element
|
|
||||||
# Remove old elements first
|
|
||||||
childNodes = elem.childNodes[:]
|
|
||||||
for node in childNodes: elem.removeChild(node)
|
|
||||||
i = 0
|
|
||||||
self.params.clear()
|
|
||||||
v = []
|
|
||||||
for param in self.allParams:
|
|
||||||
if value[i]:
|
|
||||||
fontElem = g.tree.dom.createElement(param)
|
|
||||||
textNode = g.tree.dom.createTextNode(value[i])
|
|
||||||
self.params[param] = textNode
|
|
||||||
fontElem.appendChild(textNode)
|
|
||||||
elem.appendChild(fontElem)
|
|
||||||
v.append(value[i])
|
|
||||||
i += 1
|
|
||||||
self.data = v
|
|
||||||
def value(self):
|
|
||||||
return self.data
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
|
|
||||||
class xxxContainer(xxxObject):
|
|
||||||
hasChildren = True
|
|
||||||
exStyles = []
|
|
||||||
|
|
||||||
# Simulate normal parameter for encoding
|
|
||||||
class xxxEncoding:
|
|
||||||
def value(self):
|
|
||||||
return g.currentEncoding
|
|
||||||
def update(self, val):
|
|
||||||
g.currentEncoding = val
|
|
||||||
|
|
||||||
# Special class for root node
|
|
||||||
class xxxMainNode(xxxContainer):
|
|
||||||
allParams = ['encoding']
|
|
||||||
hasStyle = hasName = False
|
|
||||||
def __init__(self, dom):
|
|
||||||
xxxContainer.__init__(self, None, dom.documentElement)
|
|
||||||
self.className = 'XML tree'
|
|
||||||
# Reset required parameters after processing XML, because encoding is
|
|
||||||
# a little special
|
|
||||||
self.required = ['encoding']
|
|
||||||
self.params['encoding'] = xxxEncoding()
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
# Top-level windwows
|
|
||||||
|
|
||||||
class xxxPanel(xxxContainer):
|
|
||||||
allParams = ['pos', 'size', 'style']
|
|
||||||
styles = ['fg', 'bg', 'font', 'enabled', 'focused', 'hidden', 'exstyle',
|
|
||||||
'tooltip']
|
|
||||||
|
|
||||||
class xxxDialog(xxxContainer):
|
|
||||||
allParams = ['title', 'centered', 'pos', 'size', 'style']
|
|
||||||
paramDict = {'centered': ParamBool}
|
|
||||||
required = ['title']
|
|
||||||
default = {'title': ''}
|
|
||||||
winStyles = ['wxDEFAULT_DIALOG_STYLE',
|
|
||||||
'wxCAPTION', 'wxMINIMIZE_BOX', 'wxMAXIMIZE_BOX', 'wxCLOSE_BOX',
|
|
||||||
'wxSTAY_ON_TOP',
|
|
||||||
'wxTHICK_FRAME',
|
|
||||||
'wxNO_3D', 'wxDIALOG_NO_PARENT']
|
|
||||||
styles = ['fg', 'bg', 'font', 'enabled', 'focused', 'hidden', 'exstyle',
|
|
||||||
'tooltip']
|
|
||||||
|
|
||||||
class xxxFrame(xxxContainer):
|
|
||||||
allParams = ['title', 'centered', 'pos', 'size', 'style']
|
|
||||||
paramDict = {'centered': ParamBool}
|
|
||||||
required = ['title']
|
|
||||||
default = {'title': ''}
|
|
||||||
winStyles = ['wxDEFAULT_FRAME_STYLE',
|
|
||||||
'wxCAPTION', 'wxMINIMIZE_BOX', 'wxMAXIMIZE_BOX', 'wxCLOSE_BOX',
|
|
||||||
'wxSTAY_ON_TOP',
|
|
||||||
'wxSYSTEM_MENU', 'wxRESIZE_BORDER',
|
|
||||||
'wxFRAME_TOOL_WINDOW', 'wxFRAME_NO_TASKBAR',
|
|
||||||
'wxFRAME_FLOAT_ON_PARENT', 'wxFRAME_SHAPED'
|
|
||||||
]
|
|
||||||
styles = ['fg', 'bg', 'font', 'enabled', 'focused', 'hidden', 'exstyle',
|
|
||||||
'tooltip']
|
|
||||||
|
|
||||||
class xxxTool(xxxObject):
|
|
||||||
allParams = ['bitmap', 'bitmap2', 'radio', 'toggle', 'tooltip', 'longhelp', 'label']
|
|
||||||
required = ['bitmap']
|
|
||||||
paramDict = {'bitmap2': ParamBitmap, 'radio': ParamBool, 'toggle': ParamBool}
|
|
||||||
hasStyle = False
|
|
||||||
|
|
||||||
class xxxToolBar(xxxContainer):
|
|
||||||
allParams = ['bitmapsize', 'margins', 'packing', 'separation', 'dontattachtoframe',
|
|
||||||
'pos', 'size', 'style']
|
|
||||||
hasStyle = False
|
|
||||||
paramDict = {'bitmapsize': ParamPosSize, 'margins': ParamPosSize,
|
|
||||||
'packing': ParamInt, 'separation': ParamInt,
|
|
||||||
'dontattachtoframe': ParamBool, 'style': ParamNonGenericStyle}
|
|
||||||
winStyles = ['wxTB_FLAT', 'wxTB_DOCKABLE', 'wxTB_VERTICAL', 'wxTB_HORIZONTAL',
|
|
||||||
'wxTB_3DBUTTONS','wxTB_TEXT', 'wxTB_NOICONS', 'wxTB_NODIVIDER',
|
|
||||||
'wxTB_NOALIGN', 'wxTB_HORZ_LAYOUT', 'wxTB_HORZ_TEXT']
|
|
||||||
|
|
||||||
class xxxWizard(xxxContainer):
|
|
||||||
allParams = ['title', 'bitmap', 'pos']
|
|
||||||
required = ['title']
|
|
||||||
default = {'title': ''}
|
|
||||||
winStyles = []
|
|
||||||
exStyles = ['wxWIZARD_EX_HELPBUTTON']
|
|
||||||
|
|
||||||
class xxxWizardPage(xxxContainer):
|
|
||||||
allParams = ['bitmap']
|
|
||||||
winStyles = []
|
|
||||||
exStyles = []
|
|
||||||
|
|
||||||
class xxxWizardPageSimple(xxxContainer):
|
|
||||||
allParams = ['bitmap']
|
|
||||||
winStyles = []
|
|
||||||
exStyles = []
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
# Bitmap, Icon
|
|
||||||
|
|
||||||
class xxxBitmap(xxxObject):
|
|
||||||
allParams = ['bitmap']
|
|
||||||
required = ['bitmap']
|
|
||||||
|
|
||||||
# Just like bitmap
|
|
||||||
class xxxIcon(xxxObject):
|
|
||||||
allParams = []
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
# Controls
|
|
||||||
|
|
||||||
class xxxStaticText(xxxObject):
|
|
||||||
allParams = ['label', 'pos', 'size', 'style']
|
|
||||||
required = ['label']
|
|
||||||
default = {'label': ''}
|
|
||||||
winStyles = ['wxALIGN_LEFT', 'wxALIGN_RIGHT', 'wxALIGN_CENTRE', 'wxST_NO_AUTORESIZE']
|
|
||||||
|
|
||||||
class xxxStaticLine(xxxObject):
|
|
||||||
allParams = ['pos', 'size', 'style']
|
|
||||||
winStyles = ['wxLI_HORIZONTAL', 'wxLI_VERTICAL']
|
|
||||||
|
|
||||||
class xxxStaticBitmap(xxxObject):
|
|
||||||
allParams = ['bitmap', 'pos', 'size', 'style']
|
|
||||||
required = ['bitmap']
|
|
||||||
|
|
||||||
class xxxTextCtrl(xxxObject):
|
|
||||||
allParams = ['value', 'pos', 'size', 'style']
|
|
||||||
winStyles = ['wxTE_PROCESS_ENTER', 'wxTE_PROCESS_TAB', 'wxTE_MULTILINE',
|
|
||||||
'wxTE_PASSWORD', 'wxTE_READONLY', 'wxHSCROLL']
|
|
||||||
paramDict = {'value': ParamMultilineText}
|
|
||||||
|
|
||||||
class xxxChoice(xxxObject):
|
|
||||||
allParams = ['content', 'selection', 'pos', 'size', 'style']
|
|
||||||
required = ['content']
|
|
||||||
default = {'content': '[]'}
|
|
||||||
winStyles = ['wxCB_SORT']
|
|
||||||
|
|
||||||
class xxxSlider(xxxObject):
|
|
||||||
allParams = ['value', 'min', 'max', 'pos', 'size', 'style',
|
|
||||||
'tickfreq', 'pagesize', 'linesize', 'thumb', 'tick',
|
|
||||||
'selmin', 'selmax']
|
|
||||||
paramDict = {'value': ParamInt, 'tickfreq': ParamInt, 'pagesize': ParamInt,
|
|
||||||
'linesize': ParamInt, 'thumb': ParamInt, 'thumb': ParamInt,
|
|
||||||
'tick': ParamInt, 'selmin': ParamInt, 'selmax': ParamInt}
|
|
||||||
required = ['value', 'min', 'max']
|
|
||||||
winStyles = ['wxSL_HORIZONTAL', 'wxSL_VERTICAL', 'wxSL_AUTOTICKS', 'wxSL_LABELS',
|
|
||||||
'wxSL_LEFT', 'wxSL_RIGHT', 'wxSL_TOP', 'wxSL_BOTTOM',
|
|
||||||
'wxSL_BOTH', 'wxSL_SELRANGE', 'wxSL_INVERSE']
|
|
||||||
|
|
||||||
class xxxGauge(xxxObject):
|
|
||||||
allParams = ['range', 'pos', 'size', 'style', 'value', 'shadow', 'bezel']
|
|
||||||
paramDict = {'range': ParamInt, 'value': ParamInt,
|
|
||||||
'shadow': ParamInt, 'bezel': ParamInt}
|
|
||||||
winStyles = ['wxGA_HORIZONTAL', 'wxGA_VERTICAL', 'wxGA_PROGRESSBAR', 'wxGA_SMOOTH']
|
|
||||||
|
|
||||||
class xxxScrollBar(xxxObject):
|
|
||||||
allParams = ['pos', 'size', 'style', 'value', 'thumbsize', 'range', 'pagesize']
|
|
||||||
paramDict = {'value': ParamInt, 'range': ParamInt, 'thumbsize': ParamInt,
|
|
||||||
'pagesize': ParamInt}
|
|
||||||
winStyles = ['wxSB_HORIZONTAL', 'wxSB_VERTICAL']
|
|
||||||
|
|
||||||
class xxxListCtrl(xxxObject):
|
|
||||||
allParams = ['pos', 'size', 'style']
|
|
||||||
winStyles = ['wxLC_LIST', 'wxLC_REPORT', 'wxLC_ICON', 'wxLC_SMALL_ICON',
|
|
||||||
'wxLC_ALIGN_TOP', 'wxLC_ALIGN_LEFT', 'wxLC_AUTOARRANGE',
|
|
||||||
'wxLC_USER_TEXT', 'wxLC_EDIT_LABELS', 'wxLC_NO_HEADER',
|
|
||||||
'wxLC_SINGLE_SEL', 'wxLC_SORT_ASCENDING', 'wxLC_SORT_DESCENDING']
|
|
||||||
|
|
||||||
class xxxTreeCtrl(xxxObject):
|
|
||||||
allParams = ['pos', 'size', 'style']
|
|
||||||
winStyles = ['wxTR_HAS_BUTTONS', 'wxTR_NO_LINES', 'wxTR_LINES_AT_ROOT',
|
|
||||||
'wxTR_EDIT_LABELS', 'wxTR_MULTIPLE']
|
|
||||||
|
|
||||||
class xxxHtmlWindow(xxxObject):
|
|
||||||
allParams = ['pos', 'size', 'style', 'borders', 'url', 'htmlcode']
|
|
||||||
paramDict = {'borders': ParamInt, 'htmlcode':ParamMultilineText}
|
|
||||||
winStyles = ['wxHW_SCROLLBAR_NEVER', 'wxHW_SCROLLBAR_AUTO']
|
|
||||||
|
|
||||||
class xxxCalendarCtrl(xxxObject):
|
|
||||||
allParams = ['pos', 'size', 'style']
|
|
||||||
|
|
||||||
class xxxNotebook(xxxContainer):
|
|
||||||
allParams = ['usenotebooksizer', 'pos', 'size', 'style']
|
|
||||||
paramDict = {'usenotebooksizer': ParamBool}
|
|
||||||
winStyles = ['wxNB_FIXEDWIDTH', 'wxNB_LEFT', 'wxNB_RIGHT', 'wxNB_BOTTOM']
|
|
||||||
|
|
||||||
class xxxSplitterWindow(xxxContainer):
|
|
||||||
allParams = ['orientation', 'sashpos', 'minsize', 'pos', 'size', 'style']
|
|
||||||
paramDict = {'orientation': ParamOrientation, 'sashpos': ParamUnit, 'minsize': ParamUnit }
|
|
||||||
winStyles = ['wxSP_3D', 'wxSP_3DSASH', 'wxSP_3DBORDER', 'wxSP_BORDER',
|
|
||||||
'wxSP_NOBORDER', 'wxSP_PERMIT_UNSPLIT', 'wxSP_LIVE_UPDATE',
|
|
||||||
'wxSP_NO_XP_THEME' ]
|
|
||||||
|
|
||||||
class xxxGenericDirCtrl(xxxObject):
|
|
||||||
allParams = ['defaultfolder', 'filter', 'defaultfilter', 'pos', 'size', 'style']
|
|
||||||
paramDict = {'defaultfilter': ParamInt}
|
|
||||||
winStyles = ['wxDIRCTRL_DIR_ONLY', 'wxDIRCTRL_3D_INTERNAL', 'wxDIRCTRL_SELECT_FIRST',
|
|
||||||
'wxDIRCTRL_SHOW_FILTERS', 'wxDIRCTRL_EDIT_LABELS']
|
|
||||||
|
|
||||||
class xxxScrolledWindow(xxxContainer):
|
|
||||||
allParams = ['pos', 'size', 'style']
|
|
||||||
winStyles = ['wxHSCROLL', 'wxVSCROLL']
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
# Buttons
|
|
||||||
|
|
||||||
class xxxButton(xxxObject):
|
|
||||||
allParams = ['label', 'default', 'pos', 'size', 'style']
|
|
||||||
paramDict = {'default': ParamBool}
|
|
||||||
required = ['label']
|
|
||||||
winStyles = ['wxBU_LEFT', 'wxBU_TOP', 'wxBU_RIGHT', 'wxBU_BOTTOM']
|
|
||||||
|
|
||||||
class xxxBitmapButton(xxxObject):
|
|
||||||
allParams = ['bitmap', 'selected', 'focus', 'disabled', 'default',
|
|
||||||
'pos', 'size', 'style']
|
|
||||||
required = ['bitmap']
|
|
||||||
winStyles = ['wxBU_AUTODRAW', 'wxBU_LEFT', 'wxBU_TOP',
|
|
||||||
'wxBU_RIGHT', 'wxBU_BOTTOM']
|
|
||||||
|
|
||||||
class xxxRadioButton(xxxObject):
|
|
||||||
allParams = ['label', 'value', 'pos', 'size', 'style']
|
|
||||||
paramDict = {'value': ParamBool}
|
|
||||||
required = ['label']
|
|
||||||
winStyles = ['wxRB_GROUP']
|
|
||||||
|
|
||||||
class xxxSpinButton(xxxObject):
|
|
||||||
allParams = ['value', 'min', 'max', 'pos', 'size', 'style']
|
|
||||||
paramDict = {'value': ParamInt}
|
|
||||||
winStyles = ['wxSP_HORIZONTAL', 'wxSP_VERTICAL', 'wxSP_ARROW_KEYS', 'wxSP_WRAP']
|
|
||||||
|
|
||||||
class xxxSpinCtrl(xxxObject):
|
|
||||||
allParams = ['value', 'min', 'max', 'pos', 'size', 'style']
|
|
||||||
paramDict = {'value': ParamInt}
|
|
||||||
winStyles = ['wxSP_HORIZONTAL', 'wxSP_VERTICAL', 'wxSP_ARROW_KEYS', 'wxSP_WRAP']
|
|
||||||
|
|
||||||
class xxxToggleButton(xxxObject):
|
|
||||||
allParams = ['label', 'checked', 'pos', 'size', 'style']
|
|
||||||
paramDict = {'checked': ParamBool}
|
|
||||||
required = ['label']
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
# Boxes
|
|
||||||
|
|
||||||
class xxxStaticBox(xxxObject):
|
|
||||||
allParams = ['label', 'pos', 'size', 'style']
|
|
||||||
required = ['label']
|
|
||||||
|
|
||||||
class xxxRadioBox(xxxObject):
|
|
||||||
allParams = ['label', 'content', 'selection', 'dimension', 'pos', 'size', 'style']
|
|
||||||
paramDict = {'dimension': ParamInt}
|
|
||||||
required = ['label', 'content']
|
|
||||||
default = {'content': '[]'}
|
|
||||||
winStyles = ['wxRA_SPECIFY_ROWS', 'wxRA_SPECIFY_COLS']
|
|
||||||
|
|
||||||
class xxxCheckBox(xxxObject):
|
|
||||||
allParams = ['label', 'checked', 'pos', 'size', 'style']
|
|
||||||
paramDict = {'checked': ParamBool}
|
|
||||||
winStyles = ['wxCHK_2STATE', 'wxCHK_3STATE', 'wxCHK_ALLOW_3RD_STATE_FOR_USER',
|
|
||||||
'wxALIGN_RIGHT']
|
|
||||||
required = ['label']
|
|
||||||
|
|
||||||
class xxxComboBox(xxxObject):
|
|
||||||
allParams = ['content', 'selection', 'value', 'pos', 'size', 'style']
|
|
||||||
required = ['content']
|
|
||||||
default = {'content': '[]'}
|
|
||||||
winStyles = ['wxCB_SIMPLE', 'wxCB_SORT', 'wxCB_READONLY', 'wxCB_DROPDOWN']
|
|
||||||
|
|
||||||
class xxxListBox(xxxObject):
|
|
||||||
allParams = ['content', 'selection', 'pos', 'size', 'style']
|
|
||||||
required = ['content']
|
|
||||||
default = {'content': '[]'}
|
|
||||||
winStyles = ['wxLB_SINGLE', 'wxLB_MULTIPLE', 'wxLB_EXTENDED', 'wxLB_HSCROLL',
|
|
||||||
'wxLB_ALWAYS_SB', 'wxLB_NEEDED_SB', 'wxLB_SORT']
|
|
||||||
|
|
||||||
class xxxCheckList(xxxObject):
|
|
||||||
allParams = ['content', 'pos', 'size', 'style']
|
|
||||||
required = ['content']
|
|
||||||
default = {'content': '[]'}
|
|
||||||
winStyles = ['wxLC_LIST', 'wxLC_REPORT', 'wxLC_ICON', 'wxLC_SMALL_ICON',
|
|
||||||
'wxLC_ALIGN_TOP', 'wxLC_ALIGN_LEFT', 'wxLC_AUTOARRANGE',
|
|
||||||
'wxLC_USER_TEXT', 'wxLC_EDIT_LABELS', 'wxLC_NO_HEADER',
|
|
||||||
'wxLC_SINGLE_SEL', 'wxLC_SORT_ASCENDING', 'wxLC_SORT_DESCENDING']
|
|
||||||
paramDict = {'content': ParamContentCheckList}
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
# Sizers
|
|
||||||
|
|
||||||
class xxxSizer(xxxContainer):
|
|
||||||
hasName = hasStyle = False
|
|
||||||
paramDict = {'orient': ParamOrient}
|
|
||||||
isSizer = True
|
|
||||||
itemTag = 'sizeritem' # different for some sizers
|
|
||||||
|
|
||||||
class xxxBoxSizer(xxxSizer):
|
|
||||||
allParams = ['orient']
|
|
||||||
required = ['orient']
|
|
||||||
default = {'orient': 'wxVERTICAL'}
|
|
||||||
# Tree icon depends on orientation
|
|
||||||
def treeImage(self):
|
|
||||||
if self.params['orient'].value() == 'wxHORIZONTAL': return self.imageH
|
|
||||||
else: return self.imageV
|
|
||||||
|
|
||||||
class xxxStaticBoxSizer(xxxBoxSizer):
|
|
||||||
allParams = ['label', 'orient']
|
|
||||||
required = ['label', 'orient']
|
|
||||||
|
|
||||||
class xxxGridSizer(xxxSizer):
|
|
||||||
allParams = ['cols', 'rows', 'vgap', 'hgap']
|
|
||||||
required = ['cols']
|
|
||||||
default = {'cols': '2', 'rows': '2'}
|
|
||||||
|
|
||||||
class xxxStdDialogButtonSizer(xxxSizer):
|
|
||||||
allParams = []
|
|
||||||
itemTag = 'button'
|
|
||||||
|
|
||||||
# For repeated parameters
|
|
||||||
class xxxParamMulti:
|
|
||||||
def __init__(self, node):
|
|
||||||
self.node = node
|
|
||||||
self.l, self.data = [], []
|
|
||||||
def append(self, param):
|
|
||||||
self.l.append(param)
|
|
||||||
self.data.append(param.value())
|
|
||||||
def value(self):
|
|
||||||
return self.data
|
|
||||||
def remove(self):
|
|
||||||
for param in self.l:
|
|
||||||
param.remove()
|
|
||||||
self.l, self.data = [], []
|
|
||||||
|
|
||||||
class xxxFlexGridSizer(xxxGridSizer):
|
|
||||||
specials = ['growablecols', 'growablerows']
|
|
||||||
allParams = ['cols', 'rows', 'vgap', 'hgap'] + specials
|
|
||||||
paramDict = {'growablecols':ParamIntList, 'growablerows':ParamIntList}
|
|
||||||
# Special processing for growable* parameters
|
|
||||||
# (they are represented by several nodes)
|
|
||||||
def special(self, tag, node):
|
|
||||||
if not self.params.has_key(tag):
|
|
||||||
# Create new multi-group
|
|
||||||
self.params[tag] = xxxParamMulti(node)
|
|
||||||
self.params[tag].append(xxxParamInt(node))
|
|
||||||
def setSpecial(self, param, value):
|
|
||||||
# Straightforward implementation: remove, add again
|
|
||||||
self.params[param].remove()
|
|
||||||
del self.params[param]
|
|
||||||
for i in value:
|
|
||||||
node = g.tree.dom.createElement(param)
|
|
||||||
text = g.tree.dom.createTextNode(str(i))
|
|
||||||
node.appendChild(text)
|
|
||||||
self.element.appendChild(node)
|
|
||||||
self.special(param, node)
|
|
||||||
|
|
||||||
class xxxGridBagSizer(xxxSizer):
|
|
||||||
specials = ['growablecols', 'growablerows']
|
|
||||||
allParams = ['vgap', 'hgap'] + specials
|
|
||||||
paramDict = {'growablecols':ParamIntList, 'growablerows':ParamIntList}
|
|
||||||
# Special processing for growable* parameters
|
|
||||||
# (they are represented by several nodes)
|
|
||||||
def special(self, tag, node):
|
|
||||||
if not self.params.has_key(tag):
|
|
||||||
# Create new multi-group
|
|
||||||
self.params[tag] = xxxParamMulti(node)
|
|
||||||
self.params[tag].append(xxxParamInt(node))
|
|
||||||
def setSpecial(self, param, value):
|
|
||||||
# Straightforward implementation: remove, add again
|
|
||||||
self.params[param].remove()
|
|
||||||
del self.params[param]
|
|
||||||
for i in value:
|
|
||||||
node = g.tree.dom.createElement(param)
|
|
||||||
text = g.tree.dom.createTextNode(str(i))
|
|
||||||
node.appendChild(text)
|
|
||||||
self.element.appendChild(node)
|
|
||||||
self.special(param, node)
|
|
||||||
|
|
||||||
# Container with only one child.
|
|
||||||
# Not shown in tree.
|
|
||||||
class xxxChildContainer(xxxObject):
|
|
||||||
hasName = hasStyle = False
|
|
||||||
hasChild = True
|
|
||||||
def __init__(self, parent, element):
|
|
||||||
xxxObject.__init__(self, parent, element)
|
|
||||||
# Must have one child with 'object' tag, but we don't check it
|
|
||||||
nodes = element.childNodes[:] # create copy
|
|
||||||
for node in nodes:
|
|
||||||
if node.nodeType == minidom.Node.ELEMENT_NODE:
|
|
||||||
if node.tagName == 'object':
|
|
||||||
# Create new xxx object for child node
|
|
||||||
self.child = MakeXXXFromDOM(self, node)
|
|
||||||
self.child.parent = parent
|
|
||||||
# Copy hasChildren and isSizer attributes
|
|
||||||
self.hasChildren = self.child.hasChildren
|
|
||||||
self.isSizer = self.child.isSizer
|
|
||||||
return # success
|
|
||||||
else:
|
|
||||||
element.removeChild(node)
|
|
||||||
node.unlink()
|
|
||||||
assert 0, 'no child found'
|
|
||||||
|
|
||||||
class xxxSizerItem(xxxChildContainer):
|
|
||||||
allParams = ['option', 'flag', 'border', 'minsize', 'ratio']
|
|
||||||
paramDict = {'option': ParamInt, 'minsize': ParamPosSize, 'ratio': ParamPosSize}
|
|
||||||
#default = {'cellspan': '1,1'}
|
|
||||||
def __init__(self, parent, element):
|
|
||||||
# For GridBag sizer items, extra parameters added
|
|
||||||
if isinstance(parent, xxxGridBagSizer):
|
|
||||||
self.allParams = self.allParams + ['cellpos', 'cellspan']
|
|
||||||
xxxChildContainer.__init__(self, parent, element)
|
|
||||||
# Remove pos parameter - not needed for sizeritems
|
|
||||||
if 'pos' in self.child.allParams:
|
|
||||||
self.child.allParams = self.child.allParams[:]
|
|
||||||
self.child.allParams.remove('pos')
|
|
||||||
|
|
||||||
class xxxSizerItemButton(xxxSizerItem):
|
|
||||||
allParams = []
|
|
||||||
paramDict = {}
|
|
||||||
def __init__(self, parent, element):
|
|
||||||
xxxChildContainer.__init__(self, parent, element)
|
|
||||||
# Remove pos parameter - not needed for sizeritems
|
|
||||||
if 'pos' in self.child.allParams:
|
|
||||||
self.child.allParams = self.child.allParams[:]
|
|
||||||
self.child.allParams.remove('pos')
|
|
||||||
|
|
||||||
class xxxNotebookPage(xxxChildContainer):
|
|
||||||
allParams = ['label', 'selected']
|
|
||||||
paramDict = {'selected': ParamBool}
|
|
||||||
required = ['label']
|
|
||||||
def __init__(self, parent, element):
|
|
||||||
xxxChildContainer.__init__(self, parent, element)
|
|
||||||
# pos and size dont matter for notebookpages
|
|
||||||
if 'pos' in self.child.allParams:
|
|
||||||
self.child.allParams = self.child.allParams[:]
|
|
||||||
self.child.allParams.remove('pos')
|
|
||||||
if 'size' in self.child.allParams:
|
|
||||||
self.child.allParams = self.child.allParams[:]
|
|
||||||
self.child.allParams.remove('size')
|
|
||||||
|
|
||||||
class xxxSpacer(xxxObject):
|
|
||||||
hasName = hasStyle = False
|
|
||||||
allParams = ['size', 'option', 'flag', 'border']
|
|
||||||
paramDict = {'option': ParamInt}
|
|
||||||
default = {'size': '0,0'}
|
|
||||||
|
|
||||||
class xxxMenuBar(xxxContainer):
|
|
||||||
allParams = ['style']
|
|
||||||
paramDict = {'style': ParamNonGenericStyle} # no generic styles
|
|
||||||
winStyles = ['wxMB_DOCKABLE']
|
|
||||||
|
|
||||||
class xxxMenu(xxxContainer):
|
|
||||||
allParams = ['label', 'help', 'style']
|
|
||||||
default = {'label': ''}
|
|
||||||
paramDict = {'style': ParamNonGenericStyle} # no generic styles
|
|
||||||
winStyles = ['wxMENU_TEAROFF']
|
|
||||||
|
|
||||||
class xxxMenuItem(xxxObject):
|
|
||||||
allParams = ['label', 'bitmap', 'accel', 'help',
|
|
||||||
'checkable', 'radio', 'enabled', 'checked']
|
|
||||||
default = {'label': ''}
|
|
||||||
hasStyle = False
|
|
||||||
|
|
||||||
class xxxSeparator(xxxObject):
|
|
||||||
hasName = hasStyle = False
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
# Unknown control
|
|
||||||
|
|
||||||
class xxxUnknown(xxxObject):
|
|
||||||
allParams = ['pos', 'size', 'style']
|
|
||||||
paramDict = {'style': ParamNonGenericStyle} # no generic styles
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
|
|
||||||
xxxDict = {
|
|
||||||
'wxPanel': xxxPanel,
|
|
||||||
'wxDialog': xxxDialog,
|
|
||||||
'wxFrame': xxxFrame,
|
|
||||||
'tool': xxxTool,
|
|
||||||
'wxToolBar': xxxToolBar,
|
|
||||||
'wxWizard': xxxWizard,
|
|
||||||
'wxWizardPage': xxxWizardPage,
|
|
||||||
'wxWizardPageSimple': xxxWizardPageSimple,
|
|
||||||
|
|
||||||
'wxBitmap': xxxBitmap,
|
|
||||||
'wxIcon': xxxIcon,
|
|
||||||
|
|
||||||
'wxButton': xxxButton,
|
|
||||||
'wxBitmapButton': xxxBitmapButton,
|
|
||||||
'wxRadioButton': xxxRadioButton,
|
|
||||||
'wxSpinButton': xxxSpinButton,
|
|
||||||
'wxToggleButton' : xxxToggleButton,
|
|
||||||
|
|
||||||
'wxStaticBox': xxxStaticBox,
|
|
||||||
'wxStaticBitmap': xxxStaticBitmap,
|
|
||||||
'wxRadioBox': xxxRadioBox,
|
|
||||||
'wxComboBox': xxxComboBox,
|
|
||||||
'wxCheckBox': xxxCheckBox,
|
|
||||||
'wxListBox': xxxListBox,
|
|
||||||
|
|
||||||
'wxStaticText': xxxStaticText,
|
|
||||||
'wxStaticLine': xxxStaticLine,
|
|
||||||
'wxTextCtrl': xxxTextCtrl,
|
|
||||||
'wxChoice': xxxChoice,
|
|
||||||
'wxSlider': xxxSlider,
|
|
||||||
'wxGauge': xxxGauge,
|
|
||||||
'wxScrollBar': xxxScrollBar,
|
|
||||||
'wxTreeCtrl': xxxTreeCtrl,
|
|
||||||
'wxListCtrl': xxxListCtrl,
|
|
||||||
'wxCheckListBox': xxxCheckList,
|
|
||||||
'wxNotebook': xxxNotebook,
|
|
||||||
'wxSplitterWindow': xxxSplitterWindow,
|
|
||||||
'notebookpage': xxxNotebookPage,
|
|
||||||
'wxHtmlWindow': xxxHtmlWindow,
|
|
||||||
'wxCalendarCtrl': xxxCalendarCtrl,
|
|
||||||
'wxGenericDirCtrl': xxxGenericDirCtrl,
|
|
||||||
'wxSpinCtrl': xxxSpinCtrl,
|
|
||||||
'wxScrolledWindow': xxxScrolledWindow,
|
|
||||||
|
|
||||||
'wxBoxSizer': xxxBoxSizer,
|
|
||||||
'wxStaticBoxSizer': xxxStaticBoxSizer,
|
|
||||||
'wxGridSizer': xxxGridSizer,
|
|
||||||
'wxFlexGridSizer': xxxFlexGridSizer,
|
|
||||||
'wxGridBagSizer': xxxGridBagSizer,
|
|
||||||
'wxStdDialogButtonSizer': xxxStdDialogButtonSizer,
|
|
||||||
'sizeritem': xxxSizerItem, 'button': xxxSizerItemButton,
|
|
||||||
'spacer': xxxSpacer,
|
|
||||||
|
|
||||||
'wxMenuBar': xxxMenuBar,
|
|
||||||
'wxMenu': xxxMenu,
|
|
||||||
'wxMenuItem': xxxMenuItem,
|
|
||||||
'separator': xxxSeparator,
|
|
||||||
|
|
||||||
'unknown': xxxUnknown,
|
|
||||||
}
|
|
||||||
|
|
||||||
# Create IDs for all parameters of all classes
|
|
||||||
paramIDs = {'fg': wxNewId(), 'bg': wxNewId(), 'exstyle': wxNewId(), 'font': wxNewId(),
|
|
||||||
'enabled': wxNewId(), 'focused': wxNewId(), 'hidden': wxNewId(),
|
|
||||||
'tooltip': wxNewId(), 'encoding': wxNewId(),
|
|
||||||
'cellpos': wxNewId(), 'cellspan': wxNewId()
|
|
||||||
}
|
|
||||||
for cl in xxxDict.values():
|
|
||||||
if cl.allParams:
|
|
||||||
for param in cl.allParams + cl.paramDict.keys():
|
|
||||||
if not paramIDs.has_key(param):
|
|
||||||
paramIDs[param] = wxNewId()
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
# Helper functions
|
|
||||||
|
|
||||||
# Test for object elements
|
|
||||||
def IsObject(node):
|
|
||||||
return node.nodeType == minidom.Node.ELEMENT_NODE and node.tagName == 'object'
|
|
||||||
|
|
||||||
# Make XXX object from some DOM object, selecting correct class
|
|
||||||
def MakeXXXFromDOM(parent, element):
|
|
||||||
try:
|
|
||||||
klass = xxxDict[element.getAttribute('class')]
|
|
||||||
except KeyError:
|
|
||||||
# If we encounter a weird class, use unknown template
|
|
||||||
print 'WARNING: unsupported class:', element.getAttribute('class')
|
|
||||||
klass = xxxUnknown
|
|
||||||
return klass(parent, element)
|
|
||||||
|
|
||||||
# Make empty DOM element
|
|
||||||
def MakeEmptyDOM(className):
|
|
||||||
elem = g.tree.dom.createElement('object')
|
|
||||||
elem.setAttribute('class', className)
|
|
||||||
# Set required and default parameters
|
|
||||||
xxxClass = xxxDict[className]
|
|
||||||
defaultNotRequired = filter(lambda x, l=xxxClass.required: x not in l,
|
|
||||||
xxxClass.default.keys())
|
|
||||||
for param in xxxClass.required + defaultNotRequired:
|
|
||||||
textElem = g.tree.dom.createElement(param)
|
|
||||||
try:
|
|
||||||
textNode = g.tree.dom.createTextNode(xxxClass.default[param])
|
|
||||||
except KeyError:
|
|
||||||
textNode = g.tree.dom.createTextNode('')
|
|
||||||
textElem.appendChild(textNode)
|
|
||||||
elem.appendChild(textElem)
|
|
||||||
return elem
|
|
||||||
|
|
||||||
# Make empty XXX object
|
|
||||||
def MakeEmptyXXX(parent, className):
|
|
||||||
# Make corresponding DOM object first
|
|
||||||
elem = MakeEmptyDOM(className)
|
|
||||||
# If parent is a sizer, we should create sizeritem object, except for spacers
|
|
||||||
if parent:
|
|
||||||
if parent.isSizer and className != 'spacer':
|
|
||||||
sizerItemElem = MakeEmptyDOM(parent.itemTag)
|
|
||||||
sizerItemElem.appendChild(elem)
|
|
||||||
elem = sizerItemElem
|
|
||||||
elif isinstance(parent, xxxNotebook):
|
|
||||||
pageElem = MakeEmptyDOM('notebookpage')
|
|
||||||
pageElem.appendChild(elem)
|
|
||||||
elem = pageElem
|
|
||||||
# Now just make object
|
|
||||||
return MakeXXXFromDOM(parent, elem)
|
|
||||||
|
|
594
wxPython/wxPython/py/CHANGES.txt
Normal file
@@ -0,0 +1,594 @@
|
|||||||
|
|
||||||
|
0.9.2 (5/3/2003 to //2003)
|
||||||
|
-----------------------------
|
||||||
|
|
||||||
|
Changed to the new prefix-less "wx" package::
|
||||||
|
|
||||||
|
import wx
|
||||||
|
|
||||||
|
instead of::
|
||||||
|
|
||||||
|
from wxPython import wx
|
||||||
|
|
||||||
|
Fixed typo in ``PyWrap.py``::
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main(sys.argv)
|
||||||
|
|
||||||
|
should have been::
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
|
|
||||||
|
Added pretty-print Display tab to Crust, based on suggestion from
|
||||||
|
Jason Whitlark.
|
||||||
|
|
||||||
|
Improved ``Can*`` checks in ``EditWindow``, since STC is too lenient,
|
||||||
|
particularly when it is set to read-only but returns True for
|
||||||
|
CanPaste() (seems like an STC bug to me)::
|
||||||
|
|
||||||
|
def CanCopy(self):
|
||||||
|
"""Return True if text is selected and can be copied."""
|
||||||
|
return self.GetSelectionStart() != self.GetSelectionEnd()
|
||||||
|
|
||||||
|
def CanCut(self):
|
||||||
|
"""Return True if text is selected and can be cut."""
|
||||||
|
return self.CanCopy() and self.CanEdit()
|
||||||
|
|
||||||
|
def CanEdit(self):
|
||||||
|
"""Return True if editing should succeed."""
|
||||||
|
return not self.GetReadOnly()
|
||||||
|
|
||||||
|
def CanPaste(self):
|
||||||
|
"""Return True if pasting should succeed."""
|
||||||
|
return stc.StyledTextCtrl.CanPaste(self) and self.CanEdit()
|
||||||
|
|
||||||
|
|
||||||
|
0.9.1 (3/21/2003 to 5/2/2003)
|
||||||
|
-----------------------------
|
||||||
|
|
||||||
|
PyCrust is dead! Long live Py!
|
||||||
|
|
||||||
|
* Renamed ``PyCrust`` package to ``py``.
|
||||||
|
* Moved code to wxPython's CVS repository.
|
||||||
|
|
||||||
|
Fixed bug in ``introspect.py`` on introspecting objects occurring
|
||||||
|
immediately after a secondary prompt, like this::
|
||||||
|
|
||||||
|
>>> l = [1, 2, 3]
|
||||||
|
>>> for n in range(3):
|
||||||
|
... l. <-- failed to popup autocomplete list
|
||||||
|
|
||||||
|
Added documentation files:
|
||||||
|
|
||||||
|
* PyManual.txt
|
||||||
|
* wxPythonManual.txt
|
||||||
|
* wxPythonPackage.txt
|
||||||
|
* wxPythonExamples.txt
|
||||||
|
|
||||||
|
Added PyAlaMode and PyAlaCarte code editors.
|
||||||
|
|
||||||
|
Major refactoring to support ``editor`` and ``shell`` from the same
|
||||||
|
base.
|
||||||
|
|
||||||
|
Renamed program files:
|
||||||
|
|
||||||
|
* ``PyCrustApp.py`` to ``PyCrust.py``
|
||||||
|
* ``PyFillingApp.py`` to ``PyFilling.py``
|
||||||
|
* ``PyShellApp.py`` to ``PyShell.py``
|
||||||
|
* ``wrap.py`` to ``PyWrap.py``
|
||||||
|
|
||||||
|
Removed disabling of autocomplete for lists of 2000 items or more.
|
||||||
|
The current implementation of wxSTC can now handle lists this big.
|
||||||
|
|
||||||
|
Improved handling of ``sys.path`` to mimic the standard Python shell.
|
||||||
|
|
||||||
|
|
||||||
|
0.9 (2/27/2003 to 3/20/2003)
|
||||||
|
----------------------------
|
||||||
|
|
||||||
|
Added fontIncrease, fontDecrease, fontDefault signals, receivers and
|
||||||
|
keybindings::
|
||||||
|
|
||||||
|
Ctrl+] Increase font size.
|
||||||
|
Ctrl+[ Decrease font size.
|
||||||
|
Ctrl+= Default font size.
|
||||||
|
|
||||||
|
Continued enhancement of the decorator capability to provide better
|
||||||
|
documentation and docstrings for wxPython classes and functions.
|
||||||
|
|
||||||
|
Introduced new tabbed interface:
|
||||||
|
|
||||||
|
* Namespace
|
||||||
|
* Calltip
|
||||||
|
* Session
|
||||||
|
* Dispatcher
|
||||||
|
* wxPython Docs
|
||||||
|
* wxSTC Docs
|
||||||
|
|
||||||
|
``Filling.tree`` now expands tuples as well as lists. (It should have
|
||||||
|
done this all along, I just never noticed this omission before.)
|
||||||
|
|
||||||
|
Added this True/False test to all modules::
|
||||||
|
|
||||||
|
try:
|
||||||
|
True
|
||||||
|
except NameError:
|
||||||
|
True = 1==1
|
||||||
|
False = 1==0
|
||||||
|
|
||||||
|
Added ``wxd`` directory with decoration classes.
|
||||||
|
|
||||||
|
|
||||||
|
0.8.2 (1/5/2003 to 2/26/2003)
|
||||||
|
-----------------------------
|
||||||
|
|
||||||
|
Wrapped ``sys.ps1``, ``sys.ps2``, and ``sys.ps3`` in ``str()``.
|
||||||
|
(Thanks, Kieran Holland.)
|
||||||
|
|
||||||
|
Fixed minor things found by PyChecker.
|
||||||
|
|
||||||
|
Changed locals to use ``__main__.__dict__`` and added code to clean up
|
||||||
|
the namespace, making it as close to the regular Python environment as
|
||||||
|
possible. This solves the problem of pickling and unpickling
|
||||||
|
instances of classes defined in the shell.
|
||||||
|
|
||||||
|
Made ``shell.PasteAndRun()`` a little more forgiving when it finds a
|
||||||
|
ps2 prompt line with no trailing space, such when you copy code from a
|
||||||
|
web page.
|
||||||
|
|
||||||
|
Improved autocomplete behavior by adding these to shell::
|
||||||
|
|
||||||
|
self.AutoCompSetAutoHide(False)
|
||||||
|
self.AutoCompStops(' .,;:([)]}\'"\\<>%^&+-=*/|`')
|
||||||
|
|
||||||
|
Added ``decor`` directory, ``decorator.py``, ``stcDecor.py``, and
|
||||||
|
``stcConstants.py``. These all serve the purpose of adding docstrings
|
||||||
|
to existing wxPython classes, in particular the ``wxStyledTextCtrl``.
|
||||||
|
|
||||||
|
Added ``wrap.py``, a command line utility for running a wxPython app
|
||||||
|
with additional runtime-tools loaded, such as PyCrust (the only tool
|
||||||
|
at this point).
|
||||||
|
|
||||||
|
Flushed the clipboard Cut/Copy operations so that selections will
|
||||||
|
exist in the clipboard even after PyCrust has been closed.
|
||||||
|
|
||||||
|
Improved the suppression of docstrings for simple data types appearing
|
||||||
|
in the namespace viewer.
|
||||||
|
|
||||||
|
Better handling of autocompletion with numeric types; no
|
||||||
|
autocompletion when typing a dot after an integer. If the
|
||||||
|
autocompletion is desired, type a space before the dot::
|
||||||
|
|
||||||
|
func = 3 .
|
||||||
|
|
||||||
|
More Filling!!! The namespace tree is now dynamically updated.
|
||||||
|
|
||||||
|
|
||||||
|
0.8.1 (12/20/2002 to 12/25/2002)
|
||||||
|
--------------------------------
|
||||||
|
|
||||||
|
Improved keyboard handling with Autocomplete active. You can now use
|
||||||
|
Enter as well as Tab to select an item from the list.
|
||||||
|
|
||||||
|
Disabled autocomplete for lists of 2000 items or more. The current
|
||||||
|
implementation of wxSTC can't handle lists this big.
|
||||||
|
|
||||||
|
Changed ``filling`` to always display docstrings for objects. This is
|
||||||
|
useful for objects whose docstrings have been decorated, rather than
|
||||||
|
coming directly from the source code. (Hmmm. Sounds like someone is
|
||||||
|
doing some decorating. I wonder where that would be helpful? <wink>)
|
||||||
|
|
||||||
|
Fixed handling of icon. Added ``images.py`` file.
|
||||||
|
|
||||||
|
|
||||||
|
0.8 (10/29/2002 to 12/16/2002)
|
||||||
|
------------------------------
|
||||||
|
|
||||||
|
Added "help" to startup banner info.
|
||||||
|
|
||||||
|
Made all ``wx`` and ``stc`` imports explicit. No more ``import *``.
|
||||||
|
|
||||||
|
Replaced use of the ``wx`` module's ``true`` and ``false`` with
|
||||||
|
Python's ``True`` and ``False``.
|
||||||
|
|
||||||
|
Changed ``introspect.getRoot()`` to use ``tokenize`` module. This
|
||||||
|
does a slightly better job than the previous parsing routine and the
|
||||||
|
code is clearer.
|
||||||
|
|
||||||
|
Improved handling of whitespace and empty types during introspection.
|
||||||
|
|
||||||
|
Fixed cut/copy clipboard problem under Linux. (Robin Dunn rocks!!!)
|
||||||
|
|
||||||
|
Added shell.about() which works like this::
|
||||||
|
|
||||||
|
>>> shell.about()
|
||||||
|
PyCrust Version: 0.8
|
||||||
|
Shell Revision: 1.80
|
||||||
|
Interpreter Revision: 1.15
|
||||||
|
Python Version: 2.2.2
|
||||||
|
wxPython Version: 2.3.3.1
|
||||||
|
Platform: linux2
|
||||||
|
|
||||||
|
Added copy plus and paste plus to shell menu.
|
||||||
|
|
||||||
|
Moved shell menu from ``shell.py`` to ``shellmenu.py``.
|
||||||
|
|
||||||
|
Added ``sys.stdin.readlines()`` support.
|
||||||
|
|
||||||
|
Added ``time.sleep()`` in ``readline()`` and ``OnIdle()`` event
|
||||||
|
handler to free up the CPU.
|
||||||
|
|
||||||
|
|
||||||
|
0.7.2 (2/22/2002 to 8/27/2002)
|
||||||
|
------------------------------
|
||||||
|
|
||||||
|
Tweaked ``getAttributeNames()`` to pick up a few more attributes::
|
||||||
|
|
||||||
|
'__bases__', '__class__', '__dict__', '__name__', 'func_closure',
|
||||||
|
'func_code', 'func_defaults', 'func_dict', 'func_doc',
|
||||||
|
'func_globals', 'func_name'
|
||||||
|
|
||||||
|
Added a tests directory and unit tests.
|
||||||
|
|
||||||
|
Improved support for empty types in the shell: ``[]``, ``()`` and
|
||||||
|
``{}`` as far as when call tips and autocompletion are available.
|
||||||
|
|
||||||
|
Added support for the other triple string - ``''''''``.
|
||||||
|
|
||||||
|
Refactored ``introspect.py`` to improve testability.
|
||||||
|
|
||||||
|
Improved call tips for unbound methods by leaving the "self"
|
||||||
|
parameter, since unbound methods require an instance be passed.
|
||||||
|
|
||||||
|
Fixed call tip bug where a tip was displayed when a "(" was typed
|
||||||
|
after an object that wasn't callable.
|
||||||
|
|
||||||
|
Fixed ``getAllAttributeNames`` when ``str(object)`` fails.
|
||||||
|
|
||||||
|
Added brace highlighting. (Thank you, Kevin Altis.)
|
||||||
|
|
||||||
|
Fixed problem displaying unicode objects in ``PyFilling``.
|
||||||
|
|
||||||
|
Changed how ``filling.py`` checks for expandable objects. Lists are
|
||||||
|
now expandable objects.
|
||||||
|
|
||||||
|
Made the key handling more robust when there is an active text
|
||||||
|
selection that includes text prior to the last primary prompt. Thanks
|
||||||
|
to Raul Cota for pointing this out.
|
||||||
|
|
||||||
|
Fixed wxSTC problem with brace highlighting and non-us keyboards.
|
||||||
|
(Thank you for the patch, Jean-Michel Fauth.)
|
||||||
|
|
||||||
|
Added ``busy = wxBusyCursor()`` to key points in ``shell`` and
|
||||||
|
``filling``.
|
||||||
|
|
||||||
|
Added ``OnCloseWindow`` handler to ``ShellFrame`` and ``CrustFrame``.
|
||||||
|
|
||||||
|
Default to ``SetWrapMode(1)`` for shell and namespace viewer.
|
||||||
|
|
||||||
|
Added ``shell.wrap()`` and ``shell.zoom()``.
|
||||||
|
|
||||||
|
Added autoCompleteKeys hooks for Raul Cota.
|
||||||
|
|
||||||
|
Cleaned up various little key handling bugs.
|
||||||
|
|
||||||
|
Changed input methods to get values from shell, rather than dialog
|
||||||
|
boxes. Renamed ``readIn`` to ``readline`` and ``readRaw`` to
|
||||||
|
``raw_input``.
|
||||||
|
|
||||||
|
|
||||||
|
0.7.1 (12/12/2001 to 2/21/2002)
|
||||||
|
-------------------------------
|
||||||
|
|
||||||
|
Fixed ``OnChar()`` issues effecting European keyboards, as reported by
|
||||||
|
Jean-Michel Fauth.
|
||||||
|
|
||||||
|
Fixed ``introspect.py`` issue with xmlrpc objects reported by Kevin
|
||||||
|
Altis.
|
||||||
|
|
||||||
|
Fixed some introspect/PyFilling issues with regard to Python 2.2.
|
||||||
|
|
||||||
|
Fixed font background color as reported by Keith J. Farmer. (Thanks)
|
||||||
|
|
||||||
|
Fixed problem with call tips and autocompletion inside multiline
|
||||||
|
commands as report by Kevin Altis.
|
||||||
|
|
||||||
|
Improved ``OnKeyDown`` handling of cut/copy/paste operations based on
|
||||||
|
feedback from Syver Enstad. (Thanks)
|
||||||
|
|
||||||
|
Added a ``shell.help()`` method to display some help info.
|
||||||
|
|
||||||
|
Changed sort of items in the namespace viewer to case insensitive.
|
||||||
|
|
||||||
|
Changed ``attributes.sort(lambda x, y: cmp(x.upper(), y.upper()))`` in
|
||||||
|
advance of an upcoming fix to an autocompletion matching bug in wxSTC.
|
||||||
|
|
||||||
|
Improved support for ZODB by allowing namespace drilldown into BTrees.
|
||||||
|
|
||||||
|
Added ``shell.PasteAndRun()`` to support pasting multiple commands into
|
||||||
|
the shell from the clipboard. Ctrl+Shift+V or v.
|
||||||
|
|
||||||
|
Enter now always processes a command (or copies down a previous one.)
|
||||||
|
To insert a line break, press Ctrl+Enter.
|
||||||
|
|
||||||
|
Escape key clears the current, unexecuted command.
|
||||||
|
|
||||||
|
History retrieval changed to replace current command. Added new keys
|
||||||
|
to insert from history - Shift+Up and Shift+Down.
|
||||||
|
|
||||||
|
Better call tips on objects with ``__call__`` methods.
|
||||||
|
|
||||||
|
Improved call tip positioning calculation.
|
||||||
|
|
||||||
|
|
||||||
|
0.7 (10/15/2001 to 12/11/2001)
|
||||||
|
------------------------------
|
||||||
|
|
||||||
|
Changed how command history retrieval functions work. Added Alt-P,
|
||||||
|
Alt-N as keybindings for Retrieve-Previous, Retrieve-Next.
|
||||||
|
|
||||||
|
Added full support for multi-line commands, similar to IDLE.
|
||||||
|
|
||||||
|
Changed ``introspect.getAttributeNames()`` to do a case insensitive
|
||||||
|
sort.
|
||||||
|
|
||||||
|
Changed Cut/Copy/Paste to deal with prompts intelligently. Cut and
|
||||||
|
Copy remove all prompts. Paste can handle prompted or not-prompted
|
||||||
|
text.
|
||||||
|
|
||||||
|
Added ``CopyWithPrompts()`` method attached to Ctrl-Shift-C for those
|
||||||
|
times when you really do want all the prompts left intact.
|
||||||
|
|
||||||
|
Improved handling of the shell's read-only zone.
|
||||||
|
|
||||||
|
Changed ``CrustFrame.__init__`` parameter spec to include all
|
||||||
|
parameters allowed by a ``wxFrame``.
|
||||||
|
|
||||||
|
Changed ``FillingText`` to be read-only.
|
||||||
|
|
||||||
|
Renamed ``PyCrust.py`` to ``PyCrustApp.py`` to eliminate
|
||||||
|
package/module name conflicts that kept you from doing ``from PyCrust
|
||||||
|
import shell`` inside files located in the ``PyCrust`` directory.
|
||||||
|
|
||||||
|
Renamed ``PyFilling.py`` to ``PyFillingApp.py`` and ``PyShell.py`` to
|
||||||
|
``PyShellApp.py`` to maintain consistency.
|
||||||
|
|
||||||
|
Removed the ``__date__`` property from all modules.
|
||||||
|
|
||||||
|
Fixed bug in ``introspect.getCallTip()``, reported by Kevin Altis.
|
||||||
|
|
||||||
|
|
||||||
|
0.6.1 (9/19/2001 to 10/12/2001)
|
||||||
|
-------------------------------
|
||||||
|
|
||||||
|
Changed ``Shell.run()`` to always position to the end of existing
|
||||||
|
text, as suggested by Raul Cota.
|
||||||
|
|
||||||
|
Changed ``introspect.getAllAttributeNames()`` to break circular
|
||||||
|
references in ``object.__class__``, which occurs in Zope/ZODB
|
||||||
|
extension classes.
|
||||||
|
|
||||||
|
Changed ``filling.FillingTree.getChildren()`` to introspect extension
|
||||||
|
classes.
|
||||||
|
|
||||||
|
Fixed minor bugs in ``introspect.getCallTip()`` that were interfering
|
||||||
|
with call tips for Zope/ZODB extension class methods.
|
||||||
|
|
||||||
|
In preparation for wxPython 2.3.2, added code to fix a font sizing
|
||||||
|
problem. Versions of wxPython prior to 2.3.2 had a sizing bug on Win
|
||||||
|
platform where the font was 2 points larger than what was specified.
|
||||||
|
|
||||||
|
Added a hack to ``introspect.getAllAttributeNames()`` to "wake up"
|
||||||
|
ZODB objects that are asleep - in a "ghost" state. Otherwise it
|
||||||
|
returns incomplete info.
|
||||||
|
|
||||||
|
|
||||||
|
0.6 (8/21/2001 to 9/12/2001)
|
||||||
|
----------------------------
|
||||||
|
|
||||||
|
Added ``PyFilling.py`` and ``filling.py``.
|
||||||
|
|
||||||
|
``PyShell.py`` and ``PyFilling.py`` can now be run standalone, as well
|
||||||
|
as ``PyCrust.py``.
|
||||||
|
|
||||||
|
Added ``crust.py`` and moved some code from ``PyCrust.py`` to it.
|
||||||
|
|
||||||
|
Added command history retrieval features submitted by Richie Hindle.
|
||||||
|
|
||||||
|
Changed ``shell.write()`` to replace line endings with OS-specific
|
||||||
|
endings. Changed ``shell.py`` and ``interpreter.py`` to use
|
||||||
|
``os.linesep`` in strings having hardcoded line endings.
|
||||||
|
|
||||||
|
Added ``shell.redirectStdin()``, ``shell.redirectStdout()`` and
|
||||||
|
``shell.redirectStderr()`` to allow the surrounding app to toggle
|
||||||
|
requests that the specified ``sys.std*`` be redirected to the shell.
|
||||||
|
These can also be run from within the shell itself, of course.
|
||||||
|
|
||||||
|
The shell now adds the current working directory "." to the search
|
||||||
|
path::
|
||||||
|
|
||||||
|
sys.path.insert(0, os.curdir)
|
||||||
|
|
||||||
|
Added support for distutils installations.
|
||||||
|
|
||||||
|
|
||||||
|
0.5.4 (8/17/2001 to 8/20/2001)
|
||||||
|
------------------------------
|
||||||
|
|
||||||
|
Changed default font size under Linux to::
|
||||||
|
|
||||||
|
'size' : 12,
|
||||||
|
'lnsize' : 10,
|
||||||
|
|
||||||
|
Changed ``Shell`` to expect a parameter referencing an Interpreter
|
||||||
|
class, rather than an intepreter instance, to facilitate subclassing
|
||||||
|
of Interpreter, which effectively broke when the Editor class was
|
||||||
|
eliminated.
|
||||||
|
|
||||||
|
Fixed ``PyCrustAlaCarte.py``, which had been broken by previous
|
||||||
|
changes.
|
||||||
|
|
||||||
|
Created ``InterpreterAlaCarte`` class as an example for use in the
|
||||||
|
demo.
|
||||||
|
|
||||||
|
Split ``PyCrust.py`` into ``PyCrust.py`` and ``PyShell.py`` in
|
||||||
|
anticipation of ``PyFilling.py``.
|
||||||
|
|
||||||
|
|
||||||
|
0.5.3 (8/16/2001)
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
Added patch to ``PyCrust.py`` to fix wxPython bug::
|
||||||
|
|
||||||
|
wxID_SELECTALL = NewId() # This *should* be defined by wxPython.
|
||||||
|
|
||||||
|
|
||||||
|
0.5.2 (8/14/2001 to 8/15/2001)
|
||||||
|
------------------------------
|
||||||
|
|
||||||
|
Shortened module names by dropping "PyCrust" as a prefix.
|
||||||
|
|
||||||
|
Changed ``version`` to ``VERSION`` in ``version`` module.
|
||||||
|
|
||||||
|
Added Options menu to PyCrust application.
|
||||||
|
|
||||||
|
Eliminated the Editor class (and editor module) by merging with Shell.
|
||||||
|
This means that Shell "is a" wxStyledTextCtrl rather than "has a".
|
||||||
|
There just wasn't enough non-gui code to justify the separation.
|
||||||
|
Plus, Shell will be much easier for gui toolkits/designers to deal
|
||||||
|
with now.
|
||||||
|
|
||||||
|
|
||||||
|
0.5.1 (8/10/2001 to 8/14/2001)
|
||||||
|
------------------------------
|
||||||
|
|
||||||
|
Added ``introspect`` module.
|
||||||
|
|
||||||
|
Moved some functionality from ``PyCrustInterp`` to ``introspect``.
|
||||||
|
|
||||||
|
Changed ``introspect.getRoot()`` to no longer remove whitespace from
|
||||||
|
the command. This was a remnant of a previous approach that, when
|
||||||
|
left as part of the current approach, turned out to be a really bad
|
||||||
|
thing.
|
||||||
|
|
||||||
|
Changed ``introspect.getRoot()`` to allow commands of ``''``, ``""``,
|
||||||
|
``""""""``, ``[]``, ``()``, and ``{}`` to pass through. This allows
|
||||||
|
you to type them, followed by a dot, and get autocomplete options on
|
||||||
|
them.
|
||||||
|
|
||||||
|
Changed ``introspect.getRoot()`` to identify some situations where
|
||||||
|
strings shouldn't be considered roots. For example::
|
||||||
|
|
||||||
|
>>> import PyCrust # To illustrate the potential problem.
|
||||||
|
>>> len('PyCrust.py')
|
||||||
|
|
||||||
|
Typing the dot at the end of "PyCrust" in the second line above should
|
||||||
|
NOT result in an autocompletion list because "PyCrust" is part of a
|
||||||
|
string in this context, not a reference to the PyCrust module object.
|
||||||
|
Similar reasoning applies to call tips. For example::
|
||||||
|
|
||||||
|
>>> len('dir(')
|
||||||
|
|
||||||
|
Typing the left paren at the end of "dir" should NOT result in a call
|
||||||
|
tip.
|
||||||
|
|
||||||
|
Both features now behave properly in the examples given. However,
|
||||||
|
there is still the case where whitespace precedes the potential root
|
||||||
|
and that is NOT handled properly. For example::
|
||||||
|
|
||||||
|
>>> len('this is a dir(')
|
||||||
|
|
||||||
|
and::
|
||||||
|
|
||||||
|
>>> len('This is PyCrust.py')
|
||||||
|
|
||||||
|
More code needs to be written to handle more complex situations.
|
||||||
|
|
||||||
|
Added ``locals=None`` parameter to ``Shell.__init__()``.
|
||||||
|
|
||||||
|
Added support for magic attribute retrieval. Users can change this
|
||||||
|
with::
|
||||||
|
|
||||||
|
>>> shell.editor.autoCompleteIncludeMagic = 0
|
||||||
|
|
||||||
|
Added the ability to set filters on auto completion to exclude
|
||||||
|
attributes prefixed with a single or double underscore. Users can
|
||||||
|
exclude one or the other or both with::
|
||||||
|
|
||||||
|
>>> shell.editor.autoCompleteExcludeSingle = 1
|
||||||
|
>>> shell.editor.autoCompleteExcludeDouble = 1
|
||||||
|
|
||||||
|
|
||||||
|
0.5 (8/8/2001)
|
||||||
|
--------------
|
||||||
|
|
||||||
|
Mostly just a final version change before creating a release.
|
||||||
|
|
||||||
|
|
||||||
|
0.4 (8/4/2001 to 8/7/2001)
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
Changed version/revision handling.
|
||||||
|
|
||||||
|
Fixed bugs.
|
||||||
|
|
||||||
|
|
||||||
|
0.3 (8/2/2001 to 8/3/2001)
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
Removed lots of cruft.
|
||||||
|
|
||||||
|
Added lots of docstrings.
|
||||||
|
|
||||||
|
Imported to CVS repository at SourceForge.
|
||||||
|
|
||||||
|
Added call tips.
|
||||||
|
|
||||||
|
|
||||||
|
0.2 (7/30/2001 to 8/2/2001)
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
Renamed several files.
|
||||||
|
|
||||||
|
Added command autocompletion.
|
||||||
|
|
||||||
|
Added menus to PyCrust.py: File, Edit and Help.
|
||||||
|
|
||||||
|
Added sample applications: ``PyCrustAlaCarte.py``,
|
||||||
|
``PyCrustAlaMode.py``, and ``PyCrustMinimus.py``.
|
||||||
|
|
||||||
|
|
||||||
|
0.1 (7/1/2001 to 7/19/2001)
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
Added basic syntax coloring much like Boa.
|
||||||
|
|
||||||
|
Added read-only logging much like IDLE.
|
||||||
|
|
||||||
|
Can retrieve a previous command by putting the cursor back on that
|
||||||
|
line and hitting enter.
|
||||||
|
|
||||||
|
Stdin and raw_input operate properly so you can now do ``help()`` and
|
||||||
|
``license()`` without hanging.
|
||||||
|
|
||||||
|
Redefined "quit", "exit", and "close" to display a better-than-nothing
|
||||||
|
response.
|
||||||
|
|
||||||
|
Home key honors the prompt.
|
||||||
|
|
||||||
|
Created SourceForge account, but nothing was posted.
|
||||||
|
|
||||||
|
|
||||||
|
In the beginning, there was pie... (7/1/2001)
|
||||||
|
---------------------------------------------
|
||||||
|
|
||||||
|
Blame it all on IDLE, Boa and PythonWin. I was using all three, got
|
||||||
|
frustrated with their dissimilarities, and began to let everyone know
|
||||||
|
how I felt. At the same time, Scintilla looked like an interesting
|
||||||
|
tool to build a shell around. And while I didn't receive much in the
|
||||||
|
way of positive feedback, let alone encouragement, I just couldn't let
|
||||||
|
go of the idea of a Scintilla-based Python shell. Then the PythonCard
|
||||||
|
project got to the point where they were talking about including a
|
||||||
|
shell in their development environment. That was all the incentive I
|
||||||
|
needed. PyCrust had to happen...
|
BIN
wxPython/wxPython/py/Py.ico
Normal file
After Width: | Height: | Size: 4.6 KiB |
43
wxPython/wxPython/py/PyAlaCarte.py
Executable file
@@ -0,0 +1,43 @@
|
|||||||
|
"""PyAlaCarte is a simple programmer's editor."""
|
||||||
|
|
||||||
|
__author__ = "Patrick K. O'Brien <pobrien@orbtech.com>"
|
||||||
|
__cvsid__ = "$Id$"
|
||||||
|
__revision__ = "$Revision$"[11:-2]
|
||||||
|
|
||||||
|
import wx
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
import editor
|
||||||
|
|
||||||
|
try:
|
||||||
|
True
|
||||||
|
except NameError:
|
||||||
|
True = 1==1
|
||||||
|
False = 1==0
|
||||||
|
|
||||||
|
class App(wx.App):
|
||||||
|
"""PyAlaCarte standalone application."""
|
||||||
|
|
||||||
|
def __init__(self, filename=None):
|
||||||
|
self.filename = filename
|
||||||
|
wx.App.__init__(self, redirect=False)
|
||||||
|
|
||||||
|
def OnInit(self):
|
||||||
|
wx.InitAllImageHandlers()
|
||||||
|
self.frame = editor.EditorFrame(filename=self.filename)
|
||||||
|
self.frame.Show()
|
||||||
|
self.SetTopWindow(self.frame)
|
||||||
|
return True
|
||||||
|
|
||||||
|
def main(filename=None):
|
||||||
|
if not filename and len(sys.argv) > 1:
|
||||||
|
filename = sys.argv[1]
|
||||||
|
if filename:
|
||||||
|
filename = os.path.realpath(filename)
|
||||||
|
app = App(filename)
|
||||||
|
app.MainLoop()
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
43
wxPython/wxPython/py/PyAlaMode.py
Executable file
@@ -0,0 +1,43 @@
|
|||||||
|
"""PyAlaMode is a programmer's editor."""
|
||||||
|
|
||||||
|
__author__ = "Patrick K. O'Brien <pobrien@orbtech.com>"
|
||||||
|
__cvsid__ = "$Id$"
|
||||||
|
__revision__ = "$Revision$"[11:-2]
|
||||||
|
|
||||||
|
import wx
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
import editor
|
||||||
|
|
||||||
|
try:
|
||||||
|
True
|
||||||
|
except NameError:
|
||||||
|
True = 1==1
|
||||||
|
False = 1==0
|
||||||
|
|
||||||
|
class App(wx.App):
|
||||||
|
"""PyAlaMode standalone application."""
|
||||||
|
|
||||||
|
def __init__(self, filename=None):
|
||||||
|
self.filename = filename
|
||||||
|
wx.App.__init__(self, redirect=False)
|
||||||
|
|
||||||
|
def OnInit(self):
|
||||||
|
wx.InitAllImageHandlers()
|
||||||
|
self.frame = editor.EditorNotebookFrame(filename=self.filename)
|
||||||
|
self.frame.Show()
|
||||||
|
self.SetTopWindow(self.frame)
|
||||||
|
return True
|
||||||
|
|
||||||
|
def main(filename=None):
|
||||||
|
if not filename and len(sys.argv) > 1:
|
||||||
|
filename = sys.argv[1]
|
||||||
|
if filename:
|
||||||
|
filename = os.path.realpath(filename)
|
||||||
|
app = App(filename)
|
||||||
|
app.MainLoop()
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
42
wxPython/wxPython/py/PyAlaModeTest.py
Executable file
@@ -0,0 +1,42 @@
|
|||||||
|
"""PyAlaModeTest is a programmer's editor."""
|
||||||
|
|
||||||
|
__author__ = "Patrick K. O'Brien <pobrien@orbtech.com>"
|
||||||
|
__cvsid__ = "$Id$"
|
||||||
|
__revision__ = "$Revision$"[11:-2]
|
||||||
|
|
||||||
|
import wx
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
import editor
|
||||||
|
|
||||||
|
try:
|
||||||
|
True
|
||||||
|
except NameError:
|
||||||
|
True = 1==1
|
||||||
|
False = 1==0
|
||||||
|
|
||||||
|
class App(wx.App):
|
||||||
|
"""PyAlaModeTest standalone application."""
|
||||||
|
|
||||||
|
def __init__(self, filename=None):
|
||||||
|
self.filename = filename
|
||||||
|
wx.App.__init__(self, redirect=False)
|
||||||
|
|
||||||
|
def OnInit(self):
|
||||||
|
wx.InitAllImageHandlers()
|
||||||
|
self.frame = editor.EditorShellNotebookFrame(filename=self.filename)
|
||||||
|
self.frame.Show()
|
||||||
|
self.SetTopWindow(self.frame)
|
||||||
|
return True
|
||||||
|
|
||||||
|
def main(filename=None):
|
||||||
|
app = App(filename)
|
||||||
|
app.MainLoop()
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
filename = None
|
||||||
|
if len(sys.argv) > 1:
|
||||||
|
filename = os.path.realpath(sys.argv[1])
|
||||||
|
main(filename)
|
BIN
wxPython/wxPython/py/PyCrust.ico
Normal file
After Width: | Height: | Size: 4.6 KiB |
78
wxPython/wxPython/py/PyCrust.py
Executable file
@@ -0,0 +1,78 @@
|
|||||||
|
"""PyCrust is a python shell and namespace browser application."""
|
||||||
|
|
||||||
|
# The next two lines, and the other code below that makes use of
|
||||||
|
# ``__main__`` and ``original``, serve the purpose of cleaning up the
|
||||||
|
# main namespace to look as much as possible like the regular Python
|
||||||
|
# shell environment.
|
||||||
|
import __main__
|
||||||
|
original = __main__.__dict__.keys()
|
||||||
|
|
||||||
|
__author__ = "Patrick K. O'Brien <pobrien@orbtech.com>"
|
||||||
|
__cvsid__ = "$Id$"
|
||||||
|
__revision__ = "$Revision$"[11:-2]
|
||||||
|
|
||||||
|
import wx
|
||||||
|
|
||||||
|
try:
|
||||||
|
True
|
||||||
|
except NameError:
|
||||||
|
True = 1==1
|
||||||
|
False = 1==0
|
||||||
|
|
||||||
|
|
||||||
|
class App(wx.App):
|
||||||
|
"""PyCrust standalone application."""
|
||||||
|
|
||||||
|
def OnInit(self):
|
||||||
|
import wx
|
||||||
|
wx.InitAllImageHandlers()
|
||||||
|
locals = __main__.__dict__
|
||||||
|
from crust import CrustFrame
|
||||||
|
self.frame = CrustFrame(locals=locals)
|
||||||
|
self.frame.SetSize((800, 600))
|
||||||
|
self.frame.Show()
|
||||||
|
self.SetTopWindow(self.frame)
|
||||||
|
return True
|
||||||
|
|
||||||
|
'''
|
||||||
|
The main() function needs to handle being imported, such as with the
|
||||||
|
pycrust script that wxPython installs:
|
||||||
|
|
||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
from wx.py.PyCrust import main
|
||||||
|
main()
|
||||||
|
'''
|
||||||
|
|
||||||
|
def main():
|
||||||
|
"""The main function for the PyCrust program."""
|
||||||
|
# Cleanup the main namespace, leaving the App class.
|
||||||
|
import __main__
|
||||||
|
md = __main__.__dict__
|
||||||
|
keepers = original
|
||||||
|
keepers.append('App')
|
||||||
|
for key in md.keys():
|
||||||
|
if key not in keepers:
|
||||||
|
del md[key]
|
||||||
|
# Create an application instance.
|
||||||
|
app = App(0)
|
||||||
|
# Mimic the contents of the standard Python shell's sys.path.
|
||||||
|
import sys
|
||||||
|
if sys.path[0]:
|
||||||
|
sys.path[0] = ''
|
||||||
|
# Add the application object to the sys module's namespace.
|
||||||
|
# This allows a shell user to do:
|
||||||
|
# >>> import sys
|
||||||
|
# >>> sys.app.whatever
|
||||||
|
sys.app = app
|
||||||
|
del sys
|
||||||
|
# Cleanup the main namespace some more.
|
||||||
|
if md.has_key('App') and md['App'] is App:
|
||||||
|
del md['App']
|
||||||
|
if md.has_key('__main__') and md['__main__'] is __main__:
|
||||||
|
del md['__main__']
|
||||||
|
# Start the wxPython event loop.
|
||||||
|
app.MainLoop()
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
BIN
wxPython/wxPython/py/PyCrust_16.png
Normal file
After Width: | Height: | Size: 706 B |
BIN
wxPython/wxPython/py/PyCrust_32.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
43
wxPython/wxPython/py/PyFilling.py
Executable file
@@ -0,0 +1,43 @@
|
|||||||
|
"""PyFilling is a python namespace inspection application."""
|
||||||
|
|
||||||
|
__author__ = "Patrick K. O'Brien <pobrien@orbtech.com>"
|
||||||
|
__cvsid__ = "$Id$"
|
||||||
|
__revision__ = "$Revision$"[11:-2]
|
||||||
|
|
||||||
|
# We use this object to get more introspection when run standalone.
|
||||||
|
app = None
|
||||||
|
|
||||||
|
import filling
|
||||||
|
|
||||||
|
# These are imported just to have something interesting to inspect.
|
||||||
|
import crust
|
||||||
|
import interpreter
|
||||||
|
import introspect
|
||||||
|
import pseudo
|
||||||
|
import shell
|
||||||
|
import sys
|
||||||
|
import wx
|
||||||
|
|
||||||
|
try:
|
||||||
|
True
|
||||||
|
except NameError:
|
||||||
|
True = 1==1
|
||||||
|
False = 1==0
|
||||||
|
|
||||||
|
|
||||||
|
class App(filling.App):
|
||||||
|
def OnInit(self):
|
||||||
|
filling.App.OnInit(self)
|
||||||
|
self.root = self.fillingFrame.filling.tree.root
|
||||||
|
return True
|
||||||
|
|
||||||
|
def main():
|
||||||
|
"""Create and run the application."""
|
||||||
|
global app
|
||||||
|
app = App(0)
|
||||||
|
app.fillingFrame.filling.tree.Expand(app.root)
|
||||||
|
app.MainLoop()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
79
wxPython/wxPython/py/PyShell.py
Executable file
@@ -0,0 +1,79 @@
|
|||||||
|
"""PyShell is a python shell application."""
|
||||||
|
|
||||||
|
# The next two lines, and the other code below that makes use of
|
||||||
|
# ``__main__`` and ``original``, serve the purpose of cleaning up the
|
||||||
|
# main namespace to look as much as possible like the regular Python
|
||||||
|
# shell environment.
|
||||||
|
import __main__
|
||||||
|
original = __main__.__dict__.keys()
|
||||||
|
|
||||||
|
__author__ = "Patrick K. O'Brien <pobrien@orbtech.com>"
|
||||||
|
__cvsid__ = "$Id$"
|
||||||
|
__revision__ = "$Revision$"[11:-2]
|
||||||
|
|
||||||
|
import wx
|
||||||
|
|
||||||
|
try:
|
||||||
|
True
|
||||||
|
except NameError:
|
||||||
|
True = 1==1
|
||||||
|
False = 1==0
|
||||||
|
|
||||||
|
|
||||||
|
class App(wx.App):
|
||||||
|
"""PyShell standalone application."""
|
||||||
|
|
||||||
|
def OnInit(self):
|
||||||
|
import wx
|
||||||
|
wx.InitAllImageHandlers()
|
||||||
|
locals = __main__.__dict__
|
||||||
|
from shell import ShellFrame
|
||||||
|
self.frame = ShellFrame(locals=locals)
|
||||||
|
self.frame.SetSize((750, 525))
|
||||||
|
self.frame.Show()
|
||||||
|
self.SetTopWindow(self.frame)
|
||||||
|
self.frame.shell.SetFocus()
|
||||||
|
return True
|
||||||
|
|
||||||
|
'''
|
||||||
|
The main() function needs to handle being imported, such as with the
|
||||||
|
pyshell script that wxPython installs:
|
||||||
|
|
||||||
|
#!/usr/bin/env python
|
||||||
|
|
||||||
|
from wx.py.PyShell import main
|
||||||
|
main()
|
||||||
|
'''
|
||||||
|
|
||||||
|
def main():
|
||||||
|
"""The main function for the PyShell program."""
|
||||||
|
# Cleanup the main namespace, leaving the App class.
|
||||||
|
import __main__
|
||||||
|
md = __main__.__dict__
|
||||||
|
keepers = original
|
||||||
|
keepers.append('App')
|
||||||
|
for key in md.keys():
|
||||||
|
if key not in keepers:
|
||||||
|
del md[key]
|
||||||
|
# Create an application instance.
|
||||||
|
app = App(0)
|
||||||
|
# Cleanup the main namespace some more.
|
||||||
|
if md.has_key('App') and md['App'] is App:
|
||||||
|
del md['App']
|
||||||
|
if md.has_key('__main__') and md['__main__'] is __main__:
|
||||||
|
del md['__main__']
|
||||||
|
# Mimic the contents of the standard Python shell's sys.path.
|
||||||
|
import sys
|
||||||
|
if sys.path[0]:
|
||||||
|
sys.path[0] = ''
|
||||||
|
# Add the application object to the sys module's namespace.
|
||||||
|
# This allows a shell user to do:
|
||||||
|
# >>> import sys
|
||||||
|
# >>> sys.app.whatever
|
||||||
|
sys.app = app
|
||||||
|
del sys
|
||||||
|
# Start the wxPython event loop.
|
||||||
|
app.MainLoop()
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
56
wxPython/wxPython/py/PyWrap.py
Executable file
@@ -0,0 +1,56 @@
|
|||||||
|
"""PyWrap is a command line utility that runs a wxPython program with
|
||||||
|
additional runtime-tools, such as PyCrust."""
|
||||||
|
|
||||||
|
__author__ = "Patrick K. O'Brien <pobrien@orbtech.com>"
|
||||||
|
__cvsid__ = "$Id$"
|
||||||
|
__revision__ = "$Revision$"[11:-2]
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import wx
|
||||||
|
from crust import CrustFrame as Frame
|
||||||
|
|
||||||
|
try:
|
||||||
|
True
|
||||||
|
except NameError:
|
||||||
|
True = 1==1
|
||||||
|
False = 1==0
|
||||||
|
|
||||||
|
|
||||||
|
def wrap(app):
|
||||||
|
wx.InitAllImageHandlers()
|
||||||
|
frame = Frame()
|
||||||
|
frame.SetSize((750, 525))
|
||||||
|
frame.Show(True)
|
||||||
|
frame.shell.interp.locals['app'] = app
|
||||||
|
app.MainLoop()
|
||||||
|
|
||||||
|
|
||||||
|
def main(modulename=None):
|
||||||
|
sys.path.insert(0, os.curdir)
|
||||||
|
if not modulename:
|
||||||
|
if len(sys.argv) < 2:
|
||||||
|
print "Please specify a module name."
|
||||||
|
raise SystemExit
|
||||||
|
modulename = sys.argv[1]
|
||||||
|
if modulename.endswith('.py'):
|
||||||
|
modulename = modulename[:-3]
|
||||||
|
module = __import__(modulename)
|
||||||
|
# Find the App class.
|
||||||
|
App = None
|
||||||
|
d = module.__dict__
|
||||||
|
for item in d.keys():
|
||||||
|
try:
|
||||||
|
if issubclass(d[item], wx.App):
|
||||||
|
App = d[item]
|
||||||
|
except (NameError, TypeError):
|
||||||
|
pass
|
||||||
|
if App is None:
|
||||||
|
print "No App class found."
|
||||||
|
raise SystemExit
|
||||||
|
app = App()
|
||||||
|
wrap(app)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
79
wxPython/wxPython/py/README.txt
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
=====================================
|
||||||
|
PyCrust - The Flakiest Python Shell
|
||||||
|
=====================================
|
||||||
|
|
||||||
|
Half-baked by Patrick K. O'Brien (pobrien@orbtech.com)
|
||||||
|
|
||||||
|
Orbtech - "Your source for Python programming expertise."
|
||||||
|
Sample all our half-baked Python goods at www.orbtech.com.
|
||||||
|
|
||||||
|
|
||||||
|
What is PyCrust?
|
||||||
|
----------------
|
||||||
|
|
||||||
|
PyCrust is an interactive Python environment written in Python.
|
||||||
|
PyCrust components can run standalone or be integrated into other
|
||||||
|
development environments and/or other Python applications.
|
||||||
|
|
||||||
|
PyCrust comes with an interactive Python shell (PyShell), an
|
||||||
|
interactive namespace/object tree control (PyFilling) and an
|
||||||
|
integrated, split-window combination of the two (PyCrust).
|
||||||
|
|
||||||
|
|
||||||
|
What is PyCrust good for?
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
Have you ever tried to bake a pie without one? Well, you shouldn't
|
||||||
|
build a Python program without a PyCrust either.
|
||||||
|
|
||||||
|
|
||||||
|
What else do I need to use PyCrust?
|
||||||
|
-----------------------------------
|
||||||
|
|
||||||
|
PyCrust requires Python 2.1.3 or later, and wxPython 2.4 or later.
|
||||||
|
PyCrust uses wxPython and the Scintilla wrapper (wxStyledTextCtrl).
|
||||||
|
Python is available at http://www.python.org/. wxPython is available
|
||||||
|
at http://www.wxpython.org/.
|
||||||
|
|
||||||
|
|
||||||
|
Where can I get the latest version of PyCrust?
|
||||||
|
----------------------------------------------
|
||||||
|
|
||||||
|
The latest production version ships with wxPython. The latest
|
||||||
|
developer version is available in CVS at:
|
||||||
|
http://sourceforge.net/cvs/?group_id=31263
|
||||||
|
|
||||||
|
|
||||||
|
Where is the PyCrust project hosted?
|
||||||
|
------------------------------------
|
||||||
|
|
||||||
|
At SourceForge, of course. The SourceForge summary page:
|
||||||
|
http://sourceforge.net/projects/pycrust/
|
||||||
|
|
||||||
|
|
||||||
|
I found a bug in PyCrust, what do I do with it?
|
||||||
|
-----------------------------------------------
|
||||||
|
|
||||||
|
You can send it to me at pobrien@orbtech.com.
|
||||||
|
|
||||||
|
|
||||||
|
I want a new feature added to PyCrust. Will you do it?
|
||||||
|
------------------------------------------------------
|
||||||
|
|
||||||
|
Flattery and money will get you anything. Short of that, you can send
|
||||||
|
me a request and I'll see what I can do.
|
||||||
|
|
||||||
|
|
||||||
|
Does PyCrust have a mailing list full of wonderful people?
|
||||||
|
----------------------------------------------------------
|
||||||
|
|
||||||
|
As a matter of fact, we do. Join the PyCrust mailing lists at:
|
||||||
|
http://sourceforge.net/mail/?group_id=31263
|
||||||
|
|
||||||
|
|
||||||
|
What is the CVS information for this README file?
|
||||||
|
-------------------------------------------------
|
||||||
|
|
||||||
|
$Date$
|
||||||
|
$Revision$
|
||||||
|
$Id$
|
20
wxPython/wxPython/py/__init__.py
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
"""The py package, formerly the PyCrust package."""
|
||||||
|
|
||||||
|
__author__ = "Patrick K. O'Brien <pobrien@orbtech.com>"
|
||||||
|
__cvsid__ = "$Id$"
|
||||||
|
__revision__ = "$Revision$"[11:-2]
|
||||||
|
|
||||||
|
import buffer
|
||||||
|
import crust
|
||||||
|
import dispatcher
|
||||||
|
import document
|
||||||
|
import editor
|
||||||
|
import editwindow
|
||||||
|
import filling
|
||||||
|
import frame
|
||||||
|
import images
|
||||||
|
import interpreter
|
||||||
|
import introspect
|
||||||
|
import pseudo
|
||||||
|
import shell
|
||||||
|
import version
|