Merge lp:~thomir/autopilot/trunk-vis-add-search-and-acceptance-tests into lp:~autopilot/autopilot/temp-dev

Proposed by Thomi Richards on 2014-04-16
Status: Merged
Approved by: Christopher Lee on 2014-05-06
Approved revision: 520
Merged at revision: 496
Proposed branch: lp:~thomir/autopilot/trunk-vis-add-search-and-acceptance-tests
Merge into: lp:~autopilot/autopilot/temp-dev
Diff against target: 1599 lines (+1263/-48)
16 files modified
README (+21/-1)
autopilot/introspection/_object_registry.py (+3/-1)
autopilot/introspection/qt.py (+1/-1)
autopilot/tests/acceptance/__init__.py (+20/-0)
autopilot/tests/acceptance/test_vis_main.py (+84/-0)
autopilot/tests/unit/test_introspection_object_registry.py (+2/-2)
autopilot/vis/dbus_search.py (+10/-4)
autopilot/vis/main_window.py (+349/-35)
autopilot/vis/objectproperties.py (+3/-3)
autopilot/vis/resources.py (+19/-0)
debian/autopilot3-vis.desktop (+6/-0)
debian/control (+4/-1)
debian/python3-autopilot-tests.install (+1/-0)
debian/python3-autopilot-vis.install (+3/-0)
icons/autopilot-toggle-overlay.svg (+64/-0)
icons/autopilot.svg (+673/-0)
To merge this branch: bzr merge lp:~thomir/autopilot/trunk-vis-add-search-and-acceptance-tests
Reviewer Review Type Date Requested Status
PS Jenkins bot continuous-integration 2014-04-16 Approve on 2014-05-06
Christopher Lee (community) 2014-04-16 Approve on 2014-05-06
Martin Pitt 2014-04-16 Pending
Review via email: mp+216001@code.launchpad.net

This proposal supersedes a proposal from 2014-04-02.

Commit Message

Add search and component overlay features to vis.

Description of the Change

Add acceptance tests, and add initial vis search implementation.

To post a comment you must log in.
Martin Pitt (pitti) wrote : Posted in a previous version of this proposal

Suggestions:
 - Name the package "autopilot-common". In the future you may get more .desktop/icons/translations/documentation files which apply to all autopilot versions.

 - Install the .desktop into python3-autopilot-vis as well, under a different name; also, it's perhaps nicer to spell it out instead of making it so short (autopilot-vis.desktop and autopilot3-vis.desktop, or autopilot-vis-py3.desktop?) Note that you can't use .install files for renaming, you have to use e. g. "install" in debian/rules.

- i18n support requires quite a lot of initial infrastructure. The "classic" and distro neutral way is to have a .desktop.in where keys of all translatable strings (Name/Comment/etc.) are prefixed with a '_'. E. g. "_Name=foo". Then intltool-extract is being used to pick these out and put them into the project's .pot (translation template), which gets uploaded to e. g. Launchpad translations; the actual translations (*.po) are downloaded into the po/ folder, from where intltool-merge generates translated .desktop files (with e. g. Name[es], Name[de]).

 In Ubuntu we have slightly better support for this as you can just specify the translation domain in the .desktop file (X-Ubuntu-Gettext-Domain=autopkgtest), have translations shipped by langpacks, and no merging is required.

 python[3]-distutils-extra makes all that fairly simple as it does most of that automatically. However, i18n'ing your project is no small step if you haven't done it before.

Martin Pitt (pitti) wrote : Posted in a previous version of this proposal

758 +Exec=autopilot vis
769 +Exec=autopilot3 vis

I suggest to change this to python[3] -m autopilot.run vis, as the autopilot3 alias should go away at some point, and it's not immediately clear what python version "autopilot" will be in the future.

Does it actually make sense for a developer to have both versions installed? I had thought that having the py3 version and dropping the py2 vis tool would be sufficient? Or am I missing something?

807 + gnome-icon-theme,

Why does autopilot-common need this dependency? It just installs an icon. It doesn't hurt much, as that package is installed pretty much everywhere anyway, but it looks a bit odd. If at all, then probably this dep should go to the -vis packages.

854 override_dh_install:
855 + find . -type f -name "*.desktop"

This looks like a debugging leftover?

Looks fine otherwise, thanks!

review: Needs Fixing
Thomi Richards (thomir) wrote : Posted in a previous version of this proposal

Hi,

On Mon, Apr 14, 2014 at 6:56 PM, Martin Pitt <email address hidden> wrote:

> Review: Needs Fixing
>
> 758 +Exec=autopilot vis
> 769 +Exec=autopilot3 vis
>
> I suggest to change this to python[3] -m autopilot.run vis, as the
> autopilot3 alias should go away at some point, and it's not immediately
> clear what python version "autopilot" will be in the future.
>
>
Done.

> Does it actually make sense for a developer to have both versions
> installed? I had thought that having the py3 version and dropping the py2
> vis tool would be sufficient? Or am I missing something?
>

Well, initially I thought this was going to land in trusty. In 'U' we'd
like to drop python 2 support altogetherm so the point is moot. However, I
don't think you should have to install python3-autopilot in order to use
the vis tool if your test suite is written in python 2 (or vice versa).

>
> 807 + gnome-icon-theme,
>
> Why does autopilot-common need this dependency?

We need the icon it installs for both python-autopilot-vis and
python3-autopilot-vis. Is it better to explicitly list it as a dependency
in both those packages? I figured that this way was cleaner.

> It just installs an icon. It doesn't hurt much, as that package is
> installed pretty much everywhere anyway, but it looks a bit odd. If at all,
> then probably this dep should go to the -vis packages.
>

OK, Done.

>
> 854 override_dh_install:
> 855 + find . -type f -name "*.desktop"
>
> This looks like a debugging leftover?
>
>
Whoops!

These changes have been pushed.

--
Thomi Richards
<email address hidden>

Martin Pitt (pitti) wrote : Posted in a previous version of this proposal

autopilot-common:
> Description: The visualisation application for Autopilot.

This package might get other common files in the future, so this description might be (or become) too narrow.

However, that's just a nitpick and not at all a blocker of course. Looks good to me now, thanks!

review: Approve
Christopher Lee (veebers) wrote : Posted in a previous version of this proposal

Some suggestions:
The manual testing text should mention a quick test for both the
search and the overlay. Nothing big, just simple like the existing
steps (i.e. search for QMainWindow, with overlay enabled, does
selecting it in the tree make it highlight.)

Some issues:
It appears that the tree visuals have changed, the tree header (wher
is says 'Tree Node') changes it's width in correspondance to the width
of the visiable tree elements. Is this expected? It seems broken to
what normally happens (header is always the full width).
(I've attached a couple of images here http://inky.ws/g/2zk showing this difference).

Diff line 118, 120 are incorrect (it does nothing with window-mocker)

review: Needs Fixing
Thomi Richards (thomir) wrote : Posted in a previous version of this proposal

Hi Chris,

> Some suggestions:
> The manual testing text should mention a quick test for both the
> search and the overlay. Nothing big, just simple like the existing
> steps (i.e. search for QMainWindow, with overlay enabled, does
> selecting it in the tree make it highlight.)

Done.

>
> Some issues:
> It appears that the tree visuals have changed, the tree header (wher
> is says 'Tree Node') changes it's width in correspondance to the width
> of the visiable tree elements. Is this expected? It seems broken to
> what normally happens (header is always the full width).
> (I've attached a couple of images here http://inky.ws/g/2zk showing this
> difference).

Yeah, this is intended. Well, perhaps not intended, but unavoidable.

>
> Diff line 118, 120 are incorrect (it does nothing with window-mocker)

Also fixed.

Thomi Richards (thomir) wrote : Posted in a previous version of this proposal

resubmitting to new target branch.

PS Jenkins bot (ps-jenkins) wrote :

FAILED: Continuous integration, rev:508
http://jenkins.qa.ubuntu.com/job/autopilot-autopilot-temp-dev-ci/2/
Executed test runs:
    SUCCESS: http://jenkins.qa.ubuntu.com/job/autopilot-autopilot-temp-dev-trusty-amd64-ci/2
        deb: http://jenkins.qa.ubuntu.com/job/autopilot-autopilot-temp-dev-trusty-amd64-ci/2/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/autopilot-autopilot-temp-dev-trusty-armhf-ci/2
        deb: http://jenkins.qa.ubuntu.com/job/autopilot-autopilot-temp-dev-trusty-armhf-ci/2/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/autopilot-autopilot-temp-dev-trusty-i386-ci/2
        deb: http://jenkins.qa.ubuntu.com/job/autopilot-autopilot-temp-dev-trusty-i386-ci/2/artifact/work/output/*zip*/output.zip
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-trusty-autopilot/140
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-trusty-touch/4178/console
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/autopilot-testrunner-otto-trusty-autopilot/125
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-trusty-amd64/5002
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-trusty-amd64/5002/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-trusty-armhf/4437
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-trusty-armhf/4437/artifact/work/output/*zip*/output.zip
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-runner-mako/6409/console
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/6076

Click here to trigger a rebuild:
http://s-jenkins.ubuntu-ci:8080/job/autopilot-autopilot-temp-dev-ci/2/rebuild

review: Needs Fixing (continuous-integration)
Christopher Lee (veebers) wrote : Posted in a previous version of this proposal

Looks really good Thomi.

review: Approve
Christopher Lee (veebers) wrote :

I see there is an odd failure on the mako. I'll try reproduce it now (runs fine on my desktop, and would be odd for this branch to effect the test that is failing.)

Christopher Lee (veebers) wrote :

Test passes locally, the failure isn't related to this branch at all.

review: Approve
PS Jenkins bot (ps-jenkins) wrote :

FAILED: Autolanding.
More details in the following jenkins job:
http://jenkins.qa.ubuntu.com/job/autopilot-autopilot-temp-dev-autolanding/1/
Executed test runs:
    SUCCESS: http://jenkins.qa.ubuntu.com/job/autopilot-autopilot-temp-dev-trusty-amd64-autolanding/1
        deb: http://jenkins.qa.ubuntu.com/job/autopilot-autopilot-temp-dev-trusty-amd64-autolanding/1/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/autopilot-autopilot-temp-dev-trusty-armhf-autolanding/1
        deb: http://jenkins.qa.ubuntu.com/job/autopilot-autopilot-temp-dev-trusty-armhf-autolanding/1/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/autopilot-autopilot-temp-dev-trusty-i386-autolanding/1
        deb: http://jenkins.qa.ubuntu.com/job/autopilot-autopilot-temp-dev-trusty-i386-autolanding/1/artifact/work/output/*zip*/output.zip
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-trusty-autopilot/149
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-trusty-touch/4195/console
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/autopilot-testrunner-otto-trusty-autopilot/132
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-trusty-amd64/5070
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-trusty-amd64/5070/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-trusty-armhf/4501
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-trusty-armhf/4501/artifact/work/output/*zip*/output.zip
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-runner-mako/6424/console
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/6150

review: Needs Fixing (continuous-integration)
509. By Thomi Richards on 2014-05-04

Merged trunk, fixed conflicts.

510. By Thomi Richards on 2014-05-04

Fix incompatibility with new introspection code.

511. By Thomi Richards on 2014-05-04

Be more careful when reading settings data.

512. By Thomi Richards on 2014-05-05

Be more careful with the overlayChecked data as well.

513. By Thomi Richards on 2014-05-05

Remove pdb statement - oops!

PS Jenkins bot (ps-jenkins) wrote :

PASSED: Continuous integration, rev:513
http://jenkins.qa.ubuntu.com/job/autopilot-autopilot-temp-dev-ci/37/
Executed test runs:
    SUCCESS: http://jenkins.qa.ubuntu.com/job/autopilot-autopilot-temp-dev-trusty-amd64-ci/38
        deb: http://jenkins.qa.ubuntu.com/job/autopilot-autopilot-temp-dev-trusty-amd64-ci/38/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/autopilot-autopilot-temp-dev-trusty-armhf-ci/37
        deb: http://jenkins.qa.ubuntu.com/job/autopilot-autopilot-temp-dev-trusty-armhf-ci/37/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/autopilot-autopilot-temp-dev-trusty-i386-ci/37
        deb: http://jenkins.qa.ubuntu.com/job/autopilot-autopilot-temp-dev-trusty-i386-ci/37/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-trusty-autopilot/235
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-trusty-touch/4309/console
    SUCCESS: http://jenkins.qa.ubuntu.com/job/autopilot-testrunner-otto-trusty-autopilot/208
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-trusty-amd64/5468
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-trusty-amd64/5468/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-trusty-armhf/4903
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-trusty-armhf/4903/artifact/work/output/*zip*/output.zip
    FAILURE: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-runner-mako/6537/console
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/6760

Click here to trigger a rebuild:
http://s-jenkins.ubuntu-ci:8080/job/autopilot-autopilot-temp-dev-ci/37/rebuild

review: Approve (continuous-integration)
514. By Thomi Richards on 2014-05-05

Reorder imports in test file, and skip test on devices (since vis isn't usable on a device).

PS Jenkins bot (ps-jenkins) wrote :

PASSED: Continuous integration, rev:514
http://jenkins.qa.ubuntu.com/job/autopilot-autopilot-temp-dev-ci/39/
Executed test runs:
    SUCCESS: http://jenkins.qa.ubuntu.com/job/autopilot-autopilot-temp-dev-trusty-amd64-ci/40
        deb: http://jenkins.qa.ubuntu.com/job/autopilot-autopilot-temp-dev-trusty-amd64-ci/40/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/autopilot-autopilot-temp-dev-trusty-armhf-ci/39
        deb: http://jenkins.qa.ubuntu.com/job/autopilot-autopilot-temp-dev-trusty-armhf-ci/39/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/autopilot-autopilot-temp-dev-trusty-i386-ci/39
        deb: http://jenkins.qa.ubuntu.com/job/autopilot-autopilot-temp-dev-trusty-i386-ci/39/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-trusty-autopilot/237
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-trusty-touch/4310
    SUCCESS: http://jenkins.qa.ubuntu.com/job/autopilot-testrunner-otto-trusty-autopilot/210
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-trusty-amd64/5470
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-trusty-amd64/5470/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-trusty-armhf/4904
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-trusty-armhf/4904/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-runner-mako/6538
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/6766

Click here to trigger a rebuild:
http://s-jenkins.ubuntu-ci:8080/job/autopilot-autopilot-temp-dev-ci/39/rebuild

review: Approve (continuous-integration)
515. By Thomi Richards on 2014-05-05

Remove desktop file for python 2 version of the vis tool, since it's no longer used.

516. By Thomi Richards on 2014-05-05

Remove autopilot-common package, since it's not needed any more.

517. By Thomi Richards on 2014-05-05

Merge trunk.

518. By Thomi Richards on 2014-05-05

Re-add accidentally removed install files.

519. By Thomi Richards on 2014-05-05

Correctly decode bytes to strings before creating classes, rather than getting a bytes repr value.

520. By Thomi Richards on 2014-05-05

Fix failing unit test.

PS Jenkins bot (ps-jenkins) wrote :

PASSED: Continuous integration, rev:520
http://jenkins.qa.ubuntu.com/job/autopilot-autopilot-temp-dev-ci/47/
Executed test runs:
    SUCCESS: http://jenkins.qa.ubuntu.com/job/autopilot-autopilot-temp-dev-utopic-amd64-ci/5
        deb: http://jenkins.qa.ubuntu.com/job/autopilot-autopilot-temp-dev-utopic-amd64-ci/5/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/autopilot-autopilot-temp-dev-utopic-armhf-ci/5
        deb: http://jenkins.qa.ubuntu.com/job/autopilot-autopilot-temp-dev-utopic-armhf-ci/5/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/autopilot-autopilot-temp-dev-utopic-i386-ci/5
        deb: http://jenkins.qa.ubuntu.com/job/autopilot-autopilot-temp-dev-utopic-i386-ci/5/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-utopic-autopilot/11
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-utopic-touch/6
    SUCCESS: http://jenkins.qa.ubuntu.com/job/autopilot-testrunner-otto-utopic-autopilot/7
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-amd64/15
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-amd64/15/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-armhf/73
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-armhf/73/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-runner-mako/6541
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/6797

Click here to trigger a rebuild:
http://s-jenkins.ubuntu-ci:8080/job/autopilot-autopilot-temp-dev-ci/47/rebuild

review: Approve (continuous-integration)
Christopher Lee (veebers) wrote :

LGTM

review: Approve
review: Approve (continuous-integration)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'README'
2--- README 2013-09-26 14:30:40 +0000
3+++ README 2014-05-05 23:26:02 +0000
4@@ -1,4 +1,5 @@
5 Welcome to the Autopilot source code!
6+#####################################
7
8 Autopilot is a tool for writing functional tests for GUI applications.
9
10@@ -10,4 +11,23 @@
11 - Documentation (Tutorial, FAQ, API Reference, etc):
12 http://unity.ubuntu.com/autopilot/
13
14-happy hacking.
15+- IRC channel is #ubuntu-autopilot on irc.freenode.net
16+
17+happy hacking!
18+
19+Release Manual Tests
20+====================
21+
22+Not all our tests are automated at the moment. Specifically, the vis tool is lacking some automated tests due to deficiancies in other packages. Until we remedy this situation, the following things need to be manually tested upon an autopilot release:
23+
24+- Run the following tests by running both: ``autopilot vis`` and ``autopilot3 vis``.
25+ - Run 'window-mocker -testability' and the vis tool.
26+ - Make sure you can select window-mocker from the connection list.
27+ - Make sure the top-level tree node is 'window-mocker'
28+ - Run the vis tool with the '-testability' flag enabled. Run a second vis tool, and make sure that the second vis tool can introspect the first.
29+ - Make sure that the component overlay feature highlights the selected item in the tree view, as long as it has a globalRect.
30+ - Make sure that searching works:
31+ - Searching narrows down tree view to just the nodes that match the search criteria.
32+ - Searching turns off the current component overlay (if any).
33+ - Resetting the search restores the tree view to the full tree.
34+ - Resetting the search turns off the current component overlay (if any).
35
36=== modified file 'autopilot/introspection/_object_registry.py'
37--- autopilot/introspection/_object_registry.py 2014-04-21 21:36:55 +0000
38+++ autopilot/introspection/_object_registry.py 2014-05-05 23:26:02 +0000
39@@ -162,7 +162,9 @@
40 break
41 else:
42 base_class = default_class
43- return type(str(name), (base_class,), {})
44+ if isinstance(name, bytes):
45+ name = name.decode('utf-8')
46+ return type(name, (base_class,), {})
47
48
49 @contextmanager
50
51=== modified file 'autopilot/introspection/qt.py'
52--- autopilot/introspection/qt.py 2014-03-25 14:42:25 +0000
53+++ autopilot/introspection/qt.py 2014-05-05 23:26:02 +0000
54@@ -72,7 +72,7 @@
55
56 """
57
58- return self._backend.qt_introspection_iface
59+ return self._backend.ipc_address.qt_introspection_iface
60
61 @property
62 def slots(self):
63
64=== added directory 'autopilot/tests/acceptance'
65=== added file 'autopilot/tests/acceptance/__init__.py'
66--- autopilot/tests/acceptance/__init__.py 1970-01-01 00:00:00 +0000
67+++ autopilot/tests/acceptance/__init__.py 2014-05-05 23:26:02 +0000
68@@ -0,0 +1,20 @@
69+# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
70+#
71+# Autopilot Functional Test Tool
72+# Copyright (C) 2014 Canonical
73+#
74+# This program is free software: you can redistribute it and/or modify
75+# it under the terms of the GNU General Public License as published by
76+# the Free Software Foundation, either version 3 of the License, or
77+# (at your option) any later version.
78+#
79+# This program is distributed in the hope that it will be useful,
80+# but WITHOUT ANY WARRANTY; without even the implied warranty of
81+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
82+# GNU General Public License for more details.
83+#
84+# You should have received a copy of the GNU General Public License
85+# along with this program. If not, see <http://www.gnu.org/licenses/>.
86+#
87+
88+"""Acceptance tests for the autopilot vis tool."""
89
90=== added file 'autopilot/tests/acceptance/test_vis_main.py'
91--- autopilot/tests/acceptance/test_vis_main.py 1970-01-01 00:00:00 +0000
92+++ autopilot/tests/acceptance/test_vis_main.py 2014-05-05 23:26:02 +0000
93@@ -0,0 +1,84 @@
94+# -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
95+#
96+# Autopilot Functional Test Tool
97+# Copyright (C) 2014 Canonical
98+#
99+# This program is free software: you can redistribute it and/or modify
100+# it under the terms of the GNU General Public License as published by
101+# the Free Software Foundation, either version 3 of the License, or
102+# (at your option) any later version.
103+#
104+# This program is distributed in the hope that it will be useful,
105+# but WITHOUT ANY WARRANTY; without even the implied warranty of
106+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
107+# GNU General Public License for more details.
108+#
109+# You should have received a copy of the GNU General Public License
110+# along with this program. If not, see <http://www.gnu.org/licenses/>.
111+#
112+
113+"""Acceptance tests for the autopilot vis tool."""
114+
115+import sys
116+
117+from testtools import skipIf
118+from testtools.matchers import Equals
119+
120+from autopilot.application import NormalApplicationLauncher
121+from autopilot.introspection.dbus import CustomEmulatorBase
122+from autopilot.matchers import Eventually
123+from autopilot.platform import model
124+from autopilot.testcase import AutopilotTestCase
125+
126+
127+class VisToolEmulatorBase(CustomEmulatorBase):
128+ pass
129+
130+
131+class VisToolLauncher(NormalApplicationLauncher):
132+
133+ """Override code that prepares application environment.
134+
135+ The vis tool does not accept the '-testability' argument as the first
136+ argument, so we override _setup_environment to put the argument in the
137+ correct place.
138+
139+ """
140+
141+ def _setup_environment(self, app_path, *arguments):
142+ return app_path, arguments + ('-testability',)
143+
144+
145+class VisAcceptanceTests(AutopilotTestCase):
146+
147+ def launch_windowmocker(self):
148+ return self.launch_test_application("window-mocker", app_type="qt")
149+
150+ def launch_vis(self):
151+ """Launch the vis tool and return it's proxy object."""
152+ launcher = self.useFixture(
153+ VisToolLauncher(
154+ self.addDetail,
155+ app_type="qt",
156+ emulator_base=VisToolEmulatorBase
157+ )
158+ )
159+ vis_proxy = self._launch_test_application(
160+ launcher,
161+ sys.executable,
162+ "-m"
163+ "autopilot.run",
164+ "vis",
165+ )
166+ return vis_proxy
167+
168+ @skipIf(model() != "Desktop", "Vis not usable on device.")
169+ def test_can_select_windowmocker(self):
170+ wm = self.launch_windowmocker()
171+ vis = self.launch_vis()
172+ connection_list = vis.select_single('ConnectionList')
173+ connection_list.slots.trySetSelectedItem(wm.applicationName)
174+ self.assertThat(
175+ connection_list.currentText,
176+ Eventually(Equals(wm.applicationName))
177+ )
178
179=== modified file 'autopilot/tests/unit/test_introspection_object_registry.py'
180--- autopilot/tests/unit/test_introspection_object_registry.py 2014-04-21 21:36:55 +0000
181+++ autopilot/tests/unit/test_introspection_object_registry.py 2014-05-05 23:26:02 +0000
182@@ -1,7 +1,7 @@
183 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
184 #
185 # Autopilot Functional Test Tool
186-# Copyright (C) 2013 Canonical
187+# Copyright (C) 2014 Canonical
188 #
189 # This program is free software: you can redistribute it and/or modify
190 # it under the terms of the GNU General Public License as published by
191@@ -188,7 +188,7 @@
192 @patch('autopilot.introspection._object_registry.get_debug_logger')
193 def test_get_default_proxy_class_logging(self, gdl):
194 """_get_default_proxy_class should log a message."""
195- object_registry._get_default_proxy_class(self.DefaultSelector, None)
196+ object_registry._get_default_proxy_class(self.DefaultSelector, "None")
197 gdl.assert_called_once_with()
198
199 def test_get_default_proxy_class_base(self):
200
201=== modified file 'autopilot/vis/dbus_search.py'
202--- autopilot/vis/dbus_search.py 2014-04-07 23:25:11 +0000
203+++ autopilot/vis/dbus_search.py 2014-05-05 23:26:02 +0000
204@@ -21,7 +21,10 @@
205 import logging
206 import os
207 from os.path import join
208-from xml.etree import ElementTree
209+try:
210+ import lxml.etree as ET
211+except ImportError:
212+ from xml.etree import ElementTree as ET
213
214 _logger = logging.getLogger(__name__)
215
216@@ -80,10 +83,13 @@
217
218 def __call__(self, conn_name, obj_name, xml):
219 try:
220- root = ElementTree.fromstring(xml)
221+ root = ET.fromstring(xml)
222
223 for child in root.getchildren():
224- child_name = join(obj_name, child.attrib['name'])
225+ try:
226+ child_name = join(obj_name, child.attrib['name'])
227+ except KeyError:
228+ continue
229 # If we found another node, make sure we get called again with
230 # a new XML block.
231 if child.tag == 'node':
232@@ -93,7 +99,7 @@
233 elif child.tag == 'interface':
234 iface_name = child_name.split('/')[-1]
235 self._success_callback(conn_name, obj_name, iface_name)
236- except ElementTree.ParseError:
237+ except ET.ParseError:
238 _logger.warning(
239 "Unable to parse XML response for %s (%s)"
240 % (conn_name, obj_name)
241
242=== modified file 'autopilot/vis/main_window.py'
243--- autopilot/vis/main_window.py 2014-04-15 02:32:16 +0000
244+++ autopilot/vis/main_window.py 2014-05-05 23:26:02 +0000
245@@ -33,7 +33,11 @@
246 from autopilot.introspection.constants import AP_INTROSPECTION_IFACE
247 from autopilot.introspection.qt import QtObjectProxyMixin
248 from autopilot.vis.objectproperties import TreeNodeDetailWidget
249-from autopilot.vis.resources import get_qt_icon
250+from autopilot.vis.resources import (
251+ get_filter_icon,
252+ get_overlay_icon,
253+ get_qt_icon,
254+)
255
256 _logger = logging.getLogger(__name__)
257
258@@ -45,41 +49,95 @@
259 self.initUI()
260 self.readSettings()
261 self._dbus_bus = dbus_bus
262+ self.proxy_object = None
263
264 def readSettings(self):
265 settings = QtCore.QSettings()
266- if six.PY3:
267- self.restoreGeometry(settings.value("geometry").data())
268- self.restoreState(settings.value("windowState").data())
269- else:
270- self.restoreGeometry(settings.value("geometry").toByteArray())
271- self.restoreState(settings.value("windowState").toByteArray())
272+ geometry = settings.value("geometry")
273+ if geometry is not None:
274+ self.restoreGeometry(geometry.data())
275+ window_state = settings.value("windowState")
276+ if window_state is not None:
277+ self.restoreState(window_state.data())
278+ try:
279+ self.toggle_overlay_action.setChecked(
280+ settings.value("overlayChecked", type="bool")
281+ )
282+ except TypeError:
283+ pass
284+ # raised when returned QVariant is invalid - probably on
285+ # first boot
286
287 def closeEvent(self, event):
288 settings = QtCore.QSettings()
289 settings.setValue("geometry", self.saveGeometry())
290 settings.setValue("windowState", self.saveState())
291+ settings.setValue(
292+ "overlayChecked",
293+ self.toggle_overlay_action.isChecked()
294+ )
295+ self.visual_indicator.close()
296
297 def initUI(self):
298+ self.setWindowTitle("Autopilot Vis")
299 self.statusBar().showMessage('Waiting for first valid dbus connection')
300
301 self.splitter = QtGui.QSplitter(self)
302 self.splitter.setChildrenCollapsible(False)
303- self.tree_view = QtGui.QTreeView(self.splitter)
304+ self.tree_view = ProxyObjectTreeViewWidget(self.splitter)
305 self.detail_widget = TreeNodeDetailWidget(self.splitter)
306
307 self.splitter.setStretchFactor(0, 0)
308 self.splitter.setStretchFactor(1, 100)
309 self.setCentralWidget(self.splitter)
310
311- self.connection_list = QtGui.QComboBox()
312- self.connection_list.setSizeAdjustPolicy(
313- QtGui.QComboBox.AdjustToContents)
314- self.connection_list.activated.connect(self.conn_list_activated)
315+ self.connection_list = ConnectionList()
316+ self.connection_list.currentIndexChanged.connect(
317+ self.conn_list_activated
318+ )
319
320 self.toolbar = self.addToolBar('Connection')
321 self.toolbar.setObjectName('Connection Toolbar')
322 self.toolbar.addWidget(self.connection_list)
323+ self.toolbar.addSeparator()
324+
325+ self.filter_widget = FilterPane()
326+ self.filter_widget.apply_filter.connect(self.on_filter)
327+ self.filter_widget.reset_filter.connect(self.on_reset_filter)
328+ self.filter_widget.set_enabled(False)
329+
330+ self.addDockWidget(QtCore.Qt.RightDockWidgetArea, self.filter_widget)
331+ self.toggle_dock_widget_action = self.filter_widget.toggleViewAction()
332+ self.toggle_dock_widget_action.setText('Show/Hide Filter Pane')
333+ self.toggle_dock_widget_action.setIcon(get_filter_icon())
334+ self.toolbar.addAction(self.toggle_dock_widget_action)
335+
336+ self.visual_indicator = VisualComponentPositionIndicator()
337+ self.toggle_overlay_action = self.toolbar.addAction(
338+ get_overlay_icon(),
339+ "Enable/Disable component overlay"
340+ )
341+ self.toggle_overlay_action.setCheckable(True)
342+ self.toggle_overlay_action.toggled.connect(
343+ self.visual_indicator.setEnabled
344+ )
345+ # our model object gets created later.
346+ self.tree_model = None
347+
348+ def on_filter(self, node_name, filters):
349+ node_name = str(node_name)
350+ if self.proxy_object:
351+ p = self.proxy_object.select_many(node_name)
352+ self.tree_model.set_tree_roots(p)
353+ self.tree_view.set_filtered(True)
354+ # applying the filter will always invalidate the current overlay
355+ self.visual_indicator.tree_node_changed(None)
356+
357+ def on_reset_filter(self):
358+ self.tree_model.set_tree_roots([self.proxy_object])
359+ self.tree_view.set_filtered(False)
360+ # resetting the filter will always invalidate the current overlay
361+ self.visual_indicator.tree_node_changed(None)
362
363 def on_interface_found(self, conn, obj, iface):
364 if iface == AP_INTROSPECTION_IFACE:
365@@ -130,18 +188,201 @@
366 self.connection_list.setCurrentIndex(prev_selected)
367
368 def conn_list_activated(self, index):
369- dbus_details = self.connection_list.itemData(index)
370+ proxy_object = self.connection_list.itemData(index)
371 if not six.PY3:
372- dbus_details = dbus_details.toPyObject()
373- if dbus_details:
374- self.tree_model = VisTreeModel(dbus_details)
375- self.tree_view.setModel(self.tree_model)
376- self.tree_view.selectionModel().currentChanged.connect(
377- self.tree_item_changed)
378+ proxy_object = proxy_object.toPyObject()
379+ self.proxy_object = proxy_object
380+ if self.proxy_object:
381+ self.filter_widget.set_enabled(True)
382+ self.tree_model = VisTreeModel(self.proxy_object)
383+ self.tree_view.set_model(self.tree_model)
384+ self.tree_view.selection_changed.connect(self.tree_item_changed)
385+ else:
386+ self.filter_widget.set_enabled(False)
387+ self.tree_view.set_model(None)
388+ self.visual_indicator.tree_node_changed(None)
389+ self.detail_widget.tree_node_changed(None)
390
391 def tree_item_changed(self, current, previous):
392- proxy = current.internalPointer().dbus_object
393+ tree_node = current.internalPointer()
394+ proxy = tree_node.dbus_object if tree_node is not None else None
395 self.detail_widget.tree_node_changed(proxy)
396+ self.visual_indicator.tree_node_changed(proxy)
397+
398+
399+class VisualComponentPositionIndicator(QtGui.QWidget):
400+
401+ def __init__(self, parent=None):
402+ super(VisualComponentPositionIndicator, self).__init__(None)
403+ self.setWindowFlags(
404+ QtCore.Qt.Window |
405+ QtCore.Qt.X11BypassWindowManagerHint |
406+ QtCore.Qt.FramelessWindowHint |
407+ QtCore.Qt.WindowStaysOnTopHint
408+ )
409+ self.setAttribute(QtCore.Qt.WA_TranslucentBackground)
410+ self.setStyleSheet(
411+ """\
412+ QWidget {
413+ background-color: rgba(253, 255, 225, 128);
414+ }
415+ """
416+ )
417+ self.enabled = False
418+ self.proxy = None
419+
420+ def tree_node_changed(self, proxy):
421+ self.proxy = proxy
422+ self._maybe_update()
423+
424+ def paintEvent(self, paint_evt):
425+ opt = QtGui.QStyleOption()
426+ opt.init(self)
427+ p = QtGui.QPainter(self)
428+ self.style().drawPrimitive(
429+ QtGui.QStyle.PE_Widget,
430+ opt,
431+ p,
432+ self
433+ )
434+
435+ def setEnabled(self, enabled):
436+ self.enabled = enabled
437+ self._maybe_update()
438+
439+ def _maybe_update(self):
440+ """Maybe update the visual overlay.
441+
442+ Several things need to be taken into account:
443+
444+ 1. The state of the UI toggle button, which determines whether the
445+ user expects us to be visible or not. Stored in 'self.enabled'
446+ 2. The current proxy object set, and whether it has a 'globalRect'
447+ attribute (stored in self.proxy) - the proxy object may be None as
448+ well.
449+
450+ """
451+
452+ position = getattr(self.proxy, 'globalRect', None)
453+ should_be_visible = self.enabled and (position is not None)
454+
455+ if should_be_visible:
456+ self.setGeometry(*position)
457+ if should_be_visible != self.isVisible():
458+ self.setVisible(should_be_visible)
459+
460+
461+class ProxyObjectTreeView(QtGui.QTreeView):
462+
463+ """A subclass of QTreeView with a few customisations."""
464+
465+ def __init__(self, parent=None):
466+ super(ProxyObjectTreeView, self).__init__(parent)
467+ self.setSelectionMode(QtGui.QAbstractItemView.SingleSelection)
468+ self.header().setResizeMode(QtGui.QHeaderView.ResizeToContents)
469+ self.header().setStretchLastSection(False)
470+
471+ def scrollTo(self, index, hint=QtGui.QAbstractItemView.EnsureVisible):
472+ """Scroll the view to make the node at index visible.
473+
474+ Overriden to stop autoScroll from horizontally jumping when selecting
475+ nodes, and to make arrow navigation work correctly when scrolling off
476+ the bottom of the viewport.
477+
478+ :param index: The node to be made visible.
479+ :param hint: Where the visible item should be - this is ignored.
480+ """
481+ # calculate the visual rect of the item we're scrolling to in viewport
482+ # coordinates. The default implementation gives us a rect that ends
483+ # in the RHS of the viewport, which isn't what we want. We use a
484+ # QFontMetrics instance to calculate the probably width of the text
485+ # beign rendered. This may not be totally accurate, but it seems good
486+ # enough.
487+ visual_rect = self.visualRect(index)
488+ fm = self.fontMetrics()
489+ text_width = fm.width(index.data())
490+ visual_rect.setRight(visual_rect.left() + text_width)
491+
492+ # horizontal scrolling is done per-pixel, with the scrollbar value
493+ # being the number of pixels past the RHS of the VP. For some reason
494+ # one needs to add 8 pixels - possibly this is for the tree expansion
495+ # widget?
496+ hbar = self.horizontalScrollBar()
497+ if visual_rect.right() + 8 > self.viewport().width():
498+ offset = (visual_rect.right() -
499+ self.viewport().width() +
500+ hbar.value() + 8)
501+ hbar.setValue(offset)
502+ if visual_rect.left() < 0:
503+ offset = hbar.value() + visual_rect.left() - 8
504+ hbar.setValue(offset)
505+
506+ # Vertical scrollbar scrolls in steps equal to the height of each item
507+ vbar = self.verticalScrollBar()
508+ if visual_rect.bottom() > self.viewport().height():
509+ offset_pixels = (visual_rect.bottom() -
510+ self.viewport().height() +
511+ vbar.value())
512+ new_position = max(
513+ offset_pixels / visual_rect.height(),
514+ 1
515+ ) + vbar.value()
516+ vbar.setValue(new_position)
517+ if visual_rect.top() < 0:
518+ new_position = min(visual_rect.top() / visual_rect.height(), -1)
519+ vbar.setValue(vbar.value() + new_position)
520+
521+
522+class ProxyObjectTreeViewWidget(QtGui.QWidget):
523+ """A Widget that contains a tree view and a few other things."""
524+
525+ selection_changed = QtCore.pyqtSignal('QModelIndex', 'QModelIndex')
526+
527+ def __init__(self, parent=None):
528+ super(ProxyObjectTreeViewWidget, self).__init__(parent)
529+ layout = QtGui.QVBoxLayout(self)
530+ self.tree_view = ProxyObjectTreeView()
531+
532+ layout.addWidget(self.tree_view)
533+
534+ self.status_label = QtGui.QLabel("Showing Filtered Results ONLY")
535+ self.status_label.hide()
536+ layout.addWidget(self.status_label)
537+ self.setLayout(layout)
538+
539+ def set_model(self, model):
540+ self.tree_view.setModel(model)
541+ self.tree_view.selectionModel().currentChanged.connect(
542+ self.selection_changed
543+ )
544+ self.set_filtered(False)
545+
546+ def set_filtered(self, is_filtered):
547+ if is_filtered:
548+ self.status_label.show()
549+ self.tree_view.setStyleSheet("""\
550+ QTreeView {
551+ background-color: #fdffe1;
552+ }
553+ """)
554+ else:
555+ self.status_label.hide()
556+ self.tree_view.setStyleSheet("")
557+
558+
559+class ConnectionList(QtGui.QComboBox):
560+ """Used to show a list of applications we can connect to."""
561+
562+ def __init__(self):
563+ super(ConnectionList, self).__init__()
564+ self.setObjectName("ConnectionList")
565+ self.setSizeAdjustPolicy(QtGui.QComboBox.AdjustToContents)
566+
567+ @QtCore.pyqtSlot(str)
568+ def trySetSelectedItem(self, desired_text):
569+ index = self.findText(desired_text)
570+ if index != -1:
571+ self.setCurrentIndex(index)
572
573
574 class TreeNode(object):
575@@ -152,9 +393,9 @@
576 snapshot of the apps whole state.
577
578 """
579- def __init__(self, parent=None, name='', dbus_object=None):
580+ def __init__(self, parent=None, dbus_object=None):
581 self.parent = parent
582- self.name = name
583+ self.name = dbus_object.__class__.__name__
584 self.dbus_object = dbus_object
585 self._children = None
586
587@@ -164,8 +405,7 @@
588 self._children = []
589 try:
590 for child in self.dbus_object.get_children():
591- name = child.__class__.__name__
592- self._children.append(TreeNode(self, name, child))
593+ self._children.append(TreeNode(self, child))
594 except StateNotFoundError:
595 pass
596 return self._children
597@@ -178,6 +418,13 @@
598 doesn't need to know about the details.
599
600 """
601+ # Thomi - 2014-04-09 - the code below is subtly broken because
602+ # libautopilot-qt returns items in the Children property that it never
603+ # exports. I'm reverting this optimisation and doing the simple thing
604+ # until that gets fixed.
605+ # https://bugs.launchpad.net/autopilot-qt/+bug/1286985
606+ return len(self.children)
607+ # old code - re-enable once above bug has been fixed.
608 num_children = 0
609 with self.dbus_object.no_automatic_refreshing():
610 if hasattr(self.dbus_object, 'Children'):
611@@ -186,17 +433,40 @@
612
613
614 class VisTreeModel(QtCore.QAbstractItemModel):
615- def __init__(self, introspectable_obj):
616+
617+ def __init__(self, proxy_object):
618+ """Create a new proxy object tree model.
619+
620+ :param proxy_object: A DBus proxy object representing the root of the
621+ tree to show.
622+
623+ """
624 super(VisTreeModel, self).__init__()
625- name = introspectable_obj.__class__.__name__
626- self.tree_root = TreeNode(name=name, dbus_object=introspectable_obj)
627+ self.tree_roots = [
628+ TreeNode(dbus_object=proxy_object),
629+ ]
630+
631+ def set_tree_roots(self, new_tree_roots):
632+ """Call this method to change the root nodes the model shows.
633+
634+ :param new_tree_roots: An iterable of dbus proxy objects, each one will
635+ be a root node in the model after calling this method.
636+
637+ """
638+ self.beginResetModel()
639+ self.tree_roots = [TreeNode(dbus_object=r) for r in new_tree_roots]
640+ self.endResetModel()
641
642 def index(self, row, col, parent):
643 if not self.hasIndex(row, col, parent):
644 return QtCore.QModelIndex()
645
646+ # If there's no parent, return the root of our tree:
647 if not parent.isValid():
648- parentItem = self.tree_root
649+ if row < len(self.tree_roots):
650+ return self.createIndex(row, col, self.tree_roots[row])
651+ else:
652+ return QtCore.QModelIndex()
653 else:
654 parentItem = parent.internalPointer()
655
656@@ -216,7 +486,7 @@
657
658 parentItem = childItem.parent
659
660- if parentItem == self.tree_root:
661+ if parentItem is None:
662 return QtCore.QModelIndex()
663
664 row = parentItem.children.index(childItem)
665@@ -224,10 +494,9 @@
666
667 def rowCount(self, parent):
668 if not parent.isValid():
669- p_Item = self.tree_root
670+ return len(self.tree_roots)
671 else:
672- p_Item = parent.internalPointer()
673- return p_Item.num_children
674+ return parent.internalPointer().num_children
675
676 def columnCount(self, parent):
677 return 1
678@@ -241,9 +510,54 @@
679 def headerData(self, column, orientation, role):
680 if (orientation == QtCore.Qt.Horizontal and
681 role == QtCore.Qt.DisplayRole):
682- try:
683 return "Tree Node"
684- except IndexError:
685- pass
686
687 return None
688+
689+
690+class FilterPane(QtGui.QDockWidget):
691+
692+ """A widget that provides a filter UI."""
693+
694+ apply_filter = QtCore.pyqtSignal(str, list)
695+ reset_filter = QtCore.pyqtSignal()
696+
697+ class ControlWidget(QtGui.QWidget):
698+
699+ def __init__(self, parent=None):
700+ super(FilterPane.ControlWidget, self).__init__(parent)
701+ self._layout = QtGui.QFormLayout(self)
702+
703+ self.node_name_edit = QtGui.QLineEdit()
704+ self._layout.addRow(
705+ QtGui.QLabel("Node Name:"),
706+ self.node_name_edit
707+ )
708+
709+ btn_box = QtGui.QDialogButtonBox()
710+ self.apply_btn = btn_box.addButton(QtGui.QDialogButtonBox.Apply)
711+ self.apply_btn.setDefault(True)
712+ self.reset_btn = btn_box.addButton(QtGui.QDialogButtonBox.Reset)
713+ self._layout.addRow(btn_box)
714+
715+ self.setLayout(self._layout)
716+
717+ def __init__(self, parent=None):
718+ super(FilterPane, self).__init__("Filter Tree", parent)
719+ self.setObjectName("FilterTreePane")
720+ self.control_widget = FilterPane.ControlWidget(self)
721+
722+ self.control_widget.node_name_edit.returnPressed.connect(
723+ self.on_apply_clicked
724+ )
725+ self.control_widget.apply_btn.clicked.connect(self.on_apply_clicked)
726+ self.control_widget.reset_btn.clicked.connect(self.reset_filter)
727+
728+ self.setWidget(self.control_widget)
729+
730+ def on_apply_clicked(self):
731+ node_name = self.control_widget.node_name_edit.text()
732+ self.apply_filter.emit(node_name, [])
733+
734+ def set_enabled(self, enabled):
735+ self.control_widget.setEnabled(enabled)
736
737=== modified file 'autopilot/vis/objectproperties.py'
738--- autopilot/vis/objectproperties.py 2013-10-13 21:49:49 +0000
739+++ autopilot/vis/objectproperties.py 2014-05-05 23:26:02 +0000
740@@ -115,7 +115,7 @@
741 return "Properties"
742
743 def is_relevant(self, node):
744- return True
745+ return node is not None
746
747 def new_node_selected(self, node):
748 self.table_view.setSortingEnabled(False)
749@@ -161,7 +161,7 @@
750 return get_qt_icon()
751
752 def is_relevant(self, node):
753- return isinstance(node, QtObjectProxyMixin)
754+ return node is not None and isinstance(node, QtObjectProxyMixin)
755
756 def new_node_selected(self, node):
757 self.signals_table.setSortingEnabled(False)
758@@ -201,7 +201,7 @@
759 return get_qt_icon()
760
761 def is_relevant(self, node):
762- return isinstance(node, QtObjectProxyMixin)
763+ return node is not None and isinstance(node, QtObjectProxyMixin)
764
765 def new_node_selected(self, node):
766 self.slots_table.setSortingEnabled(False)
767
768=== modified file 'autopilot/vis/resources.py'
769--- autopilot/vis/resources.py 2013-09-11 18:45:00 +0000
770+++ autopilot/vis/resources.py 2014-05-05 23:26:02 +0000
771@@ -18,6 +18,7 @@
772 #
773
774
775+import os.path
776 import dbus
777
778 from PyQt4 import QtGui
779@@ -27,6 +28,24 @@
780 return QtGui.QIcon(":/trolltech/qmessagebox/images/qtlogo-64.png")
781
782
783+def get_filter_icon():
784+ return QtGui.QIcon("/usr/share/icons/gnome/32x32/actions/search.png")
785+
786+
787+def get_overlay_icon():
788+ name = "autopilot-toggle-overlay.svg"
789+ possible_locations = [
790+ "/usr/share/icons/hicolor/scalable/actions/",
791+ os.path.join(os.path.dirname(__file__), '../../icons'),
792+ "icons",
793+ ]
794+ for location in possible_locations:
795+ path = os.path.join(location, name)
796+ if os.path.exists(path):
797+ return QtGui.QIcon(path)
798+ return QtGui.QIcon()
799+
800+
801 def dbus_string_rep(dbus_type):
802 """Get a string representation of various dbus types."""
803 if isinstance(dbus_type, dbus.Boolean):
804
805=== added file 'debian/autopilot3-vis.desktop'
806--- debian/autopilot3-vis.desktop 1970-01-01 00:00:00 +0000
807+++ debian/autopilot3-vis.desktop 2014-05-05 23:26:02 +0000
808@@ -0,0 +1,6 @@
809+[Desktop Entry]
810+Type=Application
811+Name=Autopilot Vis (py3)
812+Exec=python3 -m autopilot.run vis
813+Icon=autopilot
814+Comment=Inspect autopilot-enabled application internals (python 3 version).
815
816=== modified file 'debian/control'
817--- debian/control 2014-05-04 20:15:27 +0000
818+++ debian/control 2014-05-05 23:26:02 +0000
819@@ -115,10 +115,13 @@
820 Architecture: all
821 Depends: ${misc:Depends},
822 ${python3:Depends},
823+ gnome-icon-theme,
824 python3-autopilot,
825 python3-dbus,
826- python3-pyqt4,
827 python3-dbus.mainloop.qt,
828+ python3-pyqt4,
829+Recommends: python3-lxml,
830+ python3-dbus.mainloop.qt,
831 Description: visualisation application for Autopilot (Python 3)
832 The Autopilot vis tool allows you to inspect an application introspection
833 tree. It is a useful tool for test authors, but not required to run autopilot
834
835=== modified file 'debian/python3-autopilot-tests.install'
836--- debian/python3-autopilot-tests.install 2013-09-12 16:07:27 +0000
837+++ debian/python3-autopilot-tests.install 2014-05-05 23:26:02 +0000
838@@ -1,3 +1,4 @@
839 usr/lib/python3*/*/autopilot/tests/*.py
840 usr/lib/python3*/*/autopilot/tests/unit/*.py
841 usr/lib/python3*/*/autopilot/tests/functional/*.py
842+usr/lib/python3*/*/autopilot/tests/acceptance/*.py
843
844=== modified file 'debian/python3-autopilot-vis.install'
845--- debian/python3-autopilot-vis.install 2013-09-12 16:07:27 +0000
846+++ debian/python3-autopilot-vis.install 2014-05-05 23:26:02 +0000
847@@ -1,1 +1,4 @@
848 usr/lib/python3*/*/autopilot/vis/*.py
849+debian/autopilot3-vis.desktop /usr/share/applications
850+icons/autopilot-toggle-overlay.svg /usr/share/icons/hicolor/scalable/actions/
851+icons/autopilot.svg /usr/share/icons/hicolor/scalable/apps/
852
853=== added directory 'icons'
854=== added file 'icons/autopilot-toggle-overlay.svg'
855--- icons/autopilot-toggle-overlay.svg 1970-01-01 00:00:00 +0000
856+++ icons/autopilot-toggle-overlay.svg 2014-05-05 23:26:02 +0000
857@@ -0,0 +1,64 @@
858+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
859+<!-- Created with Inkscape (http://www.inkscape.org/) -->
860+
861+<svg
862+ xmlns:dc="http://purl.org/dc/elements/1.1/"
863+ xmlns:cc="http://creativecommons.org/ns#"
864+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
865+ xmlns:svg="http://www.w3.org/2000/svg"
866+ xmlns="http://www.w3.org/2000/svg"
867+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
868+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
869+ width="64"
870+ height="64"
871+ id="svg2"
872+ version="1.1"
873+ inkscape:version="0.48.4 r9939"
874+ sodipodi:docname="overlay.svg">
875+ <defs
876+ id="defs4" />
877+ <sodipodi:namedview
878+ id="base"
879+ pagecolor="#ffffff"
880+ bordercolor="#666666"
881+ borderopacity="1.0"
882+ inkscape:pageopacity="0.0"
883+ inkscape:pageshadow="2"
884+ inkscape:zoom="3.959798"
885+ inkscape:cx="5.6448832"
886+ inkscape:cy="8.1093716"
887+ inkscape:document-units="px"
888+ inkscape:current-layer="layer1"
889+ showgrid="false"
890+ inkscape:window-width="1871"
891+ inkscape:window-height="1056"
892+ inkscape:window-x="49"
893+ inkscape:window-y="74"
894+ inkscape:window-maximized="1" />
895+ <metadata
896+ id="metadata7">
897+ <rdf:RDF>
898+ <cc:Work
899+ rdf:about="">
900+ <dc:format>image/svg+xml</dc:format>
901+ <dc:type
902+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
903+ <dc:title></dc:title>
904+ </cc:Work>
905+ </rdf:RDF>
906+ </metadata>
907+ <g
908+ inkscape:label="Layer 1"
909+ inkscape:groupmode="layer"
910+ id="layer1"
911+ transform="translate(0,-988.36218)">
912+ <rect
913+ style="fill:#eaff34;fill-rule:evenodd;stroke:#171700;stroke-width:1;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;fill-opacity:1;stroke-miterlimit:4;stroke-dasharray:4, 4;stroke-dashoffset:0"
914+ id="rect2985"
915+ width="55.305851"
916+ height="56.063465"
917+ x="4.5456862"
918+ y="4.6535378"
919+ transform="translate(0,988.36218)" />
920+ </g>
921+</svg>
922
923=== added file 'icons/autopilot.svg'
924--- icons/autopilot.svg 1970-01-01 00:00:00 +0000
925+++ icons/autopilot.svg 2014-05-05 23:26:02 +0000
926@@ -0,0 +1,673 @@
927+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
928+<!-- Created with Inkscape (http://www.inkscape.org/) -->
929+
930+<svg
931+ xmlns:dc="http://purl.org/dc/elements/1.1/"
932+ xmlns:cc="http://creativecommons.org/ns#"
933+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
934+ xmlns:svg="http://www.w3.org/2000/svg"
935+ xmlns="http://www.w3.org/2000/svg"
936+ xmlns:xlink="http://www.w3.org/1999/xlink"
937+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
938+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
939+ width="208.875"
940+ height="208.875"
941+ id="svg2"
942+ version="1.1"
943+ inkscape:version="0.48.4 r9939"
944+ sodipodi:docname="otto.svg"
945+ inkscape:export-filename="/home/leecj2/Documents/AutopilotLogo/otto-64.png"
946+ inkscape:export-xdpi="27.58"
947+ inkscape:export-ydpi="27.58">
948+ <defs
949+ id="defs4">
950+ <linearGradient
951+ id="linearGradient4353">
952+ <stop
953+ style="stop-color:#d6ae35;stop-opacity:1;"
954+ offset="0"
955+ id="stop4355" />
956+ <stop
957+ style="stop-color:#ffffff;stop-opacity:0;"
958+ offset="1"
959+ id="stop4357" />
960+ </linearGradient>
961+ <linearGradient
962+ id="linearGradient4405">
963+ <stop
964+ id="stop4407"
965+ offset="0"
966+ style="stop-color:#000079;stop-opacity:1;" />
967+ <stop
968+ style="stop-color:#2222e4;stop-opacity:1;"
969+ offset="0.42821291"
970+ id="stop4409" />
971+ <stop
972+ style="stop-color:#2f2fff;stop-opacity:1;"
973+ offset="1"
974+ id="stop4411" />
975+ </linearGradient>
976+ <linearGradient
977+ id="linearGradient4209">
978+ <stop
979+ style="stop-color:#adadad;stop-opacity:1;"
980+ offset="0"
981+ id="stop4211" />
982+ <stop
983+ id="stop4217"
984+ offset="0.20547946"
985+ style="stop-color:#ffffff;stop-opacity:1;" />
986+ <stop
987+ style="stop-color:#f3f3f3;stop-opacity:1;"
988+ offset="0.86939389"
989+ id="stop4219" />
990+ <stop
991+ style="stop-color:#a1a1a1;stop-opacity:1;"
992+ offset="1"
993+ id="stop4213" />
994+ </linearGradient>
995+ <linearGradient
996+ id="linearGradient4152">
997+ <stop
998+ style="stop-color:#baab84;stop-opacity:1;"
999+ offset="0"
1000+ id="stop4154" />
1001+ <stop
1002+ id="stop4162"
1003+ offset="0.41"
1004+ style="stop-color:#efd9b0;stop-opacity:1;" />
1005+ <stop
1006+ style="stop-color:#efd9b0;stop-opacity:1;"
1007+ offset="0.63"
1008+ id="stop4172" />
1009+ <stop
1010+ id="stop4160"
1011+ offset="1"
1012+ style="stop-color:#d1b182;stop-opacity:1;" />
1013+ </linearGradient>
1014+ <linearGradient
1015+ id="linearGradient3960">
1016+ <stop
1017+ style="stop-color:#000079;stop-opacity:1;"
1018+ offset="0"
1019+ id="stop3962" />
1020+ <stop
1021+ id="stop3976"
1022+ offset="0.42821291"
1023+ style="stop-color:#2222e4;stop-opacity:1;" />
1024+ <stop
1025+ id="stop3972"
1026+ offset="0.51245153"
1027+ style="stop-color:#2f2fff;stop-opacity:1;" />
1028+ <stop
1029+ style="stop-color:#2222e4;stop-opacity:1;"
1030+ offset="0.69277769"
1031+ id="stop3974" />
1032+ <stop
1033+ id="stop3970"
1034+ offset="1"
1035+ style="stop-color:#000079;stop-opacity:1;" />
1036+ </linearGradient>
1037+ <filter
1038+ inkscape:collect="always"
1039+ id="filter4325"
1040+ x="-0.13787583"
1041+ width="1.2757516"
1042+ y="-0.21496767"
1043+ height="1.4299353"
1044+ color-interpolation-filters="sRGB">
1045+ <feGaussianBlur
1046+ inkscape:collect="always"
1047+ stdDeviation="2.6031241"
1048+ id="feGaussianBlur4327" />
1049+ </filter>
1050+ <filter
1051+ inkscape:collect="always"
1052+ id="filter4333"
1053+ x="-0.1405234"
1054+ width="1.2810467"
1055+ y="-0.20883325"
1056+ height="1.4176666"
1057+ color-interpolation-filters="sRGB">
1058+ <feGaussianBlur
1059+ inkscape:collect="always"
1060+ stdDeviation="2.3548649"
1061+ id="feGaussianBlur4335" />
1062+ </filter>
1063+ <linearGradient
1064+ inkscape:collect="always"
1065+ xlink:href="#linearGradient4152"
1066+ id="linearGradient4355"
1067+ gradientUnits="userSpaceOnUse"
1068+ gradientTransform="translate(-111.02408,0)"
1069+ x1="-612.53156"
1070+ y1="59.296478"
1071+ x2="-504.74637"
1072+ y2="35.961956" />
1073+ <linearGradient
1074+ inkscape:collect="always"
1075+ xlink:href="#linearGradient3960"
1076+ id="linearGradient4395"
1077+ gradientUnits="userSpaceOnUse"
1078+ x1="-765.00891"
1079+ y1="189.82812"
1080+ x2="-599.28125"
1081+ y2="202.32812" />
1082+ <linearGradient
1083+ inkscape:collect="always"
1084+ xlink:href="#linearGradient4405"
1085+ id="linearGradient4403"
1086+ x1="-637.84503"
1087+ y1="131.4231"
1088+ x2="-667.36151"
1089+ y2="102.02118"
1090+ gradientUnits="userSpaceOnUse" />
1091+ <linearGradient
1092+ inkscape:collect="always"
1093+ xlink:href="#linearGradient4405"
1094+ id="linearGradient4423"
1095+ x1="-711.73431"
1096+ y1="129.47363"
1097+ x2="-671.8609"
1098+ y2="105.68568"
1099+ gradientUnits="userSpaceOnUse"
1100+ gradientTransform="translate(780.78125,33.875)" />
1101+ <filter
1102+ inkscape:collect="always"
1103+ id="filter4527">
1104+ <feGaussianBlur
1105+ inkscape:collect="always"
1106+ stdDeviation="0.68671875"
1107+ id="feGaussianBlur4529" />
1108+ </filter>
1109+ <linearGradient
1110+ inkscape:collect="always"
1111+ xlink:href="#linearGradient4353"
1112+ id="linearGradient4359"
1113+ x1="-672.80231"
1114+ y1="160.05569"
1115+ x2="-668.28424"
1116+ y2="-155.38022"
1117+ gradientUnits="userSpaceOnUse" />
1118+ <filter
1119+ inkscape:collect="always"
1120+ id="filter4487">
1121+ <feGaussianBlur
1122+ inkscape:collect="always"
1123+ stdDeviation="0.59336139"
1124+ id="feGaussianBlur4489" />
1125+ </filter>
1126+ </defs>
1127+ <sodipodi:namedview
1128+ id="base"
1129+ pagecolor="#ffffff"
1130+ bordercolor="#666666"
1131+ borderopacity="1.0"
1132+ inkscape:pageopacity="0.0"
1133+ inkscape:pageshadow="2"
1134+ inkscape:zoom="2.0000001"
1135+ inkscape:cx="20.59042"
1136+ inkscape:cy="92.571526"
1137+ inkscape:document-units="px"
1138+ inkscape:current-layer="layer2"
1139+ showgrid="false"
1140+ inkscape:window-width="1440"
1141+ inkscape:window-height="876"
1142+ inkscape:window-x="0"
1143+ inkscape:window-y="24"
1144+ inkscape:window-maximized="1"
1145+ fit-margin-top="0"
1146+ fit-margin-left="0"
1147+ fit-margin-right="0"
1148+ fit-margin-bottom="0" />
1149+ <metadata
1150+ id="metadata7">
1151+ <rdf:RDF>
1152+ <cc:Work
1153+ rdf:about="">
1154+ <dc:format>image/svg+xml</dc:format>
1155+ <dc:type
1156+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
1157+ <dc:title></dc:title>
1158+ </cc:Work>
1159+ </rdf:RDF>
1160+ </metadata>
1161+ <g
1162+ inkscape:groupmode="layer"
1163+ id="layer2"
1164+ inkscape:label="Background"
1165+ style="display:inline">
1166+ <rect
1167+ style="fill:#eeeeee;fill-opacity:1;stroke:none"
1168+ id="rect4351"
1169+ width="209"
1170+ height="209"
1171+ x="-0.0625"
1172+ y="-0.0625"
1173+ ry="0"
1174+ rx="0"
1175+ inkscape:export-xdpi="27.559999"
1176+ inkscape:export-ydpi="27.559999" />
1177+ </g>
1178+ <g
1179+ inkscape:groupmode="layer"
1180+ id="layer9"
1181+ inkscape:label="Border"
1182+ style="display:inline"
1183+ transform="translate(780.78125,33.875)"
1184+ sodipodi:insensitive="true">
1185+ <rect
1186+ style="fill:url(#linearGradient4359);fill-opacity:1;stroke:#000000;stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
1187+ id="rect4357"
1188+ width="181.45203"
1189+ height="178.93185"
1190+ x="-767.06976"
1191+ y="-18.903431"
1192+ ry="8.9028091" />
1193+ </g>
1194+ <g
1195+ inkscape:groupmode="layer"
1196+ id="layer10"
1197+ inkscape:label="OUTLINE"
1198+ style="display:inline"
1199+ transform="translate(780.78125,33.875)"
1200+ sodipodi:insensitive="true">
1201+ <path
1202+ inkscape:connector-curvature="0"
1203+ id="path3820"
1204+ d="m -616.72707,98.1875 c 0.058,-5.040427 0.13064,-10.35401 0.15625,-15.46875 0.10603,-21.171774 1.34477,-44.946848 -3.21875,-62.03125 -8.4256,-31.542823 -21.77423,-45.075977 -42.625,-46.84375 -20.02133,-1.697445 -44.26543,16.8328579 -50.6875,48.84375 -4.33374,21.6016 -7.65516,47.195961 -9.53125,74.9375"
1205+ style="fill:none;stroke:#000000;stroke-width:2.5;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
1206+ sodipodi:nodetypes="cssssc" />
1207+ <path
1208+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2.5;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
1209+ d="m -615.62343,97.669194 -2.35133,0.50368 c -4.36434,5.104026 -14.14805,14.483626 -25.30492,22.121316 -10.87711,7.44617 -22.755,15.26479 -32.37657,22.29956 -7.85863,-7.19229 -18.75158,-16.13369 -28.0625,-24.125 -4.78898,-4.11025 -9.13985,-7.96064 -12.34375,-11.15625 -1.60195,-1.5978 -2.90735,-3.02474 -3.84375,-4.21875 -0.9364,-1.19401 -1.463,-2.19141 -1.5625,-2.625 l -0.0716,-0.531575 0.0483,-0.85767 0.11498,-1.411762 -0.78539,-0.03496 -1.71616,-0.100225 c -0.002,0.0309 -0.18177,3.061632 -0.18377,3.092432 -0.21935,3.42665 -0.44264,6.89829 -0.625,10.375 -3.06636,2.32401 -5.82862,3.79786 -8.03125,4.8125 -2.24082,1.03223 -3.82444,1.46753 -4.96875,2.46875 -4.17742,3.65507 -5.5417,9.62538 -6.78125,12.9375 -0.65462,1.74915 -1.68226,5.79916 -2.9375,11.15625 -1.25524,5.35709 -2.70833,11.91284 -4.09375,18.28125 -2.77085,12.73682 -5.25,24.71875 -5.25,24.71875 l 0,0.0312 -7.90625,45.21875 -0.25,1.375 1.375,0.0937 c 0,0 7.50914,0.55354 15.15625,1.0625 3.82355,0.25448 7.68222,0.51223 10.65625,0.65625 1.48702,0.072 2.74325,0.11042 3.6875,0.125 0.47212,0.007 0.87083,0.0126 1.1875,0 0.15834,-0.006 0.29642,-0.0141 0.4375,-0.0312 0.0731,-0.009 0.22225,-0.0439 0.3125,-0.0625 0.0288,-0.003 0.0864,-0.0242 0.1875,-0.0312 0.20231,-0.0141 0.53661,-0.0156 0.9375,-0.0312 0.80178,-0.0313 1.94648,-0.062 3.40625,-0.0937 2.68206,-0.0584 6.56829,-0.13344 10.9375,-0.1875 4.91943,21.49351 11.80009,39.25102 20.71875,51.75 9.05814,12.69446 20.33107,20.03125 33.5,20.03125 13.5725,0 23.46956,-7.4732 30.28125,-20.40625 6.71264,-12.74498 10.65113,-30.85368 13,-52.96875 l 17.78125,-2.875 1,-0.15625 0.0625,-1 1.75,-36.09375 0,-0.0312 0,-0.0312 c 0,0 -0.22108,-21.13677 -1.02968,-31.86206 -0.78956,-10.47192 0.12624,-21.98612 -4,-32.21875 -2.37086,-5.87954 -6.39833,-11.88855 -12.25,-14.9375 0.0483,-3.86334 0.19793,-7.63838 0.24464,-11.50536 l 0.0864,-3.03975 z m -2.40782,6.424556 c -0.0392,3.08304 -0.0869,6.16601 -0.125,9.25 l 0,0.78125 0.71875,0.34375 c 0.15751,0.0743 0.24125,0.10451 0.21875,0.0937 5.27976,2.52964 9.20361,8.2739 11.5,13.96875 3.82966,9.49713 3.00264,20.72747 3.8125,31.46875 0.78868,10.46046 0.87457,31.54559 0.875,31.65625 0,2.9e-4 0,0.0625 0,0.0625 l -1.6875,35.03125 -17.71875,2.875 -0.96875,0.125 -0.0937,0.96875 c -2.32001,22.41032 -6.30356,40.58244 -12.84375,53 -6.54019,12.41756 -15.38574,19.0625 -28.0625,19.0625 -12.24795,0 -22.71103,-6.69531 -31.46875,-18.96875 -8.75772,-12.27344 -15.67597,-30.10193 -20.5625,-51.84375 l -0.2188,-0.9687 -1,0 c -4.88865,0.0582 -9.03392,0.12358 -11.96875,0.1875 -1.46741,0.032 -2.63953,0.0613 -3.46875,0.0937 -0.41461,0.0162 -0.71919,0.0451 -0.96875,0.0625 -0.12478,0.009 -0.24245,0.0191 -0.34375,0.0312 -0.0507,0.006 -0.09,-0.0127 -0.15625,0 -0.0331,0.006 -0.13573,0.0494 -0.1875,0.0625 -0.0405,0.004 -0.087,-0.004 -0.1875,0 -0.23453,0.009 -0.58495,0.007 -1.03125,0 -0.89259,-0.0138 -2.15256,-0.0537 -3.625,-0.125 -2.94489,-0.14261 -6.77795,-0.37103 -10.59375,-0.625 -6.93945,-0.46186 -12.59796,-0.91052 -13.78125,-1 l 7.65625,-43.8125 0,-0.0312 c 0.006,-0.0289 2.48568,-11.94944 5.25,-24.65625 1.38384,-6.36111 2.84391,-12.91595 4.09375,-18.25 1.24984,-5.33405 2.32541,-9.54222 2.8125,-10.84375 1.34943,-3.6057 2.76401,-9.02411 6.09375,-11.9375 0.29712,-0.25997 2.04087,-1.01854 4.375,-2.09375 2.27308,-1.04709 5.19284,-2.57767 8.40625,-5 0.008,-0.006 0.0236,0.006 0.0312,0 l 0.96875,-0.1875 0.0625,-0.96875 c 0.12371,-2.41485 0.2922,-4.79243 0.4375,-7.1875 1.02923,1.3011 2.35946,2.76988 3.96875,4.375 3.29074,3.28222 7.66016,7.15417 12.46875,11.28125 9.61719,8.25417 20.99346,17.49357 28.78125,24.6875 l 0.75,0.71875 0.84375,-0.625 c 9.63842,-7.09895 22.08837,-15.18141 33.28125,-22.84375 9.80841,-6.71457 18.39374,-12.97823 23.65625,-18.21875 z"
1210+ id="path4361"
1211+ inkscape:connector-curvature="0"
1212+ sodipodi:nodetypes="ccscsssccccccccssssscccccssccccccccssscccccccsscccccccccssccccccsssccccsccccccsscccssssscccccsscccscc" />
1213+ </g>
1214+ <g
1215+ inkscape:label="Layer 1"
1216+ inkscape:groupmode="layer"
1217+ id="layer1"
1218+ style="display:none"
1219+ transform="translate(780.78125,33.875)"
1220+ sodipodi:insensitive="true">
1221+ <path
1222+ sodipodi:type="arc"
1223+ style="fill:#ffffff;fill-opacity:1;stroke:none"
1224+ id="path2985"
1225+ sodipodi:cx="189.90868"
1226+ sodipodi:cy="436.16913"
1227+ sodipodi:rx="115.15739"
1228+ sodipodi:ry="191.92899"
1229+ d="m 305.06606,436.16913 a 115.15739,191.92899 0 1 1 -230.314771,0 115.15739,191.92899 0 1 1 230.314771,0 z" />
1230+ <path
1231+ style="fill:none;stroke:#000000;stroke-width:1.13748157;stroke-opacity:1"
1232+ d="m -616.71875,98.1875 c -2.53768,-0.593458 -5.72623,-1.17399 -10,-1.6875 -4.83451,-0.580885 -10.57289,-1.069205 -16.84375,-1.5 -6.27086,-0.430795 -13.06382,-0.801274 -19.9375,-1.03125 -6.87368,-0.229976 -13.8258,-0.33407 -20.46875,-0.3125 -6.64295,0.02157 -12.98381,0.176156 -18.5625,0.5 -5.57869,0.323844 -10.41285,0.823154 -14.09375,1.5 -1.84045,0.338423 -3.38404,0.720065 -4.59375,1.15625 -0.66519,0.239845 -0.95619,0.54161 -1.40625,0.8125 -0.98179,14.51764 -1.6875,29.4323 -1.6875,45.09375 0,91.17735 21.71993,161.3125 61.90625,161.3125 40.18632,0 45.25,-66.1039 45.25,-157.28125 0,-17.28761 0.25527,-32.73878 0.4375,-48.5625 z"
1233+ id="path3827"
1234+ inkscape:connector-curvature="0" />
1235+ <image
1236+ y="-120.16854"
1237+ x="-861.54327"
1238+ id="image3817"
1239+ xlink:href="data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0a HBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIy MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAFdAmwDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDxHFGA e1LRUgNKj0pQMDig0ZoAdjNLtHpSZFGRQAmxfSjaB0FLkUZo1AWkxS0UAJijFLRRcBBxTsmm5o60 agOyaMmm807BoAMmjJowaSgBNxqQcjmmU5T8tAB+FTxJ3NNgiJG5hxUygmTA6HpQMiIOaVeT7Cph GT0HfFPuIvIEaYxI3agCuMqHf/Irf0SyRrc3MoOwc7jWRY2jX18IF4jXmQ+laWr6oFVdNtSFiA+Z h3qJXeha01ItX1f7QTBbH92vG71rIYDAIbJo27c46UmF2kd/WrSshXuO28Dil6HG3j1pdvHWrlpZ PckBQSO9DdhLUqRwmU7UG4mt3TtJ2jfKKv22mQWajaMuf0q+Y/lHpWLq30NFEhCoVxngdqbh84A4 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 "
1240+ height="349"
1241+ width="620"
1242+ style="fill:#000000;fill-opacity:1" />
1243+ </g>
1244+ <g
1245+ inkscape:groupmode="layer"
1246+ id="layer4"
1247+ inkscape:label="Shirt"
1248+ style="display:inline"
1249+ transform="translate(780.78125,33.875)"
1250+ sodipodi:insensitive="true">
1251+ <path
1252+ style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
1253+ d="m -703.06617,119.36004 c 0.64851,0.569 14.58079,17.13464 26.13769,23.73858 9.85264,-4.66371 24.80063,-14.52506 31.81981,-21.2132 l 0,-9.34391 -16.54125,-18.561556 -21.59201,-0.378808 c 0,0 -12.12183,5.303301 -12.75317,5.934647 -0.63135,0.631347 -9.34392,15.026017 -9.34392,15.026017 z"
1254+ id="path3929"
1255+ inkscape:connector-curvature="0"
1256+ sodipodi:nodetypes="ccc" />
1257+ <path
1258+ inkscape:connector-curvature="0"
1259+ id="path4221"
1260+ d="m -662.03125,94.03125 c 6.89409,8.98396 12.98109,18.08475 17.375,29.0625 11.77455,-8.0739 21.64961,-15.6645 27.90625,-21.71875 0.0129,-1.06271 0.019,-2.124273 0.0312,-3.1875 -2.53768,-0.593458 -5.72623,-1.17399 -10,-1.6875 -4.83451,-0.580885 -10.57289,-1.069205 -16.84375,-1.5 -5.82148,-0.399923 -12.1005,-0.736942 -18.46875,-0.96875 z"
1261+ style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:2.4000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline;filter:url(#filter4325)"
1262+ transform="matrix(0.93431619,0,0,1.0018765,-43.934087,-0.20372009)" />
1263+ <path
1264+ inkscape:connector-curvature="0"
1265+ id="path4271"
1266+ d="m -683.96875,93.65625 c -6.64295,0.02157 -12.98381,0.176156 -18.5625,0.5 -5.57869,0.323844 -10.41285,0.823154 -14.09375,1.5 -1.84045,0.338423 -3.38404,0.720065 -4.59375,1.15625 -0.66519,0.239845 -0.95619,0.54161 -1.40625,0.8125 -0.0638,0.943801 -0.12654,1.895031 -0.1875,2.84375 l 0.5625,1.84375 c 5.28452,7.14139 11.40665,13.00201 17.84375,18.40625 5.62167,-8.03468 13.509,-17.41872 21.8125,-27.0625 -0.45237,3.08e-4 -0.92534,-0.0015 -1.375,0 z"
1267+ style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:2.4000001;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline;filter:url(#filter4333)"
1268+ transform="matrix(0.92885398,0,0,1.0022,-48.207922,-0.41259166)" />
1269+ <path
1270+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
1271+ d="m -686.77746,99.030716 7.19733,7.576144 0,2.27284 -16.16244,25.63262 17.93021,14.52095 23.99112,-13.13199 -12.87944,-27.27411 0.25254,-2.77792 11.61675,-8.460031 -7.95495,-8.586297 c 0,0 -22.8547,-0.883884 -22.98097,-0.378807 -0.12627,0.505076 -5.3033,6.313453 -5.3033,6.313453 z"
1272+ id="path3931"
1273+ inkscape:connector-curvature="0" />
1274+ <path
1275+ style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
1276+ d="m -662.03125,94.03125 c 6.89409,8.98396 12.98109,18.08475 17.375,29.0625 11.77455,-8.0739 21.64961,-15.6645 27.90625,-21.71875 0.0129,-1.06271 0.019,-2.124273 0.0312,-3.1875 -2.53768,-0.593458 -5.72623,-1.17399 -10,-1.6875 -4.83451,-0.580885 -10.57289,-1.069205 -16.84375,-1.5 -5.82148,-0.399923 -12.1005,-0.736942 -18.46875,-0.96875 z"
1277+ id="path3890"
1278+ inkscape:connector-curvature="0" />
1279+ <path
1280+ style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
1281+ d="m -683.96875,93.65625 c -6.64295,0.02157 -12.98381,0.176156 -18.5625,0.5 -5.57869,0.323844 -10.41285,0.823154 -14.09375,1.5 -1.84045,0.338423 -3.38404,0.720065 -4.59375,1.15625 -0.66519,0.239845 -0.95619,0.54161 -1.40625,0.8125 -0.0638,0.943801 -0.12654,1.895031 -0.1875,2.84375 l 0.5625,1.84375 c 5.28452,7.14139 11.40665,13.00201 17.84375,18.40625 5.62167,-8.03468 13.509,-17.41872 21.8125,-27.0625 -0.45237,3.08e-4 -0.92534,-0.0015 -1.375,0 z"
1282+ id="path3902"
1283+ inkscape:connector-curvature="0" />
1284+ </g>
1285+ <g
1286+ inkscape:groupmode="layer"
1287+ id="layer3"
1288+ inkscape:label="Jacket"
1289+ style="display:inline"
1290+ transform="translate(780.78125,33.875)"
1291+ sodipodi:insensitive="true">
1292+ <path
1293+ style="fill:url(#linearGradient4395);fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
1294+ d="m -722.8125,100.625 c -0.23782,3.71152 -0.46333,7.45301 -0.65625,11.21875 -0.0212,0.004 -0.3125,0.0625 -0.3125,0.0625 -6.44628,4.93403 -11.65232,6.05131 -13.09375,7.3125 -3.75358,3.28423 -5.14301,8.97859 -6.4375,12.4375 -2.28342,6.10136 -12.21875,53.96875 -12.21875,53.96875 l -7.90625,45.21875 c 0,0 30.05235,2.28633 31.0625,1.78125 0.24741,-0.12371 6.94616,-0.25872 16.71875,-0.375 9.81965,43.69089 27.83312,71.78125 53.25,71.78125 26.24926,0 37.50051,-28.21494 42.15625,-73.1875 l 18.71875,-3.03125 1.75,-36.09375 c 0,0 -0.0753,-21.2059 -0.875,-31.8125 -0.79971,-10.6066 0.0717,-21.97887 -3.90625,-31.84375 -2.37011,-5.87767 -6.4096,-11.88664 -12.125,-14.625 -0.0696,-0.0333 -0.14877,-0.0607 -0.21875,-0.0937 0.0506,-4.09344 0.10679,-8.18637 0.15625,-12.28125 -9.16497,10.7183 -39.59521,28.82464 -58.96875,43.09375 -15.68187,-14.48604 -45.49374,-36.97849 -46.96875,-43.40625 l -0.125,-0.125 z"
1295+ id="path3832"
1296+ inkscape:connector-curvature="0"
1297+ sodipodi:nodetypes="cccssccccscccssccccccc" />
1298+ <path
1299+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
1300+ d="m -676.42857,144.1479 -4.28572,84.64285"
1301+ id="path3937"
1302+ inkscape:connector-curvature="0" />
1303+ </g>
1304+ <g
1305+ inkscape:groupmode="layer"
1306+ id="layer11"
1307+ inkscape:label="Lapels"
1308+ style="display:inline"
1309+ sodipodi:insensitive="true">
1310+ <path
1311+ sodipodi:nodetypes="ccccc"
1312+ inkscape:connector-curvature="0"
1313+ id="path4531"
1314+ d="m -727.68745,115.40625 c -0.35715,1.42858 3.9375,13.375 3.9375,13.375 l 10.1875,-2.3125 -0.53125,5.71875 36.65625,12.0625"
1315+ style="fill:none;stroke:#000000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline;filter:url(#filter4487)"
1316+ transform="translate(780.78125,33.875)" />
1317+ <path
1318+ style="fill:url(#linearGradient4423);fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
1319+ d="m 57.96875,134.5 c -0.23782,3.71152 -0.46333,7.45301 -0.65625,11.21875 -0.0212,0.004 -0.13572,0.41605 -0.13572,0.41605 -1.12184,1.8787 -2.68785,2.10446 -4.05178,2.3027 l -0.0312,0.84375 c -0.35715,1.42858 3.9375,13.375 3.9375,13.375 l 10.1875,-2.3125 -0.53125,5.71875 37.84375,12.5 -1.03125,-1.9375 c -16.00859,-14.49518 -43.97759,-35.77422 -45.40625,-42 l -0.125,-0.125 z"
1320+ id="path3949"
1321+ inkscape:connector-curvature="0"
1322+ sodipodi:nodetypes="ccccccccccccc" />
1323+ <path
1324+ sodipodi:nodetypes="ccccc"
1325+ inkscape:connector-curvature="0"
1326+ id="path4489"
1327+ d="m -675.81255,145.46875 44.03125,-9.71875 -4.125,-6.96875 7.34375,1.03125 c 0,0 13.12506,-9.91358 16.03125,-12.625"
1328+ style="fill:none;stroke:#050000;stroke-width:2;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline;filter:url(#filter4527)"
1329+ transform="translate(780.78125,33.875)" />
1330+ <path
1331+ style="fill:url(#linearGradient4403);fill-opacity:1;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;display:inline"
1332+ d="m -616.75,101.0625 c -9.15105,10.70202 -39.49742,28.7722 -58.875,43.03125 0.0498,0.77118 0.0937,1.3125 0.0937,1.3125 l 43.75,-9.65625 -4.125,-6.96875 7.875,0.53125 c 0,0 13.12506,-9.91358 16.03125,-12.625 -1.41222,-1.31695 -2.97429,-2.42917 -4.6875,-3.25 -0.0696,-0.0333 -0.14877,-0.0607 -0.21875,-0.0937 0.0506,-4.09344 0.10679,-8.18637 0.15625,-12.28125 z"
1333+ id="path3954"
1334+ inkscape:connector-curvature="0"
1335+ sodipodi:nodetypes="ccccccccccc"
1336+ transform="translate(780.78125,33.875)" />
1337+ </g>
1338+ <g
1339+ inkscape:groupmode="layer"
1340+ id="layer6"
1341+ inkscape:label="Pockets"
1342+ style="display:inline"
1343+ sodipodi:insensitive="true"
1344+ transform="translate(780.78125,33.875)">
1345+ <path
1346+ sodipodi:type="arc"
1347+ style="fill:#e9cc00;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
1348+ id="path3979"
1349+ sodipodi:cx="-668.57141"
1350+ sodipodi:cy="152.00504"
1351+ sodipodi:rx="6.7857141"
1352+ sodipodi:ry="6.7857141"
1353+ d="m -661.7857,152.00504 a 6.7857141,6.7857141 0 1 1 -13.57143,0 6.7857141,6.7857141 0 1 1 13.57143,0 z"
1354+ transform="translate(1.7857143,2.5)" />
1355+ <path
1356+ transform="translate(2.1428572,36.071429)"
1357+ d="m -661.7857,152.00504 a 6.7857141,6.7857141 0 1 1 -13.57143,0 6.7857141,6.7857141 0 1 1 13.57143,0 z"
1358+ sodipodi:ry="6.7857141"
1359+ sodipodi:rx="6.7857141"
1360+ sodipodi:cy="152.00504"
1361+ sodipodi:cx="-668.57141"
1362+ id="path3981"
1363+ style="fill:#e9cc00;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
1364+ sodipodi:type="arc" />
1365+ <path
1366+ sodipodi:type="arc"
1367+ style="fill:#e9cc00;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
1368+ id="path3983"
1369+ sodipodi:cx="-668.57141"
1370+ sodipodi:cy="152.00504"
1371+ sodipodi:rx="6.7857141"
1372+ sodipodi:ry="6.7857141"
1373+ d="m -661.7857,152.00504 a 6.7857141,6.7857141 0 1 1 -13.57143,0 6.7857141,6.7857141 0 1 1 13.57143,0 z"
1374+ transform="translate(-1.7857142,69.285715)" />
1375+ <path
1376+ transform="matrix(0.70655966,0.25840673,-0.29363271,0.97639336,-212.05267,194.87534)"
1377+ d="m -661.7857,152.00504 a 6.7857141,6.7857141 0 1 1 -13.57143,0 6.7857141,6.7857141 0 1 1 13.57143,0 z"
1378+ sodipodi:ry="6.7857141"
1379+ sodipodi:rx="6.7857141"
1380+ sodipodi:cy="152.00504"
1381+ sodipodi:cx="-668.57141"
1382+ id="path3985"
1383+ style="fill:#e9cc00;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
1384+ sodipodi:type="arc" />
1385+ <path
1386+ sodipodi:type="arc"
1387+ style="fill:#e9cc00;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
1388+ id="path3987"
1389+ sodipodi:cx="-668.57141"
1390+ sodipodi:cy="152.00504"
1391+ sodipodi:rx="6.7857141"
1392+ sodipodi:ry="6.7857141"
1393+ d="m -661.7857,152.00504 a 6.7857141,6.7857141 0 1 1 -13.57143,0 6.7857141,6.7857141 0 1 1 13.57143,0 z"
1394+ transform="matrix(0.81549352,-0.26317118,0.30949302,0.95903192,-124.41464,-150.19904)" />
1395+ <path
1396+ transform="translate(46.785715,1.0714291)"
1397+ d="m -661.7857,152.00504 a 6.7857141,6.7857141 0 1 1 -13.57143,0 6.7857141,6.7857141 0 1 1 13.57143,0 z"
1398+ sodipodi:ry="6.7857141"
1399+ sodipodi:rx="6.7857141"
1400+ sodipodi:cy="152.00504"
1401+ sodipodi:cx="-668.57141"
1402+ id="path3989"
1403+ style="fill:#e9cc00;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
1404+ sodipodi:type="arc" />
1405+ <path
1406+ style="fill:#e9cc00;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
1407+ d="m -625.44965,145.16422 c -9.39592,-2.18626 -17.24774,-1.58188 -18.12991,1.55251 -0.90027,3.19877 5.7707,7.91155 15.23027,10.94168 -2.31651,-1.60339 -3.49238,-4.54742 -2.68636,-7.41123 0.75759,-2.69177 3.05519,-4.55161 5.66399,-4.8987 -0.0254,-0.0616 -0.0516,-0.12303 -0.078,-0.18427 z m -2.89964,12.49419 c 0.28204,0.19523 0.58478,0.35833 0.89485,0.51156 0.055,-0.0627 0.12578,-0.11283 0.17959,-0.1767 -0.36001,-0.10646 -0.72252,-0.22216 -1.07447,-0.33482 z"
1408+ id="path4007"
1409+ inkscape:connector-curvature="0"
1410+ inkscape:transform-center-x="-2.5853235"
1411+ inkscape:transform-center-y="0.44000754" />
1412+ <path
1413+ inkscape:transform-center-y="-1.4992131"
1414+ inkscape:transform-center-x="3.552808"
1415+ inkscape:connector-curvature="0"
1416+ id="path4016"
1417+ d="m -619.95787,161.12285 c 8.50992,4.54361 16.25062,5.99202 17.91397,3.19276 1.69749,-2.85677 -3.52641,-9.13554 -11.8794,-14.51074 1.82259,2.14832 2.19642,5.29637 0.67666,7.85398 -1.42846,2.40397 -4.12913,3.60578 -6.73887,3.26584 0.009,0.0661 0.018,0.13219 0.0276,0.19817 z m 6.03457,-11.31798 c -0.2219,-0.26157 -0.47211,-0.49747 -0.73196,-0.72573 -0.0693,0.0463 -0.15069,0.0764 -0.2192,0.1242 0.32019,0.19601 0.6404,0.40159 0.9512,0.6015 z"
1418+ style="fill:#e9cc00;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
1419+ <path
1420+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
1421+ d="m -742.14286,165.21932 c -0.47207,-6.40638 31.78572,-8.57142 31.78572,-8.57142 -1.53213,16.48994 -2.18962,49.88961 -4.64286,48.57142 -11.30952,-1.47343 -22.61905,0.39292 -33.92857,0.71429 2.31629,-13.08196 4.77848,-24.85076 6.78571,-40.71429 z"
1422+ id="path4018"
1423+ inkscape:connector-curvature="0"
1424+ sodipodi:nodetypes="ccccc" />
1425+ <path
1426+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
1427+ d="m -744.73214,182.00504 c 1.89781,-3.07732 33.13843,-6.04866 32.85714,-5.53572"
1428+ id="path4020"
1429+ inkscape:connector-curvature="0"
1430+ sodipodi:nodetypes="cc" />
1431+ <path
1432+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
1433+ d="m -726.46383,177.75948 c 1.18007,10.22515 0.37851,18.46867 -0.26517,26.87006"
1434+ id="path4022"
1435+ inkscape:connector-curvature="0"
1436+ sodipodi:nodetypes="cc" />
1437+ <path
1438+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
1439+ d="m -735.833,178.99692 c -2.46269,9.37087 -3.50992,17.79809 -4.59619,26.25134"
1440+ id="path4024"
1441+ inkscape:connector-curvature="0"
1442+ sodipodi:nodetypes="cc" />
1443+ <path
1444+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
1445+ d="m -643.25,158.48718 c 0.31714,21.93999 0.42492,40.9489 -0.25,49 l 41.875,1.125 -6.125,-41.25 c -14.46374,-6.3981 -25.32133,-8.08046 -35.5,-8.875 z"
1446+ id="path4026"
1447+ inkscape:connector-curvature="0"
1448+ sodipodi:nodetypes="ccccc" />
1449+ <path
1450+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
1451+ d="m -643.2904,179.18366 c 9.3394,0.0868 14.46508,-1.224 38.00699,5.65685"
1452+ id="path4028"
1453+ inkscape:connector-curvature="0"
1454+ sodipodi:nodetypes="cc" />
1455+ </g>
1456+ <g
1457+ inkscape:groupmode="layer"
1458+ id="layer5"
1459+ inkscape:label="Head"
1460+ style="display:inline"
1461+ transform="translate(780.78125,33.875)"
1462+ sodipodi:insensitive="true">
1463+ <path
1464+ style="fill:url(#linearGradient4355);fill-opacity:1;stroke:#000000;stroke-width:1.13699996;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
1465+ d="m -662.41457,-26.15625 c -20.02133,-1.697445 -44.26543,16.8328579 -50.6875,48.84375 -4.33374,21.6016 -7.65516,47.195961 -9.53125,74.9375 0.45006,-0.27089 0.74106,-0.572655 1.40625,-0.8125 1.20971,-0.436185 2.7533,-0.817827 4.59375,-1.15625 3.6809,-0.676846 8.51506,-1.176156 14.09375,-1.5 5.57869,-0.323844 11.91955,-0.47843 18.5625,-0.5 6.64295,-0.02157 13.59507,0.08252 20.46875,0.3125 6.87368,0.229976 13.66664,0.600455 19.9375,1.03125 6.27086,0.430795 12.00924,0.919115 16.84375,1.5 4.27377,0.51351 7.46232,1.094042 10,1.6875 0.058,-5.040427 0.13064,-10.35401 0.15625,-15.46875 0.10603,-21.171774 1.34477,-44.946848 -3.21875,-62.03125 -8.4256,-31.542823 -21.77423,-45.075977 -42.625,-46.84375 z"
1466+ inkscape:connector-curvature="0"
1467+ id="path3542" />
1468+ </g>
1469+ <g
1470+ inkscape:groupmode="layer"
1471+ id="layer7"
1472+ inkscape:label="face"
1473+ style="display:inline"
1474+ transform="translate(780.78125,33.875)"
1475+ sodipodi:insensitive="true">
1476+ <path
1477+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:3.5;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
1478+ d="m -671.1875,8.90625 c -0.89032,-0.040798 -1.78723,-0.014926 -2.6875,0.0625 -3.6011,0.3097026 -6.88202,2.074454 -9.46875,1.84375 -0.95729,-0.184138 -2.09451,-0.194656 -2.51121,0.686631 -0.39996,0.845905 0.78643,1.917196 1.76121,1.907119 3.54186,0.31589 7.34437,-0.663421 10.53125,-0.9375 1.59344,-0.13704 2.99942,-0.08568 4.03125,0.21875 1.03183,0.304435 1.68131,0.751495 2.25,1.78125 0.41675,0.846154 1.58861,1.214779 2.41472,0.759579 0.8261,-0.4552 1.14047,-1.642772 0.64778,-2.447079 -0.99906,-1.809055 -2.62522,-2.9617114 -4.34375,-3.46875 -0.85926,-0.2535193 -1.73468,-0.365452 -2.625,-0.40625 z"
1479+ id="path4061"
1480+ inkscape:connector-curvature="0"
1481+ sodipodi:nodetypes="sscscsscscss" />
1482+ <path
1483+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:3;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
1484+ d="m -645.53125,12.03125 c -1.78351,0.100545 -3.78806,0.463826 -6.03125,1.21875 -0.74455,0.253572 -1.19124,1.161759 -0.93761,1.906289 0.25363,0.744529 1.16185,1.191152 1.90636,0.937461 8.12636,-2.73485 10.23591,-1.656492 13.3125,0.1875 0.67904,0.400956 2.50545,1.460389 3.25011,0.937562 0.64539,-0.453138 0.14775,-1.661716 -0.53136,-2.062562 -2.20052,-1.318907 -5.61823,-3.426636 -10.96875,-3.125 z"
1485+ id="path4063"
1486+ inkscape:connector-curvature="0"
1487+ sodipodi:nodetypes="scsccscs" />
1488+ <path
1489+ sodipodi:nodetypes="cccc"
1490+ inkscape:connector-curvature="0"
1491+ id="path4071"
1492+ d="m -667.15525,18.39529 c -3.79363,-4.23908 -9.17091,-2.67148 -14.31891,-1.944544 1.96292,4.912985 10.05982,4.247803 10.07627,3.889087 1.84381,-0.350766 3.16232,-1.065208 4.24264,-1.944543 z"
1493+ style="fill:#ffffff;fill-opacity:1;stroke:#fdfdfd;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" />
1494+ <path
1495+ style="fill:#ffffff;fill-opacity:1;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
1496+ d="m -648.04608,21.991392 c -0.0923,0.45969 9.14757,4.672771 12.447,-0.743459 -3.36055,-2.474374 -9.69864,-4.641281 -14.38566,-1.365742 0.52932,0.872692 1.06816,1.734273 1.94347,2.203311"
1497+ id="path4069"
1498+ inkscape:connector-curvature="0"
1499+ sodipodi:nodetypes="cccc" />
1500+ <path
1501+ transform="translate(31.201087,-15.379572)"
1502+ d="m -671.39791,36.5149 a 2.6516504,2.3864853 0 1 1 -5.3033,0 2.6516504,2.3864853 0 1 1 5.3033,0 z"
1503+ sodipodi:ry="2.3864853"
1504+ sodipodi:rx="2.6516504"
1505+ sodipodi:cy="36.5149"
1506+ sodipodi:cx="-674.04956"
1507+ id="path4075"
1508+ style="fill:#7b7bd2;fill-opacity:1;stroke:#46498c;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
1509+ sodipodi:type="arc" />
1510+ <path
1511+ sodipodi:nodetypes="ccc"
1512+ inkscape:connector-curvature="0"
1513+ id="path4067"
1514+ d="m -649.98474,19.882191 c 4.68702,-3.275539 11.02511,-1.108632 14.38566,1.365742 -3.29943,5.41623 -12.53929,1.203149 -12.447,0.743459"
1515+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" />
1516+ <path
1517+ sodipodi:type="arc"
1518+ style="fill:#7b7bd2;fill-opacity:1;stroke:#46498c;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
1519+ id="path4073"
1520+ sodipodi:cx="-674.04956"
1521+ sodipodi:cy="36.5149"
1522+ sodipodi:rx="2.6516504"
1523+ sodipodi:ry="2.3864853"
1524+ d="m -671.39791,36.5149 a 2.6516504,2.3864853 0 1 1 -5.3033,0 2.6516504,2.3864853 0 1 1 5.3033,0 z"
1525+ transform="translate(0.1767767,-18.384776)" />
1526+ <path
1527+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
1528+ d="m -667.15525,18.39529 c -3.79363,-4.23908 -9.17091,-2.67148 -14.31891,-1.944544 1.96292,4.912985 10.05982,4.247803 10.07627,3.889087"
1529+ id="path4065"
1530+ inkscape:connector-curvature="0"
1531+ sodipodi:nodetypes="ccc" />
1532+ <path
1533+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
1534+ d="m -666.375,31.73718 c -0.75919,0.869239 3.33429,4.159018 5,2.9375 3.70337,2.517825 7.91047,1.437455 10.33081,0.186199"
1535+ id="path4077"
1536+ inkscape:connector-curvature="0"
1537+ sodipodi:nodetypes="ccc" />
1538+ <path
1539+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1"
1540+ d="m -662.125,29.29968 c -0.37788,1.797111 -0.22606,3.140196 0.5625,3.9375"
1541+ id="path4079"
1542+ inkscape:connector-curvature="0"
1543+ sodipodi:nodetypes="cc" />
1544+ <path
1545+ style="fill:none;stroke:#000000;stroke-width:1.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
1546+ d="m -674.40309,41.553036 c -0.54294,2.123449 -0.93863,3.610086 -0.0884,5.038136"
1547+ id="path4081"
1548+ inkscape:connector-curvature="0"
1549+ sodipodi:nodetypes="cc" />
1550+ <path
1551+ style="fill:none;stroke:#000000;stroke-width:1.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
1552+ d="m -643.9975,43.055638 c 1.03181,1.41474 0.59203,6.341084 0,5.833631"
1553+ id="path4083"
1554+ inkscape:connector-curvature="0"
1555+ sodipodi:nodetypes="cc" />
1556+ <path
1557+ style="fill:none;stroke:#000000;stroke-width:1.60000002;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
1558+ d="m -674.49148,43.674357 c 14.40474,3.532037 25.24649,1.750322 31.20108,2.386486"
1559+ inkscape:connector-curvature="0"
1560+ sodipodi:nodetypes="cc"
1561+ id="path3559" />
1562+ <path
1563+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#000000;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
1564+ d="m -663.90625,49.84375 c -0.4689,-0.01289 -0.92022,0.349152 -1.00935,0.809682 -0.0891,0.460529 0.1945,0.964819 0.63435,1.127818 3.59907,1.488705 6.08305,2.002233 8.03125,1.875 1.9482,-0.127233 3.30642,-0.948413 4.34375,-1.75 0.41737,-0.327204 0.49934,-1.004709 0.17205,-1.42201 -0.3273,-0.4173 -1.00482,-0.499124 -1.42205,-0.17174 -0.9211,0.711768 -1.59619,2.086132 -3.08617,2.183439 -1.48998,0.09731 -3.84906,-1.135629 -7.28883,-2.558439 -0.11734,-0.05516 -0.2455,-0.0872 -0.375,-0.09375 z"
1565+ id="path4087"
1566+ inkscape:connector-curvature="0"
1567+ sodipodi:nodetypes="cscscscscc" />
1568+ </g>
1569+ <g
1570+ inkscape:groupmode="layer"
1571+ id="layer8"
1572+ inkscape:label="Hair"
1573+ style="display:inline"
1574+ sodipodi:insensitive="true"
1575+ transform="translate(780.78125,33.875)">
1576+ <path
1577+ style="fill:#6b5323;fill-opacity:1;stroke:#000000;stroke-width:1.13748157;stroke-opacity:1;display:inline"
1578+ d="m -666.21875,-26.25 c -19.18412,0.754376 -40.85431,18.9272887 -46.875,48.9375 -0.15747,0.784929 -0.31397,1.610866 -0.46875,2.40625 l 4.8125,-6.71875 1,5.25 4.5,-3.75 -0.5,-4.25 1.5,-1.25 0.25,-4.25 1.75,0.25 -0.5,-6 1.75,0.5 0,-5.5 9.5,-9.75 21.25,4.25 6.75,-1.25 25.75,3 5.5,2.25 11.75,29.25 0.125,0 c -0.39348,-2.236122 -0.85648,-4.379334 -1.40625,-6.4375 -8.4256,-31.542823 -21.77423,-45.075977 -42.625,-46.84375 -1.25133,-0.10609 -2.53356,-0.144042 -3.8125,-0.09375 z"
1579+ id="path4175"
1580+ inkscape:connector-curvature="0" />
1581+ </g>
1582+ <g
1583+ inkscape:groupmode="layer"
1584+ id="layer12"
1585+ inkscape:label="Foreground"
1586+ style="display:inline">
1587+ <path
1588+ style="fill:#eeeeee;fill-opacity:1;stroke:none"
1589+ d="m -0.0625,72.9375 0,136 209,0 0,-136 -13.78125,0 0,112.0625 c 0,4.93216 -3.97409,8.90625 -8.90625,8.90625 l -163.625,0 c -4.932156,0 -8.90625,-3.97409 -8.90625,-8.90625 l 0,-112.0625 -13.78125,0 z"
1590+ id="rect4382"
1591+ inkscape:connector-curvature="0" />
1592+ <path
1593+ style="fill:none;stroke:#000000;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
1594+ d="m 13.71875,72.9375 0,112.0625 c 0,4.93216 3.974094,8.90625 8.90625,8.90625 l 163.625,0 c 4.93216,0 8.90625,-3.97409 8.90625,-8.90625 l 0,-112.0625"
1595+ id="rect4394"
1596+ inkscape:connector-curvature="0"
1597+ sodipodi:nodetypes="cssssc" />
1598+ </g>
1599+</svg>

Subscribers

People subscribed via source and target branches