diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2022-08-02 08:49:26 +0200 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2022-08-08 21:29:17 +0200 |
commit | c3157d3960deecd2df3b7a1e99c64f77eeb557cf (patch) | |
tree | 21b72d38544845b930cd38009c39440406fb277e | |
parent | f55402b8b0b7b84f94088d2b20e43dea1e18b439 (diff) |
snippets_translate: Add a way of overriding snippets
Prototypically fix the QInputDialog dialog snippets.
Task-number: PYSIDE-1984
Fixes: PYSIDE-1952
Change-Id: Iad75971b8778a6364123963d28f54f02a0c56737
Reviewed-by: Shyamnath Premnadh <Shyamnath.Premnadh@qt.io>
Reviewed-by: Christian Tismer <tismer@stackless.com>
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
(cherry picked from commit 22bc41605a4dd18330a39f6346143ec55a7d6074)
Reviewed-by: Adrian Herrmann <adrian.herrmann@qt.io>
6 files changed, 59 insertions, 5 deletions
diff --git a/sources/pyside6/doc/snippets/qtbase/examples/widgets/dialogs/standarddialogs/dialog_0.cpp.py b/sources/pyside6/doc/snippets/qtbase/examples/widgets/dialogs/standarddialogs/dialog_0.cpp.py new file mode 100644 index 000000000..d21595041 --- /dev/null +++ b/sources/pyside6/doc/snippets/qtbase/examples/widgets/dialogs/standarddialogs/dialog_0.cpp.py @@ -0,0 +1,4 @@ +i, ok = QInputDialog.getInt(self, "QInputDialog::getInt()", + "Percentage:", 25, 0, 100, 1) +if ok: + integerLabel.setText(f"{i}") diff --git a/sources/pyside6/doc/snippets/qtbase/examples/widgets/dialogs/standarddialogs/dialog_1.cpp.py b/sources/pyside6/doc/snippets/qtbase/examples/widgets/dialogs/standarddialogs/dialog_1.cpp.py new file mode 100644 index 000000000..4cb3dfdb3 --- /dev/null +++ b/sources/pyside6/doc/snippets/qtbase/examples/widgets/dialogs/standarddialogs/dialog_1.cpp.py @@ -0,0 +1,5 @@ +d, ok = QInputDialog.getDouble(self, "QInputDialog::getDouble()", + "Amount:", 37.56, -10000, 10000, 2, + Qt.WindowFlags(), 1) +if ok: + doubleLabel.setText(f"${d}") diff --git a/sources/pyside6/doc/snippets/qtbase/examples/widgets/dialogs/standarddialogs/dialog_2.cpp.py b/sources/pyside6/doc/snippets/qtbase/examples/widgets/dialogs/standarddialogs/dialog_2.cpp.py new file mode 100644 index 000000000..7e3d27afb --- /dev/null +++ b/sources/pyside6/doc/snippets/qtbase/examples/widgets/dialogs/standarddialogs/dialog_2.cpp.py @@ -0,0 +1,5 @@ +items = ["Spring", "Summer", "Fall", "Winter"] +item, ok = QInputDialog.getItem(self, "QInputDialog::getItem()", + "Season:", items, 0, False) +if ok and item: + itemLabel.setText(item) diff --git a/sources/pyside6/doc/snippets/qtbase/examples/widgets/dialogs/standarddialogs/dialog_3.cpp.py b/sources/pyside6/doc/snippets/qtbase/examples/widgets/dialogs/standarddialogs/dialog_3.cpp.py new file mode 100644 index 000000000..85a22a16c --- /dev/null +++ b/sources/pyside6/doc/snippets/qtbase/examples/widgets/dialogs/standarddialogs/dialog_3.cpp.py @@ -0,0 +1,5 @@ +text, ok = QInputDialog.getText(self, "QInputDialog.getText()", + "User name:", QLineEdit.Normal, + QDir.home().dirName()) +if ok and text: + textLabel.setText(text) diff --git a/sources/pyside6/doc/snippets/qtbase/examples/widgets/dialogs/standarddialogs/dialog_4.cpp.py b/sources/pyside6/doc/snippets/qtbase/examples/widgets/dialogs/standarddialogs/dialog_4.cpp.py new file mode 100644 index 000000000..d16045141 --- /dev/null +++ b/sources/pyside6/doc/snippets/qtbase/examples/widgets/dialogs/standarddialogs/dialog_4.cpp.py @@ -0,0 +1,4 @@ +text, ok = QInputDialog.getMultiLineText(self, "QInputDialog.getMultiLineText()", "" + "Address:", "John Doe\nFreedom Street") +if ok and text: + multiLineTextLabel.setText(text) diff --git a/tools/snippets_translate/main.py b/tools/snippets_translate/main.py index f7220511a..9ded49569 100644 --- a/tools/snippets_translate/main.py +++ b/tools/snippets_translate/main.py @@ -75,6 +75,8 @@ SKIP_END = (".pro", ".pri", ".cmake", ".qdoc", ".yaml", ".frag", ".qsb", ".vert" SKIP_BEGIN = ("changes-", ".") SNIPPET_PATTERN = re.compile(r"//! ?\[([^]]+)\]") +SOURCE_PATH = Path(__file__).parents[2] / "sources" / "pyside6" / "doc" / "snippets" +OVERRIDDEN_SNIPPET = "# OVERRIDDEN_SNIPPET" class FileStatus(Enum): Exists = 0 @@ -205,10 +207,25 @@ def get_snippet_ids(line: str) -> List[str]: return result -def get_snippets(lines: List[str]) -> List[List[str]]: +def get_snippet_override(start_id: str, rel_path: str) -> List[str]: + # Check if the snippet is overridden by a local file + override_name = f"{rel_path.stem}_{start_id}{rel_path.suffix}.py" + override_path = SOURCE_PATH / rel_path.parent / override_name + snippet = [] + if override_path.is_file(): + snippet.append(OVERRIDDEN_SNIPPET) + id_string = f"//! [{start_id}]" + snippet.append(id_string) + snippet.extend(override_path.read_text().splitlines()) + snippet.append(id_string) + return snippet + + +def get_snippets(lines: List[str], rel_path: str) -> List[List[str]]: # Extract (potentially overlapping) snippets from a C++ file indicated by //! [1] snippets: List[List[str]] = [] snippet: List[str] + done_snippets : List[str] = [] i = 0 while i < len(lines): @@ -219,7 +236,15 @@ def get_snippets(lines: List[str]) -> List[List[str]]: while start_ids: # Start of a snippet start_id = start_ids.pop(0) - snippet = [line] # The snippet starts with his id + if start_id in done_snippets: + continue + done_snippets.append(start_id) + snippet = get_snippet_override(start_id, rel_path) + if snippet: + snippets.append(snippet) + continue + + snippet.append(line) # The snippet starts with this id # Find the end of the snippet j = i @@ -265,9 +290,11 @@ def get_license_from_file(filename): return "" -def translate_file(file_path, final_path, debug, write): +def translate_file(file_path, final_path, qt_path, debug, write): with open(str(file_path)) as f: - snippets = get_snippets(f.read().splitlines()) + lines = f.read().splitlines() + rel_path = file_path.relative_to(qt_path) + snippets = get_snippets(lines, rel_path) if snippets: # TODO: Get license header first license_header = get_license_from_file(str(file_path)) @@ -280,6 +307,10 @@ def translate_file(file_path, final_path, debug, write): translated_lines = [] for snippet in snippets: + if snippet and snippet[0] == OVERRIDDEN_SNIPPET: + translated_lines.extend(snippet[1:]) + continue + for line in snippet: if not line: continue @@ -358,7 +389,7 @@ def copy_file(file_path, qt_path, out_path, write=False, debug=False): # Change .cpp to .py, .h to .h.py # Translate C++ code into Python code if final_path.name.endswith(".cpp") or final_path.name.endswith(".h"): - translate_file(file_path, final_path, debug, write) + translate_file(file_path, final_path, qt_path, debug, write) return status |