QGIS/scripts/widgets_tree.py
2024-11-29 15:38:02 +01:00

205 lines
5.8 KiB
Python

#!/usr/bin/env python3
"""
***************************************************************************
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 glob
import os
import sys
# qwt_plot is missing somehow but it may depend on installed packages
from qgis.PyQt import Qwt5 as qwt_plot
from qgis.PyQt.QtWidgets import (
QCheckBox,
QComboBox,
QDateEdit,
QDateTimeEdit,
QDial,
QDialog,
QDialogButtonBox,
QGroupBox,
QLabel,
QLCDNumber,
QLineEdit,
QListView,
QProgressBar,
QPushButton,
QRadioButton,
QScrollArea,
QScrollBar,
QSlider,
QSpinBox,
QStackedWidget,
QTableView,
QTabWidget,
QTextBrowser,
QTextEdit,
QTimeEdit,
QWidget,
)
from qgis.PyQt.QtXml import QDomDocument
from qgis.PyQt.uic import loadUi
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)