home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyc (Python 2.6)
-
- import sys
- import logging
- import os.path as os
- import re
-
- try:
- from xml.etree.ElementTree import parse, SubElement
- except ImportError:
-
- try:
- from ElementTree import parse, SubElement
- except ImportError:
-
- try:
- from elementtree.ElementTree import parse, SubElement
- except ImportError:
- from PyQt4.elementtree.ElementTree import parse, SubElement
- except:
- None<EXCEPTION MATCH>ImportError
-
-
- None<EXCEPTION MATCH>ImportError
-
-
- None<EXCEPTION MATCH>ImportError
-
- from PyQt4.uic.exceptions import NoSuchWidgetError
- from PyQt4.uic.objcreator import QObjectCreator
- from PyQt4.uic.properties import Properties
- logger = logging.getLogger(__name__)
- DEBUG = logger.debug
- if sys.version_info < (2, 4, 0):
-
- def reversed(seq):
- for i in xrange(len(seq) - 1, -1, -1):
- yield seq[i]
-
-
-
- QtCore = None
- QtGui = None
-
- def gridPosition(elem):
-
- try:
- return (int(elem.attrib['row']), int(elem.attrib['column']), int(elem.attrib.get('rowspan', 1)), int(elem.attrib.get('colspan', 1)))
- except KeyError:
- return ()
-
-
-
- class WidgetStack(list):
- topwidget = None
-
- def push(self, item):
- DEBUG('push %s %s' % (item.metaObject().className(), item.objectName()))
- self.append(item)
- if isinstance(item, QtGui.QWidget):
- self.topwidget = item
-
-
-
- def popLayout(self):
- layout = list.pop(self)
- DEBUG('pop layout %s %s' % (layout.metaObject().className(), layout.objectName()))
- return layout
-
-
- def popWidget(self):
- widget = list.pop(self)
- DEBUG('pop widget %s %s' % (widget.metaObject().className(), widget.objectName()))
- for item in reversed(self):
- if isinstance(item, QtGui.QWidget):
- self.topwidget = item
- break
- continue
- else:
- self.topwidget = None
- DEBUG('new topwidget %s' % (self.topwidget,))
- return widget
-
-
- def peek(self):
- return self[-1]
-
-
- def topIsLayout(self):
- return isinstance(self[-1], QtGui.QLayout)
-
-
-
- class UIParser(object):
-
- def __init__(self, QtCoreModule, QtGuiModule, creatorPolicy):
- global QtCore, QtGui
- self.factory = QObjectCreator(creatorPolicy)
- self.wprops = Properties(self.factory, QtCoreModule, QtGuiModule)
- QtCore = QtCoreModule
- QtGui = QtGuiModule
- self.reset()
-
-
- def uniqueName(self, name):
-
- try:
- suffix = self.name_suffixes[name]
- except KeyError:
- self.name_suffixes[name] = 0
- return name
-
- suffix += 1
- self.name_suffixes[name] = suffix
- return '%s%i' % (name, suffix)
-
-
- def reset(self):
-
- try:
- self.wprops.reset()
- except AttributeError:
- pass
-
- self.toplevelWidget = None
- self.stack = WidgetStack()
- self.name_suffixes = { }
- self.defaults = {
- 'spacing': 6,
- 'margin': 0 }
- self.actions = []
- self.currentActionGroup = None
- self.resources = []
- self.button_groups = []
-
-
- def setupObject(self, clsname, parent, branch, is_attribute = True):
- if not branch.attrib.get('name'):
- pass
- name = self.uniqueName(clsname[1:].lower())
- if parent is None:
- args = ()
- else:
- args = (parent,)
- obj = self.factory.createQObject(clsname, name, args, is_attribute)
- self.wprops.setProperties(obj, branch)
- obj.setObjectName(name)
- if is_attribute:
- setattr(self.toplevelWidget, name, obj)
-
- return obj
-
-
- def createWidget(self, elem):
-
- def widgetClass(elem):
- cls = elem.attrib['class'].replace('::', '.')
- if cls == 'Line':
- return 'QFrame'
- return cls
-
- self.column_counter = 0
- self.row_counter = 0
- self.item_nr = 0
- self.itemstack = []
- self.sorting_enabled = None
- parent = self.stack.topwidget
- if isinstance(parent, (QtGui.QToolBox, QtGui.QTabWidget, QtGui.QStackedWidget, QtGui.QDockWidget, QtGui.QWizard)):
- parent = None
-
- self.stack.push(self.setupObject(widgetClass(elem), parent, elem))
- if isinstance(self.stack.topwidget, QtGui.QTableWidget):
- self.stack.topwidget.setColumnCount(len(elem.findall('column')))
- self.stack.topwidget.setRowCount(len(elem.findall('row')))
-
- self.traverseWidgetTree(elem)
- widget = self.stack.popWidget()
- if isinstance(widget, QtGui.QTreeView):
- self.handleHeaderView(elem, 'header', widget.header())
- elif isinstance(widget, QtGui.QTableView):
- self.handleHeaderView(elem, 'horizontalHeader', widget.horizontalHeader())
- self.handleHeaderView(elem, 'verticalHeader', widget.verticalHeader())
- elif isinstance(widget, QtGui.QAbstractButton):
- bg_i18n = self.wprops.getAttribute(elem, 'buttonGroup')
- if bg_i18n is not None:
- bg_name = bg_i18n.string
- for bg in self.button_groups:
- if bg.objectName() == bg_name:
- break
- continue
- else:
- bg = self.factory.createQObject('QButtonGroup', bg_name, (self.toplevelWidget,))
- self.button_groups.append(bg)
- bg.addButton(widget)
-
-
- if self.sorting_enabled is not None:
- widget.setSortingEnabled(self.sorting_enabled)
- self.sorting_enabled = None
-
- if self.stack.topIsLayout():
- lay = self.stack.peek()
- gp = elem.attrib['grid-position']
- if isinstance(lay, QtGui.QFormLayout):
- if gp[1]:
- role = QtGui.QFormLayout.FieldRole
- else:
- role = QtGui.QFormLayout.LabelRole
- lay.setWidget(gp[0], role, widget)
- else:
- lay.addWidget(widget, *gp)
-
- topwidget = self.stack.topwidget
- if isinstance(topwidget, QtGui.QToolBox):
- icon = self.wprops.getAttribute(elem, 'icon')
- if icon is not None:
- topwidget.addItem(widget, icon, self.wprops.getAttribute(elem, 'label'))
- else:
- topwidget.addItem(widget, self.wprops.getAttribute(elem, 'label'))
- tooltip = self.wprops.getAttribute(elem, 'toolTip')
- if tooltip is not None:
- topwidget.setItemToolTip(topwidget.indexOf(widget), tooltip)
-
- elif isinstance(topwidget, QtGui.QTabWidget):
- icon = self.wprops.getAttribute(elem, 'icon')
- if icon is not None:
- topwidget.addTab(widget, icon, self.wprops.getAttribute(elem, 'title'))
- else:
- topwidget.addTab(widget, self.wprops.getAttribute(elem, 'title'))
- tooltip = self.wprops.getAttribute(elem, 'toolTip')
- if tooltip is not None:
- topwidget.setTabToolTip(topwidget.indexOf(widget), tooltip)
-
- elif isinstance(topwidget, QtGui.QWizard):
- topwidget.addPage(widget)
- elif isinstance(topwidget, QtGui.QStackedWidget):
- topwidget.addWidget(widget)
- elif isinstance(topwidget, (QtGui.QDockWidget, QtGui.QScrollArea)):
- topwidget.setWidget(widget)
- elif isinstance(topwidget, QtGui.QMainWindow):
- if type(widget) == QtGui.QWidget:
- topwidget.setCentralWidget(widget)
- elif isinstance(widget, QtGui.QToolBar):
- tbArea = self.wprops.getAttribute(elem, 'toolBarArea')
- if tbArea is None:
- topwidget.addToolBar(widget)
- elif isinstance(tbArea, str):
- tbArea = getattr(QtCore.Qt, tbArea)
- else:
- tbArea = QtCore.Qt.ToolBarArea(tbArea)
- topwidget.addToolBar(tbArea, widget)
- tbBreak = self.wprops.getAttribute(elem, 'toolBarBreak')
- if tbBreak:
- topwidget.insertToolBarBreak(widget)
-
- elif isinstance(widget, QtGui.QMenuBar):
- topwidget.setMenuBar(widget)
- elif isinstance(widget, QtGui.QStatusBar):
- topwidget.setStatusBar(widget)
- elif isinstance(widget, QtGui.QDockWidget):
- dwArea = self.wprops.getAttribute(elem, 'dockWidgetArea')
- topwidget.addDockWidget(QtCore.Qt.DockWidgetArea(dwArea), widget)
-
-
-
-
- def handleHeaderView(self, elem, name, header):
- value = self.wprops.getAttribute(elem, name + 'Visible')
- if value is not None:
- header.setVisible(value)
-
- value = self.wprops.getAttribute(elem, name + 'CascadingSectionResizes')
- if value is not None:
- header.setCascadingSectionResizes(value)
-
- value = self.wprops.getAttribute(elem, name + 'DefaultSectionSize')
- if value is not None:
- header.setDefaultSectionSize(value)
-
- value = self.wprops.getAttribute(elem, name + 'HighlightSections')
- if value is not None:
- header.setHighlightSections(value)
-
- value = self.wprops.getAttribute(elem, name + 'MinimumSectionSize')
- if value is not None:
- header.setMinimumSectionSize(value)
-
- value = self.wprops.getAttribute(elem, name + 'ShowSortIndicator')
- if value is not None:
- header.setSortIndicatorShown(value)
-
- value = self.wprops.getAttribute(elem, name + 'StretchLastSection')
- if value is not None:
- header.setStretchLastSection(value)
-
-
-
- def createSpacer(self, elem):
- width = int(elem.findtext('property/size/width'))
- height = int(elem.findtext('property/size/height'))
- sizeType = self.wprops.getProperty(elem, 'sizeType', QtGui.QSizePolicy.Expanding)
- policy = (QtGui.QSizePolicy.Minimum, sizeType)
- if self.wprops.getProperty(elem, 'orientation') == QtCore.Qt.Horizontal:
- policy = (policy[1], policy[0])
-
- spacer = self.factory.createQObject('QSpacerItem', self.uniqueName('spacerItem'), (width, height) + policy, is_attribute = False)
- if self.stack.topIsLayout():
- lay = self.stack.peek()
- gp = elem.attrib['grid-position']
- if isinstance(lay, QtGui.QFormLayout):
- if gp[1]:
- role = QtGui.QFormLayout.FieldRole
- else:
- role = QtGui.QFormLayout.LabelRole
- lay.setItem(gp[0], role, spacer)
- else:
- lay.addItem(spacer, *gp)
-
-
-
- def createLayout(self, elem):
- left = self.wprops.getProperty(elem, 'leftMargin', -1)
- top = self.wprops.getProperty(elem, 'topMargin', -1)
- right = self.wprops.getProperty(elem, 'rightMargin', -1)
- bottom = self.wprops.getProperty(elem, 'bottomMargin', -1)
-
- def comp_property(m, so_far = -2, nr = 0):
- if m >= 0:
- nr += 1
- if so_far == -2:
- so_far = m
- elif so_far != m:
- so_far = -1
-
-
- return (so_far, nr)
-
- (margin, nr_margins) = comp_property(left)
- (margin, nr_margins) = comp_property(top, margin, nr_margins)
- (margin, nr_margins) = comp_property(right, margin, nr_margins)
- (margin, nr_margins) = comp_property(bottom, margin, nr_margins)
- if nr_margins > 0:
- if nr_margins == 4 and margin >= 0:
- me = SubElement(elem, 'property', name = 'margin')
- SubElement(me, 'number').text = str(margin)
- else:
- cme = SubElement(elem, 'property', name = 'pyuicContentsMargins')
- SubElement(cme, 'number').text = str(left)
- SubElement(cme, 'number').text = str(top)
- SubElement(cme, 'number').text = str(right)
- SubElement(cme, 'number').text = str(bottom)
-
- horiz = self.wprops.getProperty(elem, 'horizontalSpacing', -1)
- vert = self.wprops.getProperty(elem, 'verticalSpacing', -1)
- if horiz >= 0 or vert >= 0:
- cme = SubElement(elem, 'property', name = 'pyuicSpacing')
- SubElement(cme, 'number').text = str(horiz)
- SubElement(cme, 'number').text = str(vert)
-
- classname = elem.attrib['class']
- if self.stack.topIsLayout():
- parent = None
- else:
- parent = self.stack.topwidget
- if 'name' not in elem.attrib:
- elem.attrib['name'] = classname[1:].lower()
-
- self.stack.push(self.setupObject(classname, parent, elem))
- self.traverseWidgetTree(elem)
- layout = self.stack.popLayout()
- if self.stack.topIsLayout():
- top_layout = self.stack.peek()
- gp = elem.attrib['grid-position']
- if isinstance(top_layout, QtGui.QFormLayout):
- if gp[1]:
- role = QtGui.QFormLayout.FieldRole
- else:
- role = QtGui.QFormLayout.LabelRole
- top_layout.setLayout(gp[0], role, layout)
- else:
- self.configureLayout(elem, layout)
- top_layout.addLayout(layout, *gp)
- else:
- self.configureLayout(elem, layout)
-
-
- def configureLayout(self, elem, layout):
- if isinstance(layout, QtGui.QGridLayout):
- self.setArray(elem, 'columnminimumwidth', layout.setColumnMinimumWidth)
- self.setArray(elem, 'rowminimumheight', layout.setRowMinimumHeight)
- self.setArray(elem, 'columnstretch', layout.setColumnStretch)
- self.setArray(elem, 'rowstretch', layout.setRowStretch)
- elif isinstance(layout, QtGui.QBoxLayout):
- self.setArray(elem, 'stretch', layout.setStretch)
-
-
-
- def setArray(self, elem, name, setter):
- array = elem.attrib.get(name)
- if array:
- for idx, value in enumerate(array.split(',')):
- value = int(value)
- if value > 0:
- setter(idx, value)
- continue
-
-
-
-
- def handleItem(self, elem):
- pass
-
-
- def addAction(self, elem):
- self.actions.append((self.stack.topwidget, elem.attrib['name']))
-
-
- def addHeader(self, elem):
- w = self.stack.topwidget
- if isinstance(w, QtGui.QTreeWidget):
- text = self.wprops.getProperty(elem, 'text')
- icon = self.wprops.getProperty(elem, 'icon')
- if text:
- w.headerItem().setText(self.column_counter, text)
-
- if icon:
- w.headerItem().setIcon(self.column_counter, icon)
-
- self.column_counter += 1
- elif isinstance(w, QtGui.QTableWidget):
- if len(elem) == 0:
- return None
- text = self.wprops.getProperty(elem, 'text')
- icon = self.wprops.getProperty(elem, 'icon')
- item = self.factory.createQObject('QTableWidgetItem', 'item', (), False)
- if elem.tag == 'column':
- w.setHorizontalHeaderItem(self.column_counter, item)
- if text:
- w.horizontalHeaderItem(self.column_counter).setText(text)
-
- if icon:
- item.setIcon(icon)
-
- self.column_counter += 1
- elif elem.tag == 'row':
- w.setVerticalHeaderItem(self.row_counter, item)
- if text:
- w.verticalHeaderItem(self.row_counter).setText(text)
-
- if icon:
- item.setIcon(icon)
-
- self.row_counter += 1
-
-
-
-
- def createAction(self, elem):
- if not self.currentActionGroup:
- pass
- self.setupObject('QAction', self.toplevelWidget, elem)
-
-
- def createActionGroup(self, elem):
- action_group = self.setupObject('QActionGroup', self.toplevelWidget, elem)
- self.currentActionGroup = action_group
- self.traverseWidgetTree(elem)
- self.currentActionGroup = None
-
- widgetTreeItemHandlers = {
- 'widget': createWidget,
- 'addaction': addAction,
- 'layout': createLayout,
- 'spacer': createSpacer,
- 'item': handleItem,
- 'action': createAction,
- 'actiongroup': createActionGroup,
- 'column': addHeader,
- 'row': addHeader }
-
- def traverseWidgetTree(self, elem):
- for child in iter(elem):
-
- try:
- handler = self.widgetTreeItemHandlers[child.tag]
- except KeyError:
- continue
-
- handler(self, child)
-
-
-
- def createUserInterface(self, elem):
- cname = elem.attrib['class']
- wname = elem.attrib['name']
- if not wname:
- wname = cname
- if wname.startswith('Q'):
- wname = wname[1:]
-
- wname = wname[0].lower() + wname[1:]
-
- self.toplevelWidget = self.createToplevelWidget(cname, wname)
- self.toplevelWidget.setObjectName(wname)
- DEBUG('toplevel widget is %s', self.toplevelWidget.metaObject().className())
- self.wprops.setProperties(self.toplevelWidget, elem)
- self.stack.push(self.toplevelWidget)
- self.traverseWidgetTree(elem)
- self.stack.popWidget()
- self.addActions()
- self.setBuddies()
- self.setDelayedProps()
-
-
- def addActions(self):
- for widget, action_name in self.actions:
- if action_name == 'separator':
- widget.addSeparator()
- continue
- DEBUG('add action %s to %s', action_name, widget.objectName())
- action_obj = getattr(self.toplevelWidget, action_name)
- if isinstance(action_obj, QtGui.QMenu):
- widget.addAction(action_obj.menuAction())
- continue
- if not isinstance(action_obj, QtGui.QActionGroup):
- widget.addAction(action_obj)
- continue
-
-
-
- def setDelayedProps(self):
- for func, args in self.wprops.delayed_props:
- func(args)
-
-
-
- def setBuddies(self):
- for widget, buddy in self.wprops.buddies:
- DEBUG('%s is buddy of %s', buddy, widget.objectName())
-
- try:
- widget.setBuddy(getattr(self.toplevelWidget, buddy))
- continue
- except AttributeError:
- DEBUG('ERROR in ui spec: %s (buddy of %s) does not exist', buddy, widget.objectName())
- continue
-
-
-
-
-
- def classname(self, elem):
- DEBUG('uiname is %s', elem.text)
- name = elem.text
- if name is None:
- name = ''
-
- self.uiname = name
- self.wprops.uiname = name
- self.setContext(name)
-
-
- def setContext(self, context):
- pass
-
-
- def readDefaults(self, elem):
- self.defaults['margin'] = int(elem.attrib['margin'])
- self.defaults['spacing'] = int(elem.attrib['spacing'])
-
-
- def setTaborder(self, elem):
- lastwidget = None
- for widget_elem in elem:
- widget = getattr(self.toplevelWidget, widget_elem.text)
- if lastwidget is not None:
- self.toplevelWidget.setTabOrder(lastwidget, widget)
-
- lastwidget = widget
-
-
-
- def readResources(self, elem):
- for include in elem.getiterator('include'):
- loc = include.attrib.get('location')
- if loc and loc.endswith('.qrc'):
- self.resources.append(os.path.basename(loc[:-4] + '_rc'))
- continue
-
-
-
- def createConnections(self, elem):
-
- def name2object(obj):
- if obj == self.uiname:
- return self.toplevelWidget
- return getattr(self.toplevelWidget, obj)
-
- for conn in iter(elem):
- QtCore.QObject.connect(name2object(conn.findtext('sender')), QtCore.SIGNAL(conn.findtext('signal')), self.factory.getSlot(name2object(conn.findtext('receiver')), conn.findtext('slot').split('(')[0]))
-
- QtCore.QMetaObject.connectSlotsByName(self.toplevelWidget)
-
-
- def customWidgets(self, elem):
-
- def header2module(header):
- if header.endswith('.h'):
- header = header[:-2]
-
- mpath = []
- for part in header.split('/'):
- if part not in ('', '.'):
- if part == '..':
- raise SyntaxError("custom widget header file name may not contain '..'.")
- part == '..'
- mpath.append(part)
- continue
-
- return '.'.join(mpath)
-
- for custom_widget in iter(elem):
- classname = custom_widget.findtext('class')
- if classname.startswith('Q3'):
- raise NoSuchWidgetError(classname)
- classname.startswith('Q3')
- if not custom_widget.findtext('extends'):
- pass
- self.factory.addCustomWidget(classname, 'QWidget', header2module(custom_widget.findtext('header')))
-
-
-
- def createToplevelWidget(self, classname, widgetname):
- raise NotImplementedError
-
-
- def finalize(self):
- pass
-
-
- def parse(self, filename):
- branchHandlers = (('layoutdefault', self.readDefaults), ('class', self.classname), ('customwidgets', self.customWidgets), ('widget', self.createUserInterface), ('connections', self.createConnections), ('tabstops', self.setTaborder), ('resources', self.readResources))
- document = parse(filename)
- version = document.getroot().attrib['version']
- DEBUG('UI version is %s' % (version,))
- for tagname, actor in branchHandlers:
- elem = document.find(tagname)
- if elem is not None:
- actor(elem)
- continue
-
- self.finalize()
- w = self.toplevelWidget
- self.reset()
- return w
-
-
-