Commit df70a8d7 authored by Cage, Marshall Andrew's avatar Cage, Marshall Andrew
Browse files

Add misc image stuff

Refactor plugin loading to keep track of packages
Break preferenece dialog due to refactored plugin loading(?)
parent d037e6f9
...@@ -133,9 +133,9 @@ class Profile(): ...@@ -133,9 +133,9 @@ class Profile():
sections = [] sections = []
for i in range(len(self.sections)): for i in range(len(self.sections)):
title = self.listWidget.item(i).text() title = self.listWidget.item(i).text()
toc += "\t<section title=\"%s\" pos=%d/>\n" %(title,i) toc += '\t<section title="%s" pos=%d/>\n' %(title,i)
sections.append(self.sections[self.sectionTitles[title]]) sections.append(self.sections[self.sectionTitles[title]])
toc = "<contents>\n%s</contents>\n" %(toc) toc = '<contents>\n%s</contents>\n' %(toc)
return (toc, sections) return (toc, sections)
class Section(): class Section():
...@@ -175,11 +175,11 @@ class Section(): ...@@ -175,11 +175,11 @@ class Section():
def serialise(self): def serialise(self):
if self.plugin is None: if self.plugin is None:
return "<section title=\"%s\" plugin=\"None\" showTitle=%d/>\n"\ return ('<section title="%s" plugin="None" showTitle=%d/>\n'
%(self.title,1 if self.showTitle else 0) %(self.title,1 if self.showTitle else 0))
return ("<section title=\"%s\" plugin=\"%s\" showTitle=%d>\n\t%s</sec"\ return ('<section title="%s" plugin="%s" showTitle=%d>\n\t%s</sec'
"tion>\n") %(self.title, self.plugin.__name__, 'tion>\n') %(self.title, self.plugin.__name__,
1 if self.showTitle else 0, self.plugin.serialise()) 1 if self.showTitle else 0, self.plugin.serialise())
class Package(): class Package():
...@@ -193,7 +193,7 @@ class Package(): ...@@ -193,7 +193,7 @@ class Package():
self.sources = [] self.sources = []
loader = importlib.machinery.SourceFileLoader( loader = importlib.machinery.SourceFileLoader(
"package",os.path.join(path,"__init__.py") str(path.__hash__()),os.path.join(path,"__init__.py")
) )
package = loader.load_module() package = loader.load_module()
self.pluginNames = package.__all__ self.pluginNames = package.__all__
...@@ -237,7 +237,7 @@ class Package(): ...@@ -237,7 +237,7 @@ class Package():
path = os.path.join(self.path, name) path = os.path.join(self.path, name)
loader = importlib.machinery.SourceFileLoader( loader = importlib.machinery.SourceFileLoader(
name + "MOD",path + ".py" name + "MOD_" + self.name,path + ".py"
) )
# try: # try:
plugin = loader.load_module() plugin = loader.load_module()
...@@ -543,8 +543,8 @@ class TimeContext(Context): ...@@ -543,8 +543,8 @@ class TimeContext(Context):
self.ui.timeBegin.setMaximumTime(QTime(23,59,59,999)) self.ui.timeBegin.setMaximumTime(QTime(23,59,59,999))
def callback(self,content): def callback(self,content):
#If the content got this far, we'd better hope it meshes with this context # If the content got this far, we'd better hope it meshes with this
# Content in this Context should implement "getTime" # context. Content in this Context should implement "getTime"
# if content.getTime is None # if content.getTime is None
valid = True valid = True
time = content.getTime() time = content.getTime()
...@@ -593,7 +593,7 @@ class TimeContext(Context): ...@@ -593,7 +593,7 @@ class TimeContext(Context):
def PackOptions(opts): def PackOptions(opts):
pack = '' pack = ''
for k in opts: for k in opts:
pack += "<opt key=\"%s\" value=\"%s\" property=\"%s\" type=\"%s\"/>\n"\ pack += '<opt key="%s" value="%s" property="%s" type="%s"/>\n'\
%(k,str(opts[k][0]).replace('"','\\"'),opts[k][1], %(k,str(opts[k][0]).replace('"','\\"'),opts[k][1],
type(opts[k][0]).__name__) type(opts[k][0]).__name__)
return pack return pack
...@@ -601,6 +601,6 @@ def PackOptions(opts): ...@@ -601,6 +601,6 @@ def PackOptions(opts):
def packExtras(extras): def packExtras(extras):
pack = '' pack = ''
for k in extras: for k in extras:
pack += "<extra key=\"%s\" value=\"%s\"/>\n"\ pack += '<extra key="%s" value="%s"/>\n'\
%(k,str(extras[k]).replace('"','\\"')) %(k,str(extras[k]).replace('"','\\"'))
return pack return pack
\ No newline at end of file
...@@ -12,8 +12,13 @@ class PluginSelectDialog(QDialog): ...@@ -12,8 +12,13 @@ class PluginSelectDialog(QDialog):
# works for now, and this memo exists, so it can be taken care of later. # works for now, and this memo exists, so it can be taken care of later.
parent = None parent = None
ui = None ui = None
packages = None # Holds package objects. Real name is p.name, nice name is p.getName()
pluginInfo = None # Indices are numbers
packageInfo = {}
packageIndices = {}
# Holds plugin objects. Real name is p.name, nice name is p.getName()
# Indices are package real names -> plugin real names
pluginInfo = {}
__init = False __init = False
def __init__(self,parent): def __init__(self,parent):
...@@ -24,7 +29,6 @@ class PluginSelectDialog(QDialog): ...@@ -24,7 +29,6 @@ class PluginSelectDialog(QDialog):
PluginSelectDialog.ui.setupUi(self) PluginSelectDialog.ui.setupUi(self)
PluginSelectDialog.parent = parent PluginSelectDialog.parent = parent
PluginSelectDialog.updateModuleList()
PluginSelectDialog.ui.packageList.currentItemChanged.connect( PluginSelectDialog.ui.packageList.currentItemChanged.connect(
PluginSelectDialog.updatePluginList PluginSelectDialog.updatePluginList
) )
...@@ -33,33 +37,49 @@ class PluginSelectDialog(QDialog): ...@@ -33,33 +37,49 @@ class PluginSelectDialog(QDialog):
) )
self.setWindowTitle("Select Plugin") self.setWindowTitle("Select Plugin")
PluginSelectDialog.pluginInfo = {} # PluginSelectDialog.updatePackageList()
PluginSelectDialog.updatePluginList() PluginSelectDialog.updatePluginList()
PluginSelectDialog.ui.packageList.setCurrentRow(0) PluginSelectDialog.ui.packageList.setCurrentRow(0)
PluginSelectDialog.__init = True PluginSelectDialog.__init = True
# Update packageInfo with packages and add their nice names to the list
# Also map the real names to the indices in the info list
# Also create an entry in the pluginInfo list for each package's plugins
@staticmethod @staticmethod
def updateModuleList(): def updatePackageList():
PluginSelectDialog.packages = sorted(PluginSelectDialog.parent.packages) print(PluginSelectDialog.parent.packages)
PluginSelectDialog.packageInfo = sorted(
PluginSelectDialog.parent.packages)
PluginSelectDialog.ui.packageList.clear() PluginSelectDialog.ui.packageList.clear()
PluginSelectDialog.ui.packageList.addItems( PluginSelectDialog.packageIndices = {}
[p.getName() for p in PluginSelectDialog.packages] for p in PluginSelectDialog.packageInfo:
) PluginSelectDialog.packageIndices[p.name] = len(
PluginSelectDialog.packageIndices)
PluginSelectDialog.pluginInfo[p.name] = []
PluginSelectDialog.ui.packageList.addItems(p.getName())
# Load all plugins and store them according to their package
@staticmethod @staticmethod
def updatePluginInfo(): def updatePluginInfo():
for p in PluginSelectDialog.packages: for p in PluginSelectDialog.packageInfo:
for m in p.getPluginNames(): for m in p.getPluginNames():
if not m in PluginSelectDialog.pluginInfo: if not m in PluginSelectDialog.pluginInfo[p.name]:
plugin = p.newPlugin(m,True) plugin = p.newPlugin(m,True)
if plugin is not None: if plugin is not None:
PluginSelectDialog.pluginInfo[m] = plugin PluginSelectDialog.pluginInfo[p.name][m] = plugin
PluginSelectDialog.pluginInfo[plugin.getName()] =plugin (PluginSelectDialog.pluginInfo[p.name]
[plugin.getName()]) = plugin
#HEY I JUST STARTED APPENDING PACKAGE NAMES TO PLUGINS IN PLUGIN INFO BUT THIS
#ISN"T THE BEST WAY< TAKE CARE OF IT.
# Update the plugin list widget to contain the selected package's plugins
@staticmethod @staticmethod
def updatePluginList(): def updatePluginList():
if PluginSelectDialog.ui.packageList.currentItem() is None: return; if PluginSelectDialog.ui.packageList.currentItem() is None: return;
index_ = PluginSelectDialog.ui.packageList.currentIndex().row() index_ = PluginSelectDialog.ui.packageList.currentIndex().row()
package = PluginSelectDialog.packageInfo[index_]
PluginSelectDialog.updatePluginInfo() PluginSelectDialog.updatePluginInfo()
...@@ -67,8 +87,8 @@ class PluginSelectDialog(QDialog): ...@@ -67,8 +87,8 @@ class PluginSelectDialog(QDialog):
PluginSelectDialog.ui.pluginList.addItems( PluginSelectDialog.ui.pluginList.addItems(
[ [
PluginSelectDialog.pluginInfo[m].getName() PluginSelectDialog.pluginInfo[m].getName()
for m in PluginSelectDialog.packages[index_].getPluginNames() for m in package.getPluginNames()
if m in PluginSelectDialog.pluginInfo if m in PluginSelectDialog.pluginInfo[package.name]
] ]
) )
PluginSelectDialog.ui.pluginList.setCurrentRow(0) PluginSelectDialog.ui.pluginList.setCurrentRow(0)
...@@ -78,19 +98,20 @@ class PluginSelectDialog(QDialog): ...@@ -78,19 +98,20 @@ class PluginSelectDialog(QDialog):
if PluginSelectDialog.ui.pluginList.currentItem() is None: return; if PluginSelectDialog.ui.pluginList.currentItem() is None: return;
index_ = PluginSelectDialog.ui.packageList.currentIndex().row() index_ = PluginSelectDialog.ui.packageList.currentIndex().row()
name = sorted(PluginSelectDialog.packages[index_].getPluginNames()) package = PluginSelectDialog.packageInfo[index_]
name = name[PluginSelectDialog.ui.pluginList.currentIndex().row()] names = sorted(package.getPluginNames())
name = names[PluginSelectDialog.ui.pluginList.currentIndex().row()]
# Failsafe # Failsafe
# plugin = None # plugin = None
# if not name in PluginSelectDialog.pluginInfo: # if not name in PluginSelectDialog.pluginInfo:
# plugin = PluginSelectDialog.packages[index_].newPlugin(name,True) # plugin = PluginSelectDialog.packageInfo[index_].newPlugin(name,True)
# PluginSelectDialog.pluginInfo[name] = plugin # PluginSelectDialog.pluginInfo[name] = plugin
# else: # else:
if name not in PluginSelectDialog.pluginInfo: if name not in PluginSelectDialog.pluginInfo[package.name]:
return return
plugin = PluginSelectDialog.pluginInfo[name] plugin = PluginSelectDialog.pluginInfo[package.name][name]
PluginSelectDialog.ui.name.setText(plugin.getName()) PluginSelectDialog.ui.name.setText(plugin.getName())
PluginSelectDialog.ui.version.setText(plugin.getVersion()) PluginSelectDialog.ui.version.setText(plugin.getVersion())
...@@ -99,48 +120,73 @@ class PluginSelectDialog(QDialog): ...@@ -99,48 +120,73 @@ class PluginSelectDialog(QDialog):
return return
# Return the nice name of the currently selected plugin
def getCurrentPluginName(self): def getCurrentPluginName(self):
return self.ui.pluginList.currentItem().text() return self.ui.pluginList.currentItem().text()
# Return the nice name of the currently selected package
def getCurrentPackageName(self): def getCurrentPackageName(self):
return self.ui.packageList.currentItem().text() return self.ui.packageList.currentItem().text()
# Returns a full plugin object of the currently selected plugin
def getCurrentPlugin(self): def getCurrentPlugin(self):
index_ = self.ui.packageList.currentIndex().row() index_ = self.ui.packageList.currentIndex().row()
name = sorted(self.packages[index_].getPluginNames()) package = self.packageInfo[index_]
name = name[self.ui.pluginList.currentIndex().row()] names = sorted(package.getPluginNames())
return self.packages[index_].newPlugin(name) name = names[self.ui.pluginList.currentIndex().row()]
return package.newPlugin(name)
# Returns a list of nice names for every package
# Returns a list of real names for every package
@staticmethod @staticmethod
def getPackageNames(): def getPackageNames(real=False):
return [p.getName() for p in PluginSelectDialog.packages] if real:
print('realll')
print([p.name for p in PluginSelectDialog.packageInfo])
return [p.name for p in PluginSelectDialog.packageInfo]
else:
return [p.getName() for p in PluginSelectDialog.packageInfo]
# Returns a list of plugin nice names given a package nice or real name
# If you want the real names, get them from a package object
@staticmethod @staticmethod
def getPluginNames(package): def getPluginNames(package,real=False):
print(package) print(package)
if real and package in PluginSelectDialog.packageIndices:
return PluginSelectDialog.packageInfo[
PluginSelectDialog.packageIndices[package]
].getPluginNames()
index_ = PluginSelectDialog.ui.packageList.findItems( index_ = PluginSelectDialog.ui.packageList.findItems(
package,Qt.MatchFixedString package,Qt.MatchFixedString
) )
if len(index_) > 0: if len(index_) > 0:
index_ = PluginSelectDialog.ui.packageList.row(index_[0]) index_ = PluginSelectDialog.ui.packageList.row(index_[0])
names = [] names = []
for m in PluginSelectDialog.packages[index_].getPluginNames(): for m in PluginSelectDialog.packageInfo[index_].getPluginNames():
if m in PluginSelectDialog.pluginInfo: if m in PluginSelectDialog.pluginInfo:
names.append(PluginSelectDialog.pluginInfo[m].getName()) names.append(PluginSelectDialog.pluginInfo[m].getName())
return names return names
# Returns a package item given its nice or real name
@staticmethod @staticmethod
def getPackage(package): def getPackage(package,real=False):
if real and package in PluginSelectDialog.packageIndices:
return PluginSelectDialog.packageInfo[
PluginSelectDialog.packageIndices[package]
]
index_ = PluginSelectDialog.ui.packageList.findItems( index_ = PluginSelectDialog.ui.packageList.findItems(
package,Qt.MatchFixedString package,Qt.MatchFixedString
) )
if len(index_) > 0: if len(index_) > 0:
index_ = PluginSelectDialog.ui.packageList.row(index_[0]) index_ = PluginSelectDialog.ui.packageList.row(index_[0])
return PluginSelectDialog.packages[index_] return PluginSelectDialog.packageInfo[index_]
# Returns a plugin item by providing it's real package name and real name
# The returned object has no ui widget
@staticmethod @staticmethod
def getPluginInfo(package,plugin): def getPluginInfo(package,plugin):
return PluginSelectDialog.pluginInfo[plugin] return PluginSelectDialog.pluginInfo[package][plugin]
class LoginDialog(QDialog): class LoginDialog(QDialog):
credentials = pyqtSignal([str, str]) credentials = pyqtSignal([str, str])
......
...@@ -26,13 +26,15 @@ class PreferenceManager(QDialog): ...@@ -26,13 +26,15 @@ class PreferenceManager(QDialog):
PreferenceManager.ui.treeWidget.currentItemChanged.connect( PreferenceManager.ui.treeWidget.currentItemChanged.connect(
PreferenceManager.updateForm PreferenceManager.updateForm
) )
for k in sorted(PSD.getPackageNames()): print('a')
for k in sorted(PSD.getPackageNames(True)):
print(k)
PreferenceManager.preferences[k] = { PreferenceManager.preferences[k] = {
'':PSD.getPackage(k).preferenceDict or {} '':PSD.getPackage(k).preferenceDict or {}
} }
twi = QTreeWidgetItem() twi = QTreeWidgetItem()
twi.setText(0,k) twi.setText(0,k)
for m in sorted(PSD.getPluginNames(k)): for m in sorted(PSD.getPluginNames(k,True)):
PreferenceManager.preferences[k][m] =\ PreferenceManager.preferences[k][m] =\
PSD.getPluginInfo(k,m).getPreferenceDict() PSD.getPluginInfo(k,m).getPreferenceDict()
child = QTreeWidgetItem() child = QTreeWidgetItem()
...@@ -70,6 +72,7 @@ class PreferenceManager(QDialog): ...@@ -70,6 +72,7 @@ class PreferenceManager(QDialog):
@staticmethod @staticmethod
def updateForm(): def updateForm():
item = PreferenceManager.ui.treeWidget.currentItem() item = PreferenceManager.ui.treeWidget.currentItem()
if item is None: return
child = True if item.parent() else False child = True if item.parent() else False
package = None package = None
...@@ -78,7 +81,6 @@ class PreferenceManager(QDialog): ...@@ -78,7 +81,6 @@ class PreferenceManager(QDialog):
[item.text(0)] [item.text(0)]
else: else:
package = PreferenceManager.preferences[item.text(0)][''] package = PreferenceManager.preferences[item.text(0)]['']
# PreferenceManager.storeForm(False)
PreferenceManager.ui.formWidget.setParent(None) PreferenceManager.ui.formWidget.setParent(None)
PreferenceManager.ui.horizontalLayout.removeWidget( PreferenceManager.ui.horizontalLayout.removeWidget(
PreferenceManager.ui.formWidget PreferenceManager.ui.formWidget
...@@ -93,7 +95,6 @@ class PreferenceManager(QDialog): ...@@ -93,7 +95,6 @@ class PreferenceManager(QDialog):
w = None w = None
if params['type'] == 'string': if params['type'] == 'string':
w = QLineEdit() w = QLineEdit()
# print(params)
w.setText( w.setText(
params['value'] if ('value' in params and params['value']) params['value'] if ('value' in params and params['value'])
else params['default'] if 'default' in params else params['default'] if 'default' in params
...@@ -164,10 +165,7 @@ class PreferenceManager(QDialog): ...@@ -164,10 +165,7 @@ class PreferenceManager(QDialog):
else: else:
package = PreferenceManager.preferences[item.text(0)][''] package = PreferenceManager.preferences[item.text(0)]['']
# print(package)
for k in sorted(package.keys()): for k in sorted(package.keys()):
# print(k)
params = package[k] params = package[k]
if 'widget' in params: if 'widget' in params:
params['value'] = { params['value'] = {
...@@ -176,7 +174,6 @@ class PreferenceManager(QDialog): ...@@ -176,7 +174,6 @@ class PreferenceManager(QDialog):
'number': lambda: params['widget'].value(), 'number': lambda: params['widget'].value(),
'choice': lambda: params['widget'].currentText() 'choice': lambda: params['widget'].currentText()
}[params['type']]() }[params['type']]()
# print(package)
if save: if save:
PreferenceManager.savePreferences() PreferenceManager.savePreferences()
......
...@@ -117,9 +117,9 @@ class ARCTool(QMainWindow): ...@@ -117,9 +117,9 @@ class ARCTool(QMainWindow):
self.packages = [] self.packages = []
self.plugins = {} self.plugins = {}
self.packageNames = {} self.packageNames = {}
self.loadPackages()
self.pluginDialog = ARCG.PluginSelectDialog(self) self.pluginDialog = ARCG.PluginSelectDialog(self)
self.pluginDialog.accepted.connect(self.assignSectionPlugin) self.pluginDialog.accepted.connect(self.assignSectionPlugin)
self.loadPackages()
# Preference Dialog # Preference Dialog
self.preferenceDialog = ARCP.PreferenceManager(self) self.preferenceDialog = ARCP.PreferenceManager(self)
...@@ -573,7 +573,8 @@ class ARCTool(QMainWindow): ...@@ -573,7 +573,8 @@ class ARCTool(QMainWindow):
for m in package.getPluginNames(): for m in package.getPluginNames():
self.plugins[m] = package self.plugins[m] = package
ARCG.PluginSelectDialog.updateModuleList() print(self.packages)
# ARCG.PluginSelectDialog.updatePluginList()
def generateReport(self): def generateReport(self):
self.ui.statusBar.showMessage("Generating Report...") self.ui.statusBar.showMessage("Generating Report...")
......
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="210mm"
height="297mm"
viewBox="0 0 744.09448819 1052.3622047"
id="svg45253"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="drawing.svg">
<defs
id="defs45255" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="2.8284271"
inkscape:cx="97.023869"
inkscape:cy="815.22503"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:object-nodes="true"
showguides="false"
inkscape:guide-bbox="true"
inkscape:snap-smooth-nodes="true"
inkscape:window-width="1360"
inkscape:window-height="743"
inkscape:window-x="0"
inkscape:window-y="25"
inkscape:window-maximized="1">
<inkscape:grid
type="xygrid"
id="grid45801" />
<sodipodi:guide
position="195,850.00002"
orientation="0,1"
id="guide45923" />
<sodipodi:guide
position="180,835.00002"
orientation="0,1"
id="guide45925" />
</sodipodi:namedview>
<metadata
id="metadata45258">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<g
id="g45933">
<path
sodipodi:nodetypes="ccccc"
inkscape:connector-curvature="0"
id="path45807"
d="m 60,217.3622 -5,-5 7,0 0,5 z"
style="fill:#306581;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path45805"
d="m 50,177.3622 12,0 -10,40 -12,0 z"
style="fill:#306581;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1" />
<path
sodipodi:nodetypes="cccccc"
inkscape:connector-curvature="0"
id="path45803"
d="m 52,177.3622 10,40 2,0 10,0 -10,-40 z"
style="fill:#80b4d0;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1" />
</g>
<g
id="g45938">
<path
sodipodi:nodetypes="cccccc"
inkscape:connector-curvature="0"
id="path45809"
d="m 80,217.3622 0,-30 2.5,-10 9.5,0 0,40 z"
style="fill:#80b4d0;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
sodipodi:nodetypes="ccccc"
inkscape:connector-curvature="0"
id="path45811"
d="m 92,187.3622 6,0 0,-10 -6,0 z"
style="fill:#306581;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
sodipodi:nodetypes="cccccc"
inkscape:connector-curvature="0"
id="path45805-7"
d="m 103,197.3622 -10,-8 0,16 3,12 12,0 z"
style="opacity:1;fill:#306581;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
<path
sodipodi:nodetypes="cccccccc"
inkscape:connector-curvature="0"
id="path45803-7"
d="m 103,177.3622 2.5,10 -7.5,30 -2,0 -3,-12 L 92.98658,189.41588 96,177.3622 Z"