Merge lp:~nataliabidart/magicicada-gui/bind-view-queues-to-backend into lp:magicicada-gui

Proposed by Natalia Bidart
Status: Merged
Approved by: Facundo Batista
Approved revision: 24
Merged at revision: 17
Proposed branch: lp:~nataliabidart/magicicada-gui/bind-view-queues-to-backend
Merge into: lp:magicicada-gui
Prerequisite: lp:~nataliabidart/magicicada-gui/main-window-iconifiable
Diff against target: 1856 lines (+434/-1213)
7 files modified
bin/magicicada (+5/-2)
data/media/logo.svg (+0/-611)
data/ui/gui.glade (+154/-50)
magicicada/__init__.py (+102/-289)
magicicada/helpers.py (+2/-16)
magicicada/syncdaemon.py (+5/-12)
magicicada/tests/test_magicicada.py (+166/-233)
To merge this branch: bzr merge lp:~nataliabidart/magicicada-gui/bind-view-queues-to-backend
Reviewer Review Type Date Requested Status
Facundo Batista Approve
Review via email: mp+25405@code.launchpad.net

Commit message

Fixing bug #568202. Content and meta queue are now shown as tree views.

Description of the change

Fixing bug #568202. Content and meta queue are now shown as tree views.

To post a comment you must log in.
Revision history for this message
Natalia Bidart (nataliabidart) wrote :

I have no idea why there are some "conflicts" marked as removed in the diff below, I had no conflicts in the branch nor in trunk.

24. By Natalia Bidart

Removing reactor code from magicicada (moved to the binary, where it belongs).

Revision history for this message
Facundo Batista (facundo) wrote :

Looks ok!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'bin/magicicada'
2--- bin/magicicada 2010-05-02 19:43:53 +0000
3+++ bin/magicicada 2010-05-17 16:12:34 +0000
4@@ -45,6 +45,9 @@
5 logging.basicConfig(level=logging.DEBUG)
6 logging.debug('logging enabled')
7
8+ from twisted.internet import reactor
9+
10 # Run the application.
11- window = MagicicadaUI(launchpad_available=launchpad_available)
12- window.run()
13+ window = MagicicadaUI(launchpad_available=launchpad_available,
14+ on_destroy=lambda *a, **kw: reactor.stop())
15+ reactor.run()
16
17=== modified file 'data/media/logo.svg'
18--- data/media/logo.svg 2010-05-17 16:12:33 +0000
19+++ data/media/logo.svg 2010-05-17 16:12:34 +0000
20@@ -10,468 +10,6 @@
21 xmlns:xlink="http://www.w3.org/1999/xlink"
22 xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
23 xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
24-<<<<<<< TREE
25- width="784.8244"
26- height="784.10883"
27- id="svg2"
28- version="1.1"
29- inkscape:version="0.47 r22583"
30- sodipodi:docname="logo.svg">
31- <defs
32- id="defs4">
33- <linearGradient
34- id="linearGradient6036">
35- <stop
36- id="stop6038"
37- offset="0"
38- style="stop-color:#ff0000;stop-opacity:1;" />
39- <stop
40- id="stop6040"
41- offset="0.15040193"
42- style="stop-color:#ffbf00;stop-opacity:0.97647059;" />
43- <stop
44- style="stop-color:#ffff00;stop-opacity:0.96862745;"
45- offset="0.27645355"
46- id="stop6042" />
47- <stop
48- id="stop6044"
49- offset="0.40514705"
50- style="stop-color:#bfff00;stop-opacity:0.96078431;" />
51- <stop
52- style="stop-color:#3fff00;stop-opacity:0.94509804;"
53- offset="0.54492491"
54- id="stop6046" />
55- <stop
56- id="stop6048"
57- offset="0.65421808"
58- style="stop-color:#00df1f;stop-opacity:0.92941176;" />
59- <stop
60- id="stop6050"
61- offset="0.77951556"
62- style="stop-color:#00bf3f;stop-opacity:0.92156863;" />
63- <stop
64- id="stop6052"
65- offset="0.88955659"
66- style="stop-color:#007f7f;stop-opacity:0.90588235;" />
67- <stop
68- style="stop-color:#0000ff;stop-opacity:0.87450981;"
69- offset="1"
70- id="stop6054" />
71- </linearGradient>
72- <linearGradient
73- id="linearGradient6010">
74- <stop
75- id="stop6012"
76- offset="0"
77- style="stop-color:#ff0000;stop-opacity:1;" />
78- <stop
79- style="stop-color:#ff7f00;stop-opacity:0.98431373;"
80- offset="0.13393337"
81- id="stop6014" />
82- <stop
83- id="stop6016"
84- offset="0.23890866"
85- style="stop-color:#ffbf00;stop-opacity:0.97647059;" />
86- <stop
87- style="stop-color:#ffff00;stop-opacity:0.96862745;"
88- offset="0.37702307"
89- id="stop6018" />
90- <stop
91- id="stop6020"
92- offset="0.42686233"
93- style="stop-color:#dfff00;stop-opacity:0.96470588;" />
94- <stop
95- id="stop6022"
96- offset="0.51511705"
97- style="stop-color:#bfff00;stop-opacity:0.96078431;" />
98- <stop
99- style="stop-color:#3fff00;stop-opacity:0.94509804;"
100- offset="0.60455"
101- id="stop6024" />
102- <stop
103- id="stop6026"
104- offset="0.67739385"
105- style="stop-color:#00df1f;stop-opacity:0.92941176;" />
106- <stop
107- id="stop6028"
108- offset="0.74737048"
109- style="stop-color:#00bf3f;stop-opacity:0.92156863;" />
110- <stop
111- style="stop-color:#009f5f;stop-opacity:0.91372549;"
112- offset="0.81486219"
113- id="stop6030" />
114- <stop
115- id="stop6032"
116- offset="0.86383885"
117- style="stop-color:#007f7f;stop-opacity:0.90588235;" />
118- <stop
119- style="stop-color:#0000ff;stop-opacity:0.87450981;"
120- offset="1"
121- id="stop6034" />
122- </linearGradient>
123- <inkscape:perspective
124- sodipodi:type="inkscape:persp3d"
125- inkscape:vp_x="0 : 526.18109 : 1"
126- inkscape:vp_y="0 : 1000 : 0"
127- inkscape:vp_z="744.09448 : 526.18109 : 1"
128- inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
129- id="perspective10" />
130- <inkscape:perspective
131- id="perspective2905"
132- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
133- inkscape:vp_z="1 : 0.5 : 1"
134- inkscape:vp_y="0 : 1000 : 0"
135- inkscape:vp_x="0 : 0.5 : 1"
136- sodipodi:type="inkscape:persp3d" />
137- <inkscape:perspective
138- id="perspective2948"
139- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
140- inkscape:vp_z="1 : 0.5 : 1"
141- inkscape:vp_y="0 : 1000 : 0"
142- inkscape:vp_x="0 : 0.5 : 1"
143- sodipodi:type="inkscape:persp3d" />
144- <inkscape:perspective
145- id="perspective3740"
146- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
147- inkscape:vp_z="1 : 0.5 : 1"
148- inkscape:vp_y="0 : 1000 : 0"
149- inkscape:vp_x="0 : 0.5 : 1"
150- sodipodi:type="inkscape:persp3d" />
151- <inkscape:perspective
152- id="perspective2872"
153- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
154- inkscape:vp_z="1 : 0.5 : 1"
155- inkscape:vp_y="0 : 1000 : 0"
156- inkscape:vp_x="0 : 0.5 : 1"
157- sodipodi:type="inkscape:persp3d" />
158- <linearGradient
159- inkscape:collect="always"
160- xlink:href="#linearGradient6010"
161- id="linearGradient3775"
162- x1="1867.9991"
163- y1="391.83505"
164- x2="2113.4824"
165- y2="391.83505"
166- gradientUnits="userSpaceOnUse" />
167- <linearGradient
168- inkscape:collect="always"
169- xlink:href="#linearGradient6010"
170- id="linearGradient3777"
171- x1="1822.2806"
172- y1="509.23386"
173- x2="2067.0618"
174- y2="509.23386"
175- gradientUnits="userSpaceOnUse" />
176- <linearGradient
177- inkscape:collect="always"
178- xlink:href="#linearGradient6010"
179- id="linearGradient3779"
180- x1="1550.7804"
181- y1="561.81555"
182- x2="1888.9661"
183- y2="561.81555"
184- gradientUnits="userSpaceOnUse" />
185- <linearGradient
186- inkscape:collect="always"
187- xlink:href="#linearGradient6010"
188- id="linearGradient3781"
189- x1="1564.0616"
190- y1="720.4718"
191- x2="1703.3741"
192- y2="720.4718"
193- gradientUnits="userSpaceOnUse" />
194- <linearGradient
195- inkscape:collect="always"
196- xlink:href="#linearGradient6010"
197- id="linearGradient3783"
198- x1="1517.1554"
199- y1="660.521"
200- x2="1841.8"
201- y2="660.521"
202- gradientUnits="userSpaceOnUse" />
203- <linearGradient
204- inkscape:collect="always"
205- xlink:href="#linearGradient6010"
206- id="linearGradient3785"
207- x1="1519.3741"
208- y1="503.64713"
209- x2="1744.6722"
210- y2="503.64713"
211- gradientUnits="userSpaceOnUse" />
212- <linearGradient
213- inkscape:collect="always"
214- xlink:href="#linearGradient6010"
215- id="linearGradient3787"
216- x1="2037.218"
217- y1="46.237438"
218- x2="2133.968"
219- y2="46.237438"
220- gradientUnits="userSpaceOnUse" />
221- <linearGradient
222- inkscape:collect="always"
223- xlink:href="#linearGradient6010"
224- id="linearGradient3789"
225- x1="1803.3429"
226- y1="216.79991"
227- x2="1965.9542"
228- y2="216.79991"
229- gradientUnits="userSpaceOnUse" />
230- <linearGradient
231- inkscape:collect="always"
232- xlink:href="#linearGradient6010"
233- id="linearGradient3791"
234- x1="1772.3429"
235- y1="281.62592"
236- x2="2026.1866"
237- y2="281.62592"
238- gradientUnits="userSpaceOnUse" />
239- <linearGradient
240- inkscape:collect="always"
241- xlink:href="#linearGradient6010"
242- id="linearGradient3793"
243- x1="2000.7491"
244- y1="83.488998"
245- x2="2177.7493"
246- y2="83.488998"
247- gradientUnits="userSpaceOnUse" />
248- <linearGradient
249- inkscape:collect="always"
250- xlink:href="#linearGradient6010"
251- id="linearGradient3795"
252- x1="1933.0292"
253- y1="191.26004"
254- x2="2188.7668"
255- y2="191.26004"
256- gradientUnits="userSpaceOnUse" />
257- <linearGradient
258- inkscape:collect="always"
259- xlink:href="#linearGradient6010"
260- id="linearGradient3797"
261- x1="1956.7218"
262- y1="305.36465"
263- x2="2159.1868"
264- y2="305.36465"
265- gradientUnits="userSpaceOnUse" />
266- <linearGradient
267- inkscape:collect="always"
268- xlink:href="#linearGradient6010"
269- id="linearGradient3799"
270- x1="1674.0616"
271- y1="420.89871"
272- x2="1941.7629"
273- y2="420.89871"
274- gradientUnits="userSpaceOnUse" />
275- <inkscape:perspective
276- id="perspective5910"
277- inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
278- inkscape:vp_z="1 : 0.5 : 1"
279- inkscape:vp_y="0 : 1000 : 0"
280- inkscape:vp_x="0 : 0.5 : 1"
281- sodipodi:type="inkscape:persp3d" />
282- <linearGradient
283- inkscape:collect="always"
284- xlink:href="#linearGradient5835"
285- id="linearGradient5841"
286- x1="233.53571"
287- y1="549.50507"
288- x2="695.03571"
289- y2="549.50507"
290- gradientUnits="userSpaceOnUse" />
291- <linearGradient
292- id="linearGradient5835">
293- <stop
294- style="stop-color:#ff0000;stop-opacity:1;"
295- offset="0"
296- id="stop5837" />
297- <stop
298- style="stop-color:#ffbf00;stop-opacity:0.97647059;"
299- offset="0.16954298"
300- id="stop5865" />
301- <stop
302- id="stop5851"
303- offset="0.25013462"
304- style="stop-color:#ffff00;stop-opacity:0.96862745;" />
305- <stop
306- style="stop-color:#bfff00;stop-opacity:0.96078431;"
307- offset="0.40514705"
308- id="stop5867" />
309- <stop
310- id="stop5877"
311- offset="0.5521028"
312- style="stop-color:#3fff00;stop-opacity:0.94509804;" />
313- <stop
314- style="stop-color:#00df1f;stop-opacity:0.92941176;"
315- offset="0.70446336"
316- id="stop5875" />
317- <stop
318- style="stop-color:#00bf3f;stop-opacity:0.92156863;"
319- offset="0.77951556"
320- id="stop5871" />
321- <stop
322- style="stop-color:#007f7f;stop-opacity:0.90588235;"
323- offset="0.92305344"
324- id="stop5863" />
325- <stop
326- id="stop5847"
327- offset="1"
328- style="stop-color:#0000ff;stop-opacity:0.87450981;" />
329- </linearGradient>
330- <linearGradient
331- y2="549.50507"
332- x2="695.03571"
333- y1="549.50507"
334- x1="233.53571"
335- gradientUnits="userSpaceOnUse"
336- id="linearGradient5931"
337- xlink:href="#linearGradient6010"
338- inkscape:collect="always" />
339- <linearGradient
340- inkscape:collect="always"
341- xlink:href="#linearGradient6010"
342- id="linearGradient6008"
343- x1="594.60907"
344- y1="353.40845"
345- x2="1266.2205"
346- y2="353.40845"
347- gradientUnits="userSpaceOnUse" />
348- <linearGradient
349- inkscape:collect="always"
350- xlink:href="#linearGradient5835"
351- id="linearGradient6056"
352- gradientUnits="userSpaceOnUse"
353- x1="594.60907"
354- y1="353.40845"
355- x2="1266.2205"
356- y2="353.40845" />
357- <linearGradient
358- inkscape:collect="always"
359- xlink:href="#linearGradient6010"
360- id="linearGradient6058"
361- gradientUnits="userSpaceOnUse"
362- x1="594.60907"
363- y1="353.40845"
364- x2="1266.2205"
365- y2="353.40845" />
366- <linearGradient
367- inkscape:collect="always"
368- xlink:href="#linearGradient6010"
369- id="linearGradient6060"
370- gradientUnits="userSpaceOnUse"
371- x1="594.60907"
372- y1="353.40845"
373- x2="1266.2205"
374- y2="353.40845" />
375- <linearGradient
376- inkscape:collect="always"
377- xlink:href="#linearGradient6010"
378- id="linearGradient6062"
379- gradientUnits="userSpaceOnUse"
380- x1="594.60907"
381- y1="353.40845"
382- x2="1266.2205"
383- y2="353.40845" />
384- <linearGradient
385- inkscape:collect="always"
386- xlink:href="#linearGradient6010"
387- id="linearGradient6064"
388- gradientUnits="userSpaceOnUse"
389- x1="594.60907"
390- y1="353.40845"
391- x2="1266.2205"
392- y2="353.40845" />
393- <linearGradient
394- inkscape:collect="always"
395- xlink:href="#linearGradient6010"
396- id="linearGradient6066"
397- gradientUnits="userSpaceOnUse"
398- x1="594.60907"
399- y1="353.40845"
400- x2="1266.2205"
401- y2="353.40845" />
402- <linearGradient
403- inkscape:collect="always"
404- xlink:href="#linearGradient6010"
405- id="linearGradient6068"
406- gradientUnits="userSpaceOnUse"
407- x1="594.60907"
408- y1="353.40845"
409- x2="1266.2205"
410- y2="353.40845" />
411- <linearGradient
412- inkscape:collect="always"
413- xlink:href="#linearGradient6010"
414- id="linearGradient6070"
415- gradientUnits="userSpaceOnUse"
416- x1="594.60907"
417- y1="353.40845"
418- x2="1266.2205"
419- y2="353.40845" />
420- <linearGradient
421- inkscape:collect="always"
422- xlink:href="#linearGradient6010"
423- id="linearGradient6072"
424- gradientUnits="userSpaceOnUse"
425- x1="594.60907"
426- y1="353.40845"
427- x2="1266.2205"
428- y2="353.40845" />
429- <linearGradient
430- inkscape:collect="always"
431- xlink:href="#linearGradient6010"
432- id="linearGradient6074"
433- gradientUnits="userSpaceOnUse"
434- x1="594.60907"
435- y1="353.40845"
436- x2="1266.2205"
437- y2="353.40845" />
438- <linearGradient
439- inkscape:collect="always"
440- xlink:href="#linearGradient6010"
441- id="linearGradient6076"
442- gradientUnits="userSpaceOnUse"
443- x1="594.60907"
444- y1="353.40845"
445- x2="1266.2205"
446- y2="353.40845" />
447- <linearGradient
448- inkscape:collect="always"
449- xlink:href="#linearGradient6010"
450- id="linearGradient6078"
451- gradientUnits="userSpaceOnUse"
452- x1="594.60907"
453- y1="353.40845"
454- x2="1266.2205"
455- y2="353.40845" />
456- <linearGradient
457- inkscape:collect="always"
458- xlink:href="#linearGradient6010"
459- id="linearGradient6080"
460- gradientUnits="userSpaceOnUse"
461- x1="594.60907"
462- y1="353.40845"
463- x2="1266.2205"
464- y2="353.40845" />
465- </defs>
466- <sodipodi:namedview
467- id="base"
468- pagecolor="#ffffff"
469- bordercolor="#666666"
470- borderopacity="1.0"
471- inkscape:pageopacity="0.0"
472- inkscape:pageshadow="2"
473- inkscape:zoom="0.45281676"
474- inkscape:cx="108.47293"
475- inkscape:cy="324.31493"
476- inkscape:document-units="px"
477- inkscape:current-layer="layer1"
478- showgrid="false"
479- inkscape:window-width="1380"
480- inkscape:window-height="875"
481- inkscape:window-x="30"
482- inkscape:window-y="0"
483- inkscape:window-maximized="1"
484- showborder="false" />
485-=======
486 width="784.8244"
487 height="784.10883"
488 id="svg2"
489@@ -932,7 +470,6 @@
490 inkscape:window-y="0"
491 inkscape:window-maximized="1"
492 showborder="false" />
493->>>>>>> MERGE-SOURCE
494 <metadata
495 id="metadata7">
496 <rdf:RDF>
497@@ -945,153 +482,6 @@
498 </cc:Work>
499 </rdf:RDF>
500 </metadata>
501-<<<<<<< TREE
502- <g
503- inkscape:label="Capa 1"
504- inkscape:groupmode="layer"
505- id="layer1"
506- transform="translate(-939.21814,94.69993)">
507- <path
508- style="color:#000000;fill:#ffff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5714916px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
509- d=""
510- id="path3772" />
511- <path
512- style="color:#000000;fill:#ffff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5714916px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
513- d=""
514- id="path3774" />
515- <path
516- style="color:#000000;fill:#ffff00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5714916px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
517- d=""
518- id="path3776" />
519- <path
520- style="color:#000000;fill:#55ff55;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5714916px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
521- d=""
522- id="path3864"
523- transform="translate(939.21814,-94.69993)" />
524- <path
525- style="color:#000000;fill:#7fff2a;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5714916px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
526- d=""
527- id="path3886"
528- transform="translate(939.21814,-94.69993)" />
529- <path
530- style="fill:#000000"
531- d="m 349.08468,846.90605 c 0.26917,10.7682 3.2281,21.30128 7.9375,30.90625 20.46429,-10.79074 26.0108,-35.28275 35.125,-54.875 6.20007,-14.24125 12.82573,-30.33655 26.5625,-38.78125 1.58611,-0.4174 6.39597,-3.3676 4.84375,0.625 -2.19091,16.535 -11.81523,31.4283 -15.86937,46.23719 0.81854,14.2695 -15.6966,12.97272 -9.13063,35.29406 7.83221,14.15213 27.26199,16.11051 41.3125,11.1875 17.25691,-7.58089 35.86376,-11.04582 53.92492,-16.28831 25.14777,-7.07842 50.84819,-13.47303 74.56626,-24.4093 31.24631,-24.55204 70.89713,-36.37274 100.69632,-63.05234 21.97923,-15.0095 41.83869,-33.9648 67.53125,-42.5938 29.21493,-13.0907 54.01114,-35.8582 84.78125,-45.9062 4.75508,-5.2173 11.73563,-9.2063 13.71875,-16.6563 14.63684,-11.1457 -14.59993,6.2284 -22.09375,8.875 -4.77817,2.4994 -13.13233,5.3388 -15.96875,-1.2187 -5.8151,-4.7879 -28.72679,-10.5161 -40.61584,-14.2408 -6.65387,-4.5106 -17.08712,-10.6388 -13.63416,-19.6968 5.90007,-19.1913 23.71274,-31.6622 40.59124,-40.4593 9.6801,-5.0391 20.85081,-7.1229 31.62751,-4.9781 9.40465,0.4529 17.77799,-7.5951 17.4375,-17.0938 1.29543,-11.1981 -1.73524,-23.1209 3,-33.6562 27.92405,-21.0104 64.37995,-21.772 97.82525,-25.4466 16.2585,-1.3349 32.4519,-4.199 48.1435,-8.2097 8.5671,-1.2676 17.4661,5.1766 17.3125,14.1875 1.65252,10.9769 -4.087,21.1727 -11.5129,28.67 -3.7866,5.7712 -8.4485,11.2367 -15.0183,13.6738 -27.7535,18.9167 -63.0765,15.9836 -95.1562,15.9108 -12.6139,-0.1127 -25.2536,0.3798 -37.7501,2.1829 9.35565,11.8615 25.4177,14.3192 39.6563,12.9375 17.1795,-0.9013 34.0785,-4.9579 51.1875,-5.6562 8.4681,7.1659 22.0677,9.7867 30.6875,1.375 11.8918,-8.7447 20.0476,-21.5467 31.375,-30.7813 8.40132,-9.389 12.75382,-21.3848 21.02592,-30.9794 10.5256,-14.3725 19.1114,-30.3755 30.3803,-44.1143 6.9187,-5.8613 9.9597,-14.7166 12.6563,-22.9376 4.9385,-8.8188 3.604,-19.7943 8.5044,-28.7499 3.8438,-11.3712 10.8722,-21.1603 16.9956,-31.2813 8.3168,-18.1676 19.265,-35.65521 20.75,-56.03121 0.9855,-6.1022 0.023,-13.2484 0.5312,-18.7188 5.1817,-2.8741 6.2191,-10.0524 9.3304,-14.7806 10.6524,-21.1581 11.6565,-45.3836 16.1307,-68.3712 5.8077,-36.6164 8.5496,-76.0408 -6.1798,-110.9107 -8.8486,-20.6039 -28.6418,-34.2076 -49.9326,-39.485304 -23.7116,-6.0042 -49.4405,-4.1252 -72.2289,4.509604 -98.00342,48.8699 -183.35901,119.6913 -258.64805,198.5468 -17.22945,14.8334 -33.4177,30.6946 -49.31552,46.8352 -78.6551,70.57961 -143.05563,155.02661 -207.92413,238.16261 -39.10861,58.9335 -82.23211,115.9059 -111.77012,180.4144 -3.94725,14.62 -24.16747,45.575 -21.462,58.29795 -1.43956,7.08577 -2.17394,14.27225 -1.9375,21.53125 z m 84.75,13.84375 c 12.19456,-10.36481 27.43507,-16.59452 42.81555,-20.43339 18.33392,-9.87646 36.93366,-19.82574 55.9032,-28.66036 41.11408,-19.9245 83.77577,-36.1306 126.37806,-52.5489 7.61222,-3.1832 15.21211,-6.382 23.18444,-8.4823 -12.92947,10.909 -28.49911,18.0804 -42.35566,27.705 -44.79045,27.78 -92.01196,52.74492 -143.69642,64.67239 -19.861,1.97104 -42.96917,16.88658 -62.22917,17.74756 z m 2.15625,-31.625 c 1.32849,-8.64139 7.93128,-15.75195 13.87523,-21.85125 14.45037,-12.3347 32.93845,-18.7363 48.78189,-29.186 43.24286,-25.4972 85.73746,-52.4123 129.45153,-76.9441 30.70001,-18.4504 63.1991,-38.5234 100.26635,-38.5499 8.11827,0.3333 16.85237,1.6363 24.375,3.375 3.85604,2.0097 10.71973,3.58 14.875,7.5313 9.45738,6.3837 9.37105,22.5028 -1.21875,27.6874 -10.32228,5.5451 -22.32651,6.3887 -33.11131,10.8902 -64.49445,20.2383 -127.14652,46.1279 -189.47387,71.922 -31.04813,13.7115 -60.1996,31.4223 -90.41482,46.7191 -5.20403,1.11575 -12.87373,4.89018 -17.125,0.375 -0.22769,-0.62887 -0.23175,-1.30969 -0.28125,-1.96875 z m 3.03125,-82.28125 c 2.05845,-19.5041 15.12655,-35.1816 26.65625,-50.125 34.9546,-54.7159 70.64072,-109.3294 110.5625,-160.6875 29.80867,-33.2517 51.54343,-74.3295 87.84375,-101.125 4.33677,-3.1584 12.56449,-3.5327 13.84375,3 5.46259,16.7762 -3.69234,33.4147 -9.75,48.6875 -23.2926,49.3671 -68.22953,84.1812 -96.38255,130.4729 -18.36505,41.0458 -56.13664,68.3742 -87.05849,99.6015 -10.32541,8.8655 -18.66953,19.9734 -29.09021,28.5193 -4.41448,3.0506 -10.82713,6.3154 -16,4.3126 -0.54293,-0.7678 -0.51877,-1.7509 -0.625,-2.6563 z m 19.03125,26.4063 c 3.1557,-16.4732 20.87384,-22.2647 31.83314,-32.6061 31.91166,-26.9271 55.1502,-65.111 94.06679,-83.2532 39.31319,-20.1325 79.24089,-39.8051 114.22507,-66.922 25.00706,-16.9893 42.91529,-45.1071 73.34375,-53.0937 7.7929,-1.1146 15.83845,-0.9939 23.3125,-3.7188 13.29069,-2.1448 25.87061,8.9622 27.03125,21.875 1.28574,7.9728 -0.34331,16.4088 -4.34375,23.4688 -12.68375,4.825 -25.69081,8.348 -38.9375,10.9062 -23.15681,7.4568 -35.26022,30.4723 -49.8125,48.1875 -5.90201,6.9554 -13.40537,14.1737 -23.21035,13.7231 -46.55799,6.4308 -86.81567,32.507 -126.9408,55.1887 -38.41015,22.7558 -75.87383,47.4316 -116.59885,65.6819 -1.28502,0.2595 -2.69823,0.8826 -3.96875,0.5626 z m 132.34375,-145.5313 c 13.80462,-35.2687 46.34122,-57.3516 67.70268,-87.4557 16.00341,-20.8253 37.0322,-37.0896 58.39611,-52.5063 25.02598,-18.4092 48.66206,-38.7687 70.98262,-60.1872 19.74619,-17.5693 42.37151,-35.5322 69.51239,-38.6633 6.2927,-0.3166 16.1025,-0.3566 18.1875,7.0938 1.3202,14.4414 -8.8108,26.4222 -15.3438,38.3437 -6.0741,8.2821 -9.6213,19.6623 -19.80162,23.7064 -52.97977,29.9225 -96.13313,74.0288 -144.32338,110.6373 -34.71223,20.18 -65.01076,51.209 -105.40625,59.2813 l 0.0937,-0.25 5e-5,0 z m 102.21875,-158.8437 c 4.72671,-15.0269 0.36909,-30.2945 6.8125,-44.8438 4.16579,-4.0289 10.1314,-5.6576 14.53125,-9.5938 10.95554,-8.9754 22.80599,-13.3035 33.53072,-22.0995 39.63952,-34.98531 72.52538,-77.44861 115.01138,-108.86621 27.1658,-27.1851 73.7483,-29.6957 105.2079,-9.9093 -38.5642,15.0989 -76.7053,34.0757 -106.8125,63.0626 -14.44132,14.1099 -25.67127,31.1666 -41.00157,44.34981 -27.83085,25.7078 -59.41994,47.7547 -87.14345,73.7882 -10.93953,8.6869 -21.78724,19.5725 -36.13623,21.737 -3.34066,-0.5148 -3.8919,-4.876 -4,-7.625 z m 46.5625,-119.62501 c 22.70405,-21.5909 50.38139,-50.7056 73.18269,-75.6378 29.27789,-29.3129 70.25256,-45.6581 111.34856,-48.1748 -69.8759,37.1601 -125.08328,95.2166 -183.125,147.875 -2.5927,1.4466 -4.18548,5.1429 -6.5,6.09381 -3.85015,-6.47121 -14.90923,-2.75251 -12.16838,-12.04751 7.72595,-9.1768 8.72145,-9.6804 17.26213,-18.1087 z m 47.0625,173.21871 c 5.65384,-18.0865 23.88148,-27.6384 39.0283,-36.6769 14.48877,-7.725 29.21785,-15.8647 44.62795,-21.4168 41.7701,-7.1174 81.8242,-23.3848 124.0313,-27.4688 8.24292,-5.2561 18.71842,-2.277 27.93752,-4.0312 12.9401,1.81 22.7923,14.0649 25.3125,26.375 1.8666,8.7106 -5.8669,15.0906 -9.1875,22.375 -3.1785,5.8643 -9.27,9.4133 -12.125,15.6562 -7.5624,9.5248 -21.2509,11.6053 -32.37502,7.8438 -68.9423,-10.9185 -134.9538,26.0771 -203.8687,17.8875 -1.03704,-0.1301 -2.52876,-0.1786 -3.38135,-0.5438 z m 57.21875,142.5937 c 3.19719,4.7141 10.1509,1.2059 14.5313,0.25 25.2349,-7.9562 46.3117,-24.8088 69.6875,-36.6562 6.0021,-4.7061 9.8057,-11.88 15.5937,-16.5938 41.6227,-37.7701 -1.9826,-7.684 -5.5625,-5.3124 -29.3453,20.1735 -64.9496,43.6672 -97.73906,57.7584 -1.34286,0.8054 -3.82736,0.3071 3.48906,0.554 z m 9.4063,-301.12501 c 2.9517,-12.248 14.6204,-19.8059 24.3437,-26.7812 39.1056,-29.0647 83.8706,-49.7174 130.21882,-64.375 3.2991,-1.0193 4.715,-6.4291 0.3125,-6.9062 -16.18632,0.2742 -31.51682,-6.3232 -46.99342,-10.5666 -12.5995,-3.8598 -25.3787,-7.2494 -38.3504,-9.5897 27.409,-12.6065 53.7785,-27.7821 82.71882,-36.4375 32.7958,-7.1278 61.685,-30.0982 96.2761,-28.7116 5.3679,0.8275 12.3279,0.7562 16.2239,4.8991 7.8956,14.8889 6.4045,35.542 -7.25,46.625 -7.6915,6.4993 -16.9127,13.5471 -27.4688,12.4063 -9.652,0.1712 -18.222,5.6054 -27.5312,6.875 -8.5555,-0.693 -17.35,-0.5602 -25.125,3.1874 -4.0604,0.5121 -7.6805,6.1511 -3.625,8.875 8.5829,2.7079 17.498,-1.0547 25.9687,-2.375 11.9587,-2.8614 24.5906,-3.1425 36.1563,-7.4687 9.7775,-1.6041 18.6791,6.8446 22.4687,15.3125 6.1087,13.961 0.2248,29.2948 -6.75,41.7188 -2.3795,5.5312 -5.759,11.0276 -6.4375,17.0624 0.1702,2.4853 2.4385,4.2066 -0.25,6.2813 -11.7217,19.0379 -12.012,42.6672 -20.7812,62.90631 -5.2118,9.3721 -9.6151,21.0713 -21,24.5 -10.3313,3.7163 -21.8936,3.3116 -32.6563,2.8124 -9.9783,-3.0222 -20.357,-0.092 -29.92982,2.6446 -35.8164,2.9172 -71.5321,8.7921 -105.9764,19.168 -5.5724,1.151 -11.8254,-3.0262 -10.3125,-9.1876 1.0407,-16.964 12.1409,-32.1138 24.5,-42.9374 9.6915,-7.7455 22.7962,-7.6486 34,-12.3126 38.2838,-11.55131 76.18492,-24.58571 114.80022,-34.90591 13.9495,-1.8644 28.7272,-2.4934 41.0748,-10.2191 -35.3552,-8.5945 -71.6228,2.3986 -104.94872,13.9152 -28.7153,9.5981 -56.8053,22.0636 -86.7388,26.7411 -14.1843,1.4177 -29.5452,1.0039 -42.375,-5.5313 -2.4954,-1.8552 -4.5825,-4.4913 -4.5625,-7.625 z m 14.3125,-138.8437 c 8.5441,-11.8335 20.724,-20.6674 32.125,-29.7813 17.5733,-11.7737 35.2431,-23.701 51.5312,-37.375 27.6091,-21.7173 56.87452,-44.9657 92.84382,-50.1874 8.2799,-0.6819 18.1361,-4.5114 25.7187,0.1562 0.6018,5.7068 -5.5104,9.6405 -9.125,13.2188 -7.7767,6.6646 -17.6704,9.6781 -27.4504,11.2689 -31.1626,13.7503 -63.29002,25.6753 -93.75472,40.739 -25.7104,15.2293 -42.241,44.5011 -72.0449,52.7421 -0.8944,0.3432 -0.1021,-0.3894 0.1563,-0.7813 z m 52.7187,-17.4687 c 3.0193,-9.8668 13.2023,-14.9101 20.6602,-21.1713 21.6879,-14.6697 47.4261,-21.3365 71.33212,-31.6531 20.6595,-7.6531 40.8523,-16.8161 61.3515,-24.6132 11.2016,-3.9817 24.9102,-1.977 32.4687,7.5626 6.8554,6.9633 8.8591,20.895 -0.7187,26.4062 -10.6085,6.0155 -23.569,3.1361 -35.0216,6.9025 -46.4946,10.3523 -88.02182,39.9818 -136.66592,40.5975 -4.1533,-0.9841 -11.542,0.6773 -13.4063,-4.0312 z"
532- id="path2954-0"
533- inkscape:export-filename="/tmp/logo-128.png"
534- inkscape:export-xdpi="14.678443"
535- inkscape:export-ydpi="14.678443"
536- sodipodi:nodetypes="cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc" />
537- <g
538- id="g2849"
539- style="fill:url(#linearGradient6008);fill-opacity:1"
540- transform="translate(-150.17112,121.46194)"
541- inkscape:export-filename="/tmp/logo-128.png"
542- inkscape:export-xdpi="14.678443"
543- inkscape:export-ydpi="14.678443">
544- <path
545- inkscape:export-ydpi="3.6700001"
546- inkscape:export-xdpi="3.6700001"
547- inkscape:export-filename="/tmp/logo-032.png"
548- id="path3868"
549- d="m 751.5153,497.17405 c 17.69893,-6.31836 33.34273,-17.78203 49.44258,-27.46879 41.77847,-26.65775 79.91951,-58.13179 117.96424,-89.74534 22.33543,-18.07868 46.33334,-33.9813 69.78326,-50.53812 13.69242,-12.24771 22.80862,-28.87287 29.67282,-45.6253 1.0868,-2.76713 1.9446,-8.68847 -2.9879,-7.62245 -20.91596,-2.76027 -41.00913,7.2869 -56.37576,20.77951 -30.06757,24.5948 -59.28835,50.10281 -89.7715,74.1683 -26.57256,21.27378 -51.55771,44.32242 -72.85556,70.80882 -15.53362,17.8901 -31.92782,35.53962 -44.87218,55.24337 z"
550- style="color:#000000;fill:url(#linearGradient6058);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5714916px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
551- <path
552- inkscape:export-ydpi="3.6700001"
553- inkscape:export-xdpi="3.6700001"
554- inkscape:export-filename="/tmp/logo-032.png"
555- id="path3870"
556- d="m 1034.3278,314.8303 c -0.8242,2.82259 1.8606,4.04154 4.0821,2.72294 22.4915,-4.0724 44.6295,-10.01178 67.4155,-12.73348 28.6733,-4.65875 57.5985,-7.64174 86.6587,-8.36446 12.3838,-1.23052 23.3907,-9.6213 27.5312,-21.4375 7.7721,-16.29509 11.7368,-33.9564 16.625,-51.2813 -40.9842,7.8833 -80.6393,21.2579 -120.6304,33.1931 -21.1775,6.87837 -42.8904,13.17396 -62.8383,22.9632 -10.5604,8.21665 -17.4111,21.77589 -18.8438,34.9375 z"
557- style="color:#000000;fill:url(#linearGradient6060);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5714916px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
558- <path
559- inkscape:export-ydpi="3.6700001"
560- inkscape:export-xdpi="3.6700001"
561- inkscape:export-filename="/tmp/logo-032.png"
562- id="path3872"
563- d="m 1010.4841,241.7365 c 2.7299,7.5449 12.9126,6.0789 19.2812,6.75 23.645,1.3696 46.959,-3.7725 68.9039,-12.1499 40.1691,-13.3391 80.6429,-29.1157 123.4393,-30.2224 6.8529,-0.018 14.1356,2.1048 20.1256,4.1223 2.7818,-19.6549 18.6428,-37.5156 13.7187,-58.0937 -2.5753,-8.0356 -10.5676,-17.5414 -19.9215,-13.5366 -19.5187,4.0775 -39.4969,10.0049 -59.6722,8.5366 -7.4896,-2.379 -7.6262,-13.7129 -0.8125,-17.0937 10.2229,-7.3346 23.8336,-3.6568 35.2416,-7.865 17.0353,-3.4328 36.3697,-5.7644 48.0905,-20.0922 5.9064,-5.2267 8.5227,-13.0552 6.8397,-20.7898 -0.8638,-5.0648 -1.052,-12.2468 -5.8593,-15.0968 -13.9783,-3.9036 -28.2236,1.8636 -41.5744,5.7518 -42.8206,14.9781 -86.6413,28.8819 -126.7694,50.1544 20.8599,6.66 42.0557,13.0973 63.7813,15.7188 6.3248,-0.7897 12.6531,6.9676 8,12.375 -8.9446,9.5023 -22.4632,12.6004 -34.1089,17.9254 -40.9989,16.594 -81.55,36.2927 -114.4536,66.0434 -1.9051,2.0556 -4.3166,4.5708 -4.25,7.5624 z"
564- style="color:#000000;fill:url(#linearGradient6062);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5714916px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
565- <path
566- inkscape:export-ydpi="3.6700001"
567- inkscape:export-xdpi="3.6700001"
568- inkscape:export-filename="/tmp/logo-032.png"
569- id="path3874"
570- d="m 1078.2028,83.8615 c 9.7606,2.0056 19.9758,-1.5761 29.5664,-3.2636 43.7739,-10.6641 84.5036,-32.3146 129.3274,-39.0896 6.8114,-1.3313 17.4675,-3.37 18.1062,-11.9905 -1.8948,-9.2869 -11.162,-18.7048 -21.2812,-15.125 -27.4665,5.8492 -53.0859,18.4371 -79.453,28.2371 -25.9088,10.6151 -54.1446,19.6642 -74.922,39.0129 -0.5127,0.6108 -1.2825,1.4717 -1.3438,2.2187 z"
571- style="color:#000000;fill:url(#linearGradient6064);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5714916px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
572- <path
573- inkscape:export-ydpi="3.6700001"
574- inkscape:export-xdpi="3.6700001"
575- inkscape:export-filename="/tmp/logo-032.png"
576- id="path3876"
577- d="m 849.79655,348.54905 c 33.18847,-20.32789 61.55413,-47.43615 91.04447,-72.53054 27.47122,-23.95071 52.43983,-50.92671 79.80918,-75.12481 24.619,-20.9604 52.942,-37.319 82.9901,-49.0322 -23.4457,-7.7886 -51.4112,-9.8383 -72.7187,4.5626 -22.1313,14.8065 -40.52244,34.4232 -60.0313,52.25 -34.20639,32.9553 -68.27857,66.42473 -108.10272,92.61277 -5.03998,3.79168 -10.64071,8.04337 -10.17853,15.07468 -1.66479,10.59903 -2.59569,21.52239 -2.8125,32.1875 z"
578- style="color:#000000;fill:url(#linearGradient6056);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5714916px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
579- <path
580- inkscape:export-ydpi="3.6700001"
581- inkscape:export-xdpi="3.6700001"
582- inkscape:export-filename="/tmp/logo-032.png"
583- id="path3878"
584- d="m 880.79655,249.0803 c 3.70944,2.6491 5.42578,-3.8587 8.46372,-4.8806 49.1354,-43.2121 96.18552,-89.1557 150.03633,-126.3694 8.2196,-4.4245 2.4483,-2.7556 -2.875,-1.2188 -23.4068,6.1207 -44.84905,17.9551 -62.21384,34.865 -30.48618,27.547 -58.82169,58.226 -86.9294,88.2445 -2.43147,2.8587 -4.92227,6.1091 -6.48181,9.3593 z"
585- style="color:#000000;fill:url(#linearGradient6066);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5714916px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
586- <path
587- inkscape:export-ydpi="3.6700001"
588- inkscape:export-xdpi="3.6700001"
589- inkscape:export-filename="/tmp/logo-032.png"
590- id="path3880"
591- d="m 1116.8591,32.7678 c 25.5849,-10.6526 50.8528,-22.3941 77.1875,-30.9375 6.4567,-2.8411 12.3915,-6.9044 17.375,-11.9062 -26.2064,2.2628 -52.2545,11.1884 -73.4374,26.9338 -7.9209,5.3916 -15.7255,10.9339 -23.3126,16.7849 0.7291,-0.2917 1.4583,-0.5833 2.1875,-0.875 z"
592- style="color:#000000;fill:url(#linearGradient6068);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5714916px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
593- <path
594- inkscape:export-ydpi="3.6700001"
595- inkscape:export-xdpi="3.6700001"
596- inkscape:export-filename="/tmp/logo-032.png"
597- id="path3882"
598- d="m 597.3903,619.2678 c 17.65974,-12.46149 32.37459,-28.36781 48.50776,-42.76193 27.08538,-25.03567 53.04471,-51.78802 72.07475,-83.69741 24.50069,-37.49877 55.40161,-70.38209 81.15189,-106.89226 11.19732,-17.84724 23.52019,-37.4766 22.98435,-59.3984 -0.45947,-2.40059 -0.5313,-7.9048 -3.59375,-7.8125 -13.52759,9.05859 -23.97477,22.21914 -34.97831,34.12572 -50.89369,60.70315 -96.7254,125.89297 -140.61544,191.90553 -15.42799,24.34711 -32.29232,47.93877 -45.5,73.5625 0.11509,0.18032 -1.36931,2.24562 -0.0312,0.96875 z"
599- style="color:#000000;fill:url(#linearGradient6070);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5714916px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
600- <path
601- inkscape:export-ydpi="3.6700001"
602- inkscape:export-xdpi="3.6700001"
603- inkscape:export-filename="/tmp/logo-032.png"
604- id="path3884"
605- d="m 594.60905,704.67405 c 35.79971,-15.10364 69.49489,-35.20685 105.60325,-49.89906 62.87779,-27.77589 127.74792,-51.05409 192.48146,-73.76268 8.65637,-3.67732 18.53461,-5.83279 25.79029,-11.93201 2.90495,-4.39214 -3.18454,-8.16016 -5.5,-11.28125 -13.71313,-11.37597 -33.26412,-11.46964 -50.0625,-9.125 -36.09904,7.54143 -66.81978,29.3842 -98.83699,46.58989 -51.72783,29.60232 -103.33553,59.70033 -153.88106,91.40029 -6.55309,4.57905 -13.25888,10.55884 -15.59445,18.00982 z"
606- style="color:#000000;fill:url(#linearGradient6072);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5714916px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
607- <path
608- inkscape:export-ydpi="3.6700001"
609- inkscape:export-xdpi="3.6700001"
610- inkscape:export-filename="/tmp/logo-032.png"
611- id="path3888"
612- d="m 645.54655,715.67405 c 35.72193,-10.42551 70.78021,-23.23122 102.96875,-41.78125 10.91159,-6.01259 21.75038,-12.14494 32.3125,-18.75 -47.41496,18.3869 -93.51136,39.66925 -139.3125,61.75 1.34375,-0.40625 2.6875,-0.8125 4.03125,-1.21875 z"
613- style="color:#000000;fill:url(#linearGradient6074);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5714916px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
614- <path
615- inkscape:export-ydpi="3.6700001"
616- inkscape:export-xdpi="3.6700001"
617- inkscape:export-filename="/tmp/logo-032.png"
618- id="path3890"
619- d="m 632.5153,634.2053 c 60.14394,-30.74655 115.66832,-70.8232 177.96875,-97.28125 14.26222,-5.97556 29.35043,-9.39673 44.5,-12.09375 18.95443,-6.17109 28.4865,-25.97596 41.50355,-39.75144 13.57652,-16.00862 34.00127,-23.62201 54.01318,-28.20348 6.19162,-1.89798 15.7533,-3.68127 15.51452,-12.01383 2.08663,-10.98591 -4.02012,-24.31983 -15.59375,-26.53125 -16.90374,0.27667 -33.58361,4.49058 -47.6875,13.9375 -22.9606,15.48193 -41.79786,35.95315 -65.1477,51.00862 -35.74563,24.86524 -75.16047,43.70949 -112.7273,65.52263 -28.46057,18.88652 -49.92871,46.12416 -75.56336,68.41906 -7.01077,6.41829 -14.12156,12.70109 -21.06164,19.17469 1.42708,-0.72917 2.85417,-1.45833 4.28125,-2.1875 z"
620- style="color:#000000;fill:url(#linearGradient6076);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5714916px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
621- <path
622- inkscape:export-ydpi="3.6700001"
623- inkscape:export-xdpi="3.6700001"
624- inkscape:export-filename="/tmp/logo-032.png"
625- id="path3892"
626- d="m 899.79655,525.6428 c 3.51089,7.82332 13.2238,9.26496 20.09375,13 10.79867,2.80411 21.65609,5.63079 30.90625,12.09375 5.11243,4.54553 10.33545,-1.21207 15.35186,-3.0042 39.48479,-19.22194 79.01709,-39.09854 114.46069,-65.33955 -27.154,-1.42919 -54.6501,1.25915 -81.5938,-2.71875 -6.84472,-1.83715 -14.6702,-8.46744 -12.6875,-16.09375 4.38512,-5.41078 12.4788,-2.62909 18.4944,-4.24386 30.8382,-2.55598 62.2768,-0.71955 92.6251,-7.11835 21.4753,-5.9014 40.2441,-22.70775 47.068,-43.95029 -0.5436,-4.58705 -5.3064,-7.60544 -8.7187,-10.1875 -5.8774,-2.94298 -12.1394,1.78838 -18.2813,1.625 -36.7565,6.15401 -74.7601,7.77894 -110.3125,19.03125 -9.7045,3.55183 -17.78411,12.04656 -18.71875,22.5625 -2.37586,11.56234 -0.38446,26.01529 -9.9375,34.71875 -9.86563,7.03084 -22.96979,1.75056 -33.54415,6.93604 -18.46505,6.38579 -36.58846,18.72192 -44.4246,37.22021 -0.50221,1.79331 -1.02655,3.61709 -0.78125,5.46875 z"
627- style="color:#000000;fill:url(#linearGradient6078);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5714916px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
628- <path
629- inkscape:export-ydpi="3.6700001"
630- inkscape:export-xdpi="3.6700001"
631- inkscape:export-filename="/tmp/logo-032.png"
632- id="path3894"
633- d="m 945.4528,396.54905 c 22.4751,1.38692 44.82133,-2.89278 66.9854,-5.76396 34.7809,-6.04143 69.5064,-13.86385 105.0146,-12.99513 16.1655,-0.39189 33.1503,2.07772 48.6563,-2.86591 10.8635,-5.891 16.1867,-17.84527 23.1562,-27.53125 4.4328,-8.52492 -0.6092,-18.27302 -7.4687,-23.59375 -7.9505,-7.64738 -19.8734,-6.25667 -29.888,-4.38602 -42.6818,6.87561 -84.727,17.60627 -126.112,29.91727 -22.1097,6.70955 -43.24672,16.65481 -61.80645,30.65386 -6.62998,4.90758 -13.30481,10.50103 -18.53735,16.56489 z"
634- style="color:#000000;fill:url(#linearGradient6080);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5714916px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
635- </g>
636- <path
637- transform="translate(33.252667,-741.24731)"
638- sodipodi:type="arc"
639- style="color:#000000;fill:url(#linearGradient5931);fill-opacity:1.0;fill-rule:nonzero;stroke:#967b71;stroke-width:1.50000000000000000;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
640- id="path5313"
641- sodipodi:cx="464.28571"
642- sodipodi:cy="549.50507"
643- sodipodi:rx="230"
644- sodipodi:ry="225.71428"
645- d="m 694.28571,549.50507 a 230,225.71428 0 1 1 -460,0 230,225.71428 0 1 1 460,0 z" />
646- </g>
647-=======
648 <g
649 inkscape:label="Capa 1"
650 inkscape:groupmode="layer"
651@@ -1237,5 +627,4 @@
652 sodipodi:ry="225.71428"
653 d="m 694.28571,549.50507 c 0,124.65855 -102.97451,225.71428 -230,225.71428 -127.0255,0 -230,-101.05573 -230,-225.71428 0,-124.65856 102.9745,-225.71428 230,-225.71428 127.02549,0 230,101.05572 230,225.71428 z" />
654 </g>
655->>>>>>> MERGE-SOURCE
656 </svg>
657
658=== removed file 'data/media/ubuntuone.png'
659Binary files data/media/ubuntuone.png 2010-04-25 16:57:37 +0000 and data/media/ubuntuone.png 1970-01-01 00:00:00 +0000 differ
660=== modified file 'data/ui/gui.glade'
661--- data/ui/gui.glade 2010-05-17 16:12:33 +0000
662+++ data/ui/gui.glade 2010-05-17 16:12:34 +0000
663@@ -2,12 +2,35 @@
664 <interface>
665 <requires lib="gtk+" version="2.16"/>
666 <!-- interface-naming-policy project-wide -->
667- <object class="GtkListStore" id="liststore1"/>
668- <object class="GtkListStore" id="liststore2"/>
669+ <object class="GtkListStore" id="metaq_store">
670+ <columns>
671+ <!-- column-name operation -->
672+ <column type="gchararray"/>
673+ <!-- column-name path -->
674+ <column type="gchararray"/>
675+ <!-- column-name node -->
676+ <column type="gchararray"/>
677+ <!-- column-name share -->
678+ <column type="gchararray"/>
679+ </columns>
680+ </object>
681+ <object class="GtkListStore" id="contentq_store">
682+ <columns>
683+ <!-- column-name Operation -->
684+ <column type="gchararray"/>
685+ <!-- column-name Path -->
686+ <column type="gchararray"/>
687+ <!-- column-name Node -->
688+ <column type="gchararray"/>
689+ <!-- column-name Share -->
690+ <column type="gchararray"/>
691+ </columns>
692+ </object>
693 <object class="GtkWindow" id="main_window">
694 <property name="width_request">800</property>
695 <property name="height_request">600</property>
696 <property name="title" translatable="yes">Magicicada</property>
697+ <property name="window_position">center</property>
698 <signal name="destroy" handler="on_main_window_destroy"/>
699 <child>
700 <object class="GtkVBox" id="vbox1">
701@@ -199,70 +222,152 @@
702 <property name="visible">True</property>
703 <property name="can_focus">True</property>
704 <child>
705- <object class="GtkTreeView" id="metaq_view">
706+ <object class="GtkScrolledWindow" id="scrolledwindow1">
707 <property name="visible">True</property>
708 <property name="can_focus">True</property>
709- <property name="model">liststore1</property>
710+ <property name="hscrollbar_policy">automatic</property>
711+ <child>
712+ <object class="GtkTreeView" id="metaq_view">
713+ <property name="visible">True</property>
714+ <property name="sensitive">False</property>
715+ <property name="can_focus">True</property>
716+ <property name="model">metaq_store</property>
717+ <property name="headers_clickable">False</property>
718+ <property name="rules_hint">True</property>
719+ <property name="search_column">0</property>
720+ <property name="enable_grid_lines">both</property>
721+ <property name="enable_tree_lines">True</property>
722+ <child>
723+ <object class="GtkTreeViewColumn" id="metaq_operation">
724+ <property name="resizable">True</property>
725+ <property name="title">Operation</property>
726+ <property name="expand">True</property>
727+ <child>
728+ <object class="GtkCellRendererText" id="cellrenderertext1"/>
729+ <attributes>
730+ <attribute name="text">0</attribute>
731+ </attributes>
732+ </child>
733+ </object>
734+ </child>
735+ <child>
736+ <object class="GtkTreeViewColumn" id="metaq_path">
737+ <property name="title">Path</property>
738+ <property name="expand">True</property>
739+ <child>
740+ <object class="GtkCellRendererText" id="cellrenderertext2"/>
741+ <attributes>
742+ <attribute name="text">1</attribute>
743+ </attributes>
744+ </child>
745+ </object>
746+ </child>
747+ <child>
748+ <object class="GtkTreeViewColumn" id="metaq_node">
749+ <property name="title">Node</property>
750+ <property name="expand">True</property>
751+ <child>
752+ <object class="GtkCellRendererText" id="cellrenderertext3"/>
753+ <attributes>
754+ <attribute name="text">2</attribute>
755+ </attributes>
756+ </child>
757+ </object>
758+ </child>
759+ <child>
760+ <object class="GtkTreeViewColumn" id="metaq_share">
761+ <property name="title">Share</property>
762+ <property name="expand">True</property>
763+ <child>
764+ <object class="GtkCellRendererText" id="cellrenderertext4"/>
765+ <attributes>
766+ <attribute name="text">3</attribute>
767+ </attributes>
768+ </child>
769+ </object>
770+ </child>
771+ </object>
772+ </child>
773 </object>
774 <packing>
775- <property name="resize">True</property>
776+ <property name="resize">False</property>
777 <property name="shrink">True</property>
778 </packing>
779 </child>
780 <child>
781- <object class="GtkTreeView" id="contentq_view">
782+ <object class="GtkScrolledWindow" id="scrolledwindow2">
783 <property name="visible">True</property>
784 <property name="can_focus">True</property>
785- <property name="model">liststore2</property>
786+ <property name="hscrollbar_policy">automatic</property>
787+ <child>
788+ <object class="GtkTreeView" id="contentq_view">
789+ <property name="visible">True</property>
790+ <property name="sensitive">False</property>
791+ <property name="can_focus">True</property>
792+ <property name="model">contentq_store</property>
793+ <property name="headers_clickable">False</property>
794+ <property name="rules_hint">True</property>
795+ <property name="search_column">0</property>
796+ <property name="enable_grid_lines">both</property>
797+ <property name="enable_tree_lines">True</property>
798+ <child>
799+ <object class="GtkTreeViewColumn" id="contentq_operation">
800+ <property name="title">Operation</property>
801+ <property name="expand">True</property>
802+ <child>
803+ <object class="GtkCellRendererText" id="cellrenderertext5"/>
804+ <attributes>
805+ <attribute name="text">0</attribute>
806+ </attributes>
807+ </child>
808+ </object>
809+ </child>
810+ <child>
811+ <object class="GtkTreeViewColumn" id="contentq_path">
812+ <property name="title">Path</property>
813+ <property name="expand">True</property>
814+ <child>
815+ <object class="GtkCellRendererText" id="cellrenderertext6"/>
816+ <attributes>
817+ <attribute name="text">1</attribute>
818+ </attributes>
819+ </child>
820+ </object>
821+ </child>
822+ <child>
823+ <object class="GtkTreeViewColumn" id="contentq_node">
824+ <property name="title">Node</property>
825+ <property name="expand">True</property>
826+ <child>
827+ <object class="GtkCellRendererText" id="cellrenderertext7"/>
828+ <attributes>
829+ <attribute name="text">2</attribute>
830+ </attributes>
831+ </child>
832+ </object>
833+ </child>
834+ <child>
835+ <object class="GtkTreeViewColumn" id="contentq_share">
836+ <property name="title">Share</property>
837+ <property name="expand">True</property>
838+ <child>
839+ <object class="GtkCellRendererText" id="cellrenderertext8"/>
840+ <attributes>
841+ <attribute name="text">3</attribute>
842+ </attributes>
843+ </child>
844+ </object>
845+ </child>
846+ </object>
847+ </child>
848 </object>
849 <packing>
850- <property name="resize">True</property>
851+ <property name="resize">False</property>
852 <property name="shrink">True</property>
853 </packing>
854 </child>
855 </object>
856 <packing>
857-<<<<<<< TREE
858- <property name="position">3</property>
859- </packing>
860- </child>
861- </object>
862- </child>
863- </object>
864- <object class="GtkStatusIcon" id="status_icon">
865- <property name="has_tooltip">True</property>
866- <property name="tooltip_text">Magicicada</property>
867- <property name="title">Magicicada</property>
868- </object>
869- <object class="GtkAboutDialog" id="about_dialog">
870- <property name="border_width">5</property>
871- <property name="type_hint">normal</property>
872- <property name="has_separator">False</property>
873- <property name="program_name">Magicicada</property>
874- <property name="copyright" translatable="yes">Copyright 2010 Natalia Bidart &lt;natalia.bidart@gmail.com&gt;
875-Copyright 2010 Facundo Batista &lt;facundo.batista@gmail.com&gt;
876-</property>
877- <property name="website">http://launchpad.net/magicicada</property>
878- <property name="license" translatable="yes">GPL v3.0</property>
879- <property name="authors">Natalia Bidart &lt;natalia.bidart@gmail.com&gt;
880-Facundo Batista &lt;facundo.batista@gmail.com&gt;</property>
881- <child internal-child="vbox">
882- <object class="GtkVBox" id="dialog-vbox1">
883- <property name="visible">True</property>
884- <property name="spacing">2</property>
885- <child>
886- <placeholder/>
887- </child>
888- <child internal-child="action_area">
889- <object class="GtkHButtonBox" id="dialog-action_area1">
890- <property name="visible">True</property>
891- <property name="layout_style">end</property>
892- </object>
893- <packing>
894- <property name="expand">False</property>
895- <property name="pack_type">end</property>
896- <property name="position">0</property>
897-=======
898 <property name="position">3</property>
899 </packing>
900 </child>
901@@ -303,7 +408,6 @@
902 <property name="expand">False</property>
903 <property name="pack_type">end</property>
904 <property name="position">0</property>
905->>>>>>> MERGE-SOURCE
906 </packing>
907 </child>
908 </object>
909
910=== modified file 'magicicada/__init__.py'
911--- magicicada/__init__.py 2010-05-17 16:12:33 +0000
912+++ magicicada/__init__.py 2010-05-17 16:12:34 +0000
913@@ -1,294 +1,89 @@
914-<<<<<<< TREE
915-# __init__.py
916-#
917-# Author: Natalia Bidart <natalia.bidart@gmail.com>
918-#
919-# Copyright 2010 Chicharreros
920-#
921-# This program is free software: you can redistribute it and/or modify it
922-# under the terms of the GNU General Public License version 3, as published
923-# by the Free Software Foundation.
924-#
925-# This program is distributed in the hope that it will be useful, but
926-# WITHOUT ANY WARRANTY; without even the implied warranties of
927-# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
928-# PURPOSE. See the GNU General Public License for more details.
929-#
930-# You should have received a copy of the GNU General Public License along
931-# with this program. If not, see <http://www.gnu.org/licenses/>.
932-
933-"""Magicicada."""
934-
935-import gtk
936-
937-import gettext
938-from gettext import gettext as _
939-gettext.textdomain('magicicada')
940-
941-from twisted.internet import gtk2reactor # for gtk-2.0
942-gtk2reactor.install()
943-
944-from twisted.internet import reactor
945-
946-from magicicada.helpers import get_data_file, get_builder, print_debug
947-from magicicada.syncdaemon import SyncDaemon
948-
949-
950-class MagicicadaUI(object):
951-
952- STATUS = {
953- 'started': _('Service started, click Connect to continue.'),
954- 'connected': _('Service connected. Doing internal synchronization...'),
955- 'online': _('Service reached Nirvana.'),
956- }
957-
958- def __init__(self, launchpad_available=False):
959- """Init."""
960- self.builder = get_builder('gui.glade')
961- self.builder.connect_signals(self)
962-
963- if launchpad_available:
964- # for more information about LaunchpadIntegration:
965- # wiki.ubuntu.com/UbuntuDevelopment/Internationalisation/Coding
966- helpmenu = self.builder.get_object('helpMenu')
967- if helpmenu:
968- LaunchpadIntegration.set_sourcepackagename('magicicada')
969- LaunchpadIntegration.add_items(helpmenu, 0, False, True)
970-
971- animation_filename = get_data_file('media', 'loader-ball.gif')
972- self.loading_animation = gtk.gdk.PixbufAnimation(animation_filename)
973-
974- self.started = self.connected = self.online = False
975-
976- widgets = (
977- 'start', 'stop', 'connect', 'disconnect', # toolbar buttons
978- 'is_started', 'is_connected', 'is_online', # status bar images
979- 'status_label', 'status_icon', # status label and systray icon
980- 'main_window', 'about_dialog',
981- )
982- for widget in widgets:
983- setattr(self, widget, self.builder.get_object(widget))
984-
985- icon_filename = get_data_file('media', 'ubuntuone.png')
986- self.status_icon.set_from_file(icon_filename)
987-
988- self.main_window.set_icon_from_file(icon_filename)
989- self.main_window.show()
990-
991- self.syncdaemon = SyncDaemon()
992-
993- def run(self):
994- """Do the deed."""
995- reactor.run() # instead of: gtk.main()
996-
997- def shutdown(self):
998- """Stop the deed."""
999- reactor.stop() # instead of: gtk.main_quit()
1000-
1001- # GTK callbacks
1002-
1003- def on_main_window_destroy(self, widget, data=None):
1004- """Called when the MagicicadaWindow is closed."""
1005- # Clean up code for saving application state should be added here.
1006- if self.started:
1007- self.on_stop_clicked(self.stop)
1008- self.syncdaemon.shutdown()
1009-
1010- def on_quit_activate(self, widget, data=None):
1011- """Signal handler for closing the program."""
1012- self.on_main_window_destroy(self.main_window)
1013-
1014- def on_about_activate(self, widget, data=None):
1015- """Display the about box."""
1016- response = self.about_dialog.run()
1017- self.about_dialog.hide()
1018-
1019- @print_debug
1020- def on_start_clicked(self, widget, data=None):
1021- """Start syncdaemon."""
1022- self.started = True
1023- self.connect.set_sensitive(True)
1024- self.start.hide()
1025- self.stop.show()
1026-
1027- self.doing_something(self.is_started)
1028-
1029- @print_debug
1030- def on_stop_clicked(self, widget, data=None):
1031- """Stop syncdaemon."""
1032- assert self.started
1033-
1034- if self.connected:
1035- self.on_disconnect_clicked(self.disconnect)
1036- self.connect.set_sensitive(False)
1037-
1038- self.started = False
1039- self.start.show()
1040- self.stop.hide()
1041-
1042- self.on_stopped()
1043-
1044- @print_debug
1045- def on_connect_clicked(self, widget, data=None):
1046- """Connect syncdaemon."""
1047- assert self.started
1048- self.connected = True
1049- self.connect.hide()
1050- self.disconnect.show()
1051-
1052- self.on_started()
1053- self.doing_something(self.is_connected)
1054-
1055- @print_debug
1056- def on_disconnect_clicked(self, widget, data=None):
1057- """Disconnect syncdaemon."""
1058- assert self.started
1059- assert self.connected
1060- self.connected = False
1061- self.connect.show()
1062- self.disconnect.hide()
1063-
1064- self.on_disconnected()
1065-
1066- # DBus callbacks
1067-
1068- def on_started(self, *args, **kwargs):
1069- """Callback'ed when syncadaemon is started."""
1070- self.stop_doing_something(self.is_started)
1071- self.status_label.set_text(self.STATUS['started'])
1072-
1073- def on_stopped(self, *args, **kwargs):
1074- """Callback'ed when syncadaemon is stopped."""
1075-
1076- self.stop_doing_something(self.is_started, sensitive=False)
1077-
1078- self.is_started.set_sensitive(False)
1079- self.is_connected.set_sensitive(False)
1080- self.is_online.set_sensitive(False)
1081-
1082- def on_connected(self, *args, **kwargs):
1083- """Callback'ed when syncadaemon is connected."""
1084- self.is_connected.set_sensitive(True)
1085- self.doing_something(self.is_online)
1086- self.status_label.set_text(self.STATUS['connected'])
1087-
1088- def on_disconnected(self, *args, **kwargs):
1089- """Callback'ed when syncadaemon is disconnected."""
1090-
1091- self.stop_doing_something(self.is_connected, sensitive=False)
1092-
1093- self.is_connected.set_sensitive(False)
1094- self.is_online.set_sensitive(False)
1095-
1096- def on_online(self, *args, **kwargs):
1097- """Callback'ed when syncadaemon is online."""
1098- self.is_onlined.set_sensitive(True)
1099- self.status_label.set_text(self.STATUS['online'])
1100-
1101- def on_offline(self, *args, **kwargs):
1102- """Callback'ed when syncadaemon is offline."""
1103-
1104- self.stop_doing_something(self.is_online, sensitive=False)
1105-
1106- self.is_online.set_sensitive(False)
1107-
1108- # custom
1109-
1110- def doing_something(self, what):
1111- """Set a loader animation on 'what'."""
1112- what.set_sensitive(True)
1113- what.set_from_animation(self.loading_animation)
1114-
1115- def stop_doing_something(self, what, sensitive=True):
1116- """Set a loader animation on 'what'."""
1117- what.set_from_stock(gtk.STOCK_YES, gtk.ICON_SIZE_BUTTON)
1118- what.set_sensitive(sensitive)
1119-=======
1120-# __init__.py
1121-#
1122-# Author: Natalia Bidart <natalia.bidart@gmail.com>
1123-#
1124-# Copyright 2010 Chicharreros
1125-#
1126-# This program is free software: you can redistribute it and/or modify it
1127-# under the terms of the GNU General Public License version 3, as published
1128-# by the Free Software Foundation.
1129-#
1130-# This program is distributed in the hope that it will be useful, but
1131-# WITHOUT ANY WARRANTY; without even the implied warranties of
1132-# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
1133-# PURPOSE. See the GNU General Public License for more details.
1134-#
1135-# You should have received a copy of the GNU General Public License along
1136-# with this program. If not, see <http://www.gnu.org/licenses/>.
1137-
1138-"""Magicicada."""
1139-
1140-import gtk
1141-
1142-import gettext
1143-from gettext import gettext as _
1144-gettext.textdomain('magicicada')
1145-
1146-from twisted.internet import gtk2reactor # for gtk-2.0
1147-gtk2reactor.install()
1148-
1149-from twisted.internet import reactor
1150-
1151-from magicicada.helpers import get_data_file, get_builder, print_debug
1152-from magicicada.syncdaemon import SyncDaemon
1153-
1154-
1155-class MagicicadaUI(object):
1156-
1157- STATUS = {
1158- 'started': _('Service started, click Connect to continue.'),
1159- 'connected': _('Service connected. Doing internal synchronization...'),
1160- 'online': _('Service reached Nirvana.'),
1161- }
1162-
1163- def __init__(self, launchpad_available=False):
1164- """Init."""
1165- self.builder = get_builder('gui.glade')
1166- self.builder.connect_signals(self)
1167-
1168- if launchpad_available:
1169- # for more information about LaunchpadIntegration:
1170- # wiki.ubuntu.com/UbuntuDevelopment/Internationalisation/Coding
1171- helpmenu = self.builder.get_object('helpMenu')
1172- if helpmenu:
1173- LaunchpadIntegration.set_sourcepackagename('magicicada')
1174- LaunchpadIntegration.add_items(helpmenu, 0, False, True)
1175-
1176- animation_filename = get_data_file('media', 'loader-ball.gif')
1177- self.loading_animation = gtk.gdk.PixbufAnimation(animation_filename)
1178-
1179- self.started = self.connected = self.online = False
1180-
1181- widgets = (
1182- 'start', 'stop', 'connect', 'disconnect', # toolbar buttons
1183- 'is_started', 'is_connected', 'is_online', # status bar images
1184- 'status_label', 'status_icon', # status label and systray icon
1185- 'main_window', 'about_dialog',
1186- )
1187- for widget in widgets:
1188- setattr(self, widget, self.builder.get_object(widget))
1189+# __init__.py
1190+#
1191+# Author: Natalia Bidart <natalia.bidart@gmail.com>
1192+#
1193+# Copyright 2010 Chicharreros
1194+#
1195+# This program is free software: you can redistribute it and/or modify it
1196+# under the terms of the GNU General Public License version 3, as published
1197+# by the Free Software Foundation.
1198+#
1199+# This program is distributed in the hope that it will be useful, but
1200+# WITHOUT ANY WARRANTY; without even the implied warranties of
1201+# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
1202+# PURPOSE. See the GNU General Public License for more details.
1203+#
1204+# You should have received a copy of the GNU General Public License along
1205+# with this program. If not, see <http://www.gnu.org/licenses/>.
1206+
1207+"""Magicicada."""
1208+
1209+import gtk
1210+import sys
1211+
1212+import gettext
1213+from gettext import gettext as _
1214+gettext.textdomain('magicicada')
1215+
1216+from twisted.internet import gtk2reactor # for gtk-2.0
1217+gtk2reactor.install()
1218+
1219+from magicicada.helpers import get_data_file, get_builder, NO_OP
1220+from magicicada.syncdaemon import SyncDaemon
1221+
1222+CONTENT_QUEUE = 'content'
1223+META_QUEUE = 'meta'
1224+
1225+class MagicicadaUI(object):
1226+
1227+ STATUS = {
1228+ 'started': _('Service started, click Connect to continue.'),
1229+ 'connected': _('Service connected. Doing internal synchronization...'),
1230+ 'online': _('Service reached Nirvana.'),
1231+ }
1232+
1233+ def __init__(self, launchpad_available=False, on_destroy=NO_OP):
1234+ """Init."""
1235+ self.builder = get_builder('gui.glade')
1236+ self.builder.connect_signals(self)
1237+
1238+ if launchpad_available:
1239+ # for more information about LaunchpadIntegration:
1240+ # wiki.ubuntu.com/UbuntuDevelopment/Internationalisation/Coding
1241+ helpmenu = self.builder.get_object('helpMenu')
1242+ if helpmenu:
1243+ LaunchpadIntegration.set_sourcepackagename('magicicada')
1244+ LaunchpadIntegration.add_items(helpmenu, 0, False, True)
1245+
1246+ self.on_destroy = on_destroy
1247+
1248+ animation_filename = get_data_file('media', 'loader-ball.gif')
1249+ self.loading_animation = gtk.gdk.PixbufAnimation(animation_filename)
1250+
1251+ self.started = self.connected = self.online = False
1252+
1253+ widgets = (
1254+ 'start', 'stop', 'connect', 'disconnect', # toolbar buttons
1255+ 'is_started', 'is_connected', 'is_online', # status bar images
1256+ 'status_label', 'status_icon', # status label and systray icon
1257+ 'metaq_view', 'contentq_view', # queues tree views
1258+ 'metaq_store', 'contentq_store', # queues list stores
1259+ 'main_window', 'about_dialog',
1260+ )
1261+ for widget in widgets:
1262+ obj = self.builder.get_object(widget)
1263+ setattr(self, widget, obj)
1264+ assert obj is not None, '%s must not be None' % widget
1265
1266 icon_filename = get_data_file('media', 'logo-016.png')
1267 self.status_icon.set_from_file(icon_filename)
1268-
1269 self.main_window.set_icon_from_file(icon_filename)
1270+
1271 self.main_window.show()
1272
1273- self.syncdaemon = SyncDaemon()
1274-
1275- def run(self):
1276- """Do the deed."""
1277- reactor.run() # instead of: gtk.main()
1278-
1279- def shutdown(self):
1280- """Stop the deed."""
1281- reactor.stop() # instead of: gtk.main_quit()
1282+ self.sd = SyncDaemon()
1283+ self.sd.content_queue_changed_callback = self.on_content_queue_changed
1284+ self.sd.meta_queue_changed_callback = self.on_meta_queue_changed
1285
1286 # GTK callbacks
1287
1288@@ -297,8 +92,8 @@
1289 # Clean up code for saving application state should be added here.
1290 if self.started:
1291 self.on_stop_clicked(self.stop)
1292- self.syncdaemon.shutdown()
1293- self.shutdown()
1294+ self.sd.shutdown()
1295+ self.on_destroy()
1296
1297 def on_quit_activate(self, widget, data=None):
1298 """Signal handler for closing the program."""
1299@@ -352,7 +147,6 @@
1300
1301 self.on_disconnected()
1302
1303- @print_debug
1304 def on_status_icon_activate(self, widget, data=None):
1305 """Systray icon was clicked."""
1306 if self.main_window.get_property('visible'):
1307@@ -402,6 +196,26 @@
1308
1309 self.is_online.set_sensitive(False)
1310
1311+ def _on_queue_changed(self, queue_name, items, *args, **kwargs):
1312+ """Callback'ed when a queue changed."""
1313+ queue_view = getattr(self, '%sq_view' % queue_name)
1314+ queue_store = getattr(self, '%sq_store' % queue_name)
1315+ queue_store.clear()
1316+ for item in items:
1317+ row = (item.operation, item.path, item.node, item.share)
1318+ queue_store.append(row)
1319+
1320+ if not queue_view.is_sensitive():
1321+ queue_view.set_sensitive(True)
1322+
1323+ def on_content_queue_changed(self, items, *args, **kwargs):
1324+ """Callback'ed when syncadaemon's content queue changed."""
1325+ self._on_queue_changed(CONTENT_QUEUE, items, args, kwargs)
1326+
1327+ def on_meta_queue_changed(self, items, *args, **kwargs):
1328+ """Callback'ed when syncadaemon's meta queue changed."""
1329+ self._on_queue_changed(META_QUEUE, items, args, kwargs)
1330+
1331 # custom
1332
1333 def doing_something(self, what):
1334@@ -413,4 +227,3 @@
1335 """Set a loader animation on 'what'."""
1336 what.set_from_stock(gtk.STOCK_YES, gtk.ICON_SIZE_BUTTON)
1337 what.set_sensitive(sensitive)
1338->>>>>>> MERGE-SOURCE
1339
1340=== modified file 'magicicada/helpers.py'
1341--- magicicada/helpers.py 2010-05-17 16:12:33 +0000
1342+++ magicicada/helpers.py 2010-05-17 16:12:34 +0000
1343@@ -15,14 +15,14 @@
1344
1345 from functools import wraps
1346
1347-from functools import wraps
1348-
1349 from magicicada.magicicadaconfig import get_data_file
1350
1351 import gettext
1352 from gettext import gettext as _
1353 gettext.textdomain('magicicada')
1354
1355+NO_OP = lambda *a, **kw: None
1356+
1357 def get_builder(builder_file_name):
1358 """Return a fully-instantiated gtk.Builder instance from specified ui file.
1359
1360@@ -38,19 +38,6 @@
1361 builder.set_translation_domain('magicicada')
1362 builder.add_from_file(ui_filename)
1363 return builder
1364-<<<<<<< TREE
1365-
1366-def print_debug(f):
1367- """Print debug info for 'f'."""
1368-
1369- @wraps(f)
1370- def inner(*args, **kwargs):
1371- """Wrap f."""
1372- print('Calling', f.__name__, args, kwargs)
1373- f(*args, **kwargs)
1374-
1375- return inner
1376-=======
1377
1378 def print_debug(f):
1379 """Print debug info for 'f'."""
1380@@ -63,4 +50,3 @@
1381 return result
1382
1383 return inner
1384->>>>>>> MERGE-SOURCE
1385
1386=== modified file 'magicicada/syncdaemon.py'
1387--- magicicada/syncdaemon.py 2010-05-09 19:49:43 +0000
1388+++ magicicada/syncdaemon.py 2010-05-17 16:12:34 +0000
1389@@ -18,15 +18,6 @@
1390
1391 """The backend that communicates Magicicada with the SyncDaemon."""
1392
1393-import sys
1394-
1395-try:
1396- from twisted.internet import glib2reactor
1397- glib2reactor.install()
1398-except AssertionError, e:
1399- msg = '\nsyncdaemon.py: Not installing glib2reactor because: %s.\n'
1400- sys.stderr.write(msg % e)
1401-
1402 import collections
1403 import re
1404
1405@@ -36,6 +27,8 @@
1406
1407 from ubuntuone.syncdaemon import tools
1408
1409+from magicicada.helpers import NO_OP
1410+
1411
1412 # structures that hold content and queue information
1413 QueueData = collections.namedtuple('QueueData', 'operation path share node')
1414@@ -73,9 +66,9 @@
1415 self._dbus_matches.append((match, dbus_interface, signal_name))
1416
1417 # callbacks for GUI to hook in
1418- self.status_changed_callback = lambda *a, **k: None
1419- self.content_queue_changed_callback = lambda *a, **k: None
1420- self.meta_queue_changed_callback = lambda *a, **k: None
1421+ self.status_changed_callback = NO_OP
1422+ self.content_queue_changed_callback = NO_OP
1423+ self.meta_queue_changed_callback = NO_OP
1424
1425 # calls to obtain data from SDT
1426 self._get_content_queue = self.sync_daemon_tool.waiting_content
1427
1428=== modified file 'magicicada/tests/test_magicicada.py'
1429--- magicicada/tests/test_magicicada.py 2010-05-17 16:12:33 +0000
1430+++ magicicada/tests/test_magicicada.py 2010-05-17 16:12:34 +0000
1431@@ -1,240 +1,83 @@
1432-<<<<<<< TREE
1433-# test_magicicada.py
1434-#
1435-# Author: Natalia Bidart <natalia.bidart@gmail.com>
1436-#
1437-# Copyright 2010 Chicharreros
1438-#
1439-# This program is free software: you can redistribute it and/or modify it
1440-# under the terms of the GNU General Public License version 3, as published
1441-# by the Free Software Foundation.
1442-#
1443-# This program is distributed in the hope that it will be useful, but
1444-# WITHOUT ANY WARRANTY; without even the implied warranties of
1445-# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
1446-# PURPOSE. See the GNU General Public License for more details.
1447-#
1448-# You should have received a copy of the GNU General Public License along
1449-# with this program. If not, see <http://www.gnu.org/licenses/>.
1450-
1451-"""Tests for magicicada."""
1452-
1453-import gobject
1454-import gtk
1455-import unittest
1456-
1457-from functools import wraps
1458-
1459-from twisted.internet import reactor
1460-from twisted.trial.unittest import TestCase
1461-
1462-from magicicada import MagicicadaUI
1463-from magicicada.helpers import get_builder
1464-from magicicada.syncdaemon import SyncDaemon
1465-
1466-DEFAULT_TIMEOUT = 200
1467-NO_OP = lambda *a, **kw: None
1468-
1469-def close_window_after(a_test):
1470- """Decorator to close the main window after executing f."""
1471- @wraps(a_test)
1472- def inner(*args, **kwargs):
1473- """Inner function."""
1474- #gobject.timeout_add(DEFAULT_TIMEOUT, a_test)
1475- #self.ui.run()
1476-
1477- return inner
1478-
1479-
1480-class MagicicadaUITestCase(TestCase):
1481- """UI test cases for Magicicada UI."""
1482-
1483- def setUp(self):
1484- """Init."""
1485- self.builder = get_builder('gui.glade')
1486- self.ui = MagicicadaUI()
1487- self._patched = {}
1488- self._called = False
1489-
1490- def tearDown(self):
1491- """Clenaup."""
1492- self.ui.on_main_window_destroy(self.ui.main_window)
1493- for (instance, attr), old_value in self._patched.iteritems():
1494- setattr(instance, attr, old_value)
1495- self._called = False
1496- self.builder = None
1497-
1498- def test_init_creates_sd_instance(self):
1499- """SyncDaemon instance is created at creation time."""
1500- self.assertTrue(isinstance(self.ui.syncdaemon, SyncDaemon))
1501-
1502- def test_destroy_shutdowns_sd_instance(self):
1503- """SyncDaemon instance is shutdown at destroy time."""
1504- self.patch(self.ui.syncdaemon, 'shutdown',
1505- lambda *_: setattr(self, '_called', True))
1506- self.ui.on_main_window_destroy(self.ui.main_window)
1507- self.assertTrue(self._called, 'syncdaemon.shutdown must be called at destroy time.')
1508-
1509- def test_shutdown_stops_reactor(self):
1510- """SyncDaemon instance is shutdown at destroy time."""
1511- self.patch(reactor, 'stop',
1512- lambda *_: setattr(self, '_called', True))
1513- self.ui.shutdown()
1514- self.assertTrue(self._called, 'reactor.stop must be called at destroy time.')
1515-
1516-
1517-class MagicicadaUIStartupTestCase(MagicicadaUITestCase):
1518- """UI test cases for startup state."""
1519-
1520- def test_main_window_is_visible(self):
1521- """UI can be created."""
1522- self.assertTrue(self.ui.main_window.get_property('visible'))
1523-
1524- def test_start_connect_are_visible(self):
1525- """Start and Connect buttons are visible."""
1526- self.assertTrue(self.ui.start.get_property('visible'))
1527- self.assertTrue(self.ui.start.is_sensitive())
1528-
1529- self.assertTrue(self.ui.connect.get_property('visible'))
1530- self.assertFalse(self.ui.connect.is_sensitive())
1531-
1532- def test_stop_disconnect_are_not_visible(self):
1533- """Start and Connect buttons are visible."""
1534- self.assertFalse(self.ui.stop.get_property('visible'))
1535- self.assertFalse(self.ui.disconnect.get_property('visible'))
1536-
1537- def test_not_started_not_connected_not_online(self):
1538- """Test default values for flags."""
1539- self.assertFalse(self.ui.started)
1540- self.assertFalse(self.ui.connected)
1541- self.assertFalse(self.ui.online)
1542-
1543- def test_indicators_are_non_sensitive(self):
1544- """Test default sensitivity for indicators."""
1545- #import pdb; pdb.set_trace()
1546- self.assertFalse(self.ui.is_started.is_sensitive())
1547- self.assertFalse(self.ui.is_connected.is_sensitive())
1548- self.assertFalse(self.ui.is_online.is_sensitive())
1549-
1550-class MagicicadaUIClickedTestCase(MagicicadaUIStartupTestCase):
1551- """UI test cases."""
1552-
1553- def test_started_if_start_clicked(self):
1554- """Test started if Start was clicked."""
1555- self.ui.on_start_clicked(self.ui.start)
1556- self.assertTrue(self.ui.started)
1557- self.assertFalse(self.ui.connected)
1558- self.assertFalse(self.ui.online)
1559-
1560- def test_can_connect_can_stop_if_start_clicked(self):
1561- """Test Connect and Stop are enabled if Start was clicked."""
1562- self.ui.on_start_clicked(self.ui.start)
1563- self.assertFalse(self.ui.start.get_property('visible'))
1564- self.assertTrue(self.ui.stop.get_property('visible'))
1565- self.assertTrue(self.ui.connect.is_sensitive())
1566-
1567- def test_connected_if_connect_clicked(self):
1568- """Test connected if Connect was clicked."""
1569- self.ui.on_start_clicked(self.ui.start) # need to be started
1570- self.ui.on_connect_clicked(self.ui.connect)
1571-
1572- self.assertTrue(self.ui.started)
1573- self.assertTrue(self.ui.connected)
1574- self.assertFalse(self.ui.online)
1575-
1576- def test_can_disconnect_if_connect_clicked(self):
1577- """Test Disconnect is enabled if Connect was clicked."""
1578- self.ui.on_start_clicked(self.ui.start) # need to be started
1579- self.ui.on_connect_clicked(self.ui.connect)
1580- self.assertFalse(self.ui.connect.get_property('visible'))
1581- self.assertTrue(self.ui.disconnect.get_property('visible'))
1582-
1583-=======
1584-# test_magicicada.py
1585-#
1586-# Author: Natalia Bidart <natalia.bidart@gmail.com>
1587-#
1588-# Copyright 2010 Chicharreros
1589-#
1590-# This program is free software: you can redistribute it and/or modify it
1591-# under the terms of the GNU General Public License version 3, as published
1592-# by the Free Software Foundation.
1593-#
1594-# This program is distributed in the hope that it will be useful, but
1595-# WITHOUT ANY WARRANTY; without even the implied warranties of
1596-# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
1597-# PURPOSE. See the GNU General Public License for more details.
1598-#
1599-# You should have received a copy of the GNU General Public License along
1600-# with this program. If not, see <http://www.gnu.org/licenses/>.
1601-
1602-"""Tests for magicicada."""
1603-
1604-import gobject
1605-import gtk
1606-import unittest
1607-
1608-from functools import wraps
1609-
1610-from twisted.internet import reactor
1611-from twisted.trial.unittest import TestCase
1612-
1613-from magicicada import MagicicadaUI
1614-from magicicada.helpers import get_builder
1615-from magicicada.syncdaemon import SyncDaemon
1616-
1617-DEFAULT_TIMEOUT = 200
1618-NO_OP = lambda *a, **kw: None
1619-
1620-def close_window_after(a_test):
1621- """Decorator to close the main window after executing f."""
1622- @wraps(a_test)
1623- def inner(*args, **kwargs):
1624- """Inner function."""
1625- #gobject.timeout_add(DEFAULT_TIMEOUT, a_test)
1626- #self.ui.run()
1627-
1628- return inner
1629-
1630-
1631-class MagicicadaUITestCase(TestCase):
1632- """UI test cases for Magicicada UI."""
1633-
1634- def setUp(self):
1635- """Init."""
1636- self.builder = get_builder('gui.glade')
1637- self.ui = MagicicadaUI()
1638- self._patched = {}
1639- self._called = False
1640-
1641- def tearDown(self):
1642- """Clenaup."""
1643- self.ui.on_main_window_destroy(self.ui.main_window)
1644- for (instance, attr), old_value in self._patched.iteritems():
1645- setattr(instance, attr, old_value)
1646- self._called = False
1647- self.builder = None
1648-
1649- def test_init_creates_sd_instance(self):
1650- """SyncDaemon instance is created at creation time."""
1651- self.assertTrue(isinstance(self.ui.syncdaemon, SyncDaemon))
1652-
1653- def test_destroy_shutdowns_sd_instance(self):
1654- """SyncDaemon instance is shutdown at destroy time."""
1655- self.patch(self.ui.syncdaemon, 'shutdown',
1656+# test_magicicada.py
1657+#
1658+# Author: Natalia Bidart <natalia.bidart@gmail.com>
1659+#
1660+# Copyright 2010 Chicharreros
1661+#
1662+# This program is free software: you can redistribute it and/or modify it
1663+# under the terms of the GNU General Public License version 3, as published
1664+# by the Free Software Foundation.
1665+#
1666+# This program is distributed in the hope that it will be useful, but
1667+# WITHOUT ANY WARRANTY; without even the implied warranties of
1668+# MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
1669+# PURPOSE. See the GNU General Public License for more details.
1670+#
1671+# You should have received a copy of the GNU General Public License along
1672+# with this program. If not, see <http://www.gnu.org/licenses/>.
1673+
1674+"""Tests for magicicada."""
1675+
1676+import gobject
1677+import gtk
1678+import unittest
1679+
1680+from functools import wraps
1681+
1682+from twisted.trial.unittest import TestCase
1683+
1684+from magicicada import MagicicadaUI, CONTENT_QUEUE, META_QUEUE
1685+from magicicada.helpers import get_builder, NO_OP
1686+from magicicada.syncdaemon import SyncDaemon, QueueData
1687+
1688+DEFAULT_TIMEOUT = 200
1689+
1690+def close_window_after(a_test):
1691+ """Decorator to close the main window after executing f."""
1692+ @wraps(a_test)
1693+ def inner(*args, **kwargs):
1694+ """Inner function."""
1695+ #gobject.timeout_add(DEFAULT_TIMEOUT, a_test)
1696+ #self.ui.run()
1697+
1698+ return inner
1699+
1700+
1701+class FakedSyncdaemon(object):
1702+ """A faked syncdaemon."""
1703+
1704+ def __init__(self):
1705+ self.content_queue_changed_callback = NO_OP
1706+ self.meta_queue_changed_callback = NO_OP
1707+
1708+
1709+class MagicicadaUITestCase(TestCase):
1710+ """UI test cases for Magicicada UI."""
1711+
1712+ def setUp(self):
1713+ """Init."""
1714+ self.builder = get_builder('gui.glade')
1715+ self.ui = MagicicadaUI()
1716+ self._called = False
1717+
1718+ def tearDown(self):
1719+ """Clenaup."""
1720+ self.ui.on_main_window_destroy(self.ui.main_window)
1721+ self._called = False
1722+ self.builder = None
1723+
1724+ def test_init_creates_sd_instance(self):
1725+ """SyncDaemon instance is created at creation time."""
1726+ self.assertTrue(isinstance(self.ui.sd, SyncDaemon))
1727+
1728+ def test_destroy_shutdowns_sd_instance(self):
1729+ """SyncDaemon instance is shutdown at destroy time."""
1730+ self.patch(self.ui.sd, 'shutdown',
1731 lambda *_: setattr(self, '_called', True))
1732 self.ui.on_main_window_destroy(self.ui.main_window)
1733 self.assertTrue(self._called,
1734 'syncdaemon.shutdown must be called at destroy time.')
1735
1736- def test_shutdown_stops_reactor(self):
1737- """SyncDaemon instance is shutdown at destroy time."""
1738- self.patch(reactor, 'stop',
1739- lambda *_: setattr(self, '_called', True))
1740- self.ui.shutdown()
1741- self.assertTrue(self._called,
1742- 'reactor.stop must be called at destroy time.')
1743-
1744
1745 class MagicicadaUIStartupTestCase(MagicicadaUITestCase):
1746 """UI test cases for startup state."""
1747@@ -269,6 +112,7 @@
1748 self.assertFalse(self.ui.is_connected.is_sensitive())
1749 self.assertFalse(self.ui.is_online.is_sensitive())
1750
1751+
1752 class MagicicadaUIClickedTestCase(MagicicadaUITestCase):
1753 """UI test cases."""
1754
1755@@ -302,6 +146,7 @@
1756 self.assertFalse(self.ui.connect.get_property('visible'))
1757 self.assertTrue(self.ui.disconnect.get_property('visible'))
1758
1759+
1760 class MagicicadaUISystrayIconTestCase(MagicicadaUITestCase):
1761 """UI test cases for the systray icon."""
1762
1763@@ -317,4 +162,92 @@
1764 self.ui.on_status_icon_activate(self.ui.status_icon) # show
1765 msg = 'main_window should be visible when icon clicked after hidden.'
1766 self.assertTrue(self.ui.main_window.get_property('visible'), msg)
1767->>>>>>> MERGE-SOURCE
1768+
1769+
1770+class _MagicicadaUIQueueTestCase(MagicicadaUITestCase):
1771+ """Abstratc UI test cases for a queue views."""
1772+
1773+ queue = None
1774+
1775+ def setUp(self):
1776+ """Init."""
1777+ super(_MagicicadaUIQueueTestCase, self).setUp()
1778+ self.sd_changed = getattr(self.ui.sd,
1779+ '%s_queue_changed_callback' % self.queue)
1780+ self.ui_changed = getattr(self.ui,
1781+ 'on_%s_queue_changed' % self.queue)
1782+ self.queue_store = getattr(self.ui, '%sq_store' % self.queue)
1783+ self.queue_view = getattr(self.ui, '%sq_view' % self.queue)
1784+
1785+ def build_some_data(self, limit=5):
1786+ """Build some data to pass to queue changed callback."""
1787+ items = []
1788+ for i in xrange(limit):
1789+ cq = QueueData(operation='operation %i' % i, path='path %i' % i,
1790+ node='node %i' % i, share='share %i' % i)
1791+ items.append(cq)
1792+ return items
1793+
1794+ def test_callback_is_connected(self):
1795+ """Queue changed callback is connected."""
1796+ self.assertEqual(self.sd_changed, self.ui_changed,
1797+ '%s queue callback must be set' % self.queue)
1798+
1799+ def test_model_is_binded(self):
1800+ """List store is binded."""
1801+ actual = self.queue_view.get_model()
1802+ msg = 'model for view %s differs from %s'
1803+ self.assertEqual(self.queue_store, actual,
1804+ msg % (self.queue, self.queue_store))
1805+
1806+ def test_on_queue_changed_updates_view(self):
1807+ """On queue changed the view is updated."""
1808+ items = self.build_some_data()
1809+ self.sd_changed(items)
1810+
1811+ self.assertEqual(len(self.queue_store), len(items))
1812+
1813+ # assert rows content equal to items content
1814+ tree_iter = self.queue_store.get_iter_root()
1815+ tmp = list(reversed(items))
1816+ while tree_iter is not None:
1817+ expected = tmp.pop()
1818+
1819+ op, path, node, share = self.queue_store.get(tree_iter, 0, 1, 2, 3)
1820+ self.assertEqual(expected.operation, op)
1821+ self.assertEqual(expected.path, path)
1822+ self.assertEqual(expected.node, node)
1823+ self.assertEqual(expected.share, share)
1824+
1825+ tree_iter = self.queue_store.iter_next(tree_iter)
1826+
1827+ def test_model_is_cleared_before_updating(self):
1828+ """The model is cleared before upadting with a new set of data."""
1829+ items = self.build_some_data()
1830+ self.sd_changed(items)
1831+
1832+ items = self.build_some_data()
1833+ self.sd_changed(items)
1834+ self.assertEqual(len(self.queue_store), len(items))
1835+
1836+ def test_view_is_enabled_if_disabled_on_changed(self):
1837+ """The tree view is enabled on changed if it was disabled."""
1838+ self.assertFalse(self.queue_view.is_sensitive(),
1839+ 'Tree view must be disabled by default.')
1840+ items = self.build_some_data()
1841+ self.sd_changed(items)
1842+
1843+ self.assertTrue(self.queue_view.is_sensitive(),
1844+ 'Tree view must be enabled on changed.')
1845+
1846+
1847+class MagicicadaUIContentQueueTestCase(_MagicicadaUIQueueTestCase):
1848+ """UI test cases for content queue views."""
1849+
1850+ queue = CONTENT_QUEUE
1851+
1852+
1853+class MagicicadaUIMetaQueueTestCase(_MagicicadaUIQueueTestCase):
1854+ """UI test cases for meta queue views."""
1855+
1856+ queue = META_QUEUE

Subscribers

People subscribed via source and target branches

to all changes: