diff --git a/src/Mod/Spreadsheet/InitGui.py b/src/Mod/Spreadsheet/InitGui.py
index e1fe47404..7bd9f8109 100644
--- a/src/Mod/Spreadsheet/InitGui.py
+++ b/src/Mod/Spreadsheet/InitGui.py
@@ -54,7 +54,7 @@ class SpreadsheetWorkbench(Workbench):
def Initialize(self):
import Spreadsheet,Spreadsheet_rc
from DraftTools import translate
- commands = ["Spreadsheet_Create"]
+ commands = ["Spreadsheet_Create","Spreadsheet_Controller"]
self.appendToolbar(str(translate("Spreadsheet","Spreadsheet tools")),commands)
self.appendMenu(str(translate("Spreadsheet","&Spreadsheet")),commands)
FreeCADGui.addIconPath(":/icons")
diff --git a/src/Mod/Spreadsheet/Resources/Spreadsheet.qrc b/src/Mod/Spreadsheet/Resources/Spreadsheet.qrc
index 25f5d71c7..1ef25a0d4 100644
--- a/src/Mod/Spreadsheet/Resources/Spreadsheet.qrc
+++ b/src/Mod/Spreadsheet/Resources/Spreadsheet.qrc
@@ -1,5 +1,6 @@
icons/Spreadsheet.svg
+ icons/SpreadsheetController.svg
diff --git a/src/Mod/Spreadsheet/Resources/icons/SpreadsheetController.svg b/src/Mod/Spreadsheet/Resources/icons/SpreadsheetController.svg
new file mode 100644
index 000000000..b0170884b
--- /dev/null
+++ b/src/Mod/Spreadsheet/Resources/icons/SpreadsheetController.svg
@@ -0,0 +1,163 @@
+
+
+
+
diff --git a/src/Mod/Spreadsheet/Spreadsheet.py b/src/Mod/Spreadsheet/Spreadsheet.py
index e40444cea..43b38a6b4 100644
--- a/src/Mod/Spreadsheet/Spreadsheet.py
+++ b/src/Mod/Spreadsheet/Spreadsheet.py
@@ -194,7 +194,7 @@ class MathParser:
return float(strValue)
-class Spreadsheet(object):
+class Spreadsheet:
"""An object representing a spreadsheet. Can be used as a
FreeCAD object or as a standalone python object.
Cells of the spreadsheet can be got/set as arguments, as:
@@ -203,14 +203,13 @@ class Spreadsheet(object):
print(myspreadsheet.a1)
myspreadsheet.a2 = "My text"
myspreadsheet.b1 = "=a1*3"
- print(myspreadsheet.a3)
-
- Functions usable in formulae are limited to the contents of
- the math module."""
+ print(myspreadsheet.b1)
+ """
def __init__(self,obj=None):
if obj:
obj.Proxy = self
+ obj.addProperty("App::PropertyLinkList","Controllers","Base","Cell controllers of this object")
self._cells = {} # this stores cell contents
self._relations = {} # this stores relations - currently not used
self.cols = [] # this stores filled columns
@@ -221,7 +220,7 @@ class Spreadsheet(object):
return "Spreadsheet object containing " + str(len(self._cells)) + " cells"
def __setattr__(self, key, value):
- if self.isKey(key.lower()):
+ if self.isKey(key):
key = key.lower()
if DEBUG: print "Setting key ",key," to value ",value
if (value == "") or (value == None):
@@ -258,14 +257,19 @@ class Spreadsheet(object):
else:
return self._cells[key]
else:
- return None
+ return self.__dict__.__getitem__(key)
def __getstate__(self):
+ self._cells["Type"] = self.Type
return self._cells
def __setstate__(self,state):
if state:
self._cells = state
+ # extracting Type
+ if "Type" in self._cells.keys():
+ self.Type = self._cells["Type"]
+ del self._cells["Type"]
# updating relation tables
self.rows = []
self.cols = []
@@ -296,8 +300,8 @@ class Spreadsheet(object):
else:
self._relations[a] = [key]
- def execute(self,obj=None):
- pass
+ def execute(self,obj):
+ self.setControlledCells(obj)
def isFunction(self,key):
"isFunction(cell): returns True if the given cell or value is a function"
@@ -396,7 +400,7 @@ class Spreadsheet(object):
result += str(self._cells[e])
else:
result += e
- print "Evaluating ",result
+ if DEBUG: print "Evaluating ",result
try:
p = MathParser(result)
result = p.getValue()
@@ -404,6 +408,21 @@ class Spreadsheet(object):
msg = ex.message
raise Exception(msg)
return result
+
+ def setControlledCells(self,obj):
+ "Fills the cells that are controlled by a controller"
+ if obj:
+ if hasattr(obj,"Controllers"):
+ for co in obj.Controllers:
+ co.Proxy.setCells(co,obj)
+
+ def getControlledCells(self,obj):
+ "returns a list of cells managed by controllers"
+ cells = []
+ if hasattr(obj,"Controllers"):
+ for c in obj.Controllers:
+ cells.extend(c.Proxy.getCells(c,obj))
+ return cells
class ViewProviderSpreadsheet(object):
@@ -412,7 +431,10 @@ class ViewProviderSpreadsheet(object):
def getIcon(self):
import Spreadsheet_rc
- return ":/icons/Spreadsheet.svg"
+ return ":/icons/Spreadsheet.svg"
+
+ def attach(self,vobj):
+ self.Object = vobj.Object
def setEdit(self,vobj,mode):
if hasattr(self,"editor"):
@@ -424,6 +446,93 @@ class ViewProviderSpreadsheet(object):
def unsetEdit(self,vobj,mode):
return False
+
+ def claimChildren(self):
+ if hasattr(self,"Object"):
+ if hasattr(self.Object,"Controllers"):
+ return self.Object.Controllers
+
+ def __getstate__(self):
+ return None
+
+ def __setstate__(self,state):
+ return None
+
+
+class SpreadsheetController:
+ "A spreadsheet cell controller object"
+ def __init__(self,obj):
+ obj.Proxy = self
+ self.Type = "SpreadsheetController"
+ obj.addProperty("App::PropertyLinkList","Objects","Base","The objects that are considered by this controller")
+ obj.addProperty("App::PropertyString","Prop","Base","The property to extract from each object")
+ obj.addProperty("App::PropertyString","BaseCell","Base","The starting cell of this controller")
+ obj.addProperty("App::PropertyEnumeration","Direction","Base","The cells direction of this controller")
+ obj.Direction = ["Horizontal","Vertical"]
+
+ def execute(self,obj):
+ pass
+
+ def __getstate__(self):
+ return self.Type
+
+ def __setstate__(self,state):
+ if state:
+ self.Type = state
+
+ def getCells(self,obj,spreadsheet):
+ "returns a list of cells controlled by this controller"
+ cells = []
+ if obj.Objects and obj.Prop and obj.BaseCell:
+ for i in range(len(obj.Objects)):
+ # get the correct cell key
+ c,r = spreadsheet.Proxy.splitKey(obj.BaseCell)
+ if obj.Direction == "Horizontal":
+ c = "abcdefghijklmnopqrstuvwxyz".index(c)
+ c += i
+ c = "abcdefghijklmnopqrstuvwxyz"[c]
+ else:
+ r = int(r) + i
+ cells.append(c+str(r))
+ return cells
+
+
+ def setCells(self,obj,spreadsheet):
+ "Fills the controlled cells of the given spreadsheet"
+ if obj.Objects and obj.Prop and obj.BaseCell:
+ for i in range(len(obj.Objects)):
+ # get the correct cell key
+ c,r = spreadsheet.Proxy.splitKey(obj.BaseCell)
+ if obj.Direction == "Horizontal":
+ c = "abcdefghijklmnopqrstuvwxyz".index(c)
+ c += i
+ c = "abcdefghijklmnopqrstuvwxyz"[c]
+ else:
+ r = int(r) + i
+ cell = c+str(r)
+ if DEBUG: print "auto setting cell ",cell
+ if spreadsheet.Proxy.isKey(cell):
+ # get the contents
+ args = obj.Prop.split(".")
+ value = obj.Objects[i]
+ for arg in args:
+ if hasattr(value,arg):
+ value = getattr(value,arg)
+ try:
+ setattr(spreadsheet.Proxy,cell,value)
+ if DEBUG: print "setting cell ",cell," to value ",value
+ except:
+ print "Error retrieving property "+obj.Prop+" from object "+obj.Objects[i].Name
+
+
+class ViewProviderSpreadsheetController:
+ "A view provider for the spreadsheet cell controller"
+ def __init__(self,vobj):
+ vobj.Proxy = self
+
+ def getIcon(self):
+ import Spreadsheet_rc
+ return ":/icons/SpreadsheetController.svg"
class SpreadsheetView(QtGui.QWidget):
@@ -471,11 +580,14 @@ class SpreadsheetView(QtGui.QWidget):
if self.spreadsheet.ViewObject:
if hasattr(self.spreadsheet.ViewObject.Proxy,"editor"):
del self.spreadsheet.ViewObject.Proxy.editor
- FreeCADGui.ActiveDocument.resetEdit()
+ if FreeCADGui:
+ if FreeCADGui.ActiveDocument:
+ FreeCADGui.ActiveDocument.resetEdit()
def update(self):
"updates the cells with the contents of the spreadsheet"
if self.spreadsheet:
+ controlled = self.spreadsheet.Proxy.getControlledCells(self.spreadsheet)
for cell in self.spreadsheet.Proxy._cells.keys():
c,r = self.spreadsheet.Proxy.splitKey(cell)
c = "abcdefghijklmnopqrstuvwxyz".index(c)
@@ -490,6 +602,10 @@ class SpreadsheetView(QtGui.QWidget):
self.table.item(r,c).setText(str(content))
else:
self.table.setItem(r,c,QtGui.QTableWidgetItem(str(content)))
+ if cell in controlled:
+ brush = QtGui.QBrush(QtGui.QColor(255, 0, 0))
+ brush.setStyle(QtCore.Qt.Dense6Pattern)
+ self.table.item(r,c).setBackground(brush)
def changeCell(self,r,c,value=None):
"changes the contens of a cell"
@@ -550,13 +666,38 @@ class _Command_Spreadsheet_Create:
def Activated(self):
from DraftTools import translate
- FreeCAD.ActiveDocument.openTransaction(str(translate("Arch","Create Spreadsheet")))
+ FreeCAD.ActiveDocument.openTransaction(str(translate("Spreadsheet","Create Spreadsheet")))
FreeCADGui.doCommand("import Spreadsheet")
FreeCADGui.doCommand("Spreadsheet.makeSpreadsheet()")
FreeCAD.ActiveDocument.commitTransaction()
FreeCAD.ActiveDocument.recompute()
+class _Command_Spreadsheet_Controller:
+ "the Spreadsheet_Controller FreeCAD command"
+ def GetResources(self):
+ return {'Pixmap' : 'SpreadsheetController',
+ 'MenuText': QtCore.QT_TRANSLATE_NOOP("Spreadsheet_Controller","Add controller"),
+ 'ToolTip': QtCore.QT_TRANSLATE_NOOP("Spreadsheet_Controller","Adds a cell controller to a selected spreadsheet")}
+
+ def IsActive(self):
+ if FreeCADGui.Selection.getSelection():
+ return True
+ else:
+ return False
+
+ def Activated(self):
+ import Draft
+ if Draft.getType(FreeCADGui.Selection.getSelection()[0]) == "Spreadsheet":
+ from DraftTools import translate
+ n = FreeCADGui.Selection.getSelection()[0].Name
+ FreeCAD.ActiveDocument.openTransaction(str(translate("Spreadsheet","Add controller")))
+ FreeCADGui.doCommand("import Spreadsheet")
+ FreeCADGui.doCommand("Spreadsheet.makeSpreadsheetController(FreeCAD.ActiveDocument."+n+")")
+ FreeCAD.ActiveDocument.commitTransaction()
+ FreeCAD.ActiveDocument.recompute()
+
+
def makeSpreadsheet():
"makeSpreadsheet(): adds a spreadsheet object to the active document"
obj = FreeCAD.ActiveDocument.addObject("App::FeaturePython","Spreadsheet")
@@ -566,6 +707,29 @@ def makeSpreadsheet():
return obj
+def makeSpreadsheetController(spreadsheet,cell=None,objects=None,prop=None,direction=None):
+ """makeSpreadsheetController(spreadsheet,[cell,objects,prop,direction]): adds a
+ controller to the given spreadsheet. Call can be a starting cell such as "A5",
+ objects can be a list of objects, prop can be a property such as "Shape.Volume",
+ and direction can be "Horizontal" or "Vertical"."""
+ obj = FreeCAD.ActiveDocument.addObject("App::FeaturePython","CellController")
+ SpreadsheetController(obj)
+ if FreeCAD.GuiUp:
+ ViewProviderSpreadsheetController(obj.ViewObject)
+ conts = spreadsheet.Controllers
+ conts.append(obj)
+ spreadsheet.Controllers = conts
+ if objects:
+ obj.Objects = objects
+ if cell:
+ obj.BaseCell = cell
+ if prop:
+ obj.Prop = prop
+ if direction:
+ obj.Direction = direction
+ return obj
+
+
def addSpreadsheetView(view):
"addSpreadsheetView(view): adds the given spreadsheet view to the FreeCAD MDI area"
if FreeCAD.GuiUp:
@@ -579,3 +743,4 @@ def addSpreadsheetView(view):
FreeCADGui.addCommand('Spreadsheet_Create',_Command_Spreadsheet_Create())
+FreeCADGui.addCommand('Spreadsheet_Controller',_Command_Spreadsheet_Controller())
diff --git a/src/Mod/Spreadsheet/Spreadsheet_rc.py b/src/Mod/Spreadsheet/Spreadsheet_rc.py
index dc6f7456e..fa794a071 100644
--- a/src/Mod/Spreadsheet/Spreadsheet_rc.py
+++ b/src/Mod/Spreadsheet/Spreadsheet_rc.py
@@ -2,7 +2,7 @@
# Resource object code
#
-# Created: Fri Aug 2 17:09:28 2013
+# Created: Tue Aug 6 17:48:51 2013
# by: The Resource Compiler for PyQt (Qt v4.8.4)
#
# WARNING! All changes made in this file will be lost!
@@ -10,6 +10,111 @@
from PyQt4 import QtCore
qt_resource_data = "\
+\x00\x00\x06\x62\
+\x00\
+\x00\x18\x53\x78\x9c\xe5\x57\xdb\x6e\xdb\x46\x10\x7d\xf7\x57\xb0\
+\xcc\x4b\x82\x8a\xe4\x5e\x78\xb7\xa4\x3c\x34\x48\x11\xa0\x45\x81\
+\x26\x41\x1f\x83\x15\xb9\x94\x58\x53\x24\xb1\x5c\x59\x92\xbf\xbe\
+\xb3\xbc\x53\xa2\x13\x3b\x45\x90\x06\x95\x60\x8b\x3b\x33\x7b\x99\
+\x33\x67\x66\x96\xcb\xd7\xa7\x7d\xa6\xdd\x73\x51\xa5\x45\xbe\xd2\
+\xb1\x89\x74\x8d\xe7\x51\x11\xa7\xf9\x76\xa5\x7f\xfc\xf0\xd6\xf0\
+\x75\xad\x92\x2c\x8f\x59\x56\xe4\x7c\xa5\xe7\x85\xfe\x7a\x7d\xb3\
+\xfc\xc9\x30\xb4\x5f\x04\x67\x92\xc7\xda\x31\x95\x3b\xed\x5d\x7e\
+\x57\x45\xac\xe4\xda\xcb\x9d\x94\x65\x68\x59\xc7\xe3\xd1\x4c\x5b\
+\xa1\x59\x88\xad\xf5\x4a\x33\x8c\xf5\xcd\xcd\xb2\xba\xdf\xde\x68\
+\x9a\x06\xfb\xe6\x55\x18\x47\x2b\xbd\x9d\x50\x1e\x44\x56\x1b\xc6\
+\x91\xc5\x33\xbe\xe7\xb9\xac\x2c\x6c\x62\x4b\x1f\xcc\xa3\xc1\x3c\
+\x52\xbb\xa7\xf7\x3c\x2a\xf6\xfb\x22\xaf\xea\x99\x79\xf5\x62\x64\
+\x2c\xe2\xa4\xb7\x56\xa7\x39\xd2\xda\x08\x07\x41\x60\x21\x62\x11\
+\x62\x80\x85\x51\x9d\x73\xc9\x4e\xc6\x74\x2a\x9c\x71\x6e\x2a\x41\
+\x08\x59\xa0\x1b\x2c\x9f\x66\x15\x9e\x32\x80\xe2\xd1\xc3\xd4\xda\
+\xf1\xee\x00\x7f\x09\x7f\xfd\x84\x4e\x60\x56\xc5\x41\x44\x3c\x81\
+\x99\xdc\xcc\xb9\xb4\xde\x7c\x78\xd3\x2b\x0d\x64\xc6\x32\x1e\x2d\
+\xd3\xa1\x3f\xd9\x77\x12\x92\x9c\xed\x79\x55\xb2\x88\x57\x56\x27\
+\xaf\xe7\x1f\xd3\x58\xee\x56\xba\x6b\x97\xa7\x7a\xbc\xe3\xe9\x76\
+\x27\x47\x82\x34\x5e\xe9\xe0\x21\xf1\x5d\x54\x8f\xbb\x33\x84\x3d\
+\x93\x90\x49\x49\x63\xda\x2e\x3c\x56\xd9\xbe\x69\x6b\x22\x08\x68\
+\x30\x9d\x1d\x17\x91\x3a\xd2\x4a\x7f\x5f\x42\x74\xe3\x6a\xc7\xb9\
+\x34\x3b\x24\xfb\x85\x8a\x83\x2c\x0f\xf2\x13\x3f\x49\x9e\x37\x2b\
+\x82\x2f\x23\xc7\x6a\xb5\x9a\x66\x4e\x9c\x1a\x91\x1c\xeb\x6b\x90\
+\x2c\x63\x9e\x54\x4a\xd3\xf8\xa3\x46\xe0\x10\xa9\x75\xa0\x15\x2c\
+\x4e\x59\xf6\xab\xfa\x01\x2a\x36\x76\xa3\x53\x44\x45\x96\xf1\x08\
+\x40\x61\xd9\x91\x9d\x2b\xbd\x33\xa8\x83\x19\xee\x04\x07\xf2\xbd\
+\x80\x67\xce\x44\xb7\x06\xa5\x9e\xd7\xdb\xa9\x2d\xa7\x5b\x50\x37\
+\x20\xbd\x3a\x3a\xad\x74\xdb\x31\x7d\x9f\x52\x32\x4c\x8a\xce\x2b\
+\x9d\xf8\xa6\xef\x06\x8e\xeb\xf7\xd2\x64\xd6\x36\x99\xb5\x15\xe0\
+\x7f\x60\xda\xae\x67\x53\xb7\x17\x6e\xdb\x13\x7c\xcc\x53\x09\x94\
+\x3e\x54\x5c\xbc\x57\xb4\xf8\x23\xff\x58\x71\x5d\xb3\xbe\x1b\x22\
+\x1e\xa2\x4f\x3c\xe4\x18\x37\x4c\x1d\x93\x02\x18\x74\x82\x5b\xe0\
+\x99\xf4\x1a\xb7\x6b\xdb\x64\xd6\xf6\xb3\xb8\x7d\x10\x2c\xaf\x20\
+\x2b\xf7\x2b\x7d\xcf\xa4\x48\x4f\x2f\x91\x19\x80\xa5\xb3\x40\x26\
+\x21\x0e\xa2\x5e\xb0\x80\xf4\xb4\x5d\x42\x31\x72\x16\xc4\x44\x08\
+\xbb\x1e\xf1\x17\x2a\x11\x7c\xcf\x71\xec\x85\x81\x89\x67\x06\x01\
+\xc4\xf0\xd5\x00\xf8\x14\xac\x31\x4e\x33\x30\xae\x5b\xfd\xb2\x92\
+\x45\xd9\xd9\xb6\xa9\x0a\x12\xb0\x09\xf4\x41\x5c\x24\x49\xc5\x21\
+\x56\x68\x24\xab\xe4\x39\xe3\x8d\xb5\x01\xc1\x2c\x44\xf8\x22\x61\
+\x49\x42\x36\xb7\xb5\xa8\x00\xb4\x53\x79\x0e\xf1\x6d\x7f\xc2\xcf\
+\xec\xe6\xe3\x99\xdd\xf0\x17\x76\x4b\x18\x43\xe8\xd1\xdd\x96\xd6\
+\xd4\xed\xef\x48\x4b\xe7\x6b\x68\x09\xd1\xf6\xaf\x68\xe9\xe3\xb9\
+\x74\xbe\xb6\x4d\x66\x6d\x9f\x49\x4b\x0c\x5c\x77\x88\xe3\xfb\x8a\
+\x8e\xc8\xc1\xd4\xf5\x7c\x0a\x24\x45\xca\x25\x97\x04\xf0\x08\x0d\
+\x89\x62\x4a\x16\x86\x0b\x25\x3c\x20\x36\xa2\x0b\xcf\xf4\x90\x8d\
+\x6c\xea\x8f\xa8\xd9\xc3\x5b\x42\x59\x2d\x01\x5f\x68\xc5\xdd\xfe\
+\x7d\x3d\x97\x67\xd5\x7d\xa6\xa6\x34\xd6\xaf\x42\x74\x5f\x7e\x02\
+\x9f\x91\x16\x6a\x94\xc0\x3f\x3c\x6b\x71\x6e\x2c\x30\x74\x57\xf8\
+\x41\xb3\x36\x0f\xaa\x47\x7d\x66\x99\xf6\x04\x46\x21\xd2\x6d\x0a\
+\xad\xa0\xb6\x23\x80\x4a\xfd\x99\xce\x81\xb0\x8f\x7c\x83\xce\xe0\
+\xb7\xde\x2f\x2d\xd5\x2a\xea\xa7\xde\x53\xd5\xb6\xe2\xfb\x94\x1f\
+\x87\x7e\xb2\x61\x7d\xfc\x4b\xb6\xe5\x35\xc5\x81\x69\x49\xfd\x69\
+\x15\x9b\x42\xc4\x5c\x74\x2a\xb7\xfe\x4c\x54\x6d\x16\x34\x37\xb3\
+\x9b\x0b\x67\x60\xd5\x5e\x8f\xe6\xf5\xd5\x8e\xc5\xc5\x11\x1a\xc1\
+\xa5\xf2\xa1\x28\x80\x16\x8e\xe9\x5c\x2a\xea\xc6\x83\x4d\xd7\xc7\
+\x2e\xc1\x57\x4a\xd8\x89\x02\x09\x3d\x8f\xda\xde\x95\xf2\x20\x04\
+\xb0\xce\xc8\xd8\x99\x83\x3b\xf5\x4f\xb7\x42\xb5\x2b\x8e\x5b\xa1\
+\x60\x91\xe2\xc0\x2f\x67\x42\xdf\x3f\xa8\xfb\x9e\x71\x68\x92\xa8\
+\xbd\x65\x8c\x2c\xd4\x5c\x63\xb3\x29\x4e\xf3\x0b\x1c\xd3\x1c\xdc\
+\x34\xda\x7b\x0b\x0e\xc8\x15\x18\xad\x45\x77\x93\x81\x32\x4c\x1f\
+\x31\x39\x0d\x45\xf1\x52\x75\x7e\x5c\xb5\x67\xa7\x74\x9f\x3e\xf0\
+\x58\x15\xb9\x96\x27\x7b\x2e\x59\xcc\x24\x1b\x38\xd1\x49\x80\x4d\
+\x4e\x7f\xcf\x88\x93\xf0\xcf\x37\x6f\xfb\x82\x1a\x45\xe1\x5f\x85\
+\xb8\x1b\x0a\xa5\x32\x60\x1b\xb8\xd6\xac\xf4\xbe\xc8\xab\xdb\x4b\
+\x14\xaa\xdc\x66\x72\x9d\xee\x21\xd2\xea\xc6\xf9\x33\x5c\xfc\x80\
+\x9d\xbd\x62\x62\xac\x92\x71\x58\xb4\x59\x56\xf0\xe6\x46\x39\x7b\
+\x09\x8f\xa3\x7d\xaa\x26\x59\xef\x65\x9a\x65\xef\xd4\x26\xa3\xc2\
+\xdf\x2e\x9a\xca\x8c\xaf\xeb\x3d\x9b\xc7\xce\x0b\xab\x75\xa3\xab\
+\xdc\x23\x2f\x97\x56\x07\x43\x3d\xda\x0e\xf0\x4c\x28\xd3\x23\x9c\
+\xb1\x0d\xcf\x56\xfa\x6f\x4a\xa9\x5d\x69\xb7\xa2\x38\x94\xfb\x22\
+\xe6\xed\xf4\x1e\x56\xc8\xdb\xbe\x20\x35\xad\xa6\xed\x32\xa8\xfe\
+\xdc\x26\xe0\x54\xd8\xa6\x63\x3d\x18\xb5\x9c\x7a\x28\x0e\x19\x0f\
+\xf3\x22\x7f\x80\x34\x84\x9e\x24\x8a\xbb\x7a\xc8\xdb\xe7\x86\x6d\
+\xa1\xdd\x0d\x55\x0b\x81\x13\x85\x9b\x83\x94\x63\xd9\xdf\x45\x9a\
+\x87\x70\xc8\x3c\xee\xa4\x00\x2b\x17\x19\xd0\x45\x0e\xb3\x87\xbd\
+\x5b\x41\xcc\x20\x77\x85\x60\xe7\xc9\x9e\x4a\xda\x34\xd3\x10\xdd\
+\xee\x99\xb8\xe3\xa2\xd1\xdf\xa7\x55\xba\x49\x33\xb5\x44\xfd\x98\
+\xf1\xdb\x38\xad\x4a\x80\x04\xde\x03\xd4\x31\x6e\x0b\xb8\x00\x27\
+\x59\x71\xec\xf5\x3c\x67\xf0\x63\x6c\x58\x74\xb7\xad\xcf\x17\xb2\
+\x08\xf2\xf0\x90\xc1\x5b\xdd\xb4\xfb\x01\x94\x14\xa1\xe1\x72\xda\
+\xe6\x99\xe3\x9a\xd8\xc7\xfe\x20\xef\xb2\xcb\x76\x4d\xc7\x86\xef\
+\xd0\x92\x54\x51\xe9\x07\xea\x82\x65\x12\x0f\xbe\xfe\xe8\x72\xf9\
+\xa4\x78\xd5\xbe\x3e\x35\x58\xdd\xcc\xff\x6b\xbc\x8c\xe0\x9b\x46\
+\xac\x64\x72\x77\x11\xb1\x21\x46\xff\x3e\x04\x35\xea\x8f\xc2\x3d\
+\x17\x93\x69\x08\xfa\xc3\xab\xba\xab\xd9\x0b\x82\x1a\x17\x1d\xcd\
+\x71\x4c\x97\xc2\xd7\x5e\xa0\x69\xbb\x07\x87\xe0\x96\x3c\x73\xb5\
+\x88\x8a\x1c\x4e\x2a\x0b\x61\x40\x93\xbb\x67\xf2\x20\xb8\x6a\x05\
+\x3f\x22\x14\xbf\x6b\x00\x44\x80\xe0\x8b\x17\x41\x83\x03\x75\x47\
+\xb2\x11\x05\x46\x98\x90\xff\x36\x26\x5f\x91\xa1\x53\x7a\x10\x13\
+\x6e\xbf\x90\x33\xde\x82\x12\xd3\x26\x81\x8f\xb1\x86\xe1\x25\x90\
+\xda\xd4\xa3\x74\x9e\x27\xf6\xf3\x31\x79\x72\x53\x1a\xa1\x32\xdb\
+\x73\xbe\x61\x29\x99\x96\x57\x78\x6b\xc5\xd8\x76\x7c\x6a\x5f\x97\
+\x18\xcf\xc3\x97\x05\x86\x06\xa6\xa2\x11\xf2\xaf\x2a\x0c\xa1\x0d\
+\xc3\xc6\x05\x86\xe0\x71\x85\x01\x0e\x36\x69\xf9\x83\x72\xc8\x5e\
+\xd8\x36\xbc\xce\x53\x04\xaf\x20\x5f\x28\x31\xee\xb7\xa2\xce\xf3\
+\xfa\x63\x3c\x83\x9c\xfb\x4d\xb9\xf5\xf5\x35\x6c\xbe\x45\xcf\x91\
+\x92\xce\x90\xf2\xa2\xb9\xf5\xa4\xb4\x27\x74\x44\xa6\x57\x37\xb9\
+\x0b\x56\x36\x35\xf2\x99\xac\x9c\xc3\xf6\xbb\x54\x36\x62\x22\x8c\
+\x02\x3b\x18\x55\x36\x0a\x6f\xf4\x20\xc3\xde\x23\x85\xcd\x78\x6e\
+\x0b\x5c\x5a\xdb\xf5\xcd\x52\xbd\x82\xac\x6f\xfe\x01\x67\xd0\x48\
+\x57\
\x00\x00\x05\xda\
\x00\
\x00\x14\x77\x78\x9c\xe5\x57\x59\x8f\xdb\x36\x10\x7e\xdf\x5f\xa1\
@@ -113,6 +218,11 @@ qt_resource_name = "\
\x00\x6f\xa6\x53\
\x00\x69\
\x00\x63\x00\x6f\x00\x6e\x00\x73\
+\x00\x19\
+\x02\x18\xed\xa7\
+\x00\x53\
+\x00\x70\x00\x72\x00\x65\x00\x61\x00\x64\x00\x73\x00\x68\x00\x65\x00\x65\x00\x74\x00\x43\x00\x6f\x00\x6e\x00\x74\x00\x72\x00\x6f\
+\x00\x6c\x00\x6c\x00\x65\x00\x72\x00\x2e\x00\x73\x00\x76\x00\x67\
\x00\x0f\
\x0a\xa9\x40\xe7\
\x00\x53\
@@ -121,8 +231,9 @@ qt_resource_name = "\
qt_resource_struct = "\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
-\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x02\
\x00\x00\x00\x10\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\
+\x00\x00\x00\x48\x00\x01\x00\x00\x00\x01\x00\x00\x06\x66\
"
def qInitResources():