2011-05-13 22:00:46 +02:00
|
|
|
#!/usr/bin/env python
|
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
2012-10-06 13:10:25 +02:00
|
|
|
"""
|
|
|
|
***************************************************************************
|
|
|
|
widgets_tree.py
|
|
|
|
---------------------
|
|
|
|
Date : May 2011
|
|
|
|
Copyright : (C) 2011 by Martin Dobias
|
2012-10-08 00:29:13 +02:00
|
|
|
Email : wonder dot sk at gmail dot com
|
2012-10-06 13:10:25 +02:00
|
|
|
***************************************************************************
|
|
|
|
* *
|
|
|
|
* This program is free software; you can redistribute it and/or modify *
|
|
|
|
* it under the terms of the GNU General Public License as published by *
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or *
|
|
|
|
* (at your option) any later version. *
|
|
|
|
* *
|
|
|
|
***************************************************************************
|
|
|
|
"""
|
|
|
|
|
|
|
|
__author__ = 'Martin Dobias'
|
|
|
|
__date__ = 'May 2011'
|
|
|
|
__copyright__ = '(C) 2011, Martin Dobias'
|
|
|
|
# This will get replaced with a git SHA1 when you do a git archive
|
|
|
|
__revision__ = '$Format:%H$'
|
2011-05-13 22:00:46 +02:00
|
|
|
|
|
|
|
"""
|
|
|
|
Reads .ui files from ../src/ui/ directory and write to stdout an XML describing
|
|
|
|
widgets tree.
|
|
|
|
|
|
|
|
Python bindings must be compiled and in PYTHONPATH
|
|
|
|
|
|
|
|
QGIS libraries must be in LD_LIBRARY_PATH
|
|
|
|
|
|
|
|
Output should go to ../resources/customization.xml
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
import sys
|
|
|
|
import os, glob, imp
|
|
|
|
from PyQt4.QtGui import *
|
|
|
|
from PyQt4.uic import loadUi, compileUi
|
|
|
|
from xml.etree.ElementTree import Element, SubElement, Comment, tostring
|
|
|
|
from xml.dom import minidom
|
|
|
|
|
|
|
|
# qwt_plot is missing somehow but it may depend on installed packages
|
|
|
|
from PyQt4 import Qwt5 as qwt_plot
|
|
|
|
sys.modules['qwt_plot'] = qwt_plot
|
|
|
|
|
2012-12-10 00:12:07 +01:00
|
|
|
# loadUi is looking for custom widget in module which is lowercase version of
|
2011-05-13 22:00:46 +02:00
|
|
|
# the class, which do not exist (AFAIK) -> preload them, problems anyway:
|
|
|
|
# missing in gui: QgsColorRampComboBox, QgsRendererRulesTreeWidget,
|
|
|
|
# QgsRendererRulesTreeWidget, QgsAttributeTableView
|
|
|
|
# and QgsProjectionSelector cannot open db file
|
|
|
|
from qgis import gui
|
|
|
|
for m in ['qgscolorbutton', 'qgscolorrampcombobox', 'qgsprojectionselector', 'qgslabelpreview', 'qgsrulebasedrendererv2widget', 'qgsattributetableview' ]:
|
|
|
|
sys.modules[m] = gui
|
|
|
|
|
|
|
|
class UiInspector:
|
|
|
|
def __init__(self ):
|
|
|
|
self.ui_dir = os.path.abspath ( os.path.join( os.path.dirname(__file__) , '../src/ui/*.ui' ) )
|
|
|
|
self.printMsg ( "Loading UI files " + self.ui_dir )
|
2012-12-10 00:12:07 +01:00
|
|
|
# list of widget classes we want to follow
|
2011-05-13 22:00:46 +02:00
|
|
|
self.follow = [
|
2012-12-10 00:12:07 +01:00
|
|
|
QWidget, QDialog,
|
2011-05-13 22:00:46 +02:00
|
|
|
QCheckBox, QComboBox, QDial, QPushButton, QLabel, QLCDNumber, QLineEdit, QRadioButton, QScrollBar, QSlider, QSpinBox, QTextEdit,
|
|
|
|
QDateEdit, QTimeEdit, QDateTimeEdit, QListView, QProgressBar, QTableView, QTabWidget, QTextBrowser, QDialogButtonBox,
|
|
|
|
QScrollArea, QGroupBox, QStackedWidget,
|
|
|
|
]
|
|
|
|
|
|
|
|
def printMsg ( self, msg ):
|
2012-12-10 00:12:07 +01:00
|
|
|
sys.stderr.write( msg + "\n" )
|
2011-05-13 22:00:46 +02:00
|
|
|
|
|
|
|
def widgetXml(self, element, widget, level = 0, label = None ):
|
|
|
|
#print tostring ( element )
|
|
|
|
#self.printMsg ( "class: " + str( type ( widget ) ) )
|
|
|
|
#self.printMsg ( "objectName: " + widget.objectName() )
|
|
|
|
#self.printMsg ( "windowTitle: " + widget.windowTitle() )
|
|
|
|
|
|
|
|
if not widget.objectName(): return
|
2012-12-10 00:12:07 +01:00
|
|
|
|
2011-05-13 22:00:46 +02:00
|
|
|
lab = label
|
|
|
|
if hasattr( widget, 'text' ):
|
|
|
|
lab = widget.text()
|
|
|
|
if widget.windowTitle():
|
|
|
|
label = widget.windowTitle()
|
|
|
|
if not lab:
|
|
|
|
lab = ''
|
|
|
|
|
|
|
|
lab = unicode(lab).encode("ascii","replace")
|
|
|
|
|
|
|
|
sub_element = SubElement( element, 'widget')
|
|
|
|
sub_element.set('class', widget.__class__.__name__ )
|
|
|
|
sub_element.set('objectName', widget.objectName() )
|
|
|
|
sub_element.set('label', lab )
|
|
|
|
|
|
|
|
#print str ( widget.children () )
|
|
|
|
# tab widget label is stored in QTabWidget->QTabBarPrivate->tabList->QTab ..
|
|
|
|
if type(widget) in [ QTabWidget ]:
|
|
|
|
children = list ( { 'widget': widget.widget(i), 'label': widget.tabText(i) } for i in range ( 0, widget.count() ) )
|
|
|
|
else:
|
|
|
|
children = list ( { 'widget': c, 'label': None } for c in widget.children () )
|
|
|
|
for child in children:
|
|
|
|
w = child['widget']
|
|
|
|
if w.isWidgetType() and ( type(w) in self.follow ):
|
|
|
|
self.widgetXml ( sub_element, w, level+1, child['label'] )
|
2012-12-10 00:12:07 +01:00
|
|
|
|
2011-05-13 22:00:46 +02:00
|
|
|
|
|
|
|
def treeXml(self, element ):
|
|
|
|
xml = ''
|
|
|
|
# debug
|
|
|
|
for p in glob.glob( self.ui_dir ):
|
|
|
|
self.printMsg ( "Loading " + p )
|
|
|
|
# qgsrasterlayerpropertiesbase.ui is giving: No module named qwt_plot
|
|
|
|
try:
|
|
|
|
widget = loadUi ( p )
|
|
|
|
#print dir ( ui )
|
|
|
|
self.widgetXml ( element, widget )
|
|
|
|
except Exception, e:
|
|
|
|
#except IOError, e:
|
|
|
|
self.printMsg ( str(e) )
|
|
|
|
|
|
|
|
return xml
|
|
|
|
|
|
|
|
def xml( self ) :
|
|
|
|
#xml = "<?xml version='1.0' encoding='UTF-8'?>\n"
|
|
|
|
#xml += "<!DOCTYPE qgiswidgets SYSTEM 'http://mrcc.com/qgiswidgets.dtd'>\n"
|
|
|
|
element = Element('qgiswidgets')
|
|
|
|
self.treeXml( element )
|
|
|
|
|
|
|
|
string = tostring ( element, 'utf-8' )
|
|
|
|
reparsed = minidom.parseString(string)
|
|
|
|
xml = reparsed.toprettyxml(indent=" ")
|
|
|
|
return xml
|
2012-12-10 00:12:07 +01:00
|
|
|
|
2011-05-13 22:00:46 +02:00
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
app = QApplication(sys.argv) # required by loadUi
|
|
|
|
inspector = UiInspector()
|
|
|
|
xml = inspector.xml()
|
|
|
|
sys.stdout.write( xml )
|
|
|
|
sys.stdout.flush()
|
|
|
|
|
|
|
|
del app
|
|
|
|
sys.exit(0)
|