From 6c4ffbbd6277f0397a213533891779d18c45101b Mon Sep 17 00:00:00 2001 From: Anthony Date: Tue, 23 Apr 2024 11:32:16 +0200 Subject: [PATCH] delete legacy editor --- story-editor-legacy/CMakeLists.txt | 200 - story-editor-legacy/assets/build.png | Bin 1381 -> 0 bytes story-editor-legacy/assets/build.svg | 131 - story-editor-legacy/assets/check-mark.png | Bin 23826 -> 0 bytes story-editor-legacy/assets/close-outline.svg | 1 - .../assets/file-document-plus-outline.png | Bin 1324 -> 0 bytes .../assets/file-document-plus-outline.svg | 39 - story-editor-legacy/assets/floppy.svg | 1 - .../assets/folder-open-outline.svg | 1 - story-editor-legacy/assets/folder-open.svg | 1 - story-editor-legacy/assets/home.png | Bin 29421 -> 0 bytes story-editor-legacy/assets/left.png | Bin 7181 -> 0 bytes story-editor-legacy/assets/pause-button.png | Bin 43707 -> 0 bytes .../assets/play-circle-green.png | Bin 3509 -> 0 bytes .../assets/play-circle-green.svg | 41 - story-editor-legacy/assets/play-circle.png | Bin 2382 -> 0 bytes story-editor-legacy/assets/play-circle.svg | 38 - story-editor-legacy/assets/right.png | Bin 7218 -> 0 bytes story-editor-legacy/assets/volume-high.svg | 1 - story-editor-legacy/assets/volume-off.png | Bin 2378 -> 0 bytes story-editor-legacy/assets/volume-off.svg | 38 - story-editor-legacy/assets/welcome.png | Bin 296477 -> 0 bytes story-editor-legacy/example.asm | 96 - story-editor-legacy/icon.rc | 1 - story-editor-legacy/nodeeditor/CMakeLists.txt | 274 - story-editor-legacy/nodeeditor/LICENSE.rst | 28 - story-editor-legacy/nodeeditor/README.rst | 261 - .../include/QtNodes/AbstractGraphModel | 1 - .../include/QtNodes/AbstractNodePainter | 1 - .../include/QtNodes/BasicGraphicsScene | 1 - .../include/QtNodes/ConnectionIdUtils | 1 - .../include/QtNodes/ConnectionStyle | 1 - .../include/QtNodes/DataFlowGraphModel | 1 - .../include/QtNodes/DataFlowGraphicsScene | 1 - .../include/QtNodes/DefaultNodePainter | 1 - .../nodeeditor/include/QtNodes/Definitions | 1 - .../nodeeditor/include/QtNodes/GraphicsView | 1 - .../include/QtNodes/GraphicsViewStyle | 1 - .../nodeeditor/include/QtNodes/NodeData | 1 - .../include/QtNodes/NodeDelegateModel | 1 - .../include/QtNodes/NodeDelegateModelRegistry | 1 - .../nodeeditor/include/QtNodes/NodeGeometry | 2 - .../nodeeditor/include/QtNodes/NodeState | 1 - .../nodeeditor/include/QtNodes/NodeStyle | 1 - .../include/QtNodes/StyleCollection | 1 - .../nodeeditor/include/QtNodes/UndoCommands | 1 - .../QtNodes/internal/AbstractGraphModel.hpp | 249 - .../QtNodes/internal/AbstractNodeGeometry.hpp | 82 - .../QtNodes/internal/AbstractNodePainter.hpp | 29 - .../QtNodes/internal/BasicGraphicsScene.hpp | 184 - .../include/QtNodes/internal/Compiler.hpp | 40 - .../internal/ConnectionGraphicsObject.hpp | 96 - .../QtNodes/internal/ConnectionIdHash.hpp | 55 - .../QtNodes/internal/ConnectionIdUtils.hpp | 151 - .../QtNodes/internal/ConnectionPainter.hpp | 21 - .../QtNodes/internal/ConnectionState.hpp | 60 - .../QtNodes/internal/ConnectionStyle.hpp | 54 - .../QtNodes/internal/DataFlowGraphModel.hpp | 135 - .../internal/DataFlowGraphicsScene.hpp | 40 - .../DefaultHorizontalNodeGeometry.hpp | 58 - .../QtNodes/internal/DefaultNodePainter.hpp | 34 - .../internal/DefaultVerticalNodeGeometry.hpp | 60 - .../include/QtNodes/internal/Definitions.hpp | 125 - .../include/QtNodes/internal/Export.hpp | 48 - .../include/QtNodes/internal/GraphicsView.hpp | 97 - .../QtNodes/internal/GraphicsViewStyle.hpp | 32 - .../internal/NodeConnectionInteraction.hpp | 68 - .../include/QtNodes/internal/NodeData.hpp | 43 - .../QtNodes/internal/NodeDelegateModel.hpp | 133 - .../internal/NodeDelegateModelRegistry.hpp | 171 - .../QtNodes/internal/NodeGraphicsObject.hpp | 91 - .../include/QtNodes/internal/NodeState.hpp | 52 - .../include/QtNodes/internal/NodeStyle.hpp | 53 - .../QtNodes/internal/OperatingSystem.hpp | 49 - .../QtNodes/internal/QStringStdHash.hpp | 22 - .../include/QtNodes/internal/QUuidStdHash.hpp | 14 - .../include/QtNodes/internal/Serializable.hpp | 16 - .../include/QtNodes/internal/Style.hpp | 48 - .../QtNodes/internal/StyleCollection.hpp | 43 - .../include/QtNodes/internal/UndoCommands.hpp | 123 - .../include/QtNodes/internal/locateNode.hpp | 16 - .../nodeeditor/resources/DefaultStyle.json | 42 - .../nodeeditor/resources/resources.qrc | 5 - .../nodeeditor/src/AbstractGraphModel.cpp | 105 - .../nodeeditor/src/AbstractNodeGeometry.cpp | 81 - .../nodeeditor/src/BasicGraphicsScene.cpp | 308 - .../src/ConnectionGraphicsObject.cpp | 380 - .../nodeeditor/src/ConnectionPainter.cpp | 254 - .../nodeeditor/src/ConnectionState.cpp | 66 - .../nodeeditor/src/ConnectionStyle.cpp | 205 - .../nodeeditor/src/DataFlowGraphModel.cpp | 536 - .../nodeeditor/src/DataFlowGraphicsScene.cpp | 189 - .../src/DefaultHorizontalNodeGeometry.cpp | 239 - .../nodeeditor/src/DefaultNodePainter.cpp | 284 - .../src/DefaultVerticalNodeGeometry.cpp | 300 - .../nodeeditor/src/Definitions.cpp | 1 - .../nodeeditor/src/GraphicsView.cpp | 405 - .../nodeeditor/src/GraphicsViewStyle.cpp | 94 - .../src/NodeConnectionInteraction.cpp | 152 - .../nodeeditor/src/NodeDelegateModel.cpp | 54 - .../src/NodeDelegateModelRegistry.cpp | 36 - .../nodeeditor/src/NodeGraphicsObject.cpp | 364 - .../nodeeditor/src/NodeState.cpp | 42 - .../nodeeditor/src/NodeStyle.cpp | 146 - .../nodeeditor/src/StyleCollection.cpp | 43 - .../nodeeditor/src/UndoCommands.cpp | 464 - .../nodeeditor/src/locateNode.cpp | 42 - story-editor-legacy/nsis-installer.nsi | 53 - .../ost_convert/CMakeLists.txt | 29 - .../ost_convert/command_line.cpp | 151 - .../ost_convert/command_line.h | 80 - story-editor-legacy/ost_convert/json.hpp | 24596 ---------------- story-editor-legacy/ost_convert/main.cpp | 55 - story-editor-legacy/ost_convert/miniz.c | 7736 ----- story-editor-legacy/ost_convert/miniz.h | 1350 - story-editor-legacy/ost_convert/ni_parser.c | 234 - story-editor-legacy/ost_convert/ni_parser.h | 68 - .../ost_convert/pack_archive.cpp | 618 - .../ost_convert/pack_archive.h | 58 - story-editor-legacy/ost_convert/zip.cpp | 274 - story-editor-legacy/ost_convert/zip.h | 52 - story-editor-legacy/scripts/media.asm | 47 - story-editor-legacy/src/about.ui | 199 - story-editor-legacy/src/choose-file.ui | 84 - story-editor-legacy/src/code_editor.cpp | 162 - story-editor-legacy/src/code_editor.h | 77 - story-editor-legacy/src/dock_widget_base.cpp | 51 - story-editor-legacy/src/dock_widget_base.h | 31 - story-editor-legacy/src/dr_mp3.h | 4831 --- story-editor-legacy/src/event-node.ui | 86 - story-editor-legacy/src/event_node_model.cpp | 73 - story-editor-legacy/src/event_node_model.h | 63 - story-editor-legacy/src/graph.cpp | 355 - story-editor-legacy/src/graph.h | 134 - story-editor-legacy/src/highlighter.cpp | 124 - story-editor-legacy/src/highlighter.h | 49 - story-editor-legacy/src/json.hpp | 24596 ---------------- story-editor-legacy/src/log_dock.cpp | 34 - story-editor-legacy/src/log_dock.h | 18 - story-editor-legacy/src/main.cpp | 13 - story-editor-legacy/src/main_window.cpp | 831 - story-editor-legacy/src/main_window.h | 200 - story-editor-legacy/src/media-node.ui | 166 - story-editor-legacy/src/media_converter.cpp | 160 - story-editor-legacy/src/media_converter.h | 29 - story-editor-legacy/src/media_node_model.cpp | 372 - story-editor-legacy/src/media_node_model.h | 93 - story-editor-legacy/src/memory_view_dock.cpp | 23 - story-editor-legacy/src/memory_view_dock.h | 18 - story-editor-legacy/src/new-project.ui | 156 - .../src/new_project_dialog.cpp | 106 - story-editor-legacy/src/new_project_dialog.h | 32 - story-editor-legacy/src/ost-data.ui | 44 - story-editor-legacy/src/ost-editor.qrc | 21 - story-editor-legacy/src/ost-hmi.ui | 191 - story-editor-legacy/src/ost-log.ui | 30 - story-editor-legacy/src/ost-resources.ui | 111 - story-editor-legacy/src/ost-script.ui | 26 - story-editor-legacy/src/ost-vm.ui | 89 - story-editor-legacy/src/ost_wrapper.cpp | 138 - story-editor-legacy/src/ost_wrapper.h | 18 - story-editor-legacy/src/osthmi_dock.cpp | 24 - story-editor-legacy/src/osthmi_dock.h | 25 - story-editor-legacy/src/resource_model.cpp | 132 - story-editor-legacy/src/resource_model.h | 48 - story-editor-legacy/src/resources_dock.cpp | 100 - story-editor-legacy/src/resources_dock.h | 35 - .../src/script_editor_dock.cpp | 34 - story-editor-legacy/src/script_editor_dock.h | 30 - story-editor-legacy/src/stb_image.h | 7987 ----- story-editor-legacy/src/story_graph_model.cpp | 602 - story-editor-legacy/src/story_graph_model.h | 227 - story-editor-legacy/src/story_graph_scene.cpp | 107 - story-editor-legacy/src/story_graph_scene.h | 36 - story-editor-legacy/src/story_node_base.cpp | 1 - story-editor-legacy/src/story_node_base.h | 76 - story-editor-legacy/src/story_node_data.h | 30 - story-editor-legacy/src/story_project.cpp | 404 - story-editor-legacy/src/story_project.h | 139 - story-editor-legacy/src/toolbar.cpp | 169 - story-editor-legacy/src/toolbar.h | 49 - story-editor-legacy/src/vm_dock.cpp | 43 - story-editor-legacy/src/vm_dock.h | 27 - story-editor-legacy/story-editor-logo.ico | Bin 224990 -> 0 bytes story-editor-legacy/story-editor-logo.png | Bin 39945 -> 0 bytes story-editor-legacy/story-editor.desktop | 8 - story-editor-legacy/test.json | 748 - .../tools/audio/.idea/.gitignore | 8 - story-editor-legacy/tools/audio/.idea/vcs.xml | 6 - story-editor-legacy/tools/audio/AudioFile.cpp | 896 - story-editor-legacy/tools/audio/AudioFile.h | 175 - .../tools/audio/CMakeLists.txt | 6 - story-editor-legacy/tools/audio/LICENSE | 117 - story-editor-legacy/tools/audio/main.cpp | 146 - story-editor-legacy/tools/audio/minimp3.h | 1865 -- story-editor-legacy/tools/audio/minimp3_ex.h | 1397 - 196 files changed, 93533 deletions(-) delete mode 100644 story-editor-legacy/CMakeLists.txt delete mode 100644 story-editor-legacy/assets/build.png delete mode 100644 story-editor-legacy/assets/build.svg delete mode 100644 story-editor-legacy/assets/check-mark.png delete mode 100644 story-editor-legacy/assets/close-outline.svg delete mode 100644 story-editor-legacy/assets/file-document-plus-outline.png delete mode 100644 story-editor-legacy/assets/file-document-plus-outline.svg delete mode 100644 story-editor-legacy/assets/floppy.svg delete mode 100644 story-editor-legacy/assets/folder-open-outline.svg delete mode 100644 story-editor-legacy/assets/folder-open.svg delete mode 100644 story-editor-legacy/assets/home.png delete mode 100644 story-editor-legacy/assets/left.png delete mode 100644 story-editor-legacy/assets/pause-button.png delete mode 100644 story-editor-legacy/assets/play-circle-green.png delete mode 100644 story-editor-legacy/assets/play-circle-green.svg delete mode 100644 story-editor-legacy/assets/play-circle.png delete mode 100644 story-editor-legacy/assets/play-circle.svg delete mode 100644 story-editor-legacy/assets/right.png delete mode 100644 story-editor-legacy/assets/volume-high.svg delete mode 100644 story-editor-legacy/assets/volume-off.png delete mode 100644 story-editor-legacy/assets/volume-off.svg delete mode 100644 story-editor-legacy/assets/welcome.png delete mode 100644 story-editor-legacy/example.asm delete mode 100644 story-editor-legacy/icon.rc delete mode 100644 story-editor-legacy/nodeeditor/CMakeLists.txt delete mode 100644 story-editor-legacy/nodeeditor/LICENSE.rst delete mode 100644 story-editor-legacy/nodeeditor/README.rst delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/AbstractGraphModel delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/AbstractNodePainter delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/BasicGraphicsScene delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/ConnectionIdUtils delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/ConnectionStyle delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/DataFlowGraphModel delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/DataFlowGraphicsScene delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/DefaultNodePainter delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/Definitions delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/GraphicsView delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/GraphicsViewStyle delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/NodeData delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/NodeDelegateModel delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/NodeDelegateModelRegistry delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/NodeGeometry delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/NodeState delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/NodeStyle delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/StyleCollection delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/UndoCommands delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/internal/AbstractGraphModel.hpp delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/internal/AbstractNodeGeometry.hpp delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/internal/AbstractNodePainter.hpp delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/internal/BasicGraphicsScene.hpp delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/internal/Compiler.hpp delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/internal/ConnectionGraphicsObject.hpp delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/internal/ConnectionIdHash.hpp delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/internal/ConnectionIdUtils.hpp delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/internal/ConnectionPainter.hpp delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/internal/ConnectionState.hpp delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/internal/ConnectionStyle.hpp delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/internal/DataFlowGraphModel.hpp delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/internal/DataFlowGraphicsScene.hpp delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/internal/DefaultHorizontalNodeGeometry.hpp delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/internal/DefaultNodePainter.hpp delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/internal/DefaultVerticalNodeGeometry.hpp delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/internal/Definitions.hpp delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/internal/Export.hpp delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/internal/GraphicsView.hpp delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/internal/GraphicsViewStyle.hpp delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/internal/NodeConnectionInteraction.hpp delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/internal/NodeData.hpp delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/internal/NodeDelegateModel.hpp delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/internal/NodeDelegateModelRegistry.hpp delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/internal/NodeGraphicsObject.hpp delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/internal/NodeState.hpp delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/internal/NodeStyle.hpp delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/internal/OperatingSystem.hpp delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/internal/QStringStdHash.hpp delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/internal/QUuidStdHash.hpp delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/internal/Serializable.hpp delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/internal/Style.hpp delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/internal/StyleCollection.hpp delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/internal/UndoCommands.hpp delete mode 100644 story-editor-legacy/nodeeditor/include/QtNodes/internal/locateNode.hpp delete mode 100644 story-editor-legacy/nodeeditor/resources/DefaultStyle.json delete mode 100644 story-editor-legacy/nodeeditor/resources/resources.qrc delete mode 100644 story-editor-legacy/nodeeditor/src/AbstractGraphModel.cpp delete mode 100644 story-editor-legacy/nodeeditor/src/AbstractNodeGeometry.cpp delete mode 100644 story-editor-legacy/nodeeditor/src/BasicGraphicsScene.cpp delete mode 100644 story-editor-legacy/nodeeditor/src/ConnectionGraphicsObject.cpp delete mode 100644 story-editor-legacy/nodeeditor/src/ConnectionPainter.cpp delete mode 100644 story-editor-legacy/nodeeditor/src/ConnectionState.cpp delete mode 100644 story-editor-legacy/nodeeditor/src/ConnectionStyle.cpp delete mode 100644 story-editor-legacy/nodeeditor/src/DataFlowGraphModel.cpp delete mode 100644 story-editor-legacy/nodeeditor/src/DataFlowGraphicsScene.cpp delete mode 100644 story-editor-legacy/nodeeditor/src/DefaultHorizontalNodeGeometry.cpp delete mode 100644 story-editor-legacy/nodeeditor/src/DefaultNodePainter.cpp delete mode 100644 story-editor-legacy/nodeeditor/src/DefaultVerticalNodeGeometry.cpp delete mode 100644 story-editor-legacy/nodeeditor/src/Definitions.cpp delete mode 100644 story-editor-legacy/nodeeditor/src/GraphicsView.cpp delete mode 100644 story-editor-legacy/nodeeditor/src/GraphicsViewStyle.cpp delete mode 100644 story-editor-legacy/nodeeditor/src/NodeConnectionInteraction.cpp delete mode 100644 story-editor-legacy/nodeeditor/src/NodeDelegateModel.cpp delete mode 100644 story-editor-legacy/nodeeditor/src/NodeDelegateModelRegistry.cpp delete mode 100644 story-editor-legacy/nodeeditor/src/NodeGraphicsObject.cpp delete mode 100644 story-editor-legacy/nodeeditor/src/NodeState.cpp delete mode 100644 story-editor-legacy/nodeeditor/src/NodeStyle.cpp delete mode 100644 story-editor-legacy/nodeeditor/src/StyleCollection.cpp delete mode 100644 story-editor-legacy/nodeeditor/src/UndoCommands.cpp delete mode 100644 story-editor-legacy/nodeeditor/src/locateNode.cpp delete mode 100644 story-editor-legacy/nsis-installer.nsi delete mode 100644 story-editor-legacy/ost_convert/CMakeLists.txt delete mode 100644 story-editor-legacy/ost_convert/command_line.cpp delete mode 100644 story-editor-legacy/ost_convert/command_line.h delete mode 100644 story-editor-legacy/ost_convert/json.hpp delete mode 100644 story-editor-legacy/ost_convert/main.cpp delete mode 100644 story-editor-legacy/ost_convert/miniz.c delete mode 100644 story-editor-legacy/ost_convert/miniz.h delete mode 100644 story-editor-legacy/ost_convert/ni_parser.c delete mode 100644 story-editor-legacy/ost_convert/ni_parser.h delete mode 100644 story-editor-legacy/ost_convert/pack_archive.cpp delete mode 100644 story-editor-legacy/ost_convert/pack_archive.h delete mode 100644 story-editor-legacy/ost_convert/zip.cpp delete mode 100644 story-editor-legacy/ost_convert/zip.h delete mode 100644 story-editor-legacy/scripts/media.asm delete mode 100644 story-editor-legacy/src/about.ui delete mode 100644 story-editor-legacy/src/choose-file.ui delete mode 100644 story-editor-legacy/src/code_editor.cpp delete mode 100644 story-editor-legacy/src/code_editor.h delete mode 100644 story-editor-legacy/src/dock_widget_base.cpp delete mode 100644 story-editor-legacy/src/dock_widget_base.h delete mode 100644 story-editor-legacy/src/dr_mp3.h delete mode 100644 story-editor-legacy/src/event-node.ui delete mode 100644 story-editor-legacy/src/event_node_model.cpp delete mode 100644 story-editor-legacy/src/event_node_model.h delete mode 100644 story-editor-legacy/src/graph.cpp delete mode 100644 story-editor-legacy/src/graph.h delete mode 100644 story-editor-legacy/src/highlighter.cpp delete mode 100644 story-editor-legacy/src/highlighter.h delete mode 100644 story-editor-legacy/src/json.hpp delete mode 100644 story-editor-legacy/src/log_dock.cpp delete mode 100644 story-editor-legacy/src/log_dock.h delete mode 100644 story-editor-legacy/src/main.cpp delete mode 100644 story-editor-legacy/src/main_window.cpp delete mode 100644 story-editor-legacy/src/main_window.h delete mode 100644 story-editor-legacy/src/media-node.ui delete mode 100644 story-editor-legacy/src/media_converter.cpp delete mode 100644 story-editor-legacy/src/media_converter.h delete mode 100644 story-editor-legacy/src/media_node_model.cpp delete mode 100644 story-editor-legacy/src/media_node_model.h delete mode 100644 story-editor-legacy/src/memory_view_dock.cpp delete mode 100644 story-editor-legacy/src/memory_view_dock.h delete mode 100644 story-editor-legacy/src/new-project.ui delete mode 100644 story-editor-legacy/src/new_project_dialog.cpp delete mode 100644 story-editor-legacy/src/new_project_dialog.h delete mode 100644 story-editor-legacy/src/ost-data.ui delete mode 100644 story-editor-legacy/src/ost-editor.qrc delete mode 100644 story-editor-legacy/src/ost-hmi.ui delete mode 100644 story-editor-legacy/src/ost-log.ui delete mode 100644 story-editor-legacy/src/ost-resources.ui delete mode 100644 story-editor-legacy/src/ost-script.ui delete mode 100644 story-editor-legacy/src/ost-vm.ui delete mode 100644 story-editor-legacy/src/ost_wrapper.cpp delete mode 100644 story-editor-legacy/src/ost_wrapper.h delete mode 100644 story-editor-legacy/src/osthmi_dock.cpp delete mode 100644 story-editor-legacy/src/osthmi_dock.h delete mode 100644 story-editor-legacy/src/resource_model.cpp delete mode 100644 story-editor-legacy/src/resource_model.h delete mode 100644 story-editor-legacy/src/resources_dock.cpp delete mode 100644 story-editor-legacy/src/resources_dock.h delete mode 100644 story-editor-legacy/src/script_editor_dock.cpp delete mode 100644 story-editor-legacy/src/script_editor_dock.h delete mode 100644 story-editor-legacy/src/stb_image.h delete mode 100644 story-editor-legacy/src/story_graph_model.cpp delete mode 100644 story-editor-legacy/src/story_graph_model.h delete mode 100644 story-editor-legacy/src/story_graph_scene.cpp delete mode 100644 story-editor-legacy/src/story_graph_scene.h delete mode 100644 story-editor-legacy/src/story_node_base.cpp delete mode 100644 story-editor-legacy/src/story_node_base.h delete mode 100644 story-editor-legacy/src/story_node_data.h delete mode 100644 story-editor-legacy/src/story_project.cpp delete mode 100644 story-editor-legacy/src/story_project.h delete mode 100644 story-editor-legacy/src/toolbar.cpp delete mode 100644 story-editor-legacy/src/toolbar.h delete mode 100644 story-editor-legacy/src/vm_dock.cpp delete mode 100644 story-editor-legacy/src/vm_dock.h delete mode 100644 story-editor-legacy/story-editor-logo.ico delete mode 100644 story-editor-legacy/story-editor-logo.png delete mode 100644 story-editor-legacy/story-editor.desktop delete mode 100644 story-editor-legacy/test.json delete mode 100644 story-editor-legacy/tools/audio/.idea/.gitignore delete mode 100644 story-editor-legacy/tools/audio/.idea/vcs.xml delete mode 100755 story-editor-legacy/tools/audio/AudioFile.cpp delete mode 100755 story-editor-legacy/tools/audio/AudioFile.h delete mode 100644 story-editor-legacy/tools/audio/CMakeLists.txt delete mode 100644 story-editor-legacy/tools/audio/LICENSE delete mode 100755 story-editor-legacy/tools/audio/main.cpp delete mode 100644 story-editor-legacy/tools/audio/minimp3.h delete mode 100644 story-editor-legacy/tools/audio/minimp3_ex.h diff --git a/story-editor-legacy/CMakeLists.txt b/story-editor-legacy/CMakeLists.txt deleted file mode 100644 index 44b970e..0000000 --- a/story-editor-legacy/CMakeLists.txt +++ /dev/null @@ -1,200 +0,0 @@ -cmake_minimum_required(VERSION 3.11) - -project(story-editor VERSION 0.1 LANGUAGES CXX C) - -set(CMAKE_INCLUDE_CURRENT_DIR ON) - -set(CMAKE_AUTOUIC ON) -set(CMAKE_AUTOMOC ON) -set(CMAKE_AUTORCC ON) - -set(CMAKE_C_STANDARD 11) -set(CMAKE_CXX_STANDARD 20) -set(CMAKE_CXX_STANDARD_REQUIRED ON) - -find_package(QT NAMES Qt6 REQUIRED COMPONENTS Widgets OpenGLWidgets Multimedia OpenGL) -find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Widgets Gui OpenGLWidgets Multimedia OpenGL ) - -set(PROJECT_SOURCES - src/main.cpp - src/main_window.h - src/main_window.cpp - src/toolbar.h - src/toolbar.cpp - src/ost-editor.qrc - src/story_project.cpp - src/story_project.h - src/media_node_model.h - src/media_node_model.cpp - src/story_graph_model.cpp - src/story_graph_model.h - src/story_node_base.cpp - src/story_node_base.h - src/story_graph_scene.h - src/story_graph_scene.cpp - src/resource_model.h - src/resource_model.cpp - src/resources_dock.h - src/resources_dock.cpp - src/script_editor_dock.h - src/script_editor_dock.cpp - src/memory_view_dock.h - src/memory_view_dock.cpp - src/osthmi_dock.h - src/osthmi_dock.cpp - src/log_dock.h - src/log_dock.cpp - src/vm_dock.h - src/vm_dock.cpp - src/new_project_dialog.h - src/new_project_dialog.cpp - src/dock_widget_base.h - src/dock_widget_base.cpp - src/code_editor.h - src/code_editor.cpp - src/graph.h - src/graph.cpp - src/event_node_model.h - src/event_node_model.cpp - src/highlighter.h - src/highlighter.cpp - src/dr_mp3.h - src/media_converter.h - src/media_converter.cpp - src/ost-hmi.ui - src/ost-vm.ui - src/ost-data.ui - src/ost-script.ui - src/ost-resources.ui - src/ost-log.ui - src/about.ui - src/media-node.ui - src/event-node.ui - src/choose-file.ui - src/new-project.ui - ../software/chip32/chip32_assembler.cpp - ../software/chip32/chip32_vm.c - ../software/library/miniaudio.c - ../software/library/miniaudio.h -) - -include_directories(../software/chip32) -include_directories(../software/library) - -add_subdirectory(QHexView) - -set(CMAKE_AUTOMOC ON) - -set(NODEEDITOR_SOURCE_FILES - ./nodeeditor/src/AbstractGraphModel.cpp - ./nodeeditor/src/AbstractNodeGeometry.cpp - ./nodeeditor/src/BasicGraphicsScene.cpp - ./nodeeditor/src/ConnectionGraphicsObject.cpp - ./nodeeditor/src/ConnectionPainter.cpp - ./nodeeditor/src/ConnectionState.cpp - ./nodeeditor/src/ConnectionStyle.cpp - ./nodeeditor/src/DataFlowGraphModel.cpp - ./nodeeditor/src/DataFlowGraphicsScene.cpp - ./nodeeditor/src/DefaultHorizontalNodeGeometry.cpp - ./nodeeditor/src/DefaultVerticalNodeGeometry.cpp - ./nodeeditor/src/Definitions.cpp - ./nodeeditor/src/GraphicsView.cpp - ./nodeeditor/src/GraphicsViewStyle.cpp - ./nodeeditor/src/NodeDelegateModelRegistry.cpp - ./nodeeditor/src/NodeConnectionInteraction.cpp - ./nodeeditor/src/NodeDelegateModel.cpp - ./nodeeditor/src/NodeGraphicsObject.cpp - ./nodeeditor/src/DefaultNodePainter.cpp - ./nodeeditor/src/NodeState.cpp - ./nodeeditor/src/NodeStyle.cpp - ./nodeeditor/src/StyleCollection.cpp - ./nodeeditor/src/UndoCommands.cpp - ./nodeeditor/src/locateNode.cpp - ./nodeeditor/resources/resources.qrc -) - -set(NODEEDITOR_HEADER_FILES - ./nodeeditor/include/QtNodes/internal/AbstractGraphModel.hpp - ./nodeeditor/include/QtNodes/internal/AbstractNodeGeometry.hpp - ./nodeeditor/include/QtNodes/internal/AbstractNodePainter.hpp - ./nodeeditor/include/QtNodes/internal/BasicGraphicsScene.hpp - ./nodeeditor/include/QtNodes/internal/Compiler.hpp - ./nodeeditor/include/QtNodes/internal/ConnectionGraphicsObject.hpp - ./nodeeditor/include/QtNodes/internal/ConnectionIdHash.hpp - ./nodeeditor/include/QtNodes/internal/ConnectionIdUtils.hpp - ./nodeeditor/include/QtNodes/internal/ConnectionState.hpp - ./nodeeditor/include/QtNodes/internal/ConnectionStyle.hpp - ./nodeeditor/include/QtNodes/internal/DataFlowGraphicsScene.hpp - ./nodeeditor/include/QtNodes/internal/DataFlowGraphModel.hpp - ./nodeeditor/include/QtNodes/internal/DefaultNodePainter.hpp - ./nodeeditor/include/QtNodes/internal/Definitions.hpp - ./nodeeditor/include/QtNodes/internal/Export.hpp - ./nodeeditor/include/QtNodes/internal/GraphicsView.hpp - ./nodeeditor/include/QtNodes/internal/GraphicsViewStyle.hpp - ./nodeeditor/include/QtNodes/internal/locateNode.hpp - ./nodeeditor/include/QtNodes/internal/NodeData.hpp - ./nodeeditor/include/QtNodes/internal/NodeDelegateModel.hpp - ./nodeeditor/include/QtNodes/internal/NodeDelegateModelRegistry.hpp - ./nodeeditor/include/QtNodes/internal/NodeGraphicsObject.hpp - ./nodeeditor/include/QtNodes/internal/NodeState.hpp - ./nodeeditor/include/QtNodes/internal/NodeStyle.hpp - ./nodeeditor/include/QtNodes/internal/OperatingSystem.hpp - ./nodeeditor/include/QtNodes/internal/QStringStdHash.hpp - ./nodeeditor/include/QtNodes/internal/QUuidStdHash.hpp - ./nodeeditor/include/QtNodes/internal/Serializable.hpp - ./nodeeditor/include/QtNodes/internal/Style.hpp - ./nodeeditor/include/QtNodes/internal/StyleCollection.hpp - ./nodeeditor/include/QtNodes/internal/ConnectionPainter.hpp - ./nodeeditor/include/QtNodes/internal/DefaultHorizontalNodeGeometry.hpp - ./nodeeditor/include/QtNodes/internal/DefaultVerticalNodeGeometry.hpp - ./nodeeditor/include/QtNodes/internal/NodeConnectionInteraction.hpp - ./nodeeditor/include/QtNodes/internal/UndoCommands.hpp -) - -if (WIN32) - list(APPEND PROJECT_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/icon.rc") -endif() - -qt_add_executable(${PROJECT_NAME} - MANUAL_FINALIZATION - ${PROJECT_SOURCES} - ${NODEEDITOR_SOURCE_FILES} - ${NODEEDITOR_HEADER_FILES} -) - -target_compile_definitions(${PROJECT_NAME} PUBLIC NODE_EDITOR_STATIC) -target_include_directories(${PROJECT_NAME} PUBLIC nodeeditor/include nodeeditor/include/QtNodes/internal) - -target_link_libraries(${PROJECT_NAME} PUBLIC - Qt${QT_VERSION_MAJOR}::Widgets - Qt${QT_VERSION_MAJOR}::Core - Qt${QT_VERSION_MAJOR}::Widgets - Qt${QT_VERSION_MAJOR}::Gui - Qt${QT_VERSION_MAJOR}::OpenGLWidgets - Qt${QT_VERSION_MAJOR}::OpenGL - Qt${QT_VERSION_MAJOR}::Multimedia - QHexView - ) - - - - -if (UNIX) - target_link_libraries(${PROJECT_NAME} PUBLIC dl) -endif (UNIX) - -set_target_properties(${PROJECT_NAME} PROPERTIES - MACOSX_BUNDLE_GUI_IDENTIFIER storyeditor.d8s.eu - MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION} - MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR} - MACOSX_BUNDLE TRUE - WIN32_EXECUTABLE TRUE -) - -install(TARGETS ${PROJECT_NAME} - BUNDLE DESTINATION . - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) - -if(QT_VERSION_MAJOR EQUAL 6) - qt_finalize_executable(${PROJECT_NAME}) -endif() diff --git a/story-editor-legacy/assets/build.png b/story-editor-legacy/assets/build.png deleted file mode 100644 index b22ec59990f48f2700a8d9e826af37762dc916e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1381 zcmeAS@N?(olHy`uVBq!ia0vp^(?FPm4M^HB7Cr(}oCO|{#S9EFsvyjGMTPAmP*AeO zHKHUqKdq!Zu_%?Hyu4g5GcUV1Ik6yBFTW^#_B$IX1_qW-o-U3d6?5L+jX!ZOS?2i1 z?*^$)&s!v%oIgo;60>C2lu0V;d=|5cnpD=PI4?OOGO6uWK$6PIgHICP9J!wo&3C3z zN8QmHvY{JdcAN%_rJN^ruPA?27i^7m%xLyW*c`A4^A3Eo-e8+C|F6Z=5=D8_lX*frdQ4t!*b@B0 z_T1kCeP_1vEjK#UIO1;Ysgl1h z!%dr~@>Io&lkLp{ zjOlvXz2`!gYSySpHzc8PlZFQ7)M*NXoZ8s7^&vuu$8blzh>4lkI%af*IIJV?2l^t%KyRbS?xczJ$Ek2+y4JM@4?&lRjLuHIqdJWVqMnm zIRjU!#c&iX1h;T&1&Atv194e`+3Y} zXEy7}hGlPH+bB`7c4@sVTXsTRGRV&zg*Kwowuw|MSz53AR=;<3)4@~uoCV3=|7+@Q z<-MrT3h9Wl-)P6!m;3VmwABJ%fks?2{2zMax98`RvukY6zkQ{#l`UIfcZ0N-xZx|P z3m;c#>AaPG@NL?^i4}JeHhjA6HLKR}l8vYqG>nmbF!8tLwWCY!hlkmPPq~r#E+MvH zN9K`Atq@RLK-9U!?#WlwEx!KY*SZo$%wh&8614a~!#}>#M{ - - - - - - - - - - - - - - - - diff --git a/story-editor-legacy/assets/check-mark.png b/story-editor-legacy/assets/check-mark.png deleted file mode 100644 index 9a25900bcf7af08743b730d717bd272896934544..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23826 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

e(m;-G?#4zc~#2Ed>=#gwI`>@YZTS!~NfAD|@C; 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%0A8I@5kS zP-n^F={Z=L`#LYFeQnIpA9tTb*f+$y6X<8*xsv*eX9!>CD>8plah!;CAsh;*y3*Wj zMQ1^(tWR$t@~~rf?^TQ^{>c?GzMs^&lBBLZBT*jsJ^%4hB?7r-IIvM@2l!}?xjQ98 zR<`KOgQu8`#5vmImICk47=O$kJUO05BF^$$6UhPnF4(i%dPI~d=-~OjEzbxDMgu(Z zY3#E6wmw?dImmtw?~weRA+Gye3uny!4T^CoqfY|AMVBWEP;wN`4PcVqCu6r_$m6}| z{4+PO+ViA{;~V_q4K%z!!|k*& z_fR|L&TYxKh2JuOr#{pcv#fe}bNwDA;PNG1dTf4wW=j-a7nL&{m6=Q?|ELzwnJtm9 zOlAL?v;KsBF{1EG=@F@f9@Afnb7t?|(I<*f8G4X)E3YP(XgIZ*e@ExsT#gPSi6`%; zUtwpVuC8=ZZZ`eF9E@7JLup%UtMxOArb+?z?4_ef^WxOi)i+10pNsaqbPd-ommmh# zZ+3)QCl48+WI&&KRD{i8)5<@*+|AEk)(nNgy%$Ajd;ketXbwgUpNVZJcH8&`gWjb2 zMvA2nM0oGV*a1H}>0&snqcQv`6_Lkkic62KD6)Ip=@P^N!Pg{nvU4VHL(Wz&hJ+;< zvickK&|rJnn2sYr3G^c;C6?@5+~fYhv^!hE)*=xDc*|Pu@JoB1Ogb3|Dk+9{)D-jh zuU4GX_Zg%}RD8c7VremzI)_ME)tIdyOSv@@L+LxO@k$0Ncw-67k(1Q;>Mr0y!gBx$ zsfCwRE|`*`v5&^&V`(p0vVQ?Xi~!qrR^W#C;J^<&G3VvElJG9v0!405c}a!obrcST ziUT^xGs7gJ$CF zx<7~^-Pd?^!rt%%gHH?N2>{C^6dd5`AZn~`EMCik!kkpzE&Z*y?e1be8c$%wxrK&l znO^dfvRDKeY0)tU<1KpjPB-vUg#S>CCXWpBi~)Ne0}9S`#32~PPtvh+j%m60Q7r9+ zAx?G$_@|l%$_PMuM5Po3H<{2YmhXlgyZOq)sN%svedE3;?fqm1@2FP|8j9PIGAaTE zNmdN@hb?bLOO#X9OQDrSl}{u+miG_1`AM9LqnjCKu| o#?E+yk)n5k%o}24Ca)k8C#w \ No newline at end of file diff --git a/story-editor-legacy/assets/file-document-plus-outline.png b/story-editor-legacy/assets/file-document-plus-outline.png deleted file mode 100644 index 65856af94e3147e90a9f0142fbb0820d83a2333e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1324 zcmeAS@N?(olHy`uVBq!ia0vp^(?FPm4M^HB7Cr(}oCO|{#S9EFsvyjGMTPAmP*AeO zHKHUqKdq!Zu_%?Hyu4g5GcUV1Ik6yBFTW^#_B$IX1_qX$o-U3d6?5L+-QOJ>D$@2a zztgEpBuc}F$M%IQ6lT935cr-euwz|w%;HuVZrJz{fFx9OkB#Nu)a`)03 zJWb6@HVLbUB}S?wJE$G%{eC<9eeFH=pwzal9&zU^zt8)vY!rN8*WKW~49{F5HYn&s z2#D!$aErCDavy49O+47NA;A$Wd?$MEfyNFCy_cSz$5m_t_MF@GXWGp8F#W)VCTlt@ zlwQhuuJ^8r3JQ7mSU^zSxOjI}|FuQ0uJQ^Nx?Ng6$#06zg=Ri_&Uzf`4oF%tW>Cv2Nl2;p#0y(kCu1At5)djit zyKuivdG_;_>YOOKjdo&zvNvY^J#qC(hp6D}N#9H!UgrFNc}u@owCqN|?iGB-Z%xBj zZ-~n?Nq33fKCf=3*Xj*&nI`EWmt}WGwQjwbaqh&jT?_I>uU!maFR*K2}<@k5^he@oWBx9UR#_hmX2OJeJVXJ0x}5piuBy zMH^7*u`9JPEvD<%0hMkn1uE@be;TNi?=Dd3=NCYwv%JlLN^5ojl|BoR6Hh$5+5{*V z9SPL5e-coo=KtKwop8k(j>z=+%yp^b#4Fir53iYT#N-VV=D#VsU>My_xHK4SPO2O zB&GtRO13~6$!Xo0diSPlDVeF}uKQ#?^XJ^mx%C3qew_2#wc*kG8}a|nAejS9b%tjb zA9`fIX5OhYcMtu%`>+E&J)-(7X;yXXs@lV^{%P6E2&${>-L~xJ`E|dz1vhS8cJuel zpH~+e8~y#B_x=&v$D?QNl)bss+))vD>HF2{H3#$3=2^Ybw-7x9PwA*8LxeL**MH#m zbbs6Y>P_milU)Y|H?9@6KepoN_8r@-l47$>mY-TI_%Y$DkZq>uwe`KvLO4Cohv;9N z9F|ynJHv13^VQ-nJXdenmua&6(#uz@RhLxOoVhdkOKEpxtDoBu;j7+X7CpVpEAO%E zVnJN1@m20Giy|Xt{@lETKl-fpr!tp2;d@>9XW2Q{fMMQy#zy^R=-MCKRyytx5Y!LV4_x~uE-@``>X#i$zN`FISoz7= z<@(#j9UJbOy^MS*9cKJ_*OJqd^xTgadiuY7R(h(?(_O1Px|#QEz4q(AU6tx3X>pgE z{wt>)KAi?F2Y{ioYiGsr*x#;`{z?ajUwyLlWQ3ewD{{%vy`S-vm}kZHm#*!=l8(XC L)z4*}Q$iB}Dzjib diff --git a/story-editor-legacy/assets/file-document-plus-outline.svg b/story-editor-legacy/assets/file-document-plus-outline.svg deleted file mode 100644 index 958e091..0000000 --- a/story-editor-legacy/assets/file-document-plus-outline.svg +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - diff --git a/story-editor-legacy/assets/floppy.svg b/story-editor-legacy/assets/floppy.svg deleted file mode 100644 index 9d1a063..0000000 --- a/story-editor-legacy/assets/floppy.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/story-editor-legacy/assets/folder-open-outline.svg b/story-editor-legacy/assets/folder-open-outline.svg deleted file mode 100644 index 28af2ad..0000000 --- a/story-editor-legacy/assets/folder-open-outline.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/story-editor-legacy/assets/folder-open.svg b/story-editor-legacy/assets/folder-open.svg deleted file mode 100644 index 1257da2..0000000 --- a/story-editor-legacy/assets/folder-open.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/story-editor-legacy/assets/home.png b/story-editor-legacy/assets/home.png deleted file mode 100644 index f7698bf07699971e9c6800330d1d25ebfaa30c72..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29421 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 XYg^4b96{i(DM4=()a6TGn}+@m&#Gew diff --git a/story-editor-legacy/assets/left.png b/story-editor-legacy/assets/left.png deleted file mode 100644 index 7fd799bed9a0c85439bd1e2cc3d4717668047a32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7181 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 GuKqu~cdVoU diff --git a/story-editor-legacy/assets/pause-button.png b/story-editor-legacy/assets/pause-button.png deleted file mode 100644 index 9aa3e3c9d05d7ba0b065bcab708c1714ab4ca6eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43707 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

}&~d!t2MLc$Gk@rDUv!C%cjth55=$cu|e13^cC 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 RIQ?<~OpPtz&kfyT{sZahfg}I` diff --git a/story-editor-legacy/assets/play-circle-green.svg b/story-editor-legacy/assets/play-circle-green.svg deleted file mode 100644 index ac6e09a..0000000 --- a/story-editor-legacy/assets/play-circle-green.svg +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - diff --git a/story-editor-legacy/assets/play-circle.png b/story-editor-legacy/assets/play-circle.png deleted file mode 100644 index d90b7a39ed985d06dd3583f507910520d25a996f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2382 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 AL;wH) diff --git a/story-editor-legacy/assets/play-circle.svg b/story-editor-legacy/assets/play-circle.svg deleted file mode 100644 index e152677..0000000 --- a/story-editor-legacy/assets/play-circle.svg +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - diff --git a/story-editor-legacy/assets/right.png b/story-editor-legacy/assets/right.png deleted file mode 100644 index e274d8b41b9a90075d6f9d4713196400b5a111e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7218 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

;oY zshigt&SpHP=su?l=Smn+AQl{p?kn}J9aLiOGqtaf0d4m-&TH;eE*(HUSIWo`!1b^VzZS-oRND{?=(!NaguMJ7@dXFS|(2yjj>OB#8)>?U{ z04FB4uPNP{@zIw({i1Iz%UXP$3(xC!(Y4*C(fQ-_lgW2+V-|bURHzy!9A3Y^8NC*W zqkVGPIt?g$cVNqun)xQ30)t}+7UsdbiXI>o?97oALNM&zs~yYtdRhqZq$JQYirC`= zu{colE%h@iW-kl0UE|8_x9FOEjawMGi$e;hENIqnQ)loe#t#yFwl&OXlmu4OPcZ>s zs^$iTk>c~lO*`23de9nCoi-A^iyK(Y7GZFvZg+`CX^!(YqF{Wx4#ZL^Cb?Uz4JOj- z6*l|;3A&s_@D5i%2f*)?XiIxo;sAfZ#Ax9mMkuR5ip5Usk@{!i=FhJtaVp1X3~9ep z@EBHoxt;pR*%!8#UU!E*M(242L(ss?D*+=9A2yj8*3QhWEE=1|td`ug```bl#EGzN anT5N*Y8J3ZTr8Gz59ykm$v=JN?*9Sd5V02k diff --git a/story-editor-legacy/assets/volume-high.svg b/story-editor-legacy/assets/volume-high.svg deleted file mode 100644 index e261a16..0000000 --- a/story-editor-legacy/assets/volume-high.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/story-editor-legacy/assets/volume-off.png b/story-editor-legacy/assets/volume-off.png deleted file mode 100644 index 181a0c3ded65ba9e5a0612fc9f8fe54c7754f956..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2378 zcmZuzdpr}07vG46C|1KT{qm@6*L&oV42=ys5mYC9lY~(%HF2)#|)(B2h zjax(O?C?PPsl>5!@()cN+Ff%E;+onll)m{-Kz2;Z9v$~&{bG|LwNw-3@Zb~^d33DR z!=rZHqtE8-- z;|v#uB2VXrIX{~w6A8i-Zuwq#bGQ>D?Bb1Ir5VhbdR3bbR_Ap^&01>9zyPeBhLv|c zRz{U4ZKfd{fgC~;KDJY;A6k`-0v)|g3h3oN|p`Nsp#R8uLjaXR$^t+x_K~+?% zM(rdrqZT+GqB~~o3-{87GgHFAu?P$xT59eLxDfITuu~3|amAR~Hm5djs4tO=yHE9S zIQ29|Bt80wt4aRyv@R_T1*k<%qmZAaFkt%rGfi;C;)k zdN9;wqAw5jPne;leud{x{FK@%C(WZnk5zaS*hP0 zu573{)_lr?Rv4gc zt$tLxRI_iBk@gTwNgINDD-KD&FU%M&8}YVXls(U-4hFzP%g{@wZh7z)Q^=G1YfiK7 zh4CorDM$5NNP>#}iFJ5x$W!I5N7tZRAIfhH8F(v%=}7E1l!L_n-$v`su};TGvyV-z z^&gWUd`!F#SrK!pqcCD0J@~evBw=6QIcg4?fYfofUK$=amjZ(C3FUep&g*yRSq62E(DmltA0SUcj zM-qw#RpG(@9HH)n+7gL34qhNwI+JmK8~H1FpciMUp~0w~yHq}Pe`M+l^+;J-NCe>7CZ|HK~i>;M#!l=fOpMyM-or0DM*Jvxo9Q1_fPrIo;jTMtZ>; z7FuSpeGScejCU5oAAlaTxU^(?1?9!}>4h!S07O!&RFd{ikakAx%k;0A2S_#LLxF2I z%JS;Oeopz8`u)C%smOar-phGMm?O^PKQeOh`(DNMDx{c*nH-D$C-YQJx_Gm~*S zUDi61$G5H9M5XQ&btvfuDeo4(9hJWsl+;qs8jU@$x?u`;d1_bosV)jb5783(AdjJptZD@&6-5xrMraMUzd= ztRN@*!6D0%QJCm^Uj{p%1OKC{-d^V|9{X@Flhb+jk{H}(yV}XKpu6Q=P2DGma2(H^ zjg|R80gGv!JI+-bFAE}ADkRo(r@BkFmmoK{*JX%^-t{A!Q#6qSpCw6me20_=9Qz3- zcH+;{Z{S#+^-5b0?qm=k!J^CCr&1)!6i79+ju3BmUI=u8nfw(ymOIurDX^v&BaK!jmIO^q1!=C4Z@WBK!X;-G%Q@K72h@ zCNhgdUkqFmfO?A5kWbBuB{yrs5o|0vdm^d{6xUyDnVa1eB#{=|`qN8Cj<fbA^)L_Rzh(sSW@Nnc)Z85hxhQfAt8_ze%@NH=plO#9*b9&m)4zHJv7op-hC#M)drd*?R%{z7WSK@IR0DH6l*)2AVk- zAj)i`q|=KLl>^^vS+4CSR*0EPu=V0X1p|c~n5^G3hmSOYofp@D{p3Kx6uV&EAA$IW zL^-=WJ`kH+%HqHTSg(^)Po1^ASn@|YH5QH8S!@dET}Z!8vIXaKEBcw-(N>q-F@9W= zf;jLu&#!wT(Pf2|S4%fLuE;ik8;&p{UQIqYIq0aFh5ZcNenH~)F<;qrQ!i{(s$GeK zNao5)khs84ekj&E;p8AmlZ=`E%F_|$D4tQ6HC_nsO=5VfcH8R)9gI|sFOQ?~ZF}QC tuncmJcN%(DIq92Y_5NEsY>NuhH55v)*~|oo%x~);fGZl~#Bw-$?O%hvYU2O^ diff --git a/story-editor-legacy/assets/volume-off.svg b/story-editor-legacy/assets/volume-off.svg deleted file mode 100644 index 39affc4..0000000 --- a/story-editor-legacy/assets/volume-off.svg +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - diff --git a/story-editor-legacy/assets/welcome.png b/story-editor-legacy/assets/welcome.png deleted file mode 100644 index efc8524f7ab8fa5290841dc70ba6e115363e2e34..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 296477 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�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

*vfOCwbJH3$24< zvo*~bit(#r){x7 zU&esDzXtN2=UCLNhXPHkUcCmn9l6CY5RKHe!qFiub@kBeK$BjwK>6y?djQd>-G3lZ zYtfaA;VVtOVl>DG^{ld(bN14RKuUMb*AkRfRg&)fi;cfn3TcY{R*v6oN$HW2_Gr<% zPUW{`{7rgJbr$0n)!4Wgd8oxhbPn zzkc03mS(1YX2P0A8`-E;X)qbq%e*49$glrOTQlrmTzj31awLknTPig(=)W**XA)qF zMyeN5rI<5Dmnu6EW0g~_iKhi);2@<(0TVE?F~qEV%^9ZRl&Svqe&8#na3&)AROU*n ziI&qa5$J9htKQLP^p!rf1*`o(LBbO-Cm;QiYtaQk$BZApI?urPGvZtca1Q2v{kMJt zQy<9qdteOf!_dSa8?TlVU}0DrsiY?M2rsf^c-nKv@3#0`1Qp*ab^@#m&;m(cn||@H zj6V?MF{AUE$lB6NxW-ncUQR3P4tk5>6`iW?XFTuk<6uYY8RpM%vdZ1!c5A!_n?_GG zp8Rm+oMo=D7!K5hdTzRd%cU(!M>H;@kBHgw5@rUl^cX+Md9Ko=>Hx@&X)IOK?GFE) z>Uy<%8Bb~f)sHZwBYty+wE4T=`X(hk4l?{3cuqlvL0ER0K}Qo#Gb7cpy$dnlzRwU@ z$wBPR==Y)n(4_0#thJP@0x|`0t?Klqek?&S|Hnltg zu_l=$rx{=Rv+$=+>gyxs)@7_TGu|#9c8)j#N+C(tV|$g6wWOi@zbqn395J8in<^ANI}ybNg<<2qTfy+}9YDN7E( zuYc<|&hh%g)i?l}XjdN%XvvI4fYZ%asZVYZmA%2?DB4)&<``uDYYS^ZWYqJ(sS9PA zXu3wD4gVD8A-~8ppL_V5<*EL%nAqVYuw@l4!tl?qv!6)_N){=iLC(D|&srm2y7n?I zhaY$v*Q1|0lgz7(Kha|X%RjTzqu)~Ywznzl9R$=GyftnZw$w5w8}hQQCh4$$SzDOc z&{*F-0`Tju6foa?RCH?KKC3c|Iii%-B$C^~?*wJ-1?QCaxRJ;8vWs8F_{_f2#sN*e zu84A8ON|2^1O6FTxO=b?>BsO>CeMy3p`Vg+_7i4|-{cNJK`oiIRX2&-9R?Q5PW_rP z&;6!V))lI+HceiU7Bj0RGah4Rvdc*dMoTv0wVdw!OG(gU;3+@NtnC{;2kaeyQi!ZD z{}`}rd~??j1}o{}HAzNI638hib+MXO9kl4IZNL;Bddwp`rbCBr%;K|2NVV0dC_w7= zO%oBA$`}kN88LkVntc(67%Uw9#gN}Zf?nhQMI_xte^Oh*E#L3w~CG zpPOY01cwfQ(fE(^Vy6K4>c_}3Q@#u(Svi!VZOo3T6 zO?yLT9ep}m(-wOhOvNZbO@Iu^f8M^KDxqtDlD6e$3==C5+E~SflV*`}KW)5FXBpDc zw-fg>)coF ztcMs&>9PH)Yg-%uk+X56{Mqf5=#{W5i#I-6CT3r`KfC1a!Q5sNFLK1o;&cU5{ZpwT zFDaH-YlVs>wc>6}yFmm%I{>Kp>WVf_@Qxl$3K6v)F4fx-PcDfug~xX^J<6f0%rCy< z?C^VbdjTmyGW%RZhU6j|iKJ$4@RzA&5fHlpO&ox#$T+w&pmExX>;_+rbN`f1Q3Sw3 z#4BxM=isG+87+~asn6|mrf>)^701uvWYaqUnh2KBFG6?b7?Hq|0nH4FVN;&dA<~VG z0K@^%Tb}?x36ywo4|dLG3@VZudFvyTNpBZ}10c|r#Yz3*J+;|aqwM};A5Qyo>F3$! z>>t6h$ofXDu`v9W5w@26sUivb2*CRV>LNmwc>G^!|2sIJjgllr1T$nJ?*XK)mWC^{6TUKa(RU%Y0<&Bc^z?2AXl=`p%ksn!cK z)tl4fQXetF6xEUIV6bqL0Gn|D#2;~)H1T0=2`o+!IwdsVnx#}tnW}#jo0#JiK zFH)&{(20N18qNV0YYMNpm6l7BfIasyjKHU++StvoD=00DssoUaVCXgl&e4;Y{^2hR z?OHnvHyggTF=n_X>D*IuDEE$4cV zGIs!HUe^=A=V7?qWt(>Z+_$O4cM%ltKq}P^ z3%J&JddsJEs(dCwH3o4C-?wYcNg9=Dz^Z?^XUw6Mj{vyAyj#>Fi26OXJ0cYHhD#b* zNZk<2JVwXFhJInf3tYN6yF7p*sU%tS*5V%q4y;9Hyi7_APjwo@9t#WAI$%m)AiaCw z8QoSBS~EEJc_Lg3yMNIvCNUe0@6S70DKHVYt1{QlL65fD0Tn}cHSii zG=>TbxTrI&%9PqQmYQ-05Q ze%epS!cuz}I@c9_G;jnf z54PHH`FX3c6ew-5#%SgE0^E?x78u9%;*p2zG~|{Mo|m?e@yzoa|3AxEEVXa9=g9fH(Ndi&Dx2lp- zJ8;F<>dGU`Ksh(4g>!jY29Z<3HyAGG8Rf>az|kp`QFG;FUYg=4!8=YJ^Ju!SMUE#j z34^J^7qck&SvdOhzA*(X8t<}1KPMACx+-rUGSFX2Bp~AeRNnz=KCY5qxW(n1Zme3m zQvW`n8UHA+xOp#+=E&^$nz%F%7qaWLq?SghOg~slyn9qtI#!10mf=#8M!G*qW$n~x z+O&3dt$Qznm6~|oxyh<>(&BbYpl8D_^mY_etZhlmR5OQh1lL(-j%hY@DFV&;+UEHA zXzT)uetzmdy@X6PqSfGzmy8(Fi&(|VZI9zhs<`J=^s0`-J^)_>#0UTxQHSw>&<3Na z&1REu1qUG4&&te!!iXvq^^vp*f8TIE_%pmrm>Vc4_5OWT3-S^*lYSN7fFRcPuR3M2 zTedQ@o4&OU4#3n=QC+Hj53h`o=j<(h%z|jFF-!@8Rt;*UjcPYFYnkGKewqXPdBlt& z3QqY6`22N_$J)8MNM82J!3ak7PVqTz-q}`0ENK5(HF#!wp_TG+NYG7`B=wMnL|I zX%yoXqA)3#3XvGe=|w$aa!~DFe%zfukN$uq9fTQ3WKZ9zP}h43H)h{LsRAP8^gCnv zqCA224f`>SXVdN@@h{?S0>inKa|#Wk{>?|!!rc9EUv`h#HC0acT{adMHQ!kAzns-O zbX^B3XewDzyL-|^bltMT7((dL$MP@wDpP;N%k z5$MFx(A?0(MAj6?0gp^uSJPDP3P+Onp*?E9(vouw`u_7|016J4^Kz!tA3-m;PbGe( zYdr}R5yY7`f=TSEiMtj{p*R3xnAk;Nl@>M%L!CC2R2${-6>j#k?f_^}ylkn+6_$(S zw);4svaqr;7;*r}#{3<31mN2aDB`}TQYv$L)^Y&am-%Aw=_=e1Bke(@zrH#Sz!2^s zD#;;12G_E3Z-}vTB%-rVRVQKGA{e(5@oIVsOI5Mk<@4O6lx`OJ9*UIdkQ+s#-Me)2 zHYFw`{WS$`2gQ+$gLcWSggiB+3iR~rKN$Ylzt6dwJ$!tHE%pGkaci$e4I_8^iF75C zGML&$Y;7R>5gXGZc2cu`u>-U&xk~ZT$4>64&82q$yfP{&!~#U|*Xpm-GF$wJ8ciDx zKs!u+)+3(`h+v-;k(@J975Q{Es=p<#M~Qmih*F5HYs7Xo4)#Q)RXk$I zt}bJB)D-L!K+Ohp#H53<`xbzimZ|e??l?(915$=21WNW5z68j|Sokwt1C$7Wx7VEx zz+gSWczA;=z-=$BFyC!x0q1J-8Zy8D!i7Q6{?wI-S z{Ej>Z5baS1<2gU*Il!?O=?W~}C{6CXl^uX|oi=5!;Kf8B z8ytYMdCUR$oo}9FrrBUp^@S&%RqImUAsS7@Gy@ZlG-9BYISIU7^N$qlX=Ju{l*_;@ zB}m|iW=GD<);AXl*B-R9MxgF=ro*RjT?G}bVrC;vp;gAIGT~ZmlrF%Mb5(P?9Og~L z+!z&iGw$AKjYUksjS%@M2O#blwGaA9c&C4koL zch0aM>|EKMxTmbq+bugxLo-8KK z5l`2mZ&h?t2SE5S0*;(tSu(iD^U?1#$AgZNjZvM(aQWwbEEI^OZ359V1&Kz_W9-;$ z79Rl&U2Ik8EMNVcU#*uyK>s-&0pvF9Ib&K|0FhE2vM=9NrKdL+S3(*2Q!D5S4D973 zu95#Pr_c(K`9f2{xXC|@WM6a}x;I@ZsN#^Qu|(`cWauNf>ohIXDZ}TAW2dK#n#uG% zj!shsdmNR9pv=f)yPSxp#DM?+1Sd&EK~&jWMj%BFz!<{Jh+w*)W&j~87Z&hF%{ivi zNFEK=TMel&huxWIq^RRaGL{W~c!zV_Re_*Cr~Xu6Ury zILFV!*Zy1;V+4KGM-8aXt?ETU(XNAw8-ap(&|#k z{g|7swVqxvFE3BAUgi}fDzg@9rE<%#lopKpzT{}+_&(50TDSrpEwg1>Lp7PM4iIT+ z*U~D0CdfuNnhlCPA2qFW+=x{SLlC~3MpkJQi|%evjw6{`%DHe)7V}9!uMFaUN~GBX z)8_!B;*7(y1Mu75bY+1O>Lk)agm4wLhIAZe=GJwo`&Am{n5QNgG9a;B1;$1&q}PZ9 zp}~_RNwp>qTO#T;1(isRZrVWAw782x*%EMBCoy4iWn0qx)Zqe)=%OuSP5~x>buJ!R zhRgw;SO;|Kp*yQpH<7;GNIS4zGl?CL1(YE`s!3~W!=g9ZkS5-3PR%h8vrw>;)lH~# zicC6XNj3`jREBeA&Q2M96jq`~JVUDA@{Uf9SY>oe3M-{vJnBIGH92HdLdmqURPt_y z8grmPhZL>KT*h?tzX9QZaA)aFn8(sAL4rxXET10ErwB`Ih4 zBS3~?=dUViFzQOM4oN$wny-ymb= zg_#pX?3`1~HKyxDlTKb@a9h3D5~RkM;(|HJ-9&Qeh$1hOmg!Tf=P!@_@XTd%)?{6U z{pC@uGLzG)$*78L7^)?Fn=EKGu)>#8r#5bTOr7JSSwcN?kFF+*F>Mp6@+Kp5N3oTi zxn;blP2gK@1?p8Ex~23~Jx9EP+6}S;>ikR$L`|<0Mwk2mtOJ0r0u5>62Bm-0f^DtI zYUcgG#0{ZqjZZ!74ggP}38WaVa*EIZ$J@%(8pnSV1k!(oi+rN!q(o$jSxY615}vkA z@!nvx(-u;;fGX5%U|4Ou3vC5M4Rl*bLV8E05WEHh75~`ce{I5f` zIsmWauN0= 5.11.0, Your current version is ${QT_VERSION}") -endif() - -if (${QT_VERSION_MAJOR} EQUAL 6) - qt_add_resources(RESOURCES ./resources/resources.qrc) -else() - qt5_add_resources(RESOURCES ./resources/resources.qrc) -endif() - -# Unfortunately, as we have a split include/src, AUTOMOC doesn't work. -# We'll have to manually specify some files -set(CMAKE_AUTOMOC ON) - -set(CPP_SOURCE_FILES - src/AbstractGraphModel.cpp - src/AbstractNodeGeometry.cpp - src/BasicGraphicsScene.cpp - src/ConnectionGraphicsObject.cpp - src/ConnectionPainter.cpp - src/ConnectionState.cpp - src/ConnectionStyle.cpp - src/DataFlowGraphModel.cpp - src/DataFlowGraphicsScene.cpp - src/DefaultHorizontalNodeGeometry.cpp - src/DefaultVerticalNodeGeometry.cpp - src/Definitions.cpp - src/GraphicsView.cpp - src/GraphicsViewStyle.cpp - src/NodeDelegateModelRegistry.cpp - src/NodeConnectionInteraction.cpp - src/NodeDelegateModel.cpp - src/NodeGraphicsObject.cpp - src/DefaultNodePainter.cpp - src/NodeState.cpp - src/NodeStyle.cpp - src/StyleCollection.cpp - src/UndoCommands.cpp - src/locateNode.cpp -) - -set(HPP_HEADER_FILES - include/QtNodes/internal/AbstractGraphModel.hpp - include/QtNodes/internal/AbstractNodeGeometry.hpp - include/QtNodes/internal/AbstractNodePainter.hpp - include/QtNodes/internal/BasicGraphicsScene.hpp - include/QtNodes/internal/Compiler.hpp - include/QtNodes/internal/ConnectionGraphicsObject.hpp - include/QtNodes/internal/ConnectionIdHash.hpp - include/QtNodes/internal/ConnectionIdUtils.hpp - include/QtNodes/internal/ConnectionState.hpp - include/QtNodes/internal/ConnectionStyle.hpp - include/QtNodes/internal/DataFlowGraphicsScene.hpp - include/QtNodes/internal/DataFlowGraphModel.hpp - include/QtNodes/internal/DefaultNodePainter.hpp - include/QtNodes/internal/Definitions.hpp - include/QtNodes/internal/Export.hpp - include/QtNodes/internal/GraphicsView.hpp - include/QtNodes/internal/GraphicsViewStyle.hpp - include/QtNodes/internal/locateNode.hpp - include/QtNodes/internal/NodeData.hpp - include/QtNodes/internal/NodeDelegateModel.hpp - include/QtNodes/internal/NodeDelegateModelRegistry.hpp - include/QtNodes/internal/NodeGraphicsObject.hpp - include/QtNodes/internal/NodeState.hpp - include/QtNodes/internal/NodeStyle.hpp - include/QtNodes/internal/OperatingSystem.hpp - include/QtNodes/internal/QStringStdHash.hpp - include/QtNodes/internal/QUuidStdHash.hpp - include/QtNodes/internal/Serializable.hpp - include/QtNodes/internal/Style.hpp - include/QtNodes/internal/StyleCollection.hpp - include/QtNodes/internal/ConnectionPainter.hpp - include/QtNodes/internal/DefaultHorizontalNodeGeometry.hpp - include/QtNodes/internal/DefaultVerticalNodeGeometry.hpp - include/QtNodes/internal/NodeConnectionInteraction.hpp - include/QtNodes/internal/UndoCommands.hpp -) - -# If we want to give the option to build a static library, -# set BUILD_SHARED_LIBS option to OFF -add_library(QtNodes - ${CPP_SOURCE_FILES} - ${HPP_HEADER_FILES} - ${RESOURCES} -) - -add_library(QtNodes::QtNodes ALIAS QtNodes) - - -target_include_directories(QtNodes - PUBLIC - $ - $ - PRIVATE - $ - $ -) - -target_link_libraries(QtNodes - PUBLIC - Qt${QT_VERSION_MAJOR}::Core - Qt${QT_VERSION_MAJOR}::Widgets - Qt${QT_VERSION_MAJOR}::Gui - Qt${QT_VERSION_MAJOR}::OpenGL -) - -target_compile_definitions(QtNodes - PUBLIC - NODE_EDITOR_SHARED - PRIVATE - NODE_EDITOR_EXPORTS - #NODE_DEBUG_DRAWING - QT_NO_KEYWORDS -) - - -target_compile_options(QtNodes - PRIVATE - $<$:/W4 /wd4127 /EHsc /utf-8> - $<$:-Wall -Wextra> - $<$:-Wall -Wextra -Werror> -) -if(NOT "${CMAKE_CXX_SIMULATE_ID}" STREQUAL "MSVC") - # Clang-Cl on MSVC identifies as "Clang" but behaves more like MSVC: - target_compile_options(QtNodes - PRIVATE - $<$:-Wall -Wextra> - ) -endif() - -if(QT_NODES_DEVELOPER_DEFAULTS) - target_compile_features(QtNodes PUBLIC cxx_std_14) - set_target_properties(QtNodes PROPERTIES CXX_EXTENSIONS OFF) -endif() - - -set_target_properties(QtNodes - PROPERTIES - ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib - LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib - RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin -) - -###### -# Moc -## - -file(GLOB_RECURSE HEADERS_TO_MOC include/QtNodes/internal/*.hpp) - -if (${QT_VERSION_MAJOR} EQUAL 6) - qt_wrap_cpp(nodes_moc - ${HEADERS_TO_MOC} - TARGET QtNodes - OPTIONS --no-notes # Don't display a note for the headers which don't produce a moc_*.cpp - ) -else() - qt5_wrap_cpp(nodes_moc - ${HEADERS_TO_MOC} - TARGET QtNodes - OPTIONS --no-notes # Don't display a note for the headers which don't produce a moc_*.cpp - ) -endif() - -target_sources(QtNodes PRIVATE ${nodes_moc}) - -########### -# Examples -## - -if(BUILD_EXAMPLES) - add_subdirectory(examples) -endif() - -if(BUILD_DOCS) - add_subdirectory(docs) -endif() - -################## -# Automated Tests -## - -if(BUILD_TESTING) - #add_subdirectory(test) -endif() - -############### -# Installation -## - -include(GNUInstallDirs) - -set(INSTALL_CONFIGDIR ${CMAKE_INSTALL_LIBDIR}/cmake/QtNodes) - -install(TARGETS QtNodes - EXPORT QtNodesTargets - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} -) - -install(DIRECTORY include/ - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) - -install(EXPORT QtNodesTargets - FILE QtNodesTargets.cmake - NAMESPACE QtNodes:: - DESTINATION ${INSTALL_CONFIGDIR} -) - -include(CMakePackageConfigHelpers) - -configure_package_config_file(${CMAKE_CURRENT_LIST_DIR}/cmake/QtNodesConfig.cmake.in - ${CMAKE_CURRENT_BINARY_DIR}/QtNodesConfig.cmake - INSTALL_DESTINATION ${INSTALL_CONFIGDIR} -) - -install(FILES - ${CMAKE_CURRENT_BINARY_DIR}/QtNodesConfig.cmake - DESTINATION ${INSTALL_CONFIGDIR} -) diff --git a/story-editor-legacy/nodeeditor/LICENSE.rst b/story-editor-legacy/nodeeditor/LICENSE.rst deleted file mode 100644 index c485d7f..0000000 --- a/story-editor-legacy/nodeeditor/LICENSE.rst +++ /dev/null @@ -1,28 +0,0 @@ -BSD-3-Clause license -==================== - -Copyright (c) 2022, Dmitry Pinaev -All rights reserved. - -Redistribution and use in source and binary forms, with or without modification, -are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of copyright holder, nor the names of its contributors may - be used to endorse or promote products derived from this software without - specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR -ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS -OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN -IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/story-editor-legacy/nodeeditor/README.rst b/story-editor-legacy/nodeeditor/README.rst deleted file mode 100644 index 553fc41..0000000 --- a/story-editor-legacy/nodeeditor/README.rst +++ /dev/null @@ -1,261 +0,0 @@ -QtNodes -####### - -Introduction -============ - -**QtNodes** is conceived as a general-purpose Qt-based library aimed at -developing Node Editors for various applications. The library could be used for -simple graph visualization and editing or extended further for using the -`Dataflow paradigm `_ . - -The library is written using the Model-View approach. The whole graph structure -is defined by a class derived from ``AbstractGraphModel``. It is possible to -create or add Nodes and Connections. The underlying data structures could be of -any arbitrary type or representation. - -An instance of ``AbstractGraphModel`` could or could not be attached to -specialized ``QGraphicsScene`` and ``QGraphicsView`` objects. I.e. the so-called -"headless" `modus operandi` is possible. - -Documentation -============= - -`Read the Docs for QtNodes `_ - -Warning - Many classes were changed in the version ``3.0``. If you had a large project - based on ``2.x.x``, make sure you read the documentation first and see the - examples before checking out the new code. - -Branches --------- - -There are branchses ``v2`` and ``v3`` for versions ``2.x.x`` and ``3.x`` -respectively. The branch ``master`` contains the latest dev state. - - -.. contents:: Navigation - :depth: 2 - - -Data Flow Paradigm -================== - -The extended model class ``DataFlowGraphModel`` allows to register "processing -algorithms" represented by nodes and is equipped with a set of Qt's signals and -slots for propagating the data though the nodes. - -The node's algorithm is triggered upon arriving of any new input data. The -computed result is propagated to the output connections. Each new connection -fetches available data and propagates is further. Each change in the source node -is immediately propagated through all the connections updating the whole graph. - - -Supported Environments -====================== - -Platforms ---------- - -* Linux (x64, gcc-7.0, clang-7) |ImageLink|_ -* OSX (Apple Clang - LLVM 3.6) |ImageLink|_ - -.. |ImageLink| image:: https://travis-ci.org/paceholder/nodeeditor.svg?branch=master -.. _ImageLink: https://travis-ci.org/paceholder/nodeeditor - - -* Windows (Win32, x64, msvc2017, MinGW 5.3) |AppveyorImage|_ - -.. |AppveyorImage| image:: https://ci.appveyor.com/api/projects/status/wxp47wv3uyyiujjw/branch/master?svg=true -.. _AppveyorImage: https://ci.appveyor.com/project/paceholder/nodeeditor/branch/master) - -Dependencies ------------- - -* Qt >5.15 -* CMake 3.8 -* Catch2 - - -Current State (v3) -================== - -* Model-based graph -* Headless mode - You can create, populate, modify the derivative of ``AbstractGraphModel`` - without adding it to the actual Flow Scene. The library is now designed to be - general-purpose graph visualization and modification tool, without - specialization on only data propagation. -* Automatic data propagation built on top of the graph-model code - The library could be used for both pure graph visualization purposes and for - originally implemented data propagation. -* Dynamic ports -* Datatype-aware connections -* Embedded Qt widgets -* One-output to many-input connections -* JSON-based interface styles -* Saving scenes to JSON files -* Custom Node Geometry -* Vertical and Horizontal graph layouts -* Undo/Redo, Duplication (CTRL+D) - - -Building -======== - -Linux ------ - -:: - - git clone git@github.com:paceholder/nodeeditor.git - cd nodeeditor - mkdir build - cd build - cmake .. - make -j && make install - - -Qt Creator ----------- - -1. Open `CMakeLists.txt` as project. -2. If you don't have the `Catch2` library installed, go to `Build Settings`, disable the checkbox `BUILD_TESTING`. -3. `Build -> Run CMake` -4. `Build -> Build All` -5. Click the button `Run` - - -With Cmake using `vcpkg` -^^^^^^^^^^^^^^^^^^^^^^^^ - -1. Install `vcpkg` -2. Add the following flag in configuration step of `CMake` - -:: - - -DCMAKE_TOOLCHAIN_FILE=/scripts/buildsystems/scripts/buildsystems/vcpkg.cmake - - -Help Needed -=========== - -#. Python wrappring using PySide. -#. QML frontend. -#. Wirting a ClangFormat config. - -Any suggestions are welcome! - - -Contribution -============ - -#. Be polite, respectful and collaborative. -#. For submitting a bug: - - #. Describe your environment (Qt version, compiler, OS etc) - #. Describe steps to reproduce the issue - -#. For submitting a pull request: - - #. Create a proposal task first. We can come up with a better design together. - #. Create a pull-request. If applicable, create a simple example for your - problem, describe the changes in details, provide use cases. - -#. For submitting a development request: - - #. Describe your issue in details - #. Provide some use cases. - -#. I maintain this probject in my free time, when I am not busy with my work or - my family. **If I do not react or do not answer for too long, please ping - me**. - - -Citing -====== - -:: - - Dmitry Pinaev et al, Qt Nodes, (2022), GitHub repository, https://github.com/paceholder/nodeeditor - -BibTeX:: - - @misc{Pinaev2022, - author = {Dmitry Pinaev et al}, - title = {QtNodes. Node Editor}, - year = {2017}, - publisher = {GitHub}, - journal = {GitHub repository}, - howpublished = {\url{https://github.com/paceholder/nodeeditor}}, - commit = {877ddb8c447a7a061a5022e9956a3194132e3dd9} - } - -Support -======= - -If you like the project you could donate me on PayPal |ImagePaypal|_ - -.. |ImagePaypal| image:: https://img.shields.io/badge/Donate-PayPal-green.svg -.. _ImagePaypal: https://www.paypal.com/paypalme/DmitryPinaev - - -If you send more than $100, I'll forward $100 to some fund supporting sick -children and report to you back. - - -Thanks -====== - -The version 3 was released with a generous help of -`Davide Faconti `_ - - -Showcase -======== - -Youtube videos --------------- - -.. image:: https://img.youtube.com/vi/pxMXjSvlOFw/0.jpg - :target: https://www.youtube.com/watch?v=pxMXjSvlOFw - -| - -.. image:: https://img.youtube.com/vi/i_pB-Y0hCYQ/0.jpg - :target: https://www.youtube.com/watch?v=i_pB-Y0hCYQ - -CANdevStudio ------------- - -`CANdevStudio `_ is a cost-effective, -cross-platform replacement for CAN simulation software. CANdevStudio enables to -simulate CAN signals such as ignition status, doors status or reverse gear by -every automotive developer. Thanks to modularity it is easy to implement new, -custom features. - - -.. image:: docs/_static/showcase_CANdevStudio.png - - -Chigraph --------- - -`Chigraph `_ is a visual programming -language for beginners that is unique in that it is an intuitive flow graph: - -.. image:: docs/_static/chigraph.png - - -It features easy bindings to C/C++, package management, and a cool interface. - - -Spkgen particle editor ----------------------- - -`Spkgen `_ is an editor for the SPARK -particles engine that uses a node-based interface to create particles effects for -games - -.. image:: docs/_static/spkgen.png diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/AbstractGraphModel b/story-editor-legacy/nodeeditor/include/QtNodes/AbstractGraphModel deleted file mode 100644 index 0ad0ac0..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/AbstractGraphModel +++ /dev/null @@ -1 +0,0 @@ -#include "internal/AbstractGraphModel.hpp" diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/AbstractNodePainter b/story-editor-legacy/nodeeditor/include/QtNodes/AbstractNodePainter deleted file mode 100644 index a62405c..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/AbstractNodePainter +++ /dev/null @@ -1 +0,0 @@ -#include "internal/AbstractNodePainter.hpp" diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/BasicGraphicsScene b/story-editor-legacy/nodeeditor/include/QtNodes/BasicGraphicsScene deleted file mode 100644 index 7d17e8d..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/BasicGraphicsScene +++ /dev/null @@ -1 +0,0 @@ -#include "internal/BasicGraphicsScene.hpp" diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/ConnectionIdUtils b/story-editor-legacy/nodeeditor/include/QtNodes/ConnectionIdUtils deleted file mode 100644 index 4c97c07..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/ConnectionIdUtils +++ /dev/null @@ -1 +0,0 @@ -#include "internal/ConnectionIdUtils.hpp" diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/ConnectionStyle b/story-editor-legacy/nodeeditor/include/QtNodes/ConnectionStyle deleted file mode 100644 index b771bf3..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/ConnectionStyle +++ /dev/null @@ -1 +0,0 @@ -#include "internal/ConnectionStyle.hpp" diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/DataFlowGraphModel b/story-editor-legacy/nodeeditor/include/QtNodes/DataFlowGraphModel deleted file mode 100644 index 28e8cbe..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/DataFlowGraphModel +++ /dev/null @@ -1 +0,0 @@ -#include "internal/DataFlowGraphModel.hpp" diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/DataFlowGraphicsScene b/story-editor-legacy/nodeeditor/include/QtNodes/DataFlowGraphicsScene deleted file mode 100644 index 3585527..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/DataFlowGraphicsScene +++ /dev/null @@ -1 +0,0 @@ -#include "internal/DataFlowGraphicsScene.hpp" diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/DefaultNodePainter b/story-editor-legacy/nodeeditor/include/QtNodes/DefaultNodePainter deleted file mode 100644 index c808518..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/DefaultNodePainter +++ /dev/null @@ -1 +0,0 @@ -#include "internal/DefaultNodePainter.hpp" diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/Definitions b/story-editor-legacy/nodeeditor/include/QtNodes/Definitions deleted file mode 100644 index 2ac05a0..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/Definitions +++ /dev/null @@ -1 +0,0 @@ -#include "internal/Definitions.hpp" diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/GraphicsView b/story-editor-legacy/nodeeditor/include/QtNodes/GraphicsView deleted file mode 100644 index da4e21a..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/GraphicsView +++ /dev/null @@ -1 +0,0 @@ -#include "internal/GraphicsView.hpp" diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/GraphicsViewStyle b/story-editor-legacy/nodeeditor/include/QtNodes/GraphicsViewStyle deleted file mode 100644 index 8a98541..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/GraphicsViewStyle +++ /dev/null @@ -1 +0,0 @@ -#include "internal/GraphicsViewStyle.hpp" diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/NodeData b/story-editor-legacy/nodeeditor/include/QtNodes/NodeData deleted file mode 100644 index 5fcbd7b..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/NodeData +++ /dev/null @@ -1 +0,0 @@ -#include "internal/NodeData.hpp" diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/NodeDelegateModel b/story-editor-legacy/nodeeditor/include/QtNodes/NodeDelegateModel deleted file mode 100644 index 70f25f7..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/NodeDelegateModel +++ /dev/null @@ -1 +0,0 @@ -#include "internal/NodeDelegateModel.hpp" diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/NodeDelegateModelRegistry b/story-editor-legacy/nodeeditor/include/QtNodes/NodeDelegateModelRegistry deleted file mode 100644 index 9d78da5..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/NodeDelegateModelRegistry +++ /dev/null @@ -1 +0,0 @@ -#include "internal/NodeDelegateModelRegistry.hpp" diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/NodeGeometry b/story-editor-legacy/nodeeditor/include/QtNodes/NodeGeometry deleted file mode 100644 index 46a70a6..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/NodeGeometry +++ /dev/null @@ -1,2 +0,0 @@ -#include "internal/NodeGeometry.hpp" - diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/NodeState b/story-editor-legacy/nodeeditor/include/QtNodes/NodeState deleted file mode 100644 index 5b531fd..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/NodeState +++ /dev/null @@ -1 +0,0 @@ -#include "internal/NodeState.hpp" diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/NodeStyle b/story-editor-legacy/nodeeditor/include/QtNodes/NodeStyle deleted file mode 100644 index d96092d..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/NodeStyle +++ /dev/null @@ -1 +0,0 @@ -#include "internal/NodeStyle.hpp" diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/StyleCollection b/story-editor-legacy/nodeeditor/include/QtNodes/StyleCollection deleted file mode 100644 index e1f93ec..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/StyleCollection +++ /dev/null @@ -1 +0,0 @@ -#include "internal/StyleCollection.hpp" diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/UndoCommands b/story-editor-legacy/nodeeditor/include/QtNodes/UndoCommands deleted file mode 100644 index 2ff49a5..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/UndoCommands +++ /dev/null @@ -1 +0,0 @@ -#include "internal/UndoCommands.hpp" diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/internal/AbstractGraphModel.hpp b/story-editor-legacy/nodeeditor/include/QtNodes/internal/AbstractGraphModel.hpp deleted file mode 100644 index 96d2c64..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/internal/AbstractGraphModel.hpp +++ /dev/null @@ -1,249 +0,0 @@ -#pragma once - -#include "Export.hpp" - -#include -#include - -#include -#include -#include - -#include "ConnectionIdHash.hpp" -#include "Definitions.hpp" - -namespace QtNodes { - -/** - * The central class in the Model-View approach. It delivers all kinds - * of information from the backing user data structures that represent - * the graph. The class allows to modify the graph structure: create - * and remove nodes and connections. - * - * We use two types of the unique ids for graph manipulations: - * - NodeId - * - ConnectionId - */ -class NODE_EDITOR_PUBLIC AbstractGraphModel : public QObject -{ - Q_OBJECT -public: - /// Generates a new unique NodeId. - virtual NodeId newNodeId() = 0; - - /// @brief Returns the full set of unique Node Ids. - /** - * Model creator is responsible for generating unique `unsigned int` - * Ids for all the nodes in the graph. From an Id it should be - * possible to trace back to the model's internal representation of - * the node. - */ - virtual std::unordered_set allNodeIds() const = 0; - - /** - * A collection of all input and output connections for the given `nodeId`. - */ - virtual std::unordered_set allConnectionIds(NodeId const nodeId) const = 0; - - /// @brief Returns all connected Node Ids for given port. - /** - * The returned set of nodes and port indices correspond to the type - * opposite to the given `portType`. - */ - virtual std::unordered_set connections(NodeId nodeId, - PortType portType, - PortIndex index) const - = 0; - - /// Checks if two nodes with the given `connectionId` are connected. - virtual bool connectionExists(ConnectionId const connectionId) const = 0; - - /// Creates a new node instance in the derived class. - /** - * The model is responsible for generating a unique `NodeId`. - * @param[in] nodeType is free to be used and interpreted by the - * model on its own, it helps to distinguish between possible node - * types and create a correct instance inside. - */ - virtual NodeId addNode(QString const nodeType = QString()) = 0; - - /// Model decides if a conection with a given connection Id possible. - /** - * The default implementation compares corresponding data types. - * - * It is possible to override the function and connect non-equal - * data types. - */ - virtual bool connectionPossible(ConnectionId const connectionId) const = 0; - - /// Defines if detaching the connection is possible. - virtual bool detachPossible(ConnectionId const) const { return true; } - - /// Creates a new connection between two nodes. - /** - * Default implementation emits signal - * `connectionCreated(connectionId)` - * - * In the derived classes user must emite the signal to notify the - * scene about the changes. - */ - virtual void addConnection(ConnectionId const connectionId) = 0; - - /** - * @returns `true` if there is data in the model associated with the - * given `nodeId`. - */ - virtual bool nodeExists(NodeId const nodeId) const = 0; - - /// @brief Returns node-related data for requested NodeRole. - /** - * @returns Node Caption, Node Caption Visibility, Node Position etc. - */ - virtual QVariant nodeData(NodeId nodeId, NodeRole role) const = 0; - - /** - * A utility function that unwraps the `QVariant` value returned from the - * standard `QVariant AbstractGraphModel::nodeData(NodeId, NodeRole)` function. - */ - template - T nodeData(NodeId nodeId, NodeRole role) const - { - return nodeData(nodeId, role).value(); - } - - virtual NodeFlags nodeFlags(NodeId nodeId) const - { - Q_UNUSED(nodeId); - return NodeFlag::NoFlags; - } - - /// @brief Sets node properties. - /** - * Sets: Node Caption, Node Caption Visibility, - * Shyle, State, Node Position etc. - * @see NodeRole. - */ - virtual bool setNodeData(NodeId nodeId, NodeRole role, QVariant value) = 0; - - /// @brief Returns port-related data for requested NodeRole. - /** - * @returns Port Data Type, Port Data, Connection Policy, Port - * Caption. - */ - virtual QVariant portData(NodeId nodeId, PortType portType, PortIndex index, PortRole role) const - = 0; - - /** - * A utility function that unwraps the `QVariant` value returned from the - * standard `QVariant AbstractGraphModel::portData(...)` function. - */ - template - T portData(NodeId nodeId, PortType portType, PortIndex index, PortRole role) const - { - return portData(nodeId, portType, index, role).value(); - } - - virtual bool setPortData(NodeId nodeId, - PortType portType, - PortIndex index, - QVariant const &value, - PortRole role = PortRole::Data) - = 0; - - virtual bool deleteConnection(ConnectionId const connectionId) = 0; - - virtual bool deleteNode(NodeId const nodeId) = 0; - - /** - * Reimplement the function if you want to store/restore the node's - * inner state during undo/redo node deletion operations. - */ - virtual QJsonObject saveNode(NodeId const) const { return {}; } - - /** - * Reimplement the function if you want to support: - * - * - graph save/restore operations, - * - undo/redo operations after deleting the node. - * - * QJsonObject must contain following fields: - * - * - * ``` - * { - * id : 5, - * position : { x : 100, y : 200 }, - * internal-data { - * "your model specific data here" - * } - * } - * ``` - * - * The function must do almost exacly the same thing as the normal addNode(). - * The main difference is in a model-specific `inner-data` processing. - */ - virtual void loadNode(QJsonObject const &) {} - -public: - /** - * Function clears connections attached to the ports that are scheduled to be - * deleted. It must be called right before the model removes its old port data. - * - * @param nodeId Defines the node to be modified - * @param portType Is either PortType::In or PortType::Out - * @param first Index of the first port to be removed - * @param last Index of the last port to be removed - */ - void portsAboutToBeDeleted(NodeId const nodeId, - PortType const portType, - PortIndex const first, - PortIndex const last); - - /** - * Signal emitted when model no longer has the old data associated with the - * given port indices and when the node must be repainted. - */ - void portsDeleted(); - - /** - * Signal emitted when model is about to create new ports on the given node. - * @param first Is the first index of the new port after insertion. - * @param last Is the last index of the new port after insertion. - * - * Function caches existing connections that are located after the `last` port - * index. For such connections the new "post-insertion" addresses are computed - * and stored until the function AbstractGraphModel::portsInserted is called. - */ - void portsAboutToBeInserted(NodeId const nodeId, - PortType const portType, - PortIndex const first, - PortIndex const last); - - /** - * Function re-creates the connections that were shifted during the port - * insertion. After that the node is updated. - */ - void portsInserted(); - -Q_SIGNALS: - void connectionCreated(ConnectionId const connectionId); - - void connectionDeleted(ConnectionId const connectionId); - - void nodeCreated(NodeId const nodeId); - - void nodeDeleted(NodeId const nodeId); - - void nodeUpdated(NodeId const nodeId); - - void nodeFlagsUpdated(NodeId const nodeId); - - void nodePositionUpdated(NodeId const nodeId); - - void modelReset(); - -private: - std::vector _shiftedByDynamicPortsConnections; -}; - -} // namespace QtNodes diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/internal/AbstractNodeGeometry.hpp b/story-editor-legacy/nodeeditor/include/QtNodes/internal/AbstractNodeGeometry.hpp deleted file mode 100644 index 36cc9a2..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/internal/AbstractNodeGeometry.hpp +++ /dev/null @@ -1,82 +0,0 @@ -#pragma once - -#include "Definitions.hpp" -#include "Export.hpp" - -#include -#include -#include - -namespace QtNodes { - -class AbstractGraphModel; - -class NODE_EDITOR_PUBLIC AbstractNodeGeometry -{ -public: - AbstractNodeGeometry(AbstractGraphModel &, double marginsRatio = 0.2); - virtual ~AbstractNodeGeometry() {} - - /** - * The node's size plus some additional margin around it to account for drawing - * effects (for example shadows) or node's parts outside the size rectangle - * (for example port points). - * - * The default implementation returns QSize + 20 percent of width and heights - * at each side of the rectangle. - */ - virtual QRectF boundingRect(NodeId const nodeId) const; - - virtual void setMarginsRatio(double marginsRatio); - - /// A direct rectangle defining the borders of the node's rectangle. - virtual QSize size(NodeId const nodeId) const = 0; - - /** - * The function is triggeren when a nuber of ports is changed or when an - * embedded widget needs an update. - */ - virtual void recomputeSize(NodeId const nodeId) const = 0; - - /// Port position in node's coordinate system. - virtual QPointF portPosition(NodeId const nodeId, - PortType const portType, - PortIndex const index) const - = 0; - - /// A convenience function using the `portPosition` and a given transformation. - virtual QPointF portScenePosition(NodeId const nodeId, - PortType const portType, - PortIndex const index, - QTransform const &t) const; - - /// Defines where to draw port label. The point corresponds to a font baseline. - virtual QPointF portTextPosition(NodeId const nodeId, - PortType const portType, - PortIndex const portIndex) const - = 0; - - /** - * Defines where to start drawing the caption. The point corresponds to a font - * baseline. - */ - virtual QPointF captionPosition(NodeId const nodeId) const = 0; - - /// Caption rect is needed for estimating the total node size. - virtual QRectF captionRect(NodeId const nodeId) const = 0; - - /// Position for an embedded widget. Return any value if you don't embed. - virtual QPointF widgetPosition(NodeId const nodeId) const = 0; - - virtual PortIndex checkPortHit(NodeId const nodeId, - PortType const portType, - QPointF const nodePoint) const; - - virtual QRect resizeHandleRect(NodeId const nodeId) const = 0; - -protected: - AbstractGraphModel &_graphModel; - double _marginsRatio{0.0}; -}; - -} // namespace QtNodes diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/internal/AbstractNodePainter.hpp b/story-editor-legacy/nodeeditor/include/QtNodes/internal/AbstractNodePainter.hpp deleted file mode 100644 index cd4c7d6..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/internal/AbstractNodePainter.hpp +++ /dev/null @@ -1,29 +0,0 @@ -#pragma once - -#include - -#include "Export.hpp" - -class QPainter; - -namespace QtNodes { - -class NodeGraphicsObject; -class NodeDataModel; - -/// Class enables custom painting. -class NODE_EDITOR_PUBLIC AbstractNodePainter -{ -public: - virtual ~AbstractNodePainter() = default; - - /** - * Reimplement this function in order to have a custom painting. - * - * Useful functions: - * `NodeGraphicsObject::nodeScene()->nodeGeometry()` - * `NodeGraphicsObject::graphModel()` - */ - virtual void paint(QPainter *painter, NodeGraphicsObject &ngo) const = 0; -}; -} // namespace QtNodes diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/internal/BasicGraphicsScene.hpp b/story-editor-legacy/nodeeditor/include/QtNodes/internal/BasicGraphicsScene.hpp deleted file mode 100644 index 0cc6abd..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/internal/BasicGraphicsScene.hpp +++ /dev/null @@ -1,184 +0,0 @@ -#pragma once - -#include -#include -#include - -#include -#include -#include -#include - -#include "AbstractGraphModel.hpp" -#include "AbstractNodeGeometry.hpp" -#include "ConnectionIdHash.hpp" -#include "Definitions.hpp" -#include "Export.hpp" - -#include "QUuidStdHash.hpp" - -class QUndoStack; - -namespace QtNodes { - -class AbstractGraphModel; -class AbstractNodePainter; -class ConnectionGraphicsObject; -class NodeGraphicsObject; -class NodeStyle; - -/// An instance of QGraphicsScene, holds connections and nodes. -class NODE_EDITOR_PUBLIC BasicGraphicsScene : public QGraphicsScene -{ - Q_OBJECT -public: - BasicGraphicsScene(AbstractGraphModel &graphModel, QObject *parent = nullptr); - - // Scenes without models are not supported - BasicGraphicsScene() = delete; - - ~BasicGraphicsScene(); - -public: - /// @returns associated AbstractGraphModel. - AbstractGraphModel const &graphModel() const; - - AbstractGraphModel &graphModel(); - - AbstractNodeGeometry &nodeGeometry(); - - AbstractNodePainter &nodePainter(); - - void setNodePainter(std::unique_ptr newPainter); - - QUndoStack &undoStack(); - - void setDropShadowEffect(bool enable); - - bool isDropShadowEffectEnabled() const; - -public: - /// Creates a "draft" instance of ConnectionGraphicsObject. - /** - * The scene caches a "draft" connection which has one loose end. - * After attachment the "draft" instance is deleted and instead a - * normal "full" connection is created. - * Function @returns the "draft" instance for further geometry - * manipulations. - */ - std::unique_ptr const &makeDraftConnection( - ConnectionId const newConnectionId); - - /// Deletes "draft" connection. - /** - * The function is called when user releases the mouse button during - * the construction of the new connection without attaching it to any - * node. - */ - void resetDraftConnection(); - - /// Deletes all the nodes. Connections are removed automatically. - void clearScene(); - -public: - /// @returns NodeGraphicsObject associated with the given nodeId. - /** - * @returns nullptr when the object is not found. - */ - NodeGraphicsObject *nodeGraphicsObject(NodeId nodeId); - - /// @returns ConnectionGraphicsObject corresponding to `connectionId`. - /** - * @returns `nullptr` when the object is not found. - */ - ConnectionGraphicsObject *connectionGraphicsObject(ConnectionId connectionId); - - Qt::Orientation orientation() const { return _orientation; } - - void setOrientation(Qt::Orientation const orientation); - -public: - /// Can @return an instance of the scene context menu in subclass. - /** - * Default implementation returns `nullptr`. - */ - virtual QMenu *createSceneMenu(QPointF const scenePos); - -Q_SIGNALS: - void nodeMoved(NodeId const nodeId, QPointF const &newLocation); - - void nodeClicked(NodeId const nodeId); - - void nodeSelected(NodeId const nodeId); - - void nodeDoubleClicked(NodeId const nodeId); - - void nodeHovered(NodeId const nodeId, QPoint const screenPos); - - void nodeHoverLeft(NodeId const nodeId); - - void connectionHovered(ConnectionId const connectionId, QPoint const screenPos); - - void connectionHoverLeft(ConnectionId const connectionId); - - /// Signal allows showing custom context menu upon clicking a node. - void nodeContextMenu(NodeId const nodeId, QPointF const pos); - -private: - /// @brief Creates Node and Connection graphics objects. - /** - * Function is used to populate an empty scene in the constructor. We - * perform depth-first AbstractGraphModel traversal. The connections are - * created by checking non-empty node `Out` ports. - */ - void traverseGraphAndPopulateGraphicsObjects(); - - /// Redraws adjacent nodes for given `connectionId` - void updateAttachedNodes(ConnectionId const connectionId, PortType const portType); - -public Q_SLOTS: - /// Slot called when the `connectionId` is erased form the AbstractGraphModel. - void onConnectionDeleted(ConnectionId const connectionId); - - /// Slot called when the `connectionId` is created in the AbstractGraphModel. - void onConnectionCreated(ConnectionId const connectionId); - - void onNodeDeleted(NodeId const nodeId); - - void onNodeCreated(NodeId const nodeId); - - void onNodePositionUpdated(NodeId const nodeId); - - void onNodeUpdated(NodeId const nodeId); - - void onNodeClicked(NodeId const nodeId); - - void onModelReset(); - -private: - AbstractGraphModel &_graphModel; - - using UniqueNodeGraphicsObject = std::unique_ptr; - - using UniqueConnectionGraphicsObject = std::unique_ptr; - - std::unordered_map _nodeGraphicsObjects; - - std::unordered_map _connectionGraphicsObjects; - - std::unique_ptr _draftConnection; - - std::unique_ptr _nodeGeometry; - - std::unique_ptr _nodePainter; - - bool _nodeDrag; - - QUndoStack *_undoStack; - - Qt::Orientation _orientation; - - bool _dropShadowEffect{false}; -}; - -} // namespace QtNodes diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/internal/Compiler.hpp b/story-editor-legacy/nodeeditor/include/QtNodes/internal/Compiler.hpp deleted file mode 100644 index 9842657..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/internal/Compiler.hpp +++ /dev/null @@ -1,40 +0,0 @@ -#pragma once - -#if defined(__MINGW32__) || defined(__MINGW64__) -#define NODE_EDITOR_COMPILER "MinGW" -#define NODE_EDITOR_COMPILER_MINGW -#elif defined(__clang__) -#define NODE_EDITOR_COMPILER "Clang" -#define NODE_EDITOR_COMPILER_CLANG -#elif defined(_MSC_VER) -#define NODE_EDITOR_COMPILER "Microsoft Visual C++" -#define NODE_EDITOR_COMPILER_MICROSOFT -#elif defined(__GNUC__) -#define NODE_EDITOR_COMPILER "GNU" -#define NODE_EDITOR_COMPILER_GNU -#define NODE_EDITOR_COMPILER_GNU_VERSION_MAJOR __GNUC__ -#define NODE_EDITOR_COMPILER_GNU_VERSION_MINOR __GNUC_MINOR__ -#define NODE_EDITOR_COMPILER_GNU_VERSION_PATCH __GNUC_PATCHLEVEL__ -#elif defined(__BORLANDC__) -#define NODE_EDITOR_COMPILER "Borland C++ Builder" -#define NODE_EDITOR_COMPILER_BORLAND -#elif defined(__CODEGEARC__) -#define NODE_EDITOR_COMPILER "CodeGear C++ Builder" -#define NODE_EDITOR_COMPILER_CODEGEAR -#elif defined(__INTEL_COMPILER) || defined(__ICL) -#define NODE_EDITOR_COMPILER "Intel C++" -#define NODE_EDITOR_COMPILER_INTEL -#elif defined(__xlC__) || defined(__IBMCPP__) -#define NODE_EDITOR_COMPILER "IBM XL C++" -#define NODE_EDITOR_COMPILER_IBM -#elif defined(__HP_aCC) -#define NODE_EDITOR_COMPILER "HP aC++" -#define NODE_EDITOR_COMPILER_HP -#elif defined(__WATCOMC__) -#define NODE_EDITOR_COMPILER "Watcom C++" -#define NODE_EDITOR_COMPILER_WATCOM -#endif - -#ifndef NODE_EDITOR_COMPILER -#error "Current compiler is not supported." -#endif diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/internal/ConnectionGraphicsObject.hpp b/story-editor-legacy/nodeeditor/include/QtNodes/internal/ConnectionGraphicsObject.hpp deleted file mode 100644 index f0e569d..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/internal/ConnectionGraphicsObject.hpp +++ /dev/null @@ -1,96 +0,0 @@ -#pragma once - -#include - -#include -#include - -#include "ConnectionState.hpp" -#include "Definitions.hpp" - -class QGraphicsSceneMouseEvent; - -namespace QtNodes { - -class AbstractGraphModel; -class BasicGraphicsScene; - -/// Graphic Object for connection. Adds itself to scene -class ConnectionGraphicsObject : public QGraphicsObject -{ - Q_OBJECT -public: - // Needed for qgraphicsitem_cast - enum { Type = UserType + 2 }; - - int type() const override { return Type; } - -public: - ConnectionGraphicsObject(BasicGraphicsScene &scene, ConnectionId const connectionId); - - ~ConnectionGraphicsObject() = default; - -public: - AbstractGraphModel &graphModel() const; - - BasicGraphicsScene *nodeScene() const; - - ConnectionId const &connectionId() const; - - QRectF boundingRect() const override; - - QPainterPath shape() const override; - - QPointF const &endPoint(PortType portType) const; - - QPointF out() const { return _out; } - - QPointF in() const { return _in; } - - std::pair pointsC1C2() const; - - void setEndPoint(PortType portType, QPointF const &point); - - /// Updates the position of both ends - void move(); - - ConnectionState const &connectionState() const; - - ConnectionState &connectionState(); - -protected: - void paint(QPainter *painter, - QStyleOptionGraphicsItem const *option, - QWidget *widget = 0) override; - - void mousePressEvent(QGraphicsSceneMouseEvent *event) override; - - void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override; - - void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override; - - void hoverEnterEvent(QGraphicsSceneHoverEvent *event) override; - - void hoverLeaveEvent(QGraphicsSceneHoverEvent *event) override; - -private: - void initializePosition(); - - void addGraphicsEffect(); - - std::pair pointsC1C2Horizontal() const; - - std::pair pointsC1C2Vertical() const; - -private: - ConnectionId _connectionId; - - AbstractGraphModel &_graphModel; - - ConnectionState _connectionState; - - mutable QPointF _out; - mutable QPointF _in; -}; - -} // namespace QtNodes diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/internal/ConnectionIdHash.hpp b/story-editor-legacy/nodeeditor/include/QtNodes/internal/ConnectionIdHash.hpp deleted file mode 100644 index 09eaced..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/internal/ConnectionIdHash.hpp +++ /dev/null @@ -1,55 +0,0 @@ -#pragma once - -#include - -#include "Definitions.hpp" - -inline void hash_combine(std::size_t &seed) -{ - Q_UNUSED(seed); -} - -template -inline void hash_combine(std::size_t &seed, const T &v, Rest... rest) -{ - std::hash hasher; - seed ^= hasher(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2); - hash_combine(seed, rest...); -} - -namespace std { -template<> -struct hash -{ - inline std::size_t operator()(QtNodes::ConnectionId const &id) const - { - std::size_t h = 0; - hash_combine(h, id.outNodeId, id.outPortIndex, id.inNodeId, id.inPortIndex); - return h; - } -}; - -template<> -struct hash> -{ - inline std::size_t operator()(std::pair const &nodePort) const - { - std::size_t h = 0; - hash_combine(h, nodePort.first, nodePort.second); - return h; - } -}; - -template<> -struct hash> -{ - using Key = std::tuple; - - inline std::size_t operator()(Key const &key) const - { - std::size_t h = 0; - hash_combine(h, std::get<0>(key), std::get<1>(key), std::get<2>(key)); - return h; - } -}; -} // namespace std diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/internal/ConnectionIdUtils.hpp b/story-editor-legacy/nodeeditor/include/QtNodes/internal/ConnectionIdUtils.hpp deleted file mode 100644 index 7f70a1b..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/internal/ConnectionIdUtils.hpp +++ /dev/null @@ -1,151 +0,0 @@ -#pragma once - -#include "Definitions.hpp" - -#include - -#include -#include - -namespace QtNodes { - -inline PortIndex getNodeId(PortType portType, ConnectionId connectionId) -{ - NodeId id = InvalidNodeId; - - if (portType == PortType::Out) { - id = connectionId.outNodeId; - } else if (portType == PortType::In) { - id = connectionId.inNodeId; - } - - return id; -} - -inline PortIndex getPortIndex(PortType portType, ConnectionId connectionId) -{ - PortIndex index = InvalidPortIndex; - - if (portType == PortType::Out) { - index = connectionId.outPortIndex; - } else if (portType == PortType::In) { - index = connectionId.inPortIndex; - } - - return index; -} - -inline PortType oppositePort(PortType port) -{ - PortType result = PortType::None; - - switch (port) { - case PortType::In: - result = PortType::Out; - break; - - case PortType::Out: - result = PortType::In; - break; - - case PortType::None: - result = PortType::None; - break; - - default: - break; - } - return result; -} - -inline bool isPortIndexValid(PortIndex index) -{ - return index != InvalidPortIndex; -} - -inline bool isPortTypeValid(PortType portType) -{ - return portType != PortType::None; -} - -/** - * Creates a connection Id instance filled just on one side. - */ -inline ConnectionId makeIncompleteConnectionId(NodeId const connectedNodeId, - PortType const connectedPort, - PortIndex const connectedPortIndex) -{ - return (connectedPort == PortType::In) - ? ConnectionId{InvalidNodeId, InvalidPortIndex, connectedNodeId, connectedPortIndex} - : ConnectionId{connectedNodeId, connectedPortIndex, InvalidNodeId, InvalidPortIndex}; -} - -/** - * Turns a full connection Id into an incomplete one by removing the - * data on the given side - */ -inline ConnectionId makeIncompleteConnectionId(ConnectionId connectionId, - PortType const portToDisconnect) -{ - if (portToDisconnect == PortType::Out) { - connectionId.outNodeId = InvalidNodeId; - connectionId.outPortIndex = InvalidPortIndex; - } else { - connectionId.inNodeId = InvalidNodeId; - connectionId.inPortIndex = InvalidPortIndex; - } - - return connectionId; -} - -inline ConnectionId makeCompleteConnectionId(ConnectionId incompleteConnectionId, - NodeId const nodeId, - PortIndex const portIndex) -{ - if (incompleteConnectionId.outNodeId == InvalidNodeId) { - incompleteConnectionId.outNodeId = nodeId; - incompleteConnectionId.outPortIndex = portIndex; - } else { - incompleteConnectionId.inNodeId = nodeId; - incompleteConnectionId.inPortIndex = portIndex; - } - - return incompleteConnectionId; -} - -inline std::ostream &operator<<(std::ostream &ostr, ConnectionId const connectionId) -{ - ostr << "(" << connectionId.outNodeId << ", " - << (isPortIndexValid(connectionId.outPortIndex) ? std::to_string(connectionId.outPortIndex) - : "INVALID") - << ", " << connectionId.inNodeId << ", " - << (isPortIndexValid(connectionId.inPortIndex) ? std::to_string(connectionId.inPortIndex) - : "INVALID") - << ")" << std::endl; - - return ostr; -} - -inline QJsonObject toJson(ConnectionId const &connId) -{ - QJsonObject connJson; - - connJson["outNodeId"] = static_cast(connId.outNodeId); - connJson["outPortIndex"] = static_cast(connId.outPortIndex); - connJson["intNodeId"] = static_cast(connId.inNodeId); - connJson["inPortIndex"] = static_cast(connId.inPortIndex); - - return connJson; -} - -inline ConnectionId fromJson(QJsonObject const &connJson) -{ - ConnectionId connId{static_cast(connJson["outNodeId"].toInt(InvalidNodeId)), - static_cast(connJson["outPortIndex"].toInt(InvalidPortIndex)), - static_cast(connJson["intNodeId"].toInt(InvalidNodeId)), - static_cast(connJson["inPortIndex"].toInt(InvalidPortIndex))}; - - return connId; -} - -} // namespace QtNodes diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/internal/ConnectionPainter.hpp b/story-editor-legacy/nodeeditor/include/QtNodes/internal/ConnectionPainter.hpp deleted file mode 100644 index 8db24d8..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/internal/ConnectionPainter.hpp +++ /dev/null @@ -1,21 +0,0 @@ -#pragma once - -#include -#include - -#include "Definitions.hpp" - -namespace QtNodes { - -class ConnectionGeometry; -class ConnectionGraphicsObject; - -class ConnectionPainter -{ -public: - static void paint(QPainter *painter, ConnectionGraphicsObject const &cgo); - - static QPainterPath getPainterStroke(ConnectionGraphicsObject const &cgo); -}; - -} // namespace QtNodes diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/internal/ConnectionState.hpp b/story-editor-legacy/nodeeditor/include/QtNodes/internal/ConnectionState.hpp deleted file mode 100644 index ddd31cd..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/internal/ConnectionState.hpp +++ /dev/null @@ -1,60 +0,0 @@ -#pragma once - -#include - -#include "Export.hpp" - -#include "Definitions.hpp" - -class QPointF; - -namespace QtNodes { - -class ConnectionGraphicsObject; - -/// Stores currently draggind end. -/// Remembers last hovered Node. -class NODE_EDITOR_PUBLIC ConnectionState -{ -public: - /// Defines whether we construct a new connection - /// or it is already binding two nodes. - enum LooseEnd { Pending = 0, Connected = 1 }; - -public: - ConnectionState(ConnectionGraphicsObject &cgo) - : _cgo(cgo) - , _hovered(false) - {} - - ConnectionState(ConnectionState const &) = delete; - ConnectionState(ConnectionState &&) = delete; - - ConnectionState &operator=(ConnectionState const &) = delete; - ConnectionState &operator=(ConnectionState &&) = delete; - - ~ConnectionState(); - -public: - PortType requiredPort() const; - bool requiresPort() const; - - bool hovered() const; - void setHovered(bool hovered); - -public: - /// Caches NodeId for further interaction. - void setLastHoveredNode(NodeId const nodeId); - - NodeId lastHoveredNode() const; - - void resetLastHoveredNode(); - -private: - ConnectionGraphicsObject &_cgo; - - bool _hovered; - - NodeId _lastHoveredNode{InvalidNodeId}; -}; -} // namespace QtNodes diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/internal/ConnectionStyle.hpp b/story-editor-legacy/nodeeditor/include/QtNodes/internal/ConnectionStyle.hpp deleted file mode 100644 index b718bcf..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/internal/ConnectionStyle.hpp +++ /dev/null @@ -1,54 +0,0 @@ -#pragma once - -#include - -#include "Export.hpp" -#include "Style.hpp" - -namespace QtNodes { - -class NODE_EDITOR_PUBLIC ConnectionStyle : public Style -{ -public: - ConnectionStyle(); - - ConnectionStyle(QString jsonText); - - ~ConnectionStyle() = default; - -public: - static void setConnectionStyle(QString jsonText); - -public: - void loadJson(QJsonObject const &json) override; - - QJsonObject toJson() const override; - -public: - QColor constructionColor() const; - QColor normalColor() const; - QColor normalColor(QString typeId) const; - QColor selectedColor() const; - QColor selectedHaloColor() const; - QColor hoveredColor() const; - - float lineWidth() const; - float constructionLineWidth() const; - float pointDiameter() const; - - bool useDataDefinedColors() const; - -private: - QColor ConstructionColor; - QColor NormalColor; - QColor SelectedColor; - QColor SelectedHaloColor; - QColor HoveredColor; - - float LineWidth; - float ConstructionLineWidth; - float PointDiameter; - - bool UseDataDefinedColors; -}; -} // namespace QtNodes diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/internal/DataFlowGraphModel.hpp b/story-editor-legacy/nodeeditor/include/QtNodes/internal/DataFlowGraphModel.hpp deleted file mode 100644 index 2688002..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/internal/DataFlowGraphModel.hpp +++ /dev/null @@ -1,135 +0,0 @@ -#pragma once - -#include "AbstractGraphModel.hpp" -#include "ConnectionIdUtils.hpp" -#include "NodeDelegateModelRegistry.hpp" -#include "Serializable.hpp" -#include "StyleCollection.hpp" - -#include "Export.hpp" - -#include - -#include - -namespace QtNodes { - -class NODE_EDITOR_PUBLIC DataFlowGraphModel : public AbstractGraphModel, public Serializable -{ - Q_OBJECT - -public: - struct NodeGeometryData - { - QSize size; - QPointF pos; - }; - -public: - DataFlowGraphModel(std::shared_ptr registry); - - std::shared_ptr dataModelRegistry() { return _registry; } - -public: - std::unordered_set allNodeIds() const override; - - std::unordered_set allConnectionIds(NodeId const nodeId) const override; - - std::unordered_set connections(NodeId nodeId, - PortType portType, - PortIndex portIndex) const override; - - bool connectionExists(ConnectionId const connectionId) const override; - - NodeId addNode(QString const nodeType) override; - - bool connectionPossible(ConnectionId const connectionId) const override; - - void addConnection(ConnectionId const connectionId) override; - - bool nodeExists(NodeId const nodeId) const override; - - QVariant nodeData(NodeId nodeId, NodeRole role) const override; - - NodeFlags nodeFlags(NodeId nodeId) const override; - - bool setNodeData(NodeId nodeId, NodeRole role, QVariant value) override; - - QVariant portData(NodeId nodeId, - PortType portType, - PortIndex portIndex, - PortRole role) const override; - - bool setPortData(NodeId nodeId, - PortType portType, - PortIndex portIndex, - QVariant const &value, - PortRole role = PortRole::Data) override; - - bool deleteConnection(ConnectionId const connectionId) override; - - bool deleteNode(NodeId const nodeId) override; - - QJsonObject saveNode(NodeId const) const override; - - QJsonObject save() const override; - - void loadNode(QJsonObject const &nodeJson) override; - - void load(QJsonObject const &json) override; - - /** - * Fetches the NodeDelegateModel for the given `nodeId` and tries to cast the - * stored pointer to the given type - */ - template - NodeDelegateModelType *delegateModel(NodeId const nodeId) - { - auto it = _models.find(nodeId); - if (it == _models.end()) - return nullptr; - - auto model = dynamic_cast(it->second.get()); - - return model; - } - -Q_SIGNALS: - void inPortDataWasSet(NodeId const, PortType const, PortIndex const); - -private: - NodeId newNodeId() override { return _nextNodeId++; } - - void sendConnectionCreation(ConnectionId const connectionId); - - void sendConnectionDeletion(ConnectionId const connectionId); - -private Q_SLOTS: - /** - * Fuction is called in three cases: - * - * - By underlying NodeDelegateModel when a node has new data to propagate. - * @see DataFlowGraphModel::addNode - * - When a new connection is created. - * @see DataFlowGraphModel::addConnection - * - When a node restored from JSON an needs to send data downstream. - * @see DataFlowGraphModel::loadNode - */ - void onOutPortDataUpdated(NodeId const nodeId, PortIndex const portIndex); - - /// Function is called after detaching a connection. - void propagateEmptyDataTo(NodeId const nodeId, PortIndex const portIndex); - -private: - std::shared_ptr _registry; - - NodeId _nextNodeId; - - std::unordered_map> _models; - - std::unordered_set _connectivity; - - mutable std::unordered_map _nodeGeometryData; -}; - -} // namespace QtNodes diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/internal/DataFlowGraphicsScene.hpp b/story-editor-legacy/nodeeditor/include/QtNodes/internal/DataFlowGraphicsScene.hpp deleted file mode 100644 index 25698eb..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/internal/DataFlowGraphicsScene.hpp +++ /dev/null @@ -1,40 +0,0 @@ -#pragma once - -#include "BasicGraphicsScene.hpp" -#include "DataFlowGraphModel.hpp" -#include "Export.hpp" - -namespace QtNodes { - -/// @brief An advanced scene working with data-propagating graphs. -/** - * The class represents a scene that existed in v2.x but built wit the - * new model-view approach in mind. - */ -class NODE_EDITOR_PUBLIC DataFlowGraphicsScene : public BasicGraphicsScene -{ - Q_OBJECT -public: - DataFlowGraphicsScene(DataFlowGraphModel &graphModel, QObject *parent = nullptr); - - ~DataFlowGraphicsScene() = default; - -public: - std::vector selectedNodes() const; - -public: - QMenu *createSceneMenu(QPointF const scenePos) override; - -public Q_SLOTS: - void save() const; - - void load(); - -Q_SIGNALS: - void sceneLoaded(); - -private: - DataFlowGraphModel &_graphModel; -}; - -} // namespace QtNodes diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/internal/DefaultHorizontalNodeGeometry.hpp b/story-editor-legacy/nodeeditor/include/QtNodes/internal/DefaultHorizontalNodeGeometry.hpp deleted file mode 100644 index f5f6607..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/internal/DefaultHorizontalNodeGeometry.hpp +++ /dev/null @@ -1,58 +0,0 @@ -#pragma once - -#include "AbstractNodeGeometry.hpp" - -#include - -namespace QtNodes { - -class AbstractGraphModel; -class BasicGraphicsScene; - -class NODE_EDITOR_PUBLIC DefaultHorizontalNodeGeometry : public AbstractNodeGeometry -{ -public: - DefaultHorizontalNodeGeometry(AbstractGraphModel &graphModel); - -public: - QSize size(NodeId const nodeId) const override; - - void recomputeSize(NodeId const nodeId) const override; - - QPointF portPosition(NodeId const nodeId, - PortType const portType, - PortIndex const index) const override; - - QPointF portTextPosition(NodeId const nodeId, - PortType const portType, - PortIndex const PortIndex) const override; - QPointF captionPosition(NodeId const nodeId) const override; - - QRectF captionRect(NodeId const nodeId) const override; - - QPointF widgetPosition(NodeId const nodeId) const override; - - QRect resizeHandleRect(NodeId const nodeId) const override; - -private: - QRectF portTextRect(NodeId const nodeId, - PortType const portType, - PortIndex const portIndex) const; - - /// Finds max number of ports and multiplies by (a port height + interval) - unsigned int maxVerticalPortsExtent(NodeId const nodeId) const; - - unsigned int maxPortsTextAdvance(NodeId const nodeId, PortType const portType) const; - -private: - // Some variables are mutable because we need to change drawing - // metrics corresponding to fontMetrics but this doesn't change - // constness of the Node. - - mutable unsigned int _portSize; - unsigned int _portSpasing; - mutable QFontMetrics _fontMetrics; - mutable QFontMetrics _boldFontMetrics; -}; - -} // namespace QtNodes diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/internal/DefaultNodePainter.hpp b/story-editor-legacy/nodeeditor/include/QtNodes/internal/DefaultNodePainter.hpp deleted file mode 100644 index 484969f..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/internal/DefaultNodePainter.hpp +++ /dev/null @@ -1,34 +0,0 @@ -#pragma once - -#include - -#include "AbstractNodePainter.hpp" -#include "Definitions.hpp" - -namespace QtNodes { - -class BasicGraphicsScene; -class GraphModel; -class NodeGeometry; -class NodeGraphicsObject; -class NodeState; - -/// @ Lightweight class incapsulating paint code. -class NODE_EDITOR_PUBLIC DefaultNodePainter : public AbstractNodePainter -{ -public: - void paint(QPainter *painter, NodeGraphicsObject &ngo) const override; - - void drawNodeRect(QPainter *painter, NodeGraphicsObject &ngo) const; - - void drawConnectionPoints(QPainter *painter, NodeGraphicsObject &ngo) const; - - void drawFilledConnectionPoints(QPainter *painter, NodeGraphicsObject &ngo) const; - - void drawNodeCaption(QPainter *painter, NodeGraphicsObject &ngo) const; - - void drawEntryLabels(QPainter *painter, NodeGraphicsObject &ngo) const; - - void drawResizeRect(QPainter *painter, NodeGraphicsObject &ngo) const; -}; -} // namespace QtNodes diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/internal/DefaultVerticalNodeGeometry.hpp b/story-editor-legacy/nodeeditor/include/QtNodes/internal/DefaultVerticalNodeGeometry.hpp deleted file mode 100644 index ae9b628..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/internal/DefaultVerticalNodeGeometry.hpp +++ /dev/null @@ -1,60 +0,0 @@ -#pragma once - -#include "AbstractNodeGeometry.hpp" - -#include - -namespace QtNodes { - -class AbstractGraphModel; -class BasicGraphicsScene; - -class NODE_EDITOR_PUBLIC DefaultVerticalNodeGeometry : public AbstractNodeGeometry -{ -public: - DefaultVerticalNodeGeometry(AbstractGraphModel &graphModel); - -public: - QSize size(NodeId const nodeId) const override; - - void recomputeSize(NodeId const nodeId) const override; - - QPointF portPosition(NodeId const nodeId, - PortType const portType, - PortIndex const index) const override; - - QPointF portTextPosition(NodeId const nodeId, - PortType const portType, - PortIndex const PortIndex) const override; - - QPointF captionPosition(NodeId const nodeId) const override; - - QRectF captionRect(NodeId const nodeId) const override; - - QPointF widgetPosition(NodeId const nodeId) const override; - - QRect resizeHandleRect(NodeId const nodeId) const override; - -private: - QRectF portTextRect(NodeId const nodeId, - PortType const portType, - PortIndex const portIndex) const; - /// Finds - unsigned int maxHorizontalPortsExtent(NodeId const nodeId) const; - - unsigned int maxPortsTextAdvance(NodeId const nodeId, PortType const portType) const; - - unsigned int portCaptionsHeight(NodeId const nodeId, PortType const portType) const; - -private: - // Some variables are mutable because we need to change drawing - // metrics corresponding to fontMetrics but this doesn't change - // constness of the Node. - - mutable unsigned int _portSize; - unsigned int _portSpasing; - mutable QFontMetrics _fontMetrics; - mutable QFontMetrics _boldFontMetrics; -}; - -} // namespace QtNodes diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/internal/Definitions.hpp b/story-editor-legacy/nodeeditor/include/QtNodes/internal/Definitions.hpp deleted file mode 100644 index 26b94ab..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/internal/Definitions.hpp +++ /dev/null @@ -1,125 +0,0 @@ -#pragma once - -#include "Export.hpp" - -#include - -#include - -/** - * @file - * Important definitions used throughout the library. - */ - -namespace QtNodes { -#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) -NODE_EDITOR_PUBLIC Q_NAMESPACE -#else -Q_NAMESPACE_EXPORT(NODE_EDITOR_PUBLIC) -#endif - - /** - * Constants used for fetching QVariant data from GraphModel. - */ - enum class NodeRole { - Type = 0, ///< Type of the current node, usually a string. - Position = 1, ///< `QPointF` positon of the node on the scene. - Size = 2, ///< `QSize` for resizable nodes. - CaptionVisible = 3, ///< `bool` for caption visibility. - Caption = 4, ///< `QString` for node caption. - Style = 5, ///< Custom NodeStyle as QJsonDocument - InternalData = 6, ///< Node-stecific user data as QJsonObject - InPortCount = 7, ///< `unsigned int` - OutPortCount = 9, ///< `unsigned int` - Widget = 10, ///< Optional `QWidget*` or `nullptr` - Id = 11 ///< Return node ID - }; -Q_ENUM_NS(NodeRole) - -/** - * Specific flags regulating node features and appeaarence. - */ -enum NodeFlag { - NoFlags = 0x0, ///< Default NodeFlag - Resizable = 0x1, ///< Lets the node be resizable - Locked = 0x2 -}; - -Q_DECLARE_FLAGS(NodeFlags, NodeFlag) -Q_FLAG_NS(NodeFlags) -Q_DECLARE_OPERATORS_FOR_FLAGS(NodeFlags) - -/** - * Constants for fetching port-related information from the GraphModel. - */ -enum class PortRole { - Data = 0, ///< `std::shared_ptr`. - DataType = 1, ///< `QString` describing the port data type. - ConnectionPolicyRole = 2, ///< `enum` ConnectionPolicyRole - CaptionVisible = 3, ///< `bool` for caption visibility. - Caption = 4, ///< `QString` for port caption. -}; -Q_ENUM_NS(PortRole) - -/** - * Defines how many connections are possible to attach to ports. The - * values are fetched using PortRole::ConnectionPolicy. - */ -enum class ConnectionPolicy { - One, ///< Just one connection for each port. - Many, ///< Any number of connections possible for the port. -}; -Q_ENUM_NS(ConnectionPolicy) - -/** - * Used for distinguishing input and output node ports. - */ -enum class PortType { - In = 0, ///< Input node port (from the left). - Out = 1, ///< Output node port (from the right). - None = 2 -}; -Q_ENUM_NS(PortType) - -using PortCount = unsigned int; - -/// ports are consecutively numbered starting from zero. -using PortIndex = unsigned int; - -static constexpr PortIndex InvalidPortIndex = std::numeric_limits::max(); - -/// Unique Id associated with each node in the GraphModel. -using NodeId = unsigned int; - -static constexpr NodeId InvalidNodeId = std::numeric_limits::max(); - -/** - * A unique connection identificator that stores - * out `NodeId`, out `PortIndex`, in `NodeId`, in `PortIndex` - */ -struct ConnectionId -{ - NodeId outNodeId; - PortIndex outPortIndex; - NodeId inNodeId; - PortIndex inPortIndex; -}; - -inline bool operator==(ConnectionId const &a, ConnectionId const &b) -{ - return a.outNodeId == b.outNodeId && a.outPortIndex == b.outPortIndex - && a.inNodeId == b.inNodeId && a.inPortIndex == b.inPortIndex; -} - -inline bool operator!=(ConnectionId const &a, ConnectionId const &b) -{ - return !(a == b); -} - -inline void invertConnection(ConnectionId &id) -{ - std::swap(id.outNodeId, id.inNodeId); - std::swap(id.outPortIndex, id.inPortIndex); -} - -} // namespace QtNodes diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/internal/Export.hpp b/story-editor-legacy/nodeeditor/include/QtNodes/internal/Export.hpp deleted file mode 100644 index 41e6e3d..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/internal/Export.hpp +++ /dev/null @@ -1,48 +0,0 @@ -#pragma once - -#include "Compiler.hpp" -#include "OperatingSystem.hpp" - -#ifdef NODE_EDITOR_PLATFORM_WINDOWS -#define NODE_EDITOR_EXPORT __declspec(dllexport) -#define NODE_EDITOR_IMPORT __declspec(dllimport) -#define NODE_EDITOR_LOCAL -#elif NODE_EDITOR_COMPILER_GNU_VERSION_MAJOR >= 4 || defined(NODE_EDITOR_COMPILER_CLANG) -#define NODE_EDITOR_EXPORT __attribute__((visibility("default"))) -#define NODE_EDITOR_IMPORT __attribute__((visibility("default"))) -#define NODE_EDITOR_LOCAL __attribute__((visibility("hidden"))) -#else -#define NODE_EDITOR_EXPORT -#define NODE_EDITOR_IMPORT -#define NODE_EDITOR_LOCAL -#endif - -#ifdef __cplusplus -#define NODE_EDITOR_DEMANGLED extern "C" -#else -#define NODE_EDITOR_DEMANGLED -#endif - -#if defined(NODE_EDITOR_SHARED) && !defined(NODE_EDITOR_STATIC) -#ifdef NODE_EDITOR_EXPORTS -#define NODE_EDITOR_PUBLIC NODE_EDITOR_EXPORT -#else -#define NODE_EDITOR_PUBLIC NODE_EDITOR_IMPORT -#endif -#define NODE_EDITOR_PRIVATE NODE_EDITOR_LOCAL -#elif !defined(NODE_EDITOR_SHARED) && defined(NODE_EDITOR_STATIC) -#define NODE_EDITOR_PUBLIC -#define NODE_EDITOR_PRIVATE -#elif defined(NODE_EDITOR_SHARED) && defined(NODE_EDITOR_STATIC) -#ifdef NODE_EDITOR_EXPORTS -#error "Cannot build as shared and static simultaneously." -#else -#error "Cannot link against shared and static simultaneously." -#endif -#else -#ifdef NODE_EDITOR_EXPORTS -#error "Choose whether to build as shared or static." -#else -#error "Choose whether to link against shared or static." -#endif -#endif diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/internal/GraphicsView.hpp b/story-editor-legacy/nodeeditor/include/QtNodes/internal/GraphicsView.hpp deleted file mode 100644 index 5206812..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/internal/GraphicsView.hpp +++ /dev/null @@ -1,97 +0,0 @@ -#pragma once - -#include - -#include "Export.hpp" - -namespace QtNodes { - -class BasicGraphicsScene; - -/** - * @brief A central view able to render objects from `BasicGraphicsScene`. - */ -class NODE_EDITOR_PUBLIC GraphicsView : public QGraphicsView -{ - Q_OBJECT -public: - struct ScaleRange - { - double minimum = 0; - double maximum = 0; - }; - -public: - GraphicsView(QWidget *parent = Q_NULLPTR); - GraphicsView(BasicGraphicsScene *scene, QWidget *parent = Q_NULLPTR); - - GraphicsView(const GraphicsView &) = delete; - GraphicsView operator=(const GraphicsView &) = delete; - - QAction *clearSelectionAction() const; - - QAction *deleteSelectionAction() const; - - void setScene(BasicGraphicsScene *scene); - - void centerScene(); - - /// @brief max=0/min=0 indicates infinite zoom in/out - void setScaleRange(double minimum = 0, double maximum = 0); - - void setScaleRange(ScaleRange range); - - double getScale() const; - -public Q_SLOTS: - void scaleUp(); - - void scaleDown(); - - void setupScale(double scale); - - void onDeleteSelectedObjects(); - - void onDuplicateSelectedObjects(); - - void onCopySelectedObjects(); - - void onPasteObjects(); - -Q_SIGNALS: - void scaleChanged(double scale); - -protected: - void contextMenuEvent(QContextMenuEvent *event) override; - - void wheelEvent(QWheelEvent *event) override; - - void keyPressEvent(QKeyEvent *event) override; - - void keyReleaseEvent(QKeyEvent *event) override; - - void mousePressEvent(QMouseEvent *event) override; - - void mouseMoveEvent(QMouseEvent *event) override; - - void drawBackground(QPainter *painter, const QRectF &r) override; - - void showEvent(QShowEvent *event) override; - -protected: - BasicGraphicsScene *nodeScene(); - - /// Computes scene position for pasting the copied/duplicated node groups. - QPointF scenePastePosition(); - -private: - QAction *_clearSelectionAction = nullptr; - QAction *_deleteSelectionAction = nullptr; - QAction *_duplicateSelectionAction = nullptr; - QAction *_copySelectionAction = nullptr; - QAction *_pasteAction = nullptr; - - QPointF _clickPos; - ScaleRange _scaleRange; -}; -} // namespace QtNodes diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/internal/GraphicsViewStyle.hpp b/story-editor-legacy/nodeeditor/include/QtNodes/internal/GraphicsViewStyle.hpp deleted file mode 100644 index 32f51b9..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/internal/GraphicsViewStyle.hpp +++ /dev/null @@ -1,32 +0,0 @@ -#pragma once - -#include - -#include "Export.hpp" -#include "Style.hpp" - -namespace QtNodes { - -class NODE_EDITOR_PUBLIC GraphicsViewStyle : public Style -{ -public: - GraphicsViewStyle(); - - GraphicsViewStyle(QString jsonText); - - ~GraphicsViewStyle() = default; - -public: - static void setStyle(QString jsonText); - -private: - void loadJson(QJsonObject const &json) override; - - QJsonObject toJson() const override; - -public: - QColor BackgroundColor; - QColor FineGridColor; - QColor CoarseGridColor; -}; -} // namespace QtNodes diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/internal/NodeConnectionInteraction.hpp b/story-editor-legacy/nodeeditor/include/QtNodes/internal/NodeConnectionInteraction.hpp deleted file mode 100644 index aaefedf..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/internal/NodeConnectionInteraction.hpp +++ /dev/null @@ -1,68 +0,0 @@ -#pragma once - -#include - -#include - -#include "Definitions.hpp" - -namespace QtNodes { - -class ConnectionGraphicsObject; -class NodeGraphicsObject; -class BasicGraphicsScene; - -/// Class wraps conecting and disconnecting checks. -/** - * An instance should be created on the stack and destroyed - * automatically when the operation is completed - */ -class NodeConnectionInteraction -{ -public: - NodeConnectionInteraction(NodeGraphicsObject &ngo, - ConnectionGraphicsObject &cgo, - BasicGraphicsScene &scene); - - /** - * Can connect when following conditions are met: - * 1. Connection 'requires' a port. - * 2. Connection loose end is above the node port. - * 3. Source and target `nodeId`s are different. - * 4. GraphModel permits connection. - */ - bool canConnect(PortIndex *portIndex) const; - - /// Creates a new connectino if possible. - /** - * 1. Check conditions from 'canConnect'. - * 2. Creates new connection with `GraphModel::addConnection`. - * 3. Adjust connection geometry. - */ - bool tryConnect() const; - - /** - * 1. Delete connection with `GraphModel::deleteConnection`. - * 2. Create a "draft" connection with incomplete `ConnectionId`. - * 3. Repaint both previously connected nodes. - */ - bool disconnect(PortType portToDisconnect) const; - -private: - PortType connectionRequiredPort() const; - - QPointF connectionEndScenePosition(PortType) const; - - QPointF nodePortScenePosition(PortType portType, PortIndex portIndex) const; - - PortIndex nodePortIndexUnderScenePoint(PortType portType, QPointF const &p) const; - -private: - NodeGraphicsObject &_ngo; - - ConnectionGraphicsObject &_cgo; - - BasicGraphicsScene &_scene; -}; - -} // namespace QtNodes diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/internal/NodeData.hpp b/story-editor-legacy/nodeeditor/include/QtNodes/internal/NodeData.hpp deleted file mode 100644 index 1ef7480..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/internal/NodeData.hpp +++ /dev/null @@ -1,43 +0,0 @@ -#pragma once - -#include - -#include -#include - -#include "Export.hpp" - -namespace QtNodes { - -/** - * `id` represents an internal unique data type for the given port. - * `name` is a normal text description. - */ -struct NODE_EDITOR_PUBLIC NodeDataType -{ - QString id; - QString name; -}; - -/** - * Class represents data transferred between nodes. - * @param type is used for comparing the types - * The actual data is stored in subtypes - */ -class NODE_EDITOR_PUBLIC NodeData -{ -public: - virtual ~NodeData() = default; - - virtual bool sameType(NodeData const &nodeData) const - { - return (this->type().id == nodeData.type().id); - } - - /// Type for inner use - virtual NodeDataType type() const = 0; -}; - -} // namespace QtNodes -Q_DECLARE_METATYPE(QtNodes::NodeDataType) -Q_DECLARE_METATYPE(std::shared_ptr) diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/internal/NodeDelegateModel.hpp b/story-editor-legacy/nodeeditor/include/QtNodes/internal/NodeDelegateModel.hpp deleted file mode 100644 index 6301164..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/internal/NodeDelegateModel.hpp +++ /dev/null @@ -1,133 +0,0 @@ -#pragma once - -#include - -#include - -#include "Definitions.hpp" -#include "Export.hpp" -#include "NodeData.hpp" -#include "NodeStyle.hpp" -#include "Serializable.hpp" - -namespace QtNodes { - -class StyleCollection; - -/** - * The class wraps Node-specific data operations and propagates it to - * the nesting DataFlowGraphModel which is a subclass of - * AbstractGraphModel. - * This class is the same what has been called NodeDataModel before v3. - */ -class NODE_EDITOR_PUBLIC NodeDelegateModel : public QObject, public Serializable -{ - Q_OBJECT - -public: - NodeDelegateModel(); - - virtual ~NodeDelegateModel() = default; - - /// It is possible to hide caption in GUI - virtual bool captionVisible() const { return true; } - - /// Caption is used in GUI - virtual QString caption() const = 0; - - /// It is possible to hide port caption in GUI - virtual bool portCaptionVisible(PortType, PortIndex) const { return false; } - - /// Port caption is used in GUI to label individual ports - virtual QString portCaption(PortType, PortIndex) const { return QString(); } - - /// Name makes this model unique - virtual QString name() const = 0; - -public: - QJsonObject save() const override; - - void load(QJsonObject const &) override; - -public: - virtual unsigned int nPorts(PortType portType) const = 0; - - virtual NodeDataType dataType(PortType portType, PortIndex portIndex) const = 0; - -public: - virtual ConnectionPolicy portConnectionPolicy(PortType, PortIndex) const; - - NodeStyle const &nodeStyle() const; - - void setNodeStyle(NodeStyle const &style); - -public: - virtual void setInData(std::shared_ptr nodeData, PortIndex const portIndex) = 0; - - virtual std::shared_ptr outData(PortIndex const port) = 0; - - /** - * It is recommented to preform a lazy initialization for the - * embedded widget and create it inside this function, not in the - * constructor of the current model. - * - * Our Model Registry is able to shortly instantiate models in order - * to call the non-static `Model::name()`. If the embedded widget is - * allocated in the constructor but not actually embedded into some - * QGraphicsProxyWidget, we'll gonna have a dangling pointer. - */ - virtual QWidget *embeddedWidget() = 0; - - virtual bool resizable() const { return false; } - -public Q_SLOTS: - - virtual void inputConnectionCreated(ConnectionId const &) {} - - virtual void inputConnectionDeleted(ConnectionId const &) {} - - virtual void outputConnectionCreated(ConnectionId const &) {} - - virtual void outputConnectionDeleted(ConnectionId const &) {} - -Q_SIGNALS: - - /// Triggers the updates in the nodes downstream. - void dataUpdated(PortIndex const index); - - /// Triggers the propagation of the empty data downstream. - void dataInvalidated(PortIndex const index); - - void computingStarted(); - - void computingFinished(); - - void embeddedWidgetSizeUpdated(); - - /// Call this function before deleting the data associated with ports. - /** - * The function notifies the Graph Model and makes it remove and recompute the - * affected connection addresses. - */ - void portsAboutToBeDeleted(PortType const portType, PortIndex const first, PortIndex const last); - - /// Call this function when data and port moditications are finished. - void portsDeleted(); - - /// Call this function before inserting the data associated with ports. - /** - * The function notifies the Graph Model and makes it recompute the affected - * connection addresses. - */ - void portsAboutToBeInserted(PortType const portType, - PortIndex const first, - PortIndex const last); - - /// Call this function when data and port moditications are finished. - void portsInserted(); - -private: - NodeStyle _nodeStyle; -}; - -} // namespace QtNodes diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/internal/NodeDelegateModelRegistry.hpp b/story-editor-legacy/nodeeditor/include/QtNodes/internal/NodeDelegateModelRegistry.hpp deleted file mode 100644 index 4f230a4..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/internal/NodeDelegateModelRegistry.hpp +++ /dev/null @@ -1,171 +0,0 @@ -#pragma once - -#include "Export.hpp" -#include "NodeData.hpp" -#include "NodeDelegateModel.hpp" -#include "QStringStdHash.hpp" - -#include - -#include -#include -#include -#include -#include -#include -#include - -namespace QtNodes { - -/// Class uses map for storing models (name, model) -class NODE_EDITOR_PUBLIC NodeDelegateModelRegistry -{ -public: - using RegistryItemPtr = std::unique_ptr; - using RegistryItemCreator = std::function; - using RegisteredModelCreatorsMap = std::unordered_map; - using RegisteredModelsCategoryMap = std::unordered_map; - using CategoriesSet = std::set; - - //using RegisteredTypeConvertersMap = std::map; - - NodeDelegateModelRegistry() = default; - ~NodeDelegateModelRegistry() = default; - - NodeDelegateModelRegistry(NodeDelegateModelRegistry const &) = delete; - NodeDelegateModelRegistry(NodeDelegateModelRegistry &&) = default; - - NodeDelegateModelRegistry &operator=(NodeDelegateModelRegistry const &) = delete; - - NodeDelegateModelRegistry &operator=(NodeDelegateModelRegistry &&) = default; - -public: - template - void registerModel(RegistryItemCreator creator, QString const &category = "Nodes") - { - QString const name = computeName(HasStaticMethodName{}, creator); - if (!_registeredItemCreators.count(name)) { - _registeredItemCreators[name] = std::move(creator); - _categories.insert(category); - _registeredModelsCategory[name] = category; - } - } - - template - void registerModel(QString const &category = "Nodes") - { - RegistryItemCreator creator = []() { return std::make_unique(); }; - registerModel(std::move(creator), category); - } - -#if 0 - template - void - registerModel(RegistryItemCreator creator, - QString const& category = "Nodes") - { - registerModel(std::move(creator), category); - } - - - template - void - registerModel(ModelCreator&& creator, QString const& category = "Nodes") - { - using ModelType = compute_model_type_t; - registerModel(std::forward(creator), category); - } - - - template - void - registerModel(QString const& category, ModelCreator&& creator) - { - registerModel(std::forward(creator), category); - } - - - void - registerTypeConverter(TypeConverterId const& id, - TypeConverter typeConverter) - { - _registeredTypeConverters[id] = std::move(typeConverter); - } - -#endif - - std::unique_ptr create(QString const &modelName); - - RegisteredModelCreatorsMap const ®isteredModelCreators() const; - - RegisteredModelsCategoryMap const ®isteredModelsCategoryAssociation() const; - - CategoriesSet const &categories() const; - -#if 0 - TypeConverter - getTypeConverter(NodeDataType const& d1, - NodeDataType const& d2) const; -#endif - -private: - RegisteredModelsCategoryMap _registeredModelsCategory; - - CategoriesSet _categories; - - RegisteredModelCreatorsMap _registeredItemCreators; - -#if 0 - RegisteredTypeConvertersMap _registeredTypeConverters; -#endif - -private: - // If the registered ModelType class has the static member method - // `static QString Name();`, use it. Otherwise use the non-static - // method: `virtual QString name() const;` - template - struct HasStaticMethodName : std::false_type - {}; - - template - struct HasStaticMethodName< - T, - typename std::enable_if::value>::type> - : std::true_type - {}; - - template - static QString computeName(std::true_type, RegistryItemCreator const &) - { - return ModelType::Name(); - } - - template - static QString computeName(std::false_type, RegistryItemCreator const &creator) - { - return creator()->name(); - } - - template - struct UnwrapUniquePtr - { - // Assert always fires, but the compiler doesn't know this: - static_assert(!std::is_same::value, - "The ModelCreator must return a std::unique_ptr, where T " - "inherits from NodeDelegateModel"); - }; - - template - struct UnwrapUniquePtr> - { - static_assert(std::is_base_of::value, - "The ModelCreator must return a std::unique_ptr, where T " - "inherits from NodeDelegateModel"); - using type = T; - }; - - template - using compute_model_type_t = typename UnwrapUniquePtr::type; -}; - -} // namespace QtNodes diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/internal/NodeGraphicsObject.hpp b/story-editor-legacy/nodeeditor/include/QtNodes/internal/NodeGraphicsObject.hpp deleted file mode 100644 index ef042f7..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/internal/NodeGraphicsObject.hpp +++ /dev/null @@ -1,91 +0,0 @@ -#pragma once - -#include -#include - -#include "NodeState.hpp" - -class QGraphicsProxyWidget; - -namespace QtNodes { - -class BasicGraphicsScene; -class AbstractGraphModel; - -class NodeGraphicsObject : public QGraphicsObject -{ - Q_OBJECT -public: - // Needed for qgraphicsitem_cast - enum { Type = UserType + 1 }; - - int type() const override { return Type; } - -public: - NodeGraphicsObject(BasicGraphicsScene &scene, NodeId node); - - ~NodeGraphicsObject() override = default; - -public: - AbstractGraphModel &graphModel() const; - - BasicGraphicsScene *nodeScene() const; - - NodeId nodeId() { return _nodeId; } - - NodeId nodeId() const { return _nodeId; } - - NodeState &nodeState() { return _nodeState; } - - NodeState const &nodeState() const { return _nodeState; } - - QRectF boundingRect() const override; - - void setGeometryChanged(); - - /// Visits all attached connections and corrects - /// their corresponding end points. - void moveConnections() const; - - /// Repaints the node once with reacting ports. - void reactToConnection(ConnectionGraphicsObject const *cgo); - -protected: - void paint(QPainter *painter, - QStyleOptionGraphicsItem const *option, - QWidget *widget = 0) override; - - QVariant itemChange(GraphicsItemChange change, const QVariant &value) override; - - void mousePressEvent(QGraphicsSceneMouseEvent *event) override; - - void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override; - - void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override; - - void hoverEnterEvent(QGraphicsSceneHoverEvent *event) override; - - void hoverLeaveEvent(QGraphicsSceneHoverEvent *event) override; - - void hoverMoveEvent(QGraphicsSceneHoverEvent *) override; - - void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) override; - - void contextMenuEvent(QGraphicsSceneContextMenuEvent *event) override; - -private: - void embedQWidget(); - - void setLockedState(); - -private: - NodeId _nodeId; - - AbstractGraphModel &_graphModel; - - NodeState _nodeState; - - // either nullptr or owned by parent QGraphicsItem - QGraphicsProxyWidget *_proxyWidget; -}; -} // namespace QtNodes diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/internal/NodeState.hpp b/story-editor-legacy/nodeeditor/include/QtNodes/internal/NodeState.hpp deleted file mode 100644 index 1894021..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/internal/NodeState.hpp +++ /dev/null @@ -1,52 +0,0 @@ -#pragma once - -#include -#include - -#include -#include -#include - -#include "Export.hpp" - -#include "Definitions.hpp" -#include "NodeData.hpp" - -namespace QtNodes { - -class ConnectionGraphicsObject; -class NodeGraphicsObject; - -/// Stores bool for hovering connections and resizing flag. -class NODE_EDITOR_PUBLIC NodeState -{ -public: - NodeState(NodeGraphicsObject &ngo); - -public: - bool hovered() const { return _hovered; } - - void setHovered(bool hovered = true) { _hovered = hovered; } - - void setResizing(bool resizing); - - bool resizing() const; - - ConnectionGraphicsObject const *connectionForReaction() const; - - void storeConnectionForReaction(ConnectionGraphicsObject const *cgo); - - void resetConnectionForReaction(); - -private: - NodeGraphicsObject &_ngo; - - bool _hovered; - - bool _resizing; - - // QPointer tracks the QObject inside and is automatically cleared - // when the object is destroyed. - QPointer _connectionForReaction; -}; -} // namespace QtNodes diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/internal/NodeStyle.hpp b/story-editor-legacy/nodeeditor/include/QtNodes/internal/NodeStyle.hpp deleted file mode 100644 index 5eca749..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/internal/NodeStyle.hpp +++ /dev/null @@ -1,53 +0,0 @@ -#pragma once - -#include - -#include "Export.hpp" -#include "Style.hpp" - -namespace QtNodes { - -class NODE_EDITOR_PUBLIC NodeStyle : public Style -{ -public: - NodeStyle(); - - NodeStyle(QString jsonText); - - NodeStyle(QJsonObject const &json); - - virtual ~NodeStyle() = default; - -public: - static void setNodeStyle(QString jsonText); - -public: - void loadJson(QJsonObject const &json) override; - - QJsonObject toJson() const override; - -public: - QColor NormalBoundaryColor; - QColor SelectedBoundaryColor; - QColor GradientColor0; - QColor GradientColor1; - QColor GradientColor2; - QColor GradientColor3; - QColor ShadowColor; - QColor FontColor; - QColor FontColorFaded; - - QColor ConnectionPointColor; - QColor FilledConnectionPointColor; - - QColor WarningColor; - QColor ErrorColor; - - float PenWidth; - float HoveredPenWidth; - - float ConnectionPointDiameter; - - float Opacity; -}; -} // namespace QtNodes diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/internal/OperatingSystem.hpp b/story-editor-legacy/nodeeditor/include/QtNodes/internal/OperatingSystem.hpp deleted file mode 100644 index 8264db4..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/internal/OperatingSystem.hpp +++ /dev/null @@ -1,49 +0,0 @@ -#pragma once - -#if defined(__CYGWIN__) || defined(__CYGWIN32__) -#define NODE_EDITOR_PLATFORM "Cygwin" -#define NODE_EDITOR_PLATFORM_CYGWIN -#define NODE_EDITOR_PLATFORM_UNIX -#define NODE_EDITOR_PLATFORM_WINDOWS -#elif defined(_WIN16) || defined(_WIN32) || defined(_WIN64) || defined(__WIN32__) \ - || defined(__TOS_WIN__) || defined(__WINDOWS__) -#define NODE_EDITOR_PLATFORM "Windows" -#define NODE_EDITOR_PLATFORM_WINDOWS -#elif defined(macintosh) || defined(Macintosh) || defined(__TOS_MACOS__) \ - || (defined(__APPLE__) && defined(__MACH__)) -#define NODE_EDITOR_PLATFORM "Mac" -#define NODE_EDITOR_PLATFORM_MAC -#define NODE_EDITOR_PLATFORM_UNIX -#elif defined(linux) || defined(__linux) || defined(__linux__) || defined(__TOS_LINUX__) -#define NODE_EDITOR_PLATFORM "Linux" -#define NODE_EDITOR_PLATFORM_LINUX -#define NODE_EDITOR_PLATFORM_UNIX -#elif defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__bsdi__) \ - || defined(__DragonFly__) -#define NODE_EDITOR_PLATFORM "BSD" -#define NODE_EDITOR_PLATFORM_BSD -#define NODE_EDITOR_PLATFORM_UNIX -#elif defined(sun) || defined(__sun) -#define NODE_EDITOR_PLATFORM "Solaris" -#define NODE_EDITOR_PLATFORM_SOLARIS -#define NODE_EDITOR_PLATFORM_UNIX -#elif defined(_AIX) || defined(__TOS_AIX__) -#define NODE_EDITOR_PLATFORM "AIX" -#define NODE_EDITOR_PLATFORM_AIX -#define NODE_EDITOR_PLATFORM_UNIX -#elif defined(hpux) || defined(_hpux) || defined(__hpux) -#define NODE_EDITOR_PLATFORM "HPUX" -#define NODE_EDITOR_PLATFORM_HPUX -#define NODE_EDITOR_PLATFORM_UNIX -#elif defined(__QNX__) -#define NODE_EDITOR_PLATFORM "QNX" -#define NODE_EDITOR_PLATFORM_QNX -#define NODE_EDITOR_PLATFORM_UNIX -#elif defined(unix) || defined(__unix) || defined(__unix__) -#define NODE_EDITOR_PLATFORM "Unix" -#define NODE_EDITOR_PLATFORM_UNIX -#endif - -#ifndef NODE_EDITOR_PLATFORM -#error "Current platform is not supported." -#endif diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/internal/QStringStdHash.hpp b/story-editor-legacy/nodeeditor/include/QtNodes/internal/QStringStdHash.hpp deleted file mode 100644 index 617d9b5..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/internal/QStringStdHash.hpp +++ /dev/null @@ -1,22 +0,0 @@ -#pragma once - -#include - -#if (QT_VERSION < QT_VERSION_CHECK(5, 14, 0)) - -// As of 5.14 there is a specialization std::hash - -#include - -#include -#include - -namespace std { -template<> -struct hash -{ - inline std::size_t operator()(QString const &s) const { return qHash(s); } -}; -} // namespace std - -#endif diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/internal/QUuidStdHash.hpp b/story-editor-legacy/nodeeditor/include/QtNodes/internal/QUuidStdHash.hpp deleted file mode 100644 index 224bc9f..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/internal/QUuidStdHash.hpp +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -#include - -#include -#include - -namespace std { -template<> -struct hash -{ - inline std::size_t operator()(QUuid const &uid) const { return qHash(uid); } -}; -} // namespace std diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/internal/Serializable.hpp b/story-editor-legacy/nodeeditor/include/QtNodes/internal/Serializable.hpp deleted file mode 100644 index 71137d9..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/internal/Serializable.hpp +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once - -#include - -namespace QtNodes { - -class Serializable -{ -public: - virtual ~Serializable() = default; - - virtual QJsonObject save() const { return {}; } - - virtual void load(QJsonObject const & /*p*/) {} -}; -} // namespace QtNodes diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/internal/Style.hpp b/story-editor-legacy/nodeeditor/include/QtNodes/internal/Style.hpp deleted file mode 100644 index f878083..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/internal/Style.hpp +++ /dev/null @@ -1,48 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include -#include - -namespace QtNodes { - -class Style // : public QObject -{ - //Q_OBJECT - -public: - virtual ~Style() = default; - -public: - virtual void loadJson(QJsonObject const &json) = 0; - - virtual QJsonObject toJson() const = 0; - - /// Loads from utf-8 byte array. - virtual void loadJsonFromByteArray(QByteArray const &byteArray) - { - auto json = QJsonDocument::fromJson(byteArray).object(); - - loadJson(json); - } - - virtual void loadJsonText(QString jsonText) { loadJsonFromByteArray(jsonText.toUtf8()); } - - virtual void loadJsonFile(QString fileName) - { - QFile file(fileName); - - if (!file.open(QIODevice::ReadOnly)) { - qWarning() << "Couldn't open file " << fileName; - - return; - } - - loadJsonFromByteArray(file.readAll()); - } -}; - -} // namespace QtNodes diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/internal/StyleCollection.hpp b/story-editor-legacy/nodeeditor/include/QtNodes/internal/StyleCollection.hpp deleted file mode 100644 index 92a1a40..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/internal/StyleCollection.hpp +++ /dev/null @@ -1,43 +0,0 @@ -#pragma once - -#include "Export.hpp" - -#include "ConnectionStyle.hpp" -#include "GraphicsViewStyle.hpp" -#include "NodeStyle.hpp" - -namespace QtNodes { - -class NODE_EDITOR_PUBLIC StyleCollection -{ -public: - static NodeStyle const &nodeStyle(); - - static ConnectionStyle const &connectionStyle(); - - static GraphicsViewStyle const &flowViewStyle(); - -public: - static void setNodeStyle(NodeStyle); - - static void setConnectionStyle(ConnectionStyle); - - static void setGraphicsViewStyle(GraphicsViewStyle); - -private: - StyleCollection() = default; - - StyleCollection(StyleCollection const &) = delete; - - StyleCollection &operator=(StyleCollection const &) = delete; - - static StyleCollection &instance(); - -private: - NodeStyle _nodeStyle; - - ConnectionStyle _connectionStyle; - - GraphicsViewStyle _flowViewStyle; -}; -} // namespace QtNodes diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/internal/UndoCommands.hpp b/story-editor-legacy/nodeeditor/include/QtNodes/internal/UndoCommands.hpp deleted file mode 100644 index 2202617..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/internal/UndoCommands.hpp +++ /dev/null @@ -1,123 +0,0 @@ -#pragma once - -#include "Definitions.hpp" - -#include -#include -#include - -#include - -namespace QtNodes { - -class BasicGraphicsScene; - -class CreateCommand : public QUndoCommand -{ -public: - CreateCommand(BasicGraphicsScene *scene, QString const name, QPointF const &mouseScenePos); - - void undo() override; - void redo() override; - -private: - BasicGraphicsScene *_scene; - NodeId _nodeId; - QJsonObject _sceneJson; -}; - -/** - * Selected scene objects are serialized and then removed from the scene. - * The deleted elements could be restored in `undo`. - */ -class DeleteCommand : public QUndoCommand -{ -public: - DeleteCommand(BasicGraphicsScene *scene); - - void undo() override; - void redo() override; - -private: - BasicGraphicsScene *_scene; - QJsonObject _sceneJson; -}; - -class CopyCommand : public QUndoCommand -{ -public: - CopyCommand(BasicGraphicsScene *scene); -}; - -class PasteCommand : public QUndoCommand -{ -public: - PasteCommand(BasicGraphicsScene *scene, QPointF const &mouseScenePos); - - void undo() override; - void redo() override; - -private: - QJsonObject takeSceneJsonFromClipboard(); - QJsonObject makeNewNodeIdsInScene(QJsonObject const &sceneJson); - -private: - BasicGraphicsScene *_scene; - QPointF const &_mouseScenePos; - QJsonObject _newSceneJson; -}; - -class DisconnectCommand : public QUndoCommand -{ -public: - DisconnectCommand(BasicGraphicsScene *scene, ConnectionId const); - - void undo() override; - void redo() override; - -private: - BasicGraphicsScene *_scene; - - ConnectionId _connId; -}; - -class ConnectCommand : public QUndoCommand -{ -public: - ConnectCommand(BasicGraphicsScene *scene, ConnectionId const); - - void undo() override; - void redo() override; - -private: - BasicGraphicsScene *_scene; - - ConnectionId _connId; -}; - -class MoveNodeCommand : public QUndoCommand -{ -public: - MoveNodeCommand(BasicGraphicsScene *scene, QPointF const &diff); - - void undo() override; - void redo() override; - - /** - * A command ID is used in command compression. It must be an integer unique to - * this command's class, or -1 if the command doesn't support compression. - */ - int id() const override; - - /** - * Several sequential movements could be merged into one command. - */ - bool mergeWith(QUndoCommand const *c) override; - -private: - BasicGraphicsScene *_scene; - std::unordered_set _selectedNodes; - QPointF _diff; -}; - -} // namespace QtNodes diff --git a/story-editor-legacy/nodeeditor/include/QtNodes/internal/locateNode.hpp b/story-editor-legacy/nodeeditor/include/QtNodes/internal/locateNode.hpp deleted file mode 100644 index cf41f83..0000000 --- a/story-editor-legacy/nodeeditor/include/QtNodes/internal/locateNode.hpp +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once - -#include -#include - -class QGraphicsScene; - -namespace QtNodes { - -class NodeGraphicsObject; - -NodeGraphicsObject *locateNodeAt(QPointF scenePoint, - QGraphicsScene &scene, - QTransform const &viewTransform); - -} // namespace QtNodes diff --git a/story-editor-legacy/nodeeditor/resources/DefaultStyle.json b/story-editor-legacy/nodeeditor/resources/DefaultStyle.json deleted file mode 100644 index da8dfe8..0000000 --- a/story-editor-legacy/nodeeditor/resources/DefaultStyle.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "GraphicsViewStyle": { - "BackgroundColor": [53, 53, 53], - "FineGridColor": [60, 60, 60], - "CoarseGridColor": [25, 25, 25] - }, - "NodeStyle": { - "NormalBoundaryColor": [255, 255, 255], - "SelectedBoundaryColor": [255, 165, 0], - "GradientColor0": "gray", - "GradientColor1": [80, 80, 80], - "GradientColor2": [64, 64, 64], - "GradientColor3": [58, 58, 58], - "ShadowColor": [20, 20, 20], - "FontColor" : "white", - "FontColorFaded" : "gray", - "ConnectionPointColor": [169, 169, 169], - "FilledConnectionPointColor": "cyan", - "ErrorColor": "red", - "WarningColor": [128, 128, 0], - - "PenWidth": 1.0, - "HoveredPenWidth": 1.5, - - "ConnectionPointDiameter": 8.0, - - "Opacity": 0.8 - }, - "ConnectionStyle": { - "ConstructionColor": "gray", - "NormalColor": "darkcyan", - "SelectedColor": [100, 100, 100], - "SelectedHaloColor": "orange", - "HoveredColor": "lightcyan", - - "LineWidth": 3.0, - "ConstructionLineWidth": 2.0, - "PointDiameter": 10.0, - - "UseDataDefinedColors": false - } -} diff --git a/story-editor-legacy/nodeeditor/resources/resources.qrc b/story-editor-legacy/nodeeditor/resources/resources.qrc deleted file mode 100644 index a0b5ef8..0000000 --- a/story-editor-legacy/nodeeditor/resources/resources.qrc +++ /dev/null @@ -1,5 +0,0 @@ - - - DefaultStyle.json - - diff --git a/story-editor-legacy/nodeeditor/src/AbstractGraphModel.cpp b/story-editor-legacy/nodeeditor/src/AbstractGraphModel.cpp deleted file mode 100644 index 10709b7..0000000 --- a/story-editor-legacy/nodeeditor/src/AbstractGraphModel.cpp +++ /dev/null @@ -1,105 +0,0 @@ -#include "AbstractGraphModel.hpp" - -#include - -namespace QtNodes { - -void AbstractGraphModel::portsAboutToBeDeleted(NodeId const nodeId, - PortType const portType, - PortIndex const first, - PortIndex const last) -{ - _shiftedByDynamicPortsConnections.clear(); - - auto portCountRole = portType == PortType::In ? NodeRole::InPortCount : NodeRole::OutPortCount; - - unsigned int portCount = nodeData(nodeId, portCountRole).toUInt(); - - if (first > portCount - 1) - return; - - if (last < first) - return; - - auto clampedLast = std::min(last, portCount - 1); - - for (PortIndex portIndex = first; portIndex <= clampedLast; ++portIndex) { - std::unordered_set conns = connections(nodeId, portType, portIndex); - - for (auto connectionId : conns) { - deleteConnection(connectionId); - } - } - - std::size_t const nRemovedPorts = clampedLast - first + 1; - - for (PortIndex portIndex = clampedLast + 1; portIndex < portCount; ++portIndex) { - std::unordered_set conns = connections(nodeId, portType, portIndex); - - for (auto connectionId : conns) { - // Erases the information about the port on one side; - auto c = makeIncompleteConnectionId(connectionId, portType); - - c = makeCompleteConnectionId(c, nodeId, portIndex - nRemovedPorts); - - _shiftedByDynamicPortsConnections.push_back(c); - - deleteConnection(connectionId); - } - } -} - -void AbstractGraphModel::portsDeleted() -{ - for (auto const connectionId : _shiftedByDynamicPortsConnections) { - addConnection(connectionId); - } - - _shiftedByDynamicPortsConnections.clear(); -} - -void AbstractGraphModel::portsAboutToBeInserted(NodeId const nodeId, - PortType const portType, - PortIndex const first, - PortIndex const last) -{ - _shiftedByDynamicPortsConnections.clear(); - - auto portCountRole = portType == PortType::In ? NodeRole::InPortCount : NodeRole::OutPortCount; - - unsigned int portCount = nodeData(nodeId, portCountRole).toUInt(); - - if (first > portCount) - return; - - if (last < first) - return; - - std::size_t const nNewPorts = last - first + 1; - - for (PortIndex portIndex = first; portIndex < portCount; ++portIndex) { - std::unordered_set conns = connections(nodeId, portType, portIndex); - - for (auto connectionId : conns) { - // Erases the information about the port on one side; - auto c = makeIncompleteConnectionId(connectionId, portType); - - c = makeCompleteConnectionId(c, nodeId, portIndex + nNewPorts); - - _shiftedByDynamicPortsConnections.push_back(c); - - deleteConnection(connectionId); - } - } -} - -void AbstractGraphModel::portsInserted() -{ - for (auto const connectionId : _shiftedByDynamicPortsConnections) { - addConnection(connectionId); - } - - _shiftedByDynamicPortsConnections.clear(); -} - -} // namespace QtNodes diff --git a/story-editor-legacy/nodeeditor/src/AbstractNodeGeometry.cpp b/story-editor-legacy/nodeeditor/src/AbstractNodeGeometry.cpp deleted file mode 100644 index 08c8181..0000000 --- a/story-editor-legacy/nodeeditor/src/AbstractNodeGeometry.cpp +++ /dev/null @@ -1,81 +0,0 @@ -#include "AbstractNodeGeometry.hpp" - -#include "AbstractGraphModel.hpp" -#include "StyleCollection.hpp" - -#include - -#include - -namespace QtNodes { - -AbstractNodeGeometry::AbstractNodeGeometry(AbstractGraphModel &graphModel, double marginsRatio) - : _graphModel(graphModel) - , _marginsRatio(marginsRatio) -{ - // -} - -QRectF AbstractNodeGeometry::boundingRect(NodeId const nodeId) const -{ - QSize s = size(nodeId); - - int widthMargin = s.width() * _marginsRatio; - int heightMargin = s.height() * _marginsRatio; - - QMargins margins(widthMargin, heightMargin, widthMargin, heightMargin); - - QRectF r(QPointF(0, 0), s); - - return r.marginsAdded(margins); -} - -void AbstractNodeGeometry::setMarginsRatio(double marginsRatio) -{ - _marginsRatio = marginsRatio; -} - -QPointF AbstractNodeGeometry::portScenePosition(NodeId const nodeId, - PortType const portType, - PortIndex const index, - QTransform const &t) const -{ - QPointF result = portPosition(nodeId, portType, index); - - return t.map(result); -} - -PortIndex AbstractNodeGeometry::checkPortHit(NodeId const nodeId, - PortType const portType, - QPointF const nodePoint) const -{ - auto const &nodeStyle = StyleCollection::nodeStyle(); - - PortIndex result = InvalidPortIndex; - - if (portType == PortType::None) - return result; - - double const tolerance = 2.0 * nodeStyle.ConnectionPointDiameter; - - size_t const n = _graphModel.nodeData(nodeId, - (portType == PortType::Out) - ? NodeRole::OutPortCount - : NodeRole::InPortCount); - - for (unsigned int portIndex = 0; portIndex < n; ++portIndex) { - auto pp = portPosition(nodeId, portType, portIndex); - - QPointF p = pp - nodePoint; - auto distance = std::sqrt(QPointF::dotProduct(p, p)); - - if (distance < tolerance) { - result = portIndex; - break; - } - } - - return result; -} - -} // namespace QtNodes diff --git a/story-editor-legacy/nodeeditor/src/BasicGraphicsScene.cpp b/story-editor-legacy/nodeeditor/src/BasicGraphicsScene.cpp deleted file mode 100644 index 1c36716..0000000 --- a/story-editor-legacy/nodeeditor/src/BasicGraphicsScene.cpp +++ /dev/null @@ -1,308 +0,0 @@ -#include "BasicGraphicsScene.hpp" - -#include "AbstractNodeGeometry.hpp" -#include "ConnectionGraphicsObject.hpp" -#include "ConnectionIdUtils.hpp" -#include "DefaultHorizontalNodeGeometry.hpp" -#include "DefaultNodePainter.hpp" -#include "DefaultVerticalNodeGeometry.hpp" -#include "GraphicsView.hpp" -#include "NodeGraphicsObject.hpp" - -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -namespace QtNodes { - -BasicGraphicsScene::BasicGraphicsScene(AbstractGraphModel &graphModel, QObject *parent) - : QGraphicsScene(parent) - , _graphModel(graphModel) - , _nodeGeometry(std::make_unique(_graphModel)) - , _nodePainter(std::make_unique()) - , _nodeDrag(false) - , _undoStack(new QUndoStack(this)) - , _orientation(Qt::Horizontal) -{ - setItemIndexMethod(QGraphicsScene::NoIndex); - - connect(&_graphModel, - &AbstractGraphModel::connectionCreated, - this, - &BasicGraphicsScene::onConnectionCreated); - - connect(&_graphModel, - &AbstractGraphModel::connectionDeleted, - this, - &BasicGraphicsScene::onConnectionDeleted); - - connect(&_graphModel, - &AbstractGraphModel::nodeCreated, - this, - &BasicGraphicsScene::onNodeCreated); - - connect(&_graphModel, - &AbstractGraphModel::nodeDeleted, - this, - &BasicGraphicsScene::onNodeDeleted); - - connect(&_graphModel, - &AbstractGraphModel::nodePositionUpdated, - this, - &BasicGraphicsScene::onNodePositionUpdated); - - connect(&_graphModel, - &AbstractGraphModel::nodeUpdated, - this, - &BasicGraphicsScene::onNodeUpdated); - - connect(this, &BasicGraphicsScene::nodeClicked, this, &BasicGraphicsScene::onNodeClicked); - - connect(&_graphModel, &AbstractGraphModel::modelReset, this, &BasicGraphicsScene::onModelReset); - - traverseGraphAndPopulateGraphicsObjects(); -} - -BasicGraphicsScene::~BasicGraphicsScene() = default; - -AbstractGraphModel const &BasicGraphicsScene::graphModel() const -{ - return _graphModel; -} - -AbstractGraphModel &BasicGraphicsScene::graphModel() -{ - return _graphModel; -} - -AbstractNodeGeometry &BasicGraphicsScene::nodeGeometry() -{ - return *_nodeGeometry; -} - -AbstractNodePainter &BasicGraphicsScene::nodePainter() -{ - return *_nodePainter; -} - -void BasicGraphicsScene::setNodePainter(std::unique_ptr newPainter) -{ - _nodePainter = std::move(newPainter); -} - -QUndoStack &BasicGraphicsScene::undoStack() -{ - return *_undoStack; -} - -void BasicGraphicsScene::setDropShadowEffect(bool enable) -{ - _dropShadowEffect = enable; -} - -bool BasicGraphicsScene::isDropShadowEffectEnabled() const -{ - return _dropShadowEffect; -} - -std::unique_ptr const &BasicGraphicsScene::makeDraftConnection( - ConnectionId const incompleteConnectionId) -{ - _draftConnection = std::make_unique(*this, incompleteConnectionId); - - _draftConnection->grabMouse(); - - return _draftConnection; -} - -void BasicGraphicsScene::resetDraftConnection() -{ - _draftConnection.reset(); -} - -void BasicGraphicsScene::clearScene() -{ - auto const &allNodeIds = graphModel().allNodeIds(); - - for (auto nodeId : allNodeIds) { - graphModel().deleteNode(nodeId); - } -} - -NodeGraphicsObject *BasicGraphicsScene::nodeGraphicsObject(NodeId nodeId) -{ - NodeGraphicsObject *ngo = nullptr; - auto it = _nodeGraphicsObjects.find(nodeId); - if (it != _nodeGraphicsObjects.end()) { - ngo = it->second.get(); - } - - return ngo; -} - -ConnectionGraphicsObject *BasicGraphicsScene::connectionGraphicsObject(ConnectionId connectionId) -{ - ConnectionGraphicsObject *cgo = nullptr; - auto it = _connectionGraphicsObjects.find(connectionId); - if (it != _connectionGraphicsObjects.end()) { - cgo = it->second.get(); - } - - return cgo; -} - -void BasicGraphicsScene::setOrientation(Qt::Orientation const orientation) -{ - if (_orientation != orientation) { - _orientation = orientation; - - switch (_orientation) { - case Qt::Horizontal: - _nodeGeometry = std::make_unique(_graphModel); - break; - - case Qt::Vertical: - _nodeGeometry = std::make_unique(_graphModel); - break; - } - - onModelReset(); - } -} - -QMenu *BasicGraphicsScene::createSceneMenu(QPointF const scenePos) -{ - Q_UNUSED(scenePos); - return nullptr; -} - -void BasicGraphicsScene::traverseGraphAndPopulateGraphicsObjects() -{ - auto allNodeIds = _graphModel.allNodeIds(); - - // First create all the nodes. - for (NodeId const nodeId : allNodeIds) { - _nodeGraphicsObjects[nodeId] = std::make_unique(*this, nodeId); - } - - // Then for each node check output connections and insert them. - for (NodeId const nodeId : allNodeIds) { - unsigned int nOutPorts = _graphModel.nodeData(nodeId, NodeRole::OutPortCount); - - for (PortIndex index = 0; index < nOutPorts; ++index) { - auto const &outConnectionIds = _graphModel.connections(nodeId, PortType::Out, index); - - for (auto cid : outConnectionIds) { - _connectionGraphicsObjects[cid] = std::make_unique(*this, - cid); - } - } - } -} - -void BasicGraphicsScene::updateAttachedNodes(ConnectionId const connectionId, - PortType const portType) -{ - auto node = nodeGraphicsObject(getNodeId(portType, connectionId)); - - if (node) { - node->update(); - } -} - -void BasicGraphicsScene::onConnectionDeleted(ConnectionId const connectionId) -{ - auto it = _connectionGraphicsObjects.find(connectionId); - if (it != _connectionGraphicsObjects.end()) { - _connectionGraphicsObjects.erase(it); - } - - // TODO: do we need it? - if (_draftConnection && _draftConnection->connectionId() == connectionId) { - _draftConnection.reset(); - } - - updateAttachedNodes(connectionId, PortType::Out); - updateAttachedNodes(connectionId, PortType::In); -} - -void BasicGraphicsScene::onConnectionCreated(ConnectionId const connectionId) -{ - _connectionGraphicsObjects[connectionId] - = std::make_unique(*this, connectionId); - - updateAttachedNodes(connectionId, PortType::Out); - updateAttachedNodes(connectionId, PortType::In); -} - -void BasicGraphicsScene::onNodeDeleted(NodeId const nodeId) -{ - auto it = _nodeGraphicsObjects.find(nodeId); - if (it != _nodeGraphicsObjects.end()) { - _nodeGraphicsObjects.erase(it); - } -} - -void BasicGraphicsScene::onNodeCreated(NodeId const nodeId) -{ - _nodeGraphicsObjects[nodeId] = std::make_unique(*this, nodeId); -} - -void BasicGraphicsScene::onNodePositionUpdated(NodeId const nodeId) -{ - auto node = nodeGraphicsObject(nodeId); - if (node) { - node->setPos(_graphModel.nodeData(nodeId, NodeRole::Position).value()); - node->update(); - _nodeDrag = true; - } -} - -void BasicGraphicsScene::onNodeUpdated(NodeId const nodeId) -{ - auto node = nodeGraphicsObject(nodeId); - - if (node) { - node->setGeometryChanged(); - - _nodeGeometry->recomputeSize(nodeId); - - node->update(); - node->moveConnections(); - } -} - -void BasicGraphicsScene::onNodeClicked(NodeId const nodeId) -{ - if (_nodeDrag) - Q_EMIT nodeMoved(nodeId, _graphModel.nodeData(nodeId, NodeRole::Position).value()); - _nodeDrag = false; -} - -void BasicGraphicsScene::onModelReset() -{ - _connectionGraphicsObjects.clear(); - _nodeGraphicsObjects.clear(); - - clear(); - - traverseGraphAndPopulateGraphicsObjects(); -} - -} // namespace QtNodes diff --git a/story-editor-legacy/nodeeditor/src/ConnectionGraphicsObject.cpp b/story-editor-legacy/nodeeditor/src/ConnectionGraphicsObject.cpp deleted file mode 100644 index 6a871c0..0000000 --- a/story-editor-legacy/nodeeditor/src/ConnectionGraphicsObject.cpp +++ /dev/null @@ -1,380 +0,0 @@ -#include "ConnectionGraphicsObject.hpp" - -#include "AbstractGraphModel.hpp" -#include "AbstractNodeGeometry.hpp" -#include "BasicGraphicsScene.hpp" -#include "ConnectionIdUtils.hpp" -#include "ConnectionPainter.hpp" -#include "ConnectionState.hpp" -#include "ConnectionStyle.hpp" -#include "NodeConnectionInteraction.hpp" -#include "NodeGraphicsObject.hpp" -#include "StyleCollection.hpp" -#include "locateNode.hpp" - -#include -#include -#include -#include -#include - -#include - -#include - -namespace QtNodes { - -ConnectionGraphicsObject::ConnectionGraphicsObject(BasicGraphicsScene &scene, - ConnectionId const connectionId) - : _connectionId(connectionId) - , _graphModel(scene.graphModel()) - , _connectionState(*this) - , _out{0, 0} - , _in{0, 0} -{ - scene.addItem(this); - - setFlag(QGraphicsItem::ItemIsMovable, true); - setFlag(QGraphicsItem::ItemIsFocusable, true); - setFlag(QGraphicsItem::ItemIsSelectable, true); - - setAcceptHoverEvents(true); - - //addGraphicsEffect(); - - setZValue(-1.0); - - initializePosition(); -} - -void ConnectionGraphicsObject::initializePosition() -{ - // This function is only called when the ConnectionGraphicsObject - // is newly created. At this moment both end coordinates are (0, 0) - // in Connection G.O. coordinates. The position of the whole - // Connection G. O. in scene coordinate system is also (0, 0). - // By moving the whole object to the Node Port position - // we position both connection ends correctly. - - if (_connectionState.requiredPort() != PortType::None) { - PortType attachedPort = oppositePort(_connectionState.requiredPort()); - - PortIndex portIndex = getPortIndex(attachedPort, _connectionId); - NodeId nodeId = getNodeId(attachedPort, _connectionId); - - NodeGraphicsObject *ngo = nodeScene()->nodeGraphicsObject(nodeId); - - if (ngo) { - QTransform nodeSceneTransform = ngo->sceneTransform(); - - AbstractNodeGeometry &geometry = nodeScene()->nodeGeometry(); - - QPointF pos = geometry.portScenePosition(nodeId, - attachedPort, - portIndex, - nodeSceneTransform); - - this->setPos(pos); - } - } - - move(); -} - -AbstractGraphModel &ConnectionGraphicsObject::graphModel() const -{ - return _graphModel; -} - -BasicGraphicsScene *ConnectionGraphicsObject::nodeScene() const -{ - return dynamic_cast(scene()); -} - -ConnectionId const &ConnectionGraphicsObject::connectionId() const -{ - return _connectionId; -} - -QRectF ConnectionGraphicsObject::boundingRect() const -{ - auto points = pointsC1C2(); - - // `normalized()` fixes inverted rects. - QRectF basicRect = QRectF(_out, _in).normalized(); - - QRectF c1c2Rect = QRectF(points.first, points.second).normalized(); - - QRectF commonRect = basicRect.united(c1c2Rect); - - auto const &connectionStyle = StyleCollection::connectionStyle(); - float const diam = connectionStyle.pointDiameter(); - QPointF const cornerOffset(diam, diam); - - // Expand rect by port circle diameter - commonRect.setTopLeft(commonRect.topLeft() - cornerOffset); - commonRect.setBottomRight(commonRect.bottomRight() + 2 * cornerOffset); - - return commonRect; -} - -QPainterPath ConnectionGraphicsObject::shape() const -{ -#ifdef DEBUG_DRAWING - - //QPainterPath path; - - //path.addRect(boundingRect()); - //return path; - -#else - return ConnectionPainter::getPainterStroke(*this); -#endif -} - -QPointF const &ConnectionGraphicsObject::endPoint(PortType portType) const -{ - Q_ASSERT(portType != PortType::None); - - return (portType == PortType::Out ? _out : _in); -} - -void ConnectionGraphicsObject::setEndPoint(PortType portType, QPointF const &point) -{ - if (portType == PortType::In) - _in = point; - else - _out = point; -} - -void ConnectionGraphicsObject::move() -{ - auto moveEnd = [this](ConnectionId cId, PortType portType) { - NodeId nodeId = getNodeId(portType, cId); - - if (nodeId == InvalidNodeId) - return; - - NodeGraphicsObject *ngo = nodeScene()->nodeGraphicsObject(nodeId); - - if (ngo) { - AbstractNodeGeometry &geometry = nodeScene()->nodeGeometry(); - - QPointF scenePos = geometry.portScenePosition(nodeId, - portType, - getPortIndex(portType, cId), - ngo->sceneTransform()); - - QPointF connectionPos = sceneTransform().inverted().map(scenePos); - - setEndPoint(portType, connectionPos); - } - }; - - moveEnd(_connectionId, PortType::Out); - moveEnd(_connectionId, PortType::In); - - prepareGeometryChange(); - - update(); -} - -ConnectionState const &ConnectionGraphicsObject::connectionState() const -{ - return _connectionState; -} - -ConnectionState &ConnectionGraphicsObject::connectionState() -{ - return _connectionState; -} - -void ConnectionGraphicsObject::paint(QPainter *painter, - QStyleOptionGraphicsItem const *option, - QWidget *) -{ - if (!scene()) - return; - - painter->setClipRect(option->exposedRect); - - ConnectionPainter::paint(painter, *this); -} - -void ConnectionGraphicsObject::mousePressEvent(QGraphicsSceneMouseEvent *event) -{ - QGraphicsItem::mousePressEvent(event); -} - -void ConnectionGraphicsObject::mouseMoveEvent(QGraphicsSceneMouseEvent *event) -{ - prepareGeometryChange(); - - auto view = static_cast(event->widget()); - auto ngo = locateNodeAt(event->scenePos(), *nodeScene(), view->transform()); - if (ngo) { - ngo->reactToConnection(this); - - _connectionState.setLastHoveredNode(ngo->nodeId()); - } else { - _connectionState.resetLastHoveredNode(); - } - - //------------------- - - auto requiredPort = _connectionState.requiredPort(); - - if (requiredPort != PortType::None) { - setEndPoint(requiredPort, event->pos()); - } - - //------------------- - - update(); - - event->accept(); -} - -void ConnectionGraphicsObject::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) -{ - QGraphicsItem::mouseReleaseEvent(event); - - ungrabMouse(); - event->accept(); - - auto view = static_cast(event->widget()); - - Q_ASSERT(view); - - auto ngo = locateNodeAt(event->scenePos(), *nodeScene(), view->transform()); - - bool wasConnected = false; - - if (ngo) { - NodeConnectionInteraction interaction(*ngo, *this, *nodeScene()); - - wasConnected = interaction.tryConnect(); - } - - // If connection attempt was unsuccessful - if (!wasConnected) { - // Resulting unique_ptr is not used and automatically deleted. - nodeScene()->resetDraftConnection(); - } -} - -void ConnectionGraphicsObject::hoverEnterEvent(QGraphicsSceneHoverEvent *event) -{ - _connectionState.setHovered(true); - - update(); - - // Signal - nodeScene()->connectionHovered(connectionId(), event->screenPos()); - - event->accept(); -} - -void ConnectionGraphicsObject::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) -{ - _connectionState.setHovered(false); - - update(); - - // Signal - nodeScene()->connectionHoverLeft(connectionId()); - - event->accept(); -} - -std::pair ConnectionGraphicsObject::pointsC1C2() const -{ - switch (nodeScene()->orientation()) { - case Qt::Horizontal: - return pointsC1C2Horizontal(); - break; - - case Qt::Vertical: - return pointsC1C2Vertical(); - break; - } - - throw std::logic_error("Unreachable code after switch statement"); -} - -void ConnectionGraphicsObject::addGraphicsEffect() -{ - auto effect = new QGraphicsBlurEffect; - - effect->setBlurRadius(5); - setGraphicsEffect(effect); - - //auto effect = new QGraphicsDropShadowEffect; - //auto effect = new ConnectionBlurEffect(this); - //effect->setOffset(4, 4); - //effect->setColor(QColor(Qt::gray).darker(800)); -} - -std::pair ConnectionGraphicsObject::pointsC1C2Horizontal() const -{ - double const defaultOffset = 200; - - double xDistance = _in.x() - _out.x(); - - double horizontalOffset = qMin(defaultOffset, std::abs(xDistance)); - - double verticalOffset = 0; - - double ratioX = 0.5; - - if (xDistance <= 0) { - double yDistance = _in.y() - _out.y() + 20; - - double vector = yDistance < 0 ? -1.0 : 1.0; - - verticalOffset = qMin(defaultOffset, std::abs(yDistance)) * vector; - - ratioX = 1.0; - } - - horizontalOffset *= ratioX; - - QPointF c1(_out.x() + horizontalOffset, _out.y() + verticalOffset); - - QPointF c2(_in.x() - horizontalOffset, _in.y() - verticalOffset); - - return std::make_pair(c1, c2); -} - -std::pair ConnectionGraphicsObject::pointsC1C2Vertical() const -{ - double const defaultOffset = 200; - - double yDistance = _in.y() - _out.y(); - - double verticalOffset = qMin(defaultOffset, std::abs(yDistance)); - - double horizontalOffset = 0; - - double ratioY = 0.5; - - if (yDistance <= 0) { - double xDistance = _in.x() - _out.x() + 20; - - double vector = xDistance < 0 ? -1.0 : 1.0; - - horizontalOffset = qMin(defaultOffset, std::abs(xDistance)) * vector; - - ratioY = 1.0; - } - - verticalOffset *= ratioY; - - QPointF c1(_out.x() + horizontalOffset, _out.y() + verticalOffset); - - QPointF c2(_in.x() - horizontalOffset, _in.y() - verticalOffset); - - return std::make_pair(c1, c2); -} - -} // namespace QtNodes diff --git a/story-editor-legacy/nodeeditor/src/ConnectionPainter.cpp b/story-editor-legacy/nodeeditor/src/ConnectionPainter.cpp deleted file mode 100644 index 97002ef..0000000 --- a/story-editor-legacy/nodeeditor/src/ConnectionPainter.cpp +++ /dev/null @@ -1,254 +0,0 @@ -#include "ConnectionPainter.hpp" - -#include - -#include "AbstractGraphModel.hpp" -#include "ConnectionGraphicsObject.hpp" -#include "ConnectionState.hpp" -#include "Definitions.hpp" -#include "NodeData.hpp" -#include "StyleCollection.hpp" - -namespace QtNodes { - -static QPainterPath cubicPath(ConnectionGraphicsObject const &connection) -{ - QPointF const &in = connection.endPoint(PortType::In); - QPointF const &out = connection.endPoint(PortType::Out); - - auto const c1c2 = connection.pointsC1C2(); - - // cubic spline - QPainterPath cubic(out); - - cubic.cubicTo(c1c2.first, c1c2.second, in); - - return cubic; -} - -QPainterPath ConnectionPainter::getPainterStroke(ConnectionGraphicsObject const &connection) -{ - auto cubic = cubicPath(connection); - - QPointF const &out = connection.endPoint(PortType::Out); - QPainterPath result(out); - - unsigned segments = 20; - - for (auto i = 0ul; i < segments; ++i) { - double ratio = double(i + 1) / segments; - result.lineTo(cubic.pointAtPercent(ratio)); - } - - QPainterPathStroker stroker; - stroker.setWidth(10.0); - - return stroker.createStroke(result); -} - -#ifdef NODE_DEBUG_DRAWING -static void debugDrawing(QPainter *painter, ConnectionGraphicsObject const &cgo) -{ - Q_UNUSED(painter); - - { - QPointF const &in = cgo.endPoint(PortType::In); - QPointF const &out = cgo.endPoint(PortType::Out); - - auto const points = cgo.pointsC1C2(); - - painter->setPen(Qt::red); - painter->setBrush(Qt::red); - - painter->drawLine(QLineF(out, points.first)); - painter->drawLine(QLineF(points.first, points.second)); - painter->drawLine(QLineF(points.second, in)); - painter->drawEllipse(points.first, 3, 3); - painter->drawEllipse(points.second, 3, 3); - - painter->setBrush(Qt::NoBrush); - painter->drawPath(cubicPath(cgo)); - } - - { - painter->setPen(Qt::yellow); - painter->drawRect(cgo.boundingRect()); - } -} - -#endif - -static void drawSketchLine(QPainter *painter, ConnectionGraphicsObject const &cgo) -{ - ConnectionState const &state = cgo.connectionState(); - - if (state.requiresPort()) { - auto const &connectionStyle = QtNodes::StyleCollection::connectionStyle(); - - QPen pen; - pen.setWidth(connectionStyle.constructionLineWidth()); - pen.setColor(connectionStyle.constructionColor()); - pen.setStyle(Qt::DashLine); - - painter->setPen(pen); - painter->setBrush(Qt::NoBrush); - - auto cubic = cubicPath(cgo); - - // cubic spline - painter->drawPath(cubic); - } -} - -static void drawHoveredOrSelected(QPainter *painter, ConnectionGraphicsObject const &cgo) -{ - bool const hovered = cgo.connectionState().hovered(); - bool const selected = cgo.isSelected(); - - // drawn as a fat background - if (hovered || selected) { - auto const &connectionStyle = QtNodes::StyleCollection::connectionStyle(); - - double const lineWidth = connectionStyle.lineWidth(); - - QPen pen; - pen.setWidth(2 * lineWidth); - pen.setColor(selected ? connectionStyle.selectedHaloColor() - : connectionStyle.hoveredColor()); - - painter->setPen(pen); - painter->setBrush(Qt::NoBrush); - - // cubic spline - auto const cubic = cubicPath(cgo); - painter->drawPath(cubic); - } -} - -static void drawNormalLine(QPainter *painter, ConnectionGraphicsObject const &cgo) -{ - ConnectionState const &state = cgo.connectionState(); - - if (state.requiresPort()) - return; - - // colors - - auto const &connectionStyle = QtNodes::StyleCollection::connectionStyle(); - - QColor normalColorOut = connectionStyle.normalColor(); - QColor normalColorIn = connectionStyle.normalColor(); - QColor selectedColor = connectionStyle.selectedColor(); - - bool useGradientColor = false; - - AbstractGraphModel const &graphModel = cgo.graphModel(); - - if (connectionStyle.useDataDefinedColors()) { - using QtNodes::PortType; - - auto const cId = cgo.connectionId(); - - auto dataTypeOut = graphModel - .portData(cId.outNodeId, - PortType::Out, - cId.outPortIndex, - PortRole::DataType) - .value(); - - auto dataTypeIn - = graphModel.portData(cId.inNodeId, PortType::In, cId.inPortIndex, PortRole::DataType) - .value(); - - useGradientColor = (dataTypeOut.id != dataTypeIn.id); - - normalColorOut = connectionStyle.normalColor(dataTypeOut.id); - normalColorIn = connectionStyle.normalColor(dataTypeIn.id); - selectedColor = normalColorOut.darker(200); - } - - // geometry - - double const lineWidth = connectionStyle.lineWidth(); - - // draw normal line - QPen p; - - p.setWidth(lineWidth); - - bool const selected = cgo.isSelected(); - - auto cubic = cubicPath(cgo); - if (useGradientColor) { - painter->setBrush(Qt::NoBrush); - - QColor cOut = normalColorOut; - if (selected) - cOut = cOut.darker(200); - p.setColor(cOut); - painter->setPen(p); - - unsigned int const segments = 60; - - for (unsigned int i = 0ul; i < segments; ++i) { - double ratioPrev = double(i) / segments; - double ratio = double(i + 1) / segments; - - if (i == segments / 2) { - QColor cIn = normalColorIn; - if (selected) - cIn = cIn.darker(200); - - p.setColor(cIn); - painter->setPen(p); - } - painter->drawLine(cubic.pointAtPercent(ratioPrev), cubic.pointAtPercent(ratio)); - } - - { - QIcon icon(":convert.png"); - - QPixmap pixmap = icon.pixmap(QSize(22, 22)); - painter->drawPixmap(cubic.pointAtPercent(0.50) - - QPoint(pixmap.width() / 2, pixmap.height() / 2), - pixmap); - } - } else { - p.setColor(normalColorOut); - - if (selected) { - p.setColor(selectedColor); - } - - painter->setPen(p); - painter->setBrush(Qt::NoBrush); - - painter->drawPath(cubic); - } -} - -void ConnectionPainter::paint(QPainter *painter, ConnectionGraphicsObject const &cgo) -{ - drawHoveredOrSelected(painter, cgo); - - drawSketchLine(painter, cgo); - - drawNormalLine(painter, cgo); - -#ifdef NODE_DEBUG_DRAWING - debugDrawing(painter, cgo); -#endif - - // draw end points - auto const &connectionStyle = QtNodes::StyleCollection::connectionStyle(); - - double const pointDiameter = connectionStyle.pointDiameter(); - - painter->setPen(connectionStyle.constructionColor()); - painter->setBrush(connectionStyle.constructionColor()); - double const pointRadius = pointDiameter / 2.0; - painter->drawEllipse(cgo.out(), pointRadius, pointRadius); - painter->drawEllipse(cgo.in(), pointRadius, pointRadius); -} - -} // namespace QtNodes diff --git a/story-editor-legacy/nodeeditor/src/ConnectionState.cpp b/story-editor-legacy/nodeeditor/src/ConnectionState.cpp deleted file mode 100644 index 52ec9b5..0000000 --- a/story-editor-legacy/nodeeditor/src/ConnectionState.cpp +++ /dev/null @@ -1,66 +0,0 @@ -#include "ConnectionState.hpp" - -#include -#include - -#include "BasicGraphicsScene.hpp" -#include "ConnectionGraphicsObject.hpp" -#include "NodeGraphicsObject.hpp" - -namespace QtNodes { - -ConnectionState::~ConnectionState() -{ - //resetLastHoveredNode(); -} - -PortType ConnectionState::requiredPort() const -{ - PortType t = PortType::None; - - if (_cgo.connectionId().outNodeId == InvalidNodeId) { - t = PortType::Out; - } else if (_cgo.connectionId().inNodeId == InvalidNodeId) { - t = PortType::In; - } - - return t; -} - -bool ConnectionState::requiresPort() const -{ - const ConnectionId &id = _cgo.connectionId(); - return id.outNodeId == InvalidNodeId || id.inNodeId == InvalidNodeId; -} - -bool ConnectionState::hovered() const -{ - return _hovered; -} - -void ConnectionState::setHovered(bool hovered) -{ - _hovered = hovered; -} - -void ConnectionState::setLastHoveredNode(NodeId const nodeId) -{ - _lastHoveredNode = nodeId; -} - -NodeId ConnectionState::lastHoveredNode() const -{ - return _lastHoveredNode; -} - -void ConnectionState::resetLastHoveredNode() -{ - if (_lastHoveredNode != InvalidNodeId) { - auto ngo = _cgo.nodeScene()->nodeGraphicsObject(_lastHoveredNode); - ngo->update(); - } - - _lastHoveredNode = InvalidNodeId; -} - -} // namespace QtNodes diff --git a/story-editor-legacy/nodeeditor/src/ConnectionStyle.cpp b/story-editor-legacy/nodeeditor/src/ConnectionStyle.cpp deleted file mode 100644 index 8126589..0000000 --- a/story-editor-legacy/nodeeditor/src/ConnectionStyle.cpp +++ /dev/null @@ -1,205 +0,0 @@ -#include "ConnectionStyle.hpp" - -#include "StyleCollection.hpp" - -#include -#include -#include - -#include - -#include - -using QtNodes::ConnectionStyle; - -inline void initResources() -{ - Q_INIT_RESOURCE(resources); -} - -ConnectionStyle::ConnectionStyle() -{ - // Explicit resources inialization for preventing the static initialization - // order fiasco: https://isocpp.org/wiki/faq/ctors#static-init-order - initResources(); - - // This configuration is stored inside the compiled unit and is loaded statically - loadJsonFile(":DefaultStyle.json"); -} - -ConnectionStyle::ConnectionStyle(QString jsonText) -{ - loadJsonFile(":DefaultStyle.json"); - loadJsonText(jsonText); -} - -void ConnectionStyle::setConnectionStyle(QString jsonText) -{ - ConnectionStyle style(jsonText); - - StyleCollection::setConnectionStyle(style); -} - -#ifdef STYLE_DEBUG -#define CONNECTION_STYLE_CHECK_UNDEFINED_VALUE(v, variable) \ - { \ - if (v.type() == QJsonValue::Undefined || v.type() == QJsonValue::Null) \ - qWarning() << "Undefined value for parameter:" << #variable; \ - } -#else -#define CONNECTION_STYLE_CHECK_UNDEFINED_VALUE(v, variable) -#endif - -#define CONNECTION_VALUE_EXISTS(v) \ - (v.type() != QJsonValue::Undefined && v.type() != QJsonValue::Null) - -#define CONNECTION_STYLE_READ_COLOR(values, variable) \ - { \ - auto valueRef = values[#variable]; \ - CONNECTION_STYLE_CHECK_UNDEFINED_VALUE(valueRef, variable) \ - if (CONNECTION_VALUE_EXISTS(valueRef)) { \ - if (valueRef.isArray()) { \ - auto colorArray = valueRef.toArray(); \ - std::vector rgb; \ - rgb.reserve(3); \ - for (auto it = colorArray.begin(); it != colorArray.end(); ++it) { \ - rgb.push_back((*it).toInt()); \ - } \ - variable = QColor(rgb[0], rgb[1], rgb[2]); \ - } else { \ - variable = QColor(valueRef.toString()); \ - } \ - } \ - } - -#define CONNECTION_STYLE_WRITE_COLOR(values, variable) \ - { \ - values[#variable] = variable.name(); \ - } - -#define CONNECTION_STYLE_READ_FLOAT(values, variable) \ - { \ - auto valueRef = values[#variable]; \ - CONNECTION_STYLE_CHECK_UNDEFINED_VALUE(valueRef, variable) \ - if (CONNECTION_VALUE_EXISTS(valueRef)) \ - variable = valueRef.toDouble(); \ - } - -#define CONNECTION_STYLE_WRITE_FLOAT(values, variable) \ - { \ - values[#variable] = variable; \ - } - -#define CONNECTION_STYLE_READ_BOOL(values, variable) \ - { \ - auto valueRef = values[#variable]; \ - CONNECTION_STYLE_CHECK_UNDEFINED_VALUE(valueRef, variable) \ - if (CONNECTION_VALUE_EXISTS(valueRef)) \ - variable = valueRef.toBool(); \ - } - -#define CONNECTION_STYLE_WRITE_BOOL(values, variable) \ - { \ - values[#variable] = variable; \ - } - -void ConnectionStyle::loadJson(QJsonObject const &json) -{ - QJsonValue nodeStyleValues = json["ConnectionStyle"]; - - QJsonObject obj = nodeStyleValues.toObject(); - - CONNECTION_STYLE_READ_COLOR(obj, ConstructionColor); - CONNECTION_STYLE_READ_COLOR(obj, NormalColor); - CONNECTION_STYLE_READ_COLOR(obj, SelectedColor); - CONNECTION_STYLE_READ_COLOR(obj, SelectedHaloColor); - CONNECTION_STYLE_READ_COLOR(obj, HoveredColor); - - CONNECTION_STYLE_READ_FLOAT(obj, LineWidth); - CONNECTION_STYLE_READ_FLOAT(obj, ConstructionLineWidth); - CONNECTION_STYLE_READ_FLOAT(obj, PointDiameter); - - CONNECTION_STYLE_READ_BOOL(obj, UseDataDefinedColors); -} - -QJsonObject ConnectionStyle::toJson() const -{ - QJsonObject obj; - - CONNECTION_STYLE_WRITE_COLOR(obj, ConstructionColor); - CONNECTION_STYLE_WRITE_COLOR(obj, NormalColor); - CONNECTION_STYLE_WRITE_COLOR(obj, SelectedColor); - CONNECTION_STYLE_WRITE_COLOR(obj, SelectedHaloColor); - CONNECTION_STYLE_WRITE_COLOR(obj, HoveredColor); - - CONNECTION_STYLE_WRITE_FLOAT(obj, LineWidth); - CONNECTION_STYLE_WRITE_FLOAT(obj, ConstructionLineWidth); - CONNECTION_STYLE_WRITE_FLOAT(obj, PointDiameter); - - CONNECTION_STYLE_WRITE_BOOL(obj, UseDataDefinedColors); - - QJsonObject root; - root["ConnectionStyle"] = obj; - - return root; -} - -QColor ConnectionStyle::constructionColor() const -{ - return ConstructionColor; -} - -QColor ConnectionStyle::normalColor() const -{ - return NormalColor; -} - -QColor ConnectionStyle::normalColor(QString typeId) const -{ - std::size_t hash = qHash(typeId); - - std::size_t const hue_range = 0xFF; - - std::mt19937 gen(static_cast(hash)); - std::uniform_int_distribution distrib(0, hue_range); - - int hue = distrib(gen); - int sat = 120 + hash % 129; - - return QColor::fromHsl(hue, sat, 160); -} - -QColor ConnectionStyle::selectedColor() const -{ - return SelectedColor; -} - -QColor ConnectionStyle::selectedHaloColor() const -{ - return SelectedHaloColor; -} - -QColor ConnectionStyle::hoveredColor() const -{ - return HoveredColor; -} - -float ConnectionStyle::lineWidth() const -{ - return LineWidth; -} - -float ConnectionStyle::constructionLineWidth() const -{ - return ConstructionLineWidth; -} - -float ConnectionStyle::pointDiameter() const -{ - return PointDiameter; -} - -bool ConnectionStyle::useDataDefinedColors() const -{ - return UseDataDefinedColors; -} diff --git a/story-editor-legacy/nodeeditor/src/DataFlowGraphModel.cpp b/story-editor-legacy/nodeeditor/src/DataFlowGraphModel.cpp deleted file mode 100644 index fdf46e8..0000000 --- a/story-editor-legacy/nodeeditor/src/DataFlowGraphModel.cpp +++ /dev/null @@ -1,536 +0,0 @@ -#include "DataFlowGraphModel.hpp" -#include "ConnectionIdHash.hpp" - -#include - -#include - -namespace QtNodes { - -DataFlowGraphModel::DataFlowGraphModel(std::shared_ptr registry) - : _registry(std::move(registry)) - , _nextNodeId{0} -{} - -std::unordered_set DataFlowGraphModel::allNodeIds() const -{ - std::unordered_set nodeIds; - for_each(_models.begin(), _models.end(), [&nodeIds](auto const &p) { nodeIds.insert(p.first); }); - - return nodeIds; -} - -std::unordered_set DataFlowGraphModel::allConnectionIds(NodeId const nodeId) const -{ - std::unordered_set result; - - std::copy_if(_connectivity.begin(), - _connectivity.end(), - std::inserter(result, std::end(result)), - [&nodeId](ConnectionId const &cid) { - return cid.inNodeId == nodeId || cid.outNodeId == nodeId; - }); - - return result; -} - -std::unordered_set DataFlowGraphModel::connections(NodeId nodeId, - PortType portType, - PortIndex portIndex) const -{ - std::unordered_set result; - - std::copy_if(_connectivity.begin(), - _connectivity.end(), - std::inserter(result, std::end(result)), - [&portType, &portIndex, &nodeId](ConnectionId const &cid) { - return (getNodeId(portType, cid) == nodeId - && getPortIndex(portType, cid) == portIndex); - }); - - return result; -} - -bool DataFlowGraphModel::connectionExists(ConnectionId const connectionId) const -{ - return (_connectivity.find(connectionId) != _connectivity.end()); -} - -NodeId DataFlowGraphModel::addNode(QString const nodeType) -{ - std::unique_ptr model = _registry->create(nodeType); - - if (model) { - NodeId newId = newNodeId(); - - connect(model.get(), - &NodeDelegateModel::dataUpdated, - [newId, this](PortIndex const portIndex) { - onOutPortDataUpdated(newId, portIndex); - }); - - connect(model.get(), - &NodeDelegateModel::portsAboutToBeDeleted, - this, - [newId, this](PortType const portType, PortIndex const first, PortIndex const last) { - portsAboutToBeDeleted(newId, portType, first, last); - }); - - connect(model.get(), - &NodeDelegateModel::portsDeleted, - this, - &DataFlowGraphModel::portsDeleted); - - connect(model.get(), - &NodeDelegateModel::portsAboutToBeInserted, - this, - [newId, this](PortType const portType, PortIndex const first, PortIndex const last) { - portsAboutToBeInserted(newId, portType, first, last); - }); - - connect(model.get(), - &NodeDelegateModel::portsInserted, - this, - &DataFlowGraphModel::portsInserted); - - _models[newId] = std::move(model); - - Q_EMIT nodeCreated(newId); - - return newId; - } - - return InvalidNodeId; -} - -bool DataFlowGraphModel::connectionPossible(ConnectionId const connectionId) const -{ - auto getDataType = [&](PortType const portType) { - return portData(getNodeId(portType, connectionId), - portType, - getPortIndex(portType, connectionId), - PortRole::DataType) - .value(); - }; - - auto portVacant = [&](PortType const portType) { - NodeId const nodeId = getNodeId(portType, connectionId); - PortIndex const portIndex = getPortIndex(portType, connectionId); - auto const connected = connections(nodeId, portType, portIndex); - - auto policy = portData(nodeId, portType, portIndex, PortRole::ConnectionPolicyRole) - .value(); - - return connected.empty() || (policy == ConnectionPolicy::Many); - }; - - return getDataType(PortType::Out).id == getDataType(PortType::In).id - && portVacant(PortType::Out) && portVacant(PortType::In); -} - -void DataFlowGraphModel::addConnection(ConnectionId const connectionId) -{ - _connectivity.insert(connectionId); - - sendConnectionCreation(connectionId); - - QVariant const portDataToPropagate = portData(connectionId.outNodeId, - PortType::Out, - connectionId.outPortIndex, - PortRole::Data); - - setPortData(connectionId.inNodeId, - PortType::In, - connectionId.inPortIndex, - portDataToPropagate, - PortRole::Data); -} - -void DataFlowGraphModel::sendConnectionCreation(ConnectionId const connectionId) -{ - Q_EMIT connectionCreated(connectionId); - - auto iti = _models.find(connectionId.inNodeId); - auto ito = _models.find(connectionId.outNodeId); - if (iti != _models.end() && ito != _models.end()) { - auto &modeli = iti->second; - auto &modelo = ito->second; - modeli->inputConnectionCreated(connectionId); - modelo->outputConnectionCreated(connectionId); - } -} - -void DataFlowGraphModel::sendConnectionDeletion(ConnectionId const connectionId) -{ - Q_EMIT connectionDeleted(connectionId); - - auto iti = _models.find(connectionId.inNodeId); - auto ito = _models.find(connectionId.outNodeId); - if (iti != _models.end() && ito != _models.end()) { - auto &modeli = iti->second; - auto &modelo = ito->second; - modeli->inputConnectionDeleted(connectionId); - modelo->outputConnectionDeleted(connectionId); - } -} - -bool DataFlowGraphModel::nodeExists(NodeId const nodeId) const -{ - return (_models.find(nodeId) != _models.end()); -} - -QVariant DataFlowGraphModel::nodeData(NodeId nodeId, NodeRole role) const -{ - QVariant result; - - auto it = _models.find(nodeId); - if (it == _models.end()) - return result; - - auto &model = it->second; - - switch (role) { - case NodeRole::Id: - break; - case NodeRole::Type: - result = model->name(); - break; - - case NodeRole::Position: - result = _nodeGeometryData[nodeId].pos; - break; - - case NodeRole::Size: - result = _nodeGeometryData[nodeId].size; - break; - - case NodeRole::CaptionVisible: - result = model->captionVisible(); - break; - - case NodeRole::Caption: - result = model->caption(); - break; - - case NodeRole::Style: { - auto style = StyleCollection::nodeStyle(); - result = style.toJson().toVariantMap(); - } break; - - case NodeRole::InternalData: { - QJsonObject nodeJson; - - nodeJson["internal-data"] = _models.at(nodeId)->save(); - - result = nodeJson.toVariantMap(); - break; - } - - case NodeRole::InPortCount: - result = model->nPorts(PortType::In); - break; - - case NodeRole::OutPortCount: - result = model->nPorts(PortType::Out); - break; - - case NodeRole::Widget: { - auto w = model->embeddedWidget(); - result = QVariant::fromValue(w); - } break; - } - - return result; -} - -NodeFlags DataFlowGraphModel::nodeFlags(NodeId nodeId) const -{ - auto it = _models.find(nodeId); - - if (it != _models.end() && it->second->resizable()) - return NodeFlag::Resizable; - - return NodeFlag::NoFlags; -} - -bool DataFlowGraphModel::setNodeData(NodeId nodeId, NodeRole role, QVariant value) -{ - Q_UNUSED(nodeId); - Q_UNUSED(role); - Q_UNUSED(value); - - bool result = false; - - switch (role) { - case NodeRole::Id: - break; - case NodeRole::Type: - break; - case NodeRole::Position: { - _nodeGeometryData[nodeId].pos = value.value(); - - Q_EMIT nodePositionUpdated(nodeId); - - result = true; - } break; - - case NodeRole::Size: { - _nodeGeometryData[nodeId].size = value.value(); - result = true; - } break; - - case NodeRole::CaptionVisible: - break; - - case NodeRole::Caption: - break; - - case NodeRole::Style: - break; - - case NodeRole::InternalData: - break; - - case NodeRole::InPortCount: - break; - - case NodeRole::OutPortCount: - break; - - case NodeRole::Widget: - break; - } - - return result; -} - -QVariant DataFlowGraphModel::portData(NodeId nodeId, - PortType portType, - PortIndex portIndex, - PortRole role) const -{ - QVariant result; - - auto it = _models.find(nodeId); - if (it == _models.end()) - return result; - - auto &model = it->second; - - switch (role) { - case PortRole::Data: - if (portType == PortType::Out) - result = QVariant::fromValue(model->outData(portIndex)); - break; - - case PortRole::DataType: - result = QVariant::fromValue(model->dataType(portType, portIndex)); - break; - - case PortRole::ConnectionPolicyRole: - result = QVariant::fromValue(model->portConnectionPolicy(portType, portIndex)); - break; - - case PortRole::CaptionVisible: - result = model->portCaptionVisible(portType, portIndex); - break; - - case PortRole::Caption: - result = model->portCaption(portType, portIndex); - - break; - } - - return result; -} - -bool DataFlowGraphModel::setPortData( - NodeId nodeId, PortType portType, PortIndex portIndex, QVariant const &value, PortRole role) -{ - Q_UNUSED(nodeId); - - QVariant result; - - auto it = _models.find(nodeId); - if (it == _models.end()) - return false; - - auto &model = it->second; - - switch (role) { - case PortRole::Data: - if (portType == PortType::In) { - model->setInData(value.value>(), portIndex); - - // Triggers repainting on the scene. - Q_EMIT inPortDataWasSet(nodeId, portType, portIndex); - } - break; - - default: - break; - } - - return false; -} - -bool DataFlowGraphModel::deleteConnection(ConnectionId const connectionId) -{ - bool disconnected = false; - - auto it = _connectivity.find(connectionId); - - if (it != _connectivity.end()) { - disconnected = true; - - _connectivity.erase(it); - } - - if (disconnected) { - sendConnectionDeletion(connectionId); - - propagateEmptyDataTo(getNodeId(PortType::In, connectionId), - getPortIndex(PortType::In, connectionId)); - } - - return disconnected; -} - -bool DataFlowGraphModel::deleteNode(NodeId const nodeId) -{ - // Delete connections to this node first. - auto connectionIds = allConnectionIds(nodeId); - for (auto &cId : connectionIds) { - deleteConnection(cId); - } - - _nodeGeometryData.erase(nodeId); - _models.erase(nodeId); - - Q_EMIT nodeDeleted(nodeId); - - return true; -} - -QJsonObject DataFlowGraphModel::saveNode(NodeId const nodeId) const -{ - QJsonObject nodeJson; - - nodeJson["id"] = static_cast(nodeId); - - nodeJson["internal-data"] = _models.at(nodeId)->save(); - - { - QPointF const pos = nodeData(nodeId, NodeRole::Position).value(); - - QJsonObject posJson; - posJson["x"] = pos.x(); - posJson["y"] = pos.y(); - nodeJson["position"] = posJson; - } - - return nodeJson; -} - -QJsonObject DataFlowGraphModel::save() const -{ - QJsonObject sceneJson; - - QJsonArray nodesJsonArray; - for (auto const nodeId : allNodeIds()) { - nodesJsonArray.append(saveNode(nodeId)); - } - sceneJson["nodes"] = nodesJsonArray; - - QJsonArray connJsonArray; - for (auto const &cid : _connectivity) { - connJsonArray.append(toJson(cid)); - } - sceneJson["connections"] = connJsonArray; - - return sceneJson; -} - -void DataFlowGraphModel::loadNode(QJsonObject const &nodeJson) -{ - // Possibility of the id clash when reading it from json and not generating a - // new value. - // 1. When restoring a scene from a file. - // Conflict is not possible because the scene must be cleared by the time of - // loading. - // 2. When undoing the deletion command. Conflict is not possible - // because all the new ids were created past the removed nodes. - NodeId restoredNodeId = nodeJson["id"].toInt(); - - _nextNodeId = std::max(_nextNodeId, restoredNodeId + 1); - - QJsonObject const internalDataJson = nodeJson["internal-data"].toObject(); - - QString delegateModelName = internalDataJson["model-name"].toString(); - - std::unique_ptr model = _registry->create(delegateModelName); - - if (model) { - connect(model.get(), - &NodeDelegateModel::dataUpdated, - [restoredNodeId, this](PortIndex const portIndex) { - onOutPortDataUpdated(restoredNodeId, portIndex); - }); - - _models[restoredNodeId] = std::move(model); - - Q_EMIT nodeCreated(restoredNodeId); - - QJsonObject posJson = nodeJson["position"].toObject(); - QPointF const pos(posJson["x"].toDouble(), posJson["y"].toDouble()); - - setNodeData(restoredNodeId, NodeRole::Position, pos); - - _models[restoredNodeId]->load(internalDataJson); - } else { - throw std::logic_error(std::string("No registered model with name ") - + delegateModelName.toLocal8Bit().data()); - } -} - -void DataFlowGraphModel::load(QJsonObject const &jsonDocument) -{ - QJsonArray nodesJsonArray = jsonDocument["nodes"].toArray(); - - for (QJsonValueRef nodeJson : nodesJsonArray) { - loadNode(nodeJson.toObject()); - } - - QJsonArray connectionJsonArray = jsonDocument["connections"].toArray(); - - for (QJsonValueRef connection : connectionJsonArray) { - QJsonObject connJson = connection.toObject(); - - ConnectionId connId = fromJson(connJson); - - // Restore the connection - addConnection(connId); - } -} - -void DataFlowGraphModel::onOutPortDataUpdated(NodeId const nodeId, PortIndex const portIndex) -{ - std::unordered_set const &connected = connections(nodeId, - PortType::Out, - portIndex); - - QVariant const portDataToPropagate = portData(nodeId, PortType::Out, portIndex, PortRole::Data); - - for (auto const &cn : connected) { - setPortData(cn.inNodeId, PortType::In, cn.inPortIndex, portDataToPropagate, PortRole::Data); - } -} - -void DataFlowGraphModel::propagateEmptyDataTo(NodeId const nodeId, PortIndex const portIndex) -{ - QVariant emptyData{}; - - setPortData(nodeId, PortType::In, portIndex, emptyData, PortRole::Data); -} - -} // namespace QtNodes diff --git a/story-editor-legacy/nodeeditor/src/DataFlowGraphicsScene.cpp b/story-editor-legacy/nodeeditor/src/DataFlowGraphicsScene.cpp deleted file mode 100644 index 506f722..0000000 --- a/story-editor-legacy/nodeeditor/src/DataFlowGraphicsScene.cpp +++ /dev/null @@ -1,189 +0,0 @@ -#include "DataFlowGraphicsScene.hpp" - -#include "ConnectionGraphicsObject.hpp" -#include "GraphicsView.hpp" -#include "NodeDelegateModelRegistry.hpp" -#include "NodeGraphicsObject.hpp" -#include "UndoCommands.hpp" - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -namespace QtNodes { - -DataFlowGraphicsScene::DataFlowGraphicsScene(DataFlowGraphModel &graphModel, QObject *parent) - : BasicGraphicsScene(graphModel, parent) - , _graphModel(graphModel) -{ - connect(&_graphModel, - &DataFlowGraphModel::inPortDataWasSet, - [this](NodeId const nodeId, PortType const, PortIndex const) { onNodeUpdated(nodeId); }); -} - -// TODO constructor for an empyt scene? - -std::vector DataFlowGraphicsScene::selectedNodes() const -{ - QList graphicsItems = selectedItems(); - - std::vector result; - result.reserve(graphicsItems.size()); - - for (QGraphicsItem *item : graphicsItems) { - auto ngo = qgraphicsitem_cast(item); - - if (ngo != nullptr) { - result.push_back(ngo->nodeId()); - } - } - - return result; -} - -QMenu *DataFlowGraphicsScene::createSceneMenu(QPointF const scenePos) -{ - QMenu *modelMenu = new QMenu(); - - // Add filterbox to the context menu - auto *txtBox = new QLineEdit(modelMenu); - txtBox->setPlaceholderText(QStringLiteral("Filter")); - txtBox->setClearButtonEnabled(true); - - auto *txtBoxAction = new QWidgetAction(modelMenu); - txtBoxAction->setDefaultWidget(txtBox); - - // 1. - modelMenu->addAction(txtBoxAction); - - // Add result treeview to the context menu - QTreeWidget *treeView = new QTreeWidget(modelMenu); - treeView->header()->close(); - - auto *treeViewAction = new QWidgetAction(modelMenu); - treeViewAction->setDefaultWidget(treeView); - - // 2. - modelMenu->addAction(treeViewAction); - - auto registry = _graphModel.dataModelRegistry(); - - for (auto const &cat : registry->categories()) { - auto item = new QTreeWidgetItem(treeView); - item->setText(0, cat); - item->setFlags(item->flags() & ~Qt::ItemIsSelectable); - } - - for (auto const &assoc : registry->registeredModelsCategoryAssociation()) { - QList parent = treeView->findItems(assoc.second, Qt::MatchExactly); - - if (parent.count() <= 0) - continue; - - auto item = new QTreeWidgetItem(parent.first()); - item->setText(0, assoc.first); - } - - treeView->expandAll(); - - connect(treeView, - &QTreeWidget::itemClicked, - [this, modelMenu, scenePos](QTreeWidgetItem *item, int) { - if (!(item->flags() & (Qt::ItemIsSelectable))) { - return; - } - - this->undoStack().push(new CreateCommand(this, item->text(0), scenePos)); - - modelMenu->close(); - }); - - //Setup filtering - connect(txtBox, &QLineEdit::textChanged, [treeView](const QString &text) { - QTreeWidgetItemIterator categoryIt(treeView, QTreeWidgetItemIterator::HasChildren); - while (*categoryIt) - (*categoryIt++)->setHidden(true); - QTreeWidgetItemIterator it(treeView, QTreeWidgetItemIterator::NoChildren); - while (*it) { - auto modelName = (*it)->text(0); - const bool match = (modelName.contains(text, Qt::CaseInsensitive)); - (*it)->setHidden(!match); - if (match) { - QTreeWidgetItem *parent = (*it)->parent(); - while (parent) { - parent->setHidden(false); - parent = parent->parent(); - } - } - ++it; - } - }); - - // make sure the text box gets focus so the user doesn't have to click on it - txtBox->setFocus(); - - // QMenu's instance auto-destruction - modelMenu->setAttribute(Qt::WA_DeleteOnClose); - - return modelMenu; -} - -void DataFlowGraphicsScene::save() const -{ - QString fileName = QFileDialog::getSaveFileName(nullptr, - tr("Open Flow Scene"), - QDir::homePath(), - tr("Flow Scene Files (*.flow)")); - - if (!fileName.isEmpty()) { - if (!fileName.endsWith("flow", Qt::CaseInsensitive)) - fileName += ".flow"; - - QFile file(fileName); - if (file.open(QIODevice::WriteOnly)) { - file.write(QJsonDocument(_graphModel.save()).toJson()); - } - } -} - -void DataFlowGraphicsScene::load() -{ - QString fileName = QFileDialog::getOpenFileName(nullptr, - tr("Open Flow Scene"), - QDir::homePath(), - tr("Flow Scene Files (*.flow)")); - - if (!QFileInfo::exists(fileName)) - return; - - QFile file(fileName); - - if (!file.open(QIODevice::ReadOnly)) - return; - - clearScene(); - - QByteArray const wholeFile = file.readAll(); - - _graphModel.load(QJsonDocument::fromJson(wholeFile).object()); - - Q_EMIT sceneLoaded(); -} - -} // namespace QtNodes diff --git a/story-editor-legacy/nodeeditor/src/DefaultHorizontalNodeGeometry.cpp b/story-editor-legacy/nodeeditor/src/DefaultHorizontalNodeGeometry.cpp deleted file mode 100644 index cf1e80d..0000000 --- a/story-editor-legacy/nodeeditor/src/DefaultHorizontalNodeGeometry.cpp +++ /dev/null @@ -1,239 +0,0 @@ -#include "DefaultHorizontalNodeGeometry.hpp" - -#include "AbstractGraphModel.hpp" -#include "NodeData.hpp" - -#include -#include -#include - -namespace QtNodes { - -DefaultHorizontalNodeGeometry::DefaultHorizontalNodeGeometry(AbstractGraphModel &graphModel) - : AbstractNodeGeometry(graphModel) - , _portSize(20) - , _portSpasing(10) - , _fontMetrics(QFont()) - , _boldFontMetrics(QFont()) -{ - QFont f({ "Arial", 10 }); - f.setBold(true); - _boldFontMetrics = QFontMetrics(f); - - _portSize = _fontMetrics.height(); -} - -QSize DefaultHorizontalNodeGeometry::size(NodeId const nodeId) const -{ - return _graphModel.nodeData(nodeId, NodeRole::Size); -} - -void DefaultHorizontalNodeGeometry::recomputeSize(NodeId const nodeId) const -{ - unsigned int height = maxVerticalPortsExtent(nodeId); - - if (auto w = _graphModel.nodeData(nodeId, NodeRole::Widget)) { - height = std::max(height, static_cast(w->height())); - } - - QRectF const capRect = captionRect(nodeId); - - height += capRect.height(); - - height += _portSpasing; // space above caption - height += _portSpasing; // space below caption - - unsigned int inPortWidth = maxPortsTextAdvance(nodeId, PortType::In); - unsigned int outPortWidth = maxPortsTextAdvance(nodeId, PortType::Out); - - unsigned int width = inPortWidth + outPortWidth + 4 * _portSpasing; - - if (auto w = _graphModel.nodeData(nodeId, NodeRole::Widget)) { - width += w->width(); - } - - width = std::max(width, static_cast(capRect.width()) + 2 * _portSpasing); - - QSize size(width, height); - - _graphModel.setNodeData(nodeId, NodeRole::Size, size); -} - -QPointF DefaultHorizontalNodeGeometry::portPosition(NodeId const nodeId, - PortType const portType, - PortIndex const portIndex) const -{ - unsigned int const step = _portSize + _portSpasing; - - QPointF result; - - double totalHeight = 15.0; - - totalHeight += captionRect(nodeId).height(); - totalHeight += _portSpasing; - - totalHeight += step * portIndex; - totalHeight += step / 2.0; - - QSize size = _graphModel.nodeData(nodeId, NodeRole::Size); - - switch (portType) { - case PortType::In: { - double x = 0.0; - - result = QPointF(x, totalHeight); - break; - } - - case PortType::Out: { - double x = size.width(); - - result = QPointF(x, totalHeight); - break; - } - - default: - break; - } - - return result; -} - -QPointF DefaultHorizontalNodeGeometry::portTextPosition(NodeId const nodeId, - PortType const portType, - PortIndex const portIndex) const -{ - QPointF p = portPosition(nodeId, portType, portIndex); - - QRectF rect = portTextRect(nodeId, portType, portIndex); - - p.setY(p.y() + rect.height() / 4.0); - - QSize size = _graphModel.nodeData(nodeId, NodeRole::Size); - - switch (portType) { - case PortType::In: - p.setX(_portSpasing); - break; - - case PortType::Out: - p.setX(size.width() - _portSpasing - rect.width()); - break; - - default: - break; - } - - return p; -} - -QRectF DefaultHorizontalNodeGeometry::captionRect(NodeId const nodeId) const -{ - if (!_graphModel.nodeData(nodeId, NodeRole::CaptionVisible)) - return QRect(); - - QString name = _graphModel.nodeData(nodeId, NodeRole::Caption); - - return _boldFontMetrics.boundingRect(name); -} - -QPointF DefaultHorizontalNodeGeometry::captionPosition(NodeId const nodeId) const -{ - QSize size = _graphModel.nodeData(nodeId, NodeRole::Size); - return QPointF(0.5 * (size.width() - captionRect(nodeId).width()), - 0.5 * _portSpasing + captionRect(nodeId).height()); -} - -QPointF DefaultHorizontalNodeGeometry::widgetPosition(NodeId const nodeId) const -{ - QSize size = _graphModel.nodeData(nodeId, NodeRole::Size); - - unsigned int captionHeight = captionRect(nodeId).height(); - - if (auto w = _graphModel.nodeData(nodeId, NodeRole::Widget)) { - // If the widget wants to use as much vertical space as possible, - // place it immediately after the caption. - if (w->sizePolicy().verticalPolicy() & QSizePolicy::ExpandFlag) { - return QPointF(2.0 * _portSpasing + maxPortsTextAdvance(nodeId, PortType::In), - captionHeight); - } else { - return QPointF(2.0 * _portSpasing + maxPortsTextAdvance(nodeId, PortType::In), - (captionHeight + size.height() - w->height()) / 2.0); - } - } - return QPointF(); -} - -QRect DefaultHorizontalNodeGeometry::resizeHandleRect(NodeId const nodeId) const -{ - QSize size = _graphModel.nodeData(nodeId, NodeRole::Size); - - unsigned int rectSize = 7; - - return QRect(size.width() - _portSpasing, size.height() - _portSpasing, rectSize, rectSize); -} - -QRectF DefaultHorizontalNodeGeometry::portTextRect(NodeId const nodeId, - PortType const portType, - PortIndex const portIndex) const -{ - QString s; - if (_graphModel.portData(nodeId, portType, portIndex, PortRole::CaptionVisible)) { - s = _graphModel.portData(nodeId, portType, portIndex, PortRole::Caption); - } else { - auto portData = _graphModel.portData(nodeId, portType, portIndex, PortRole::DataType); - - s = portData.value().name; - } - - return _fontMetrics.boundingRect(s); -} - -unsigned int DefaultHorizontalNodeGeometry::maxVerticalPortsExtent(NodeId const nodeId) const -{ - PortCount nInPorts = _graphModel.nodeData(nodeId, NodeRole::InPortCount); - - PortCount nOutPorts = _graphModel.nodeData(nodeId, NodeRole::OutPortCount); - - unsigned int maxNumOfEntries = std::max(nInPorts, nOutPorts); - unsigned int step = _portSize + _portSpasing; - - return step * maxNumOfEntries; -} - -unsigned int DefaultHorizontalNodeGeometry::maxPortsTextAdvance(NodeId const nodeId, - PortType const portType) const -{ - unsigned int width = 0; - - size_t const n = _graphModel - .nodeData(nodeId, - (portType == PortType::Out) ? NodeRole::OutPortCount - : NodeRole::InPortCount) - .toUInt(); - - for (PortIndex portIndex = 0ul; portIndex < n; ++portIndex) { - QString name; - - if (_graphModel.portData(nodeId, portType, portIndex, PortRole::CaptionVisible)) { - name = _graphModel.portData(nodeId, portType, portIndex, PortRole::Caption); - } else { - NodeDataType portData = _graphModel.portData(nodeId, - portType, - portIndex, - PortRole::DataType); - - name = portData.name; - } - -#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) - width = std::max(unsigned(_fontMetrics.horizontalAdvance(name)), width); -#else - width = std::max(unsigned(_fontMetrics.width(name)), width); -#endif - } - - return width; -} - -} // namespace QtNodes diff --git a/story-editor-legacy/nodeeditor/src/DefaultNodePainter.cpp b/story-editor-legacy/nodeeditor/src/DefaultNodePainter.cpp deleted file mode 100644 index afe0cc2..0000000 --- a/story-editor-legacy/nodeeditor/src/DefaultNodePainter.cpp +++ /dev/null @@ -1,284 +0,0 @@ -#include "DefaultNodePainter.hpp" - -#include - -#include - -#include "AbstractGraphModel.hpp" -#include "AbstractNodeGeometry.hpp" -#include "BasicGraphicsScene.hpp" -#include "ConnectionGraphicsObject.hpp" -#include "ConnectionIdUtils.hpp" -#include "NodeGraphicsObject.hpp" -#include "NodeState.hpp" -#include "StyleCollection.hpp" - -namespace QtNodes { - -void DefaultNodePainter::paint(QPainter *painter, NodeGraphicsObject &ngo) const -{ - // TODO? - //AbstractNodeGeometry & geometry = ngo.nodeScene()->nodeGeometry(); - //geometry.recomputeSizeIfFontChanged(painter->font()); - - drawNodeRect(painter, ngo); - - drawConnectionPoints(painter, ngo); - - drawFilledConnectionPoints(painter, ngo); - - drawNodeCaption(painter, ngo); - - drawEntryLabels(painter, ngo); - - drawResizeRect(painter, ngo); -} - -void DefaultNodePainter::drawNodeRect(QPainter *painter, NodeGraphicsObject &ngo) const -{ - AbstractGraphModel &model = ngo.graphModel(); - - NodeId const nodeId = ngo.nodeId(); - - AbstractNodeGeometry &geometry = ngo.nodeScene()->nodeGeometry(); - - QSize size = geometry.size(nodeId); - - QJsonDocument json = QJsonDocument::fromVariant(model.nodeData(nodeId, NodeRole::Style)); - - NodeStyle nodeStyle(json.object()); - - auto color = ngo.isSelected() ? nodeStyle.SelectedBoundaryColor : nodeStyle.NormalBoundaryColor; - -// if (ngo.nodeState().hovered()) { -// QPen p(color, nodeStyle.HoveredPenWidth); -// painter->setPen(p); -// } else { -// QPen p(color, nodeStyle.PenWidth); -// painter->setPen(p); -// } - QPen pen = painter->pen(); - pen.setBrush(color); - pen.setWidth(2); - painter->setPen(pen); - painter->setBrush(nodeStyle.GradientColor0); - - QRectF boundary(0, 0, size.width(), size.height()); - painter->drawRect(boundary); -} - -void DefaultNodePainter::drawConnectionPoints(QPainter *painter, NodeGraphicsObject &ngo) const -{ - AbstractGraphModel &model = ngo.graphModel(); - NodeId const nodeId = ngo.nodeId(); - AbstractNodeGeometry &geometry = ngo.nodeScene()->nodeGeometry(); - - QJsonDocument json = QJsonDocument::fromVariant(model.nodeData(nodeId, NodeRole::Style)); - NodeStyle nodeStyle(json.object()); - - auto const &connectionStyle = StyleCollection::connectionStyle(); - - float diameter = nodeStyle.ConnectionPointDiameter; - auto reducedDiameter = diameter * 0.6; - - for (PortType portType : {PortType::Out, PortType::In}) { - size_t const n = model - .nodeData(nodeId, - (portType == PortType::Out) ? NodeRole::OutPortCount - : NodeRole::InPortCount) - .toUInt(); - - for (PortIndex portIndex = 0; portIndex < n; ++portIndex) { - QPointF p = geometry.portPosition(nodeId, portType, portIndex); - - auto const &dataType = model.portData(nodeId, portType, portIndex, PortRole::DataType) - .value(); - - double r = 1.0; - - NodeState const &state = ngo.nodeState(); - - if (auto const *cgo = state.connectionForReaction()) { - PortType requiredPort = cgo->connectionState().requiredPort(); - - if (requiredPort == portType) { - ConnectionId possibleConnectionId = makeCompleteConnectionId(cgo->connectionId(), - nodeId, - portIndex); - - bool const possible = model.connectionPossible(possibleConnectionId); - - auto cp = cgo->sceneTransform().map(cgo->endPoint(requiredPort)); - cp = ngo.sceneTransform().inverted().map(cp); - - auto diff = cp - p; - double dist = std::sqrt(QPointF::dotProduct(diff, diff)); - - if (possible) { - double const thres = 40.0; - r = (dist < thres) ? (2.0 - dist / thres) : 1.0; - } else { - double const thres = 80.0; - r = (dist < thres) ? (dist / thres) : 1.0; - } - } - } - - if (connectionStyle.useDataDefinedColors()) { - painter->setBrush(connectionStyle.normalColor(dataType.id)); - } else { - painter->setBrush(nodeStyle.ConnectionPointColor); - } - - painter->drawEllipse(p, reducedDiameter * r, reducedDiameter * r); - } - } - - if (ngo.nodeState().connectionForReaction()) { - ngo.nodeState().resetConnectionForReaction(); - } -} - -void DefaultNodePainter::drawFilledConnectionPoints(QPainter *painter, NodeGraphicsObject &ngo) const -{ - AbstractGraphModel &model = ngo.graphModel(); - NodeId const nodeId = ngo.nodeId(); - AbstractNodeGeometry &geometry = ngo.nodeScene()->nodeGeometry(); - - QJsonDocument json = QJsonDocument::fromVariant(model.nodeData(nodeId, NodeRole::Style)); - NodeStyle nodeStyle(json.object()); - - auto diameter = nodeStyle.ConnectionPointDiameter; - - for (PortType portType : {PortType::Out, PortType::In}) { - size_t const n = model - .nodeData(nodeId, - (portType == PortType::Out) ? NodeRole::OutPortCount - : NodeRole::InPortCount) - .toUInt(); - - for (PortIndex portIndex = 0; portIndex < n; ++portIndex) { - QPointF p = geometry.portPosition(nodeId, portType, portIndex); - - auto const &connected = model.connections(nodeId, portType, portIndex); - - if (!connected.empty()) { - auto const &dataType = model - .portData(nodeId, portType, portIndex, PortRole::DataType) - .value(); - - auto const &connectionStyle = StyleCollection::connectionStyle(); - if (connectionStyle.useDataDefinedColors()) { - QColor const c = connectionStyle.normalColor(dataType.id); - painter->setPen(c); - painter->setBrush(c); - } else { - painter->setPen(nodeStyle.FilledConnectionPointColor); - painter->setBrush(nodeStyle.FilledConnectionPointColor); - } - - painter->drawEllipse(p, diameter * 0.4, diameter * 0.4); - } - } - } -} - -void DefaultNodePainter::drawNodeCaption(QPainter *painter, NodeGraphicsObject &ngo) const -{ - AbstractGraphModel &model = ngo.graphModel(); - NodeId const nodeId = ngo.nodeId(); - AbstractNodeGeometry &geometry = ngo.nodeScene()->nodeGeometry(); - - if (!model.nodeData(nodeId, NodeRole::CaptionVisible).toBool()) - return; - - QString const name = model.nodeData(nodeId, NodeRole::Caption).toString(); - - QFont f({ "Arial", 10 }); - f.setBold(true); - - QPointF position = geometry.captionPosition(nodeId); - - QJsonDocument json = QJsonDocument::fromVariant(model.nodeData(nodeId, NodeRole::Style)); - NodeStyle nodeStyle(json.object()); - - - painter->setBrush(QBrush("#f7aa1b")); - QFontMetrics metrics(f); - auto fontRect = metrics.boundingRect(name); - - QSize sizeH = geometry.size(nodeId); - QRectF titleRect; - - int w = sizeH.width(); -// titleRect.setX(2); -// titleRect.setY(2); - titleRect.setWidth(w); - titleRect.setHeight(fontRect.height() + position.ry()); - QPen pen = painter->pen(); - pen.setWidth(0); - painter->setPen(pen); - painter->drawRect(titleRect); - - painter->setFont(f); - painter->setPen(Qt::black); - painter->drawText(position, name); - - f.setBold(false); - painter->setFont(f); -} - -void DefaultNodePainter::drawEntryLabels(QPainter *painter, NodeGraphicsObject &ngo) const -{ - AbstractGraphModel &model = ngo.graphModel(); - NodeId const nodeId = ngo.nodeId(); - AbstractNodeGeometry &geometry = ngo.nodeScene()->nodeGeometry(); - - QJsonDocument json = QJsonDocument::fromVariant(model.nodeData(nodeId, NodeRole::Style)); - NodeStyle nodeStyle(json.object()); - - for (PortType portType : {PortType::Out, PortType::In}) { - unsigned int n = model.nodeData(nodeId, - (portType == PortType::Out) - ? NodeRole::OutPortCount - : NodeRole::InPortCount); - - for (PortIndex portIndex = 0; portIndex < n; ++portIndex) { - auto const &connected = model.connections(nodeId, portType, portIndex); - - QPointF p = geometry.portTextPosition(nodeId, portType, portIndex); - - if (connected.empty()) - painter->setPen(nodeStyle.FontColorFaded); - else - painter->setPen(nodeStyle.FontColor); - - QString s; - - if (model.portData(nodeId, portType, portIndex, PortRole::CaptionVisible)) { - s = model.portData(nodeId, portType, portIndex, PortRole::Caption); - } else { - auto portData = model.portData(nodeId, portType, portIndex, PortRole::DataType); - - s = portData.value().name; - } - - painter->drawText(p, s); - } - } -} - -void DefaultNodePainter::drawResizeRect(QPainter *painter, NodeGraphicsObject &ngo) const -{ - AbstractGraphModel &model = ngo.graphModel(); - NodeId const nodeId = ngo.nodeId(); - AbstractNodeGeometry &geometry = ngo.nodeScene()->nodeGeometry(); - - if (model.nodeFlags(nodeId) & NodeFlag::Resizable) { - painter->setBrush(Qt::gray); - - painter->drawEllipse(geometry.resizeHandleRect(nodeId)); - } -} - -} // namespace QtNodes diff --git a/story-editor-legacy/nodeeditor/src/DefaultVerticalNodeGeometry.cpp b/story-editor-legacy/nodeeditor/src/DefaultVerticalNodeGeometry.cpp deleted file mode 100644 index 4c3c0bd..0000000 --- a/story-editor-legacy/nodeeditor/src/DefaultVerticalNodeGeometry.cpp +++ /dev/null @@ -1,300 +0,0 @@ -#include "DefaultVerticalNodeGeometry.hpp" - -#include "AbstractGraphModel.hpp" -#include "NodeData.hpp" - -#include -#include -#include - -namespace QtNodes { - -DefaultVerticalNodeGeometry::DefaultVerticalNodeGeometry(AbstractGraphModel &graphModel) - : AbstractNodeGeometry(graphModel) - , _portSize(20) - , _portSpasing(10) - , _fontMetrics(QFont()) - , _boldFontMetrics(QFont()) -{ - QFont f({ "Arial", 10 }); - f.setBold(true); - _boldFontMetrics = QFontMetrics(f); - - _portSize = _fontMetrics.height(); -} - -QSize DefaultVerticalNodeGeometry::size(NodeId const nodeId) const -{ - return _graphModel.nodeData(nodeId, NodeRole::Size); -} - -void DefaultVerticalNodeGeometry::recomputeSize(NodeId const nodeId) const -{ - unsigned int height = _portSpasing; // maxHorizontalPortsExtent(nodeId); - - if (auto w = _graphModel.nodeData(nodeId, NodeRole::Widget)) { - height = std::max(height, static_cast(w->height())); - } - - QRectF const capRect = captionRect(nodeId); - - height += capRect.height(); - - height += _portSpasing; - height += _portSpasing; - - PortCount nInPorts = _graphModel.nodeData(nodeId, NodeRole::InPortCount); - PortCount nOutPorts = _graphModel.nodeData(nodeId, NodeRole::OutPortCount); - - // Adding double step (top and bottom) to reserve space for port captions. - - height += portCaptionsHeight(nodeId, PortType::In); - height += portCaptionsHeight(nodeId, PortType::Out); - - unsigned int inPortWidth = maxPortsTextAdvance(nodeId, PortType::In); - unsigned int outPortWidth = maxPortsTextAdvance(nodeId, PortType::Out); - - unsigned int totalInPortsWidth = nInPorts > 0 - ? inPortWidth * nInPorts + _portSpasing * (nInPorts - 1) - : 0; - - unsigned int totalOutPortsWidth = nOutPorts > 0 ? outPortWidth * nOutPorts - + _portSpasing * (nOutPorts - 1) - : 0; - - unsigned int width = std::max(totalInPortsWidth, totalOutPortsWidth); - - if (auto w = _graphModel.nodeData(nodeId, NodeRole::Widget)) { - width = std::max(width, static_cast(w->width())); - } - - width = std::max(width, static_cast(capRect.width())); - - width += _portSpasing; - width += _portSpasing; - - QSize size(width, height); - - _graphModel.setNodeData(nodeId, NodeRole::Size, size); -} - -QPointF DefaultVerticalNodeGeometry::portPosition(NodeId const nodeId, - PortType const portType, - PortIndex const portIndex) const -{ - QPointF result; - - QSize size = _graphModel.nodeData(nodeId, NodeRole::Size); - - switch (portType) { - case PortType::In: { - unsigned int inPortWidth = maxPortsTextAdvance(nodeId, PortType::In) + _portSpasing; - - PortCount nInPorts = _graphModel.nodeData(nodeId, NodeRole::InPortCount); - - double x = (size.width() - (nInPorts - 1) * inPortWidth) / 2.0 + portIndex * inPortWidth; - - double y = 0.0; - - result = QPointF(x, y); - - break; - } - - case PortType::Out: { - unsigned int outPortWidth = maxPortsTextAdvance(nodeId, PortType::Out) + _portSpasing; - PortCount nOutPorts = _graphModel.nodeData(nodeId, NodeRole::OutPortCount); - - double x = (size.width() - (nOutPorts - 1) * outPortWidth) / 2.0 + portIndex * outPortWidth; - - double y = size.height(); - - result = QPointF(x, y); - - break; - } - - default: - break; - } - - return result; -} - -QPointF DefaultVerticalNodeGeometry::portTextPosition(NodeId const nodeId, - PortType const portType, - PortIndex const portIndex) const -{ - QPointF p = portPosition(nodeId, portType, portIndex); - - QRectF rect = portTextRect(nodeId, portType, portIndex); - - p.setX(p.x() - rect.width() / 2.0); - - QSize size = _graphModel.nodeData(nodeId, NodeRole::Size); - - switch (portType) { - case PortType::In: - p.setY(5.0 + rect.height()); - break; - - case PortType::Out: - p.setY(size.height() - 5.0); - break; - - default: - break; - } - - return p; -} - -QRectF DefaultVerticalNodeGeometry::captionRect(NodeId const nodeId) const -{ - if (!_graphModel.nodeData(nodeId, NodeRole::CaptionVisible)) - return QRect(); - - QString name = _graphModel.nodeData(nodeId, NodeRole::Caption); - - return _boldFontMetrics.boundingRect(name); -} - -QPointF DefaultVerticalNodeGeometry::captionPosition(NodeId const nodeId) const -{ - QSize size = _graphModel.nodeData(nodeId, NodeRole::Size); - - unsigned int step = portCaptionsHeight(nodeId, PortType::In); - step += _portSpasing; - - auto rect = captionRect(nodeId); - - return QPointF(0.5 * (size.width() - rect.width()), step + rect.height()); -} - -QPointF DefaultVerticalNodeGeometry::widgetPosition(NodeId const nodeId) const -{ - QSize size = _graphModel.nodeData(nodeId, NodeRole::Size); - - unsigned int captionHeight = captionRect(nodeId).height(); - - if (auto w = _graphModel.nodeData(nodeId, NodeRole::Widget)) { - // If the widget wants to use as much vertical space as possible, - // place it immediately after the caption. - if (w->sizePolicy().verticalPolicy() & QSizePolicy::ExpandFlag) { - return QPointF(_portSpasing + maxPortsTextAdvance(nodeId, PortType::In), captionHeight); - } else { - return QPointF(_portSpasing + maxPortsTextAdvance(nodeId, PortType::In), - (captionHeight + size.height() - w->height()) / 2.0); - } - } - return QPointF(); -} - -QRect DefaultVerticalNodeGeometry::resizeHandleRect(NodeId const nodeId) const -{ - QSize size = _graphModel.nodeData(nodeId, NodeRole::Size); - - unsigned int rectSize = 7; - - return QRect(size.width() - rectSize, size.height() - rectSize, rectSize, rectSize); -} - -QRectF DefaultVerticalNodeGeometry::portTextRect(NodeId const nodeId, - PortType const portType, - PortIndex const portIndex) const -{ - QString s; - if (_graphModel.portData(nodeId, portType, portIndex, PortRole::CaptionVisible)) { - s = _graphModel.portData(nodeId, portType, portIndex, PortRole::Caption); - } else { - auto portData = _graphModel.portData(nodeId, portType, portIndex, PortRole::DataType); - - s = portData.value().name; - } - - return _fontMetrics.boundingRect(s); -} - -unsigned int DefaultVerticalNodeGeometry::maxHorizontalPortsExtent(NodeId const nodeId) const -{ - PortCount nInPorts = _graphModel.nodeData(nodeId, NodeRole::InPortCount); - - PortCount nOutPorts = _graphModel.nodeData(nodeId, NodeRole::OutPortCount); - - unsigned int maxNumOfEntries = std::max(nInPorts, nOutPorts); - unsigned int step = _portSize + _portSpasing; - - return step * maxNumOfEntries; -} - -unsigned int DefaultVerticalNodeGeometry::maxPortsTextAdvance(NodeId const nodeId, - PortType const portType) const -{ - unsigned int width = 0; - - size_t const n = _graphModel - .nodeData(nodeId, - (portType == PortType::Out) ? NodeRole::OutPortCount - : NodeRole::InPortCount) - .toUInt(); - - for (PortIndex portIndex = 0ul; portIndex < n; ++portIndex) { - QString name; - - if (_graphModel.portData(nodeId, portType, portIndex, PortRole::CaptionVisible)) { - name = _graphModel.portData(nodeId, portType, portIndex, PortRole::Caption); - } else { - NodeDataType portData = _graphModel.portData(nodeId, - portType, - portIndex, - PortRole::DataType); - - name = portData.name; - } - -#if QT_VERSION >= QT_VERSION_CHECK(5, 15, 0) - width = std::max(unsigned(_fontMetrics.horizontalAdvance(name)), width); -#else - width = std::max(unsigned(_fontMetrics.width(name)), width); -#endif - } - - return width; -} - -unsigned int DefaultVerticalNodeGeometry::portCaptionsHeight(NodeId const nodeId, - PortType const portType) const -{ - unsigned int h = 0; - - switch (portType) { - case PortType::In: { - PortCount nInPorts = _graphModel.nodeData(nodeId, NodeRole::InPortCount); - for (PortIndex i = 0; i < nInPorts; ++i) { - if (_graphModel.portData(nodeId, PortType::In, i, PortRole::CaptionVisible)) { - h += _portSpasing; - break; - } - } - break; - } - - case PortType::Out: { - PortCount nOutPorts = _graphModel.nodeData(nodeId, NodeRole::OutPortCount); - for (PortIndex i = 0; i < nOutPorts; ++i) { - if (_graphModel.portData(nodeId, PortType::Out, i, PortRole::CaptionVisible)) { - h += _portSpasing; - break; - } - } - break; - } - - default: - break; - } - - return h; -} - -} // namespace QtNodes diff --git a/story-editor-legacy/nodeeditor/src/Definitions.cpp b/story-editor-legacy/nodeeditor/src/Definitions.cpp deleted file mode 100644 index dc8baa3..0000000 --- a/story-editor-legacy/nodeeditor/src/Definitions.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "Definitions.hpp" diff --git a/story-editor-legacy/nodeeditor/src/GraphicsView.cpp b/story-editor-legacy/nodeeditor/src/GraphicsView.cpp deleted file mode 100644 index 1ffa8f5..0000000 --- a/story-editor-legacy/nodeeditor/src/GraphicsView.cpp +++ /dev/null @@ -1,405 +0,0 @@ -#include "GraphicsView.hpp" - -#include "BasicGraphicsScene.hpp" -#include "ConnectionGraphicsObject.hpp" -#include "NodeGraphicsObject.hpp" -#include "StyleCollection.hpp" -#include "UndoCommands.hpp" - -#include - -#include -#include - -#include - -#include -#include -#include - -#include -#include - -#include -#include - -using QtNodes::BasicGraphicsScene; -using QtNodes::GraphicsView; - -GraphicsView::GraphicsView(QWidget *parent) - : QGraphicsView(parent) - , _clearSelectionAction(Q_NULLPTR) - , _deleteSelectionAction(Q_NULLPTR) - , _duplicateSelectionAction(Q_NULLPTR) - , _copySelectionAction(Q_NULLPTR) - , _pasteAction(Q_NULLPTR) -{ - setDragMode(QGraphicsView::ScrollHandDrag); - setRenderHint(QPainter::Antialiasing); - - auto const &flowViewStyle = StyleCollection::flowViewStyle(); - - setBackgroundBrush(flowViewStyle.BackgroundColor); - - setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - - setTransformationAnchor(QGraphicsView::AnchorUnderMouse); - - setCacheMode(QGraphicsView::CacheBackground); - setViewportUpdateMode(QGraphicsView::BoundingRectViewportUpdate); - - setScaleRange(0.3, 2); - - // Sets the scene rect to its maximum possible ranges to avoid autu scene range - // re-calculation when expanding the all QGraphicsItems common rect. - int maxSize = 32767; - setSceneRect(-maxSize, -maxSize, (maxSize * 2), (maxSize * 2)); -} - -GraphicsView::GraphicsView(BasicGraphicsScene *scene, QWidget *parent) - : GraphicsView(parent) -{ - setScene(scene); -} - -QAction *GraphicsView::clearSelectionAction() const -{ - return _clearSelectionAction; -} - -QAction *GraphicsView::deleteSelectionAction() const -{ - return _deleteSelectionAction; -} - -void GraphicsView::setScene(BasicGraphicsScene *scene) -{ - QGraphicsView::setScene(scene); - - { - // setup actions - delete _clearSelectionAction; - _clearSelectionAction = new QAction(QStringLiteral("Clear Selection"), this); - _clearSelectionAction->setShortcut(Qt::Key_Escape); - - connect(_clearSelectionAction, &QAction::triggered, scene, &QGraphicsScene::clearSelection); - - addAction(_clearSelectionAction); - } - - { - delete _deleteSelectionAction; - _deleteSelectionAction = new QAction(QStringLiteral("Delete Selection"), this); - _deleteSelectionAction->setShortcutContext(Qt::ShortcutContext::WidgetShortcut); - _deleteSelectionAction->setShortcut(QKeySequence(QKeySequence::Delete)); - connect(_deleteSelectionAction, - &QAction::triggered, - this, - &GraphicsView::onDeleteSelectedObjects); - - addAction(_deleteSelectionAction); - } - - { - delete _duplicateSelectionAction; - _duplicateSelectionAction = new QAction(QStringLiteral("Duplicate Selection"), this); - _duplicateSelectionAction->setShortcutContext(Qt::ShortcutContext::WidgetShortcut); - _duplicateSelectionAction->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_D)); - connect(_duplicateSelectionAction, - &QAction::triggered, - this, - &GraphicsView::onDuplicateSelectedObjects); - - addAction(_duplicateSelectionAction); - } - - { - delete _copySelectionAction; - _copySelectionAction = new QAction(QStringLiteral("Copy Selection"), this); - _copySelectionAction->setShortcutContext(Qt::ShortcutContext::WidgetShortcut); - _copySelectionAction->setShortcut(QKeySequence(QKeySequence::Copy)); - connect(_copySelectionAction, - &QAction::triggered, - this, - &GraphicsView::onCopySelectedObjects); - - addAction(_copySelectionAction); - } - - { - delete _pasteAction; - _pasteAction = new QAction(QStringLiteral("Copy Selection"), this); - _pasteAction->setShortcutContext(Qt::ShortcutContext::WidgetShortcut); - _pasteAction->setShortcut(QKeySequence(QKeySequence::Paste)); - connect(_pasteAction, &QAction::triggered, this, &GraphicsView::onPasteObjects); - - addAction(_pasteAction); - } - - auto undoAction = scene->undoStack().createUndoAction(this, tr("&Undo")); - undoAction->setShortcuts(QKeySequence::Undo); - addAction(undoAction); - - auto redoAction = scene->undoStack().createRedoAction(this, tr("&Redo")); - redoAction->setShortcuts(QKeySequence::Redo); - addAction(redoAction); -} - -void GraphicsView::centerScene() -{ - if (scene()) { - scene()->setSceneRect(QRectF()); - - QRectF sceneRect = scene()->sceneRect(); - - if (sceneRect.width() > this->rect().width() || sceneRect.height() > this->rect().height()) { - fitInView(sceneRect, Qt::KeepAspectRatio); - } - - centerOn(sceneRect.center()); - } -} - -void GraphicsView::contextMenuEvent(QContextMenuEvent *event) -{ - if (itemAt(event->pos())) { - QGraphicsView::contextMenuEvent(event); - return; - } - - auto const scenePos = mapToScene(event->pos()); - - QMenu *menu = nodeScene()->createSceneMenu(scenePos); - - if (menu) { - menu->exec(event->globalPos()); - } -} - -void GraphicsView::wheelEvent(QWheelEvent *event) -{ - QPoint delta = event->angleDelta(); - - if (delta.y() == 0) { - event->ignore(); - return; - } - - double const d = delta.y() / std::abs(delta.y()); - - if (d > 0.0) - scaleUp(); - else - scaleDown(); -} - -double GraphicsView::getScale() const -{ - return transform().m11(); -} - -void GraphicsView::setScaleRange(double minimum, double maximum) -{ - if (maximum < minimum) - std::swap(minimum, maximum); - minimum = std::max(0.0, minimum); - maximum = std::max(0.0, maximum); - - _scaleRange = {minimum, maximum}; - - setupScale(transform().m11()); -} - -void GraphicsView::setScaleRange(ScaleRange range) -{ - setScaleRange(range.minimum, range.maximum); -} - -void GraphicsView::scaleUp() -{ - double const step = 1.2; - double const factor = std::pow(step, 1.0); - - if (_scaleRange.maximum > 0) { - QTransform t = transform(); - t.scale(factor, factor); - if (t.m11() >= _scaleRange.maximum) { - setupScale(t.m11()); - return; - } - } - - scale(factor, factor); - Q_EMIT scaleChanged(transform().m11()); -} - -void GraphicsView::scaleDown() -{ - double const step = 1.2; - double const factor = std::pow(step, -1.0); - - if (_scaleRange.minimum > 0) { - QTransform t = transform(); - t.scale(factor, factor); - if (t.m11() <= _scaleRange.minimum) { - setupScale(t.m11()); - return; - } - } - - scale(factor, factor); - Q_EMIT scaleChanged(transform().m11()); -} - -void GraphicsView::setupScale(double scale) -{ - scale = std::max(_scaleRange.minimum, std::min(_scaleRange.maximum, scale)); - - if (scale <= 0) - return; - - if (scale == transform().m11()) - return; - - QTransform matrix; - matrix.scale(scale, scale); - setTransform(matrix, false); - - Q_EMIT scaleChanged(scale); -} - -void GraphicsView::onDeleteSelectedObjects() -{ - nodeScene()->undoStack().push(new DeleteCommand(nodeScene())); -} - -void GraphicsView::onDuplicateSelectedObjects() -{ - QPointF const pastePosition = scenePastePosition(); - - nodeScene()->undoStack().push(new CopyCommand(nodeScene())); - nodeScene()->undoStack().push(new PasteCommand(nodeScene(), pastePosition)); -} - -void GraphicsView::onCopySelectedObjects() -{ - nodeScene()->undoStack().push(new CopyCommand(nodeScene())); -} - -void GraphicsView::onPasteObjects() -{ - QPointF const pastePosition = scenePastePosition(); - nodeScene()->undoStack().push(new PasteCommand(nodeScene(), pastePosition)); -} - -void GraphicsView::keyPressEvent(QKeyEvent *event) -{ - switch (event->key()) { - case Qt::Key_Shift: - setDragMode(QGraphicsView::RubberBandDrag); - break; - - default: - break; - } - - QGraphicsView::keyPressEvent(event); -} - -void GraphicsView::keyReleaseEvent(QKeyEvent *event) -{ - switch (event->key()) { - case Qt::Key_Shift: - setDragMode(QGraphicsView::ScrollHandDrag); - break; - - default: - break; - } - QGraphicsView::keyReleaseEvent(event); -} - -void GraphicsView::mousePressEvent(QMouseEvent *event) -{ - QGraphicsView::mousePressEvent(event); - if (event->button() == Qt::LeftButton) { - _clickPos = mapToScene(event->pos()); - } -} - -void GraphicsView::mouseMoveEvent(QMouseEvent *event) -{ - QGraphicsView::mouseMoveEvent(event); - if (scene()->mouseGrabberItem() == nullptr && event->buttons() == Qt::LeftButton) { - // Make sure shift is not being pressed - if ((event->modifiers() & Qt::ShiftModifier) == 0) { - QPointF difference = _clickPos - mapToScene(event->pos()); - setSceneRect(sceneRect().translated(difference.x(), difference.y())); - } - } -} - -void GraphicsView::drawBackground(QPainter *painter, const QRectF &r) -{ - QGraphicsView::drawBackground(painter, r); - - auto drawGrid = [&](double gridStep) { - QRect windowRect = rect(); - QPointF tl = mapToScene(windowRect.topLeft()); - QPointF br = mapToScene(windowRect.bottomRight()); - - double left = std::floor(tl.x() / gridStep - 0.5); - double right = std::floor(br.x() / gridStep + 1.0); - double bottom = std::floor(tl.y() / gridStep - 0.5); - double top = std::floor(br.y() / gridStep + 1.0); - - // vertical lines - for (int xi = int(left); xi <= int(right); ++xi) { - QLineF line(xi * gridStep, bottom * gridStep, xi * gridStep, top * gridStep); - - painter->drawLine(line); - } - - // horizontal lines - for (int yi = int(bottom); yi <= int(top); ++yi) { - QLineF line(left * gridStep, yi * gridStep, right * gridStep, yi * gridStep); - painter->drawLine(line); - } - }; - - auto const &flowViewStyle = StyleCollection::flowViewStyle(); - - QPen pfine(flowViewStyle.FineGridColor, 1.0); - - painter->setPen(pfine); - drawGrid(15); - - QPen p(flowViewStyle.CoarseGridColor, 1.0); - - painter->setPen(p); - drawGrid(150); -} - -void GraphicsView::showEvent(QShowEvent *event) -{ - QGraphicsView::showEvent(event); - - centerScene(); -} - -BasicGraphicsScene *GraphicsView::nodeScene() -{ - return dynamic_cast(scene()); -} - -QPointF GraphicsView::scenePastePosition() -{ - QPoint origin = mapFromGlobal(QCursor::pos()); - - QRect const viewRect = rect(); - if (!viewRect.contains(origin)) - origin = viewRect.center(); - - return mapToScene(origin); -} diff --git a/story-editor-legacy/nodeeditor/src/GraphicsViewStyle.cpp b/story-editor-legacy/nodeeditor/src/GraphicsViewStyle.cpp deleted file mode 100644 index ae02a2c..0000000 --- a/story-editor-legacy/nodeeditor/src/GraphicsViewStyle.cpp +++ /dev/null @@ -1,94 +0,0 @@ -#include "GraphicsViewStyle.hpp" - -#include -#include -#include -#include - -#include "StyleCollection.hpp" - -using QtNodes::GraphicsViewStyle; - -inline void initResources() -{ - Q_INIT_RESOURCE(resources); -} - -GraphicsViewStyle::GraphicsViewStyle() -{ - // Explicit resources inialization for preventing the static initialization - // order fiasco: https://isocpp.org/wiki/faq/ctors#static-init-order - initResources(); - - // This configuration is stored inside the compiled unit and is loaded statically - loadJsonFile(":DefaultStyle.json"); -} - -GraphicsViewStyle::GraphicsViewStyle(QString jsonText) -{ - loadJsonText(jsonText); -} - -void GraphicsViewStyle::setStyle(QString jsonText) -{ - GraphicsViewStyle style(jsonText); - - StyleCollection::setGraphicsViewStyle(style); -} - -#ifdef STYLE_DEBUG -#define FLOW_VIEW_STYLE_CHECK_UNDEFINED_VALUE(v, variable) \ - { \ - if (v.type() == QJsonValue::Undefined || v.type() == QJsonValue::Null) \ - qWarning() << "Undefined value for parameter:" << #variable; \ - } -#else -#define FLOW_VIEW_STYLE_CHECK_UNDEFINED_VALUE(v, variable) -#endif - -#define FLOW_VIEW_STYLE_READ_COLOR(values, variable) \ - { \ - auto valueRef = values[#variable]; \ - FLOW_VIEW_STYLE_CHECK_UNDEFINED_VALUE(valueRef, variable) \ - if (valueRef.isArray()) { \ - auto colorArray = valueRef.toArray(); \ - std::vector rgb; \ - rgb.reserve(3); \ - for (auto it = colorArray.begin(); it != colorArray.end(); ++it) { \ - rgb.push_back((*it).toInt()); \ - } \ - variable = QColor(rgb[0], rgb[1], rgb[2]); \ - } else { \ - variable = QColor(valueRef.toString()); \ - } \ - } - -#define FLOW_VIEW_STYLE_WRITE_COLOR(values, variable) \ - { \ - values[#variable] = variable.name(); \ - } - -void GraphicsViewStyle::loadJson(QJsonObject const &json) -{ - QJsonValue nodeStyleValues = json["GraphicsViewStyle"]; - - QJsonObject obj = nodeStyleValues.toObject(); - - FLOW_VIEW_STYLE_READ_COLOR(obj, BackgroundColor); - FLOW_VIEW_STYLE_READ_COLOR(obj, FineGridColor); - FLOW_VIEW_STYLE_READ_COLOR(obj, CoarseGridColor); -} - -QJsonObject GraphicsViewStyle::toJson() const -{ - QJsonObject obj; - - FLOW_VIEW_STYLE_WRITE_COLOR(obj, BackgroundColor); - FLOW_VIEW_STYLE_WRITE_COLOR(obj, FineGridColor); - FLOW_VIEW_STYLE_WRITE_COLOR(obj, CoarseGridColor); - - QJsonObject root; - root["GraphicsViewStyle"] = obj; - - return root; -} diff --git a/story-editor-legacy/nodeeditor/src/NodeConnectionInteraction.cpp b/story-editor-legacy/nodeeditor/src/NodeConnectionInteraction.cpp deleted file mode 100644 index 9af05fc..0000000 --- a/story-editor-legacy/nodeeditor/src/NodeConnectionInteraction.cpp +++ /dev/null @@ -1,152 +0,0 @@ -#include "NodeConnectionInteraction.hpp" - -#include "AbstractNodeGeometry.hpp" -#include "BasicGraphicsScene.hpp" -#include "ConnectionGraphicsObject.hpp" -#include "ConnectionIdUtils.hpp" -#include "NodeGraphicsObject.hpp" -#include "UndoCommands.hpp" - -#include - -#include - -namespace QtNodes { - -NodeConnectionInteraction::NodeConnectionInteraction(NodeGraphicsObject &ngo, - ConnectionGraphicsObject &cgo, - BasicGraphicsScene &scene) - : _ngo(ngo) - , _cgo(cgo) - , _scene(scene) -{} - -bool NodeConnectionInteraction::canConnect(PortIndex *portIndex) const -{ - // 1. Connection requires a port. - - PortType requiredPort = _cgo.connectionState().requiredPort(); - - if (requiredPort == PortType::None) { - return false; - } - - NodeId connectedNodeId = getNodeId(oppositePort(requiredPort), _cgo.connectionId()); - - // 2. Forbid connecting the node to itself. - - if (_ngo.nodeId() == connectedNodeId) - return false; - - // 3. Connection loose end is above the node port. - - QPointF connectionPoint = _cgo.sceneTransform().map(_cgo.endPoint(requiredPort)); - - *portIndex = nodePortIndexUnderScenePoint(requiredPort, connectionPoint); - - if (*portIndex == InvalidPortIndex) { - return false; - } - - // 4. Model allows connection. - - AbstractGraphModel &model = _ngo.nodeScene()->graphModel(); - - ConnectionId connectionId = makeCompleteConnectionId(_cgo.connectionId(), // incomplete - _ngo.nodeId(), // missing node id - *portIndex); // missing port index - - return model.connectionPossible(connectionId); -} - -bool NodeConnectionInteraction::tryConnect() const -{ - // 1. Check conditions from 'canConnect'. - - PortIndex targetPortIndex = InvalidPortIndex; - if (!canConnect(&targetPortIndex)) { - return false; - } - - // 2. Create new connection. - - ConnectionId incompleteConnectionId = _cgo.connectionId(); - - ConnectionId newConnectionId = makeCompleteConnectionId(incompleteConnectionId, - _ngo.nodeId(), - targetPortIndex); - - _ngo.nodeScene()->resetDraftConnection(); - - _ngo.nodeScene()->undoStack().push(new ConnectCommand(_ngo.nodeScene(), newConnectionId)); - - return true; -} - -bool NodeConnectionInteraction::disconnect(PortType portToDisconnect) const -{ - ConnectionId connectionId = _cgo.connectionId(); - - _scene.undoStack().push(new DisconnectCommand(&_scene, connectionId)); - - AbstractNodeGeometry &geometry = _scene.nodeGeometry(); - - QPointF scenePos = geometry.portScenePosition(_ngo.nodeId(), - portToDisconnect, - getPortIndex(portToDisconnect, connectionId), - _ngo.sceneTransform()); - - // Converted to "draft" connection with the new incomplete id. - ConnectionId incompleteConnectionId = makeIncompleteConnectionId(connectionId, portToDisconnect); - - // Grabs the mouse - auto const &draftConnection = _scene.makeDraftConnection(incompleteConnectionId); - - QPointF const looseEndPos = draftConnection->mapFromScene(scenePos); - draftConnection->setEndPoint(portToDisconnect, looseEndPos); - - // Repaint connection points. - NodeId connectedNodeId = getNodeId(oppositePort(portToDisconnect), connectionId); - _scene.nodeGraphicsObject(connectedNodeId)->update(); - - NodeId disconnectedNodeId = getNodeId(portToDisconnect, connectionId); - _scene.nodeGraphicsObject(disconnectedNodeId)->update(); - - return true; -} - -// ------------------ util functions below - -PortType NodeConnectionInteraction::connectionRequiredPort() const -{ - auto const &state = _cgo.connectionState(); - - return state.requiredPort(); -} - -QPointF NodeConnectionInteraction::nodePortScenePosition(PortType portType, - PortIndex portIndex) const -{ - AbstractNodeGeometry &geometry = _scene.nodeGeometry(); - - QPointF p = geometry.portScenePosition(_ngo.nodeId(), - portType, - portIndex, - _ngo.sceneTransform()); - - return p; -} - -PortIndex NodeConnectionInteraction::nodePortIndexUnderScenePoint(PortType portType, - QPointF const &scenePoint) const -{ - AbstractNodeGeometry &geometry = _scene.nodeGeometry(); - - QTransform sceneTransform = _ngo.sceneTransform(); - - QPointF nodePoint = sceneTransform.inverted().map(scenePoint); - - return geometry.checkPortHit(_ngo.nodeId(), portType, nodePoint); -} - -} // namespace QtNodes diff --git a/story-editor-legacy/nodeeditor/src/NodeDelegateModel.cpp b/story-editor-legacy/nodeeditor/src/NodeDelegateModel.cpp deleted file mode 100644 index 94e47ad..0000000 --- a/story-editor-legacy/nodeeditor/src/NodeDelegateModel.cpp +++ /dev/null @@ -1,54 +0,0 @@ -#include "NodeDelegateModel.hpp" - -#include "StyleCollection.hpp" - -namespace QtNodes { - -NodeDelegateModel::NodeDelegateModel() - : _nodeStyle(StyleCollection::nodeStyle()) -{ - // Derived classes can initialize specific style here -} - -QJsonObject NodeDelegateModel::save() const -{ - QJsonObject modelJson; - - modelJson["model-name"] = name(); - - return modelJson; -} - -void NodeDelegateModel::load(QJsonObject const &) -{ - // -} - -ConnectionPolicy NodeDelegateModel::portConnectionPolicy(PortType portType, PortIndex) const -{ - auto result = ConnectionPolicy::One; - switch (portType) { - case PortType::In: - result = ConnectionPolicy::One; - break; - case PortType::Out: - result = ConnectionPolicy::Many; - break; - case PortType::None: - break; - } - - return result; -} - -NodeStyle const &NodeDelegateModel::nodeStyle() const -{ - return _nodeStyle; -} - -void NodeDelegateModel::setNodeStyle(NodeStyle const &style) -{ - _nodeStyle = style; -} - -} // namespace QtNodes diff --git a/story-editor-legacy/nodeeditor/src/NodeDelegateModelRegistry.cpp b/story-editor-legacy/nodeeditor/src/NodeDelegateModelRegistry.cpp deleted file mode 100644 index 11a1f84..0000000 --- a/story-editor-legacy/nodeeditor/src/NodeDelegateModelRegistry.cpp +++ /dev/null @@ -1,36 +0,0 @@ -#include "NodeDelegateModelRegistry.hpp" - -#include -#include - -using QtNodes::NodeDataType; -using QtNodes::NodeDelegateModel; -using QtNodes::NodeDelegateModelRegistry; - -std::unique_ptr NodeDelegateModelRegistry::create(QString const &modelName) -{ - auto it = _registeredItemCreators.find(modelName); - - if (it != _registeredItemCreators.end()) { - return it->second(); - } - - return nullptr; -} - -NodeDelegateModelRegistry::RegisteredModelCreatorsMap const & -NodeDelegateModelRegistry::registeredModelCreators() const -{ - return _registeredItemCreators; -} - -NodeDelegateModelRegistry::RegisteredModelsCategoryMap const & -NodeDelegateModelRegistry::registeredModelsCategoryAssociation() const -{ - return _registeredModelsCategory; -} - -NodeDelegateModelRegistry::CategoriesSet const &NodeDelegateModelRegistry::categories() const -{ - return _categories; -} diff --git a/story-editor-legacy/nodeeditor/src/NodeGraphicsObject.cpp b/story-editor-legacy/nodeeditor/src/NodeGraphicsObject.cpp deleted file mode 100644 index a25a4aa..0000000 --- a/story-editor-legacy/nodeeditor/src/NodeGraphicsObject.cpp +++ /dev/null @@ -1,364 +0,0 @@ -#include "NodeGraphicsObject.hpp" - -#include -#include - -#include -#include - -#include "AbstractGraphModel.hpp" -#include "AbstractNodeGeometry.hpp" -#include "AbstractNodePainter.hpp" -#include "BasicGraphicsScene.hpp" -#include "ConnectionGraphicsObject.hpp" -#include "ConnectionIdUtils.hpp" -#include "NodeConnectionInteraction.hpp" -#include "StyleCollection.hpp" -#include "UndoCommands.hpp" - -namespace QtNodes { - -NodeGraphicsObject::NodeGraphicsObject(BasicGraphicsScene &scene, NodeId nodeId) - : _nodeId(nodeId) - , _graphModel(scene.graphModel()) - , _nodeState(*this) - , _proxyWidget(nullptr) -{ - scene.addItem(this); - - setFlag(QGraphicsItem::ItemDoesntPropagateOpacityToChildren, true); - setFlag(QGraphicsItem::ItemIsFocusable, true); - - setLockedState(); - - setCacheMode(QGraphicsItem::DeviceCoordinateCache); - - QJsonObject nodeStyleJson = _graphModel.nodeData(_nodeId, NodeRole::Style).toJsonObject(); - - NodeStyle nodeStyle(nodeStyleJson); - - if (scene.isDropShadowEffectEnabled()) - { - auto effect = new QGraphicsDropShadowEffect; - effect->setOffset(4, 4); - effect->setBlurRadius(20); - effect->setColor(nodeStyle.ShadowColor); - - setGraphicsEffect(effect); - } - - setOpacity(nodeStyle.Opacity); - - setAcceptHoverEvents(true); - - setZValue(0); - - embedQWidget(); - - nodeScene()->nodeGeometry().recomputeSize(_nodeId); - - QPointF const pos = _graphModel.nodeData(_nodeId, NodeRole::Position); - - setPos(pos); - - connect(&_graphModel, &AbstractGraphModel::nodeFlagsUpdated, [this](NodeId const nodeId) { - if (_nodeId == nodeId) - setLockedState(); - }); -} - -AbstractGraphModel &NodeGraphicsObject::graphModel() const -{ - return _graphModel; -} - -BasicGraphicsScene *NodeGraphicsObject::nodeScene() const -{ - return dynamic_cast(scene()); -} - -void NodeGraphicsObject::embedQWidget() -{ - AbstractNodeGeometry &geometry = nodeScene()->nodeGeometry(); - geometry.recomputeSize(_nodeId); - - if (auto w = _graphModel.nodeData(_nodeId, NodeRole::Widget).value()) { - _proxyWidget = new QGraphicsProxyWidget(this); - - _proxyWidget->setWidget(w); - - _proxyWidget->setPreferredWidth(5); - - geometry.recomputeSize(_nodeId); - - if (w->sizePolicy().verticalPolicy() & QSizePolicy::ExpandFlag) { - unsigned int widgetHeight = geometry.size(_nodeId).height() - - geometry.captionRect(_nodeId).height(); - - // If the widget wants to use as much vertical space as possible, set - // it to have the geom's equivalentWidgetHeight. - _proxyWidget->setMinimumHeight(widgetHeight); - } - - _proxyWidget->setPos(geometry.widgetPosition(_nodeId)); - - //update(); - - _proxyWidget->setOpacity(1.0); - _proxyWidget->setFlag(QGraphicsItem::ItemIgnoresParentOpacity); - } -} - -void NodeGraphicsObject::setLockedState() -{ - NodeFlags flags = _graphModel.nodeFlags(_nodeId); - - bool const locked = flags.testFlag(NodeFlag::Locked); - - setFlag(QGraphicsItem::ItemIsMovable, !locked); - setFlag(QGraphicsItem::ItemIsSelectable, !locked); - setFlag(QGraphicsItem::ItemSendsScenePositionChanges, !locked); -} - -QRectF NodeGraphicsObject::boundingRect() const -{ - AbstractNodeGeometry &geometry = nodeScene()->nodeGeometry(); - return geometry.boundingRect(_nodeId); - //return NodeGeometry(_nodeId, _graphModel, nodeScene()).boundingRect(); -} - -void NodeGraphicsObject::setGeometryChanged() -{ - prepareGeometryChange(); -} - -void NodeGraphicsObject::moveConnections() const -{ - auto const &connected = _graphModel.allConnectionIds(_nodeId); - - for (auto &cnId : connected) { - auto cgo = nodeScene()->connectionGraphicsObject(cnId); - - if (cgo) - cgo->move(); - } -} - -void NodeGraphicsObject::reactToConnection(ConnectionGraphicsObject const *cgo) -{ - _nodeState.storeConnectionForReaction(cgo); - - update(); -} - -void NodeGraphicsObject::paint(QPainter *painter, QStyleOptionGraphicsItem const *option, QWidget *) -{ - painter->setClipRect(option->exposedRect); - - nodeScene()->nodePainter().paint(painter, *this); -} - -QVariant NodeGraphicsObject::itemChange(GraphicsItemChange change, const QVariant &value) -{ - if (change == ItemScenePositionHasChanged && scene()) { - moveConnections(); - } - - return QGraphicsObject::itemChange(change, value); -} - -void NodeGraphicsObject::mousePressEvent(QGraphicsSceneMouseEvent *event) -{ - //if (_nodeState.locked()) - //return; - - AbstractNodeGeometry &geometry = nodeScene()->nodeGeometry(); - - for (PortType portToCheck : {PortType::In, PortType::Out}) { - QPointF nodeCoord = sceneTransform().inverted().map(event->scenePos()); - - PortIndex const portIndex = geometry.checkPortHit(_nodeId, portToCheck, nodeCoord); - - if (portIndex == InvalidPortIndex) - continue; - - auto const &connected = _graphModel.connections(_nodeId, portToCheck, portIndex); - - // Start dragging existing connection. - if (!connected.empty() && portToCheck == PortType::In) { - auto const &cnId = *connected.begin(); - - // Need ConnectionGraphicsObject - - NodeConnectionInteraction interaction(*this, - *nodeScene()->connectionGraphicsObject(cnId), - *nodeScene()); - - if (_graphModel.detachPossible(cnId)) - interaction.disconnect(portToCheck); - } else // initialize new Connection - { - if (portToCheck == PortType::Out) { - auto const outPolicy = _graphModel - .portData(_nodeId, - portToCheck, - portIndex, - PortRole::ConnectionPolicyRole) - .value(); - - if (!connected.empty() && outPolicy == ConnectionPolicy::One) { - for (auto &cnId : connected) { - _graphModel.deleteConnection(cnId); - } - } - } // if port == out - - ConnectionId const incompleteConnectionId = makeIncompleteConnectionId(_nodeId, - portToCheck, - portIndex); - - nodeScene()->makeDraftConnection(incompleteConnectionId); - } - } - - if (_graphModel.nodeFlags(_nodeId) & NodeFlag::Resizable) { - auto pos = event->pos(); - bool const hit = geometry.resizeHandleRect(_nodeId).contains(QPoint(pos.x(), pos.y())); - _nodeState.setResizing(hit); - } - - QGraphicsObject::mousePressEvent(event); - - if (isSelected()) { - Q_EMIT nodeScene()->nodeSelected(_nodeId); - } -} - -void NodeGraphicsObject::mouseMoveEvent(QGraphicsSceneMouseEvent *event) -{ - // Deselect all other items after this one is selected. - // Unless we press a CTRL button to add the item to the selected group before - // starting moving. - if (!isSelected()) { - if (!event->modifiers().testFlag(Qt::ControlModifier)) - scene()->clearSelection(); - - setSelected(true); - } - - if (_nodeState.resizing()) { - auto diff = event->pos() - event->lastPos(); - - if (auto w = _graphModel.nodeData(_nodeId, NodeRole::Widget)) { - prepareGeometryChange(); - - auto oldSize = w->size(); - - oldSize += QSize(diff.x(), diff.y()); - - w->resize(oldSize); - - AbstractNodeGeometry &geometry = nodeScene()->nodeGeometry(); - - // Passes the new size to the model. - geometry.recomputeSize(_nodeId); - - update(); - - moveConnections(); - - event->accept(); - } - } else { - auto diff = event->pos() - event->lastPos(); - - nodeScene()->undoStack().push(new MoveNodeCommand(nodeScene(), diff)); - - event->accept(); - } - - QRectF r = nodeScene()->sceneRect(); - - r = r.united(mapToScene(boundingRect()).boundingRect()); - - nodeScene()->setSceneRect(r); -} - -void NodeGraphicsObject::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) -{ - _nodeState.setResizing(false); - - QGraphicsObject::mouseReleaseEvent(event); - - // position connections precisely after fast node move - moveConnections(); - - nodeScene()->nodeClicked(_nodeId); -} - -void NodeGraphicsObject::hoverEnterEvent(QGraphicsSceneHoverEvent *event) -{ - // bring all the colliding nodes to background - QList overlapItems = collidingItems(); - - for (QGraphicsItem *item : overlapItems) { - if (item->zValue() > 0.0) { - item->setZValue(0.0); - } - } - - // bring this node forward - setZValue(1.0); - - _nodeState.setHovered(true); - - update(); - - Q_EMIT nodeScene()->nodeHovered(_nodeId, event->screenPos()); - - event->accept(); -} - -void NodeGraphicsObject::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) -{ - _nodeState.setHovered(false); - - setZValue(0.0); - - update(); - - Q_EMIT nodeScene()->nodeHoverLeft(_nodeId); - - event->accept(); -} - -void NodeGraphicsObject::hoverMoveEvent(QGraphicsSceneHoverEvent *event) -{ - auto pos = event->pos(); - - //NodeGeometry geometry(_nodeId, _graphModel, nodeScene()); - AbstractNodeGeometry &geometry = nodeScene()->nodeGeometry(); - - if ((_graphModel.nodeFlags(_nodeId) | NodeFlag::Resizable) - && geometry.resizeHandleRect(_nodeId).contains(QPoint(pos.x(), pos.y()))) { - setCursor(QCursor(Qt::SizeFDiagCursor)); - } else { - setCursor(QCursor()); - } - - event->accept(); -} - -void NodeGraphicsObject::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) -{ - QGraphicsItem::mouseDoubleClickEvent(event); - - Q_EMIT nodeScene()->nodeDoubleClicked(_nodeId); -} - -void NodeGraphicsObject::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) -{ - Q_EMIT nodeScene()->nodeContextMenu(_nodeId, mapToScene(event->pos())); -} - -} // namespace QtNodes diff --git a/story-editor-legacy/nodeeditor/src/NodeState.cpp b/story-editor-legacy/nodeeditor/src/NodeState.cpp deleted file mode 100644 index f6ed43e..0000000 --- a/story-editor-legacy/nodeeditor/src/NodeState.cpp +++ /dev/null @@ -1,42 +0,0 @@ -#include "NodeState.hpp" - -#include "ConnectionGraphicsObject.hpp" -#include "NodeGraphicsObject.hpp" - -namespace QtNodes { - -NodeState::NodeState(NodeGraphicsObject &ngo) - : _ngo(ngo) - , _hovered(false) - , _resizing(false) - , _connectionForReaction{nullptr} -{ - Q_UNUSED(_ngo); -} - -void NodeState::setResizing(bool resizing) -{ - _resizing = resizing; -} - -bool NodeState::resizing() const -{ - return _resizing; -} - -ConnectionGraphicsObject const *NodeState::connectionForReaction() const -{ - return _connectionForReaction.data(); -} - -void NodeState::storeConnectionForReaction(ConnectionGraphicsObject const *cgo) -{ - _connectionForReaction = cgo; -} - -void NodeState::resetConnectionForReaction() -{ - _connectionForReaction.clear(); -} - -} // namespace QtNodes diff --git a/story-editor-legacy/nodeeditor/src/NodeStyle.cpp b/story-editor-legacy/nodeeditor/src/NodeStyle.cpp deleted file mode 100644 index a82bf8f..0000000 --- a/story-editor-legacy/nodeeditor/src/NodeStyle.cpp +++ /dev/null @@ -1,146 +0,0 @@ -#include "NodeStyle.hpp" - -#include - -#include -#include -#include - -#include - -#include "StyleCollection.hpp" - -using QtNodes::NodeStyle; - -inline void initResources() -{ - Q_INIT_RESOURCE(resources); -} - -NodeStyle::NodeStyle() -{ - // Explicit resources inialization for preventing the static initialization - // order fiasco: https://isocpp.org/wiki/faq/ctors#static-init-order - initResources(); - - // This configuration is stored inside the compiled unit and is loaded statically - loadJsonFile(":DefaultStyle.json"); -} - -NodeStyle::NodeStyle(QString jsonText) -{ - loadJsonText(jsonText); -} - -NodeStyle::NodeStyle(QJsonObject const &json) -{ - loadJson(json); -} - -void NodeStyle::setNodeStyle(QString jsonText) -{ - NodeStyle style(jsonText); - - StyleCollection::setNodeStyle(style); -} - -#ifdef STYLE_DEBUG -#define NODE_STYLE_CHECK_UNDEFINED_VALUE(v, variable) \ - { \ - if (v.type() == QJsonValue::Undefined || v.type() == QJsonValue::Null) \ - qWarning() << "Undefined value for parameter:" << #variable; \ - } -#else -#define NODE_STYLE_CHECK_UNDEFINED_VALUE(v, variable) -#endif - -#define NODE_STYLE_READ_COLOR(values, variable) \ - { \ - auto valueRef = values[#variable]; \ - NODE_STYLE_CHECK_UNDEFINED_VALUE(valueRef, variable) \ - if (valueRef.isArray()) { \ - auto colorArray = valueRef.toArray(); \ - std::vector rgb; \ - rgb.reserve(3); \ - for (auto it = colorArray.begin(); it != colorArray.end(); ++it) { \ - rgb.push_back((*it).toInt()); \ - } \ - variable = QColor(rgb[0], rgb[1], rgb[2]); \ - } else { \ - variable = QColor(valueRef.toString()); \ - } \ - } - -#define NODE_STYLE_WRITE_COLOR(values, variable) \ - { \ - values[#variable] = variable.name(); \ - } - -#define NODE_STYLE_READ_FLOAT(values, variable) \ - { \ - auto valueRef = values[#variable]; \ - NODE_STYLE_CHECK_UNDEFINED_VALUE(valueRef, variable) \ - variable = valueRef.toDouble(); \ - } - -#define NODE_STYLE_WRITE_FLOAT(values, variable) \ - { \ - values[#variable] = variable; \ - } - -void NodeStyle::loadJson(QJsonObject const &json) -{ - QJsonValue nodeStyleValues = json["NodeStyle"]; - - QJsonObject obj = nodeStyleValues.toObject(); - - NODE_STYLE_READ_COLOR(obj, NormalBoundaryColor); - NODE_STYLE_READ_COLOR(obj, SelectedBoundaryColor); - NODE_STYLE_READ_COLOR(obj, GradientColor0); - NODE_STYLE_READ_COLOR(obj, GradientColor1); - NODE_STYLE_READ_COLOR(obj, GradientColor2); - NODE_STYLE_READ_COLOR(obj, GradientColor3); - NODE_STYLE_READ_COLOR(obj, ShadowColor); - NODE_STYLE_READ_COLOR(obj, FontColor); - NODE_STYLE_READ_COLOR(obj, FontColorFaded); - NODE_STYLE_READ_COLOR(obj, ConnectionPointColor); - NODE_STYLE_READ_COLOR(obj, FilledConnectionPointColor); - NODE_STYLE_READ_COLOR(obj, WarningColor); - NODE_STYLE_READ_COLOR(obj, ErrorColor); - - NODE_STYLE_READ_FLOAT(obj, PenWidth); - NODE_STYLE_READ_FLOAT(obj, HoveredPenWidth); - NODE_STYLE_READ_FLOAT(obj, ConnectionPointDiameter); - - NODE_STYLE_READ_FLOAT(obj, Opacity); -} - -QJsonObject NodeStyle::toJson() const -{ - QJsonObject obj; - - NODE_STYLE_WRITE_COLOR(obj, NormalBoundaryColor); - NODE_STYLE_WRITE_COLOR(obj, SelectedBoundaryColor); - NODE_STYLE_WRITE_COLOR(obj, GradientColor0); - NODE_STYLE_WRITE_COLOR(obj, GradientColor1); - NODE_STYLE_WRITE_COLOR(obj, GradientColor2); - NODE_STYLE_WRITE_COLOR(obj, GradientColor3); - NODE_STYLE_WRITE_COLOR(obj, ShadowColor); - NODE_STYLE_WRITE_COLOR(obj, FontColor); - NODE_STYLE_WRITE_COLOR(obj, FontColorFaded); - NODE_STYLE_WRITE_COLOR(obj, ConnectionPointColor); - NODE_STYLE_WRITE_COLOR(obj, FilledConnectionPointColor); - NODE_STYLE_WRITE_COLOR(obj, WarningColor); - NODE_STYLE_WRITE_COLOR(obj, ErrorColor); - - NODE_STYLE_WRITE_FLOAT(obj, PenWidth); - NODE_STYLE_WRITE_FLOAT(obj, HoveredPenWidth); - NODE_STYLE_WRITE_FLOAT(obj, ConnectionPointDiameter); - - NODE_STYLE_WRITE_FLOAT(obj, Opacity); - - QJsonObject root; - root["NodeStyle"] = obj; - - return root; -} diff --git a/story-editor-legacy/nodeeditor/src/StyleCollection.cpp b/story-editor-legacy/nodeeditor/src/StyleCollection.cpp deleted file mode 100644 index c695728..0000000 --- a/story-editor-legacy/nodeeditor/src/StyleCollection.cpp +++ /dev/null @@ -1,43 +0,0 @@ -#include "StyleCollection.hpp" - -using QtNodes::ConnectionStyle; -using QtNodes::GraphicsViewStyle; -using QtNodes::NodeStyle; -using QtNodes::StyleCollection; - -NodeStyle const &StyleCollection::nodeStyle() -{ - return instance()._nodeStyle; -} - -ConnectionStyle const &StyleCollection::connectionStyle() -{ - return instance()._connectionStyle; -} - -GraphicsViewStyle const &StyleCollection::flowViewStyle() -{ - return instance()._flowViewStyle; -} - -void StyleCollection::setNodeStyle(NodeStyle nodeStyle) -{ - instance()._nodeStyle = nodeStyle; -} - -void StyleCollection::setConnectionStyle(ConnectionStyle connectionStyle) -{ - instance()._connectionStyle = connectionStyle; -} - -void StyleCollection::setGraphicsViewStyle(GraphicsViewStyle flowViewStyle) -{ - instance()._flowViewStyle = flowViewStyle; -} - -StyleCollection &StyleCollection::instance() -{ - static StyleCollection collection; - - return collection; -} diff --git a/story-editor-legacy/nodeeditor/src/UndoCommands.cpp b/story-editor-legacy/nodeeditor/src/UndoCommands.cpp deleted file mode 100644 index ea92812..0000000 --- a/story-editor-legacy/nodeeditor/src/UndoCommands.cpp +++ /dev/null @@ -1,464 +0,0 @@ -#include "UndoCommands.hpp" - -#include "BasicGraphicsScene.hpp" -#include "ConnectionGraphicsObject.hpp" -#include "ConnectionIdUtils.hpp" -#include "Definitions.hpp" -#include "NodeGraphicsObject.hpp" - -#include -#include -#include -#include -#include -#include - -#include - -namespace QtNodes { - -static QJsonObject serializeSelectedItems(BasicGraphicsScene *scene) -{ - QJsonObject serializedScene; - std::unordered_set selectedNodes; - - QJsonArray nodesJsonArray; - - for (QGraphicsItem *item : scene->selectedItems()) { - if (auto n = qgraphicsitem_cast(item)) { - - QJsonObject obj; - obj["id"] = static_cast(n->nodeId()); - nodesJsonArray.append(obj); - - selectedNodes.insert(n->nodeId()); - } - } - - QJsonArray connJsonArray; - - for (QGraphicsItem *item : scene->selectedItems()) { - if (auto c = qgraphicsitem_cast(item)) { - auto const &cid = c->connectionId(); - - if (selectedNodes.count(cid.outNodeId) > 0 && selectedNodes.count(cid.inNodeId) > 0) { - connJsonArray.append(toJson(cid)); - } - } - } - - serializedScene["nodes"] = nodesJsonArray; - serializedScene["connections"] = connJsonArray; - - return serializedScene; -} - -static void insertSerializedItems(QJsonObject const &json, BasicGraphicsScene *scene) -{ - AbstractGraphModel &graphModel = scene->graphModel(); - - QJsonArray const &nodesJsonArray = json["nodes"].toArray(); - - for (QJsonValue node : nodesJsonArray) { - QJsonObject obj = node.toObject(); - - graphModel.loadNode(obj); - - auto id = obj["id"].toInt(); - scene->nodeGraphicsObject(id)->setZValue(1.0); - scene->nodeGraphicsObject(id)->setSelected(true); - } - - QJsonArray const &connJsonArray = json["connections"].toArray(); - - for (QJsonValue connection : connJsonArray) { - QJsonObject connJson = connection.toObject(); - - ConnectionId connId = fromJson(connJson); - - // Restore the connection - graphModel.addConnection(connId); - - scene->connectionGraphicsObject(connId)->setSelected(true); - } -} - -static void deleteSerializedItems(QJsonObject &sceneJson, AbstractGraphModel &graphModel) -{ - QJsonArray connectionJsonArray = sceneJson["connections"].toArray(); - - for (QJsonValueRef connection : connectionJsonArray) { - QJsonObject connJson = connection.toObject(); - - ConnectionId connId = fromJson(connJson); - - graphModel.deleteConnection(connId); - } - - QJsonArray nodesJsonArray = sceneJson["nodes"].toArray(); - - for (QJsonValueRef node : nodesJsonArray) { - QJsonObject nodeJson = node.toObject(); - graphModel.deleteNode(nodeJson["id"].toInt()); - } -} - -static QPointF computeAverageNodePosition(QJsonObject const &sceneJson) -{ - QPointF averagePos(0, 0); - - QJsonArray nodesJsonArray = sceneJson["nodes"].toArray(); - - for (QJsonValueRef node : nodesJsonArray) { - QJsonObject nodeJson = node.toObject(); - - averagePos += QPointF(nodeJson["position"].toObject()["x"].toDouble(), - nodeJson["position"].toObject()["y"].toDouble()); - } - - averagePos /= static_cast(nodesJsonArray.size()); - - return averagePos; -} - -//------------------------------------- - -CreateCommand::CreateCommand(BasicGraphicsScene *scene, - QString const name, - QPointF const &mouseScenePos) - : _scene(scene) - , _sceneJson(QJsonObject()) -{ - _nodeId = _scene->graphModel().addNode(name); - if (_nodeId != InvalidNodeId) { - _scene->graphModel().setNodeData(_nodeId, NodeRole::Position, mouseScenePos); - } else { - setObsolete(true); - } -} - -void CreateCommand::undo() -{ - QJsonArray nodesJsonArray; - QJsonObject obj; - obj["id"] = static_cast(_scene->graphModel().nodeData(_nodeId, NodeRole::Id).toInt()); - nodesJsonArray.append(obj); - _sceneJson["nodes"] = nodesJsonArray; - _scene->graphModel().deleteNode(_nodeId); -} - -void CreateCommand::redo() -{ - if (_sceneJson.empty() || _sceneJson["nodes"].toArray().empty()) - return; - - insertSerializedItems(_sceneJson, _scene); -} - -//------------------------------------- - -DeleteCommand::DeleteCommand(BasicGraphicsScene *scene) - : _scene(scene) -{ - auto &graphModel = _scene->graphModel(); - - QJsonArray connJsonArray; - // Delete the selected connections first, ensuring that they won't be - // automatically deleted when selected nodes are deleted (deleting a - // node deletes some connections as well) - for (QGraphicsItem *item : _scene->selectedItems()) { - if (auto c = qgraphicsitem_cast(item)) { - auto const &cid = c->connectionId(); - - connJsonArray.append(toJson(cid)); - } - } - - QJsonArray nodesJsonArray; - // Delete the nodes; this will delete many of the connections. - // Selected connections were already deleted prior to this loop, - for (QGraphicsItem *item : _scene->selectedItems()) { - if (auto n = qgraphicsitem_cast(item)) { - // saving connections attached to the selected nodes - for (auto const &cid : graphModel.allConnectionIds(n->nodeId())) { - connJsonArray.append(toJson(cid)); - } - QJsonObject obj; - obj["id"] = static_cast(n->nodeId()); - nodesJsonArray.append(obj); - } - } - - // If nothing is deleted, cancel this operation - if (connJsonArray.isEmpty() && nodesJsonArray.isEmpty()) - setObsolete(true); - - _sceneJson["nodes"] = nodesJsonArray; - _sceneJson["connections"] = connJsonArray; -} - -void DeleteCommand::undo() -{ - insertSerializedItems(_sceneJson, _scene); -} - -void DeleteCommand::redo() -{ - deleteSerializedItems(_sceneJson, _scene->graphModel()); -} - -//------------------------------------- - -void offsetNodeGroup(QJsonObject &sceneJson, QPointF const &diff) -{ - QJsonArray nodesJsonArray = sceneJson["nodes"].toArray(); - - QJsonArray newNodesJsonArray; - for (QJsonValueRef node : nodesJsonArray) { - QJsonObject obj = node.toObject(); - - QPointF oldPos(obj["position"].toObject()["x"].toDouble(), - obj["position"].toObject()["y"].toDouble()); - - oldPos += diff; - - QJsonObject posJson; - posJson["x"] = oldPos.x(); - posJson["y"] = oldPos.y(); - obj["position"] = posJson; - - newNodesJsonArray.append(obj); - } - - sceneJson["nodes"] = newNodesJsonArray; -} - -//------------------------------------- - -CopyCommand::CopyCommand(BasicGraphicsScene *scene) -{ - QJsonObject sceneJson = serializeSelectedItems(scene); - - if (sceneJson.empty() || sceneJson["nodes"].toArray().empty()) { - setObsolete(true); - return; - } - - QClipboard *clipboard = QApplication::clipboard(); - - QByteArray const data = QJsonDocument(sceneJson).toJson(); - - QMimeData *mimeData = new QMimeData(); - mimeData->setData("application/qt-nodes-graph", data); - mimeData->setText(data); - - clipboard->setMimeData(mimeData); - - // Copy command does not have any effective redo/undo operations. - // It copies the data to the clipboard and could be immediately removed - // from the stack. - setObsolete(true); -} - -//------------------------------------- - -PasteCommand::PasteCommand(BasicGraphicsScene *scene, QPointF const &mouseScenePos) - : _scene(scene) - , _mouseScenePos(mouseScenePos) -{ - _newSceneJson = takeSceneJsonFromClipboard(); - - if (_newSceneJson.empty() || _newSceneJson["nodes"].toArray().empty()) { - setObsolete(true); - return; - } - - _newSceneJson = makeNewNodeIdsInScene(_newSceneJson); - - QPointF averagePos = computeAverageNodePosition(_newSceneJson); - - offsetNodeGroup(_newSceneJson, _mouseScenePos - averagePos); -} - -void PasteCommand::undo() -{ - deleteSerializedItems(_newSceneJson, _scene->graphModel()); -} - -void PasteCommand::redo() -{ - _scene->clearSelection(); - - // Ignore if pasted in content does not generate nodes. - try { - insertSerializedItems(_newSceneJson, _scene); - } catch (...) { - // If the paste does not work, delete all selected nodes and connections - // `deleteNode(...)` implicitly removed connections - auto &graphModel = _scene->graphModel(); - - QJsonArray nodesJsonArray; - for (QGraphicsItem *item : _scene->selectedItems()) { - if (auto n = qgraphicsitem_cast(item)) { - graphModel.deleteNode(n->nodeId()); - } - } - - setObsolete(true); - } -} - -QJsonObject PasteCommand::takeSceneJsonFromClipboard() -{ - QClipboard const *clipboard = QApplication::clipboard(); - QMimeData const *mimeData = clipboard->mimeData(); - - QJsonDocument json; - if (mimeData->hasFormat("application/qt-nodes-graph")) { - json = QJsonDocument::fromJson(mimeData->data("application/qt-nodes-graph")); - } else if (mimeData->hasText()) { - json = QJsonDocument::fromJson(mimeData->text().toUtf8()); - } - - return json.object(); -} - -QJsonObject PasteCommand::makeNewNodeIdsInScene(QJsonObject const &sceneJson) -{ - AbstractGraphModel &graphModel = _scene->graphModel(); - - std::unordered_map mapNodeIds; - - QJsonArray nodesJsonArray = sceneJson["nodes"].toArray(); - - QJsonArray newNodesJsonArray; - for (QJsonValueRef node : nodesJsonArray) { - QJsonObject nodeJson = node.toObject(); - - NodeId oldNodeId = nodeJson["id"].toInt(); - - NodeId newNodeId = graphModel.newNodeId(); - - mapNodeIds[oldNodeId] = newNodeId; - - // Replace NodeId in json - nodeJson["id"] = static_cast(newNodeId); - - newNodesJsonArray.append(nodeJson); - } - - QJsonArray connectionJsonArray = sceneJson["connections"].toArray(); - - QJsonArray newConnJsonArray; - for (QJsonValueRef connection : connectionJsonArray) { - QJsonObject connJson = connection.toObject(); - - ConnectionId connId = fromJson(connJson); - - ConnectionId newConnId{mapNodeIds[connId.outNodeId], - connId.outPortIndex, - mapNodeIds[connId.inNodeId], - connId.inPortIndex}; - - newConnJsonArray.append(toJson(newConnId)); - } - - QJsonObject newSceneJson; - - newSceneJson["nodes"] = newNodesJsonArray; - newSceneJson["connections"] = newConnJsonArray; - - return newSceneJson; -} - -//------------------------------------- - -DisconnectCommand::DisconnectCommand(BasicGraphicsScene *scene, ConnectionId const connId) - : _scene(scene) - , _connId(connId) -{ - // -} - -void DisconnectCommand::undo() -{ - _scene->graphModel().addConnection(_connId); -} - -void DisconnectCommand::redo() -{ - _scene->graphModel().deleteConnection(_connId); -} - -//------ - -ConnectCommand::ConnectCommand(BasicGraphicsScene *scene, ConnectionId const connId) - : _scene(scene) - , _connId(connId) -{ - // -} - -void ConnectCommand::undo() -{ - _scene->graphModel().deleteConnection(_connId); -} - -void ConnectCommand::redo() -{ - _scene->graphModel().addConnection(_connId); -} - -//------ - -MoveNodeCommand::MoveNodeCommand(BasicGraphicsScene *scene, QPointF const &diff) - : _scene(scene) - , _diff(diff) -{ - _selectedNodes.clear(); - for (QGraphicsItem *item : _scene->selectedItems()) { - if (auto n = qgraphicsitem_cast(item)) { - _selectedNodes.insert(n->nodeId()); - } - } -} - -void MoveNodeCommand::undo() -{ - for (auto nodeId : _selectedNodes) { - auto oldPos = _scene->graphModel().nodeData(nodeId, NodeRole::Position).value(); - - oldPos -= _diff; - - _scene->graphModel().setNodeData(nodeId, NodeRole::Position, oldPos); - } -} - -void MoveNodeCommand::redo() -{ - for (auto nodeId : _selectedNodes) { - auto oldPos = _scene->graphModel().nodeData(nodeId, NodeRole::Position).value(); - - oldPos += _diff; - - _scene->graphModel().setNodeData(nodeId, NodeRole::Position, oldPos); - } -} - -int MoveNodeCommand::id() const -{ - return static_cast(typeid(MoveNodeCommand).hash_code()); -} - -bool MoveNodeCommand::mergeWith(QUndoCommand const *c) -{ - auto mc = static_cast(c); - - if (_selectedNodes == mc->_selectedNodes) { - _diff += mc->_diff; - return true; - } - return false; -} - -} // namespace QtNodes diff --git a/story-editor-legacy/nodeeditor/src/locateNode.cpp b/story-editor-legacy/nodeeditor/src/locateNode.cpp deleted file mode 100644 index ddba099..0000000 --- a/story-editor-legacy/nodeeditor/src/locateNode.cpp +++ /dev/null @@ -1,42 +0,0 @@ -#include "locateNode.hpp" - -#include - -#include -#include - -#include "NodeGraphicsObject.hpp" - -namespace QtNodes { - -NodeGraphicsObject *locateNodeAt(QPointF scenePoint, - QGraphicsScene &scene, - QTransform const &viewTransform) -{ - // items under cursor - QList items = scene.items(scenePoint, - Qt::IntersectsItemShape, - Qt::DescendingOrder, - viewTransform); - - // items convertable to NodeGraphicsObject - std::vector filteredItems; - - std::copy_if(items.begin(), - items.end(), - std::back_inserter(filteredItems), - [](QGraphicsItem *item) { - return (qgraphicsitem_cast(item) != nullptr); - }); - - NodeGraphicsObject *node = nullptr; - - if (!filteredItems.empty()) { - QGraphicsItem *graphicsItem = filteredItems.front(); - node = dynamic_cast(graphicsItem); - } - - return node; -} - -} // namespace QtNodes diff --git a/story-editor-legacy/nsis-installer.nsi b/story-editor-legacy/nsis-installer.nsi deleted file mode 100644 index 7330313..0000000 --- a/story-editor-legacy/nsis-installer.nsi +++ /dev/null @@ -1,53 +0,0 @@ -# define installer name -!define APPNAME "StoryEditor" -!define COMPANYNAME "OpenStoryTeller" -!define DESCRIPTION "A story editor using graphical nodes, for the OpenStoryTeller project. http://openstoryteller.org" - -!define VERSIONMAJOR 1 -!define VERSIONMINOR 3 -!define VERSIONBUILD 4 -OutFile "build/story-editor-setup.exe" - -# set desktop as install directory -InstallDir "$PROGRAMFILES64\${APPNAME}" -Name "${COMPANYNAME} - ${APPNAME}" - -# default section start -Section - -# define output path -SetOutPath $INSTDIR - -# specify file to go in output path -File /r "build/story-editor\*" -File "story-editor-logo.ico" - -# define uninstaller name -WriteUninstaller $INSTDIR\uninstaller.exe - -# Create shortcut -SetShellVarContext all -CreateDirectory "$SMPROGRAMS\${COMPANYNAME}" -CreateShortCut "$SMPROGRAMS\${COMPANYNAME}\${APPNAME}.lnk" "$INSTDIR\story-editor.exe" "" "$INSTDIR\story-editor-logo.ico" -SetShellVarContext current - - -#------- -# default section end -SectionEnd - -# create a section to define what the uninstaller does. -# the section will always be named "Uninstall" -Section "Uninstall" - -# Always delete uninstaller first -Delete $INSTDIR\uninstaller.exe -Delete "$SMPROGRAMS\${COMPANYNAME}\${APPNAME}.lnk" -Delete $INSTDIR\story-editor-logo.ico - -# now delete installed file -Delete $INSTDIR\* - -# Delete the directory -RMDir /r $INSTDIR -SectionEnd diff --git a/story-editor-legacy/ost_convert/CMakeLists.txt b/story-editor-legacy/ost_convert/CMakeLists.txt deleted file mode 100644 index eb91a3a..0000000 --- a/story-editor-legacy/ost_convert/CMakeLists.txt +++ /dev/null @@ -1,29 +0,0 @@ -cmake_minimum_required(VERSION 3.5) - -set(PROJECT_NAME ost-convert) -project(${PROJECT_NAME} LANGUAGES CXX C) - -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED ON) - -#========================================================================================================================= -# INCLUDES -#========================================================================================================================= -set(OST_CONVERT_ROOT ${CMAKE_CURRENT_SOURCE_DIR}) -set(OST_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/..) - -set(OST_CONVERT_INCLUDES - ${OST_ROOT}/common -) - -#========================================================================================================================= -# SOURCES -#========================================================================================================================= - - -#========================================================================================================================= -# TARGET -#========================================================================================================================= - -add_executable(${PROJECT_NAME} main.cpp ni_parser.c pack_archive.cpp zip.cpp miniz.c command_line.cpp) -target_include_directories(${PROJECT_NAME} PUBLIC ${OST_CONVERT_INCLUDES}) diff --git a/story-editor-legacy/ost_convert/command_line.cpp b/story-editor-legacy/ost_convert/command_line.cpp deleted file mode 100644 index 4588429..0000000 --- a/story-editor-legacy/ost_convert/command_line.cpp +++ /dev/null @@ -1,151 +0,0 @@ -#include "command_line.h" - -#include -#include - -CommandLine::CommandLine(std::string description) - : mDescription(std::move(description)) { -} - -void CommandLine::addArgument(std::vector const& flags, - Value const& value, std::string const& help) { - mArguments.emplace_back(Argument{flags, value, help}); -} - -void CommandLine::printHelp(std::ostream& os) const { - - // Print the general description. - os << mDescription << std::endl; - - // Find the argument with the longest combined flag length (in order - // to align the help messages). - - uint32_t maxFlagLength = 0; - - for (auto const& argument : mArguments) { - uint32_t flagLength = 0; - for (auto const& flag : argument.mFlags) { - // Plus comma and space. - flagLength += static_cast(flag.size()) + 2; - } - - maxFlagLength = std::max(maxFlagLength, flagLength); - } - - // Now print each argument. - for (auto const& argument : mArguments) { - - std::string flags; - for (auto const& flag : argument.mFlags) { - flags += flag + ", "; - } - - // Remove last comma and space and add padding according to the - // longest flags in order to align the help messages. - std::stringstream sstr; - sstr << std::left << std::setw(maxFlagLength) - << flags.substr(0, flags.size() - 2); - - // Print the help for each argument. This is a bit more involved - // since we do line wrapping for long descriptions. - size_t spacePos = 0; - size_t lineWidth = 0; - while (spacePos != std::string::npos) { - size_t nextspacePos = argument.mHelp.find_first_of(' ', spacePos + 1); - sstr << argument.mHelp.substr(spacePos, nextspacePos - spacePos); - lineWidth += nextspacePos - spacePos; - spacePos = nextspacePos; - - if (lineWidth > 60) { - os << sstr.str() << std::endl; - sstr = std::stringstream(); - sstr << std::left << std::setw(maxFlagLength - 1) << " "; - lineWidth = 0; - } - } - } -} - -void CommandLine::parse(int argc, char* argv[]) const { - - // Skip the first argument (name of the program). - int i = 1; - while (i < argc) { - - // First we have to identify wether the value is separated by a space - // or a '='. - std::string flag(argv[i]); - std::string value; - bool valueIsSeparate = false; - - // If there is an '=' in the flag, the part after the '=' is actually - // the value. - size_t equalPos = flag.find('='); - if (equalPos != std::string::npos) { - value = flag.substr(equalPos + 1); - flag = flag.substr(0, equalPos); - } - // Else the following argument is the value. - else if (i + 1 < argc) { - value = argv[i + 1]; - valueIsSeparate = true; - } - - // Search for an argument with the provided flag. - bool foundArgument = false; - - for (auto const& argument : mArguments) { - if (std::find(argument.mFlags.begin(), argument.mFlags.end(), flag) - != std::end(argument.mFlags)) { - - foundArgument = true; - - // In the case of booleans, there must not be a value present. - // So if the value is neither 'true' nor 'false' it is considered - // to be the next argument. - if (std::holds_alternative(argument.mValue)) { - if (!value.empty() && value != "true" && value != "false") { - valueIsSeparate = false; - } - *std::get(argument.mValue) = (value != "false"); - } - // In all other cases there must be a value. - else if (value.empty()) { - throw std::runtime_error( - "Failed to parse command line arguments: " - "Missing value for argument \"" + flag + "\"!"); - } - // For a std::string, we take the entire value. - else if (std::holds_alternative(argument.mValue)) { - *std::get(argument.mValue) = value; - } - // In all other cases we use a std::stringstream to - // convert the value. - else { - std::visit( - [&value](auto&& arg) { - std::stringstream sstr(value); - sstr >> *arg; - }, - argument.mValue); - } - - break; - } - } - - // Print a warning if there was an unknown argument. - if (!foundArgument) { - std::cerr << "Ignoring unknown command line argument \"" << flag - << "\"." << std::endl; - } - - // Advance to the next flag. - ++i; - - // If the value was separated, we have to advance our index once more. - if (foundArgument && valueIsSeparate) { - ++i; - } - } -} diff --git a/story-editor-legacy/ost_convert/command_line.h b/story-editor-legacy/ost_convert/command_line.h deleted file mode 100644 index 3e31bd3..0000000 --- a/story-editor-legacy/ost_convert/command_line.h +++ /dev/null @@ -1,80 +0,0 @@ -#ifndef COMMAND_LINE_HPP -#define COMMAND_LINE_HPP - -#include -#include -#include -#include - -// License: Public Domain -// original author: Simon Schneegans https://schneegans.github.io/tutorials/2019/08/06/commandline - -// This class is a simple and effective class to parse command line arguments. -// For each possible argument it stores a pointer to a variable. When the -// corresponding argument is set on the command line (given to the parse() -// method) the variable is set to the given value. If the option is not set, -// the variable is not touched. Hence it should be initialized to a default -// state. -// For each argument, several names (aliases) can be defined. Thus, the same -// boolean could be set via '--help' or '-h'. While not required, it is a good -// practice to precede the argument names with either '--' or '-'. Except for -// booleans, a value is expected to be given. Booleans are set to 'true' if no -// value is provided (that means they can be used as simple flags as in the -// '--help' case). Values can be given in two ways: Either the option name and -// the value should be separated by a space or by a '='. Here are some valid -// examples: -// --string="Foo Bar" -// --string "Foo Bar" -// --help -// --help=false -// --help true - -class CommandLine { - public: - - // These are the possible variables the options may point to. Bool and - // std::string are handled in a special way, all other values are parsed - // with a std::stringstream. This std::variant can be easily extended if - // the stream operator>> is overloaded. If not, you have to add a special - // case to the parse() method. - typedef std::variant Value; - - // The description is printed as part of the help message. - explicit CommandLine(std::string description); - - // Adds a possible option. A typical call would be like this: - // bool printHelp = false; - // cmd.addArgument({"--help", "-h"}, &printHelp, "Print this help message"); - // Then, after parse() has been called, printHelp will be true if the user - // provided the flag. - void addArgument(std::vector const& flags, - Value const& value, std::string const& help); - - // Prints the description given to the constructor and the help - // for each option. - void printHelp(std::ostream& os = std::cout) const; - - // The command line arguments are traversed from start to end. That means, - // if an option is set multiple times, the last will be the one which is - // finally used. This call will throw a std::runtime_error if a value is - // missing for a given option. Unknown flags will cause a warning on - // std::cerr. - void parse(int argc, char* argv[]) const; - - private: - struct Argument { - std::vector mFlags; - Value mValue; - std::string mHelp; - }; - - std::string mDescription; - std::vector mArguments; -}; - -#endif // COMMAND_LINE_HPP diff --git a/story-editor-legacy/ost_convert/json.hpp b/story-editor-legacy/ost_convert/json.hpp deleted file mode 100644 index 4d1a37a..0000000 --- a/story-editor-legacy/ost_convert/json.hpp +++ /dev/null @@ -1,24596 +0,0 @@ -// __ _____ _____ _____ -// __| | __| | | | JSON for Modern C++ -// | | |__ | | | | | | version 3.11.2 -// |_____|_____|_____|_|___| https://github.com/nlohmann/json -// -// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann -// SPDX-License-Identifier: MIT - -/****************************************************************************\ - * Note on documentation: The source files contain links to the online * - * documentation of the public API at https://json.nlohmann.me. This URL * - * contains the most recent documentation and should also be applicable to * - * previous versions; documentation for deprecated functions is not * - * removed, but marked deprecated. See "Generate documentation" section in * - * file docs/README.md. * -\****************************************************************************/ - -#ifndef INCLUDE_NLOHMANN_JSON_HPP_ -#define INCLUDE_NLOHMANN_JSON_HPP_ - -#include // all_of, find, for_each -#include // nullptr_t, ptrdiff_t, size_t -#include // hash, less -#include // initializer_list -#ifndef JSON_NO_IO - #include // istream, ostream -#endif // JSON_NO_IO -#include // random_access_iterator_tag -#include // unique_ptr -#include // accumulate -#include // string, stoi, to_string -#include // declval, forward, move, pair, swap -#include // vector - -// #include -// __ _____ _____ _____ -// __| | __| | | | JSON for Modern C++ -// | | |__ | | | | | | version 3.11.2 -// |_____|_____|_____|_|___| https://github.com/nlohmann/json -// -// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann -// SPDX-License-Identifier: MIT - - - -#include - -// #include -// __ _____ _____ _____ -// __| | __| | | | JSON for Modern C++ -// | | |__ | | | | | | version 3.11.2 -// |_____|_____|_____|_|___| https://github.com/nlohmann/json -// -// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann -// SPDX-License-Identifier: MIT - - - -// This file contains all macro definitions affecting or depending on the ABI - -#ifndef JSON_SKIP_LIBRARY_VERSION_CHECK - #if defined(NLOHMANN_JSON_VERSION_MAJOR) && defined(NLOHMANN_JSON_VERSION_MINOR) && defined(NLOHMANN_JSON_VERSION_PATCH) - #if NLOHMANN_JSON_VERSION_MAJOR != 3 || NLOHMANN_JSON_VERSION_MINOR != 11 || NLOHMANN_JSON_VERSION_PATCH != 2 - #warning "Already included a different version of the library!" - #endif - #endif -#endif - -#define NLOHMANN_JSON_VERSION_MAJOR 3 // NOLINT(modernize-macro-to-enum) -#define NLOHMANN_JSON_VERSION_MINOR 11 // NOLINT(modernize-macro-to-enum) -#define NLOHMANN_JSON_VERSION_PATCH 2 // NOLINT(modernize-macro-to-enum) - -#ifndef JSON_DIAGNOSTICS - #define JSON_DIAGNOSTICS 0 -#endif - -#ifndef JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON - #define JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON 0 -#endif - -#if JSON_DIAGNOSTICS - #define NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS _diag -#else - #define NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS -#endif - -#if JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON - #define NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON _ldvcmp -#else - #define NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON -#endif - -#ifndef NLOHMANN_JSON_NAMESPACE_NO_VERSION - #define NLOHMANN_JSON_NAMESPACE_NO_VERSION 0 -#endif - -// Construct the namespace ABI tags component -#define NLOHMANN_JSON_ABI_TAGS_CONCAT_EX(a, b) json_abi ## a ## b -#define NLOHMANN_JSON_ABI_TAGS_CONCAT(a, b) \ - NLOHMANN_JSON_ABI_TAGS_CONCAT_EX(a, b) - -#define NLOHMANN_JSON_ABI_TAGS \ - NLOHMANN_JSON_ABI_TAGS_CONCAT( \ - NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS, \ - NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON) - -// Construct the namespace version component -#define NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT_EX(major, minor, patch) \ - _v ## major ## _ ## minor ## _ ## patch -#define NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT(major, minor, patch) \ - NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT_EX(major, minor, patch) - -#if NLOHMANN_JSON_NAMESPACE_NO_VERSION -#define NLOHMANN_JSON_NAMESPACE_VERSION -#else -#define NLOHMANN_JSON_NAMESPACE_VERSION \ - NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT(NLOHMANN_JSON_VERSION_MAJOR, \ - NLOHMANN_JSON_VERSION_MINOR, \ - NLOHMANN_JSON_VERSION_PATCH) -#endif - -// Combine namespace components -#define NLOHMANN_JSON_NAMESPACE_CONCAT_EX(a, b) a ## b -#define NLOHMANN_JSON_NAMESPACE_CONCAT(a, b) \ - NLOHMANN_JSON_NAMESPACE_CONCAT_EX(a, b) - -#ifndef NLOHMANN_JSON_NAMESPACE -#define NLOHMANN_JSON_NAMESPACE \ - nlohmann::NLOHMANN_JSON_NAMESPACE_CONCAT( \ - NLOHMANN_JSON_ABI_TAGS, \ - NLOHMANN_JSON_NAMESPACE_VERSION) -#endif - -#ifndef NLOHMANN_JSON_NAMESPACE_BEGIN -#define NLOHMANN_JSON_NAMESPACE_BEGIN \ - namespace nlohmann \ - { \ - inline namespace NLOHMANN_JSON_NAMESPACE_CONCAT( \ - NLOHMANN_JSON_ABI_TAGS, \ - NLOHMANN_JSON_NAMESPACE_VERSION) \ - { -#endif - -#ifndef NLOHMANN_JSON_NAMESPACE_END -#define NLOHMANN_JSON_NAMESPACE_END \ - } /* namespace (inline namespace) NOLINT(readability/namespace) */ \ - } // namespace nlohmann -#endif - -// #include -// __ _____ _____ _____ -// __| | __| | | | JSON for Modern C++ -// | | |__ | | | | | | version 3.11.2 -// |_____|_____|_____|_|___| https://github.com/nlohmann/json -// -// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann -// SPDX-License-Identifier: MIT - - - -#include // transform -#include // array -#include // forward_list -#include // inserter, front_inserter, end -#include // map -#include // string -#include // tuple, make_tuple -#include // is_arithmetic, is_same, is_enum, underlying_type, is_convertible -#include // unordered_map -#include // pair, declval -#include // valarray - -// #include -// __ _____ _____ _____ -// __| | __| | | | JSON for Modern C++ -// | | |__ | | | | | | version 3.11.2 -// |_____|_____|_____|_|___| https://github.com/nlohmann/json -// -// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann -// SPDX-License-Identifier: MIT - - - -#include // nullptr_t -#include // exception -#include // runtime_error -#include // to_string -#include // vector - -// #include -// __ _____ _____ _____ -// __| | __| | | | JSON for Modern C++ -// | | |__ | | | | | | version 3.11.2 -// |_____|_____|_____|_|___| https://github.com/nlohmann/json -// -// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann -// SPDX-License-Identifier: MIT - - - -#include // array -#include // size_t -#include // uint8_t -#include // string - -// #include -// __ _____ _____ _____ -// __| | __| | | | JSON for Modern C++ -// | | |__ | | | | | | version 3.11.2 -// |_____|_____|_____|_|___| https://github.com/nlohmann/json -// -// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann -// SPDX-License-Identifier: MIT - - - -#include // declval, pair -// #include -// __ _____ _____ _____ -// __| | __| | | | JSON for Modern C++ -// | | |__ | | | | | | version 3.11.2 -// |_____|_____|_____|_|___| https://github.com/nlohmann/json -// -// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann -// SPDX-License-Identifier: MIT - - - -#include - -// #include -// __ _____ _____ _____ -// __| | __| | | | JSON for Modern C++ -// | | |__ | | | | | | version 3.11.2 -// |_____|_____|_____|_|___| https://github.com/nlohmann/json -// -// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann -// SPDX-License-Identifier: MIT - - - -// #include - - -NLOHMANN_JSON_NAMESPACE_BEGIN -namespace detail -{ - -template struct make_void -{ - using type = void; -}; -template using void_t = typename make_void::type; - -} // namespace detail -NLOHMANN_JSON_NAMESPACE_END - - -NLOHMANN_JSON_NAMESPACE_BEGIN -namespace detail -{ - -// https://en.cppreference.com/w/cpp/experimental/is_detected -struct nonesuch -{ - nonesuch() = delete; - ~nonesuch() = delete; - nonesuch(nonesuch const&) = delete; - nonesuch(nonesuch const&&) = delete; - void operator=(nonesuch const&) = delete; - void operator=(nonesuch&&) = delete; -}; - -template class Op, - class... Args> -struct detector -{ - using value_t = std::false_type; - using type = Default; -}; - -template class Op, class... Args> -struct detector>, Op, Args...> -{ - using value_t = std::true_type; - using type = Op; -}; - -template class Op, class... Args> -using is_detected = typename detector::value_t; - -template class Op, class... Args> -struct is_detected_lazy : is_detected { }; - -template class Op, class... Args> -using detected_t = typename detector::type; - -template class Op, class... Args> -using detected_or = detector; - -template class Op, class... Args> -using detected_or_t = typename detected_or::type; - -template class Op, class... Args> -using is_detected_exact = std::is_same>; - -template class Op, class... Args> -using is_detected_convertible = - std::is_convertible, To>; - -} // namespace detail -NLOHMANN_JSON_NAMESPACE_END - -// #include - - -// __ _____ _____ _____ -// __| | __| | | | JSON for Modern C++ -// | | |__ | | | | | | version 3.11.2 -// |_____|_____|_____|_|___| https://github.com/nlohmann/json -// -// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann -// SPDX-FileCopyrightText: 2016-2021 Evan Nemerson -// SPDX-License-Identifier: MIT - -/* Hedley - https://nemequ.github.io/hedley - * Created by Evan Nemerson - */ - -#if !defined(JSON_HEDLEY_VERSION) || (JSON_HEDLEY_VERSION < 15) -#if defined(JSON_HEDLEY_VERSION) - #undef JSON_HEDLEY_VERSION -#endif -#define JSON_HEDLEY_VERSION 15 - -#if defined(JSON_HEDLEY_STRINGIFY_EX) - #undef JSON_HEDLEY_STRINGIFY_EX -#endif -#define JSON_HEDLEY_STRINGIFY_EX(x) #x - -#if defined(JSON_HEDLEY_STRINGIFY) - #undef JSON_HEDLEY_STRINGIFY -#endif -#define JSON_HEDLEY_STRINGIFY(x) JSON_HEDLEY_STRINGIFY_EX(x) - -#if defined(JSON_HEDLEY_CONCAT_EX) - #undef JSON_HEDLEY_CONCAT_EX -#endif -#define JSON_HEDLEY_CONCAT_EX(a,b) a##b - -#if defined(JSON_HEDLEY_CONCAT) - #undef JSON_HEDLEY_CONCAT -#endif -#define JSON_HEDLEY_CONCAT(a,b) JSON_HEDLEY_CONCAT_EX(a,b) - -#if defined(JSON_HEDLEY_CONCAT3_EX) - #undef JSON_HEDLEY_CONCAT3_EX -#endif -#define JSON_HEDLEY_CONCAT3_EX(a,b,c) a##b##c - -#if defined(JSON_HEDLEY_CONCAT3) - #undef JSON_HEDLEY_CONCAT3 -#endif -#define JSON_HEDLEY_CONCAT3(a,b,c) JSON_HEDLEY_CONCAT3_EX(a,b,c) - -#if defined(JSON_HEDLEY_VERSION_ENCODE) - #undef JSON_HEDLEY_VERSION_ENCODE -#endif -#define JSON_HEDLEY_VERSION_ENCODE(major,minor,revision) (((major) * 1000000) + ((minor) * 1000) + (revision)) - -#if defined(JSON_HEDLEY_VERSION_DECODE_MAJOR) - #undef JSON_HEDLEY_VERSION_DECODE_MAJOR -#endif -#define JSON_HEDLEY_VERSION_DECODE_MAJOR(version) ((version) / 1000000) - -#if defined(JSON_HEDLEY_VERSION_DECODE_MINOR) - #undef JSON_HEDLEY_VERSION_DECODE_MINOR -#endif -#define JSON_HEDLEY_VERSION_DECODE_MINOR(version) (((version) % 1000000) / 1000) - -#if defined(JSON_HEDLEY_VERSION_DECODE_REVISION) - #undef JSON_HEDLEY_VERSION_DECODE_REVISION -#endif -#define JSON_HEDLEY_VERSION_DECODE_REVISION(version) ((version) % 1000) - -#if defined(JSON_HEDLEY_GNUC_VERSION) - #undef JSON_HEDLEY_GNUC_VERSION -#endif -#if defined(__GNUC__) && defined(__GNUC_PATCHLEVEL__) - #define JSON_HEDLEY_GNUC_VERSION JSON_HEDLEY_VERSION_ENCODE(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__) -#elif defined(__GNUC__) - #define JSON_HEDLEY_GNUC_VERSION JSON_HEDLEY_VERSION_ENCODE(__GNUC__, __GNUC_MINOR__, 0) -#endif - -#if defined(JSON_HEDLEY_GNUC_VERSION_CHECK) - #undef JSON_HEDLEY_GNUC_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_GNUC_VERSION) - #define JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_GNUC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else - #define JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_MSVC_VERSION) - #undef JSON_HEDLEY_MSVC_VERSION -#endif -#if defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 140000000) && !defined(__ICL) - #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_FULL_VER / 10000000, (_MSC_FULL_VER % 10000000) / 100000, (_MSC_FULL_VER % 100000) / 100) -#elif defined(_MSC_FULL_VER) && !defined(__ICL) - #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_FULL_VER / 1000000, (_MSC_FULL_VER % 1000000) / 10000, (_MSC_FULL_VER % 10000) / 10) -#elif defined(_MSC_VER) && !defined(__ICL) - #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_VER / 100, _MSC_VER % 100, 0) -#endif - -#if defined(JSON_HEDLEY_MSVC_VERSION_CHECK) - #undef JSON_HEDLEY_MSVC_VERSION_CHECK -#endif -#if !defined(JSON_HEDLEY_MSVC_VERSION) - #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (0) -#elif defined(_MSC_VER) && (_MSC_VER >= 1400) - #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_FULL_VER >= ((major * 10000000) + (minor * 100000) + (patch))) -#elif defined(_MSC_VER) && (_MSC_VER >= 1200) - #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_FULL_VER >= ((major * 1000000) + (minor * 10000) + (patch))) -#else - #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_VER >= ((major * 100) + (minor))) -#endif - -#if defined(JSON_HEDLEY_INTEL_VERSION) - #undef JSON_HEDLEY_INTEL_VERSION -#endif -#if defined(__INTEL_COMPILER) && defined(__INTEL_COMPILER_UPDATE) && !defined(__ICL) - #define JSON_HEDLEY_INTEL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, __INTEL_COMPILER_UPDATE) -#elif defined(__INTEL_COMPILER) && !defined(__ICL) - #define JSON_HEDLEY_INTEL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, 0) -#endif - -#if defined(JSON_HEDLEY_INTEL_VERSION_CHECK) - #undef JSON_HEDLEY_INTEL_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_INTEL_VERSION) - #define JSON_HEDLEY_INTEL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_INTEL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else - #define JSON_HEDLEY_INTEL_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_INTEL_CL_VERSION) - #undef JSON_HEDLEY_INTEL_CL_VERSION -#endif -#if defined(__INTEL_COMPILER) && defined(__INTEL_COMPILER_UPDATE) && defined(__ICL) - #define JSON_HEDLEY_INTEL_CL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER, __INTEL_COMPILER_UPDATE, 0) -#endif - -#if defined(JSON_HEDLEY_INTEL_CL_VERSION_CHECK) - #undef JSON_HEDLEY_INTEL_CL_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_INTEL_CL_VERSION) - #define JSON_HEDLEY_INTEL_CL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_INTEL_CL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else - #define JSON_HEDLEY_INTEL_CL_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_PGI_VERSION) - #undef JSON_HEDLEY_PGI_VERSION -#endif -#if defined(__PGI) && defined(__PGIC__) && defined(__PGIC_MINOR__) && defined(__PGIC_PATCHLEVEL__) - #define JSON_HEDLEY_PGI_VERSION JSON_HEDLEY_VERSION_ENCODE(__PGIC__, __PGIC_MINOR__, __PGIC_PATCHLEVEL__) -#endif - -#if defined(JSON_HEDLEY_PGI_VERSION_CHECK) - #undef JSON_HEDLEY_PGI_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_PGI_VERSION) - #define JSON_HEDLEY_PGI_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_PGI_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else - #define JSON_HEDLEY_PGI_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_SUNPRO_VERSION) - #undef JSON_HEDLEY_SUNPRO_VERSION -#endif -#if defined(__SUNPRO_C) && (__SUNPRO_C > 0x1000) - #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((((__SUNPRO_C >> 16) & 0xf) * 10) + ((__SUNPRO_C >> 12) & 0xf), (((__SUNPRO_C >> 8) & 0xf) * 10) + ((__SUNPRO_C >> 4) & 0xf), (__SUNPRO_C & 0xf) * 10) -#elif defined(__SUNPRO_C) - #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((__SUNPRO_C >> 8) & 0xf, (__SUNPRO_C >> 4) & 0xf, (__SUNPRO_C) & 0xf) -#elif defined(__SUNPRO_CC) && (__SUNPRO_CC > 0x1000) - #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((((__SUNPRO_CC >> 16) & 0xf) * 10) + ((__SUNPRO_CC >> 12) & 0xf), (((__SUNPRO_CC >> 8) & 0xf) * 10) + ((__SUNPRO_CC >> 4) & 0xf), (__SUNPRO_CC & 0xf) * 10) -#elif defined(__SUNPRO_CC) - #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((__SUNPRO_CC >> 8) & 0xf, (__SUNPRO_CC >> 4) & 0xf, (__SUNPRO_CC) & 0xf) -#endif - -#if defined(JSON_HEDLEY_SUNPRO_VERSION_CHECK) - #undef JSON_HEDLEY_SUNPRO_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_SUNPRO_VERSION) - #define JSON_HEDLEY_SUNPRO_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_SUNPRO_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else - #define JSON_HEDLEY_SUNPRO_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION) - #undef JSON_HEDLEY_EMSCRIPTEN_VERSION -#endif -#if defined(__EMSCRIPTEN__) - #define JSON_HEDLEY_EMSCRIPTEN_VERSION JSON_HEDLEY_VERSION_ENCODE(__EMSCRIPTEN_major__, __EMSCRIPTEN_minor__, __EMSCRIPTEN_tiny__) -#endif - -#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK) - #undef JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION) - #define JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_EMSCRIPTEN_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else - #define JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_ARM_VERSION) - #undef JSON_HEDLEY_ARM_VERSION -#endif -#if defined(__CC_ARM) && defined(__ARMCOMPILER_VERSION) - #define JSON_HEDLEY_ARM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ARMCOMPILER_VERSION / 1000000, (__ARMCOMPILER_VERSION % 1000000) / 10000, (__ARMCOMPILER_VERSION % 10000) / 100) -#elif defined(__CC_ARM) && defined(__ARMCC_VERSION) - #define JSON_HEDLEY_ARM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ARMCC_VERSION / 1000000, (__ARMCC_VERSION % 1000000) / 10000, (__ARMCC_VERSION % 10000) / 100) -#endif - -#if defined(JSON_HEDLEY_ARM_VERSION_CHECK) - #undef JSON_HEDLEY_ARM_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_ARM_VERSION) - #define JSON_HEDLEY_ARM_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_ARM_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else - #define JSON_HEDLEY_ARM_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_IBM_VERSION) - #undef JSON_HEDLEY_IBM_VERSION -#endif -#if defined(__ibmxl__) - #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ibmxl_version__, __ibmxl_release__, __ibmxl_modification__) -#elif defined(__xlC__) && defined(__xlC_ver__) - #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__xlC__ >> 8, __xlC__ & 0xff, (__xlC_ver__ >> 8) & 0xff) -#elif defined(__xlC__) - #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__xlC__ >> 8, __xlC__ & 0xff, 0) -#endif - -#if defined(JSON_HEDLEY_IBM_VERSION_CHECK) - #undef JSON_HEDLEY_IBM_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_IBM_VERSION) - #define JSON_HEDLEY_IBM_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_IBM_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else - #define JSON_HEDLEY_IBM_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_TI_VERSION) - #undef JSON_HEDLEY_TI_VERSION -#endif -#if \ - defined(__TI_COMPILER_VERSION__) && \ - ( \ - defined(__TMS470__) || defined(__TI_ARM__) || \ - defined(__MSP430__) || \ - defined(__TMS320C2000__) \ - ) -#if (__TI_COMPILER_VERSION__ >= 16000000) - #define JSON_HEDLEY_TI_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) -#endif -#endif - -#if defined(JSON_HEDLEY_TI_VERSION_CHECK) - #undef JSON_HEDLEY_TI_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_TI_VERSION) - #define JSON_HEDLEY_TI_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else - #define JSON_HEDLEY_TI_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_TI_CL2000_VERSION) - #undef JSON_HEDLEY_TI_CL2000_VERSION -#endif -#if defined(__TI_COMPILER_VERSION__) && defined(__TMS320C2000__) - #define JSON_HEDLEY_TI_CL2000_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) -#endif - -#if defined(JSON_HEDLEY_TI_CL2000_VERSION_CHECK) - #undef JSON_HEDLEY_TI_CL2000_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_TI_CL2000_VERSION) - #define JSON_HEDLEY_TI_CL2000_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL2000_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else - #define JSON_HEDLEY_TI_CL2000_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_TI_CL430_VERSION) - #undef JSON_HEDLEY_TI_CL430_VERSION -#endif -#if defined(__TI_COMPILER_VERSION__) && defined(__MSP430__) - #define JSON_HEDLEY_TI_CL430_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) -#endif - -#if defined(JSON_HEDLEY_TI_CL430_VERSION_CHECK) - #undef JSON_HEDLEY_TI_CL430_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_TI_CL430_VERSION) - #define JSON_HEDLEY_TI_CL430_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL430_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else - #define JSON_HEDLEY_TI_CL430_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_TI_ARMCL_VERSION) - #undef JSON_HEDLEY_TI_ARMCL_VERSION -#endif -#if defined(__TI_COMPILER_VERSION__) && (defined(__TMS470__) || defined(__TI_ARM__)) - #define JSON_HEDLEY_TI_ARMCL_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) -#endif - -#if defined(JSON_HEDLEY_TI_ARMCL_VERSION_CHECK) - #undef JSON_HEDLEY_TI_ARMCL_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_TI_ARMCL_VERSION) - #define JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_ARMCL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else - #define JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_TI_CL6X_VERSION) - #undef JSON_HEDLEY_TI_CL6X_VERSION -#endif -#if defined(__TI_COMPILER_VERSION__) && defined(__TMS320C6X__) - #define JSON_HEDLEY_TI_CL6X_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) -#endif - -#if defined(JSON_HEDLEY_TI_CL6X_VERSION_CHECK) - #undef JSON_HEDLEY_TI_CL6X_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_TI_CL6X_VERSION) - #define JSON_HEDLEY_TI_CL6X_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL6X_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else - #define JSON_HEDLEY_TI_CL6X_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_TI_CL7X_VERSION) - #undef JSON_HEDLEY_TI_CL7X_VERSION -#endif -#if defined(__TI_COMPILER_VERSION__) && defined(__C7000__) - #define JSON_HEDLEY_TI_CL7X_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) -#endif - -#if defined(JSON_HEDLEY_TI_CL7X_VERSION_CHECK) - #undef JSON_HEDLEY_TI_CL7X_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_TI_CL7X_VERSION) - #define JSON_HEDLEY_TI_CL7X_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL7X_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else - #define JSON_HEDLEY_TI_CL7X_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_TI_CLPRU_VERSION) - #undef JSON_HEDLEY_TI_CLPRU_VERSION -#endif -#if defined(__TI_COMPILER_VERSION__) && defined(__PRU__) - #define JSON_HEDLEY_TI_CLPRU_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) -#endif - -#if defined(JSON_HEDLEY_TI_CLPRU_VERSION_CHECK) - #undef JSON_HEDLEY_TI_CLPRU_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_TI_CLPRU_VERSION) - #define JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CLPRU_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else - #define JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_CRAY_VERSION) - #undef JSON_HEDLEY_CRAY_VERSION -#endif -#if defined(_CRAYC) - #if defined(_RELEASE_PATCHLEVEL) - #define JSON_HEDLEY_CRAY_VERSION JSON_HEDLEY_VERSION_ENCODE(_RELEASE_MAJOR, _RELEASE_MINOR, _RELEASE_PATCHLEVEL) - #else - #define JSON_HEDLEY_CRAY_VERSION JSON_HEDLEY_VERSION_ENCODE(_RELEASE_MAJOR, _RELEASE_MINOR, 0) - #endif -#endif - -#if defined(JSON_HEDLEY_CRAY_VERSION_CHECK) - #undef JSON_HEDLEY_CRAY_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_CRAY_VERSION) - #define JSON_HEDLEY_CRAY_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_CRAY_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else - #define JSON_HEDLEY_CRAY_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_IAR_VERSION) - #undef JSON_HEDLEY_IAR_VERSION -#endif -#if defined(__IAR_SYSTEMS_ICC__) - #if __VER__ > 1000 - #define JSON_HEDLEY_IAR_VERSION JSON_HEDLEY_VERSION_ENCODE((__VER__ / 1000000), ((__VER__ / 1000) % 1000), (__VER__ % 1000)) - #else - #define JSON_HEDLEY_IAR_VERSION JSON_HEDLEY_VERSION_ENCODE(__VER__ / 100, __VER__ % 100, 0) - #endif -#endif - -#if defined(JSON_HEDLEY_IAR_VERSION_CHECK) - #undef JSON_HEDLEY_IAR_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_IAR_VERSION) - #define JSON_HEDLEY_IAR_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_IAR_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else - #define JSON_HEDLEY_IAR_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_TINYC_VERSION) - #undef JSON_HEDLEY_TINYC_VERSION -#endif -#if defined(__TINYC__) - #define JSON_HEDLEY_TINYC_VERSION JSON_HEDLEY_VERSION_ENCODE(__TINYC__ / 1000, (__TINYC__ / 100) % 10, __TINYC__ % 100) -#endif - -#if defined(JSON_HEDLEY_TINYC_VERSION_CHECK) - #undef JSON_HEDLEY_TINYC_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_TINYC_VERSION) - #define JSON_HEDLEY_TINYC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TINYC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else - #define JSON_HEDLEY_TINYC_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_DMC_VERSION) - #undef JSON_HEDLEY_DMC_VERSION -#endif -#if defined(__DMC__) - #define JSON_HEDLEY_DMC_VERSION JSON_HEDLEY_VERSION_ENCODE(__DMC__ >> 8, (__DMC__ >> 4) & 0xf, __DMC__ & 0xf) -#endif - -#if defined(JSON_HEDLEY_DMC_VERSION_CHECK) - #undef JSON_HEDLEY_DMC_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_DMC_VERSION) - #define JSON_HEDLEY_DMC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_DMC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else - #define JSON_HEDLEY_DMC_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_COMPCERT_VERSION) - #undef JSON_HEDLEY_COMPCERT_VERSION -#endif -#if defined(__COMPCERT_VERSION__) - #define JSON_HEDLEY_COMPCERT_VERSION JSON_HEDLEY_VERSION_ENCODE(__COMPCERT_VERSION__ / 10000, (__COMPCERT_VERSION__ / 100) % 100, __COMPCERT_VERSION__ % 100) -#endif - -#if defined(JSON_HEDLEY_COMPCERT_VERSION_CHECK) - #undef JSON_HEDLEY_COMPCERT_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_COMPCERT_VERSION) - #define JSON_HEDLEY_COMPCERT_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_COMPCERT_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else - #define JSON_HEDLEY_COMPCERT_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_PELLES_VERSION) - #undef JSON_HEDLEY_PELLES_VERSION -#endif -#if defined(__POCC__) - #define JSON_HEDLEY_PELLES_VERSION JSON_HEDLEY_VERSION_ENCODE(__POCC__ / 100, __POCC__ % 100, 0) -#endif - -#if defined(JSON_HEDLEY_PELLES_VERSION_CHECK) - #undef JSON_HEDLEY_PELLES_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_PELLES_VERSION) - #define JSON_HEDLEY_PELLES_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_PELLES_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else - #define JSON_HEDLEY_PELLES_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_MCST_LCC_VERSION) - #undef JSON_HEDLEY_MCST_LCC_VERSION -#endif -#if defined(__LCC__) && defined(__LCC_MINOR__) - #define JSON_HEDLEY_MCST_LCC_VERSION JSON_HEDLEY_VERSION_ENCODE(__LCC__ / 100, __LCC__ % 100, __LCC_MINOR__) -#endif - -#if defined(JSON_HEDLEY_MCST_LCC_VERSION_CHECK) - #undef JSON_HEDLEY_MCST_LCC_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_MCST_LCC_VERSION) - #define JSON_HEDLEY_MCST_LCC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_MCST_LCC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else - #define JSON_HEDLEY_MCST_LCC_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_GCC_VERSION) - #undef JSON_HEDLEY_GCC_VERSION -#endif -#if \ - defined(JSON_HEDLEY_GNUC_VERSION) && \ - !defined(__clang__) && \ - !defined(JSON_HEDLEY_INTEL_VERSION) && \ - !defined(JSON_HEDLEY_PGI_VERSION) && \ - !defined(JSON_HEDLEY_ARM_VERSION) && \ - !defined(JSON_HEDLEY_CRAY_VERSION) && \ - !defined(JSON_HEDLEY_TI_VERSION) && \ - !defined(JSON_HEDLEY_TI_ARMCL_VERSION) && \ - !defined(JSON_HEDLEY_TI_CL430_VERSION) && \ - !defined(JSON_HEDLEY_TI_CL2000_VERSION) && \ - !defined(JSON_HEDLEY_TI_CL6X_VERSION) && \ - !defined(JSON_HEDLEY_TI_CL7X_VERSION) && \ - !defined(JSON_HEDLEY_TI_CLPRU_VERSION) && \ - !defined(__COMPCERT__) && \ - !defined(JSON_HEDLEY_MCST_LCC_VERSION) - #define JSON_HEDLEY_GCC_VERSION JSON_HEDLEY_GNUC_VERSION -#endif - -#if defined(JSON_HEDLEY_GCC_VERSION_CHECK) - #undef JSON_HEDLEY_GCC_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_GCC_VERSION) - #define JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_GCC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else - #define JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_HAS_ATTRIBUTE) - #undef JSON_HEDLEY_HAS_ATTRIBUTE -#endif -#if \ - defined(__has_attribute) && \ - ( \ - (!defined(JSON_HEDLEY_IAR_VERSION) || JSON_HEDLEY_IAR_VERSION_CHECK(8,5,9)) \ - ) -# define JSON_HEDLEY_HAS_ATTRIBUTE(attribute) __has_attribute(attribute) -#else -# define JSON_HEDLEY_HAS_ATTRIBUTE(attribute) (0) -#endif - -#if defined(JSON_HEDLEY_GNUC_HAS_ATTRIBUTE) - #undef JSON_HEDLEY_GNUC_HAS_ATTRIBUTE -#endif -#if defined(__has_attribute) - #define JSON_HEDLEY_GNUC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_HAS_ATTRIBUTE(attribute) -#else - #define JSON_HEDLEY_GNUC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) -#endif - -#if defined(JSON_HEDLEY_GCC_HAS_ATTRIBUTE) - #undef JSON_HEDLEY_GCC_HAS_ATTRIBUTE -#endif -#if defined(__has_attribute) - #define JSON_HEDLEY_GCC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_HAS_ATTRIBUTE(attribute) -#else - #define JSON_HEDLEY_GCC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) -#endif - -#if defined(JSON_HEDLEY_HAS_CPP_ATTRIBUTE) - #undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE -#endif -#if \ - defined(__has_cpp_attribute) && \ - defined(__cplusplus) && \ - (!defined(JSON_HEDLEY_SUNPRO_VERSION) || JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0)) - #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) __has_cpp_attribute(attribute) -#else - #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) (0) -#endif - -#if defined(JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS) - #undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS -#endif -#if !defined(__cplusplus) || !defined(__has_cpp_attribute) - #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) (0) -#elif \ - !defined(JSON_HEDLEY_PGI_VERSION) && \ - !defined(JSON_HEDLEY_IAR_VERSION) && \ - (!defined(JSON_HEDLEY_SUNPRO_VERSION) || JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0)) && \ - (!defined(JSON_HEDLEY_MSVC_VERSION) || JSON_HEDLEY_MSVC_VERSION_CHECK(19,20,0)) - #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) JSON_HEDLEY_HAS_CPP_ATTRIBUTE(ns::attribute) -#else - #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) (0) -#endif - -#if defined(JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE) - #undef JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE -#endif -#if defined(__has_cpp_attribute) && defined(__cplusplus) - #define JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) __has_cpp_attribute(attribute) -#else - #define JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) -#endif - -#if defined(JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE) - #undef JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE -#endif -#if defined(__has_cpp_attribute) && defined(__cplusplus) - #define JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) __has_cpp_attribute(attribute) -#else - #define JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) -#endif - -#if defined(JSON_HEDLEY_HAS_BUILTIN) - #undef JSON_HEDLEY_HAS_BUILTIN -#endif -#if defined(__has_builtin) - #define JSON_HEDLEY_HAS_BUILTIN(builtin) __has_builtin(builtin) -#else - #define JSON_HEDLEY_HAS_BUILTIN(builtin) (0) -#endif - -#if defined(JSON_HEDLEY_GNUC_HAS_BUILTIN) - #undef JSON_HEDLEY_GNUC_HAS_BUILTIN -#endif -#if defined(__has_builtin) - #define JSON_HEDLEY_GNUC_HAS_BUILTIN(builtin,major,minor,patch) __has_builtin(builtin) -#else - #define JSON_HEDLEY_GNUC_HAS_BUILTIN(builtin,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) -#endif - -#if defined(JSON_HEDLEY_GCC_HAS_BUILTIN) - #undef JSON_HEDLEY_GCC_HAS_BUILTIN -#endif -#if defined(__has_builtin) - #define JSON_HEDLEY_GCC_HAS_BUILTIN(builtin,major,minor,patch) __has_builtin(builtin) -#else - #define JSON_HEDLEY_GCC_HAS_BUILTIN(builtin,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) -#endif - -#if defined(JSON_HEDLEY_HAS_FEATURE) - #undef JSON_HEDLEY_HAS_FEATURE -#endif -#if defined(__has_feature) - #define JSON_HEDLEY_HAS_FEATURE(feature) __has_feature(feature) -#else - #define JSON_HEDLEY_HAS_FEATURE(feature) (0) -#endif - -#if defined(JSON_HEDLEY_GNUC_HAS_FEATURE) - #undef JSON_HEDLEY_GNUC_HAS_FEATURE -#endif -#if defined(__has_feature) - #define JSON_HEDLEY_GNUC_HAS_FEATURE(feature,major,minor,patch) __has_feature(feature) -#else - #define JSON_HEDLEY_GNUC_HAS_FEATURE(feature,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) -#endif - -#if defined(JSON_HEDLEY_GCC_HAS_FEATURE) - #undef JSON_HEDLEY_GCC_HAS_FEATURE -#endif -#if defined(__has_feature) - #define JSON_HEDLEY_GCC_HAS_FEATURE(feature,major,minor,patch) __has_feature(feature) -#else - #define JSON_HEDLEY_GCC_HAS_FEATURE(feature,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) -#endif - -#if defined(JSON_HEDLEY_HAS_EXTENSION) - #undef JSON_HEDLEY_HAS_EXTENSION -#endif -#if defined(__has_extension) - #define JSON_HEDLEY_HAS_EXTENSION(extension) __has_extension(extension) -#else - #define JSON_HEDLEY_HAS_EXTENSION(extension) (0) -#endif - -#if defined(JSON_HEDLEY_GNUC_HAS_EXTENSION) - #undef JSON_HEDLEY_GNUC_HAS_EXTENSION -#endif -#if defined(__has_extension) - #define JSON_HEDLEY_GNUC_HAS_EXTENSION(extension,major,minor,patch) __has_extension(extension) -#else - #define JSON_HEDLEY_GNUC_HAS_EXTENSION(extension,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) -#endif - -#if defined(JSON_HEDLEY_GCC_HAS_EXTENSION) - #undef JSON_HEDLEY_GCC_HAS_EXTENSION -#endif -#if defined(__has_extension) - #define JSON_HEDLEY_GCC_HAS_EXTENSION(extension,major,minor,patch) __has_extension(extension) -#else - #define JSON_HEDLEY_GCC_HAS_EXTENSION(extension,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) -#endif - -#if defined(JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE) - #undef JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE -#endif -#if defined(__has_declspec_attribute) - #define JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) __has_declspec_attribute(attribute) -#else - #define JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) (0) -#endif - -#if defined(JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE) - #undef JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE -#endif -#if defined(__has_declspec_attribute) - #define JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) __has_declspec_attribute(attribute) -#else - #define JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) -#endif - -#if defined(JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE) - #undef JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE -#endif -#if defined(__has_declspec_attribute) - #define JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) __has_declspec_attribute(attribute) -#else - #define JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) -#endif - -#if defined(JSON_HEDLEY_HAS_WARNING) - #undef JSON_HEDLEY_HAS_WARNING -#endif -#if defined(__has_warning) - #define JSON_HEDLEY_HAS_WARNING(warning) __has_warning(warning) -#else - #define JSON_HEDLEY_HAS_WARNING(warning) (0) -#endif - -#if defined(JSON_HEDLEY_GNUC_HAS_WARNING) - #undef JSON_HEDLEY_GNUC_HAS_WARNING -#endif -#if defined(__has_warning) - #define JSON_HEDLEY_GNUC_HAS_WARNING(warning,major,minor,patch) __has_warning(warning) -#else - #define JSON_HEDLEY_GNUC_HAS_WARNING(warning,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) -#endif - -#if defined(JSON_HEDLEY_GCC_HAS_WARNING) - #undef JSON_HEDLEY_GCC_HAS_WARNING -#endif -#if defined(__has_warning) - #define JSON_HEDLEY_GCC_HAS_WARNING(warning,major,minor,patch) __has_warning(warning) -#else - #define JSON_HEDLEY_GCC_HAS_WARNING(warning,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) -#endif - -#if \ - (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || \ - defined(__clang__) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) || \ - JSON_HEDLEY_PGI_VERSION_CHECK(18,4,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ - JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ - JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,7,0) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(2,0,1) || \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,1,0) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,0,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ - JSON_HEDLEY_CRAY_VERSION_CHECK(5,0,0) || \ - JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,17) || \ - JSON_HEDLEY_SUNPRO_VERSION_CHECK(8,0,0) || \ - (JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) && defined(__C99_PRAGMA_OPERATOR)) - #define JSON_HEDLEY_PRAGMA(value) _Pragma(#value) -#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) - #define JSON_HEDLEY_PRAGMA(value) __pragma(value) -#else - #define JSON_HEDLEY_PRAGMA(value) -#endif - -#if defined(JSON_HEDLEY_DIAGNOSTIC_PUSH) - #undef JSON_HEDLEY_DIAGNOSTIC_PUSH -#endif -#if defined(JSON_HEDLEY_DIAGNOSTIC_POP) - #undef JSON_HEDLEY_DIAGNOSTIC_POP -#endif -#if defined(__clang__) - #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("clang diagnostic push") - #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("clang diagnostic pop") -#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) - #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("warning(push)") - #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("warning(pop)") -#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0) - #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("GCC diagnostic push") - #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("GCC diagnostic pop") -#elif \ - JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) || \ - JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) - #define JSON_HEDLEY_DIAGNOSTIC_PUSH __pragma(warning(push)) - #define JSON_HEDLEY_DIAGNOSTIC_POP __pragma(warning(pop)) -#elif JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) - #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("push") - #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("pop") -#elif \ - JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ - JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,4,0) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,1,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) - #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("diag_push") - #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("diag_pop") -#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,90,0) - #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("warning(push)") - #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("warning(pop)") -#else - #define JSON_HEDLEY_DIAGNOSTIC_PUSH - #define JSON_HEDLEY_DIAGNOSTIC_POP -#endif - -/* JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_ is for - HEDLEY INTERNAL USE ONLY. API subject to change without notice. */ -#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_) - #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_ -#endif -#if defined(__cplusplus) -# if JSON_HEDLEY_HAS_WARNING("-Wc++98-compat") -# if JSON_HEDLEY_HAS_WARNING("-Wc++17-extensions") -# if JSON_HEDLEY_HAS_WARNING("-Wc++1z-extensions") -# define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \ - JSON_HEDLEY_DIAGNOSTIC_PUSH \ - _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \ - _Pragma("clang diagnostic ignored \"-Wc++17-extensions\"") \ - _Pragma("clang diagnostic ignored \"-Wc++1z-extensions\"") \ - xpr \ - JSON_HEDLEY_DIAGNOSTIC_POP -# else -# define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \ - JSON_HEDLEY_DIAGNOSTIC_PUSH \ - _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \ - _Pragma("clang diagnostic ignored \"-Wc++17-extensions\"") \ - xpr \ - JSON_HEDLEY_DIAGNOSTIC_POP -# endif -# else -# define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \ - JSON_HEDLEY_DIAGNOSTIC_PUSH \ - _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \ - xpr \ - JSON_HEDLEY_DIAGNOSTIC_POP -# endif -# endif -#endif -#if !defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(x) x -#endif - -#if defined(JSON_HEDLEY_CONST_CAST) - #undef JSON_HEDLEY_CONST_CAST -#endif -#if defined(__cplusplus) -# define JSON_HEDLEY_CONST_CAST(T, expr) (const_cast(expr)) -#elif \ - JSON_HEDLEY_HAS_WARNING("-Wcast-qual") || \ - JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) -# define JSON_HEDLEY_CONST_CAST(T, expr) (__extension__ ({ \ - JSON_HEDLEY_DIAGNOSTIC_PUSH \ - JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL \ - ((T) (expr)); \ - JSON_HEDLEY_DIAGNOSTIC_POP \ - })) -#else -# define JSON_HEDLEY_CONST_CAST(T, expr) ((T) (expr)) -#endif - -#if defined(JSON_HEDLEY_REINTERPRET_CAST) - #undef JSON_HEDLEY_REINTERPRET_CAST -#endif -#if defined(__cplusplus) - #define JSON_HEDLEY_REINTERPRET_CAST(T, expr) (reinterpret_cast(expr)) -#else - #define JSON_HEDLEY_REINTERPRET_CAST(T, expr) ((T) (expr)) -#endif - -#if defined(JSON_HEDLEY_STATIC_CAST) - #undef JSON_HEDLEY_STATIC_CAST -#endif -#if defined(__cplusplus) - #define JSON_HEDLEY_STATIC_CAST(T, expr) (static_cast(expr)) -#else - #define JSON_HEDLEY_STATIC_CAST(T, expr) ((T) (expr)) -#endif - -#if defined(JSON_HEDLEY_CPP_CAST) - #undef JSON_HEDLEY_CPP_CAST -#endif -#if defined(__cplusplus) -# if JSON_HEDLEY_HAS_WARNING("-Wold-style-cast") -# define JSON_HEDLEY_CPP_CAST(T, expr) \ - JSON_HEDLEY_DIAGNOSTIC_PUSH \ - _Pragma("clang diagnostic ignored \"-Wold-style-cast\"") \ - ((T) (expr)) \ - JSON_HEDLEY_DIAGNOSTIC_POP -# elif JSON_HEDLEY_IAR_VERSION_CHECK(8,3,0) -# define JSON_HEDLEY_CPP_CAST(T, expr) \ - JSON_HEDLEY_DIAGNOSTIC_PUSH \ - _Pragma("diag_suppress=Pe137") \ - JSON_HEDLEY_DIAGNOSTIC_POP -# else -# define JSON_HEDLEY_CPP_CAST(T, expr) ((T) (expr)) -# endif -#else -# define JSON_HEDLEY_CPP_CAST(T, expr) (expr) -#endif - -#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED) - #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED -#endif -#if JSON_HEDLEY_HAS_WARNING("-Wdeprecated-declarations") - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"") -#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("warning(disable:1478 1786)") -#elif JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED __pragma(warning(disable:1478 1786)) -#elif JSON_HEDLEY_PGI_VERSION_CHECK(20,7,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1215,1216,1444,1445") -#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1215,1444") -#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") -#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED __pragma(warning(disable:4996)) -#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1215,1444") -#elif \ - JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ - (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ - (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ - (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ - (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1291,1718") -#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) && !defined(__cplusplus) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("error_messages(off,E_DEPRECATED_ATT,E_DEPRECATED_ATT_MESS)") -#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) && defined(__cplusplus) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("error_messages(off,symdeprecated,symdeprecated2)") -#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress=Pe1444,Pe1215") -#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,90,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("warn(disable:2241)") -#else - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED -#endif - -#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS) - #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS -#endif -#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas") - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("clang diagnostic ignored \"-Wunknown-pragmas\"") -#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("warning(disable:161)") -#elif JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS __pragma(warning(disable:161)) -#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 1675") -#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("GCC diagnostic ignored \"-Wunknown-pragmas\"") -#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS __pragma(warning(disable:4068)) -#elif \ - JSON_HEDLEY_TI_VERSION_CHECK(16,9,0) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,3,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 163") -#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 163") -#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress=Pe161") -#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 161") -#else - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS -#endif - -#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES) - #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES -#endif -#if JSON_HEDLEY_HAS_WARNING("-Wunknown-attributes") - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("clang diagnostic ignored \"-Wunknown-attributes\"") -#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") -#elif JSON_HEDLEY_INTEL_VERSION_CHECK(17,0,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("warning(disable:1292)") -#elif JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES __pragma(warning(disable:1292)) -#elif JSON_HEDLEY_MSVC_VERSION_CHECK(19,0,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES __pragma(warning(disable:5030)) -#elif JSON_HEDLEY_PGI_VERSION_CHECK(20,7,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1097,1098") -#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1097") -#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,14,0) && defined(__cplusplus) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("error_messages(off,attrskipunsup)") -#elif \ - JSON_HEDLEY_TI_VERSION_CHECK(18,1,0) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,3,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1173") -#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress=Pe1097") -#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1097") -#else - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES -#endif - -#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL) - #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL -#endif -#if JSON_HEDLEY_HAS_WARNING("-Wcast-qual") - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("clang diagnostic ignored \"-Wcast-qual\"") -#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("warning(disable:2203 2331)") -#elif JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("GCC diagnostic ignored \"-Wcast-qual\"") -#else - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL -#endif - -#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION) - #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION -#endif -#if JSON_HEDLEY_HAS_WARNING("-Wunused-function") - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION _Pragma("clang diagnostic ignored \"-Wunused-function\"") -#elif JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION _Pragma("GCC diagnostic ignored \"-Wunused-function\"") -#elif JSON_HEDLEY_MSVC_VERSION_CHECK(1,0,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION __pragma(warning(disable:4505)) -#elif JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION _Pragma("diag_suppress 3142") -#else - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNUSED_FUNCTION -#endif - -#if defined(JSON_HEDLEY_DEPRECATED) - #undef JSON_HEDLEY_DEPRECATED -#endif -#if defined(JSON_HEDLEY_DEPRECATED_FOR) - #undef JSON_HEDLEY_DEPRECATED_FOR -#endif -#if \ - JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \ - JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) - #define JSON_HEDLEY_DEPRECATED(since) __declspec(deprecated("Since " # since)) - #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __declspec(deprecated("Since " #since "; use " #replacement)) -#elif \ - (JSON_HEDLEY_HAS_EXTENSION(attribute_deprecated_with_message) && !defined(JSON_HEDLEY_IAR_VERSION)) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(4,5,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) || \ - JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) || \ - JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ - JSON_HEDLEY_TI_VERSION_CHECK(18,1,0) || \ - JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(18,1,0) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,3,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,3,0) || \ - JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) - #define JSON_HEDLEY_DEPRECATED(since) __attribute__((__deprecated__("Since " #since))) - #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __attribute__((__deprecated__("Since " #since "; use " #replacement))) -#elif defined(__cplusplus) && (__cplusplus >= 201402L) - #define JSON_HEDLEY_DEPRECATED(since) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[deprecated("Since " #since)]]) - #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[deprecated("Since " #since "; use " #replacement)]]) -#elif \ - JSON_HEDLEY_HAS_ATTRIBUTE(deprecated) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ - JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ - (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ - (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ - (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ - (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ - JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) || \ - JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) - #define JSON_HEDLEY_DEPRECATED(since) __attribute__((__deprecated__)) - #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __attribute__((__deprecated__)) -#elif \ - JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ - JSON_HEDLEY_PELLES_VERSION_CHECK(6,50,0) || \ - JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) - #define JSON_HEDLEY_DEPRECATED(since) __declspec(deprecated) - #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __declspec(deprecated) -#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) - #define JSON_HEDLEY_DEPRECATED(since) _Pragma("deprecated") - #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) _Pragma("deprecated") -#else - #define JSON_HEDLEY_DEPRECATED(since) - #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) -#endif - -#if defined(JSON_HEDLEY_UNAVAILABLE) - #undef JSON_HEDLEY_UNAVAILABLE -#endif -#if \ - JSON_HEDLEY_HAS_ATTRIBUTE(warning) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) - #define JSON_HEDLEY_UNAVAILABLE(available_since) __attribute__((__warning__("Not available until " #available_since))) -#else - #define JSON_HEDLEY_UNAVAILABLE(available_since) -#endif - -#if defined(JSON_HEDLEY_WARN_UNUSED_RESULT) - #undef JSON_HEDLEY_WARN_UNUSED_RESULT -#endif -#if defined(JSON_HEDLEY_WARN_UNUSED_RESULT_MSG) - #undef JSON_HEDLEY_WARN_UNUSED_RESULT_MSG -#endif -#if \ - JSON_HEDLEY_HAS_ATTRIBUTE(warn_unused_result) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ - (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ - (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ - (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ - (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ - (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0) && defined(__cplusplus)) || \ - JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ - JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) - #define JSON_HEDLEY_WARN_UNUSED_RESULT __attribute__((__warn_unused_result__)) - #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) __attribute__((__warn_unused_result__)) -#elif (JSON_HEDLEY_HAS_CPP_ATTRIBUTE(nodiscard) >= 201907L) - #define JSON_HEDLEY_WARN_UNUSED_RESULT JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]]) - #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard(msg)]]) -#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE(nodiscard) - #define JSON_HEDLEY_WARN_UNUSED_RESULT JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]]) - #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]]) -#elif defined(_Check_return_) /* SAL */ - #define JSON_HEDLEY_WARN_UNUSED_RESULT _Check_return_ - #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) _Check_return_ -#else - #define JSON_HEDLEY_WARN_UNUSED_RESULT - #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) -#endif - -#if defined(JSON_HEDLEY_SENTINEL) - #undef JSON_HEDLEY_SENTINEL -#endif -#if \ - JSON_HEDLEY_HAS_ATTRIBUTE(sentinel) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(5,4,0) || \ - JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) - #define JSON_HEDLEY_SENTINEL(position) __attribute__((__sentinel__(position))) -#else - #define JSON_HEDLEY_SENTINEL(position) -#endif - -#if defined(JSON_HEDLEY_NO_RETURN) - #undef JSON_HEDLEY_NO_RETURN -#endif -#if JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) - #define JSON_HEDLEY_NO_RETURN __noreturn -#elif \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) - #define JSON_HEDLEY_NO_RETURN __attribute__((__noreturn__)) -#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L - #define JSON_HEDLEY_NO_RETURN _Noreturn -#elif defined(__cplusplus) && (__cplusplus >= 201103L) - #define JSON_HEDLEY_NO_RETURN JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[noreturn]]) -#elif \ - JSON_HEDLEY_HAS_ATTRIBUTE(noreturn) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(3,2,0) || \ - JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ - JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ - JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ - (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ - (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ - (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ - (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ - JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) - #define JSON_HEDLEY_NO_RETURN __attribute__((__noreturn__)) -#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) - #define JSON_HEDLEY_NO_RETURN _Pragma("does_not_return") -#elif \ - JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ - JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) - #define JSON_HEDLEY_NO_RETURN __declspec(noreturn) -#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,0,0) && defined(__cplusplus) - #define JSON_HEDLEY_NO_RETURN _Pragma("FUNC_NEVER_RETURNS;") -#elif JSON_HEDLEY_COMPCERT_VERSION_CHECK(3,2,0) - #define JSON_HEDLEY_NO_RETURN __attribute((noreturn)) -#elif JSON_HEDLEY_PELLES_VERSION_CHECK(9,0,0) - #define JSON_HEDLEY_NO_RETURN __declspec(noreturn) -#else - #define JSON_HEDLEY_NO_RETURN -#endif - -#if defined(JSON_HEDLEY_NO_ESCAPE) - #undef JSON_HEDLEY_NO_ESCAPE -#endif -#if JSON_HEDLEY_HAS_ATTRIBUTE(noescape) - #define JSON_HEDLEY_NO_ESCAPE __attribute__((__noescape__)) -#else - #define JSON_HEDLEY_NO_ESCAPE -#endif - -#if defined(JSON_HEDLEY_UNREACHABLE) - #undef JSON_HEDLEY_UNREACHABLE -#endif -#if defined(JSON_HEDLEY_UNREACHABLE_RETURN) - #undef JSON_HEDLEY_UNREACHABLE_RETURN -#endif -#if defined(JSON_HEDLEY_ASSUME) - #undef JSON_HEDLEY_ASSUME -#endif -#if \ - JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) - #define JSON_HEDLEY_ASSUME(expr) __assume(expr) -#elif JSON_HEDLEY_HAS_BUILTIN(__builtin_assume) - #define JSON_HEDLEY_ASSUME(expr) __builtin_assume(expr) -#elif \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0) - #if defined(__cplusplus) - #define JSON_HEDLEY_ASSUME(expr) std::_nassert(expr) - #else - #define JSON_HEDLEY_ASSUME(expr) _nassert(expr) - #endif -#endif -#if \ - (JSON_HEDLEY_HAS_BUILTIN(__builtin_unreachable) && (!defined(JSON_HEDLEY_ARM_VERSION))) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(4,5,0) || \ - JSON_HEDLEY_PGI_VERSION_CHECK(18,10,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_IBM_VERSION_CHECK(13,1,5) || \ - JSON_HEDLEY_CRAY_VERSION_CHECK(10,0,0) || \ - JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) - #define JSON_HEDLEY_UNREACHABLE() __builtin_unreachable() -#elif defined(JSON_HEDLEY_ASSUME) - #define JSON_HEDLEY_UNREACHABLE() JSON_HEDLEY_ASSUME(0) -#endif -#if !defined(JSON_HEDLEY_ASSUME) - #if defined(JSON_HEDLEY_UNREACHABLE) - #define JSON_HEDLEY_ASSUME(expr) JSON_HEDLEY_STATIC_CAST(void, ((expr) ? 1 : (JSON_HEDLEY_UNREACHABLE(), 1))) - #else - #define JSON_HEDLEY_ASSUME(expr) JSON_HEDLEY_STATIC_CAST(void, expr) - #endif -#endif -#if defined(JSON_HEDLEY_UNREACHABLE) - #if \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0) - #define JSON_HEDLEY_UNREACHABLE_RETURN(value) return (JSON_HEDLEY_STATIC_CAST(void, JSON_HEDLEY_ASSUME(0)), (value)) - #else - #define JSON_HEDLEY_UNREACHABLE_RETURN(value) JSON_HEDLEY_UNREACHABLE() - #endif -#else - #define JSON_HEDLEY_UNREACHABLE_RETURN(value) return (value) -#endif -#if !defined(JSON_HEDLEY_UNREACHABLE) - #define JSON_HEDLEY_UNREACHABLE() JSON_HEDLEY_ASSUME(0) -#endif - -JSON_HEDLEY_DIAGNOSTIC_PUSH -#if JSON_HEDLEY_HAS_WARNING("-Wpedantic") - #pragma clang diagnostic ignored "-Wpedantic" -#endif -#if JSON_HEDLEY_HAS_WARNING("-Wc++98-compat-pedantic") && defined(__cplusplus) - #pragma clang diagnostic ignored "-Wc++98-compat-pedantic" -#endif -#if JSON_HEDLEY_GCC_HAS_WARNING("-Wvariadic-macros",4,0,0) - #if defined(__clang__) - #pragma clang diagnostic ignored "-Wvariadic-macros" - #elif defined(JSON_HEDLEY_GCC_VERSION) - #pragma GCC diagnostic ignored "-Wvariadic-macros" - #endif -#endif -#if defined(JSON_HEDLEY_NON_NULL) - #undef JSON_HEDLEY_NON_NULL -#endif -#if \ - JSON_HEDLEY_HAS_ATTRIBUTE(nonnull) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) - #define JSON_HEDLEY_NON_NULL(...) __attribute__((__nonnull__(__VA_ARGS__))) -#else - #define JSON_HEDLEY_NON_NULL(...) -#endif -JSON_HEDLEY_DIAGNOSTIC_POP - -#if defined(JSON_HEDLEY_PRINTF_FORMAT) - #undef JSON_HEDLEY_PRINTF_FORMAT -#endif -#if defined(__MINGW32__) && JSON_HEDLEY_GCC_HAS_ATTRIBUTE(format,4,4,0) && !defined(__USE_MINGW_ANSI_STDIO) - #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(ms_printf, string_idx, first_to_check))) -#elif defined(__MINGW32__) && JSON_HEDLEY_GCC_HAS_ATTRIBUTE(format,4,4,0) && defined(__USE_MINGW_ANSI_STDIO) - #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(gnu_printf, string_idx, first_to_check))) -#elif \ - JSON_HEDLEY_HAS_ATTRIBUTE(format) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) || \ - JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ - JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ - (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ - (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ - (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ - (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ - JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) - #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(__printf__, string_idx, first_to_check))) -#elif JSON_HEDLEY_PELLES_VERSION_CHECK(6,0,0) - #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __declspec(vaformat(printf,string_idx,first_to_check)) -#else - #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) -#endif - -#if defined(JSON_HEDLEY_CONSTEXPR) - #undef JSON_HEDLEY_CONSTEXPR -#endif -#if defined(__cplusplus) - #if __cplusplus >= 201103L - #define JSON_HEDLEY_CONSTEXPR JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(constexpr) - #endif -#endif -#if !defined(JSON_HEDLEY_CONSTEXPR) - #define JSON_HEDLEY_CONSTEXPR -#endif - -#if defined(JSON_HEDLEY_PREDICT) - #undef JSON_HEDLEY_PREDICT -#endif -#if defined(JSON_HEDLEY_LIKELY) - #undef JSON_HEDLEY_LIKELY -#endif -#if defined(JSON_HEDLEY_UNLIKELY) - #undef JSON_HEDLEY_UNLIKELY -#endif -#if defined(JSON_HEDLEY_UNPREDICTABLE) - #undef JSON_HEDLEY_UNPREDICTABLE -#endif -#if JSON_HEDLEY_HAS_BUILTIN(__builtin_unpredictable) - #define JSON_HEDLEY_UNPREDICTABLE(expr) __builtin_unpredictable((expr)) -#endif -#if \ - (JSON_HEDLEY_HAS_BUILTIN(__builtin_expect_with_probability) && !defined(JSON_HEDLEY_PGI_VERSION)) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(9,0,0) || \ - JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) -# define JSON_HEDLEY_PREDICT(expr, value, probability) __builtin_expect_with_probability( (expr), (value), (probability)) -# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) __builtin_expect_with_probability(!!(expr), 1 , (probability)) -# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) __builtin_expect_with_probability(!!(expr), 0 , (probability)) -# define JSON_HEDLEY_LIKELY(expr) __builtin_expect (!!(expr), 1 ) -# define JSON_HEDLEY_UNLIKELY(expr) __builtin_expect (!!(expr), 0 ) -#elif \ - (JSON_HEDLEY_HAS_BUILTIN(__builtin_expect) && !defined(JSON_HEDLEY_INTEL_CL_VERSION)) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0) && defined(__cplusplus)) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ - JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ - JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ - JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,7,0) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(3,1,0) || \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,1,0) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ - JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,27) || \ - JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \ - JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) -# define JSON_HEDLEY_PREDICT(expr, expected, probability) \ - (((probability) >= 0.9) ? __builtin_expect((expr), (expected)) : (JSON_HEDLEY_STATIC_CAST(void, expected), (expr))) -# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) \ - (__extension__ ({ \ - double hedley_probability_ = (probability); \ - ((hedley_probability_ >= 0.9) ? __builtin_expect(!!(expr), 1) : ((hedley_probability_ <= 0.1) ? __builtin_expect(!!(expr), 0) : !!(expr))); \ - })) -# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) \ - (__extension__ ({ \ - double hedley_probability_ = (probability); \ - ((hedley_probability_ >= 0.9) ? __builtin_expect(!!(expr), 0) : ((hedley_probability_ <= 0.1) ? __builtin_expect(!!(expr), 1) : !!(expr))); \ - })) -# define JSON_HEDLEY_LIKELY(expr) __builtin_expect(!!(expr), 1) -# define JSON_HEDLEY_UNLIKELY(expr) __builtin_expect(!!(expr), 0) -#else -# define JSON_HEDLEY_PREDICT(expr, expected, probability) (JSON_HEDLEY_STATIC_CAST(void, expected), (expr)) -# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) (!!(expr)) -# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) (!!(expr)) -# define JSON_HEDLEY_LIKELY(expr) (!!(expr)) -# define JSON_HEDLEY_UNLIKELY(expr) (!!(expr)) -#endif -#if !defined(JSON_HEDLEY_UNPREDICTABLE) - #define JSON_HEDLEY_UNPREDICTABLE(expr) JSON_HEDLEY_PREDICT(expr, 1, 0.5) -#endif - -#if defined(JSON_HEDLEY_MALLOC) - #undef JSON_HEDLEY_MALLOC -#endif -#if \ - JSON_HEDLEY_HAS_ATTRIBUTE(malloc) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ - JSON_HEDLEY_IBM_VERSION_CHECK(12,1,0) || \ - JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ - (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ - (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ - (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ - (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ - JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) - #define JSON_HEDLEY_MALLOC __attribute__((__malloc__)) -#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) - #define JSON_HEDLEY_MALLOC _Pragma("returns_new_memory") -#elif \ - JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \ - JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) - #define JSON_HEDLEY_MALLOC __declspec(restrict) -#else - #define JSON_HEDLEY_MALLOC -#endif - -#if defined(JSON_HEDLEY_PURE) - #undef JSON_HEDLEY_PURE -#endif -#if \ - JSON_HEDLEY_HAS_ATTRIBUTE(pure) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(2,96,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ - JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ - JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ - (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ - (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ - (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ - (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ - JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ - JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) -# define JSON_HEDLEY_PURE __attribute__((__pure__)) -#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) -# define JSON_HEDLEY_PURE _Pragma("does_not_write_global_data") -#elif defined(__cplusplus) && \ - ( \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(2,0,1) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) \ - ) -# define JSON_HEDLEY_PURE _Pragma("FUNC_IS_PURE;") -#else -# define JSON_HEDLEY_PURE -#endif - -#if defined(JSON_HEDLEY_CONST) - #undef JSON_HEDLEY_CONST -#endif -#if \ - JSON_HEDLEY_HAS_ATTRIBUTE(const) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(2,5,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ - JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ - JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ - (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ - (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ - (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ - (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ - JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ - JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) - #define JSON_HEDLEY_CONST __attribute__((__const__)) -#elif \ - JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) - #define JSON_HEDLEY_CONST _Pragma("no_side_effect") -#else - #define JSON_HEDLEY_CONST JSON_HEDLEY_PURE -#endif - -#if defined(JSON_HEDLEY_RESTRICT) - #undef JSON_HEDLEY_RESTRICT -#endif -#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && !defined(__cplusplus) - #define JSON_HEDLEY_RESTRICT restrict -#elif \ - JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ - JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ - JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ - JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,4) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,1,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,14,0) && defined(__cplusplus)) || \ - JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) || \ - defined(__clang__) || \ - JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) - #define JSON_HEDLEY_RESTRICT __restrict -#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,3,0) && !defined(__cplusplus) - #define JSON_HEDLEY_RESTRICT _Restrict -#else - #define JSON_HEDLEY_RESTRICT -#endif - -#if defined(JSON_HEDLEY_INLINE) - #undef JSON_HEDLEY_INLINE -#endif -#if \ - (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || \ - (defined(__cplusplus) && (__cplusplus >= 199711L)) - #define JSON_HEDLEY_INLINE inline -#elif \ - defined(JSON_HEDLEY_GCC_VERSION) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(6,2,0) - #define JSON_HEDLEY_INLINE __inline__ -#elif \ - JSON_HEDLEY_MSVC_VERSION_CHECK(12,0,0) || \ - JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ - JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,1,0) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(3,1,0) || \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ - JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) - #define JSON_HEDLEY_INLINE __inline -#else - #define JSON_HEDLEY_INLINE -#endif - -#if defined(JSON_HEDLEY_ALWAYS_INLINE) - #undef JSON_HEDLEY_ALWAYS_INLINE -#endif -#if \ - JSON_HEDLEY_HAS_ATTRIBUTE(always_inline) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ - JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ - JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ - (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ - (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ - (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ - (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ - JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) || \ - JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) -# define JSON_HEDLEY_ALWAYS_INLINE __attribute__((__always_inline__)) JSON_HEDLEY_INLINE -#elif \ - JSON_HEDLEY_MSVC_VERSION_CHECK(12,0,0) || \ - JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) -# define JSON_HEDLEY_ALWAYS_INLINE __forceinline -#elif defined(__cplusplus) && \ - ( \ - JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) \ - ) -# define JSON_HEDLEY_ALWAYS_INLINE _Pragma("FUNC_ALWAYS_INLINE;") -#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) -# define JSON_HEDLEY_ALWAYS_INLINE _Pragma("inline=forced") -#else -# define JSON_HEDLEY_ALWAYS_INLINE JSON_HEDLEY_INLINE -#endif - -#if defined(JSON_HEDLEY_NEVER_INLINE) - #undef JSON_HEDLEY_NEVER_INLINE -#endif -#if \ - JSON_HEDLEY_HAS_ATTRIBUTE(noinline) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ - JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ - JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ - (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ - (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ - (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ - (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ - JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) || \ - JSON_HEDLEY_IAR_VERSION_CHECK(8,10,0) - #define JSON_HEDLEY_NEVER_INLINE __attribute__((__noinline__)) -#elif \ - JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ - JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) - #define JSON_HEDLEY_NEVER_INLINE __declspec(noinline) -#elif JSON_HEDLEY_PGI_VERSION_CHECK(10,2,0) - #define JSON_HEDLEY_NEVER_INLINE _Pragma("noinline") -#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,0,0) && defined(__cplusplus) - #define JSON_HEDLEY_NEVER_INLINE _Pragma("FUNC_CANNOT_INLINE;") -#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) - #define JSON_HEDLEY_NEVER_INLINE _Pragma("inline=never") -#elif JSON_HEDLEY_COMPCERT_VERSION_CHECK(3,2,0) - #define JSON_HEDLEY_NEVER_INLINE __attribute((noinline)) -#elif JSON_HEDLEY_PELLES_VERSION_CHECK(9,0,0) - #define JSON_HEDLEY_NEVER_INLINE __declspec(noinline) -#else - #define JSON_HEDLEY_NEVER_INLINE -#endif - -#if defined(JSON_HEDLEY_PRIVATE) - #undef JSON_HEDLEY_PRIVATE -#endif -#if defined(JSON_HEDLEY_PUBLIC) - #undef JSON_HEDLEY_PUBLIC -#endif -#if defined(JSON_HEDLEY_IMPORT) - #undef JSON_HEDLEY_IMPORT -#endif -#if defined(_WIN32) || defined(__CYGWIN__) -# define JSON_HEDLEY_PRIVATE -# define JSON_HEDLEY_PUBLIC __declspec(dllexport) -# define JSON_HEDLEY_IMPORT __declspec(dllimport) -#else -# if \ - JSON_HEDLEY_HAS_ATTRIBUTE(visibility) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \ - JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ - JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \ - ( \ - defined(__TI_EABI__) && \ - ( \ - (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) \ - ) \ - ) || \ - JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) -# define JSON_HEDLEY_PRIVATE __attribute__((__visibility__("hidden"))) -# define JSON_HEDLEY_PUBLIC __attribute__((__visibility__("default"))) -# else -# define JSON_HEDLEY_PRIVATE -# define JSON_HEDLEY_PUBLIC -# endif -# define JSON_HEDLEY_IMPORT extern -#endif - -#if defined(JSON_HEDLEY_NO_THROW) - #undef JSON_HEDLEY_NO_THROW -#endif -#if \ - JSON_HEDLEY_HAS_ATTRIBUTE(nothrow) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) - #define JSON_HEDLEY_NO_THROW __attribute__((__nothrow__)) -#elif \ - JSON_HEDLEY_MSVC_VERSION_CHECK(13,1,0) || \ - JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) - #define JSON_HEDLEY_NO_THROW __declspec(nothrow) -#else - #define JSON_HEDLEY_NO_THROW -#endif - -#if defined(JSON_HEDLEY_FALL_THROUGH) - #undef JSON_HEDLEY_FALL_THROUGH -#endif -#if \ - JSON_HEDLEY_HAS_ATTRIBUTE(fallthrough) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(7,0,0) || \ - JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) - #define JSON_HEDLEY_FALL_THROUGH __attribute__((__fallthrough__)) -#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(clang,fallthrough) - #define JSON_HEDLEY_FALL_THROUGH JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[clang::fallthrough]]) -#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE(fallthrough) - #define JSON_HEDLEY_FALL_THROUGH JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[fallthrough]]) -#elif defined(__fallthrough) /* SAL */ - #define JSON_HEDLEY_FALL_THROUGH __fallthrough -#else - #define JSON_HEDLEY_FALL_THROUGH -#endif - -#if defined(JSON_HEDLEY_RETURNS_NON_NULL) - #undef JSON_HEDLEY_RETURNS_NON_NULL -#endif -#if \ - JSON_HEDLEY_HAS_ATTRIBUTE(returns_nonnull) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0) || \ - JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) - #define JSON_HEDLEY_RETURNS_NON_NULL __attribute__((__returns_nonnull__)) -#elif defined(_Ret_notnull_) /* SAL */ - #define JSON_HEDLEY_RETURNS_NON_NULL _Ret_notnull_ -#else - #define JSON_HEDLEY_RETURNS_NON_NULL -#endif - -#if defined(JSON_HEDLEY_ARRAY_PARAM) - #undef JSON_HEDLEY_ARRAY_PARAM -#endif -#if \ - defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \ - !defined(__STDC_NO_VLA__) && \ - !defined(__cplusplus) && \ - !defined(JSON_HEDLEY_PGI_VERSION) && \ - !defined(JSON_HEDLEY_TINYC_VERSION) - #define JSON_HEDLEY_ARRAY_PARAM(name) (name) -#else - #define JSON_HEDLEY_ARRAY_PARAM(name) -#endif - -#if defined(JSON_HEDLEY_IS_CONSTANT) - #undef JSON_HEDLEY_IS_CONSTANT -#endif -#if defined(JSON_HEDLEY_REQUIRE_CONSTEXPR) - #undef JSON_HEDLEY_REQUIRE_CONSTEXPR -#endif -/* JSON_HEDLEY_IS_CONSTEXPR_ is for - HEDLEY INTERNAL USE ONLY. API subject to change without notice. */ -#if defined(JSON_HEDLEY_IS_CONSTEXPR_) - #undef JSON_HEDLEY_IS_CONSTEXPR_ -#endif -#if \ - JSON_HEDLEY_HAS_BUILTIN(__builtin_constant_p) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,19) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ - JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \ - (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) && !defined(__cplusplus)) || \ - JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \ - JSON_HEDLEY_MCST_LCC_VERSION_CHECK(1,25,10) - #define JSON_HEDLEY_IS_CONSTANT(expr) __builtin_constant_p(expr) -#endif -#if !defined(__cplusplus) -# if \ - JSON_HEDLEY_HAS_BUILTIN(__builtin_types_compatible_p) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \ - JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(5,4,0) || \ - JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,24) -#if defined(__INTPTR_TYPE__) - #define JSON_HEDLEY_IS_CONSTEXPR_(expr) __builtin_types_compatible_p(__typeof__((1 ? (void*) ((__INTPTR_TYPE__) ((expr) * 0)) : (int*) 0)), int*) -#else - #include - #define JSON_HEDLEY_IS_CONSTEXPR_(expr) __builtin_types_compatible_p(__typeof__((1 ? (void*) ((intptr_t) ((expr) * 0)) : (int*) 0)), int*) -#endif -# elif \ - ( \ - defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) && \ - !defined(JSON_HEDLEY_SUNPRO_VERSION) && \ - !defined(JSON_HEDLEY_PGI_VERSION) && \ - !defined(JSON_HEDLEY_IAR_VERSION)) || \ - (JSON_HEDLEY_HAS_EXTENSION(c_generic_selections) && !defined(JSON_HEDLEY_IAR_VERSION)) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(17,0,0) || \ - JSON_HEDLEY_IBM_VERSION_CHECK(12,1,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(5,3,0) -#if defined(__INTPTR_TYPE__) - #define JSON_HEDLEY_IS_CONSTEXPR_(expr) _Generic((1 ? (void*) ((__INTPTR_TYPE__) ((expr) * 0)) : (int*) 0), int*: 1, void*: 0) -#else - #include - #define JSON_HEDLEY_IS_CONSTEXPR_(expr) _Generic((1 ? (void*) ((intptr_t) * 0) : (int*) 0), int*: 1, void*: 0) -#endif -# elif \ - defined(JSON_HEDLEY_GCC_VERSION) || \ - defined(JSON_HEDLEY_INTEL_VERSION) || \ - defined(JSON_HEDLEY_TINYC_VERSION) || \ - defined(JSON_HEDLEY_TI_ARMCL_VERSION) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(18,12,0) || \ - defined(JSON_HEDLEY_TI_CL2000_VERSION) || \ - defined(JSON_HEDLEY_TI_CL6X_VERSION) || \ - defined(JSON_HEDLEY_TI_CL7X_VERSION) || \ - defined(JSON_HEDLEY_TI_CLPRU_VERSION) || \ - defined(__clang__) -# define JSON_HEDLEY_IS_CONSTEXPR_(expr) ( \ - sizeof(void) != \ - sizeof(*( \ - 1 ? \ - ((void*) ((expr) * 0L) ) : \ -((struct { char v[sizeof(void) * 2]; } *) 1) \ - ) \ - ) \ - ) -# endif -#endif -#if defined(JSON_HEDLEY_IS_CONSTEXPR_) - #if !defined(JSON_HEDLEY_IS_CONSTANT) - #define JSON_HEDLEY_IS_CONSTANT(expr) JSON_HEDLEY_IS_CONSTEXPR_(expr) - #endif - #define JSON_HEDLEY_REQUIRE_CONSTEXPR(expr) (JSON_HEDLEY_IS_CONSTEXPR_(expr) ? (expr) : (-1)) -#else - #if !defined(JSON_HEDLEY_IS_CONSTANT) - #define JSON_HEDLEY_IS_CONSTANT(expr) (0) - #endif - #define JSON_HEDLEY_REQUIRE_CONSTEXPR(expr) (expr) -#endif - -#if defined(JSON_HEDLEY_BEGIN_C_DECLS) - #undef JSON_HEDLEY_BEGIN_C_DECLS -#endif -#if defined(JSON_HEDLEY_END_C_DECLS) - #undef JSON_HEDLEY_END_C_DECLS -#endif -#if defined(JSON_HEDLEY_C_DECL) - #undef JSON_HEDLEY_C_DECL -#endif -#if defined(__cplusplus) - #define JSON_HEDLEY_BEGIN_C_DECLS extern "C" { - #define JSON_HEDLEY_END_C_DECLS } - #define JSON_HEDLEY_C_DECL extern "C" -#else - #define JSON_HEDLEY_BEGIN_C_DECLS - #define JSON_HEDLEY_END_C_DECLS - #define JSON_HEDLEY_C_DECL -#endif - -#if defined(JSON_HEDLEY_STATIC_ASSERT) - #undef JSON_HEDLEY_STATIC_ASSERT -#endif -#if \ - !defined(__cplusplus) && ( \ - (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)) || \ - (JSON_HEDLEY_HAS_FEATURE(c_static_assert) && !defined(JSON_HEDLEY_INTEL_CL_VERSION)) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(6,0,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - defined(_Static_assert) \ - ) -# define JSON_HEDLEY_STATIC_ASSERT(expr, message) _Static_assert(expr, message) -#elif \ - (defined(__cplusplus) && (__cplusplus >= 201103L)) || \ - JSON_HEDLEY_MSVC_VERSION_CHECK(16,0,0) || \ - JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) -# define JSON_HEDLEY_STATIC_ASSERT(expr, message) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(static_assert(expr, message)) -#else -# define JSON_HEDLEY_STATIC_ASSERT(expr, message) -#endif - -#if defined(JSON_HEDLEY_NULL) - #undef JSON_HEDLEY_NULL -#endif -#if defined(__cplusplus) - #if __cplusplus >= 201103L - #define JSON_HEDLEY_NULL JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(nullptr) - #elif defined(NULL) - #define JSON_HEDLEY_NULL NULL - #else - #define JSON_HEDLEY_NULL JSON_HEDLEY_STATIC_CAST(void*, 0) - #endif -#elif defined(NULL) - #define JSON_HEDLEY_NULL NULL -#else - #define JSON_HEDLEY_NULL ((void*) 0) -#endif - -#if defined(JSON_HEDLEY_MESSAGE) - #undef JSON_HEDLEY_MESSAGE -#endif -#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas") -# define JSON_HEDLEY_MESSAGE(msg) \ - JSON_HEDLEY_DIAGNOSTIC_PUSH \ - JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \ - JSON_HEDLEY_PRAGMA(message msg) \ - JSON_HEDLEY_DIAGNOSTIC_POP -#elif \ - JSON_HEDLEY_GCC_VERSION_CHECK(4,4,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) -# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message msg) -#elif JSON_HEDLEY_CRAY_VERSION_CHECK(5,0,0) -# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(_CRI message msg) -#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) -# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message(msg)) -#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,0,0) -# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message(msg)) -#else -# define JSON_HEDLEY_MESSAGE(msg) -#endif - -#if defined(JSON_HEDLEY_WARNING) - #undef JSON_HEDLEY_WARNING -#endif -#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas") -# define JSON_HEDLEY_WARNING(msg) \ - JSON_HEDLEY_DIAGNOSTIC_PUSH \ - JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \ - JSON_HEDLEY_PRAGMA(clang warning msg) \ - JSON_HEDLEY_DIAGNOSTIC_POP -#elif \ - JSON_HEDLEY_GCC_VERSION_CHECK(4,8,0) || \ - JSON_HEDLEY_PGI_VERSION_CHECK(18,4,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) -# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_PRAGMA(GCC warning msg) -#elif \ - JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) || \ - JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) -# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_PRAGMA(message(msg)) -#else -# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_MESSAGE(msg) -#endif - -#if defined(JSON_HEDLEY_REQUIRE) - #undef JSON_HEDLEY_REQUIRE -#endif -#if defined(JSON_HEDLEY_REQUIRE_MSG) - #undef JSON_HEDLEY_REQUIRE_MSG -#endif -#if JSON_HEDLEY_HAS_ATTRIBUTE(diagnose_if) -# if JSON_HEDLEY_HAS_WARNING("-Wgcc-compat") -# define JSON_HEDLEY_REQUIRE(expr) \ - JSON_HEDLEY_DIAGNOSTIC_PUSH \ - _Pragma("clang diagnostic ignored \"-Wgcc-compat\"") \ - __attribute__((diagnose_if(!(expr), #expr, "error"))) \ - JSON_HEDLEY_DIAGNOSTIC_POP -# define JSON_HEDLEY_REQUIRE_MSG(expr,msg) \ - JSON_HEDLEY_DIAGNOSTIC_PUSH \ - _Pragma("clang diagnostic ignored \"-Wgcc-compat\"") \ - __attribute__((diagnose_if(!(expr), msg, "error"))) \ - JSON_HEDLEY_DIAGNOSTIC_POP -# else -# define JSON_HEDLEY_REQUIRE(expr) __attribute__((diagnose_if(!(expr), #expr, "error"))) -# define JSON_HEDLEY_REQUIRE_MSG(expr,msg) __attribute__((diagnose_if(!(expr), msg, "error"))) -# endif -#else -# define JSON_HEDLEY_REQUIRE(expr) -# define JSON_HEDLEY_REQUIRE_MSG(expr,msg) -#endif - -#if defined(JSON_HEDLEY_FLAGS) - #undef JSON_HEDLEY_FLAGS -#endif -#if JSON_HEDLEY_HAS_ATTRIBUTE(flag_enum) && (!defined(__cplusplus) || JSON_HEDLEY_HAS_WARNING("-Wbitfield-enum-conversion")) - #define JSON_HEDLEY_FLAGS __attribute__((__flag_enum__)) -#else - #define JSON_HEDLEY_FLAGS -#endif - -#if defined(JSON_HEDLEY_FLAGS_CAST) - #undef JSON_HEDLEY_FLAGS_CAST -#endif -#if JSON_HEDLEY_INTEL_VERSION_CHECK(19,0,0) -# define JSON_HEDLEY_FLAGS_CAST(T, expr) (__extension__ ({ \ - JSON_HEDLEY_DIAGNOSTIC_PUSH \ - _Pragma("warning(disable:188)") \ - ((T) (expr)); \ - JSON_HEDLEY_DIAGNOSTIC_POP \ - })) -#else -# define JSON_HEDLEY_FLAGS_CAST(T, expr) JSON_HEDLEY_STATIC_CAST(T, expr) -#endif - -#if defined(JSON_HEDLEY_EMPTY_BASES) - #undef JSON_HEDLEY_EMPTY_BASES -#endif -#if \ - (JSON_HEDLEY_MSVC_VERSION_CHECK(19,0,23918) && !JSON_HEDLEY_MSVC_VERSION_CHECK(20,0,0)) || \ - JSON_HEDLEY_INTEL_CL_VERSION_CHECK(2021,1,0) - #define JSON_HEDLEY_EMPTY_BASES __declspec(empty_bases) -#else - #define JSON_HEDLEY_EMPTY_BASES -#endif - -/* Remaining macros are deprecated. */ - -#if defined(JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK) - #undef JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK -#endif -#if defined(__clang__) - #define JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK(major,minor,patch) (0) -#else - #define JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK(major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) -#endif - -#if defined(JSON_HEDLEY_CLANG_HAS_ATTRIBUTE) - #undef JSON_HEDLEY_CLANG_HAS_ATTRIBUTE -#endif -#define JSON_HEDLEY_CLANG_HAS_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_ATTRIBUTE(attribute) - -#if defined(JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE) - #undef JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE -#endif -#define JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) - -#if defined(JSON_HEDLEY_CLANG_HAS_BUILTIN) - #undef JSON_HEDLEY_CLANG_HAS_BUILTIN -#endif -#define JSON_HEDLEY_CLANG_HAS_BUILTIN(builtin) JSON_HEDLEY_HAS_BUILTIN(builtin) - -#if defined(JSON_HEDLEY_CLANG_HAS_FEATURE) - #undef JSON_HEDLEY_CLANG_HAS_FEATURE -#endif -#define JSON_HEDLEY_CLANG_HAS_FEATURE(feature) JSON_HEDLEY_HAS_FEATURE(feature) - -#if defined(JSON_HEDLEY_CLANG_HAS_EXTENSION) - #undef JSON_HEDLEY_CLANG_HAS_EXTENSION -#endif -#define JSON_HEDLEY_CLANG_HAS_EXTENSION(extension) JSON_HEDLEY_HAS_EXTENSION(extension) - -#if defined(JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE) - #undef JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE -#endif -#define JSON_HEDLEY_CLANG_HAS_DECLSPEC_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) - -#if defined(JSON_HEDLEY_CLANG_HAS_WARNING) - #undef JSON_HEDLEY_CLANG_HAS_WARNING -#endif -#define JSON_HEDLEY_CLANG_HAS_WARNING(warning) JSON_HEDLEY_HAS_WARNING(warning) - -#endif /* !defined(JSON_HEDLEY_VERSION) || (JSON_HEDLEY_VERSION < X) */ - - -// This file contains all internal macro definitions (except those affecting ABI) -// You MUST include macro_unscope.hpp at the end of json.hpp to undef all of them - -// #include - - -// exclude unsupported compilers -#if !defined(JSON_SKIP_UNSUPPORTED_COMPILER_CHECK) - #if defined(__clang__) - #if (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) < 30400 - #error "unsupported Clang version - see https://github.com/nlohmann/json#supported-compilers" - #endif - #elif defined(__GNUC__) && !(defined(__ICC) || defined(__INTEL_COMPILER)) - #if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) < 40800 - #error "unsupported GCC version - see https://github.com/nlohmann/json#supported-compilers" - #endif - #endif -#endif - -// C++ language standard detection -// if the user manually specified the used c++ version this is skipped -#if !defined(JSON_HAS_CPP_20) && !defined(JSON_HAS_CPP_17) && !defined(JSON_HAS_CPP_14) && !defined(JSON_HAS_CPP_11) - #if (defined(__cplusplus) && __cplusplus >= 202002L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 202002L) - #define JSON_HAS_CPP_20 - #define JSON_HAS_CPP_17 - #define JSON_HAS_CPP_14 - #elif (defined(__cplusplus) && __cplusplus >= 201703L) || (defined(_HAS_CXX17) && _HAS_CXX17 == 1) // fix for issue #464 - #define JSON_HAS_CPP_17 - #define JSON_HAS_CPP_14 - #elif (defined(__cplusplus) && __cplusplus >= 201402L) || (defined(_HAS_CXX14) && _HAS_CXX14 == 1) - #define JSON_HAS_CPP_14 - #endif - // the cpp 11 flag is always specified because it is the minimal required version - #define JSON_HAS_CPP_11 -#endif - -#ifdef __has_include - #if __has_include() - #include - #endif -#endif - -#if !defined(JSON_HAS_FILESYSTEM) && !defined(JSON_HAS_EXPERIMENTAL_FILESYSTEM) - #ifdef JSON_HAS_CPP_17 - #if defined(__cpp_lib_filesystem) - #define JSON_HAS_FILESYSTEM 1 - #elif defined(__cpp_lib_experimental_filesystem) - #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1 - #elif !defined(__has_include) - #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1 - #elif __has_include() - #define JSON_HAS_FILESYSTEM 1 - #elif __has_include() - #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 1 - #endif - - // std::filesystem does not work on MinGW GCC 8: https://sourceforge.net/p/mingw-w64/bugs/737/ - #if defined(__MINGW32__) && defined(__GNUC__) && __GNUC__ == 8 - #undef JSON_HAS_FILESYSTEM - #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM - #endif - - // no filesystem support before GCC 8: https://en.cppreference.com/w/cpp/compiler_support - #if defined(__GNUC__) && !defined(__clang__) && __GNUC__ < 8 - #undef JSON_HAS_FILESYSTEM - #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM - #endif - - // no filesystem support before Clang 7: https://en.cppreference.com/w/cpp/compiler_support - #if defined(__clang_major__) && __clang_major__ < 7 - #undef JSON_HAS_FILESYSTEM - #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM - #endif - - // no filesystem support before MSVC 19.14: https://en.cppreference.com/w/cpp/compiler_support - #if defined(_MSC_VER) && _MSC_VER < 1914 - #undef JSON_HAS_FILESYSTEM - #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM - #endif - - // no filesystem support before iOS 13 - #if defined(__IPHONE_OS_VERSION_MIN_REQUIRED) && __IPHONE_OS_VERSION_MIN_REQUIRED < 130000 - #undef JSON_HAS_FILESYSTEM - #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM - #endif - - // no filesystem support before macOS Catalina - #if defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && __MAC_OS_X_VERSION_MIN_REQUIRED < 101500 - #undef JSON_HAS_FILESYSTEM - #undef JSON_HAS_EXPERIMENTAL_FILESYSTEM - #endif - #endif -#endif - -#ifndef JSON_HAS_EXPERIMENTAL_FILESYSTEM - #define JSON_HAS_EXPERIMENTAL_FILESYSTEM 0 -#endif - -#ifndef JSON_HAS_FILESYSTEM - #define JSON_HAS_FILESYSTEM 0 -#endif - -#ifndef JSON_HAS_THREE_WAY_COMPARISON - #if defined(__cpp_impl_three_way_comparison) && __cpp_impl_three_way_comparison >= 201907L \ - && defined(__cpp_lib_three_way_comparison) && __cpp_lib_three_way_comparison >= 201907L - #define JSON_HAS_THREE_WAY_COMPARISON 1 - #else - #define JSON_HAS_THREE_WAY_COMPARISON 0 - #endif -#endif - -#ifndef JSON_HAS_RANGES - // ranges header shipping in GCC 11.1.0 (released 2021-04-27) has syntax error - #if defined(__GLIBCXX__) && __GLIBCXX__ == 20210427 - #define JSON_HAS_RANGES 0 - #elif defined(__cpp_lib_ranges) - #define JSON_HAS_RANGES 1 - #else - #define JSON_HAS_RANGES 0 - #endif -#endif - -#ifdef JSON_HAS_CPP_17 - #define JSON_INLINE_VARIABLE inline -#else - #define JSON_INLINE_VARIABLE -#endif - -#if JSON_HEDLEY_HAS_ATTRIBUTE(no_unique_address) - #define JSON_NO_UNIQUE_ADDRESS [[no_unique_address]] -#else - #define JSON_NO_UNIQUE_ADDRESS -#endif - -// disable documentation warnings on clang -#if defined(__clang__) - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wdocumentation" - #pragma clang diagnostic ignored "-Wdocumentation-unknown-command" -#endif - -// allow disabling exceptions -#if (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)) && !defined(JSON_NOEXCEPTION) - #define JSON_THROW(exception) throw exception - #define JSON_TRY try - #define JSON_CATCH(exception) catch(exception) - #define JSON_INTERNAL_CATCH(exception) catch(exception) -#else - #include - #define JSON_THROW(exception) std::abort() - #define JSON_TRY if(true) - #define JSON_CATCH(exception) if(false) - #define JSON_INTERNAL_CATCH(exception) if(false) -#endif - -// override exception macros -#if defined(JSON_THROW_USER) - #undef JSON_THROW - #define JSON_THROW JSON_THROW_USER -#endif -#if defined(JSON_TRY_USER) - #undef JSON_TRY - #define JSON_TRY JSON_TRY_USER -#endif -#if defined(JSON_CATCH_USER) - #undef JSON_CATCH - #define JSON_CATCH JSON_CATCH_USER - #undef JSON_INTERNAL_CATCH - #define JSON_INTERNAL_CATCH JSON_CATCH_USER -#endif -#if defined(JSON_INTERNAL_CATCH_USER) - #undef JSON_INTERNAL_CATCH - #define JSON_INTERNAL_CATCH JSON_INTERNAL_CATCH_USER -#endif - -// allow overriding assert -#if !defined(JSON_ASSERT) - #include // assert - #define JSON_ASSERT(x) assert(x) -#endif - -// allow to access some private functions (needed by the test suite) -#if defined(JSON_TESTS_PRIVATE) - #define JSON_PRIVATE_UNLESS_TESTED public -#else - #define JSON_PRIVATE_UNLESS_TESTED private -#endif - -/*! -@brief macro to briefly define a mapping between an enum and JSON -@def NLOHMANN_JSON_SERIALIZE_ENUM -@since version 3.4.0 -*/ -#define NLOHMANN_JSON_SERIALIZE_ENUM(ENUM_TYPE, ...) \ - template \ - inline void to_json(BasicJsonType& j, const ENUM_TYPE& e) \ - { \ - static_assert(std::is_enum::value, #ENUM_TYPE " must be an enum!"); \ - static const std::pair m[] = __VA_ARGS__; \ - auto it = std::find_if(std::begin(m), std::end(m), \ - [e](const std::pair& ej_pair) -> bool \ - { \ - return ej_pair.first == e; \ - }); \ - j = ((it != std::end(m)) ? it : std::begin(m))->second; \ - } \ - template \ - inline void from_json(const BasicJsonType& j, ENUM_TYPE& e) \ - { \ - static_assert(std::is_enum::value, #ENUM_TYPE " must be an enum!"); \ - static const std::pair m[] = __VA_ARGS__; \ - auto it = std::find_if(std::begin(m), std::end(m), \ - [&j](const std::pair& ej_pair) -> bool \ - { \ - return ej_pair.second == j; \ - }); \ - e = ((it != std::end(m)) ? it : std::begin(m))->first; \ - } - -// Ugly macros to avoid uglier copy-paste when specializing basic_json. They -// may be removed in the future once the class is split. - -#define NLOHMANN_BASIC_JSON_TPL_DECLARATION \ - template class ObjectType, \ - template class ArrayType, \ - class StringType, class BooleanType, class NumberIntegerType, \ - class NumberUnsignedType, class NumberFloatType, \ - template class AllocatorType, \ - template class JSONSerializer, \ - class BinaryType> - -#define NLOHMANN_BASIC_JSON_TPL \ - basic_json - -// Macros to simplify conversion from/to types - -#define NLOHMANN_JSON_EXPAND( x ) x -#define NLOHMANN_JSON_GET_MACRO(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64, NAME,...) NAME -#define NLOHMANN_JSON_PASTE(...) NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_GET_MACRO(__VA_ARGS__, \ - NLOHMANN_JSON_PASTE64, \ - NLOHMANN_JSON_PASTE63, \ - NLOHMANN_JSON_PASTE62, \ - NLOHMANN_JSON_PASTE61, \ - NLOHMANN_JSON_PASTE60, \ - NLOHMANN_JSON_PASTE59, \ - NLOHMANN_JSON_PASTE58, \ - NLOHMANN_JSON_PASTE57, \ - NLOHMANN_JSON_PASTE56, \ - NLOHMANN_JSON_PASTE55, \ - NLOHMANN_JSON_PASTE54, \ - NLOHMANN_JSON_PASTE53, \ - NLOHMANN_JSON_PASTE52, \ - NLOHMANN_JSON_PASTE51, \ - NLOHMANN_JSON_PASTE50, \ - NLOHMANN_JSON_PASTE49, \ - NLOHMANN_JSON_PASTE48, \ - NLOHMANN_JSON_PASTE47, \ - NLOHMANN_JSON_PASTE46, \ - NLOHMANN_JSON_PASTE45, \ - NLOHMANN_JSON_PASTE44, \ - NLOHMANN_JSON_PASTE43, \ - NLOHMANN_JSON_PASTE42, \ - NLOHMANN_JSON_PASTE41, \ - NLOHMANN_JSON_PASTE40, \ - NLOHMANN_JSON_PASTE39, \ - NLOHMANN_JSON_PASTE38, \ - NLOHMANN_JSON_PASTE37, \ - NLOHMANN_JSON_PASTE36, \ - NLOHMANN_JSON_PASTE35, \ - NLOHMANN_JSON_PASTE34, \ - NLOHMANN_JSON_PASTE33, \ - NLOHMANN_JSON_PASTE32, \ - NLOHMANN_JSON_PASTE31, \ - NLOHMANN_JSON_PASTE30, \ - NLOHMANN_JSON_PASTE29, \ - NLOHMANN_JSON_PASTE28, \ - NLOHMANN_JSON_PASTE27, \ - NLOHMANN_JSON_PASTE26, \ - NLOHMANN_JSON_PASTE25, \ - NLOHMANN_JSON_PASTE24, \ - NLOHMANN_JSON_PASTE23, \ - NLOHMANN_JSON_PASTE22, \ - NLOHMANN_JSON_PASTE21, \ - NLOHMANN_JSON_PASTE20, \ - NLOHMANN_JSON_PASTE19, \ - NLOHMANN_JSON_PASTE18, \ - NLOHMANN_JSON_PASTE17, \ - NLOHMANN_JSON_PASTE16, \ - NLOHMANN_JSON_PASTE15, \ - NLOHMANN_JSON_PASTE14, \ - NLOHMANN_JSON_PASTE13, \ - NLOHMANN_JSON_PASTE12, \ - NLOHMANN_JSON_PASTE11, \ - NLOHMANN_JSON_PASTE10, \ - NLOHMANN_JSON_PASTE9, \ - NLOHMANN_JSON_PASTE8, \ - NLOHMANN_JSON_PASTE7, \ - NLOHMANN_JSON_PASTE6, \ - NLOHMANN_JSON_PASTE5, \ - NLOHMANN_JSON_PASTE4, \ - NLOHMANN_JSON_PASTE3, \ - NLOHMANN_JSON_PASTE2, \ - NLOHMANN_JSON_PASTE1)(__VA_ARGS__)) -#define NLOHMANN_JSON_PASTE2(func, v1) func(v1) -#define NLOHMANN_JSON_PASTE3(func, v1, v2) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE2(func, v2) -#define NLOHMANN_JSON_PASTE4(func, v1, v2, v3) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE3(func, v2, v3) -#define NLOHMANN_JSON_PASTE5(func, v1, v2, v3, v4) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE4(func, v2, v3, v4) -#define NLOHMANN_JSON_PASTE6(func, v1, v2, v3, v4, v5) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE5(func, v2, v3, v4, v5) -#define NLOHMANN_JSON_PASTE7(func, v1, v2, v3, v4, v5, v6) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE6(func, v2, v3, v4, v5, v6) -#define NLOHMANN_JSON_PASTE8(func, v1, v2, v3, v4, v5, v6, v7) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE7(func, v2, v3, v4, v5, v6, v7) -#define NLOHMANN_JSON_PASTE9(func, v1, v2, v3, v4, v5, v6, v7, v8) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE8(func, v2, v3, v4, v5, v6, v7, v8) -#define NLOHMANN_JSON_PASTE10(func, v1, v2, v3, v4, v5, v6, v7, v8, v9) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE9(func, v2, v3, v4, v5, v6, v7, v8, v9) -#define NLOHMANN_JSON_PASTE11(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE10(func, v2, v3, v4, v5, v6, v7, v8, v9, v10) -#define NLOHMANN_JSON_PASTE12(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE11(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11) -#define NLOHMANN_JSON_PASTE13(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE12(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12) -#define NLOHMANN_JSON_PASTE14(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE13(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13) -#define NLOHMANN_JSON_PASTE15(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE14(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14) -#define NLOHMANN_JSON_PASTE16(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE15(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15) -#define NLOHMANN_JSON_PASTE17(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE16(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16) -#define NLOHMANN_JSON_PASTE18(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE17(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17) -#define NLOHMANN_JSON_PASTE19(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE18(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18) -#define NLOHMANN_JSON_PASTE20(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE19(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19) -#define NLOHMANN_JSON_PASTE21(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE20(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20) -#define NLOHMANN_JSON_PASTE22(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE21(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21) -#define NLOHMANN_JSON_PASTE23(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE22(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22) -#define NLOHMANN_JSON_PASTE24(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE23(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23) -#define NLOHMANN_JSON_PASTE25(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE24(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24) -#define NLOHMANN_JSON_PASTE26(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE25(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25) -#define NLOHMANN_JSON_PASTE27(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE26(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26) -#define NLOHMANN_JSON_PASTE28(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE27(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27) -#define NLOHMANN_JSON_PASTE29(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE28(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28) -#define NLOHMANN_JSON_PASTE30(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE29(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29) -#define NLOHMANN_JSON_PASTE31(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE30(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30) -#define NLOHMANN_JSON_PASTE32(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE31(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31) -#define NLOHMANN_JSON_PASTE33(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE32(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32) -#define NLOHMANN_JSON_PASTE34(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE33(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33) -#define NLOHMANN_JSON_PASTE35(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE34(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34) -#define NLOHMANN_JSON_PASTE36(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE35(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35) -#define NLOHMANN_JSON_PASTE37(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE36(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36) -#define NLOHMANN_JSON_PASTE38(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE37(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37) -#define NLOHMANN_JSON_PASTE39(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE38(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38) -#define NLOHMANN_JSON_PASTE40(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE39(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39) -#define NLOHMANN_JSON_PASTE41(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE40(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40) -#define NLOHMANN_JSON_PASTE42(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE41(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41) -#define NLOHMANN_JSON_PASTE43(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE42(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42) -#define NLOHMANN_JSON_PASTE44(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE43(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43) -#define NLOHMANN_JSON_PASTE45(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE44(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44) -#define NLOHMANN_JSON_PASTE46(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE45(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45) -#define NLOHMANN_JSON_PASTE47(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE46(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46) -#define NLOHMANN_JSON_PASTE48(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE47(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47) -#define NLOHMANN_JSON_PASTE49(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE48(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48) -#define NLOHMANN_JSON_PASTE50(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE49(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49) -#define NLOHMANN_JSON_PASTE51(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE50(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50) -#define NLOHMANN_JSON_PASTE52(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE51(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51) -#define NLOHMANN_JSON_PASTE53(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE52(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52) -#define NLOHMANN_JSON_PASTE54(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE53(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53) -#define NLOHMANN_JSON_PASTE55(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE54(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54) -#define NLOHMANN_JSON_PASTE56(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE55(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55) -#define NLOHMANN_JSON_PASTE57(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE56(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56) -#define NLOHMANN_JSON_PASTE58(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE57(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57) -#define NLOHMANN_JSON_PASTE59(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE58(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58) -#define NLOHMANN_JSON_PASTE60(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE59(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59) -#define NLOHMANN_JSON_PASTE61(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE60(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60) -#define NLOHMANN_JSON_PASTE62(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE61(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61) -#define NLOHMANN_JSON_PASTE63(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE62(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62) -#define NLOHMANN_JSON_PASTE64(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE63(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63) - -#define NLOHMANN_JSON_TO(v1) nlohmann_json_j[#v1] = nlohmann_json_t.v1; -#define NLOHMANN_JSON_FROM(v1) nlohmann_json_j.at(#v1).get_to(nlohmann_json_t.v1); -#define NLOHMANN_JSON_FROM_WITH_DEFAULT(v1) nlohmann_json_t.v1 = nlohmann_json_j.value(#v1, nlohmann_json_default_obj.v1); - -/*! -@brief macro -@def NLOHMANN_DEFINE_TYPE_INTRUSIVE -@since version 3.9.0 -*/ -#define NLOHMANN_DEFINE_TYPE_INTRUSIVE(Type, ...) \ - friend void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ - friend void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) } - -#define NLOHMANN_DEFINE_TYPE_INTRUSIVE_WITH_DEFAULT(Type, ...) \ - friend void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ - friend void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { Type nlohmann_json_default_obj; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) } - -/*! -@brief macro -@def NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE -@since version 3.9.0 -*/ -#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(Type, ...) \ - inline void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ - inline void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) } - -#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT(Type, ...) \ - inline void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ - inline void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { Type nlohmann_json_default_obj; NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM_WITH_DEFAULT, __VA_ARGS__)) } - - -// inspired from https://stackoverflow.com/a/26745591 -// allows to call any std function as if (e.g. with begin): -// using std::begin; begin(x); -// -// it allows using the detected idiom to retrieve the return type -// of such an expression -#define NLOHMANN_CAN_CALL_STD_FUNC_IMPL(std_name) \ - namespace detail { \ - using std::std_name; \ - \ - template \ - using result_of_##std_name = decltype(std_name(std::declval()...)); \ - } \ - \ - namespace detail2 { \ - struct std_name##_tag \ - { \ - }; \ - \ - template \ - std_name##_tag std_name(T&&...); \ - \ - template \ - using result_of_##std_name = decltype(std_name(std::declval()...)); \ - \ - template \ - struct would_call_std_##std_name \ - { \ - static constexpr auto const value = ::nlohmann::detail:: \ - is_detected_exact::value; \ - }; \ - } /* namespace detail2 */ \ - \ - template \ - struct would_call_std_##std_name : detail2::would_call_std_##std_name \ - { \ - } - -#ifndef JSON_USE_IMPLICIT_CONVERSIONS - #define JSON_USE_IMPLICIT_CONVERSIONS 1 -#endif - -#if JSON_USE_IMPLICIT_CONVERSIONS - #define JSON_EXPLICIT -#else - #define JSON_EXPLICIT explicit -#endif - -#ifndef JSON_DISABLE_ENUM_SERIALIZATION - #define JSON_DISABLE_ENUM_SERIALIZATION 0 -#endif - -#ifndef JSON_USE_GLOBAL_UDLS - #define JSON_USE_GLOBAL_UDLS 1 -#endif - -#if JSON_HAS_THREE_WAY_COMPARISON - #include // partial_ordering -#endif - -NLOHMANN_JSON_NAMESPACE_BEGIN -namespace detail -{ - -/////////////////////////// -// JSON type enumeration // -/////////////////////////// - -/*! -@brief the JSON type enumeration - -This enumeration collects the different JSON types. It is internally used to -distinguish the stored values, and the functions @ref basic_json::is_null(), -@ref basic_json::is_object(), @ref basic_json::is_array(), -@ref basic_json::is_string(), @ref basic_json::is_boolean(), -@ref basic_json::is_number() (with @ref basic_json::is_number_integer(), -@ref basic_json::is_number_unsigned(), and @ref basic_json::is_number_float()), -@ref basic_json::is_discarded(), @ref basic_json::is_primitive(), and -@ref basic_json::is_structured() rely on it. - -@note There are three enumeration entries (number_integer, number_unsigned, and -number_float), because the library distinguishes these three types for numbers: -@ref basic_json::number_unsigned_t is used for unsigned integers, -@ref basic_json::number_integer_t is used for signed integers, and -@ref basic_json::number_float_t is used for floating-point numbers or to -approximate integers which do not fit in the limits of their respective type. - -@sa see @ref basic_json::basic_json(const value_t value_type) -- create a JSON -value with the default value for a given type - -@since version 1.0.0 -*/ -enum class value_t : std::uint8_t -{ - null, ///< null value - object, ///< object (unordered set of name/value pairs) - array, ///< array (ordered collection of values) - string, ///< string value - boolean, ///< boolean value - number_integer, ///< number value (signed integer) - number_unsigned, ///< number value (unsigned integer) - number_float, ///< number value (floating-point) - binary, ///< binary array (ordered collection of bytes) - discarded ///< discarded by the parser callback function -}; - -/*! -@brief comparison operator for JSON types - -Returns an ordering that is similar to Python: -- order: null < boolean < number < object < array < string < binary -- furthermore, each type is not smaller than itself -- discarded values are not comparable -- binary is represented as a b"" string in python and directly comparable to a - string; however, making a binary array directly comparable with a string would - be surprising behavior in a JSON file. - -@since version 1.0.0 -*/ -#if JSON_HAS_THREE_WAY_COMPARISON - inline std::partial_ordering operator<=>(const value_t lhs, const value_t rhs) noexcept // *NOPAD* -#else - inline bool operator<(const value_t lhs, const value_t rhs) noexcept -#endif -{ - static constexpr std::array order = {{ - 0 /* null */, 3 /* object */, 4 /* array */, 5 /* string */, - 1 /* boolean */, 2 /* integer */, 2 /* unsigned */, 2 /* float */, - 6 /* binary */ - } - }; - - const auto l_index = static_cast(lhs); - const auto r_index = static_cast(rhs); -#if JSON_HAS_THREE_WAY_COMPARISON - if (l_index < order.size() && r_index < order.size()) - { - return order[l_index] <=> order[r_index]; // *NOPAD* - } - return std::partial_ordering::unordered; -#else - return l_index < order.size() && r_index < order.size() && order[l_index] < order[r_index]; -#endif -} - -// GCC selects the built-in operator< over an operator rewritten from -// a user-defined spaceship operator -// Clang, MSVC, and ICC select the rewritten candidate -// (see GCC bug https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105200) -#if JSON_HAS_THREE_WAY_COMPARISON && defined(__GNUC__) -inline bool operator<(const value_t lhs, const value_t rhs) noexcept -{ - return std::is_lt(lhs <=> rhs); // *NOPAD* -} -#endif - -} // namespace detail -NLOHMANN_JSON_NAMESPACE_END - -// #include -// __ _____ _____ _____ -// __| | __| | | | JSON for Modern C++ -// | | |__ | | | | | | version 3.11.2 -// |_____|_____|_____|_|___| https://github.com/nlohmann/json -// -// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann -// SPDX-License-Identifier: MIT - - - -// #include - - -NLOHMANN_JSON_NAMESPACE_BEGIN -namespace detail -{ - -/*! -@brief replace all occurrences of a substring by another string - -@param[in,out] s the string to manipulate; changed so that all - occurrences of @a f are replaced with @a t -@param[in] f the substring to replace with @a t -@param[in] t the string to replace @a f - -@pre The search string @a f must not be empty. **This precondition is -enforced with an assertion.** - -@since version 2.0.0 -*/ -template -inline void replace_substring(StringType& s, const StringType& f, - const StringType& t) -{ - JSON_ASSERT(!f.empty()); - for (auto pos = s.find(f); // find first occurrence of f - pos != StringType::npos; // make sure f was found - s.replace(pos, f.size(), t), // replace with t, and - pos = s.find(f, pos + t.size())) // find next occurrence of f - {} -} - -/*! - * @brief string escaping as described in RFC 6901 (Sect. 4) - * @param[in] s string to escape - * @return escaped string - * - * Note the order of escaping "~" to "~0" and "/" to "~1" is important. - */ -template -inline StringType escape(StringType s) -{ - replace_substring(s, StringType{"~"}, StringType{"~0"}); - replace_substring(s, StringType{"/"}, StringType{"~1"}); - return s; -} - -/*! - * @brief string unescaping as described in RFC 6901 (Sect. 4) - * @param[in] s string to unescape - * @return unescaped string - * - * Note the order of escaping "~1" to "/" and "~0" to "~" is important. - */ -template -static void unescape(StringType& s) -{ - replace_substring(s, StringType{"~1"}, StringType{"/"}); - replace_substring(s, StringType{"~0"}, StringType{"~"}); -} - -} // namespace detail -NLOHMANN_JSON_NAMESPACE_END - -// #include -// __ _____ _____ _____ -// __| | __| | | | JSON for Modern C++ -// | | |__ | | | | | | version 3.11.2 -// |_____|_____|_____|_|___| https://github.com/nlohmann/json -// -// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann -// SPDX-License-Identifier: MIT - - - -#include // size_t - -// #include - - -NLOHMANN_JSON_NAMESPACE_BEGIN -namespace detail -{ - -/// struct to capture the start position of the current token -struct position_t -{ - /// the total number of characters read - std::size_t chars_read_total = 0; - /// the number of characters read in the current line - std::size_t chars_read_current_line = 0; - /// the number of lines read - std::size_t lines_read = 0; - - /// conversion to size_t to preserve SAX interface - constexpr operator size_t() const - { - return chars_read_total; - } -}; - -} // namespace detail -NLOHMANN_JSON_NAMESPACE_END - -// #include - -// #include -// __ _____ _____ _____ -// __| | __| | | | JSON for Modern C++ -// | | |__ | | | | | | version 3.11.2 -// |_____|_____|_____|_|___| https://github.com/nlohmann/json -// -// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann -// SPDX-FileCopyrightText: 2018 The Abseil Authors -// SPDX-License-Identifier: MIT - - - -#include // array -#include // size_t -#include // conditional, enable_if, false_type, integral_constant, is_constructible, is_integral, is_same, remove_cv, remove_reference, true_type -#include // index_sequence, make_index_sequence, index_sequence_for - -// #include - - -NLOHMANN_JSON_NAMESPACE_BEGIN -namespace detail -{ - -template -using uncvref_t = typename std::remove_cv::type>::type; - -#ifdef JSON_HAS_CPP_14 - -// the following utilities are natively available in C++14 -using std::enable_if_t; -using std::index_sequence; -using std::make_index_sequence; -using std::index_sequence_for; - -#else - -// alias templates to reduce boilerplate -template -using enable_if_t = typename std::enable_if::type; - -// The following code is taken from https://github.com/abseil/abseil-cpp/blob/10cb35e459f5ecca5b2ff107635da0bfa41011b4/absl/utility/utility.h -// which is part of Google Abseil (https://github.com/abseil/abseil-cpp), licensed under the Apache License 2.0. - -//// START OF CODE FROM GOOGLE ABSEIL - -// integer_sequence -// -// Class template representing a compile-time integer sequence. An instantiation -// of `integer_sequence` has a sequence of integers encoded in its -// type through its template arguments (which is a common need when -// working with C++11 variadic templates). `absl::integer_sequence` is designed -// to be a drop-in replacement for C++14's `std::integer_sequence`. -// -// Example: -// -// template< class T, T... Ints > -// void user_function(integer_sequence); -// -// int main() -// { -// // user_function's `T` will be deduced to `int` and `Ints...` -// // will be deduced to `0, 1, 2, 3, 4`. -// user_function(make_integer_sequence()); -// } -template -struct integer_sequence -{ - using value_type = T; - static constexpr std::size_t size() noexcept - { - return sizeof...(Ints); - } -}; - -// index_sequence -// -// A helper template for an `integer_sequence` of `size_t`, -// `absl::index_sequence` is designed to be a drop-in replacement for C++14's -// `std::index_sequence`. -template -using index_sequence = integer_sequence; - -namespace utility_internal -{ - -template -struct Extend; - -// Note that SeqSize == sizeof...(Ints). It's passed explicitly for efficiency. -template -struct Extend, SeqSize, 0> -{ - using type = integer_sequence < T, Ints..., (Ints + SeqSize)... >; -}; - -template -struct Extend, SeqSize, 1> -{ - using type = integer_sequence < T, Ints..., (Ints + SeqSize)..., 2 * SeqSize >; -}; - -// Recursion helper for 'make_integer_sequence'. -// 'Gen::type' is an alias for 'integer_sequence'. -template -struct Gen -{ - using type = - typename Extend < typename Gen < T, N / 2 >::type, N / 2, N % 2 >::type; -}; - -template -struct Gen -{ - using type = integer_sequence; -}; - -} // namespace utility_internal - -// Compile-time sequences of integers - -// make_integer_sequence -// -// This template alias is equivalent to -// `integer_sequence`, and is designed to be a drop-in -// replacement for C++14's `std::make_integer_sequence`. -template -using make_integer_sequence = typename utility_internal::Gen::type; - -// make_index_sequence -// -// This template alias is equivalent to `index_sequence<0, 1, ..., N-1>`, -// and is designed to be a drop-in replacement for C++14's -// `std::make_index_sequence`. -template -using make_index_sequence = make_integer_sequence; - -// index_sequence_for -// -// Converts a typename pack into an index sequence of the same length, and -// is designed to be a drop-in replacement for C++14's -// `std::index_sequence_for()` -template -using index_sequence_for = make_index_sequence; - -//// END OF CODE FROM GOOGLE ABSEIL - -#endif - -// dispatch utility (taken from ranges-v3) -template struct priority_tag : priority_tag < N - 1 > {}; -template<> struct priority_tag<0> {}; - -// taken from ranges-v3 -template -struct static_const -{ - static JSON_INLINE_VARIABLE constexpr T value{}; -}; - -#ifndef JSON_HAS_CPP_17 - template - constexpr T static_const::value; -#endif - -template -inline constexpr std::array make_array(Args&& ... args) -{ - return std::array {{static_cast(std::forward(args))...}}; -} - -} // namespace detail -NLOHMANN_JSON_NAMESPACE_END - -// #include -// __ _____ _____ _____ -// __| | __| | | | JSON for Modern C++ -// | | |__ | | | | | | version 3.11.2 -// |_____|_____|_____|_|___| https://github.com/nlohmann/json -// -// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann -// SPDX-License-Identifier: MIT - - - -#include // numeric_limits -#include // false_type, is_constructible, is_integral, is_same, true_type -#include // declval -#include // tuple - -// #include -// __ _____ _____ _____ -// __| | __| | | | JSON for Modern C++ -// | | |__ | | | | | | version 3.11.2 -// |_____|_____|_____|_|___| https://github.com/nlohmann/json -// -// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann -// SPDX-License-Identifier: MIT - - - -#include // random_access_iterator_tag - -// #include - -// #include - -// #include - - -NLOHMANN_JSON_NAMESPACE_BEGIN -namespace detail -{ - -template -struct iterator_types {}; - -template -struct iterator_types < - It, - void_t> -{ - using difference_type = typename It::difference_type; - using value_type = typename It::value_type; - using pointer = typename It::pointer; - using reference = typename It::reference; - using iterator_category = typename It::iterator_category; -}; - -// This is required as some compilers implement std::iterator_traits in a way that -// doesn't work with SFINAE. See https://github.com/nlohmann/json/issues/1341. -template -struct iterator_traits -{ -}; - -template -struct iterator_traits < T, enable_if_t < !std::is_pointer::value >> - : iterator_types -{ -}; - -template -struct iterator_traits::value>> -{ - using iterator_category = std::random_access_iterator_tag; - using value_type = T; - using difference_type = ptrdiff_t; - using pointer = T*; - using reference = T&; -}; - -} // namespace detail -NLOHMANN_JSON_NAMESPACE_END - -// #include - -// #include -// __ _____ _____ _____ -// __| | __| | | | JSON for Modern C++ -// | | |__ | | | | | | version 3.11.2 -// |_____|_____|_____|_|___| https://github.com/nlohmann/json -// -// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann -// SPDX-License-Identifier: MIT - - - -// #include - - -NLOHMANN_JSON_NAMESPACE_BEGIN - -NLOHMANN_CAN_CALL_STD_FUNC_IMPL(begin); - -NLOHMANN_JSON_NAMESPACE_END - -// #include -// __ _____ _____ _____ -// __| | __| | | | JSON for Modern C++ -// | | |__ | | | | | | version 3.11.2 -// |_____|_____|_____|_|___| https://github.com/nlohmann/json -// -// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann -// SPDX-License-Identifier: MIT - - - -// #include - - -NLOHMANN_JSON_NAMESPACE_BEGIN - -NLOHMANN_CAN_CALL_STD_FUNC_IMPL(end); - -NLOHMANN_JSON_NAMESPACE_END - -// #include - -// #include - -// #include -// __ _____ _____ _____ -// __| | __| | | | JSON for Modern C++ -// | | |__ | | | | | | version 3.11.2 -// |_____|_____|_____|_|___| https://github.com/nlohmann/json -// -// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann -// SPDX-License-Identifier: MIT - -#ifndef INCLUDE_NLOHMANN_JSON_FWD_HPP_ - #define INCLUDE_NLOHMANN_JSON_FWD_HPP_ - - #include // int64_t, uint64_t - #include // map - #include // allocator - #include // string - #include // vector - - // #include - - - /*! - @brief namespace for Niels Lohmann - @see https://github.com/nlohmann - @since version 1.0.0 - */ - NLOHMANN_JSON_NAMESPACE_BEGIN - - /*! - @brief default JSONSerializer template argument - - This serializer ignores the template arguments and uses ADL - ([argument-dependent lookup](https://en.cppreference.com/w/cpp/language/adl)) - for serialization. - */ - template - struct adl_serializer; - - /// a class to store JSON values - /// @sa https://json.nlohmann.me/api/basic_json/ - template class ObjectType = - std::map, - template class ArrayType = std::vector, - class StringType = std::string, class BooleanType = bool, - class NumberIntegerType = std::int64_t, - class NumberUnsignedType = std::uint64_t, - class NumberFloatType = double, - template class AllocatorType = std::allocator, - template class JSONSerializer = - adl_serializer, - class BinaryType = std::vector> - class basic_json; - - /// @brief JSON Pointer defines a string syntax for identifying a specific value within a JSON document - /// @sa https://json.nlohmann.me/api/json_pointer/ - template - class json_pointer; - - /*! - @brief default specialization - @sa https://json.nlohmann.me/api/json/ - */ - using json = basic_json<>; - - /// @brief a minimal map-like container that preserves insertion order - /// @sa https://json.nlohmann.me/api/ordered_map/ - template - struct ordered_map; - - /// @brief specialization that maintains the insertion order of object keys - /// @sa https://json.nlohmann.me/api/ordered_json/ - using ordered_json = basic_json; - - NLOHMANN_JSON_NAMESPACE_END - -#endif // INCLUDE_NLOHMANN_JSON_FWD_HPP_ - - -NLOHMANN_JSON_NAMESPACE_BEGIN -/*! -@brief detail namespace with internal helper functions - -This namespace collects functions that should not be exposed, -implementations of some @ref basic_json methods, and meta-programming helpers. - -@since version 2.1.0 -*/ -namespace detail -{ - -///////////// -// helpers // -///////////// - -// Note to maintainers: -// -// Every trait in this file expects a non CV-qualified type. -// The only exceptions are in the 'aliases for detected' section -// (i.e. those of the form: decltype(T::member_function(std::declval()))) -// -// In this case, T has to be properly CV-qualified to constraint the function arguments -// (e.g. to_json(BasicJsonType&, const T&)) - -template struct is_basic_json : std::false_type {}; - -NLOHMANN_BASIC_JSON_TPL_DECLARATION -struct is_basic_json : std::true_type {}; - -// used by exceptions create() member functions -// true_type for pointer to possibly cv-qualified basic_json or std::nullptr_t -// false_type otherwise -template -struct is_basic_json_context : - std::integral_constant < bool, - is_basic_json::type>::type>::value - || std::is_same::value > -{}; - -////////////////////// -// json_ref helpers // -////////////////////// - -template -class json_ref; - -template -struct is_json_ref : std::false_type {}; - -template -struct is_json_ref> : std::true_type {}; - -////////////////////////// -// aliases for detected // -////////////////////////// - -template -using mapped_type_t = typename T::mapped_type; - -template -using key_type_t = typename T::key_type; - -template -using value_type_t = typename T::value_type; - -template -using difference_type_t = typename T::difference_type; - -template -using pointer_t = typename T::pointer; - -template -using reference_t = typename T::reference; - -template -using iterator_category_t = typename T::iterator_category; - -template -using to_json_function = decltype(T::to_json(std::declval()...)); - -template -using from_json_function = decltype(T::from_json(std::declval()...)); - -template -using get_template_function = decltype(std::declval().template get()); - -// trait checking if JSONSerializer::from_json(json const&, udt&) exists -template -struct has_from_json : std::false_type {}; - -// trait checking if j.get is valid -// use this trait instead of std::is_constructible or std::is_convertible, -// both rely on, or make use of implicit conversions, and thus fail when T -// has several constructors/operator= (see https://github.com/nlohmann/json/issues/958) -template -struct is_getable -{ - static constexpr bool value = is_detected::value; -}; - -template -struct has_from_json < BasicJsonType, T, enable_if_t < !is_basic_json::value >> -{ - using serializer = typename BasicJsonType::template json_serializer; - - static constexpr bool value = - is_detected_exact::value; -}; - -// This trait checks if JSONSerializer::from_json(json const&) exists -// this overload is used for non-default-constructible user-defined-types -template -struct has_non_default_from_json : std::false_type {}; - -template -struct has_non_default_from_json < BasicJsonType, T, enable_if_t < !is_basic_json::value >> -{ - using serializer = typename BasicJsonType::template json_serializer; - - static constexpr bool value = - is_detected_exact::value; -}; - -// This trait checks if BasicJsonType::json_serializer::to_json exists -// Do not evaluate the trait when T is a basic_json type, to avoid template instantiation infinite recursion. -template -struct has_to_json : std::false_type {}; - -template -struct has_to_json < BasicJsonType, T, enable_if_t < !is_basic_json::value >> -{ - using serializer = typename BasicJsonType::template json_serializer; - - static constexpr bool value = - is_detected_exact::value; -}; - -template -using detect_key_compare = typename T::key_compare; - -template -struct has_key_compare : std::integral_constant::value> {}; - -// obtains the actual object key comparator -template -struct actual_object_comparator -{ - using object_t = typename BasicJsonType::object_t; - using object_comparator_t = typename BasicJsonType::default_object_comparator_t; - using type = typename std::conditional < has_key_compare::value, - typename object_t::key_compare, object_comparator_t>::type; -}; - -template -using actual_object_comparator_t = typename actual_object_comparator::type; - -/////////////////// -// is_ functions // -/////////////////// - -// https://en.cppreference.com/w/cpp/types/conjunction -template struct conjunction : std::true_type { }; -template struct conjunction : B { }; -template -struct conjunction -: std::conditional(B::value), conjunction, B>::type {}; - -// https://en.cppreference.com/w/cpp/types/negation -template struct negation : std::integral_constant < bool, !B::value > { }; - -// Reimplementation of is_constructible and is_default_constructible, due to them being broken for -// std::pair and std::tuple until LWG 2367 fix (see https://cplusplus.github.io/LWG/lwg-defects.html#2367). -// This causes compile errors in e.g. clang 3.5 or gcc 4.9. -template -struct is_default_constructible : std::is_default_constructible {}; - -template -struct is_default_constructible> - : conjunction, is_default_constructible> {}; - -template -struct is_default_constructible> - : conjunction, is_default_constructible> {}; - -template -struct is_default_constructible> - : conjunction...> {}; - -template -struct is_default_constructible> - : conjunction...> {}; - - -template -struct is_constructible : std::is_constructible {}; - -template -struct is_constructible> : is_default_constructible> {}; - -template -struct is_constructible> : is_default_constructible> {}; - -template -struct is_constructible> : is_default_constructible> {}; - -template -struct is_constructible> : is_default_constructible> {}; - - -template -struct is_iterator_traits : std::false_type {}; - -template -struct is_iterator_traits> -{ - private: - using traits = iterator_traits; - - public: - static constexpr auto value = - is_detected::value && - is_detected::value && - is_detected::value && - is_detected::value && - is_detected::value; -}; - -template -struct is_range -{ - private: - using t_ref = typename std::add_lvalue_reference::type; - - using iterator = detected_t; - using sentinel = detected_t; - - // to be 100% correct, it should use https://en.cppreference.com/w/cpp/iterator/input_or_output_iterator - // and https://en.cppreference.com/w/cpp/iterator/sentinel_for - // but reimplementing these would be too much work, as a lot of other concepts are used underneath - static constexpr auto is_iterator_begin = - is_iterator_traits>::value; - - public: - static constexpr bool value = !std::is_same::value && !std::is_same::value && is_iterator_begin; -}; - -template -using iterator_t = enable_if_t::value, result_of_begin())>>; - -template -using range_value_t = value_type_t>>; - -// The following implementation of is_complete_type is taken from -// https://blogs.msdn.microsoft.com/vcblog/2015/12/02/partial-support-for-expression-sfinae-in-vs-2015-update-1/ -// and is written by Xiang Fan who agreed to using it in this library. - -template -struct is_complete_type : std::false_type {}; - -template -struct is_complete_type : std::true_type {}; - -template -struct is_compatible_object_type_impl : std::false_type {}; - -template -struct is_compatible_object_type_impl < - BasicJsonType, CompatibleObjectType, - enable_if_t < is_detected::value&& - is_detected::value >> -{ - using object_t = typename BasicJsonType::object_t; - - // macOS's is_constructible does not play well with nonesuch... - static constexpr bool value = - is_constructible::value && - is_constructible::value; -}; - -template -struct is_compatible_object_type - : is_compatible_object_type_impl {}; - -template -struct is_constructible_object_type_impl : std::false_type {}; - -template -struct is_constructible_object_type_impl < - BasicJsonType, ConstructibleObjectType, - enable_if_t < is_detected::value&& - is_detected::value >> -{ - using object_t = typename BasicJsonType::object_t; - - static constexpr bool value = - (is_default_constructible::value && - (std::is_move_assignable::value || - std::is_copy_assignable::value) && - (is_constructible::value && - std::is_same < - typename object_t::mapped_type, - typename ConstructibleObjectType::mapped_type >::value)) || - (has_from_json::value || - has_non_default_from_json < - BasicJsonType, - typename ConstructibleObjectType::mapped_type >::value); -}; - -template -struct is_constructible_object_type - : is_constructible_object_type_impl {}; - -template -struct is_compatible_string_type -{ - static constexpr auto value = - is_constructible::value; -}; - -template -struct is_constructible_string_type -{ - // launder type through decltype() to fix compilation failure on ICPC -#ifdef __INTEL_COMPILER - using laundered_type = decltype(std::declval()); -#else - using laundered_type = ConstructibleStringType; -#endif - - static constexpr auto value = - conjunction < - is_constructible, - is_detected_exact>::value; -}; - -template -struct is_compatible_array_type_impl : std::false_type {}; - -template -struct is_compatible_array_type_impl < - BasicJsonType, CompatibleArrayType, - enable_if_t < - is_detected::value&& - is_iterator_traits>>::value&& -// special case for types like std::filesystem::path whose iterator's value_type are themselves -// c.f. https://github.com/nlohmann/json/pull/3073 - !std::is_same>::value >> -{ - static constexpr bool value = - is_constructible>::value; -}; - -template -struct is_compatible_array_type - : is_compatible_array_type_impl {}; - -template -struct is_constructible_array_type_impl : std::false_type {}; - -template -struct is_constructible_array_type_impl < - BasicJsonType, ConstructibleArrayType, - enable_if_t::value >> - : std::true_type {}; - -template -struct is_constructible_array_type_impl < - BasicJsonType, ConstructibleArrayType, - enable_if_t < !std::is_same::value&& - !is_compatible_string_type::value&& - is_default_constructible::value&& -(std::is_move_assignable::value || - std::is_copy_assignable::value)&& -is_detected::value&& -is_iterator_traits>>::value&& -is_detected::value&& -// special case for types like std::filesystem::path whose iterator's value_type are themselves -// c.f. https://github.com/nlohmann/json/pull/3073 -!std::is_same>::value&& - is_complete_type < - detected_t>::value >> -{ - using value_type = range_value_t; - - static constexpr bool value = - std::is_same::value || - has_from_json::value || - has_non_default_from_json < - BasicJsonType, - value_type >::value; -}; - -template -struct is_constructible_array_type - : is_constructible_array_type_impl {}; - -template -struct is_compatible_integer_type_impl : std::false_type {}; - -template -struct is_compatible_integer_type_impl < - RealIntegerType, CompatibleNumberIntegerType, - enable_if_t < std::is_integral::value&& - std::is_integral::value&& - !std::is_same::value >> -{ - // is there an assert somewhere on overflows? - using RealLimits = std::numeric_limits; - using CompatibleLimits = std::numeric_limits; - - static constexpr auto value = - is_constructible::value && - CompatibleLimits::is_integer && - RealLimits::is_signed == CompatibleLimits::is_signed; -}; - -template -struct is_compatible_integer_type - : is_compatible_integer_type_impl {}; - -template -struct is_compatible_type_impl: std::false_type {}; - -template -struct is_compatible_type_impl < - BasicJsonType, CompatibleType, - enable_if_t::value >> -{ - static constexpr bool value = - has_to_json::value; -}; - -template -struct is_compatible_type - : is_compatible_type_impl {}; - -template -struct is_constructible_tuple : std::false_type {}; - -template -struct is_constructible_tuple> : conjunction...> {}; - -template -struct is_json_iterator_of : std::false_type {}; - -template -struct is_json_iterator_of : std::true_type {}; - -template -struct is_json_iterator_of : std::true_type -{}; - -// checks if a given type T is a template specialization of Primary -template