aboutsummaryrefslogtreecommitdiffstats
path: root/scripts
diff options
context:
space:
mode:
authorIvan Donchevskii <ivan.donchevskii@qt.io>2019-04-24 14:44:31 +0200
committerIvan Donchevskii <ivan.donchevskii@qt.io>2019-04-25 07:52:48 +0000
commite9d443b1c703e675cee543e7af3a196be0b2040d (patch)
tree0a27142fdc731f88ddaa0eb260c6f8e80f978601 /scripts
parentd46ce1705f43589d9ae78448b4c7600602047e9e (diff)
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>
Diffstat (limited to 'scripts')
-rw-r--r--scripts/generateClangFormatChecksUI.py286
1 files changed, 286 insertions, 0 deletions
diff --git a/scripts/generateClangFormatChecksUI.py b/scripts/generateClangFormatChecksUI.py
new file mode 100644
index 0000000000..0775dd96f6
--- /dev/null
+++ b/scripts/generateClangFormatChecksUI.py
@@ -0,0 +1,286 @@
+#!/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()