Files
qt-creator/scripts/generateClangFormatChecksUI.py
Ivan Donchevskii e9d443b1c7 ClangFormat: Improve the configuration UI
Use QComboBox, QLineEdit and QPlainTextEdit to edit
different option types.

Show changes in the preview without pressing 'Apply' button.

The clangformatchecks.ui file is generated with the python
script that is a part of this commit.

Change-Id: If5ff0acab6edd74f2e087e31fbd3ad1b9f847030
Reviewed-by: Marco Bubke <marco.bubke@qt.io>
2019-04-25 07:52:48 +00:00

287 lines
8.5 KiB
Python

#!/usr/bin/env python
############################################################################
#
# Copyright (C) 2019 The Qt Company Ltd.
# Contact: https://www.qt.io/licensing/
#
# This file is part of Qt Creator.
#
# Commercial License Usage
# Licensees holding valid commercial Qt licenses may use this file in
# accordance with the commercial license agreement provided with the
# Software or, alternatively, in accordance with the terms contained in
# a written agreement between you and The Qt Company. For licensing terms
# and conditions see https://www.qt.io/terms-conditions. For further
# information use the contact form at https://www.qt.io/contact-us.
#
# GNU General Public License Usage
# Alternatively, this file may be used under the terms of the GNU
# General Public License version 3 as published by the Free Software
# Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
# included in the packaging of this file. Please review the following
# information to ensure the GNU General Public License requirements will
# be met: https://www.gnu.org/licenses/gpl-3.0.html.
#
############################################################################
import argparse
import json
import os
import docutils.nodes
import docutils.parsers.rst
import docutils.utils
def full_ui_content(checks):
return '''<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ClangFormat::ClangFormatChecksWidget</class>
<widget class="QWidget" name="ClangFormat::ClangFormatChecksWidget">
<property name="maximumSize">
<size>
<width>450</width>
<height>16777215</height>
</size>
</property>
<layout class="QGridLayout" name="checksLayout">
''' + checks + ''' </layout>
</widget>
<resources/>
<connections/>
</ui>
'''
def parse_arguments():
parser = argparse.ArgumentParser(description='Clazy checks header file generator')
parser.add_argument('--clang-format-options-rst', help='path to ClangFormatStyleOptions.rst',
default=None, dest='options_rst')
return parser.parse_args()
def parse_rst(text):
parser = docutils.parsers.rst.Parser()
components = (docutils.parsers.rst.Parser,)
settings = docutils.frontend.OptionParser(components=components).get_default_values()
document = docutils.utils.new_document('<rst-doc>', settings=settings)
parser.parse(text, document)
return document
def createItem(key, value, index):
label = ''' <item row="''' + str(index) + '''" column="0">
<widget class="QLabel" name="label''' + key + '''">
<property name="text">
<string>''' + key + '''</string>
</property>
</widget>
</item>
'''
value_item = ''
if value[0] == 'bool':
value_item = ''' <item row="''' + str(index) + '''" column="1">
<widget class="QComboBox" name="''' + key + '''">
<property name="focusPolicy">
<enum>Qt::StrongFocus</enum>
</property>
<item>
<property name="text">
<string>Default</string>
</property>
</item>
<item>
<property name="text">
<string>true</string>
</property>
</item>
<item>
<property name="text">
<string>false</string>
</property>
</item>
</widget>
</item>
'''
elif value[0].startswith('std::string') or value[0] == 'unsigned' or value[0] == 'int':
value_item = ''' <item row="''' + str(index) + '''" column="1">
<layout class="QHBoxLayout">
<item>
<widget class="QLineEdit" name="''' + key + '''">
</widget>
</item>
<item>
<widget class="QPushButton" name="set''' + key + '''">
<property name="maximumSize">
<size>
<width>40</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>Set</string>
</property>
</widget>
</item>
</layout>
</item>
'''
elif value[0].startswith('std::vector'):
value_item = ''' <item row="''' + str(index) + '''" column="1">
<layout class="QHBoxLayout">
<item>
<widget class="QPlainTextEdit" name="''' + key + '''">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed"/>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>50</height>
</size>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="set''' + key + '''">
<property name="maximumSize">
<size>
<width>40</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string>Set</string>
</property>
</widget>
</item>
</layout>
</item>
'''
else:
if ' ' in value[1]:
value_item = ''
for i, val in enumerate(value):
if i == 0:
continue
index += 1
space_index = val.find(' ')
val = val[space_index + 1:]
value_item += ''' <item row="''' + str(index) + '''" column="0">
<widget class="QLabel" name="label''' + val + '''">
<property name="text">
<string> ''' + val + '''</string>
</property>
</widget>
</item>
'''
value_item += ''' <item row="''' + str(index) + '''" column="1">
<widget class="QComboBox" name="''' + val + '''">
<property name="focusPolicy">
<enum>Qt::StrongFocus</enum>
</property>
<item>
<property name="text">
<string>Default</string>
</property>
</item>
<item>
<property name="text">
<string>true</string>
</property>
</item>
<item>
<property name="text">
<string>false</string>
</property>
</item>
</widget>
</item>
'''
else:
value_item = ''' <item row="''' + str(index) + '''" column="1">
<widget class="QComboBox" name="''' + key + '''">
<property name="focusPolicy">
<enum>Qt::StrongFocus</enum>
</property>
'''
if index > 0:
value_item += ''' <item>
<property name="text">
<string>Default</string>
</property>
</item>
'''
for i, val in enumerate(value):
if i == 0:
continue
underline_index = val.find('_')
val = val[underline_index + 1:]
value_item += ''' <item>
<property name="text">
<string>''' + val + '''</string>
</property>
</item>
'''
value_item += ''' </widget>
</item>
'''
return label + value_item, index
class MyVisitor(docutils.nodes.NodeVisitor):
in_bullet_list = False
in_bullet_list_paragraph = False
tree = {}
last_key = ''
def visit_term(self, node):
node_values = node.traverse(condition=docutils.nodes.Text)
name = node_values[0].astext()
self.last_key = name
self.tree[name] = [node_values[2].astext()]
def visit_bullet_list(self, node):
self.in_bullet_list = True
def depart_bullet_list(self, node):
self.in_bullet_list = False
def visit_paragraph(self, node):
if self.in_bullet_list:
self.in_bullet_list_paragraph = True
def depart_paragraph(self, node):
self.in_bullet_list_paragraph = False
def visit_literal(self, node):
if self.in_bullet_list_paragraph:
value = node.traverse(condition=docutils.nodes.Text)[0].astext()
self.tree[self.last_key].append(value)
self.in_bullet_list_paragraph = False
def unknown_visit(self, node):
"""Called for all other node types."""
#print(node)
pass
def unknown_departure(self, node):
pass
def main():
arguments = parse_arguments()
content = file(arguments.options_rst).read()
document = parse_rst(content)
visitor = MyVisitor(document)
document.walkabout(visitor)
keys = visitor.tree.keys()
basedOnStyleKey = 'BasedOnStyle'
keys.remove(basedOnStyleKey)
keys.sort()
text = ''
line, index = createItem(basedOnStyleKey, visitor.tree[basedOnStyleKey], 0)
text += line
index = 1
for key in keys:
line, index = createItem(key, visitor.tree[key], index)
text += line
index += 1
current_path = os.path.dirname(os.path.abspath(__file__))
ui_path = os.path.abspath(os.path.join(current_path, '..', 'src',
'plugins', 'clangformat', 'clangformatchecks.ui'))
with open(ui_path, 'w') as f:
f.write(full_ui_content(text))
if __name__ == "__main__":
main()