From e9d443b1c703e675cee543e7af3a196be0b2040d Mon Sep 17 00:00:00 2001 From: Ivan Donchevskii Date: Wed, 24 Apr 2019 14:44:31 +0200 Subject: 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 --- scripts/generateClangFormatChecksUI.py | 286 +++++++++++++++++++++++++++++++++ 1 file changed, 286 insertions(+) create mode 100644 scripts/generateClangFormatChecksUI.py (limited to 'scripts') 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 ''' + + ClangFormat::ClangFormatChecksWidget + + + + 450 + 16777215 + + + +''' + checks + ''' + + + + +''' + +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('', settings=settings) + parser.parse(text, document) + return document + +def createItem(key, value, index): + label = ''' + + + ''' + key + ''' + + + +''' + value_item = '' + if value[0] == 'bool': + value_item = ''' + + + Qt::StrongFocus + + + + Default + + + + + true + + + + + false + + + + +''' + elif value[0].startswith('std::string') or value[0] == 'unsigned' or value[0] == 'int': + value_item = ''' + + + + + + + + + + 40 + 16777215 + + + + Set + + + + + +''' + elif value[0].startswith('std::vector'): + value_item = ''' + + + + + + + + + 16777215 + 50 + + + + + + + + + 40 + 16777215 + + + + Set + + + + + +''' + 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 += ''' + + + ''' + val + ''' + + + +''' + value_item += ''' + + + Qt::StrongFocus + + + + Default + + + + + true + + + + + false + + + + +''' + else: + value_item = ''' + + + Qt::StrongFocus + +''' + if index > 0: + value_item += ''' + + Default + + +''' + for i, val in enumerate(value): + if i == 0: + continue + underline_index = val.find('_') + val = val[underline_index + 1:] + value_item += ''' + + ''' + val + ''' + + +''' + value_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() -- cgit v1.2.3