mirror of
				https://github.com/qgis/QGIS.git
				synced 2025-10-31 00:06:02 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			137 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			137 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| #!/usr/bin/env python3
 | |
| # -*- coding: utf-8 -*-
 | |
| 
 | |
| """
 | |
| ***************************************************************************
 | |
|     widgets_tree.py
 | |
|     ---------------------
 | |
|     Date                 : May 2011
 | |
|     Copyright            : (C) 2011 by Martin Dobias
 | |
|     Email                : wonder dot sk at gmail dot com
 | |
| ***************************************************************************
 | |
| *                                                                         *
 | |
| *   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'
 | |
| 
 | |
| """
 | |
| 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
 | |
| import glob
 | |
| from qgis.PyQt.QtWidgets import QWidget, QDialog, QCheckBox, QComboBox, QDial, QPushButton, QLabel, QLCDNumber, QLineEdit, QRadioButton, QScrollBar, QSlider, QSpinBox, QTextEdit, QDateEdit, QTimeEdit, QDateTimeEdit, QListView, QProgressBar, QTableView, QTabWidget, QTextBrowser, QDialogButtonBox, QScrollArea, QGroupBox, QStackedWidget
 | |
| from qgis.PyQt.uic import loadUi
 | |
| from qgis.PyQt.QtXml import QDomDocument
 | |
| 
 | |
| # qwt_plot is missing somehow but it may depend on installed packages
 | |
| from qgis.PyQt import Qwt5 as qwt_plot
 | |
| 
 | |
| sys.modules['qwt_plot'] = qwt_plot
 | |
| 
 | |
| # loadUi is looking for custom widget in module which is lowercase version of
 | |
| # the class, which do not exist (AFAIK) -> preload them, problems anyway:
 | |
| # missing in gui: QgsColorRampComboBox, QgsRendererRulesTreeWidget,
 | |
| # QgsRendererRulesTreeWidget
 | |
| # and QgsProjectionSelector cannot open db file
 | |
| from qgis import gui
 | |
| for m in ['qgscolorbutton', 'qgscolorrampcombobox', 'qgsprojectionselector', 'qgslabelpreview', 'qgsrulebasedrendererwidget', 'qgscollapsiblegroupbox', 'qgsblendmodecombobox', 'qgsexpressionbuilderwidget', 'qgsrasterformatsaveoptionswidget', 'qgsrasterpyramidsoptionswidget', 'qgsscalecombobox', 'qgsfilterlineedit', 'qgsdualview']:
 | |
|     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)
 | |
|         # list of widget classes we want to follow
 | |
|         self.follow = [
 | |
|             QWidget, QDialog,
 | |
|             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):
 | |
|         sys.stderr.write(msg + "\n")
 | |
| 
 | |
|     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
 | |
| 
 | |
|         lab = label
 | |
|         if hasattr(widget, 'text'):
 | |
|             lab = widget.text()
 | |
|         if widget.windowTitle():
 | |
|             label = widget.windowTitle()
 | |
|         if not lab:
 | |
|             lab = ''
 | |
| 
 | |
|         subElement = self.doc.createElement('widget')
 | |
|         subElement.setAttribute('class', widget.__class__.__name__)
 | |
|         subElement.setAttribute('objectName', widget.objectName())
 | |
|         subElement.setAttribute('label', lab)
 | |
|         element.appendChild(subElement)
 | |
| 
 | |
|         # 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(subElement, w, level + 1, child['label'])
 | |
| 
 | |
|     def xml(self):
 | |
|         self.doc = QDomDocument()
 | |
|         element = self.doc.createElement("qgiswidgets")
 | |
|         self.doc.appendChild(element)
 | |
|         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 as e:
 | |
|                 self.printMsg(str(e))
 | |
| 
 | |
|         return self.doc.toString(2)
 | |
| 
 | |
| 
 | |
| if __name__ == '__main__':
 | |
|     from qgis.PyQt.QtCore import QApplication
 | |
| 
 | |
|     app = QApplication(sys.argv)  # required by loadUi
 | |
|     inspector = UiInspector()
 | |
|     xml = inspector.xml()
 | |
|     sys.stdout.write(xml)
 | |
|     sys.stdout.flush()
 | |
| 
 | |
|     del app
 | |
|     sys.exit(0)
 |